fix: Crawler proxy selection fixes (#2280)
- Hides proxy form control if there are no proxy servers available - Fixes org default proxy value not being saved
This commit is contained in:
parent
d6189eee9a
commit
1260aec976
@ -8,6 +8,7 @@
|
||||
"@formatjs/intl-durationformat": "^0.6.4",
|
||||
"@formatjs/intl-localematcher": "^0.5.9",
|
||||
"@ianvs/prettier-plugin-sort-imports": "^4.2.1",
|
||||
"@lit/context": "^1.1.3",
|
||||
"@lit/localize": "^0.12.1",
|
||||
"@lit/task": "^1.0.0",
|
||||
"@novnc/novnc": "^1.4.0-beta",
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { localized, msg } from "@lit/localize";
|
||||
import { type SlSelect } from "@shoelace-style/shoelace";
|
||||
import type { SlSelect } from "@shoelace-style/shoelace";
|
||||
import { html } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators.js";
|
||||
import { ifDefined } from "lit/directives/if-defined.js";
|
||||
|
||||
import type { ProxiesAPIResponse, Proxy } from "@/pages/org/types";
|
||||
import LiteElement from "@/utils/LiteElement";
|
||||
import { BtrixElement } from "@/classes/BtrixElement";
|
||||
import type { Proxy } from "@/pages/org/types";
|
||||
|
||||
type SelectCrawlerProxyChangeDetail = {
|
||||
value: string | null;
|
||||
@ -26,30 +27,40 @@ export type SelectCrawlerProxyUpdateEvent =
|
||||
* Usage example:
|
||||
* ```ts
|
||||
* <btrix-select-crawler-proxy
|
||||
* orgId=${orgId}
|
||||
* on-change=${({value}) => selectedcrawlerProxy = value}
|
||||
* .proxyServers=${proxyServers}
|
||||
* btrix-change=${({value}) => selectedcrawlerProxy = value}
|
||||
* ></btrix-select-crawler-proxy>
|
||||
* ```
|
||||
*
|
||||
* @event on-change
|
||||
* @fires btrix-change
|
||||
*/
|
||||
@customElement("btrix-select-crawler-proxy")
|
||||
@localized()
|
||||
export class SelectCrawlerProxy extends LiteElement {
|
||||
export class SelectCrawlerProxy extends BtrixElement {
|
||||
@property({ type: String })
|
||||
defaultProxyId: string | null = null;
|
||||
|
||||
@property({ type: Array })
|
||||
proxyServers: Proxy[] = [];
|
||||
|
||||
@property({ type: String })
|
||||
proxyId: string | null = null;
|
||||
|
||||
@property({ type: String })
|
||||
size?: SlSelect["size"];
|
||||
|
||||
@state()
|
||||
private selectedProxy?: Proxy;
|
||||
|
||||
@state()
|
||||
private defaultProxy?: Proxy;
|
||||
|
||||
@state()
|
||||
private allProxies?: Proxy[];
|
||||
public get value() {
|
||||
return this.selectedProxy?.id || "";
|
||||
}
|
||||
|
||||
protected firstUpdated() {
|
||||
void this.fetchOrgProxies();
|
||||
void this.initProxies();
|
||||
}
|
||||
// credit: https://dev.to/jorik/country-code-to-flag-emoji-a21
|
||||
private countryCodeToFlagEmoji(countryCode: String): String {
|
||||
@ -61,10 +72,6 @@ export class SelectCrawlerProxy extends LiteElement {
|
||||
}
|
||||
|
||||
render() {
|
||||
/*if (this.crawlerProxys && this.crawlerProxys.length < 2) {
|
||||
return html``;
|
||||
}*/
|
||||
|
||||
return html`
|
||||
<sl-select
|
||||
name="proxyId"
|
||||
@ -75,15 +82,12 @@ export class SelectCrawlerProxy extends LiteElement {
|
||||
: msg("No Proxy")}
|
||||
hoist
|
||||
clearable
|
||||
size=${ifDefined(this.size)}
|
||||
@sl-change=${this.onChange}
|
||||
@sl-focus=${() => {
|
||||
// Refetch to keep list up to date
|
||||
void this.fetchOrgProxies();
|
||||
}}
|
||||
@sl-hide=${this.stopProp}
|
||||
@sl-after-hide=${this.stopProp}
|
||||
>
|
||||
${this.allProxies?.map(
|
||||
${this.proxyServers.map(
|
||||
(server) =>
|
||||
html` <sl-option value=${server.id}>
|
||||
${server.country_code
|
||||
@ -121,7 +125,7 @@ export class SelectCrawlerProxy extends LiteElement {
|
||||
private onChange(e: Event) {
|
||||
this.stopProp(e);
|
||||
|
||||
this.selectedProxy = this.allProxies?.find(
|
||||
this.selectedProxy = this.proxyServers.find(
|
||||
({ id }) => id === (e.target as SlSelect).value,
|
||||
);
|
||||
|
||||
@ -130,7 +134,7 @@ export class SelectCrawlerProxy extends LiteElement {
|
||||
}
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent<SelectCrawlerProxyChangeDetail>("on-change", {
|
||||
new CustomEvent<SelectCrawlerProxyChangeDetail>("btrix-change", {
|
||||
detail: {
|
||||
value: this.selectedProxy ? this.selectedProxy.id : null,
|
||||
},
|
||||
@ -138,63 +142,24 @@ export class SelectCrawlerProxy extends LiteElement {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch crawler proxies and update internal state
|
||||
*/
|
||||
private async fetchOrgProxies(): Promise<void> {
|
||||
try {
|
||||
const data = await this.getOrgProxies();
|
||||
const defaultProxyId = data.default_proxy_id;
|
||||
private async initProxies(): Promise<void> {
|
||||
const defaultProxyId = this.defaultProxyId;
|
||||
|
||||
this.allProxies = data.servers;
|
||||
|
||||
if (!this.defaultProxy) {
|
||||
this.defaultProxy = this.allProxies.find(
|
||||
({ id }) => id === defaultProxyId,
|
||||
);
|
||||
}
|
||||
|
||||
if (this.proxyId && !this.selectedProxy?.id) {
|
||||
this.selectedProxy = this.allProxies.find(
|
||||
({ id }) => id === this.proxyId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!this.selectedProxy) {
|
||||
this.proxyId = null;
|
||||
this.dispatchEvent(
|
||||
new CustomEvent("on-change", {
|
||||
detail: {
|
||||
value: null,
|
||||
},
|
||||
}),
|
||||
);
|
||||
this.selectedProxy = this.allProxies.find(
|
||||
({ id }) => id === this.proxyId,
|
||||
);
|
||||
}
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent<SelectCrawlerProxyUpdateDetail>("on-update", {
|
||||
detail: {
|
||||
show: this.allProxies.length > 1,
|
||||
},
|
||||
}),
|
||||
if (!this.defaultProxy) {
|
||||
this.defaultProxy = this.proxyServers.find(
|
||||
({ id }) => id === defaultProxyId,
|
||||
);
|
||||
} catch (e) {
|
||||
this.notify({
|
||||
message: msg("Sorry, couldn't retrieve proxies at this time."),
|
||||
variant: "danger",
|
||||
icon: "exclamation-octagon",
|
||||
id: "proxy-retrieve-status",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private async getOrgProxies(): Promise<ProxiesAPIResponse> {
|
||||
return this.apiFetch<ProxiesAPIResponse>(
|
||||
`/orgs/${this.orgId}/crawlconfigs/crawler-proxies`,
|
||||
);
|
||||
if (this.proxyId && !this.selectedProxy) {
|
||||
this.selectedProxy = this.proxyServers.find(
|
||||
({ id }) => id === this.proxyId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!this.selectedProxy) {
|
||||
this.proxyId = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
7
frontend/src/context/org.ts
Normal file
7
frontend/src/context/org.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { createContext } from "@lit/context";
|
||||
|
||||
import type { ProxiesAPIResponse } from "@/types/crawler";
|
||||
|
||||
export type ProxiesContext = ProxiesAPIResponse | null;
|
||||
|
||||
export const proxiesContext = createContext<ProxiesContext>("proxies");
|
@ -1,5 +1,7 @@
|
||||
import { consume } from "@lit/context";
|
||||
import { localized, msg, str } from "@lit/localize";
|
||||
import { type SlInput } from "@shoelace-style/shoelace";
|
||||
import { nothing } from "lit";
|
||||
import {
|
||||
customElement,
|
||||
property,
|
||||
@ -7,16 +9,21 @@ import {
|
||||
queryAsync,
|
||||
state,
|
||||
} from "lit/decorators.js";
|
||||
import { ifDefined } from "lit/directives/if-defined.js";
|
||||
import queryString from "query-string";
|
||||
|
||||
import type { Dialog } from "@/components/ui/dialog";
|
||||
import { type SelectCrawlerChangeEvent } from "@/components/ui/select-crawler";
|
||||
import { type SelectCrawlerProxyChangeEvent } from "@/components/ui/select-crawler-proxy";
|
||||
import { proxiesContext, type ProxiesContext } from "@/context/org";
|
||||
import LiteElement, { html } from "@/utils/LiteElement";
|
||||
|
||||
@localized()
|
||||
@customElement("btrix-new-browser-profile-dialog")
|
||||
export class NewBrowserProfileDialog extends LiteElement {
|
||||
@consume({ context: proxiesContext, subscribe: true })
|
||||
private readonly proxies?: ProxiesContext;
|
||||
|
||||
@property({ type: Boolean })
|
||||
open = false;
|
||||
|
||||
@ -83,14 +90,22 @@ export class NewBrowserProfileDialog extends LiteElement {
|
||||
(this.crawlerChannel = e.detail.value!)}
|
||||
></btrix-select-crawler>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<btrix-select-crawler-proxy
|
||||
orgId=${this.orgId}
|
||||
.proxyId="${this.proxyId || ""}"
|
||||
@on-change=${(e: SelectCrawlerProxyChangeEvent) =>
|
||||
(this.proxyId = e.detail.value!)}
|
||||
></btrix-select-crawler-proxy>
|
||||
</div>
|
||||
${this.proxies?.servers.length
|
||||
? html`
|
||||
<div class="mt-4">
|
||||
<btrix-select-crawler-proxy
|
||||
defaultProxyId=${ifDefined(
|
||||
this.proxies.default_proxy_id ?? undefined,
|
||||
)}
|
||||
.proxyServers=${this.proxies.servers}
|
||||
.proxyId="${this.proxyId || ""}"
|
||||
@btrix-change=${(e: SelectCrawlerProxyChangeEvent) =>
|
||||
(this.proxyId = e.detail.value)}
|
||||
></btrix-select-crawler-proxy>
|
||||
</div>
|
||||
`
|
||||
: nothing}
|
||||
|
||||
<input class="invisible size-0" type="submit" />
|
||||
</form>
|
||||
<div slot="footer" class="flex justify-between">
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { consume } from "@lit/context";
|
||||
import { localized, msg, str } from "@lit/localize";
|
||||
import type {
|
||||
SlChangeEvent,
|
||||
@ -43,6 +44,7 @@ import type { SelectCrawlerProxyChangeEvent } from "@/components/ui/select-crawl
|
||||
import type { Tab } from "@/components/ui/tab-list";
|
||||
import type { TagInputEvent, TagsChangeEvent } from "@/components/ui/tag-input";
|
||||
import type { TimeInputChangeEvent } from "@/components/ui/time-input";
|
||||
import { proxiesContext, type ProxiesContext } from "@/context/org";
|
||||
import { type SelectBrowserProfileChangeEvent } from "@/features/browser-profiles/select-browser-profile";
|
||||
import type { CollectionsChangeEvent } from "@/features/collections/collections-add";
|
||||
import type { QueueExclusionTable } from "@/features/crawl-workflows/queue-exclusion-table";
|
||||
@ -188,6 +190,9 @@ type CrawlConfigResponse = {
|
||||
@localized()
|
||||
@customElement("btrix-workflow-editor")
|
||||
export class WorkflowEditor extends BtrixElement {
|
||||
@consume({ context: proxiesContext, subscribe: true })
|
||||
private readonly proxies?: ProxiesContext;
|
||||
|
||||
@property({ type: String })
|
||||
configId?: string;
|
||||
|
||||
@ -1329,17 +1334,24 @@ https://archiveweb.page/images/${"logo.svg"}`}
|
||||
></btrix-select-browser-profile>
|
||||
`)}
|
||||
${this.renderHelpTextCol(infoTextStrings["browserProfile"])}
|
||||
${inputCol(html`
|
||||
<btrix-select-crawler-proxy
|
||||
orgId=${this.orgId}
|
||||
.proxyId="${this.formState.proxyId || ""}"
|
||||
@on-change=${(e: SelectCrawlerProxyChangeEvent) =>
|
||||
this.updateFormState({
|
||||
proxyId: e.detail.value,
|
||||
})}
|
||||
></btrix-select-crawler-proxy>
|
||||
`)}
|
||||
${this.renderHelpTextCol(infoTextStrings["proxyId"])}
|
||||
${this.proxies?.servers.length
|
||||
? [
|
||||
inputCol(html`
|
||||
<btrix-select-crawler-proxy
|
||||
defaultProxyId=${ifDefined(
|
||||
this.proxies.default_proxy_id ?? undefined,
|
||||
)}
|
||||
.proxyServers=${this.proxies.servers}
|
||||
.proxyId="${this.formState.proxyId || ""}"
|
||||
@btrix-change=${(e: SelectCrawlerProxyChangeEvent) =>
|
||||
this.updateFormState({
|
||||
proxyId: e.detail.value,
|
||||
})}
|
||||
></btrix-select-crawler-proxy>
|
||||
`),
|
||||
this.renderHelpTextCol(infoTextStrings["proxyId"]),
|
||||
]
|
||||
: nothing}
|
||||
${inputCol(html`
|
||||
<sl-radio-group
|
||||
name="scale"
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { provide } from "@lit/context";
|
||||
import { localized, msg, str } from "@lit/localize";
|
||||
import { html, nothing } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators.js";
|
||||
@ -15,10 +16,12 @@ import type {
|
||||
} from "./settings/settings";
|
||||
|
||||
import { BtrixElement } from "@/classes/BtrixElement";
|
||||
import { proxiesContext, type ProxiesContext } from "@/context/org";
|
||||
import type { QuotaUpdateDetail } from "@/controllers/api";
|
||||
import needLogin from "@/decorators/needLogin";
|
||||
import type { CollectionSavedEvent } from "@/features/collections/collection-metadata-dialog";
|
||||
import type { SelectJobTypeEvent } from "@/features/crawl-workflows/new-workflow-dialog";
|
||||
import type { ProxiesAPIResponse } from "@/types/crawler";
|
||||
import type { UserOrg } from "@/types/user";
|
||||
import { isApiError } from "@/utils/api";
|
||||
import type { ViewState } from "@/utils/APIRouter";
|
||||
@ -93,6 +96,9 @@ const UUID_REGEX =
|
||||
@customElement("btrix-org")
|
||||
@needLogin
|
||||
export class Org extends BtrixElement {
|
||||
@provide({ context: proxiesContext })
|
||||
proxies: ProxiesContext = null;
|
||||
|
||||
@property({ type: Object })
|
||||
viewStateData?: ViewState["data"];
|
||||
|
||||
@ -147,6 +153,7 @@ export class Org extends BtrixElement {
|
||||
) {
|
||||
if (this.userOrg) {
|
||||
void this.updateOrg();
|
||||
void this.updateOrgProxies();
|
||||
} else {
|
||||
// Couldn't find org with slug, redirect to first org
|
||||
const org = this.userInfo.orgs[0] as UserOrg | undefined;
|
||||
@ -211,6 +218,14 @@ export class Org extends BtrixElement {
|
||||
}
|
||||
}
|
||||
|
||||
private async updateOrgProxies() {
|
||||
try {
|
||||
this.proxies = await this.getOrgProxies(this.orgId);
|
||||
} catch (e) {
|
||||
console.debug(e);
|
||||
}
|
||||
}
|
||||
|
||||
async firstUpdated() {
|
||||
// if slug is actually an orgId (UUID), attempt to lookup the slug
|
||||
// and redirect to the slug url
|
||||
@ -229,6 +244,8 @@ export class Org extends BtrixElement {
|
||||
// Sync URL to create dialog
|
||||
const dialogName = this.getDialogName();
|
||||
if (dialogName) this.openDialog(dialogName);
|
||||
|
||||
void this.updateOrgProxies();
|
||||
}
|
||||
|
||||
private getDialogName() {
|
||||
@ -634,6 +651,12 @@ export class Org extends BtrixElement {
|
||||
return data;
|
||||
}
|
||||
|
||||
private async getOrgProxies(orgId: string): Promise<ProxiesAPIResponse> {
|
||||
return this.api.fetch<ProxiesAPIResponse>(
|
||||
`/orgs/${orgId}/crawlconfigs/crawler-proxies`,
|
||||
);
|
||||
}
|
||||
|
||||
private async onOrgRemoveMember(e: OrgRemoveMemberEvent) {
|
||||
void this.removeMember(e.detail.member);
|
||||
}
|
||||
@ -682,9 +705,15 @@ export class Org extends BtrixElement {
|
||||
icon: "check2-circle",
|
||||
id: "user-updated-status",
|
||||
});
|
||||
|
||||
const org = await this.getOrg(this.orgId);
|
||||
|
||||
AppStateService.updateOrg(org);
|
||||
if (org) {
|
||||
AppStateService.partialUpdateOrg({
|
||||
id: org.id,
|
||||
users: org.users,
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.debug(e);
|
||||
|
||||
@ -742,7 +771,12 @@ export class Org extends BtrixElement {
|
||||
} else {
|
||||
const org = await this.getOrg(this.orgId);
|
||||
|
||||
AppStateService.updateOrg(org);
|
||||
if (org) {
|
||||
AppStateService.partialUpdateOrg({
|
||||
id: org.id,
|
||||
users: org.users,
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.debug(e);
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { consume } from "@lit/context";
|
||||
import { localized, msg } from "@lit/localize";
|
||||
import type { SlButton } from "@shoelace-style/shoelace";
|
||||
import { serialize } from "@shoelace-style/shoelace/dist/utilities/form.js";
|
||||
@ -9,6 +10,8 @@ import { ifDefined } from "lit/directives/if-defined.js";
|
||||
|
||||
import { BtrixElement } from "@/classes/BtrixElement";
|
||||
import type { LanguageSelect } from "@/components/ui/language-select";
|
||||
import type { SelectCrawlerProxy } from "@/components/ui/select-crawler-proxy";
|
||||
import { proxiesContext, type ProxiesContext } from "@/context/org";
|
||||
import type { QueueExclusionTable } from "@/features/crawl-workflows/queue-exclusion-table";
|
||||
import { columns, type Cols } from "@/layouts/columns";
|
||||
import infoTextStrings from "@/strings/crawl-workflows/infoText";
|
||||
@ -25,7 +28,7 @@ import {
|
||||
} from "@/utils/workflow";
|
||||
|
||||
type FieldName = keyof FormState;
|
||||
type Field = Record<FieldName, TemplateResult<1>>;
|
||||
type Field = Record<FieldName, TemplateResult<1> | undefined>;
|
||||
|
||||
const PLACEHOLDER_EXCLUSIONS = [""]; // Add empty slot
|
||||
|
||||
@ -51,6 +54,9 @@ export class OrgSettingsCrawlWorkflows extends BtrixElement {
|
||||
}
|
||||
`;
|
||||
|
||||
@consume({ context: proxiesContext, subscribe: true })
|
||||
private readonly proxies?: ProxiesContext;
|
||||
|
||||
@state()
|
||||
private defaults: WorkflowDefaults = appDefaults;
|
||||
|
||||
@ -60,6 +66,9 @@ export class OrgSettingsCrawlWorkflows extends BtrixElement {
|
||||
@query("btrix-language-select")
|
||||
languageSelect?: LanguageSelect | null;
|
||||
|
||||
@query("btrix-select-crawler-proxy")
|
||||
proxySelect?: SelectCrawlerProxy | null;
|
||||
|
||||
@query('sl-button[type="submit"]')
|
||||
submitButton?: SlButton | null;
|
||||
|
||||
@ -195,10 +204,16 @@ export class OrgSettingsCrawlWorkflows extends BtrixElement {
|
||||
size="small"
|
||||
></btrix-select-browser-profile>
|
||||
`,
|
||||
proxyId: html` <btrix-select-crawler-proxy
|
||||
orgId=${this.orgId}
|
||||
.proxyId="${orgDefaults.proxyId || null}"
|
||||
></btrix-select-crawler-proxy>`,
|
||||
proxyId: this.proxies?.servers.length
|
||||
? html` <btrix-select-crawler-proxy
|
||||
defaultProxyId=${ifDefined(
|
||||
this.proxies.default_proxy_id ?? undefined,
|
||||
)}
|
||||
.proxyServers=${this.proxies.servers}
|
||||
.proxyId="${orgDefaults.proxyId || null}"
|
||||
size="small"
|
||||
></btrix-select-crawler-proxy>`
|
||||
: undefined,
|
||||
crawlerChannel: html`
|
||||
<btrix-select-crawler
|
||||
crawlerChannel=${ifDefined(orgDefaults.crawlerChannel)}
|
||||
@ -254,10 +269,12 @@ export class OrgSettingsCrawlWorkflows extends BtrixElement {
|
||||
Object.entries(this.fields).map(([sectionName, fields]) =>
|
||||
section(
|
||||
sectionName as SectionsEnum,
|
||||
Object.entries(fields).map(([fieldName, field]) => [
|
||||
field,
|
||||
infoTextStrings[fieldName as FieldName],
|
||||
]),
|
||||
Object.entries(fields)
|
||||
.filter(([, field]) => field as unknown)
|
||||
.map(([fieldName, field]) => [
|
||||
field,
|
||||
infoTextStrings[fieldName as FieldName],
|
||||
]),
|
||||
),
|
||||
),
|
||||
)}
|
||||
@ -291,7 +308,7 @@ export class OrgSettingsCrawlWorkflows extends BtrixElement {
|
||||
blockAds: values.blockAds === "on",
|
||||
profileid: values.profileid,
|
||||
crawlerChannel: values.crawlerChannel,
|
||||
proxyId: values.proxyId,
|
||||
proxyId: this.proxySelect?.value || undefined,
|
||||
userAgent: values.userAgent,
|
||||
lang: this.languageSelect?.value || undefined,
|
||||
exclude: this.exclusionTable?.exclusions?.filter((v) => v) || [],
|
||||
|
9
frontend/yarn.lock
generated
9
frontend/yarn.lock
generated
@ -1161,6 +1161,13 @@
|
||||
resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd"
|
||||
integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==
|
||||
|
||||
"@lit/context@^1.1.3":
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@lit/context/-/context-1.1.3.tgz#66f8832e57f760f51f39c9d658ca6bd78f809e19"
|
||||
integrity sha512-Auh37F4S0PZM93HTDfZWs97mmzaQ7M3vnTc9YvxAGyP3UItSK/8Fs0vTOGT+njuvOwbKio/l8Cx/zWL4vkutpQ==
|
||||
dependencies:
|
||||
"@lit/reactive-element" "^1.6.2 || ^2.0.0"
|
||||
|
||||
"@lit/localize-tools@^0.8.0":
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@lit/localize-tools/-/localize-tools-0.8.0.tgz#8a14b3961aa63ef801c9f63274cb1d58821a3552"
|
||||
@ -1197,7 +1204,7 @@
|
||||
dependencies:
|
||||
"@lit-labs/ssr-dom-shim" "^1.0.0"
|
||||
|
||||
"@lit/reactive-element@^1.0.0 || ^2.0.0":
|
||||
"@lit/reactive-element@^1.0.0 || ^2.0.0", "@lit/reactive-element@^1.6.2 || ^2.0.0":
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz#8f2ed950a848016383894a26180ff06c56ae001b"
|
||||
integrity sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==
|
||||
|
Loading…
Reference in New Issue
Block a user