From 65a3b4917c3d7d7d32079ac355cbf1e4ba1fac1d Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Tue, 6 May 2025 21:50:16 +0800 Subject: [PATCH 001/112] fix: improve hostname parsing logic in getSiteName function --- src/utils.ts | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 508f06503..b2430a4cc 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -34,32 +34,33 @@ export async function getSiteName() { // ip address if (/^\d+\.\d+\.\d+\.\d+$/.test(hostname)) { nameFromDomain = hostname; - } - - // local network - if (hostname.indexOf(".") === -1) { - nameFromDomain = hostname; - } + }else{ + + // local network + if (hostname.indexOf(".") === -1) { + nameFromDomain = hostname; + } - const hostLevelUnits = hostname.split("."); + const hostLevelUnits = hostname.split("."); - if (hostLevelUnits.length === 2) { - nameFromDomain = hostLevelUnits[0]; - } + if (hostLevelUnits.length === 2) { + nameFromDomain = hostLevelUnits[0]; + } - // www.example.com - // example.com.cn - if (hostLevelUnits.length > 2) { + // www.example.com // example.com.cn - if ( - ["com", "net", "org", "edu", "gov", "co"].indexOf( - hostLevelUnits[hostLevelUnits.length - 2] - ) !== -1 - ) { - nameFromDomain = hostLevelUnits[hostLevelUnits.length - 3]; - } else { - // www.example.com - nameFromDomain = hostLevelUnits[hostLevelUnits.length - 2]; + if (hostLevelUnits.length > 2) { + // example.com.cn + if ( + ["com", "net", "org", "edu", "gov", "co"].indexOf( + hostLevelUnits[hostLevelUnits.length - 2] + ) !== -1 + ) { + nameFromDomain = hostLevelUnits[hostLevelUnits.length - 3]; + } else { + // www.example.com + nameFromDomain = hostLevelUnits[hostLevelUnits.length - 2]; + } } } From e7c0320c41265d3dc1095c1222218dd6b9a138e2 Mon Sep 17 00:00:00 2001 From: Hank Date: Tue, 6 May 2025 21:50:16 +0800 Subject: [PATCH 002/112] fix: improve hostname parsing logic in getSiteName function --- src/utils.ts | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 508f06503..b2430a4cc 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -34,32 +34,33 @@ export async function getSiteName() { // ip address if (/^\d+\.\d+\.\d+\.\d+$/.test(hostname)) { nameFromDomain = hostname; - } - - // local network - if (hostname.indexOf(".") === -1) { - nameFromDomain = hostname; - } + }else{ + + // local network + if (hostname.indexOf(".") === -1) { + nameFromDomain = hostname; + } - const hostLevelUnits = hostname.split("."); + const hostLevelUnits = hostname.split("."); - if (hostLevelUnits.length === 2) { - nameFromDomain = hostLevelUnits[0]; - } + if (hostLevelUnits.length === 2) { + nameFromDomain = hostLevelUnits[0]; + } - // www.example.com - // example.com.cn - if (hostLevelUnits.length > 2) { + // www.example.com // example.com.cn - if ( - ["com", "net", "org", "edu", "gov", "co"].indexOf( - hostLevelUnits[hostLevelUnits.length - 2] - ) !== -1 - ) { - nameFromDomain = hostLevelUnits[hostLevelUnits.length - 3]; - } else { - // www.example.com - nameFromDomain = hostLevelUnits[hostLevelUnits.length - 2]; + if (hostLevelUnits.length > 2) { + // example.com.cn + if ( + ["com", "net", "org", "edu", "gov", "co"].indexOf( + hostLevelUnits[hostLevelUnits.length - 2] + ) !== -1 + ) { + nameFromDomain = hostLevelUnits[hostLevelUnits.length - 3]; + } else { + // www.example.com + nameFromDomain = hostLevelUnits[hostLevelUnits.length - 2]; + } } } From 0af83082e89b089c7cfeee068d708f8efb0d9e97 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:00:49 +0800 Subject: [PATCH 003/112] fix(storage): parse type & algorithm enums correctly on import EntryStorage.import() ran parseInt() on the type and algorithm fields, but both are persisted as their enum *names* ("hotp", "SHA256"), so parseInt always returned NaN and fell back to the defaults. Every imported entry therefore became TOTP/SHA1, losing HOTP/Steam/Battle/hex types and SHA256/SHA512 digests. Map the stored name back to the enum (case-insensitive for algorithm), guarding with a typeof-number check so legacy numeric data still falls back safely. Refs Authenticator-Extension/Authenticator#1292, #405, #1442, #1294, #1089 --- src/models/storage.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/models/storage.ts b/src/models/storage.ts index 4b3699fb2..487c8c258 100644 --- a/src/models/storage.ts +++ b/src/models/storage.ts @@ -463,7 +463,16 @@ export class EntryStorage { continue; } + // type and algorithm are stored as their names (e.g. "hotp", "SHA256"), + // not numbers, so parseInt would yield NaN and silently fall back to the + // default. Map the name back to the enum instead. Fixes imported HOTP / + // Steam entries becoming TOTP (Authenticator-Extension/Authenticator#1292, + // #405) and SHA256/SHA512 reverting to SHA1 (#1442, #1294, #1089). + const typeFromName = OTPType[data[hash].type as keyof typeof OTPType]; const rawAlgorithm = data[hash].algorithm; + const algorithmFromName = rawAlgorithm + ? OTPAlgorithm[rawAlgorithm.toUpperCase() as keyof typeof OTPAlgorithm] + : undefined; const entryData: { account: string; encrypted: false; @@ -478,7 +487,7 @@ export class EntryStorage { algorithm: OTPAlgorithm; pinned: boolean; } = { - type: (parseInt(data[hash].type) as OTPType) || OTPType[OTPType.totp], + type: typeof typeFromName === "number" ? typeFromName : OTPType.totp, index: data[hash].index || 0, issuer: data[hash].issuer || "", account: data[hash].account || "", @@ -487,9 +496,10 @@ export class EntryStorage { counter: data[hash].counter || 0, period: data[hash].period || 30, digits: data[hash].digits || 6, - algorithm: rawAlgorithm - ? (parseInt(rawAlgorithm) as OTPAlgorithm) - : OTPAlgorithm.SHA1, + algorithm: + typeof algorithmFromName === "number" + ? algorithmFromName + : OTPAlgorithm.SHA1, pinned: data[hash].pinned || false, hash: data[hash].hash || hash, }; From ac1501d7dc168d7117f51cc0bc2c4005406384f9 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:01:53 +0800 Subject: [PATCH 004/112] fix(popup): keep countdown second non-negative for any clock offset second % 60 keeps the sign of the dividend in JS, so a negative clock offset could leave state.second negative; the old "+ 60" only covered offsets down to -60. Use a positive modulo so any offset stays in 0..59. Refs Authenticator-Extension/Authenticator#1310 --- src/store/Accounts.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/store/Accounts.ts b/src/store/Accounts.ts index 57f6a47e6..27f016138 100644 --- a/src/store/Accounts.ts +++ b/src/store/Accounts.ts @@ -86,11 +86,11 @@ export class Accounts implements Module { updateCodes(state: AccountsState) { let second = new Date().getSeconds(); if (UserSettings.items.offset) { - // prevent second from negative - second += Number(UserSettings.items.offset) + 60; + second += Number(UserSettings.items.offset); } - second = second % 60; + // positive modulo so any offset (incl. < -60) stays in 0..59 (#1310) + second = ((second % 60) + 60) % 60; state.second = second; let currentlyEncrypted = false; From 8ce1acbe80b99e0401c6ac44c84c51d0137b71c2 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:05:06 +0800 Subject: [PATCH 005/112] fix(import): accept any positive-integer TOTP period The otpauth importer rejected periods that were > 60 or not a divisor of 60, silently dropping valid values like 45, 90 or 120 and falling back to 30s, which produces wrong codes. Validate as a positive integer instead. Refs Authenticator-Extension/Authenticator#1271, #1508 --- src/import.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/import.ts b/src/import.ts index 21bebdabb..e75c0bdeb 100644 --- a/src/import.ts +++ b/src/import.ts @@ -256,10 +256,10 @@ export async function getEntryDataFromOTPAuthPerLine(importCode: string) { parameter[0].toLowerCase() === "period" ) { period = Number(parameter[1]); - period = - isNaN(period) || period < 0 || period > 60 || 60 % period !== 0 - ? undefined - : period; + // accept any positive integer period; the old "> 60" / "60 % period" + // checks silently dropped valid periods (45, 60, 90, 120...) so those + // OTPs fell back to 30s and produced wrong codes (#1271, #1508) + period = !Number.isInteger(period) || period < 1 ? undefined : period; } else if (parameter[0].toLowerCase() === "digits") { digits = Number(parameter[1]); digits = isNaN(digits) ? 6 : digits; From 7c2efb31218ab0711d5de8d6a6711a9d6c8ed745 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:06:48 +0800 Subject: [PATCH 006/112] fix(preferences): only show smart-filter hint when enabling it Toggling Smart Filter off also fired the "smart filter loosely matches the domain name" notification. Show it only when the toggle is turned on. Refs Authenticator-Extension/Authenticator#1282 --- src/components/Popup/PreferencesPage.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/Popup/PreferencesPage.vue b/src/components/Popup/PreferencesPage.vue index 299b9d8d1..673ff375f 100644 --- a/src/components/Popup/PreferencesPage.vue +++ b/src/components/Popup/PreferencesPage.vue @@ -89,10 +89,13 @@ export default Vue.extend({ }, set(smartFilter: boolean) { this.$store.commit("menu/setSmartFilter", smartFilter); - this.$store.commit( - "notification/alert", - this.i18n.activate_auto_filter - ); + // only explain smart filter when turning it on, not off (#1282) + if (smartFilter) { + this.$store.commit( + "notification/alert", + this.i18n.activate_auto_filter + ); + } }, }, enableContextMenu: { From 17a7da44d1a9bcb417b75f39b373e5110b1178fd Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:06:48 +0800 Subject: [PATCH 007/112] fix(advisor): don't warn about autolock when using the 30-min default An unset autolock falls back to a 30-minute default in setAutolock(), but the advisor treated "unset" the same as "disabled" and kept showing the warning. Only warn when autolock is explicitly set to 0. Refs Authenticator-Extension/Authenticator#1281 --- src/store/Advisor.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/store/Advisor.ts b/src/store/Advisor.ts index a9514d4e8..b6cebd15c 100644 --- a/src/store/Advisor.ts +++ b/src/store/Advisor.ts @@ -19,7 +19,9 @@ const insightsData: AdvisorInsightInterface[] = [ validation: async () => { await UserSettings.updateItems(); const hasEncryptedEntry = await EntryStorage.hasEncryptionKey(); - return hasEncryptedEntry && !Number(UserSettings.items.autolock); + // an unset autolock falls back to the 30-min default (see setAutolock), + // so only warn when the user has explicitly disabled it with 0 (#1281) + return hasEncryptedEntry && Number(UserSettings.items.autolock) === 0; }, }, { From d815f3e31b5f761a7630f4ec15f5873dc63316bb Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:08:40 +0800 Subject: [PATCH 008/112] fix(add-account): apply selected algorithm and digits immediately The algorithm and digits
Date: Sun, 21 Jun 2026 20:52:38 +0800 Subject: [PATCH 035/112] refactor(store): route Accounts state changes through mutations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prep for Vuex strict mode. The deleteCode/addCode/applyPassphrase/ changePassphrase actions mutated store state directly (entries splice/unshift, defaultEncryption =, and entry.changeEncryption/genUUID on store-held entries), and EntryComponent edited entries via v-model and advanced the HOTP counter with entry.next() — all outside a mutation. Add removeEntry/addEntry/ setDefaultEncryption/setEntryField/applyEntryEncryption/regenEntryHash/ advanceHotpCounter mutations and commit through them; the edit inputs now use :value + @input, and nextCode commits the in-memory change then persists. Refs code review §4 (state mutation discipline) --- src/components/Popup/EntryComponent.vue | 18 +++++- src/store/Accounts.ts | 81 +++++++++++++++++++------ 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/components/Popup/EntryComponent.vue b/src/components/Popup/EntryComponent.vue index f644b2928..fa022782c 100644 --- a/src/components/Popup/EntryComponent.vue +++ b/src/components/Popup/EntryComponent.vue @@ -48,7 +48,8 @@ @@ -65,7 +66,8 @@ @@ -189,12 +191,22 @@ export default Vue.extend({ return; } this.$store.commit("style/toggleHotpDisabled"); - await entry.next(); + // entry.next() mutated the store-held entry directly; do the in-memory + // counter/code change in a mutation, then persist (storage, not state) + if (entry.type === OTPType.hotp || entry.type === OTPType.hhex) { + this.$store.commit("accounts/advanceHotpCounter", entry); + if (entry.secret !== null) { + await entry.update(); + } + } setTimeout(() => { this.$store.commit("style/toggleHotpDisabled"); }, 3000); return; }, + setEntryField(entry: OTPEntry, field: "issuer" | "account", value: string) { + this.$store.commit("accounts/setEntryField", { entry, field, value }); + }, async copyCode(entry: OTPEntry) { if ( this.$store.state.style.style.isEditing || diff --git a/src/store/Accounts.ts b/src/store/Accounts.ts index cf167aa8c..305136bc3 100644 --- a/src/store/Accounts.ts +++ b/src/store/Accounts.ts @@ -188,18 +188,53 @@ export class Accounts implements Module { initComplete(state: AccountsState) { state.initComplete = true; }, + // --- mutations routed for Vuex strict mode (state must only change here) + removeEntry(state: AccountsState, hash: string) { + const index = state.entries.findIndex((entry) => entry.hash === hash); + if (index > -1) { + state.entries.splice(index, 1); + } + }, + addEntry(state: AccountsState, entry: OTPEntryInterface) { + state.entries.unshift(entry); + }, + setDefaultEncryption(state: AccountsState, keyId: string) { + state.defaultEncryption = keyId; + }, + setEntryField( + state: AccountsState, + payload: { + entry: OTPEntryInterface; + field: "issuer" | "account"; + value: string; + } + ) { + payload.entry[payload.field] = payload.value; + }, + applyEntryEncryption( + state: AccountsState, + payload: { entry: OTPEntryInterface; encryption: EncryptionInterface } + ) { + payload.entry.changeEncryption(payload.encryption); + }, + regenEntryHash(state: AccountsState, entry: OTPEntryInterface) { + entry.genUUID(); + }, + // in-memory part of OTPEntry.next(); persistence (entry.update()) stays + // in the action since mutations must be synchronous + advanceHotpCounter(state: AccountsState, entry: OTPEntryInterface) { + entry.generate(); + if (entry.secret !== null) { + entry.counter++; + } + }, }, actions: { deleteCode: async ( state: ActionContext, hash: string ) => { - const index = state.state.entries.findIndex( - (entry) => entry.hash === hash - ); - if (index > -1) { - state.state.entries.splice(index, 1); - } + state.commit("removeEntry", hash); state.commit( "updateExport", await EntryStorage.getExport(state.state.entries) @@ -213,7 +248,7 @@ export class Accounts implements Module { state: ActionContext, entry: OTPEntryInterface ) => { - state.state.entries.unshift(entry); + state.commit("addEntry", entry); state.commit( "updateExport", await EntryStorage.getExport(state.state.entries) @@ -301,7 +336,7 @@ export class Accounts implements Module { key.id, new Encryption(possibleHash, key.id) ); - state.state.defaultEncryption = key.id; + state.commit("setDefaultEncryption", key.id); saltedHash = possibleHash; } @@ -345,7 +380,7 @@ export class Accounts implements Module { }; const newEncryption = new Encryption(saltedHash, key.id); state.state.encryption.set(key.id, newEncryption); - state.state.defaultEncryption = key.id; + state.commit("setDefaultEncryption", key.id); const toRemove: string[] = []; for (const entry of state.state.entries) { @@ -353,7 +388,10 @@ export class Accounts implements Module { continue; } - await entry.changeEncryption(newEncryption); + state.commit("applyEntryEncryption", { + entry, + encryption: newEncryption, + }); // if not uuidv4 regen if ( @@ -361,7 +399,7 @@ export class Accounts implements Module { entry.hash ) ) { - entry.genUUID(); + state.commit("regenEntryHash", entry); toRemove.push(entry.hash); } } @@ -397,7 +435,10 @@ export class Accounts implements Module { entry.encryption?.getEncryptionKeyId() !== state.state.defaultEncryption ) { - await entry.changeEncryption(defaultEncryption); + state.commit("applyEntryEncryption", { + entry, + encryption: defaultEncryption, + }); needUpdateStorage = true; } } @@ -454,7 +495,10 @@ export class Accounts implements Module { const linkedKeys = new Map(); for (const entry of state.state.entries) { - await entry.changeEncryption(new Encryption(saltedHash, key.id)); + state.commit("applyEntryEncryption", { + entry, + encryption: new Encryption(saltedHash, key.id), + }); // if not uuidv4 regen if ( /[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}/i.test( @@ -462,7 +506,7 @@ export class Accounts implements Module { ) ) { removeKeys.push(entry.hash); - entry.genUUID(); + state.commit("regenEntryHash", entry); } if (entry.encryption?.getEncryptionKeyId()) { @@ -494,7 +538,7 @@ export class Accounts implements Module { key.id, new Encryption(saltedHash, key.id) ); - state.state.defaultEncryption = key.id; + state.commit("setDefaultEncryption", key.id); await state.dispatch("updateEntries"); @@ -510,7 +554,10 @@ export class Accounts implements Module { }); } else { for (const entry of state.state.entries) { - await entry.changeEncryption(new Encryption("", "")); + state.commit("applyEntryEncryption", { + entry, + encryption: new Encryption("", ""), + }); } await EntryStorage.set(state.state.entries); @@ -521,7 +568,7 @@ export class Accounts implements Module { if (keyId) { await BrowserStorage.remove(keyId); } - state.state.defaultEncryption = ""; + state.commit("setDefaultEncryption", ""); await state.dispatch("updateEntries"); From 816369efd61acfad6d4aa71430aa93679eefa680 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:52:39 +0800 Subject: [PATCH 036/112] refactor(store): convert async Advisor/Permissions mutations to actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vuex strict mode forbids changing state after an await, but Advisor's dismissInsight/clearIgnoreList/updateInsight and Permissions' revokePermission were async mutations that assigned state.insights/permissions after awaiting. Split each into a sync mutation (the state write) plus an action (the async work), and switch the call sites from commit to dispatch. Refs code review §4 --- src/components/Permissions.vue | 2 +- src/components/Popup/AdvisorInsight.vue | 2 +- src/components/Popup/AdvisorPage.vue | 4 +-- src/store/Advisor.ts | 43 +++++++++++++++++++------ src/store/Permissions.ts | 12 +++++-- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/components/Permissions.vue b/src/components/Permissions.vue index c53a10691..4e4f73f78 100644 --- a/src/components/Permissions.vue +++ b/src/components/Permissions.vue @@ -46,7 +46,7 @@ export default Vue.extend({ }, methods: { revoke(permissionId: string) { - this.$store.commit("permissions/revokePermission", permissionId); + this.$store.dispatch("permissions/revokePermission", permissionId); }, }, }); diff --git a/src/components/Popup/AdvisorInsight.vue b/src/components/Popup/AdvisorInsight.vue index b453d18ad..df6d7def4 100644 --- a/src/components/Popup/AdvisorInsight.vue +++ b/src/components/Popup/AdvisorInsight.vue @@ -20,7 +20,7 @@ export default Vue.extend({ }, methods: { dismiss(insight: AdvisorInsight) { - this.$store.commit("advisor/dismissInsight", insight.id); + this.$store.dispatch("advisor/dismissInsight", insight.id); }, openLink(url: string) { window.open(url, "_blank"); diff --git a/src/components/Popup/AdvisorPage.vue b/src/components/Popup/AdvisorPage.vue index c5804ff78..b1a3d1ff6 100644 --- a/src/components/Popup/AdvisorPage.vue +++ b/src/components/Popup/AdvisorPage.vue @@ -23,7 +23,7 @@ import AdvisorInsight from "./AdvisorInsight.vue"; export default Vue.extend({ mounted: function () { - this.$store.commit("advisor/updateInsight"); + this.$store.dispatch("advisor/updateInsight"); }, computed: { insights: function () { @@ -38,7 +38,7 @@ export default Vue.extend({ }, methods: { clearIgnoreList: function () { - this.$store.commit("advisor/clearIgnoreList"); + this.$store.dispatch("advisor/clearIgnoreList"); }, }, }); diff --git a/src/store/Advisor.ts b/src/store/Advisor.ts index b6cebd15c..3d7458135 100644 --- a/src/store/Advisor.ts +++ b/src/store/Advisor.ts @@ -1,3 +1,4 @@ +import { ActionContext } from "vuex"; import { EntryStorage } from "../models/storage"; import { InsightLevel, AdvisorInsight } from "../models/advisor"; import { StorageLocation, UserSettings } from "../models/settings"; @@ -69,26 +70,48 @@ export class Advisor implements Module { ignoreList: UserSettings.items.advisorIgnoreList || [], }, mutations: { - dismissInsight: async (state: AdvisorState, insightId: string) => { + // sync state changes only (these used to be async mutations that + // assigned state after an await, which Vuex strict mode forbids) + pushIgnore(state: AdvisorState, insightId: string) { state.ignoreList.push(insightId); - UserSettings.items.advisorIgnoreList = state.ignoreList; + }, + setIgnoreList(state: AdvisorState, list: string[]) { + state.ignoreList = list; + }, + setInsights(state: AdvisorState, insights: AdvisorInsightInterface[]) { + state.insights = insights; + }, + }, + actions: { + dismissInsight: async ( + context: ActionContext, + insightId: string + ) => { + context.commit("pushIgnore", insightId); + UserSettings.items.advisorIgnoreList = context.state.ignoreList; UserSettings.commitItems(); - state.insights = await this.getInsights(); + context.commit("setInsights", await this.getInsights()); }, - clearIgnoreList: async (state: AdvisorState) => { - state.ignoreList = []; + clearIgnoreList: async ( + context: ActionContext + ) => { + context.commit("setIgnoreList", []); UserSettings.items.advisorIgnoreList = undefined; UserSettings.commitItems(); - state.insights = await this.getInsights(); + context.commit("setInsights", await this.getInsights()); }, - updateInsight: async (state: AdvisorState) => { - state.insights = await this.getInsights(); - state.ignoreList = + updateInsight: async ( + context: ActionContext + ) => { + context.commit("setInsights", await this.getInsights()); + context.commit( + "setIgnoreList", typeof UserSettings.items.advisorIgnoreList === "string" ? JSON.parse(UserSettings.items.advisorIgnoreList || "[]") - : UserSettings.items.advisorIgnoreList || []; + : UserSettings.items.advisorIgnoreList || [] + ); }, }, namespaced: true, diff --git a/src/store/Permissions.ts b/src/store/Permissions.ts index a8d20ebca..dd1f58150 100644 --- a/src/store/Permissions.ts +++ b/src/store/Permissions.ts @@ -1,3 +1,4 @@ +import { ActionContext } from "vuex"; import { Permission } from "../models/permission"; import { UserSettings } from "../models/settings"; @@ -150,8 +151,15 @@ export class Permissions implements Module { permissions: await this.getPermissions(), }, mutations: { + setPermissions(state: PermissionsState, permissions: Permission[]) { + state.permissions = permissions; + }, + }, + actions: { + // was an async mutation; assigning state after an await violates Vuex + // strict mode, so the async work lives in an action now revokePermission: async ( - state: PermissionsState, + context: ActionContext, permissionId: string ) => { const permissionObject = this.getPermissionById(permissionId); @@ -173,7 +181,7 @@ export class Permissions implements Module { } await this.revokePermission(permissionId); - state.permissions = await this.getPermissions(); + context.commit("setPermissions", await this.getPermissions()); }, }, namespaced: true, From 7765118f3a19710f28d645dd05ee7f6f2ddc678f Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:52:39 +0800 Subject: [PATCH 037/112] feat(store): enable Vuex strict mode in development builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With all state changes routed through mutations, turn on strict so any future out-of-mutation write throws immediately in dev. Gated on process.env.NODE_ENV (webpack injects it) so production keeps no runtime cost. Refs code review §4 --- src/permissions.ts | 1 + src/popup.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/permissions.ts b/src/permissions.ts index d0636485c..1a0a0222d 100644 --- a/src/permissions.ts +++ b/src/permissions.ts @@ -24,6 +24,7 @@ async function init() { // State const store = new Vuex.Store({ + strict: process.env.NODE_ENV !== "production", modules: { permissions: await new Permissions().getModule(), }, diff --git a/src/popup.ts b/src/popup.ts index 15c314756..82595acd2 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -48,6 +48,8 @@ async function init() { // State const store = new Vuex.Store({ + // catch out-of-mutation state changes during development (no prod cost) + strict: process.env.NODE_ENV !== "production", modules: { accounts: await new Accounts().getModule(), advisor: await new Advisor().getModule(), From a175e19931c0f6cc2f8104cd0c391f3c707ff8fa Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 21:56:58 +0800 Subject: [PATCH 038/112] refactor(store): move deferred animation/alert resets out of mutations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vuex strict mode (just enabled) flagged the Style and Notification mutations that reset a flag inside a setTimeout — the callback runs after the mutation returns, so it mutates state outside a handler. Convert hideMenu/hideInfo/ hideQr/showNotification and closeAlert to actions that commit a sync flag mutation now and again after the delay, and switch their call sites from commit to dispatch. Refs code review §4 (Vuex strict) --- src/components/Popup.vue | 2 +- src/components/Popup/AddAccountPage.vue | 2 +- src/components/Popup/DrivePage.vue | 2 +- src/components/Popup/DropboxPage.vue | 2 +- src/components/Popup/MenuPage.vue | 2 +- src/components/Popup/NotificationHandler.vue | 2 +- src/components/Popup/OneDrivePage.vue | 2 +- src/components/Popup/PageHandler.vue | 2 +- src/components/Popup/SetPasswordPage.vue | 4 +- src/store/Accounts.ts | 2 +- src/store/Notification.ts | 20 +++-- src/store/Style.ts | 85 ++++++++++++-------- 12 files changed, 78 insertions(+), 49 deletions(-) diff --git a/src/components/Popup.vue b/src/components/Popup.vue index 5ef9d0fd8..31ff5d253 100644 --- a/src/components/Popup.vue +++ b/src/components/Popup.vue @@ -97,7 +97,7 @@ export default Vue.extend({ computed, methods: { hideQr() { - this.$store.commit("style/hideQr"); + this.$store.dispatch("style/hideQr"); }, }, components: { diff --git a/src/components/Popup/AddAccountPage.vue b/src/components/Popup/AddAccountPage.vue index 48ae11839..87cd66bb3 100644 --- a/src/components/Popup/AddAccountPage.vue +++ b/src/components/Popup/AddAccountPage.vue @@ -150,7 +150,7 @@ export default Vue.extend({ return; } await this.$store.dispatch("accounts/addCode", entry); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); this.$store.commit("style/toggleEdit"); const codes = document.getElementById("codes"); diff --git a/src/components/Popup/DrivePage.vue b/src/components/Popup/DrivePage.vue index 351a61bbf..c7e00a70d 100644 --- a/src/components/Popup/DrivePage.vue +++ b/src/components/Popup/DrivePage.vue @@ -101,7 +101,7 @@ export default Vue.extend({ }); UserSettings.removeItem("driveToken"); this.$store.commit("backup/setToken", { service, value: false }); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); }, async backupUpload() { const drive = new Drive(); diff --git a/src/components/Popup/DropboxPage.vue b/src/components/Popup/DropboxPage.vue index 030d2d6ca..0f16bf2a5 100644 --- a/src/components/Popup/DropboxPage.vue +++ b/src/components/Popup/DropboxPage.vue @@ -91,7 +91,7 @@ export default Vue.extend({ }); UserSettings.removeItem(`${service}Token`); this.$store.commit("backup/setToken", { service, value: false }); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); }, async backupUpload() { const dbox = new Dropbox(); diff --git a/src/components/Popup/MenuPage.vue b/src/components/Popup/MenuPage.vue index 47eb7dc80..b8a5c288d 100644 --- a/src/components/Popup/MenuPage.vue +++ b/src/components/Popup/MenuPage.vue @@ -117,7 +117,7 @@ export default Vue.extend({ }, methods: { hideMenu() { - this.$store.commit("style/hideMenu"); + this.$store.dispatch("style/hideMenu"); }, openHelp() { let url = "https://otp.ee/chromeissues"; diff --git a/src/components/Popup/NotificationHandler.vue b/src/components/Popup/NotificationHandler.vue index c1c782f72..6340ad21f 100644 --- a/src/components/Popup/NotificationHandler.vue +++ b/src/components/Popup/NotificationHandler.vue @@ -36,7 +36,7 @@ export default Vue.extend({ ]), methods: { closeAlert() { - this.$store.commit("notification/closeAlert"); + this.$store.dispatch("notification/closeAlert"); }, confirmOK() { const confirmEvent = new CustomEvent("confirm", { detail: true }); diff --git a/src/components/Popup/OneDrivePage.vue b/src/components/Popup/OneDrivePage.vue index 8c93fc782..ec70f2c99 100644 --- a/src/components/Popup/OneDrivePage.vue +++ b/src/components/Popup/OneDrivePage.vue @@ -94,7 +94,7 @@ export default Vue.extend({ UserSettings.items.oneDriveRefreshToken = undefined; UserSettings.commitItems(); this.$store.commit("backup/setToken", { service, value: false }); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); }, async backupUpload() { const oneDrive = new OneDrive(); diff --git a/src/components/Popup/PageHandler.vue b/src/components/Popup/PageHandler.vue index a995f99c1..2a7903d35 100644 --- a/src/components/Popup/PageHandler.vue +++ b/src/components/Popup/PageHandler.vue @@ -35,7 +35,7 @@ export default Vue.extend({ }, methods: { hideInfo() { - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); }, }, components: { diff --git a/src/components/Popup/SetPasswordPage.vue b/src/components/Popup/SetPasswordPage.vue index be00b882a..3b2f024ec 100644 --- a/src/components/Popup/SetPasswordPage.vue +++ b/src/components/Popup/SetPasswordPage.vue @@ -83,7 +83,7 @@ export default Vue.extend({ await this.$store.dispatch("accounts/changePassphrase", ""); this.$store.commit("notification/alert", this.i18n.updateSuccess); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); return; }, async changePassphrase() { @@ -119,7 +119,7 @@ export default Vue.extend({ await this.$store.dispatch("accounts/changePassphrase", this.phrase); this.$store.commit("notification/alert", this.i18n.updateSuccess); - this.$store.commit("style/hideInfo"); + this.$store.dispatch("style/hideInfo"); return; }, }, diff --git a/src/store/Accounts.ts b/src/store/Accounts.ts index 305136bc3..555e0d192 100644 --- a/src/store/Accounts.ts +++ b/src/store/Accounts.ts @@ -456,7 +456,7 @@ export class Accounts implements Module { }); } - state.commit("style/hideInfo", true, { root: true }); + state.dispatch("style/hideInfo", true, { root: true }); return; }, changePassphrase: async ( diff --git a/src/store/Notification.ts b/src/store/Notification.ts index bb3ae33de..8fce1c5fc 100644 --- a/src/store/Notification.ts +++ b/src/store/Notification.ts @@ -13,12 +13,11 @@ export class Notification implements Module { alert: (state: NotificationState, message: string) => { state.message.unshift(message); }, - closeAlert: (state: NotificationState) => { - state.messageIdle = false; + setMessageIdle: (state: NotificationState, value: boolean) => { + state.messageIdle = value; + }, + shiftMessage: (state: NotificationState) => { state.message.shift(); - setTimeout(() => { - state.messageIdle = true; - }, 200); }, setConfirm: (state: NotificationState, message: string) => { state.confirmMessage = message; @@ -28,6 +27,15 @@ export class Notification implements Module { }, }, actions: { + // was a mutation, but the deferred reset (setTimeout) mutated state + // outside the handler, which Vuex strict mode forbids + closeAlert: ({ commit }: ActionContext) => { + commit("setMessageIdle", false); + commit("shiftMessage"); + setTimeout(() => { + commit("setMessageIdle", true); + }, 200); + }, confirm: async ( state: ActionContext, message: string @@ -55,7 +63,7 @@ export class Notification implements Module { message: string ) => { state.commit("setNotification", message); - state.commit("style/showNotification", null, { root: true }); + state.dispatch("style/showNotification", null, { root: true }); }, }, namespaced: true, diff --git a/src/store/Style.ts b/src/store/Style.ts index a70345691..b4b0bed0c 100644 --- a/src/store/Style.ts +++ b/src/store/Style.ts @@ -1,3 +1,5 @@ +import { ActionContext } from "vuex"; + export class Style implements Module { getModule() { return { @@ -18,17 +20,19 @@ export class Style implements Module { }, }, mutations: { + // generic synchronous flag setter so the animation actions below can + // schedule their deferred resets through a mutation (Vuex strict mode + // forbids the setTimeout callbacks mutating state directly) + setStyleFlag( + state: StyleState, + payload: { key: keyof StyleState["style"]; value: boolean } + ) { + state.style[payload.key] = payload.value; + }, showMenu(state: StyleState) { state.style.slidein = true; state.style.slideout = false; }, - hideMenu(state: StyleState) { - state.style.slidein = false; - state.style.slideout = true; - setTimeout(() => { - state.style.slideout = false; - }, 200); - }, showInfo(state: StyleState, noAnimate?: boolean) { if (noAnimate) { state.style.show = true; @@ -37,45 +41,62 @@ export class Style implements Module { state.style.fadeout = false; } }, - hideInfo(state: StyleState, noAnimate?: boolean) { + showQr(state: StyleState) { + state.style.qrfadein = true; + state.style.qrfadeout = false; + }, + toggleEdit(state: StyleState) { + state.style.isEditing = !state.style.isEditing; + }, + toggleHotpDisabled(state: StyleState) { + state.style.hotpDisabled = !state.style.hotpDisabled; + }, + }, + actions: { + // these end an animation by resetting a flag after a delay, which has + // to be committed (not mutated directly) under strict mode + hideMenu({ commit }: ActionContext) { + commit("setStyleFlag", { key: "slidein", value: false }); + commit("setStyleFlag", { key: "slideout", value: true }); + setTimeout(() => { + commit("setStyleFlag", { key: "slideout", value: false }); + }, 200); + }, + hideInfo( + { commit }: ActionContext, + noAnimate?: boolean + ) { if (noAnimate) { - state.style.show = false; + commit("setStyleFlag", { key: "show", value: false }); } else { - state.style.fadein = false; - state.style.fadeout = true; + commit("setStyleFlag", { key: "fadein", value: false }); + commit("setStyleFlag", { key: "fadeout", value: true }); } setTimeout(() => { - state.style.fadeout = false; + commit("setStyleFlag", { key: "fadeout", value: false }); }, 200); }, - showQr(state: StyleState) { - state.style.qrfadein = true; - state.style.qrfadeout = false; - }, - hideQr(state: StyleState) { - state.style.qrfadein = false; - state.style.qrfadeout = true; + hideQr({ commit }: ActionContext) { + commit("setStyleFlag", { key: "qrfadein", value: false }); + commit("setStyleFlag", { key: "qrfadeout", value: true }); setTimeout(() => { - state.style.qrfadeout = false; + commit("setStyleFlag", { key: "qrfadeout", value: false }); }, 200); }, - showNotification(state: StyleState) { - state.style.notificationFadein = true; - state.style.notificationFadeout = false; + showNotification({ commit }: ActionContext) { + commit("setStyleFlag", { key: "notificationFadein", value: true }); + commit("setStyleFlag", { key: "notificationFadeout", value: false }); setTimeout(() => { - state.style.notificationFadein = false; - state.style.notificationFadeout = true; + commit("setStyleFlag", { key: "notificationFadein", value: false }); + commit("setStyleFlag", { key: "notificationFadeout", value: true }); setTimeout(() => { - state.style.notificationFadeout = false; + commit("setStyleFlag", { + key: "notificationFadeout", + value: false, + }); }, 200); }, 1000); }, - toggleEdit(state: StyleState) { - state.style.isEditing = !state.style.isEditing; - }, - toggleHotpDisabled(state: StyleState) { - state.style.hotpDisabled = !state.style.hotpDisabled; - }, }, getters: { // Returns true if menu or info screen shown From 3f4c83ab0d1eb4a45b240955ff4eea633a7c5e5b Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:27:56 +0800 Subject: [PATCH 039/112] fix(messaging): don't return true from listeners that send no response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several onMessage listeners (background, content, Import, qrdebug) returned true, telling Chrome a sendResponse was coming, but never responded — so the sender's sendMessage promise rejected with "message channel closed before a response was received" once the channel closed. The visible case was a QR capture over a non-QR image (background → content sendCaptureUrl). Only content's "capture" replies, and it does so synchronously, so dropping the returns is safe; the background listener also runs its handlers fire-and-forget. Refs code review §6 --- src/background.ts | 76 ++++++++++++++++++++------------------- src/components/Import.vue | 5 ++- src/content.ts | 7 ++-- src/qrdebug.ts | 5 ++- 4 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/background.ts b/src/background.ts index a3e574f2e..0e69e722e 100644 --- a/src/background.ts +++ b/src/background.ts @@ -16,7 +16,7 @@ import { UserSettings } from "./models/settings"; let contentTab: chrome.tabs.Tab | undefined; -chrome.runtime.onMessage.addListener(async (message, sender) => { +chrome.runtime.onMessage.addListener((message, sender) => { // Only act on messages from our own extension pages / content scripts, never // another extension. (No externally_connectable is set, so web pages can't // reach here, but this is cheap defense-in-depth for the sensitive actions @@ -25,44 +25,48 @@ chrome.runtime.onMessage.addListener(async (message, sender) => { return; } - await UserSettings.updateItems(); + // None of these handlers send a response, so do the async work fire-and-forget + // and DON'T return true. Returning true kept the message channel open waiting + // for a sendResponse that never came, so the sender's sendMessage promise + // rejected with "message channel closed before a response was received" + // (e.g. when a QR capture finds no code). + void (async () => { + await UserSettings.updateItems(); - if (message.action === "getCapture") { - if (!sender.tab) { - return; - } - const url = await getCapture(sender.tab); - if (contentTab && contentTab.id) { - message.info.url = url; - chrome.tabs.sendMessage(contentTab.id, { - action: "sendCaptureUrl", - info: message.info, + if (message.action === "getCapture") { + if (!sender.tab) { + return; + } + const url = await getCapture(sender.tab); + if (contentTab && contentTab.id) { + message.info.url = url; + chrome.tabs.sendMessage(contentTab.id, { + action: "sendCaptureUrl", + info: message.info, + }); + } + } else if (message.action === "getTotp") { + getTotp(message.info); + } else if (message.action === "cachePassphrase") { + chrome.storage.session.set({ + cachedPassphrase: message.value, + cachedKeyId: message.keyId, }); + chrome.alarms.clear("autolock"); + setAutolock(); + } else if (["dropbox", "drive", "onedrive"].indexOf(message.action) > -1) { + getBackupToken(message.action); + } else if (message.action === "lock") { + chrome.storage.session.set({ cachedPassphrase: null, cachedKeyId: null }); + } else if (message.action === "resetAutolock") { + chrome.alarms.clear("autolock"); + setAutolock(); + } else if (message.action === "updateContentTab") { + contentTab = message.data; + } else if (message.action === "updateContextMenu") { + updateContextMenu(); } - } else if (message.action === "getTotp") { - getTotp(message.info); - } else if (message.action === "cachePassphrase") { - chrome.storage.session.set({ - cachedPassphrase: message.value, - cachedKeyId: message.keyId, - }); - chrome.alarms.clear("autolock"); - setAutolock(); - } else if (["dropbox", "drive", "onedrive"].indexOf(message.action) > -1) { - getBackupToken(message.action); - } else if (message.action === "lock") { - chrome.storage.session.set({ cachedPassphrase: null, cachedKeyId: null }); - } else if (message.action === "resetAutolock") { - chrome.alarms.clear("autolock"); - setAutolock(); - } else if (message.action === "updateContentTab") { - contentTab = message.data; - } else if (message.action === "updateContextMenu") { - updateContextMenu(); - } - - // https://stackoverflow.com/a/56483156 - return true; + })(); }); chrome.alarms.onAlarm.addListener(() => { diff --git a/src/components/Import.vue b/src/components/Import.vue index e224a82a2..d6d8c8e83 100644 --- a/src/components/Import.vue +++ b/src/components/Import.vue @@ -66,9 +66,8 @@ export default Vue.extend({ if (event.action === "stopImport") { this.shouldShowPassphrase = true; } - - // https://stackoverflow.com/a/56483156 - return true; + // no response is sent, so don't return true (which would leave the + // sender's message channel open and reject it on close) }); }, }); diff --git a/src/content.ts b/src/content.ts index bed807ac7..a1b5aa888 100644 --- a/src/content.ts +++ b/src/content.ts @@ -61,9 +61,10 @@ if (!document.getElementById("__ga_grayLayout__")) { // invalid command, ignore it break; } - - // https://stackoverflow.com/a/56483156 - return true; + // Only "capture" responds, and it does so synchronously, so don't return + // true. Returning true kept the channel open waiting for a response that + // never came for the other actions (e.g. sendCaptureUrl on a non-QR image), + // making the background sender's sendMessage promise reject. }); } diff --git a/src/qrdebug.ts b/src/qrdebug.ts index 713c92def..ebceca1ef 100644 --- a/src/qrdebug.ts +++ b/src/qrdebug.ts @@ -12,9 +12,8 @@ chrome.runtime.onMessage.addListener((message, sender) => { message.info.windowWidth ); } - - // https://stackoverflow.com/a/56483156 - return true; + // no response is sent, so don't return true (which leaves the sender's + // message channel open and rejects it on close) }); function getQrDebug( From cff9cf82bf9f0d0ba570d43e0d2c7a07fda0d194 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:47:53 +0800 Subject: [PATCH 040/112] fix(popup): re-sync the timer circle after pinning or reordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pinning or dragging an entry re-attaches its DOM node, restarting the timer circle's CSS animation; it resumed from the load-time sectorOffset, so the countdown drifted out of sync until the popup was reopened. Re-anchor sectorOffset to the current second on pin/drag, and key the sector on sectorOffset so the change recreates the element — changing animation-delay alone does not re-seek an already-running animation, so the element must restart to pick up the corrected phase. --- src/components/Popup/EntryComponent.vue | 3 +++ src/components/Popup/MainBody.vue | 2 ++ src/store/Accounts.ts | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/src/components/Popup/EntryComponent.vue b/src/components/Popup/EntryComponent.vue index fa022782c..64a99ff4f 100644 --- a/src/components/Popup/EntryComponent.vue +++ b/src/components/Popup/EntryComponent.vue @@ -18,6 +18,7 @@ class="sector" v-if="entry.type !== OTPType.hotp && entry.type !== OTPType.hhex" v-show="sectorStart" + v-bind:key="sectorOffset" > Date: Sun, 21 Jun 2026 22:58:25 +0800 Subject: [PATCH 041/112] perf(content): reuse one willReadFrequently canvas context for QR capture The QR capture got a fresh 2d context for each draw/read/put and called getImageData, which made Chrome log a "willReadFrequently" performance hint. Get the context once with willReadFrequently: true and reuse it. --- src/content.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/content.ts b/src/content.ts index a1b5aa888..c393b676d 100644 --- a/src/content.ts +++ b/src/content.ts @@ -227,19 +227,19 @@ async function qrDecode( const devicePixelRatio = qr.width / window.innerWidth; canvas.width = qr.width; canvas.height = qr.height; - canvas.getContext("2d")?.drawImage(qr, 0, 0); - const imageData = canvas - .getContext("2d") - ?.getImageData( - left * devicePixelRatio, - top * devicePixelRatio, - width * devicePixelRatio, - height * devicePixelRatio - ); + // willReadFrequently: we call getImageData below; silences a Chrome perf hint + const ctx = canvas.getContext("2d", { willReadFrequently: true }); + ctx?.drawImage(qr, 0, 0); + const imageData = ctx?.getImageData( + left * devicePixelRatio, + top * devicePixelRatio, + width * devicePixelRatio, + height * devicePixelRatio + ); if (imageData) { canvas.width = imageData.width; canvas.height = imageData.height; - canvas.getContext("2d")?.putImageData(imageData, 0, 0); + ctx?.putImageData(imageData, 0, 0); const qrReader = new QRCode(); qrReader.callback = ( From 83a09962c866f054e6a4e059937dea817a07d442 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:18:32 +0800 Subject: [PATCH 042/112] feat(encryption): encrypt with authenticated AES-GCM, read legacy CBC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the unauthenticated crypto-js AES-CBC (integrity checked only by a charset regex) with WebCrypto AES-GCM: a SHA-256-derived key from the argon2 saltedHash, a random 96-bit IV per message, and the GCM auth tag, emitted as base64 behind a "v4:" prefix. Ciphertext is self-describing, so decrypt routes to GCM for "v4:" and to crypto-js CBC otherwise — old storage and backups stay readable and upgrade to GCM the next time they are written; no migration pass. A wrong key or tampered data now fails to decrypt instead of returning garbage. The encryption methods become async (WebCrypto); the interface follows. Refs code review §6 (authenticated encryption) --- src/definitions/otp.d.ts | 8 +- src/models/encryption.ts | 162 ++++++++++++++++++++++++++++----------- 2 files changed, 123 insertions(+), 47 deletions(-) diff --git a/src/definitions/otp.d.ts b/src/definitions/otp.d.ts index c55fb1486..38d4907f3 100644 --- a/src/definitions/otp.d.ts +++ b/src/definitions/otp.d.ts @@ -16,7 +16,7 @@ interface OTPEntryInterface { create(): Promise; update(): Promise; next(): Promise; - applyEncryption(encryption: EncryptionInterface): void; + applyEncryption(encryption: EncryptionInterface): Promise; changeEncryption(encryption: EncryptionInterface): void; delete(): Promise; generate(): void; @@ -24,9 +24,9 @@ interface OTPEntryInterface { } interface EncryptionInterface { - getEncryptedString(data: string): string; - decryptSecretString(entry: string): string | null; - decryptEncSecret(entry: OTPEntryInterface): RawOTPStorage | null; + getEncryptedString(data: string): Promise; + decryptSecretString(entry: string): Promise; + decryptEncSecret(entry: OTPEntryInterface): Promise; getEncryptionStatus(): boolean; updateEncryptionPassword(password: string): void; getEncryptionKeyId(): string; diff --git a/src/models/encryption.ts b/src/models/encryption.ts index ebca10a85..57a8a9a90 100644 --- a/src/models/encryption.ts +++ b/src/models/encryption.ts @@ -1,68 +1,143 @@ import * as CryptoJS from "crypto-js"; +// New ciphertext is authenticated AES-GCM via WebCrypto, tagged with this +// prefix so it is self-describing. Legacy ciphertext is crypto-js AES-CBC +// (OpenSSL "Salted__" framing, base64 starting "U2FsdGVkX1"); it stays readable +// for old storage and backups and upgrades to GCM the next time it is written. +const GCM_PREFIX = "v4:"; + +function bytesToBase64(bytes: Uint8Array): string { + let binary = ""; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +} + +function base64ToBytes(base64: string): Uint8Array { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +async function deriveKey(password: string): Promise { + const raw = await crypto.subtle.digest( + "SHA-256", + new TextEncoder().encode(password) + ); + return crypto.subtle.importKey("raw", raw, "AES-GCM", false, [ + "encrypt", + "decrypt", + ]); +} + +// Prefix-aware decrypt shared by the Encryption class and the backup importer. +// GCM throws on a wrong key / tampered data (auth tag); we surface that as null +// like the legacy path. Returns null on any failure. +export async function decryptString( + data: string, + password: string +): Promise { + if (data.startsWith(GCM_PREFIX)) { + try { + const combined = base64ToBytes(data.slice(GCM_PREFIX.length)); + const iv = combined.slice(0, 12); + const ciphertext = combined.slice(12); + const key = await deriveKey(password); + const plaintext = await crypto.subtle.decrypt( + { name: "AES-GCM", iv }, + key, + ciphertext + ); + return new TextDecoder().decode(plaintext); + } catch (error) { + return null; + } + } + // legacy AES-CBC (crypto-js) + try { + const decrypted = CryptoJS.AES.decrypt(data, password).toString( + CryptoJS.enc.Utf8 + ); + return decrypted || null; + } catch (error) { + return null; + } +} + export class Encryption implements EncryptionInterface { private password: string; private keyId: string; + private keyPromise?: Promise; constructor(hash: string, keyId: string) { this.password = hash; this.keyId = keyId; } - getEncryptedString(data: string): string { + // Derive a 256-bit AES-GCM key from the (high-entropy argon2) saltedHash. + // Cached per instance. + private getKey(): Promise { + if (!this.keyPromise) { + this.keyPromise = deriveKey(this.password); + } + return this.keyPromise; + } + + async getEncryptedString(data: string): Promise { if (!this.password) { return data; - } else { - return CryptoJS.AES.encrypt(data, this.password).toString(); } + const key = await this.getKey(); + const iv = crypto.getRandomValues(new Uint8Array(12)); + const ciphertext = await crypto.subtle.encrypt( + { name: "AES-GCM", iv }, + key, + new TextEncoder().encode(data) + ); + const combined = new Uint8Array(iv.length + ciphertext.byteLength); + combined.set(iv, 0); + combined.set(new Uint8Array(ciphertext), iv.length); + return GCM_PREFIX + bytesToBase64(combined); } - decryptSecretString(secret: string) { - try { - const decryptedSecret = CryptoJS.AES.decrypt( - secret, - this.password - ).toString(CryptoJS.enc.Utf8); - - if (!decryptedSecret) { - return null; - } - - if (decryptedSecret.length < 8) { - return null; - } - - if ( - !/^[a-z2-7]+=*$/i.test(decryptedSecret) && - !/^[0-9a-f]+$/i.test(decryptedSecret) && - !/^blz-/.test(decryptedSecret) && - !/^bliz-/.test(decryptedSecret) && - !/^stm-/.test(decryptedSecret) - ) { - return null; - } - - return decryptedSecret; - } catch (error) { + async decryptSecretString(secret: string): Promise { + const decryptedSecret = await decryptString(secret, this.password); + if (!decryptedSecret) { return null; } - } - decryptEncSecret(entry: OTPEntryInterface) { - try { - if (!entry.encData) { - return null; - } + if (decryptedSecret.length < 8) { + return null; + } - const decryptedData = CryptoJS.AES.decrypt( - entry.encData, - this.password - ).toString(CryptoJS.enc.Utf8); + if ( + !/^[a-z2-7]+=*$/i.test(decryptedSecret) && + !/^[0-9a-f]+$/i.test(decryptedSecret) && + !/^blz-/.test(decryptedSecret) && + !/^bliz-/.test(decryptedSecret) && + !/^stm-/.test(decryptedSecret) + ) { + return null; + } - if (!decryptedData) { - return null; - } + return decryptedSecret; + } + async decryptEncSecret( + entry: OTPEntryInterface + ): Promise { + if (!entry.encData) { + return null; + } + const decryptedData = await decryptString(entry.encData, this.password); + if (!decryptedData) { + return null; + } + try { return JSON.parse(decryptedData); } catch (error) { return null; @@ -75,6 +150,7 @@ export class Encryption implements EncryptionInterface { updateEncryptionPassword(password: string) { this.password = password; + this.keyPromise = undefined; } setEncryptionKeyId(id: string): void { From f5794c2af9eda0000b42a8411691e71c455cc4c4 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:18:32 +0800 Subject: [PATCH 043/112] refactor: await the now-async encryption across read/write paths getEncryptedString / decryptSecretString / decryptEncSecret are async under WebCrypto, so applyEncryption, getOTPStorageFromEntry, getExport, add/update/set/import, backupGetExport and the autofill path all await them (set's forEach became a for-of so the awaits are sequenced). decryptBackupData now decrypts via the prefix-aware decryptString so it imports both new AES-GCM and legacy AES-CBC backups. --- src/background.ts | 3 ++- src/import.ts | 33 ++++++++++++++++++--------------- src/models/otp.ts | 6 +++--- src/models/storage.ts | 29 +++++++++++++++++------------ 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/background.ts b/src/background.ts index 0e69e722e..9beb2a8ce 100644 --- a/src/background.ts +++ b/src/background.ts @@ -532,7 +532,8 @@ chrome.commands.onCommand.addListener(async (command: string) => { if (matchedEntries && matchedEntries.length === 1) { const entry = matchedEntries[0]; const encryption = new Encryption(cachedPassphrase, cachedKeyId); - entry.applyEncryption(encryption); + // applyEncryption is async now; await so entry.code is decrypted + await entry.applyEncryption(encryption); if ( entry.code !== CodeState.Encrypted && diff --git a/src/import.ts b/src/import.ts index e5ab64a59..957c97e6a 100644 --- a/src/import.ts +++ b/src/import.ts @@ -3,11 +3,10 @@ import ImportView from "./components/Import.vue"; import CommonComponents from "./components/common/index"; import { loadI18nMessages } from "./store/i18n"; -import { Encryption } from "./models/encryption"; +import { Encryption, decryptString } from "./models/encryption"; import { EntryStorage } from "./models/storage"; import { getOTPAuthPerLineFromOPTAuthMigration } from "./models/migration"; import { argonHash, argonVerify } from "./models/password"; -import * as CryptoJS from "crypto-js"; async function init() { // i18n @@ -91,15 +90,19 @@ export async function decryptBackupData( continue; } + // decryptString is prefix-aware (new AES-GCM or legacy AES-CBC backups) + const decryptedJson = await decryptString( + unknownStorageItem.data, + decryptKey + ); + if (!decryptedJson) { + // a single corrupt/undecryptable entry must not abort the whole import + continue; + } let decryptedData; try { - decryptedData = JSON.parse( - CryptoJS.AES.decrypt(unknownStorageItem.data, decryptKey).toString( - CryptoJS.enc.Utf8 - ) - ); + decryptedData = JSON.parse(decryptedJson); } catch { - // a single corrupt/undecryptable entry must not abort the whole import continue; } storageItem = { @@ -117,15 +120,15 @@ export async function decryptBackupData( continue; } if (storageItem.encrypted && passphrase) { - try { - storageItem.secret = CryptoJS.AES.decrypt( - storageItem.secret, - passphrase - ).toString(CryptoJS.enc.Utf8); - storageItem.encrypted = false; - } catch (error) { + const decryptedSecret = await decryptString( + storageItem.secret, + passphrase + ); + if (!decryptedSecret) { continue; } + storageItem.secret = decryptedSecret; + storageItem.encrypted = false; } // storageItem.secret may be empty after decrypt with wrong // passphrase diff --git a/src/models/otp.ts b/src/models/otp.ts index adac8127e..c781aa794 100644 --- a/src/models/otp.ts +++ b/src/models/otp.ts @@ -182,14 +182,14 @@ export class OTPEntry implements OTPEntryInterface { return; } - applyEncryption(encryption: EncryptionInterface) { + async applyEncryption(encryption: EncryptionInterface) { if (!encryption || !encryption.getEncryptionStatus()) { return; } if (this.encSecret) { // v2 encryption - this.secret = encryption.decryptSecretString(this.encSecret); + this.secret = await encryption.decryptSecretString(this.encSecret); if (this.secret) { this.encSecret = ""; } @@ -197,7 +197,7 @@ export class OTPEntry implements OTPEntryInterface { } // check if its a rawotpstorage - const decryptedData = encryption.decryptEncSecret(this); + const decryptedData = await encryption.decryptEncSecret(this); if (decryptedData === null) { return; } diff --git a/src/models/storage.ts b/src/models/storage.ts index 3d3afe831..489b729ef 100644 --- a/src/models/storage.ts +++ b/src/models/storage.ts @@ -204,10 +204,10 @@ function isKey(key: unknown): key is Key { } export class EntryStorage { - private static getOTPStorageFromEntry( + private static async getOTPStorageFromEntry( entry: OTPEntry, unencrypted?: boolean - ): OTPStorage { + ): Promise { let secret: string; if (!entry.secret && entry.encData && entry.keyId) { return { @@ -278,7 +278,7 @@ export class EntryStorage { entry.encryption?.getEncryptionStatus() && entry.encryption.getEncryptionKeyId() ) { - const encData = entry.encryption.getEncryptedString( + const encData = await entry.encryption.getEncryptedString( JSON.stringify(storageItem) ); return { @@ -367,7 +367,7 @@ export class EntryStorage { } } - static getExport(data: OTPEntryInterface[], encrypted?: boolean) { + static async getExport(data: OTPEntryInterface[], encrypted?: boolean) { try { const exportData: { [hash: string]: OTPStorage } = {}; for (const entry of data) { @@ -376,7 +376,10 @@ export class EntryStorage { continue; } - exportData[entry.hash] = this.getOTPStorageFromEntry(entry, !encrypted); + exportData[entry.hash] = await this.getOTPStorageFromEntry( + entry, + !encrypted + ); } return exportData; } catch (error) { @@ -436,7 +439,9 @@ export class EntryStorage { if (!encrypted) { // decrypt the data to export if (entry.encrypted) { - const decryptedSecret = encryption.decryptSecretString(entry.secret); + const decryptedSecret = await encryption.decryptSecretString( + entry.secret + ); if (decryptedSecret !== entry.secret && decryptedSecret !== null) { entry.secret = decryptedSecret; entry.encrypted = false; @@ -573,7 +578,7 @@ export class EntryStorage { } const entry = new OTPEntry(entryData, encryption); - _data[entryData.hash] = this.getOTPStorageFromEntry(entry); + _data[entryData.hash] = await this.getOTPStorageFromEntry(entry); } _data = this.ensureUniqueIndex(_data); await BrowserStorage.set(_data); @@ -581,7 +586,7 @@ export class EntryStorage { static async add(entry: OTPEntry) { await BrowserStorage.set({ - [entry.hash]: this.getOTPStorageFromEntry(entry), + [entry.hash]: await this.getOTPStorageFromEntry(entry), }); } @@ -590,7 +595,7 @@ export class EntryStorage { if (!Object.prototype.hasOwnProperty.call(_data, entry.hash)) { throw new Error("Entry to change does not exist."); } - const storageItem = this.getOTPStorageFromEntry(entry); + const storageItem = await this.getOTPStorageFromEntry(entry); _data[entry.hash] = storageItem; _data = this.ensureUniqueIndex(_data); await BrowserStorage.set(_data); @@ -598,10 +603,10 @@ export class EntryStorage { static async set(entries: OTPEntry[]) { let _data = await BrowserStorage.get(); - entries.forEach((entry) => { - const storageItem = this.getOTPStorageFromEntry(entry); + for (const entry of entries) { + const storageItem = await this.getOTPStorageFromEntry(entry); _data[entry.hash] = storageItem; - }); + } _data = this.ensureUniqueIndex(_data); await BrowserStorage.set(_data); } From 6f7a3b6e9eccaa1a5610e2ef91562a966cc702d4 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:31:39 +0800 Subject: [PATCH 044/112] fix(import): detect otpauth text backups instead of JSON-parsing them Importing an otpauth:// (or otpauth-migration://) text backup first ran JSON.parse on it, which threw and logged a confusing "otpauth:// is not valid JSON" SyntaxError before the catch fell back to the otpauth parser. Detect the otpauth prefix up front and parse it directly; keep the JSON path (and its fallback) for object/array backups. --- src/components/Import/FileImport.vue | 37 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/components/Import/FileImport.vue b/src/components/Import/FileImport.vue index 894fc647f..76f7db878 100644 --- a/src/components/Import/FileImport.vue +++ b/src/components/Import/FileImport.vue @@ -59,23 +59,32 @@ export default Vue.extend({ } = {}; let failedCount = 0; let succeededCount = 0; - try { - importData = JSON.parse(reader.result as string); - // andOTP exports a flat JSON array instead of a keyed object (#1304) - if (Array.isArray(importData)) { - importData = getEntryDataFromAndOTP(importData); - } - succeededCount = Object.keys(importData).filter( - (key) => ["key", "enc", "hash"].indexOf(key) === -1 - ).length; - } catch (e) { - console.warn(e); - const result = await getEntryDataFromOTPAuthPerLine( - reader.result as string - ); + const content = (reader.result as string).trim(); + if (content.startsWith("otpauth")) { + // otpauth:// or otpauth-migration:// text backup (not JSON) — parse + // it directly so we don't JSON.parse it and log a confusing + // "otpauth:// is not valid JSON" SyntaxError + const result = await getEntryDataFromOTPAuthPerLine(content); importData = result.exportData; failedCount = result.failedCount; succeededCount = result.succeededCount; + } else { + try { + importData = JSON.parse(content); + // andOTP exports a flat JSON array instead of a keyed object (#1304) + if (Array.isArray(importData)) { + importData = getEntryDataFromAndOTP(importData); + } + succeededCount = Object.keys(importData).filter( + (key) => ["key", "enc", "hash"].indexOf(key) === -1 + ).length; + } catch (e) { + console.warn(e); + const result = await getEntryDataFromOTPAuthPerLine(content); + importData = result.exportData; + failedCount = result.failedCount; + succeededCount = result.succeededCount; + } } let key: { enc: string } | null = null; From b708c6c9b7c6d1d322bafa05bbc9f2bc6b40f722 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:36:37 +0800 Subject: [PATCH 045/112] fix(import): detect otpauth text in the paste-import box too Same fix as FileImport: pasting an otpauth:// URI ran JSON.parse first and logged a confusing "is not valid JSON" SyntaxError before falling back. Detect the otpauth prefix and parse it directly. --- src/components/Import/TextImport.vue | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/components/Import/TextImport.vue b/src/components/Import/TextImport.vue index 47a5ac19c..02f036c64 100644 --- a/src/components/Import/TextImport.vue +++ b/src/components/Import/TextImport.vue @@ -52,15 +52,24 @@ export default Vue.extend({ } = {}; let failedCount = 0; let succeededCount = 0; - try { - exportData = JSON.parse(this.importCode); - } catch (error) { - console.warn(error); - // Maybe one-otpauth-per line text - const result = await getEntryDataFromOTPAuthPerLine(this.importCode); + const content = this.importCode.trim(); + if (content.startsWith("otpauth")) { + // otpauth:// per-line text, not JSON — parse directly so we don't + // JSON.parse it and log a confusing "is not valid JSON" SyntaxError + const result = await getEntryDataFromOTPAuthPerLine(content); exportData = result.exportData; failedCount = result.failedCount; succeededCount = result.succeededCount; + } else { + try { + exportData = JSON.parse(content); + } catch (error) { + console.warn(error); + const result = await getEntryDataFromOTPAuthPerLine(content); + exportData = result.exportData; + failedCount = result.failedCount; + succeededCount = result.succeededCount; + } } let key: { enc: string; hash: string } | null = null; From f4ac338197d93f437aa6bcf9ff7c76e6f521472d Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Mon, 22 Jun 2026 00:06:58 +0800 Subject: [PATCH 046/112] build(vue3): upgrade to Vue 3 / Vuex 4 toolchain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swap vue 2.7→3, vuex 3→4, vue-loader 15→17, @vue/test-utils 1→2; replace vue-template-compiler with @vue/compiler-sfc and vue2-dragula with vuedraggable; move vue-svg-loader to its Vue 3 (0.17 beta) line and chain it through vue-loader. tsconfig vueCompilerOptions target 2→3, *.vue/*.svg shims emit DefineComponent, and the Vue type augmentation moves to @vue/runtime-core's ComponentCustomProperties. fork-ts-checker's vue extension (Vue 2 only) is dropped; .vue type-checking is vue-tsc's job. --- package-lock.json | 2439 ++++++++++++++++++----------- package.json | 14 +- src/definitions/shims-vue.d.ts | 19 +- src/definitions/vue.d.ts | 5 +- src/definitions/vue2-dragula.d.ts | 5 - tsconfig.json | 2 +- webpack.config.js | 12 +- 7 files changed, 1565 insertions(+), 931 deletions(-) delete mode 100644 src/definitions/vue2-dragula.d.ts diff --git a/package-lock.json b/package-lock.json index 6e61729f6..fc0def058 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,9 @@ "node-gost-crypto": "^1.0.2", "qrcode-generator": "^1.4.4", "qrcode-reader": "^1.0.4", - "vue": "^2.7.16", - "vue2-dragula": "^2.5.4", - "vuex": "^3.4.0" + "vue": "^3.4.21", + "vuedraggable": "^4.1.0", + "vuex": "^4.1.0" }, "devDependencies": { "@types/argon2-browser": "^1.18.1", @@ -31,7 +31,8 @@ "@types/sinon-chrome": "^2.2.10", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", - "@vue/test-utils": "^1.1.1", + "@vue/compiler-sfc": "^3.4.21", + "@vue/test-utils": "^2.4.5", "base64-loader": "^1.0.0", "buffer": "^6.0.3", "chai": "^4.2.0", @@ -53,9 +54,8 @@ "typescript": "^5.0.0", "url-loader": "^4.0.0", "util": "^0.12.5", - "vue-loader": "^15.10.1", - "vue-svg-loader": "^0.16.0", - "vue-template-compiler": "^2.7.16", + "vue-loader": "^17.4.2", + "vue-svg-loader": "0.17.0-beta.2", "webpack": "^5.94.0", "webpack-cli": "^5.0.0", "webpack-merge": "^5.0.0" @@ -282,19 +282,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -337,9 +337,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -392,14 +396,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -773,10 +776,10 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -823,6 +826,13 @@ "node": ">= 8" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1062,10 +1072,11 @@ "dev": true }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/sinon": { "version": "17.0.2", @@ -1327,90 +1338,131 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vue/compiler-core": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" + } + }, "node_modules/@vue/compiler-sfc": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", - "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.5", - "postcss": "^8.4.14", - "source-map": "^0.6.1" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" } }, - "node_modules/@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "dev": true, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.38.tgz", + "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==", + "license": "MIT", "dependencies": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" + "@vue/shared": "3.5.38" } }, - "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, + "node_modules/@vue/runtime-core": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.38.tgz", + "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==", + "license": "MIT", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "@vue/reactivity": "3.5.38", + "@vue/shared": "3.5.38" } }, - "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true + "node_modules/@vue/runtime-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz", + "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/runtime-core": "3.5.38", + "@vue/shared": "3.5.38", + "csstype": "^3.2.3" + } }, - "node_modules/@vue/component-compiler-utils/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, + "node_modules/@vue/server-renderer": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.38.tgz", + "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", + "license": "MIT", "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38" }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "peerDependencies": { + "vue": "3.5.38" } }, - "node_modules/@vue/component-compiler-utils/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "node_modules/@vue/shared": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", + "license": "MIT" }, "node_modules/@vue/test-utils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.6.tgz", - "integrity": "sha512-udMmmF1ts3zwxUJEIAj5ziioR900reDrt6C9H3XpWPsLBx2lpHKoA4BTdd9HNIYbkGltWw+JjWJ+5O6QBwiyEw==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.11.tgz", + "integrity": "sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==", "dev": true, + "license": "MIT", "dependencies": { - "dom-event-types": "^1.0.0", - "lodash": "^4.17.15", - "pretty": "^2.0.0" + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" }, "peerDependencies": { - "vue": "2.x", - "vue-template-compiler": "^2.x" + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } } }, "node_modules/@webassemblyjs/ast": { @@ -1616,10 +1668,14 @@ "dev": true }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/acorn": { "version": "8.12.1", @@ -1777,13 +1833,17 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1812,16 +1872,42 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1863,6 +1949,16 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1878,16 +1974,15 @@ "node": ">= 4.0.0" } }, - "node_modules/atoa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", - "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" - }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2006,17 +2101,12 @@ "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -2133,16 +2223,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -2337,6 +2458,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, + "license": "MIT", "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -2406,51 +2528,17 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, - "node_modules/consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "dependencies": { - "bluebird": "^3.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/contra": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", - "integrity": "sha512-N9ArHAqwR/lhPq4OdIAwH4e1btn6EIZMAz4TazjnzCiVECcWUPTma+dRAM38ERImEJBh8NiCCpjoQruSZ+agYg==", - "dependencies": { - "atoa": "1.0.0", - "ticky": "1.0.1" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2480,10 +2568,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2493,51 +2582,17 @@ "node": ">= 8" } }, - "node_modules/crossvent": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz", - "integrity": "sha512-b6gEmNAh3kemyfNJ0LQzA/29A+YeGwevlSkNp2x0TzLOMYc0b85qRAD06OUuLWLQpR7HdJHNZQTlD1cfwoTrzg==", - "dependencies": { - "custom-event": "1.0.0" - } - }, "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "peer": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -2549,13 +2604,15 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -2569,6 +2626,7 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -2576,23 +2634,12 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, + "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -2605,6 +2652,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -2617,17 +2665,14 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/custom-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz", - "integrity": "sha512-6nOXX3UitrmdvSJWoVR2dlzhbX5bEUqmqsMUyx1ypCLZkHHkcuYtdpW3p94RGvcFkTV7DkLo+Ilbwnlwi8L+jw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", @@ -2638,11 +2683,59 @@ "node": ">= 14" } }, - "node_modules/de-indent": { + "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/debug": { "version": "4.3.4", @@ -2730,11 +2823,13 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2817,17 +2912,12 @@ "node": ">=6.0.0" } }, - "node_modules/dom-event-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.1.0.tgz", - "integrity": "sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ==", - "dev": true - }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -2843,31 +2933,50 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, - "node_modules/dragula": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.2.tgz", - "integrity": "sha512-iDPdNTPZY7P/l0CQ800QiX+PNA2XF9iC3ePLWfGxeb/j8iPPedRuQdfSOfZrazgSpmaShYvYQ/jx7keWb4YNzA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", "dependencies": { - "contra": "1.9.4", - "crossvent": "1.5.4" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/eastasianwidth": { @@ -2877,44 +2986,59 @@ "dev": true }, "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", "dev": true, + "license": "MIT", "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" }, "bin": { "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" } }, - "node_modules/editorconfig/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "balanced-match": "^1.0.0" } }, - "node_modules/editorconfig/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">=14" } }, - "node_modules/editorconfig/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/electron-to-chromium": { "version": "1.5.13", @@ -2960,10 +3084,13 @@ } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -2999,45 +3126,85 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -3053,13 +3220,11 @@ "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3079,29 +3244,47 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.1.tgz", + "integrity": "sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-abstract-get": "^1.0.0", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -3462,6 +3645,12 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3480,18 +3669,6 @@ "node": ">=0.8.x" } }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -3675,12 +3852,19 @@ "dev": true }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -3932,15 +4116,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3954,6 +4144,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3986,16 +4177,22 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4013,6 +4210,20 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -4029,13 +4240,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4139,12 +4352,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4174,12 +4389,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4210,10 +4426,14 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4240,10 +4460,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4252,10 +4476,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4264,12 +4489,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4279,10 +4505,11 @@ } }, "node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" }, "node_modules/hasha": { "version": "5.2.2", @@ -4301,10 +4528,11 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4362,19 +4590,6 @@ "node": ">= 14" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "peer": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4483,17 +4698,19 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4544,14 +4761,18 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4563,13 +4784,37 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4588,13 +4833,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4603,12 +4849,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4633,13 +4873,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4648,13 +4908,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { @@ -4666,6 +4933,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -4702,11 +4985,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4724,12 +5021,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4769,14 +5068,30 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4785,12 +5100,16 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4809,12 +5128,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4824,12 +5145,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4839,16 +5163,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -4875,25 +5196,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-windows": { @@ -5113,15 +5459,17 @@ } }, "node_modules/js-beautify": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", - "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", "dev": true, + "license": "MIT", "dependencies": { "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.0.3", - "nopt": "^6.0.0" + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -5129,49 +5477,94 @@ "js-beautify": "js/bin/js-beautify.js" }, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "node_modules/js-beautify/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "dev": true, + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5277,18 +5670,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5480,6 +5861,15 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5504,11 +5894,22 @@ "semver": "bin/semver.js" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/memfs": { "version": "3.4.13", @@ -5522,15 +5923,6 @@ "node": ">= 4.0.0" } }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5618,6 +6010,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5742,6 +6135,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -6014,18 +6408,19 @@ "dev": true }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, + "license": "ISC", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -6347,6 +6742,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } @@ -6553,10 +6949,11 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6574,14 +6971,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -6592,32 +6992,38 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", + "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", "dev": true, + "license": "MIT", "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "array.prototype.reduce": "^1.0.8", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "gopd": "^1.2.0", + "safe-array-concat": "^1.1.3" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6652,6 +7058,24 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6875,9 +7299,10 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -6955,10 +7380,20 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -6973,108 +7408,27 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "peer": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "peer": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "peer": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "peer": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "peer": true - }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.14", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.14.tgz", + "integrity": "sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7095,7 +7449,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "devOptional": true, + "dev": true, "bin": { "prettier": "bin-prettier.js" }, @@ -7103,20 +7457,6 @@ "node": ">=10.13.0" } }, - "node_modules/pretty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", - "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", - "dev": true, - "dependencies": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7151,7 +7491,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/proxy-agent": { "version": "6.4.0", @@ -7187,12 +7528,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -7312,7 +7647,9 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -7416,15 +7753,21 @@ "node": ">= 10.13.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -7433,13 +7776,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" }, "engines": { "node": ">=4" @@ -7556,6 +7920,33 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7576,15 +7967,43 @@ } ] }, - "node_modules/safe-regex-test": { + "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7611,7 +8030,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/schema-utils": { "version": "3.3.0", @@ -7696,6 +8116,37 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -7739,15 +8190,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7756,11 +8209,61 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sigmund": { + "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", - "dev": true + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/signal-exit": { "version": "3.0.7", @@ -7950,18 +8453,26 @@ "node": ">= 14" } }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -8026,7 +8537,22 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/stream-browserify": { "version": "3.0.0", @@ -8091,14 +8617,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8108,28 +8640,37 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8225,24 +8766,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-to-vue": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/svg-to-vue/-/svg-to-vue-0.7.0.tgz", - "integrity": "sha512-Tg2nMmf3BQorYCAjxbtTkYyWPVSeox5AZUFvfy4MoWK/5tuQlnA/h3LAlTjV3sEvOC5FtUNovRSj3p784l4KOA==", - "dev": true, - "dependencies": { - "svgo": "^1.3.2" - }, - "peerDependencies": { - "vue-template-compiler": "^2.0.0" - } - }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -8436,20 +8966,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/ticky": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", - "integrity": "sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8593,15 +9109,79 @@ "node": ">=8" } }, - "node_modules/typed-array-length": { + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8620,7 +9200,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8630,15 +9210,19 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8691,7 +9275,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.1.0", @@ -8795,6 +9380,7 @@ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -8806,180 +9392,169 @@ } }, "node_modules/vue": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", - "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", - "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.38.tgz", + "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", + "license": "MIT", "dependencies": { - "@vue/compiler-sfc": "2.7.16", - "csstype": "^3.1.0" + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-sfc": "3.5.38", + "@vue/runtime-dom": "3.5.38", + "@vue/server-renderer": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true + "node_modules/vue-component-type-helpers": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.5.tgz", + "integrity": "sha512-Fe1jyPJoUGpJOYKOri44jduR7My4yYINOMJISuMAbmrs+L5LbIDUc8NTWZYY3EJLK0yPLuCmcd5zoCsE4k2/KA==", + "dev": true, + "license": "MIT" }, "node_modules/vue-loader": { - "version": "15.11.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", - "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", + "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "watchpack": "^2.4.0" }, "peerDependencies": { - "css-loader": "*", - "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + "webpack": "^4.1.0 || ^5.0.0-0" }, "peerDependenciesMeta": { - "cache-loader": { - "optional": true - }, - "prettier": { + "@vue/compiler-sfc": { "optional": true }, - "vue-template-compiler": { + "vue": { "optional": true } } }, - "node_modules/vue-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/vue-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "color-convert": "^2.0.1" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/vue-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "node_modules/vue-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "node_modules/vue-style-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" + "node": ">=10" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/vue-style-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "node_modules/vue-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4.0.0" + "node": ">=7.0.0" } }, - "node_modules/vue-svg-loader": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/vue-svg-loader/-/vue-svg-loader-0.16.0.tgz", - "integrity": "sha512-2RtFXlTCYWm8YAEO2qAOZ2SuIF2NvLutB5muc3KDYoZq5ZeCHf8ggzSan3ksbbca7CJ/Aw57ZnDF4B7W/AkGtw==", + "node_modules/vue-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "dependencies": { - "loader-utils": "^1.2.3", - "svg-to-vue": "^0.7.0" - }, - "peerDependencies": { - "vue-template-compiler": "^2.0.0" - } + "license": "MIT" }, - "node_modules/vue-svg-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/vue-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/vue-svg-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "node_modules/vue-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "node_modules/vue-svg-loader": { + "version": "0.17.0-beta.2", + "resolved": "https://registry.npmjs.org/vue-svg-loader/-/vue-svg-loader-0.17.0-beta.2.tgz", + "integrity": "sha512-iMUGJTKEcuNAG8VXOchjA8443IqEmEi2Aw6EVIHWma2cC4TUQ7Oet5Yry9IFfqXQXXvyzXz5EyttVvfRGTNH4Q==", "dev": true, + "license": "MIT", "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" + "loader-utils": "^2.0.0", + "semver": "^7.3.2", + "svgo": "^1.3.2" + }, + "peerDependencies": { + "vue": "^2.5.0 || ^3.0.0-0" } }, - "node_modules/vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "node_modules/vue2-dragula": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/vue2-dragula/-/vue2-dragula-2.5.5.tgz", - "integrity": "sha512-y+s2S1s6p11ds5ay6kWgAzxmXa4LwM8HBrQG+q8+rPehrmOlV/kvEyNidEYL+glskofL5vTGhno4xGYfg+wm3Q==", + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "license": "MIT", "dependencies": { - "dragula": "3.7.2" + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" } }, "node_modules/vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", + "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, "peerDependencies": { - "vue": "^2.0.0" + "vue": "^3.2.0" } }, "node_modules/watchpack": { @@ -9133,16 +9708,74 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9155,17 +9788,19 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index 9164e0b31..dffba57c6 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "@types/sinon-chrome": "^2.2.10", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", - "@vue/test-utils": "^1.1.1", + "@vue/compiler-sfc": "^3.4.21", + "@vue/test-utils": "^2.4.5", "base64-loader": "^1.0.0", "buffer": "^6.0.3", "chai": "^4.2.0", @@ -56,9 +57,8 @@ "typescript": "^5.0.0", "url-loader": "^4.0.0", "util": "^0.12.5", - "vue-loader": "^15.10.1", - "vue-svg-loader": "^0.16.0", - "vue-template-compiler": "^2.7.16", + "vue-loader": "^17.4.2", + "vue-svg-loader": "0.17.0-beta.2", "webpack": "^5.94.0", "webpack-cli": "^5.0.0", "webpack-merge": "^5.0.0" @@ -70,8 +70,8 @@ "node-gost-crypto": "^1.0.2", "qrcode-generator": "^1.4.4", "qrcode-reader": "^1.0.4", - "vue": "^2.7.16", - "vue2-dragula": "^2.5.4", - "vuex": "^3.4.0" + "vue": "^3.4.21", + "vuedraggable": "^4.1.0", + "vuex": "^4.1.0" } } diff --git a/src/definitions/shims-vue.d.ts b/src/definitions/shims-vue.d.ts index bac18c752..e4c904ad6 100644 --- a/src/definitions/shims-vue.d.ts +++ b/src/definitions/shims-vue.d.ts @@ -1,11 +1,20 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ declare module "*.vue" { - import Vue from "vue"; - export default Vue; + import { DefineComponent } from "vue"; + const component: DefineComponent< + Record, + Record, + any + >; + export default component; } declare module "*.svg" { - import { ComponentOptions } from "vue"; - const a: ComponentOptions; - export default a; + import { DefineComponent } from "vue"; + const component: DefineComponent< + Record, + Record, + any + >; + export default component; } diff --git a/src/definitions/vue.d.ts b/src/definitions/vue.d.ts index 236017a15..6dfd192b0 100644 --- a/src/definitions/vue.d.ts +++ b/src/definitions/vue.d.ts @@ -1,11 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Store } from "vuex"; -declare module "vue/types/vue" { - interface Vue { +declare module "@vue/runtime-core" { + interface ComponentCustomProperties { // Only in Popup $store: Store; - $dragula: any; // Only in Import $entries: OTPEntryInterface[]; $encryption: EncryptionInterface; diff --git a/src/definitions/vue2-dragula.d.ts b/src/definitions/vue2-dragula.d.ts deleted file mode 100644 index 9d122aa79..000000000 --- a/src/definitions/vue2-dragula.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "vue2-dragula" { - import { PluginFunction, VueConstructor } from "vue"; - - const Vue2Dragula: PluginFunction; -} diff --git a/tsconfig.json b/tsconfig.json index 3adffa296..d6120b32c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,6 +26,6 @@ "node_modules" ], "vueCompilerOptions": { - "target": 2 + "target": 3 } } diff --git a/webpack.config.js b/webpack.config.js index 3eb5c2828..2dcb73915 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -39,7 +39,7 @@ module.exports = { }, { test: /\.svg$/, - loader: 'vue-svg-loader' + use: ['vue-loader', 'vue-svg-loader'] }, { test: /\.(png|jpe?g|gif)$/, @@ -54,13 +54,9 @@ module.exports = { }, plugins: [ new VueLoaderPlugin(), - new ForkTsCheckerWebpackPlugin({ - typescript: { - extensions: { - vue: true - } - } - }) + // .vue type checking is done by vue-tsc (npm run typecheck), not here; + // fork-ts-checker's vue extension needs Vue 2's vue-template-compiler. + new ForkTsCheckerWebpackPlugin() ], resolve: { extensions: [ From c56b4c885122450a0762d150bd05e5b528f8401a Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Mon, 22 Jun 2026 00:06:59 +0800 Subject: [PATCH 047/112] refactor(vue3): convert entry points to createApp / createStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit new Vue(...).$mount → createApp(...).mount across popup/options/permissions/ import; Vue.use(Vuex)/new Vuex.Store → createStore + app.use(store); Vue.use/Vue.component/Vue.prototype.{i18n,$entries,$encryption} → app.use/app.component/app.config.globalProperties. --- src/import.ts | 15 +++++++-------- src/options.ts | 10 ++++------ src/permissions.ts | 31 +++++++++++++------------------ src/popup.ts | 41 ++++++++++++++++++++--------------------- 4 files changed, 44 insertions(+), 53 deletions(-) diff --git a/src/import.ts b/src/import.ts index 957c97e6a..57c404d64 100644 --- a/src/import.ts +++ b/src/import.ts @@ -1,4 +1,4 @@ -import Vue from "vue"; +import { createApp } from "vue"; import ImportView from "./components/Import.vue"; import CommonComponents from "./components/common/index"; import { loadI18nMessages } from "./store/i18n"; @@ -9,12 +9,13 @@ import { getOTPAuthPerLineFromOPTAuthMigration } from "./models/migration"; import { argonHash, argonVerify } from "./models/password"; async function init() { + const app = createApp(ImportView); // i18n - Vue.prototype.i18n = await loadI18nMessages(); + app.config.globalProperties.i18n = await loadI18nMessages(); // Load common components globally for (const component of CommonComponents) { - Vue.component(component.name, component.component); + app.component(component.name, component.component); } // Load entries to global @@ -31,12 +32,10 @@ async function init() { } } - Vue.prototype.$entries = entries; - Vue.prototype.$encryption = encryption; + app.config.globalProperties.$entries = entries; + app.config.globalProperties.$encryption = encryption; - const instance = new Vue({ - render: (h) => h(ImportView), - }).$mount("#import"); + const instance = app.mount("#import"); // Set title try { diff --git a/src/options.ts b/src/options.ts index f9cc047e7..b7fd31701 100644 --- a/src/options.ts +++ b/src/options.ts @@ -1,14 +1,12 @@ -import Vue from "vue"; +import { createApp } from "vue"; import OptionsView from "./components/Options.vue"; import { loadI18nMessages } from "./store/i18n"; async function init() { + const app = createApp(OptionsView); // i18n - Vue.prototype.i18n = await loadI18nMessages(); - - new Vue({ - render: (h) => h(OptionsView), - }).$mount("#options"); + app.config.globalProperties.i18n = await loadI18nMessages(); + app.mount("#options"); } init(); diff --git a/src/permissions.ts b/src/permissions.ts index 1a0a0222d..373bd2451 100644 --- a/src/permissions.ts +++ b/src/permissions.ts @@ -1,6 +1,6 @@ // Vue -import Vue from "vue"; -import Vuex from "vuex"; +import { createApp } from "vue"; +import { createStore } from "vuex"; // Components import PermissionsView from "./components/Permissions.vue"; @@ -11,29 +11,24 @@ import { loadI18nMessages } from "./store/i18n"; import { Permissions } from "./store/Permissions"; async function init() { - // i18n - Vue.prototype.i18n = await loadI18nMessages(); - - // Load modules - Vue.use(Vuex); - - // Load common components globally - for (const component of CommonComponents) { - Vue.component(component.name, component.component); - } - // State - const store = new Vuex.Store({ + const store = createStore({ strict: process.env.NODE_ENV !== "production", modules: { permissions: await new Permissions().getModule(), }, }); - const instance = new Vue({ - render: (h) => h(PermissionsView), - store, - }).$mount("#permissions"); + const app = createApp(PermissionsView); + app.use(store); + // i18n + app.config.globalProperties.i18n = await loadI18nMessages(); + // Load common components globally + for (const component of CommonComponents) { + app.component(component.name, component.component); + } + + const instance = app.mount("#permissions"); // Set title try { diff --git a/src/popup.ts b/src/popup.ts index 82595acd2..65cee399c 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -1,7 +1,6 @@ // Vue -import Vue from "vue"; -import Vuex from "vuex"; -import { Vue2Dragula } from "vue2-dragula"; +import { createApp, h, ComponentPublicInstance } from "vue"; +import { createStore } from "vuex"; // Components import Popup from "./components/Popup.vue"; @@ -34,20 +33,8 @@ async function init() { await migrateLocalStorageToBrowserStorage(); await UserSettings.updateItems(); - // Add globals - Vue.prototype.i18n = await loadI18nMessages(); - - // Load modules - Vue.use(Vuex); - Vue.use(Vue2Dragula); - - // Load common components globally - for (const component of CommonComponents) { - Vue.component(component.name, component.component); - } - // State - const store = new Vuex.Store({ + const store = createStore({ // catch out-of-mutation state changes during development (no prod cost) strict: process.env.NODE_ENV !== "production", modules: { @@ -63,9 +50,8 @@ async function init() { }); // Render - const instance = new Vue({ - render: (h) => h(Popup), - store, + const app = createApp({ + render: () => h(Popup), mounted() { // Update time based entries' codes this.$store.commit("accounts/updateCodes"); @@ -73,7 +59,17 @@ async function init() { this.$store.commit("accounts/updateCodes"); }, 1000); }, - }).$mount("#authenticator"); + }); + + app.use(store); + // Add globals + app.config.globalProperties.i18n = await loadI18nMessages(); + // Load common components globally + for (const component of CommonComponents) { + app.component(component.name, component.component); + } + + const instance = app.mount("#authenticator"); // Prompt for password if needed if (instance.$store.state.accounts.shouldShowPassphrase) { @@ -202,7 +198,10 @@ async function init() { init(); -async function runScheduledBackup(clientTime: number, instance: Vue) { +async function runScheduledBackup( + clientTime: number, + instance: ComponentPublicInstance +) { if (instance.$store.state.backup.dropboxToken) { chrome.permissions.contains( { origins: ["https://*.dropboxapi.com/*"] }, From 3720ee41a0e5b164e291a3c93eaf5275b8cd6589 Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Mon, 22 Jun 2026 00:06:59 +0800 Subject: [PATCH 048/112] test(vue3): migrate unit tests to @vue/test-utils v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit createLocalVue + mount({store, localVue}) → mount({ global: { plugins: [store], mocks: { i18n }, components } }); new Vuex.Store → createStore; Wrapper → VueWrapper; attachToDocument → attachTo. --- .../Popup/EnterPasswordPage.test.ts | 38 +++++++++-------- src/test/components/Popup/MenuPage.test.ts | 42 +++++++++---------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/test/components/Popup/EnterPasswordPage.test.ts b/src/test/components/Popup/EnterPasswordPage.test.ts index ab1c16489..f130e286d 100644 --- a/src/test/components/Popup/EnterPasswordPage.test.ts +++ b/src/test/components/Popup/EnterPasswordPage.test.ts @@ -3,8 +3,8 @@ import * as chai from "chai"; import * as sinon from "sinon"; import * as sinonChai from "sinon-chai"; -import { mount, createLocalVue } from "@vue/test-utils"; -import Vuex, { Store } from "vuex"; +import { mount } from "@vue/test-utils"; +import { createStore, Store } from "vuex"; import CommonComponents from "../../../components/common/index"; import EnterPasswordPage from "../../../components/Popup/EnterPasswordPage.vue"; @@ -13,18 +13,20 @@ import { loadI18nMessages } from "../../../store/i18n"; const should = chai.should(); chai.use(sinonChai); mocha.setup("bdd"); -const localVue = createLocalVue(); describe("EnterPasswordPage", () => { + let i18n: { [key: string]: string }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const components: { [name: string]: any } = {}; + before(async () => { - localVue.prototype.i18n = await loadI18nMessages(); - localVue.use(Vuex); + i18n = await loadI18nMessages(); for (const component of CommonComponents) { - localVue.component(component.name, component.component); + components[component.name] = component.component; } }); - let storeOpts = { + const storeOpts = { modules: { accounts: { actions: { @@ -39,14 +41,20 @@ describe("EnterPasswordPage", () => { }; let store: Store; + const mountPage = (attach = false) => + mount(EnterPasswordPage, { + global: { plugins: [store], mocks: { i18n }, components }, + ...(attach ? { attachTo: document.body } : {}), + }); + beforeEach(() => { // TODO: find a nicer var storeOpts.modules.accounts.actions.applyPassphrase.resetHistory(); - store = new Vuex.Store(storeOpts); + store = createStore(storeOpts); }); it("should apply password when button is clicked", async () => { - const wrapper = mount(EnterPasswordPage, { store, localVue }); + const wrapper = mountPage(); const passwordInput = wrapper.find("input"); const passwordButton = wrapper.find("button"); @@ -60,7 +68,7 @@ describe("EnterPasswordPage", () => { }); it("should apply password when enter is pressed", async () => { - const wrapper = mount(EnterPasswordPage, { store, localVue }); + const wrapper = mountPage(); const passwordInput = wrapper.find("input"); @@ -73,11 +81,7 @@ describe("EnterPasswordPage", () => { }); it("should autofocus password input", () => { - const wrapper = mount(EnterPasswordPage, { - store, - localVue, - attachToDocument: true, - }); + const wrapper = mountPage(true); const passwordInput = wrapper.find("input"); @@ -85,7 +89,7 @@ describe("EnterPasswordPage", () => { }); it("should not show incorrect password message", () => { - const wrapper = mount(EnterPasswordPage, { store, localVue }); + const wrapper = mountPage(); const errorText = wrapper.find("label.warning"); @@ -98,7 +102,7 @@ describe("EnterPasswordPage", () => { }); it("should show incorrect password message", () => { - const wrapper = mount(EnterPasswordPage, { store, localVue }); + const wrapper = mountPage(); const errorText = wrapper.find("label.warning"); diff --git a/src/test/components/Popup/MenuPage.test.ts b/src/test/components/Popup/MenuPage.test.ts index f8c169b1c..26137d90f 100644 --- a/src/test/components/Popup/MenuPage.test.ts +++ b/src/test/components/Popup/MenuPage.test.ts @@ -2,8 +2,8 @@ import "mocha"; import * as chai from "chai"; import { assert } from "chai"; import * as sinonChai from "sinon-chai"; -import { createLocalVue, mount, Wrapper } from "@vue/test-utils"; -import Vuex, { Store } from "vuex"; +import { mount, VueWrapper } from "@vue/test-utils"; +import { createStore, Store } from "vuex"; import { loadI18nMessages } from "../../../store/i18n"; import MenuPage from "../../../components/Popup/MenuPage.vue"; @@ -21,15 +21,15 @@ import chrome from "sinon-chrome"; chai.should(); chai.use(sinonChai); mocha.setup("bdd"); -const localVue = createLocalVue(); describe("MenuPage", () => { + let i18n: { [key: string]: string }; + before(async () => { - localVue.prototype.i18n = await loadI18nMessages(); - localVue.use(Vuex); + i18n = await loadI18nMessages(); }); - let storeOpts = { + const storeOpts = { menu: { state: { version: "1.2.3", @@ -40,7 +40,13 @@ describe("MenuPage", () => { let store: Store<{}>; - let wrapper: Wrapper; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let wrapper: VueWrapper; + + const mountMenu = () => + mount(MenuPage, { + global: { plugins: [store], mocks: { i18n } }, + }); before(() => { // mock the chrome global object @@ -49,17 +55,15 @@ describe("MenuPage", () => { }); beforeEach(async () => { - store = new Vuex.Store({ + store = createStore({ modules: storeOpts, }); - wrapper = mount(MenuPage, { - store, - localVue, - }); + wrapper = mountMenu(); }); const clickMenuPageButtonByTitle = async ( - wrapper: Wrapper, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + wrapper: VueWrapper, title: string ) => wrapper.find(`*[title='${title}']`).trigger("click"); @@ -77,10 +81,7 @@ describe("MenuPage", () => { }; beforeEach(() => { - wrapper = mount(MenuPage, { - store, - localVue, - }); + wrapper = mountMenu(); }); it("should open a new tab to the Chrome help page when the feedback button is clicked and the user agent is Chrome", async () => { @@ -136,7 +137,7 @@ describe("MenuPage", () => { feedbackURL: "https://authenticator.cc", }); - store = new Vuex.Store({ + store = createStore({ modules: { backup: await new Backup().getModule(), currentView: new CurrentView().getModule(), @@ -148,10 +149,7 @@ describe("MenuPage", () => { }, }); - wrapper = mount(MenuPage, { - store, - localVue, - }); + wrapper = mountMenu(); } catch (e) { console.error(e); // Doesn't show up in mocha? From d20d59ac71dcf1b23c9bb123eb219c0f0e6ee73c Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Mon, 22 Jun 2026 00:07:20 +0800 Subject: [PATCH 049/112] refactor(vue3): migrate components and swap dragula for vuedraggable All 31 SFCs move from Vue.extend to defineComponent. The common inputs adopt the Vue 3 v-model contract (value/input -> modelValue/update:modelValue; ToggleInput drops the removed `model` option; SelectInput honours the .number modifier via modelModifiers). $listeners -> $attrs (with inheritAttrs:false where the listeners target a nested element). MainBody replaces vue2-dragula's v-dragula directive with + handle/disabled; the dropModel handler becomes the draggableEntries setter committing the new reorderEntries mutation (replacing moveCode). --- src/components/Import.vue | 4 +- src/components/Import/FileImport.vue | 4 +- src/components/Import/QrImport.vue | 4 +- src/components/Import/TextImport.vue | 4 +- src/components/Options.vue | 4 +- src/components/Permissions.vue | 4 +- src/components/Popup.vue | 4 +- src/components/Popup/AddAccountPage.vue | 4 +- src/components/Popup/AddMethodPage.vue | 4 +- src/components/Popup/AdvisorInsight.vue | 4 +- src/components/Popup/AdvisorPage.vue | 4 +- src/components/Popup/BackupPage.vue | 4 +- src/components/Popup/DrivePage.vue | 4 +- src/components/Popup/DropboxPage.vue | 4 +- src/components/Popup/EnterPasswordPage.vue | 4 +- src/components/Popup/EntryComponent.vue | 8 +- src/components/Popup/LoadingPage.vue | 4 +- src/components/Popup/MainBody.vue | 117 ++++++++----------- src/components/Popup/MainHeader.vue | 4 +- src/components/Popup/MenuPage.vue | 4 +- src/components/Popup/NotificationHandler.vue | 4 +- src/components/Popup/OneDrivePage.vue | 4 +- src/components/Popup/PageHandler.vue | 4 +- src/components/Popup/PreferencesPage.vue | 4 +- src/components/Popup/SetPasswordPage.vue | 4 +- src/components/common/ButtonInput.vue | 9 +- src/components/common/ButtonLink.vue | 4 +- src/components/common/FileInput.vue | 7 +- src/components/common/SelectInput.vue | 29 ++++- src/components/common/TextInput.vue | 11 +- src/components/common/ToggleInput.vue | 21 ++-- src/store/Accounts.ts | 21 +--- 32 files changed, 158 insertions(+), 161 deletions(-) diff --git a/src/components/Import.vue b/src/components/Import.vue index d6d8c8e83..dfb7054cc 100644 --- a/src/components/Import.vue +++ b/src/components/Import.vue @@ -40,12 +40,12 @@
diff --git a/src/components/Popup/MainBody.vue b/src/components/Popup/MainBody.vue index 8eaaa0fc3..1f6919b63 100644 --- a/src/components/Popup/MainBody.vue +++ b/src/components/Popup/MainBody.vue @@ -23,37 +23,40 @@ -
- -
- -

- {{ i18n.no_entires }} - {{ - i18n.learn_more - }} -

-
+ + +
+ +

+ {{ i18n.no_entires }} + {{ + i18n.learn_more + }} +

diff --git a/src/components/Popup/MainHeader.vue b/src/components/Popup/MainHeader.vue index f97d77817..11bb8043d 100644 --- a/src/components/Popup/MainHeader.vue +++ b/src/components/Popup/MainHeader.vue @@ -72,7 +72,7 @@ diff --git a/src/components/common/ButtonLink.vue b/src/components/common/ButtonLink.vue index 6a8753caf..98de8940c 100644 --- a/src/components/common/ButtonLink.vue +++ b/src/components/common/ButtonLink.vue @@ -9,9 +9,9 @@ diff --git a/src/components/common/FileInput.vue b/src/components/common/FileInput.vue index 9103990f0..25d31b1ff 100644 --- a/src/components/common/FileInput.vue +++ b/src/components/common/FileInput.vue @@ -4,16 +4,17 @@ diff --git a/src/components/common/SelectInput.vue b/src/components/common/SelectInput.vue index b249ddf9e..9e9ab20c6 100644 --- a/src/components/common/SelectInput.vue +++ b/src/components/common/SelectInput.vue @@ -3,9 +3,9 @@ diff --git a/src/store/Accounts.ts b/src/store/Accounts.ts index 3a9bb6d58..00d30cf0f 100644 --- a/src/store/Accounts.ts +++ b/src/store/Accounts.ts @@ -138,23 +138,14 @@ export class Accounts implements Module { loadCodes(state: AccountsState, newCodes: OTPEntryInterface[]) { state.entries = newCodes; }, - moveCode(state: AccountsState, opts: { from: number; to: number }) { - // from/to are positions in the displayed (pinned-first) order that - // the getter renders and dragula reports. Reorder that view before - // re-indexing, otherwise the indices were applied to the raw array - // and dragging got scrambled whenever an entry was pinned (#1312). - const displayed = [ - ...state.entries.filter((entry) => entry.pinned), - ...state.entries.filter((entry) => !entry.pinned), - ]; - - displayed.splice(opts.to, 0, displayed.splice(opts.from, 1)[0]); - - displayed.forEach((entry, i) => { + // vuedraggable hands back the reordered (pinned-first) displayed array; + // re-index by position and store it. The `entries` getter re-derives + // the pinned-first view from this, so drags within a group stick. + reorderEntries(state: AccountsState, reordered: OTPEntryInterface[]) { + reordered.forEach((entry, i) => { entry.index = i; }); - - state.entries = displayed; + state.entries = reordered; }, pinEntry(state: AccountsState, entry: OTPEntryInterface) { state.entries[entry.index].pinned = !entry.pinned; From 3078ae8d2006560f22678e02644b96608ac2662f Mon Sep 17 00:00:00 2001 From: Hank <3490170+Hank076@users.noreply.github.com> Date: Mon, 22 Jun 2026 07:49:39 +0800 Subject: [PATCH 050/112] fix(vue3): guard empty dynamic component and define Vue feature flags PageHandler's rendered with an empty `info` on open, which Vue 3 (unlike Vue 2) reports as "Invalid vnode type"; only render it when info is set. Also inject __VUE_OPTIONS_API__ / __VUE_PROD_DEVTOOLS__ / __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ via DefinePlugin to silence the esm-bundler feature-flag warning. --- src/components/Popup/PageHandler.vue | 6 +++++- webpack.config.js | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/Popup/PageHandler.vue b/src/components/Popup/PageHandler.vue index 52598501d..9356aca45 100644 --- a/src/components/Popup/PageHandler.vue +++ b/src/components/Popup/PageHandler.vue @@ -7,7 +7,11 @@ > - + diff --git a/src/components/Popup/AddAccountPage.vue b/src/components/Popup/AddAccountPage.vue index 26940bd17..01968a518 100644 --- a/src/components/Popup/AddAccountPage.vue +++ b/src/components/Popup/AddAccountPage.vue @@ -1,49 +1,69 @@ diff --git a/src/components/Popup/PreferencesPage.vue b/src/components/Popup/PreferencesPage.vue index 65167253a..fda43220d 100644 --- a/src/components/Popup/PreferencesPage.vue +++ b/src/components/Popup/PreferencesPage.vue @@ -1,63 +1,97 @@ diff --git a/src/components/Popup/OneDrivePage.vue b/src/components/Popup/OneDrivePage.vue index 194110ebb..9fcc175cd 100644 --- a/src/components/Popup/OneDrivePage.vue +++ b/src/components/Popup/OneDrivePage.vue @@ -1,7 +1,10 @@