@delta-comic/plugin 3.0.0-next.4 → 3.0.0-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{global-B4SQiBzS.mjs → global-3ZqxvD1L.mjs} +18 -18
- package/dist/global-3ZqxvD1L.mjs.map +1 -0
- package/dist/lib/index.d.mts +27 -27
- package/dist/lib/index.mjs +1 -1
- package/dist/{runtime-DQbAfFDr.mjs → runtime-C6MmbYYH.mjs} +16 -16
- package/dist/runtime-C6MmbYYH.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/global-B4SQiBzS.mjs.map +0 -1
- package/dist/runtime-DQbAfFDr.mjs.map +0 -1
|
@@ -3,7 +3,7 @@ import { l as releasePluginObjectUrls, o as isTauriRuntime, u as removePluginFil
|
|
|
3
3
|
import { isFunction } from "es-toolkit/compat";
|
|
4
4
|
import { db, useConfig } from "@delta-comic/db";
|
|
5
5
|
import { computed, h, markRaw, ref, shallowReactive, shallowRef } from "vue";
|
|
6
|
-
import { SourcedKeyMap,
|
|
6
|
+
import { SourcedKeyMap, UniComment, UniContentPage, UniItem, UniResource, UniUser } from "@delta-comic/model";
|
|
7
7
|
import { createDownloadMessage, environmentRegistry } from "@delta-comic/ui";
|
|
8
8
|
import { SharedFunction } from "@delta-comic/utils";
|
|
9
9
|
import { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from "lz-string";
|
|
@@ -535,21 +535,21 @@ const cleanupPlugin = (config) => {
|
|
|
535
535
|
attempt(() => removeSourcedEntries(Global.userActions, plugin));
|
|
536
536
|
attempt(() => removeSourcedEntries(Global.subscribes, plugin));
|
|
537
537
|
for (const [contentType, value] of Object.entries(config.content ?? {})) {
|
|
538
|
-
if (value.layout) attempt(() =>
|
|
539
|
-
if (value.itemCard) attempt(() =>
|
|
540
|
-
if (value.contentPage) attempt(() =>
|
|
541
|
-
if (value.downloadProvider) attempt(() =>
|
|
542
|
-
if (value.commentRow) attempt(() =>
|
|
543
|
-
if (value.itemTranslator) attempt(() =>
|
|
538
|
+
if (value.layout) attempt(() => UniContentPage.layouts.delete(contentType));
|
|
539
|
+
if (value.itemCard) attempt(() => UniItem.itemCards.delete(contentType));
|
|
540
|
+
if (value.contentPage) attempt(() => UniContentPage.contentPages.delete(contentType));
|
|
541
|
+
if (value.downloadProvider) attempt(() => UniContentPage.downloadProviders.delete(contentType));
|
|
542
|
+
if (value.commentRow) attempt(() => UniComment.commentRow.delete(contentType));
|
|
543
|
+
if (value.itemTranslator) attempt(() => UniItem.itemTranslator.delete(contentType));
|
|
544
544
|
}
|
|
545
545
|
for (const type of config.resource?.types ?? []) {
|
|
546
|
-
attempt(() =>
|
|
547
|
-
attempt(() =>
|
|
546
|
+
attempt(() => UniResource.fork.delete([plugin, type.type]));
|
|
547
|
+
attempt(() => UniResource.precedenceFork.delete([plugin, type.type]));
|
|
548
548
|
}
|
|
549
|
-
for (const name of Object.keys(config.resource?.process ?? {})) attempt(() =>
|
|
550
|
-
if (config.user?.card) attempt(() =>
|
|
551
|
-
if (config.user?.edit) attempt(() =>
|
|
552
|
-
for (const key of Object.keys(config.user?.authorIcon ?? {})) attempt(() =>
|
|
549
|
+
for (const name of Object.keys(config.resource?.process ?? {})) attempt(() => UniResource.processInstances.delete([plugin, name]));
|
|
550
|
+
if (config.user?.card) attempt(() => UniUser.userCards.delete(plugin));
|
|
551
|
+
if (config.user?.edit) attempt(() => UniUser.userEditorBase.delete(plugin));
|
|
552
|
+
for (const key of Object.keys(config.user?.authorIcon ?? {})) attempt(() => UniItem.authorIcon.delete([plugin, key]));
|
|
553
553
|
for (const pointer of config.config ?? []) attempt(() => useConfig$1().$unregisterConfig(pointer));
|
|
554
554
|
attempt(() => defaultDependencyRegistry.delete(declareDepType(plugin)));
|
|
555
555
|
attempt(() => pluginStore.plugins.delete(plugin));
|
|
@@ -988,7 +988,7 @@ var PluginRuntime = class {
|
|
|
988
988
|
});
|
|
989
989
|
}
|
|
990
990
|
ensureBuiltInPlugins() {
|
|
991
|
-
return this.builtInSynchronization ??= import("./runtime-
|
|
991
|
+
return this.builtInSynchronization ??= import("./runtime-C6MmbYYH.mjs").then(async ({ registerCoreRuntimeExtensions }) => {
|
|
992
992
|
registerCoreRuntimeExtensions();
|
|
993
993
|
await synchronizeBuiltInPlugins();
|
|
994
994
|
});
|
|
@@ -1383,7 +1383,7 @@ Global.share.set(["core", "token"], {
|
|
|
1383
1383
|
if (!item) throw new Error("Not found preload in content. Maybe not fetch detail?");
|
|
1384
1384
|
const compressed = compressToEncodedURIComponent(JSON.stringify({
|
|
1385
1385
|
item: {
|
|
1386
|
-
contentType:
|
|
1386
|
+
contentType: UniContentPage.contentPages.key.toString(item.contentType),
|
|
1387
1387
|
ep: item.thisEp.id,
|
|
1388
1388
|
name: item.title
|
|
1389
1389
|
},
|
|
@@ -1403,7 +1403,7 @@ Global.share.set(["core", "native"], {
|
|
|
1403
1403
|
if (!item) throw new Error("Not found preload in content. Maybe not fetch detail?");
|
|
1404
1404
|
const compressed = compressToEncodedURIComponent(JSON.stringify({
|
|
1405
1405
|
item: {
|
|
1406
|
-
contentType:
|
|
1406
|
+
contentType: UniContentPage.contentPages.key.toString(item.contentType),
|
|
1407
1407
|
ep: item.thisEp.id,
|
|
1408
1408
|
name: item.title
|
|
1409
1409
|
},
|
|
@@ -1435,7 +1435,7 @@ Global.shareToken.set(["core", "token"], {
|
|
|
1435
1435
|
}),
|
|
1436
1436
|
onNegative() {},
|
|
1437
1437
|
onPositive() {
|
|
1438
|
-
return SharedFunction.call("routeToContent",
|
|
1438
|
+
return SharedFunction.call("routeToContent", UniContentPage.contentPages.key.toJSON(meta.item.contentType), meta.id, meta.item.ep);
|
|
1439
1439
|
}
|
|
1440
1440
|
};
|
|
1441
1441
|
}
|
|
@@ -1443,4 +1443,4 @@ Global.shareToken.set(["core", "token"], {
|
|
|
1443
1443
|
//#endregion
|
|
1444
1444
|
export { pluginI18n as A, require as B, findCyclePaths as C, pluginStore as D, PluginStore as E, declareDepType as F, definePlugin as G, useConfig$1 as H, defaultDependencyRegistry as I, exposeSymbol as L, translatePluginText as M, DependencyRegistry as N, usePluginStore as O, createDependencyRegistry as P, pluginExposes as R, synchronizeBuiltInPlugins as S, planPluginLoadOrder as T, ConfigPointer as U, ConfigStore as V, defineInnerPlugin as W, runtimeExtensions as _, PluginLoader as a, isBuiltInPlugin as b, filterPluginsBySelection as c, loader_exports as d, booter_exports as f, registerLoader as g, registerInstaller as h, PluginInstaller as i, pluginMessageKey as j, PluginI18nRegistry as k, pluginKind as l, registerBooter as m, install_exports as n, pluginRuntime as o, PluginRuntimeExtensions as p, PluginBooter as r, failedDependencies as s, Global as t, selectPluginsForPhase as u, BUILT_IN_PLUGIN_LOADER as v, formatPluginLoadPlanError as w, isBuiltInPluginName as x, builtInDefinitionToArchive as y, provide as z };
|
|
1445
1445
|
|
|
1446
|
-
//# sourceMappingURL=global-
|
|
1446
|
+
//# sourceMappingURL=global-3ZqxvD1L.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-3ZqxvD1L.mjs","names":["useDbConfig","useConfig","__import_glob__0_0_","useConfig","useConfig","useConfig"],"sources":["../lib/plugin/index.ts","../lib/configPointer.ts","../lib/features/core/config.ts","../lib/config.ts","../lib/depends.ts","../lib/i18n.ts","../lib/driver/store.ts","../lib/driver/loadPlan.ts","../lib/features/core/feature.ts","../lib/features/registry.ts","../lib/driver/builtIn.ts","../lib/driver/cleanup.ts","../lib/driver/extensions.ts","../lib/driver/booter.ts","../lib/driver/loader.ts","../lib/driver/runtimePlan.ts","../lib/driver/runtime.ts","../lib/driver/extensionTypes.ts","../lib/driver/install.ts","../lib/driver/icon.ts","../lib/global.ts"],"sourcesContent":["import { isFunction } from 'es-toolkit/compat'\nimport type { App } from 'vue'\n\nimport type { ConfigPointer } from '@/configPointer'\nimport type { PluginLocaleMessages } from '@/i18n'\n\nimport type * as Share from './share'\nexport type * as Share from './share'\n\nimport type * as Content from './content'\nexport type * as Content from './content'\n\nimport type * as Subscribe from './subscribe'\nexport type * as Subscribe from './subscribe'\n\nimport type * as User from './user'\nexport type * as User from './user'\n\nimport type * as Api from './api'\nexport type * as Api from './api'\n\nimport type * as OtherProgress from './otherProgress'\nexport type * as OtherProgress from './otherProgress'\n\nimport type * as Search from './search'\nexport type * as Search from './search'\n\nimport type * as Auth from './auth'\nexport type * as Auth from './auth'\n\nimport type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type * as Resource from './resource'\nexport type * as Resource from './resource'\n\nexport interface PluginConfigValues {\n name: string\n content?: Content.Config\n resource?: Resource.Content\n api?: Record<string, Api.Config>\n user?: User.Config\n auth?: Auth.Config\n /** Locale messages are merged in plugin load order; later plugins may override existing keys. */\n i18n?: PluginLocaleMessages\n otherProgress?: OtherProgress.Config[]\n search?: Search.Config\n /**\n * 插件的配置项需在此处注册\n * 传入`Store.ConfigPointer`\n */\n config?: ConfigPointer[]\n subscribe?: Record<string, Subscribe.Config>\n share?: Share.Config\n}\n\nexport type DefineResult = { api?: Record<string, string | undefined | false> }\nexport type Platform = 'tauri' | 'web'\nexport interface PluginConfigHooks {\n /** Runs after app.use() registration and before app.mount() for preboot plugins. */\n onPreboot?(context: {\n app: App\n platform: Platform\n safe: boolean\n }): (() => Promise<void> | void) | Promise<(() => Promise<void> | void) | void> | void\n /**\n * 返回值如果不为空,则会await后作为expose暴露\n */\n onBooted?(ins: DefineResult): (PromiseLike<object> | object) | void\n /** Runs before a normal plugin is reloaded or the runtime is disposed. */\n onUnload?(): Promise<void> | void\n /** Runs once before an installed plugin and its persisted files are removed. */\n onUninstall?(): Promise<void> | void\n}\n\nexport type PluginConfig = PluginConfigValues & PluginConfigHooks\n\nexport interface ConfigEnv {\n safe: boolean\n platform: Platform\n}\n/**\n * 这仅是个辅助定义的函数,没有副作用\n */\nexport const definePlugin = <T extends PluginConfig>(\n config: T | PluginConfigFactory<T>,\n): PluginConfigFactory<T> => {\n if (isFunction(config)) return config\n return () => config\n}\n\nexport type PluginExpose<T extends PluginConfig> = ReturnType<\n T['onBooted'] extends () => object ? T['onBooted'] : () => void\n>\n\nexport type PluginConfigFactory<T extends PluginConfig = PluginConfig> = (env: ConfigEnv) => T\n\nexport interface BuiltInPluginDefinition<T extends PluginConfig = PluginConfig> {\n meta: PluginArchiveDB.Meta\n config: PluginConfigFactory<T>\n enabledByDefault?: boolean\n}\n\n/** Defines a trusted plugin that is bundled with the application. */\nexport const defineInnerPlugin = <T extends PluginConfig>(definition: BuiltInPluginDefinition<T>) =>\n definition","import type { FormSingleConfigure } from '@delta-comic/model'\n\nexport type ConfigDescription = Record<\n string,\n Required<Pick<FormSingleConfigure, 'defaultValue'>> & FormSingleConfigure\n>\n\nexport class ConfigPointer<T extends ConfigDescription = ConfigDescription> {\n public readonly key: symbol\n\n constructor(\n public pluginName: string,\n public config: T,\n public configName: string,\n ) {\n this.key = Symbol.for(`config:${pluginName}`)\n }\n}","import { ConfigPointer } from '../../configPointer'\n\nexport const coreConfig = new ConfigPointer(\n 'core',\n {\n recordHistory: { type: 'switch', defaultValue: true, info: 'settings.core.recordHistory' },\n showAIProject: { type: 'switch', defaultValue: true, info: 'settings.core.showAiWorks' },\n darkMode: {\n type: 'radio',\n defaultValue: 'system',\n info: 'settings.core.theme.title',\n comp: 'select',\n selects: [\n { label: 'settings.core.theme.light', value: 'light' },\n { label: 'settings.core.theme.dark', value: 'dark' },\n { label: 'settings.core.systemDefault', value: 'system' },\n ],\n },\n language: {\n type: 'radio',\n defaultValue: 'system',\n info: 'settings.core.language.title',\n comp: 'select',\n selects: [\n { label: 'settings.core.language.zhCN', value: 'zh-CN' },\n { label: 'settings.core.language.zhTW', value: 'zh-TW' },\n { label: 'settings.core.language.enUS', value: 'en-US' },\n { label: 'settings.core.systemDefault', value: 'system' },\n ],\n },\n easilyTitle: { type: 'switch', defaultValue: false, info: 'settings.core.simplifiedTitle' },\n githubToken: {\n type: 'string',\n defaultValue: '',\n info: 'settings.core.githubToken.title',\n placeholder: 'settings.core.githubToken.placeholder',\n },\n receivePerReleaseUpdate: {\n type: 'switch',\n defaultValue: false,\n info: 'settings.core.prereleaseUpdates',\n },\n cloudEnabled: { type: 'switch', defaultValue: false, info: 'settings.core.cloud.enabled' },\n cloudServerUrl: {\n type: 'string',\n defaultValue: '',\n info: 'settings.core.cloud.serverUrl',\n placeholder: 'settings.core.cloud.serverUrlPlaceholder',\n },\n installOverride: {\n type: 'pairs',\n defaultValue: [],\n info: 'settings.core.installOverride',\n required: true,\n },\n },\n 'settings.core.title',\n)","import { useConfig as useDbConfig } from '@delta-comic/db'\nimport type { FormResult } from '@delta-comic/model'\nimport { computed, shallowReactive, type Ref } from 'vue'\n\nimport type { ConfigDescription, ConfigPointer } from './configPointer'\nimport { coreConfig } from './features/core/config'\n\nexport * from './configPointer'\n\nexport type ConfigSave<T> = {\n form: ConfigDescription\n data: Ref<T>\n name: string\n ready: Promise<void>\n}\n\nexport class ConfigStore {\n public readonly form = shallowReactive(new Map<symbol, ConfigSave<any>>())\n private readonly darkMode = computed(() => {\n if (!this.$isExistConfig(coreConfig)) return this.isSystemDark\n const config = this.$load(coreConfig).data.value\n switch (config.darkMode) {\n case 'light':\n return false\n case 'dark':\n return true\n case 'system':\n default:\n return this.isSystemDark\n }\n })\n\n private readonly isSystemDark =\n globalThis.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false\n\n public get isDark() {\n return this.darkMode.value\n }\n\n public constructor() {\n // Core settings remain available when the built-in core runtime is disabled.\n this.$registerConfig(coreConfig)\n }\n\n public $load<T extends ConfigPointer>(pointer: T): ConfigSave<FormResult<T['config']>> {\n const value = this.form.get(pointer.key)\n if (!value) throw new Error(`not found config by plugin \"${pointer.pluginName}\"`)\n return value\n }\n\n public $loadApp() {\n return this.$load(coreConfig)\n }\n\n public $isExistConfig(pointer: ConfigPointer) {\n return this.form.has(pointer.key)\n }\n\n public $registerConfig(pointer: ConfigPointer) {\n const registered = this.form.get(pointer.key)\n if (registered) return registered\n\n const store = useDbConfig(pointer.pluginName, pointer.config)\n const saved: ConfigSave<any> = {\n form: pointer.config,\n data: store,\n name: pointer.configName,\n ready: (store as typeof store & { ready: Promise<void> }).ready,\n }\n this.form.set(pointer.key, saved)\n return saved\n }\n\n /** @deprecated Use `$registerConfig`. */\n public $resignerConfig(pointer: ConfigPointer) {\n return this.$registerConfig(pointer)\n }\n\n public $unregisterConfig(pointer: ConfigPointer) {\n this.form.delete(pointer.key)\n }\n}\n\nlet configStore: ConfigStore | undefined\nexport const useConfig = () => (configStore ??= new ConfigStore())","interface DependDefineConstraint<_T> {}\nexport type DependDefine<T> = symbol & DependDefineConstraint<T> & { _ts: T }\n\nexport const exposeSymbol = (name: string) => Symbol.for(`expose:${name}`)\n\nexport const declareDepType = <T>(name: string) => <DependDefine<T>>exposeSymbol(name)\n\nexport class DependencyRegistry {\n public constructor(public readonly exposes = new Map<symbol, unknown>()) {}\n\n public provide<T>(define: DependDefine<T>, value: T) {\n this.exposes.set(define, value)\n return value\n }\n\n public require<T>(define: DependDefine<T>): T {\n if (!this.exposes.has(define)) {\n const name = Symbol.keyFor(define) ?? define.description ?? define.toString()\n throw new Error(`not found plugin expose \"${name}\"`)\n }\n return this.exposes.get(define) as T\n }\n\n public has(define: DependDefine<unknown>) {\n return this.exposes.has(define)\n }\n\n public delete(define: DependDefine<unknown>) {\n return this.exposes.delete(define)\n }\n\n public clear() {\n this.exposes.clear()\n }\n}\n\nexport type InferDependType<T extends DependDefine<any>> = T['_ts']\n\nexport const pluginExposes = new Map<symbol, unknown>()\nexport const defaultDependencyRegistry = new DependencyRegistry(pluginExposes)\nexport const createDependencyRegistry = () => new DependencyRegistry()\n\nexport const provide = <T>(define: DependDefine<T>, value: T) =>\n defaultDependencyRegistry.provide(define, value)\n\nexport const require = <T>(define: DependDefine<T>): T => defaultDependencyRegistry.require(define)","export interface PluginLocaleMessage {\n [key: string]: PluginLocaleMessage | string\n}\n\nexport type PluginLocaleMessages = Record<string, PluginLocaleMessage>\n\nexport interface PluginI18nAdapter {\n setLocaleMessage(locale: string, message: PluginLocaleMessage): void\n translate?(key: string, params?: Record<string, number | string>): string\n}\n\nconst messageKeyPrefix = 'i18n:'\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype'])\n\nconst mergeMessages = (\n target: PluginLocaleMessage,\n source: PluginLocaleMessage | undefined,\n): PluginLocaleMessage => {\n if (!source) return target\n for (const [key, value] of Object.entries(source)) {\n if (unsafeKeys.has(key)) continue\n if (typeof value === 'string') {\n target[key] = value\n continue\n }\n const current = target[key]\n target[key] = mergeMessages(typeof current === 'object' ? { ...current } : {}, value)\n }\n return target\n}\n\nexport class PluginI18nRegistry {\n private adapter?: PluginI18nAdapter\n private baseMessages: PluginLocaleMessages = {}\n private readonly pluginMessages = new Map<string, PluginLocaleMessages>()\n\n public install(adapter: PluginI18nAdapter, baseMessages: PluginLocaleMessages) {\n this.adapter = adapter\n this.baseMessages = baseMessages\n this.refresh(this.locales())\n }\n\n public register(plugin: string, messages: PluginLocaleMessages) {\n const previous = this.pluginMessages.get(plugin)\n this.pluginMessages.delete(plugin)\n this.pluginMessages.set(plugin, messages)\n this.refresh(new Set([...Object.keys(previous ?? {}), ...Object.keys(messages)]))\n }\n\n public remove(plugin: string) {\n const messages = this.pluginMessages.get(plugin)\n if (!messages) return\n this.pluginMessages.delete(plugin)\n this.refresh(new Set(Object.keys(messages)))\n }\n\n public translate(key: string, params?: Record<string, number | string>) {\n return this.adapter?.translate?.(key, params) ?? key\n }\n\n private compose(locale: string) {\n const message = mergeMessages({}, this.baseMessages[locale])\n for (const messages of this.pluginMessages.values()) mergeMessages(message, messages[locale])\n return message\n }\n\n private locales() {\n const locales = new Set(Object.keys(this.baseMessages))\n for (const messages of this.pluginMessages.values()) {\n for (const locale of Object.keys(messages)) locales.add(locale)\n }\n return locales\n }\n\n private refresh(locales: Iterable<string>) {\n if (!this.adapter) return\n for (const locale of locales) this.adapter.setLocaleMessage(locale, this.compose(locale))\n }\n}\n\nexport const pluginI18n = new PluginI18nRegistry()\n\nexport const pluginMessageKey = (key: string) => `${messageKeyPrefix}${key}`\n\nexport const translatePluginText = (value: string) =>\n value.startsWith(messageKeyPrefix)\n ? pluginI18n.translate(value.slice(messageKeyPrefix.length))\n : value","import { db, type PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport type { Raw } from 'vue'\nimport { shallowReactive, shallowRef } from 'vue'\n\nimport { translatePluginText } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nconst pluginStoreLogger = logger.scoped('plugin:store')\n\nexport class PluginStore {\n public readonly plugins = shallowReactive(new Map<string, Raw<PluginConfig>>())\n /** Plugins whose complete boot pipeline has completed successfully. */\n public readonly ready = shallowReactive(new Set<string>())\n public readonly revision = shallowRef(0)\n private readonly pluginNames = shallowReactive(new Map<string, string>())\n\n /**\n * Returns true only when every registered booter has completed successfully.\n *\n * `plugins.has()` intentionally is not used here: the config is inserted before\n * the first booter runs and can therefore describe a partially initialized plugin.\n */\n public $isLoaded(plugin: string) {\n return this.ready.has(plugin)\n }\n\n /** Starts a new load generation and invalidates the previous readiness state. */\n public $markLoading(plugin: string) {\n this.ready.delete(plugin)\n }\n\n /** Marks a plugin ready after all booters have completed. */\n public $markReady(plugin: string) {\n this.ready.add(plugin)\n }\n\n /** Removes all lifecycle state for a plugin. */\n public $markUnloaded(plugin: string) {\n this.ready.delete(plugin)\n }\n\n public async $refreshI18nNames() {\n const names = await db.selectFrom('plugin').select(['pluginName', 'displayName']).execute()\n this.pluginNames.clear()\n for (const plugin of names) this.pluginNames.set(plugin.pluginName, plugin.displayName)\n pluginStoreLogger.debug('plugin display names refreshed', { count: names.length })\n }\n\n public $getI18nName(key: string) {\n return translatePluginText(this.pluginNames.get(key) || key)\n }\n\n public async $upsertArchives(archives: PluginArchiveDB.Archive[]) {\n if (archives.length === 0) return\n await db\n .replaceInto('plugin')\n .values(archives.map(archive => ({ ...archive, meta: JSON.stringify(archive.meta) })))\n .execute()\n await this.$refreshI18nNames()\n this.$touch()\n pluginStoreLogger.info('plugin archives persisted', { count: archives.length })\n }\n\n public $touch() {\n this.revision.value++\n }\n}\n\nexport const pluginStore = new PluginStore()\nexport const usePluginStore = () => pluginStore","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { pluginI18n } from '@/i18n'\n\nexport interface PluginDependencyMissing {\n pluginName: string\n dependencyName: string\n}\n\nexport interface PluginLoadPlan {\n levels: PluginArchiveDB.Archive[][]\n missing: PluginDependencyMissing[]\n cycles: string[][]\n}\n\nconst getDependencyNames = (plugin: PluginArchiveDB.Archive) =>\n plugin.meta.require.map(dep => dep.id)\n\nconst canonicalCycleKey = (cycle: string[]) => {\n const nodes = cycle.slice(0, -1)\n const rotations = nodes.map((_, index) => nodes.slice(index).concat(nodes.slice(0, index)))\n rotations.sort((a, b) => a.join('\\0').localeCompare(b.join('\\0')))\n return rotations[0].join('\\0')\n}\n\nexport const findCyclePaths = (plugins: PluginArchiveDB.Archive[]): string[][] => {\n const pluginNames = new Set(plugins.map(plugin => plugin.pluginName))\n const dependencies = new Map(\n plugins.map(plugin => [\n plugin.pluginName,\n getDependencyNames(plugin).filter(dep => pluginNames.has(dep)),\n ]),\n )\n\n const state = new Map<string, 'visiting' | 'visited'>()\n const path: string[] = []\n const cycleKeys = new Set<string>()\n const cycles: string[][] = []\n\n const visit = (pluginName: string) => {\n state.set(pluginName, 'visiting')\n path.push(pluginName)\n\n for (const dependencyName of dependencies.get(pluginName) ?? []) {\n const dependencyState = state.get(dependencyName)\n if (dependencyState === 'visiting') {\n const cycleStart = path.lastIndexOf(dependencyName)\n if (cycleStart === -1) continue\n\n const cycle = path.slice(cycleStart).concat(dependencyName)\n const key = canonicalCycleKey(cycle)\n if (!cycleKeys.has(key)) {\n cycleKeys.add(key)\n cycles.push(cycle)\n }\n continue\n }\n\n if (dependencyState !== 'visited') visit(dependencyName)\n }\n\n path.pop()\n state.set(pluginName, 'visited')\n }\n\n for (const plugin of plugins) {\n if (!state.has(plugin.pluginName)) visit(plugin.pluginName)\n }\n\n return cycles\n}\n\nexport const planPluginLoadOrder = (plugins: PluginArchiveDB.Archive[]): PluginLoadPlan => {\n const nameToPlugin = new Map(plugins.map(plugin => [plugin.pluginName, plugin]))\n const inDegree = new Map<string, number>()\n const adjacency = new Map<string, string[]>()\n const missing: PluginDependencyMissing[] = []\n\n for (const plugin of plugins) {\n const dependencies = getDependencyNames(plugin)\n const installedDependencies = dependencies.filter(dependencyName => {\n const isInstalled = nameToPlugin.has(dependencyName)\n if (!isInstalled) missing.push({ pluginName: plugin.pluginName, dependencyName })\n return isInstalled\n })\n\n inDegree.set(plugin.pluginName, installedDependencies.length)\n for (const dependencyName of installedDependencies) {\n const dependents = adjacency.get(dependencyName) ?? []\n dependents.push(plugin.pluginName)\n adjacency.set(dependencyName, dependents)\n }\n }\n\n const queue = [...inDegree.entries()]\n .filter(([, degree]) => degree === 0)\n .map(([pluginName]) => pluginName)\n\n const levels: PluginArchiveDB.Archive[][] = []\n while (queue.length > 0) {\n const levelSize = queue.length\n const level: PluginArchiveDB.Archive[] = []\n\n for (let index = 0; index < levelSize; index++) {\n const pluginName = queue.shift()\n if (!pluginName) continue\n\n const plugin = nameToPlugin.get(pluginName)\n if (plugin) level.push(plugin)\n\n for (const dependentName of adjacency.get(pluginName) ?? []) {\n const newDegree = (inDegree.get(dependentName) ?? 0) - 1\n inDegree.set(dependentName, newDegree)\n if (newDegree === 0) queue.push(dependentName)\n }\n }\n\n if (level.length > 0) levels.push(level)\n }\n\n const unresolved = plugins.filter(plugin => (inDegree.get(plugin.pluginName) ?? 0) > 0)\n const cycles = findCyclePaths(unresolved)\n\n return { levels, missing, cycles }\n}\n\ntype PluginMessageTranslator = (key: string, params: Record<string, number | string>) => string\n\nexport const formatPluginLoadPlanError = (\n plan: Pick<PluginLoadPlan, 'missing' | 'cycles'>,\n translate: PluginMessageTranslator = (key, params) => pluginI18n.translate(key, params),\n) => {\n const sections: string[] = []\n\n if (plan.missing.length > 0) {\n const missing = plan.missing\n .map(({ pluginName, dependencyName }) => `${pluginName} -> ${dependencyName}`)\n .join('\\n')\n sections.push(translate('plugin.runtime.errors.missingDependencies', { missing }))\n }\n\n if (plan.cycles.length > 0) {\n const paths = plan.cycles.map(path => path.join(' -> ')).join('\\n')\n sections.push(translate('plugin.runtime.errors.dependencyCycles', { paths }))\n }\n\n return sections.join('\\n\\n')\n}","import { pluginMessageKey } from '../../i18n'\nimport { defineInnerPlugin } from '../../plugin'\n\nimport { coreConfig } from './config'\n\nexport { coreConfig } from './config'\n\nexport default defineInnerPlugin({\n meta: {\n kind: 'preboot',\n author: 'Delta Comic',\n description: pluginMessageKey('plugin.core.description'),\n require: [],\n name: { display: pluginMessageKey('settings.core.title'), id: 'core' },\n version: { plugin: '2.3.0', supportCore: '*' },\n },\n enabledByDefault: true,\n config: () => ({ name: 'core', config: [coreConfig] }),\n})","import type { BuiltInPluginDefinition } from '../plugin'\n\nconst rawDefinitions = import.meta.glob<BuiltInPluginDefinition>('./*/feature.ts', {\n eager: true,\n import: 'default',\n})\n\nexport const createBuiltInPluginRegistry = (\n definitions: readonly BuiltInPluginDefinition[],\n): ReadonlyMap<string, BuiltInPluginDefinition> => {\n const registry = new Map<string, BuiltInPluginDefinition>()\n for (const definition of definitions) {\n const pluginName = definition.meta.name.id\n if (!pluginName) throw new Error('built-in plugin id cannot be empty')\n if (registry.has(pluginName)) throw new Error(`duplicate built-in plugin: ${pluginName}`)\n registry.set(pluginName, definition)\n }\n return registry\n}\n\nexport const builtInPluginRegistry = createBuiltInPluginRegistry(Object.values(rawDefinitions))","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\n\nimport { builtInPluginRegistry } from '../features/registry'\nimport type { BuiltInPluginDefinition } from '../plugin'\n\nconst builtInLogger = logger.scoped('plugin:builtin')\n\nexport const BUILT_IN_PLUGIN_LOADER = 'builtin'\n\nexport const isBuiltInPluginName = (pluginName: string) => builtInPluginRegistry.has(pluginName)\n\nexport const isBuiltInPlugin = (plugin: Pick<PluginArchiveDB.Archive, 'loaderName'>): boolean =>\n plugin.loaderName === BUILT_IN_PLUGIN_LOADER\n\nexport const builtInDefinitionToArchive = (\n definition: BuiltInPluginDefinition,\n enable = definition.enabledByDefault ?? true,\n): PluginArchiveDB.Archive => ({\n displayName: definition.meta.name.display,\n enable,\n installerName: BUILT_IN_PLUGIN_LOADER,\n installInput: '',\n loaderName: BUILT_IN_PLUGIN_LOADER,\n meta: definition.meta,\n pluginName: definition.meta.name.id,\n})\n\n/** Mirrors compile-time definitions into the plugin catalog while preserving their enable state. */\nexport const synchronizeBuiltInPlugins = async (): Promise<void> => {\n builtInLogger.info('built-in plugin synchronization started', {\n definitionCount: builtInPluginRegistry.size,\n })\n const { db } = await import('@delta-comic/db')\n await db.transaction().execute(async trx => {\n const existing = await trx.selectFrom('plugin').selectAll().execute()\n const existingByName = new Map(existing.map(plugin => [plugin.pluginName, plugin]))\n\n for (const [pluginName, definition] of builtInPluginRegistry) {\n const current = existingByName.get(pluginName)\n const archive = builtInDefinitionToArchive(definition, current?.enable)\n const values = { ...archive, meta: JSON.stringify(archive.meta) }\n if (current) {\n await trx.updateTable('plugin').set(values).where('pluginName', '=', pluginName).execute()\n } else {\n await trx.insertInto('plugin').values(values).execute()\n }\n }\n\n const currentNames = [...builtInPluginRegistry.keys()]\n let staleQuery = trx.deleteFrom('plugin').where('loaderName', '=', BUILT_IN_PLUGIN_LOADER)\n if (currentNames.length > 0) staleQuery = staleQuery.where('pluginName', 'not in', currentNames)\n await staleQuery.execute()\n })\n builtInLogger.info('built-in plugin synchronization completed')\n}","import { UniComment, UniContentPage, UniItem, UniResource, UniUser } from '@delta-comic/model'\n\nimport { useConfig } from '@/config'\nimport { declareDepType, defaultDependencyRegistry } from '@/depends'\nimport { Global } from '@/global'\nimport { pluginI18n } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { releasePluginObjectUrls } from './init/storage'\nimport { usePluginStore } from './store'\n\nconst removeSourcedEntries = (\n map: { keys(): IterableIterator<string>; delete(key: string): boolean },\n plugin: string,\n) => {\n for (const key of map.keys()) {\n if (key.split(':', 1)[0] === plugin) map.delete(key)\n }\n}\n\nexport const cleanupPlugin = (config: PluginConfig) => {\n const plugin = config.name\n const pluginStore = usePluginStore()\n const errors: unknown[] = []\n const attempt = (action: () => void) => {\n try {\n action()\n } catch (error) {\n errors.push(error)\n }\n }\n\n // Invalidate readiness before removing registrations so reactive consumers\n // cannot reconstruct runtime-only classes from a plugin being unloaded.\n attempt(() => pluginStore.$markUnloaded(plugin))\n attempt(() => Global.tabbar.delete(plugin))\n attempt(() => Global.categories.delete(plugin))\n attempt(() => Global.barcode.delete(plugin))\n attempt(() => Global.hotSearch.delete(plugin))\n attempt(() => Global.levelboard.delete(plugin))\n attempt(() => Global.topButton.delete(plugin))\n attempt(() => Global.mainLists.delete(plugin))\n attempt(() => Global.removeOwnedRegistrations(plugin))\n attempt(() => pluginI18n.remove(plugin))\n attempt(() => removeSourcedEntries(Global.share, plugin))\n attempt(() => removeSourcedEntries(Global.shareToken, plugin))\n attempt(() => removeSourcedEntries(Global.userActions, plugin))\n attempt(() => removeSourcedEntries(Global.subscribes, plugin))\n\n for (const [contentType, value] of Object.entries(config.content ?? {})) {\n if (value.layout) attempt(() => UniContentPage.layouts.delete(contentType))\n if (value.itemCard) attempt(() => UniItem.itemCards.delete(contentType))\n if (value.contentPage) attempt(() => UniContentPage.contentPages.delete(contentType))\n if (value.downloadProvider) attempt(() => UniContentPage.downloadProviders.delete(contentType))\n if (value.commentRow) attempt(() => UniComment.commentRow.delete(contentType))\n if (value.itemTranslator) attempt(() => UniItem.itemTranslator.delete(contentType))\n }\n for (const type of config.resource?.types ?? []) {\n attempt(() => UniResource.fork.delete([plugin, type.type]))\n attempt(() => UniResource.precedenceFork.delete([plugin, type.type]))\n }\n for (const name of Object.keys(config.resource?.process ?? {})) {\n attempt(() => UniResource.processInstances.delete([plugin, name]))\n }\n if (config.user?.card) attempt(() => UniUser.userCards.delete(plugin))\n if (config.user?.edit) attempt(() => UniUser.userEditorBase.delete(plugin))\n for (const key of Object.keys(config.user?.authorIcon ?? {})) {\n attempt(() => UniItem.authorIcon.delete([plugin, key]))\n }\n for (const pointer of config.config ?? []) attempt(() => useConfig().$unregisterConfig(pointer))\n\n attempt(() => defaultDependencyRegistry.delete(declareDepType(plugin)))\n attempt(() => pluginStore.plugins.delete(plugin))\n attempt(() => releasePluginObjectUrls(plugin))\n if (typeof document !== 'undefined') {\n for (const node of document.querySelectorAll<HTMLStyleElement>('style[data-plugin]')) {\n if (node.dataset.plugin === plugin) attempt(() => node.remove())\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `failed to completely clean plugin \"${plugin}\"`)\n }\n}","import { shallowReactive } from 'vue'\n\nimport type { PluginBooter, PluginInstaller, PluginLoader } from './extensionTypes'\n\ninterface NamedExtension {\n name: string\n}\n\ninterface ExtensionEntry<T extends NamedExtension> {\n extension: T\n order: number\n owner?: string\n sequence: number\n}\n\nexport interface RuntimeExtensionOptions {\n order?: number\n}\n\nclass OrderedExtensionRegistry<T extends NamedExtension> {\n public readonly values = shallowReactive(new Array<T>())\n private readonly entries: ExtensionEntry<T>[] = []\n private sequence = 0\n\n public constructor(private readonly direction: 'ascending' | 'descending') {}\n\n public register(extension: T, options: RuntimeExtensionOptions = {}, owner?: string) {\n const entry: ExtensionEntry<T> = {\n extension,\n order: options.order ?? 0,\n owner,\n sequence: this.sequence++,\n }\n this.entries.push(entry)\n this.refresh()\n return () => {\n const index = this.entries.indexOf(entry)\n if (index < 0) return\n this.entries.splice(index, 1)\n this.refresh()\n }\n }\n\n public removeOwner(owner: string) {\n let changed = false\n for (let index = this.entries.length - 1; index >= 0; index--) {\n if (this.entries[index].owner !== owner) continue\n this.entries.splice(index, 1)\n changed = true\n }\n if (changed) this.refresh()\n }\n\n private refresh() {\n const activeByName = new Map<string, ExtensionEntry<T>>()\n for (const entry of this.entries) activeByName.set(entry.extension.name, entry)\n const direction = this.direction === 'ascending' ? 1 : -1\n const active = [...activeByName.values()]\n .sort(\n (left, right) => (left.order - right.order) * direction || left.sequence - right.sequence,\n )\n .map(entry => entry.extension)\n this.values.splice(0, this.values.length, ...active)\n }\n}\n\nexport class PluginRuntimeExtensions {\n public readonly booters = new OrderedExtensionRegistry<PluginBooter>('ascending')\n public readonly installers = new OrderedExtensionRegistry<PluginInstaller>('descending')\n public readonly loaders = new OrderedExtensionRegistry<PluginLoader>('ascending')\n private readonly owners: string[] = []\n\n public registerBooter(booter: PluginBooter, options?: RuntimeExtensionOptions) {\n return this.booters.register(booter, options, this.owners.at(-1))\n }\n\n public registerInstaller(installer: PluginInstaller, options?: RuntimeExtensionOptions) {\n return this.installers.register(installer, options, this.owners.at(-1))\n }\n\n public registerLoader(loader: PluginLoader, options?: RuntimeExtensionOptions) {\n return this.loaders.register(loader, options, this.owners.at(-1))\n }\n\n public removeOwner(owner: string) {\n this.booters.removeOwner(owner)\n this.installers.removeOwner(owner)\n this.loaders.removeOwner(owner)\n }\n\n public async withOwner<T>(owner: string, action: () => Promise<T>): Promise<T> {\n this.owners.push(owner)\n try {\n return await action()\n } finally {\n this.owners.pop()\n }\n }\n}\n\nexport const runtimeExtensions = new PluginRuntimeExtensions()\n\nexport const registerBooter = runtimeExtensions.registerBooter.bind(runtimeExtensions)\nexport const registerInstaller = runtimeExtensions.registerInstaller.bind(runtimeExtensions)\nexport const registerLoader = runtimeExtensions.registerLoader.bind(runtimeExtensions)","import { logger } from '@delta-comic/logger'\nimport { isString } from 'es-toolkit'\nimport { markRaw, type Ref } from 'vue'\n\nimport type { PluginConfig } from '@/plugin'\n\nimport { runtimeExtensions } from './extensions'\nimport type { PluginLoadingInfo } from './loader'\nimport { usePluginStore } from './store'\n\nconst pluginBooterLogger = logger.scoped('plugin:booter')\n\nexport const booters = runtimeExtensions.booters.values\n\nexport const bootPlugin = async (\n cfg: PluginConfig,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n const store = usePluginStore()\n store.$markLoading(cfg.name)\n\n try {\n store.plugins.set(cfg.name, markRaw(cfg))\n\n const env: Record<any, any> = {}\n for (const booter of booters) {\n const msIndex = info.value[cfg.name].steps.length\n info.value[cfg.name].steps[msIndex] = { name: booter.name, description: '' }\n info.value[cfg.name].progress = { stepsIndex: msIndex, status: 'process' }\n pluginBooterLogger.debug('plugin boot step started', { plugin: cfg.name, step: msIndex })\n await booter.call(\n cfg,\n meta => {\n if (isString(meta)) info.value[cfg.name].steps[msIndex].description = meta\n else {\n if (meta.description) info.value[cfg.name].steps[msIndex].description = meta.description\n if (meta.name) info.value[cfg.name].steps[msIndex].name = meta.name\n }\n },\n env,\n )\n }\n\n info.value[cfg.name].progress.status = 'done'\n store.$markReady(cfg.name)\n\n pluginBooterLogger.info('plugin boot pipeline completed', { plugin: cfg.name })\n } catch (error) {\n store.$markUnloaded(cfg.name)\n pluginBooterLogger.error('plugin boot pipeline failed', { plugin: cfg.name }, error)\n throw error\n }\n}","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { Mutex } from 'es-toolkit'\nimport type { Ref } from 'vue'\n\nimport { builtInPluginRegistry } from '@/features/registry'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig, PluginConfigFactory } from '@/plugin'\n\nimport { bootPlugin } from './booter'\nimport { isBuiltInPlugin } from './builtIn'\nimport { cleanupPlugin } from './cleanup'\nimport { runtimeExtensions } from './extensions'\nimport { isTauriRuntime } from './init/storage'\n\nconst pluginLoaderLogger = logger.scoped('plugin:loader')\n\nexport const loaders = runtimeExtensions.loaders.values\n\nconst loadLocks = <Record<string, Mutex>>{}\nconst getLoadLock = (pluginName: string) => (loadLocks[pluginName] ??= new Mutex())\n\nexport type PluginBootRollback = (\n config: PluginConfig | undefined,\n expectedName: string | undefined,\n) => Promise<void> | void\n\nexport interface BootConfigOptions {\n expectedName?: string\n rollback?: PluginBootRollback\n}\n\nexport const createPluginLoadingInfo = (): PluginLoadingInfo => ({\n progress: { status: 'wait', stepsIndex: 0 },\n steps: [\n {\n name: pluginMessageKey('plugin.runtime.steps.waiting.title'),\n description: pluginMessageKey('plugin.runtime.steps.waiting.description'),\n },\n ],\n})\n\nexport const ensurePluginLoadingInfo = (\n info: Ref<Record<string, PluginLoadingInfo>>,\n pluginName: string,\n) => (info.value[pluginName] ??= createPluginLoadingInfo())\n\nexport const markPluginLoadError = (\n info: Ref<Record<string, PluginLoadingInfo>>,\n pluginName: string,\n error: unknown,\n) => {\n const loadingInfo = ensurePluginLoadingInfo(info, pluginName)\n loadingInfo.progress = {\n ...loadingInfo.progress,\n errorReason: error instanceof Error ? error.message : String(error),\n status: 'error',\n }\n}\n\n/** 解析 config factory 并启动插件;任何中途失败都保留原始错误并执行回滚。 */\nexport const bootConfig = async (\n configFactory: PluginConfigFactory,\n info: Ref<Record<string, PluginLoadingInfo>>,\n options: BootConfigOptions = {},\n) => {\n const { expectedName, rollback } = options\n if (expectedName) ensurePluginLoadingInfo(info, expectedName)\n\n let cfg: PluginConfig | undefined\n try {\n cfg = configFactory({ safe: true, platform: isTauriRuntime() ? 'tauri' : 'web' })\n if (expectedName && cfg.name !== expectedName) {\n throw new Error(`plugin name mismatch: ${expectedName} / ${cfg.name}`)\n }\n await bootResolvedConfig(cfg, info)\n return cfg\n } catch (error) {\n const progressName = expectedName ?? cfg?.name\n if (progressName) markPluginLoadError(info, progressName, error)\n if (rollback) {\n try {\n await rollback(cfg, expectedName)\n } catch (rollbackError) {\n pluginLoaderLogger.error(\n 'plugin boot rollback failed',\n { plugin: progressName },\n rollbackError,\n )\n }\n }\n throw error\n }\n}\n\nexport const bootResolvedConfig = async (\n cfg: ReturnType<PluginConfigFactory>,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n ensurePluginLoadingInfo(info, cfg.name)\n await bootPlugin(cfg, info)\n}\n\nexport const loadPluginConfig = async (meta: PluginArchiveDB.Archive) => {\n const lock = getLoadLock(meta.pluginName)\n try {\n await lock.acquire()\n pluginLoaderLogger.debug('loading plugin config', {\n loader: meta.loaderName,\n plugin: meta.pluginName,\n })\n if (isBuiltInPlugin(meta)) return builtInPluginRegistry.get(meta.pluginName)?.config\n const loader = loaders.find(value => value.name === meta.loaderName)\n if (!loader) {\n throw new Error(\n pluginI18n.translate('plugin.runtime.errors.loaderMissing', {\n loader: meta.loaderName,\n plugin: meta.pluginName,\n }),\n )\n }\n return await loader.load(meta)\n } finally {\n lock.release()\n }\n}\n\nexport const loadPlugin = async (\n meta: PluginArchiveDB.Archive,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n pluginLoaderLogger.info('plugin boot started', { plugin: meta.pluginName })\n ensurePluginLoadingInfo(info, meta.pluginName)\n try {\n const configFactory = await loadPluginConfig(meta)\n if (!configFactory) {\n throw new Error(\n pluginI18n.translate('plugin.runtime.errors.defaultExportMissing', {\n plugin: meta.pluginName,\n }),\n )\n }\n await bootConfig(configFactory, info, {\n expectedName: meta.pluginName,\n rollback: config => cleanupPlugin(config ?? ({ name: meta.pluginName } as PluginConfig)),\n })\n pluginLoaderLogger.info('plugin boot completed', { plugin: meta.pluginName })\n } catch (error) {\n pluginLoaderLogger.error('plugin boot failed', { plugin: meta.pluginName }, error)\n markPluginLoadError(info, meta.pluginName, error)\n throw error\n }\n}\n\nexport type PluginLoadingInfo = {\n steps: { name: string; description: string }[]\n progress: {\n errorReason?: string\n stepsIndex: number\n status: 'wait' | 'process' | 'error' | 'done'\n }\n}\n\nexport const loadAllPlugins = () =>\n import('./runtime').then(({ pluginRuntime }) => pluginRuntime.loadNormal())","import type { PluginArchiveDB } from '@delta-comic/db'\n\nexport type ClientPluginKind = 'normal' | 'preboot'\n\nexport const pluginKind = (plugin: PluginArchiveDB.Archive): ClientPluginKind =>\n plugin.meta.kind ?? 'normal'\n\nexport const selectPluginsForPhase = (\n plugins: PluginArchiveDB.Archive[],\n kind: ClientPluginKind,\n startupPrebootNames: ReadonlySet<string> = new Set(\n plugins.filter(plugin => pluginKind(plugin) === 'preboot').map(plugin => plugin.pluginName),\n ),\n activePrebootNames: ReadonlySet<string> = startupPrebootNames,\n): PluginArchiveDB.Archive[] => {\n const selected = plugins.filter(plugin =>\n kind === 'preboot'\n ? startupPrebootNames.has(plugin.pluginName)\n : !startupPrebootNames.has(plugin.pluginName),\n )\n if (kind === 'preboot') return selected\n\n return selected.map(plugin => ({\n ...plugin,\n meta: {\n ...plugin.meta,\n require: plugin.meta.require.filter(dependency => !activePrebootNames.has(dependency.id)),\n },\n }))\n}\n\nexport const failedDependencies = (\n plugin: PluginArchiveDB.Archive,\n failedPluginNames: ReadonlySet<string>,\n) => plugin.meta.require.filter(dependency => failedPluginNames.has(dependency.id)).map(v => v.id)\n\nexport const filterPluginsBySelection = (\n plugins: PluginArchiveDB.Archive[],\n pluginNames?: ReadonlySet<string>,\n) => (pluginNames ? plugins.filter(plugin => pluginNames.has(plugin.pluginName)) : plugins)","import { db, type PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { ref, type App, type Ref } from 'vue'\n\nimport { useConfig } from '@/config'\nimport { Global } from '@/global'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { isBuiltInPlugin, synchronizeBuiltInPlugins } from './builtIn'\nimport { cleanupPlugin } from './cleanup'\nimport { isTauriRuntime, removePluginFiles } from './init/storage'\nimport { bootResolvedConfig, type PluginLoadingInfo, loadPluginConfig } from './loader'\nimport { formatPluginLoadPlanError, planPluginLoadOrder } from './loadPlan'\nimport {\n failedDependencies,\n filterPluginsBySelection,\n pluginKind,\n selectPluginsForPhase,\n type ClientPluginKind,\n} from './runtimePlan'\nimport { pluginStore } from './store'\n\nconst pluginRuntimeLogger = logger.scoped('plugin:runtime')\n\nconst recoveryKey = 'delta-comic:preboot-recovery'\n\nexport interface PrebootRecovery {\n failedAt: number\n plugins: string[]\n reason: string\n}\n\nexport interface PluginRuntimeOperation {\n operation: Promise<void>\n progress: Ref<Record<string, PluginLoadingInfo>>\n}\n\nexport interface LoadNormalOptions {\n pluginNames?: readonly string[]\n}\n\ntype ActivePlugin = { config: PluginConfig; kind: ClientPluginKind }\n\nconst reasonText = (error: unknown) => (error instanceof Error ? error.message : String(error))\n\nconst createLoadingInfo = (): PluginLoadingInfo => ({\n progress: { status: 'wait', stepsIndex: 0 },\n steps: [\n {\n name: pluginMessageKey('plugin.runtime.steps.waiting.title'),\n description: pluginMessageKey('plugin.runtime.steps.waiting.description'),\n },\n ],\n})\n\nclass PluginRuntime {\n private readonly active = new Map<string, ActivePlugin>()\n private readonly activePrebootNames = new Set<string>()\n private readonly prebootCleanups = new Map<string, () => Promise<void> | void>()\n private readonly preparedPreboot = new Map<string, PluginConfig>()\n private readonly startupPluginNames = new Set<string>()\n private readonly startupPrebootNames = new Set<string>()\n private builtInSynchronization?: Promise<void>\n private enabledPrebootNames: string[] = []\n private normalOperation?: Promise<void>\n private startupSnapshotReady = false\n private prebootActivated = false\n\n public get activeNormalPluginNames() {\n return [...this.active.entries()]\n .filter(([, plugin]) => plugin.kind === 'normal')\n .map(([name]) => name)\n }\n\n loadNormal(options: LoadNormalOptions = {}): PluginRuntimeOperation {\n if (this.normalOperation) throw new Error('normal plugins are already loading')\n if (this.preparedPreboot.size > 0 && !this.prebootActivated) {\n throw new Error('preboot plugins have not finished activating')\n }\n if ([...this.active.values()].some(plugin => plugin.kind === 'normal')) {\n throw new Error('normal plugins are already active; use reloadNormal()')\n }\n const progress = ref<Record<string, PluginLoadingInfo>>({})\n pluginRuntimeLogger.info('normal plugin load requested', {\n selectedCount: options.pluginNames?.length,\n })\n const operation = this.loadKind('normal', progress, options)\n this.trackNormalOperation(operation)\n return { operation, progress }\n }\n\n reloadNormal(options: LoadNormalOptions = {}): PluginRuntimeOperation {\n if (this.normalOperation) throw new Error('normal plugins are already loading')\n const progress = ref<Record<string, PluginLoadingInfo>>({})\n pluginRuntimeLogger.info('normal plugin reload requested', {\n selectedCount: options.pluginNames?.length,\n })\n const operation = (async () => {\n const unloadErrors = await this.unloadKind('normal')\n await this.loadKind('normal', progress, options)\n if (unloadErrors.length > 0) {\n throw new AggregateError(unloadErrors, 'some plugins failed to unload cleanly')\n }\n })()\n this.trackNormalOperation(operation)\n return { operation, progress }\n }\n\n async preparePreboot(app: App): Promise<{ reloadRequired: boolean }> {\n pluginRuntimeLogger.info('preboot plugin preparation started')\n await this.ensureBuiltInPlugins()\n await pluginStore.$refreshI18nNames()\n const allPlugins = await db.selectFrom('plugin').selectAll().execute()\n this.captureStartupSnapshot(allPlugins)\n const plugins = selectPluginsForPhase(\n allPlugins.filter(plugin => plugin.enable),\n 'preboot',\n this.startupPrebootNames,\n this.activePrebootNames,\n )\n this.enabledPrebootNames = plugins.map(plugin => plugin.pluginName)\n pluginRuntimeLogger.debug('preboot plugins selected', { count: plugins.length })\n if (plugins.length === 0) {\n this.prebootActivated = true\n return { reloadRequired: false }\n }\n\n try {\n const plan = planPluginLoadOrder(plugins)\n const planError = formatPluginLoadPlanError(plan)\n if (planError) throw new Error(planError)\n for (const level of plan.levels) {\n for (const archive of level) {\n await Global.withRegistrationOwner(archive.pluginName, async () => {\n const platform = isTauriRuntime() ? 'tauri' : 'web'\n const factory = await loadPluginConfig(archive)\n if (!factory)\n throw new Error(`plugin entry has no default export: ${archive.pluginName}`)\n const config = factory({ safe: true, platform })\n if (config.name !== archive.pluginName) {\n throw new Error(`plugin name mismatch: ${archive.pluginName} / ${config.name}`)\n }\n const configStore = useConfig()\n await Promise.all(\n (config.config ?? []).map(pointer => configStore.$registerConfig(pointer).ready),\n )\n const cleanup = await config.onPreboot?.({ app, platform, safe: true })\n if (cleanup) this.prebootCleanups.set(config.name, cleanup)\n this.preparedPreboot.set(config.name, config)\n })\n }\n }\n pluginRuntimeLogger.info('preboot plugin preparation completed', { count: plugins.length })\n return { reloadRequired: false }\n } catch (error) {\n pluginRuntimeLogger.error('preboot plugin preparation failed', error)\n return await this.failPreboot(this.enabledPrebootNames, error)\n }\n }\n\n async activatePreboot(progress = ref<Record<string, PluginLoadingInfo>>({})) {\n if (this.prebootActivated) return { reloadRequired: false }\n try {\n pluginRuntimeLogger.info('preboot plugin activation started', {\n count: this.preparedPreboot.size,\n })\n for (const [name, config] of this.preparedPreboot) {\n await Global.withRegistrationOwner(name, async () => {\n await bootResolvedConfig(config, progress)\n })\n this.active.set(name, { config, kind: 'preboot' })\n this.activePrebootNames.add(name)\n this.preparedPreboot.delete(name)\n }\n this.preparedPreboot.clear()\n this.prebootActivated = true\n pluginRuntimeLogger.info('preboot plugin activation completed')\n return { reloadRequired: false }\n } catch (error) {\n pluginRuntimeLogger.error('preboot plugin activation failed', error)\n return await this.failPreboot(this.enabledPrebootNames, error)\n }\n }\n\n async uninstall(pluginName: string) {\n pluginRuntimeLogger.info('plugin uninstall started', { plugin: pluginName })\n const archive = await db\n .selectFrom('plugin')\n .selectAll()\n .where('pluginName', '=', pluginName)\n .executeTakeFirst()\n if (!archive) return\n if (isBuiltInPlugin(archive)) {\n throw new Error(`built-in plugin \"${pluginName}\" cannot be uninstalled`)\n }\n\n const errors: unknown[] = []\n const active = this.active.get(pluginName)\n if (active) {\n errors.push(...(await this.unloadOne(pluginName, active, true)))\n } else {\n let config: PluginConfig | undefined\n try {\n await Global.withRegistrationOwner(pluginName, async () => {\n const factory = await loadPluginConfig(archive)\n config = factory?.({ safe: true, platform: isTauriRuntime() ? 'tauri' : 'web' })\n await config?.onUninstall?.()\n })\n } catch (error) {\n errors.push(error)\n }\n if (config) {\n try {\n cleanupPlugin(config)\n } catch (error) {\n errors.push(error)\n }\n } else {\n Global.removeOwnedRegistrations(pluginName)\n }\n }\n\n await removePluginFiles(pluginName)\n await db.deleteFrom('plugin').where('pluginName', '=', pluginName).execute()\n await pluginStore.$refreshI18nNames()\n pluginStore.$touch()\n pluginRuntimeLogger.info('plugin uninstall completed', {\n cleanupErrorCount: errors.length,\n plugin: pluginName,\n })\n if (errors.length > 0) {\n throw new AggregateError(errors, `plugin \"${pluginName}\" was removed with cleanup errors`)\n }\n }\n\n readRecovery(): PrebootRecovery | null {\n try {\n const value = globalThis.localStorage?.getItem(recoveryKey)\n if (!value) return null\n return JSON.parse(value) as PrebootRecovery\n } catch (error) {\n pluginRuntimeLogger.warn('failed to read preboot recovery', error)\n return null\n }\n }\n\n clearRecovery() {\n try {\n globalThis.localStorage?.removeItem(recoveryKey)\n } catch (error) {\n pluginRuntimeLogger.warn('failed to clear preboot recovery', error)\n }\n }\n\n private trackNormalOperation(operation: Promise<void>) {\n this.normalOperation = operation\n void operation.then(\n () => {\n this.normalOperation = undefined\n pluginRuntimeLogger.info('normal plugin operation completed')\n },\n error => {\n this.normalOperation = undefined\n pluginRuntimeLogger.error('normal plugin operation failed', error)\n },\n )\n }\n\n private ensureBuiltInPlugins() {\n return (this.builtInSynchronization ??= import('../features/core/runtime').then(\n async ({ registerCoreRuntimeExtensions }) => {\n registerCoreRuntimeExtensions()\n await synchronizeBuiltInPlugins()\n },\n ))\n }\n\n private captureStartupSnapshot(plugins: PluginArchiveDB.Archive[]) {\n if (!this.startupSnapshotReady) this.startupPrebootNames.clear()\n for (const plugin of plugins) {\n if (this.startupPluginNames.has(plugin.pluginName)) continue\n this.startupPluginNames.add(plugin.pluginName)\n if (pluginKind(plugin) === 'preboot') this.startupPrebootNames.add(plugin.pluginName)\n }\n this.startupSnapshotReady = true\n }\n\n private async loadKind(\n kind: 'normal',\n progress: Ref<Record<string, PluginLoadingInfo>>,\n options: LoadNormalOptions,\n ) {\n await this.ensureBuiltInPlugins()\n await pluginStore.$refreshI18nNames()\n const allPlugins = await db\n .selectFrom('plugin')\n .where('enable', 'is', true)\n .selectAll()\n .execute()\n this.captureStartupSnapshot(allPlugins)\n const plugins = filterPluginsBySelection(\n selectPluginsForPhase(allPlugins, kind, this.startupPrebootNames, this.activePrebootNames),\n options.pluginNames ? new Set(options.pluginNames) : undefined,\n )\n const plan = planPluginLoadOrder(plugins)\n pluginRuntimeLogger.info('plugin load plan created', {\n levelCount: plan.levels.length,\n pluginCount: plugins.length,\n })\n const planError = formatPluginLoadPlanError(plan)\n if (planError) throw new Error(planError)\n\n const failed = new Set<string>()\n for (const level of plan.levels) {\n for (const archive of level) {\n const name = archive.pluginName\n progress.value[name] ??= createLoadingInfo()\n const blockedBy = failedDependencies(archive, failed)\n if (blockedBy.length > 0) {\n failed.add(name)\n progress.value[name].progress = {\n errorReason: pluginI18n.translate('plugin.runtime.errors.blockedDependencies', {\n plugins: blockedBy.join(', '),\n }),\n status: 'error',\n stepsIndex: 0,\n }\n continue\n }\n\n let config: PluginConfig | undefined\n try {\n await Global.withRegistrationOwner(name, async () => {\n const factory = await loadPluginConfig(archive)\n if (!factory) throw new Error(`plugin entry has no default export: ${name}`)\n config = factory({\n safe: globalThis.window?.$$safe$$ ?? true,\n platform: isTauriRuntime() ? 'tauri' : 'web',\n })\n if (config.name !== name) {\n throw new Error(`plugin name mismatch: ${name} / ${config.name}`)\n }\n await bootResolvedConfig(config, progress)\n })\n this.active.set(name, { config: config!, kind })\n } catch (error) {\n failed.add(name)\n if (config) {\n try {\n cleanupPlugin(config)\n } catch (cleanupError) {\n pluginRuntimeLogger.error('plugin rollback failed', { plugin: name }, cleanupError)\n }\n } else {\n Global.removeOwnedRegistrations(name)\n }\n const current = progress.value[name] ?? createLoadingInfo()\n progress.value[name] = {\n ...current,\n progress: { ...current.progress, errorReason: reasonText(error), status: 'error' },\n }\n pluginRuntimeLogger.error('plugin load failed', { plugin: name }, error)\n }\n }\n }\n }\n\n private async unloadKind(kind: ClientPluginKind) {\n const entries = [...this.active.entries()].filter(([, active]) => active.kind === kind)\n const errors: unknown[] = []\n pluginRuntimeLogger.info('plugin unload phase started', { count: entries.length, kind })\n for (const [name, active] of entries.reverse()) {\n errors.push(...(await this.unloadOne(name, active, false)))\n }\n pluginRuntimeLogger.info('plugin unload phase completed', { errorCount: errors.length, kind })\n return errors\n }\n\n private async unloadOne(name: string, active: ActivePlugin, uninstall: boolean) {\n const errors: unknown[] = []\n const attempt = async (action: (() => Promise<void> | void) | undefined) => {\n if (!action) return\n try {\n await action()\n } catch (error) {\n errors.push(error)\n }\n }\n\n await attempt(active.config.onUnload?.bind(active.config))\n if (uninstall) await attempt(active.config.onUninstall?.bind(active.config))\n await attempt(this.prebootCleanups.get(name))\n try {\n cleanupPlugin(active.config)\n } catch (error) {\n errors.push(error)\n }\n this.prebootCleanups.delete(name)\n this.preparedPreboot.delete(name)\n this.active.delete(name)\n this.activePrebootNames.delete(name)\n return errors\n }\n\n private async failPreboot(pluginNames: string[], error: unknown) {\n const cleanupErrors: unknown[] = []\n cleanupErrors.push(...(await this.unloadKind('preboot')))\n for (const [name, config] of [...this.preparedPreboot.entries()].reverse()) {\n try {\n await this.prebootCleanups.get(name)?.()\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n try {\n cleanupPlugin(config)\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n this.prebootCleanups.delete(name)\n }\n this.preparedPreboot.clear()\n this.activePrebootNames.clear()\n\n let disabled = true\n try {\n if (pluginNames.length > 0) {\n await db\n .updateTable('plugin')\n .set({ enable: false })\n .where('pluginName', 'in', pluginNames)\n .execute()\n }\n } catch (disableError) {\n disabled = false\n cleanupErrors.push(disableError)\n }\n\n const reasons = [reasonText(error), ...cleanupErrors.map(reasonText)]\n const recovery: PrebootRecovery = {\n failedAt: Date.now(),\n plugins: pluginNames,\n reason: reasons.join('\\n'),\n }\n try {\n globalThis.localStorage?.setItem(recoveryKey, JSON.stringify(recovery))\n } catch (storageError) {\n pluginRuntimeLogger.warn('failed to persist preboot recovery', storageError)\n }\n this.prebootActivated = true\n return { reloadRequired: disabled }\n }\n}\n\nexport const pluginRuntime = new PluginRuntime()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type { PluginConfig, PluginConfigFactory } from '@/plugin'\n\nexport interface PluginInstallerDescription {\n title: string\n description: string\n}\nexport abstract class PluginInstaller {\n /**\n * @returns string mean redirect\n */\n public abstract download(input: string): Promise<File | string>\n /**\n * @returns string mean redirect\n */\n public abstract update(pluginMeta: PluginArchiveDB.Archive): Promise<File | string>\n /**\n * @returns string mean redirect\n */\n public abstract fetchPluginMetaFile(input: string): Promise<File | string>\n\n public abstract isMatched(input: string): boolean\n public abstract name: string\n public abstract description: PluginInstallerDescription\n}\n\nexport abstract class PluginLoader {\n public abstract name: string\n public abstract load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined>\n public abstract install(\n file: File,\n context?: PluginLoaderInstallContext,\n ): Promise<PluginArchiveDB.Meta>\n public abstract canInstall(file: File): boolean\n\n /** need full download */\n public abstract decodeMeta(file: File): Promise<PluginArchiveDB.Meta>\n /** no need full download */\n public abstract decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string>\n public abstract isMetaFile(file: File): boolean\n}\n\nexport interface PluginLoaderInstallContext {\n report: (progress: PluginLoaderInstallProgress) => void\n}\n\nexport interface PluginLoaderInstallProgress {\n description?: string\n progress?: number\n}\n\nexport type PluginBooterSetMeta = (\n meta: Partial<{ description: string; name: string }> | string,\n) => void\n\nexport abstract class PluginBooter {\n public abstract name: string\n public abstract call(\n cfg: PluginConfig,\n setMeta: PluginBooterSetMeta,\n env: Record<any, any>,\n ): Promise<any>\n}","import { PluginArchiveDB, db } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { createDownloadMessage, type DownloadMessageBind } from '@delta-comic/ui'\nimport { isString } from 'es-toolkit'\n\nimport { useConfig } from '@/config'\nimport { pluginI18n } from '@/i18n'\n\nimport { isBuiltInPlugin, isBuiltInPluginName } from './builtIn'\nimport { runtimeExtensions } from './extensions'\nimport { loaders } from './loader'\nimport { pluginRuntime } from './runtime'\nimport { pluginStore } from './store'\n\nconst pluginInstallLogger = logger.scoped('plugin:install')\n\nconst clampProgress = (progress: number) => Math.min(100, Math.max(0, progress))\n\nexport const installers = runtimeExtensions.installers.values\n\nexport const installDepends = (\n m: DownloadMessageBind,\n meta: PluginArchiveDB.Meta,\n installedPlugins?: Set<string>,\n) =>\n m.createLoading(pluginI18n.translate('plugin.progress.dependencies.checking'), async v => {\n v.retryable = true\n let count = 0\n const plugins =\n installedPlugins ??\n new Set((await db.selectFrom('plugin').select('pluginName').execute()).map(v => v.pluginName))\n const overrides = useConfig().$loadApp().data.value.installOverride\n for (const { id, download } of meta.require) {\n const isDownloaded = plugins.has(id)\n if (isDownloaded || !download) continue\n pluginInstallLogger.info('installing missing plugin dependency', {\n dependency: id,\n plugin: meta.name.id,\n })\n v.description = pluginI18n.translate('plugin.progress.dependencies.installing', { id })\n const downloadCommend = overrides.find(c => c.key == id)?.value ?? download\n await installPlugin(downloadCommend)\n count++\n }\n v.description = pluginI18n.translate('plugin.progress.dependencies.complete', { count })\n })\n\nconst installPluginFile = async (\n m: DownloadMessageBind,\n file: File,\n installerName: string,\n installInput: string,\n __installedPlugins?: Set<string>,\n) => {\n pluginInstallLogger.info('plugin archive installation started', { installer: installerName })\n const meta = await m.createProgress(\n pluginI18n.translate('plugin.progress.installing'),\n async v => {\n v.retryable = true\n const loader = loaders.filter(ins => ins.canInstall(file)).at(-1)\n if (!loader) throw new Error(pluginI18n.translate('plugin.install.errors.noInstaller'))\n v.description = loader.name\n v.progress = 0\n\n const meta = await loader.install(file, {\n report(progress) {\n if (progress.description) v.description = progress.description\n if (typeof progress.progress === 'number') v.progress = clampProgress(progress.progress)\n },\n })\n if (isBuiltInPluginName(meta.name.id)) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.reservedId', { id: meta.name.id }),\n )\n }\n\n v.description = pluginI18n.translate('plugin.progress.persisting')\n v.progress = 95\n await pluginStore.$upsertArchives([\n {\n displayName: meta.name.display,\n enable: true,\n installerName,\n installInput,\n loaderName: loader.name,\n meta,\n pluginName: meta.name.id,\n },\n ])\n v.progress = 100\n return meta\n },\n )\n pluginInstallLogger.info('plugin archive installed', { plugin: meta.name.id })\n\n await installDepends(m, meta, __installedPlugins)\n}\n\nexport const installPlugin = (input: string, __installedPlugins?: Set<string>) =>\n createDownloadMessage(\n pluginI18n.translate('plugin.progress.downloadTitle', { input }),\n async m => {\n const [file, installer] = await m.createLoading(\n pluginI18n.translate('plugin.progress.downloading'),\n async v => {\n v.retryable = true\n let dlCommend = input\n for (;;) {\n const installer = installers.filter(ins => ins.isMatched(dlCommend)).at(0)\n if (!installer) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.noDownloader', { input: dlCommend }),\n )\n }\n v.description = installer.name\n const meta = await installer.download(dlCommend)\n if (isString(meta)) dlCommend = meta\n else return [meta, installer] as const\n }\n },\n )\n\n await installPluginFile(m, file, installer.name, input, __installedPlugins)\n },\n )\n\nexport const installFilePlugin = (file: File, __installedPlugins?: Set<string>) =>\n createDownloadMessage(\n pluginI18n.translate('plugin.progress.installTitle', { file: file.name }),\n async m => {\n await installPluginFile(m, file, '', '', __installedPlugins)\n },\n )\n\nexport const updatePlugin = async (\n pluginMeta: PluginArchiveDB.Archive,\n __installedPlugins?: Set<string>,\n) => {\n if (isBuiltInPlugin(pluginMeta)) {\n throw new Error(pluginI18n.translate('plugin.install.errors.builtInUpdate'))\n }\n return createDownloadMessage(\n pluginI18n.translate('plugin.progress.updateTitle', { plugin: pluginMeta.pluginName }),\n async m => {\n pluginInstallLogger.info('plugin update started', { plugin: pluginMeta.pluginName })\n const file = await m.createLoading(\n pluginI18n.translate('plugin.progress.updating'),\n async v => {\n v.retryable = true\n let installerName = pluginMeta.installerName\n for (;;) {\n const installer = installers.find(v => v.name == installerName)\n if (!installer)\n throw new Error(pluginI18n.translate('plugin.install.errors.noDownloader'))\n v.description = installer.name\n const file = await installer.update(pluginMeta)\n if (isString(file)) installerName = file\n else return file\n }\n },\n )\n\n const meta = await m.createProgress(\n pluginI18n.translate('plugin.progress.installing'),\n async v => {\n v.retryable = true\n const loader = loaders.find(v => v.name == pluginMeta.loaderName)\n if (!loader) throw new Error(pluginI18n.translate('plugin.install.errors.noInstaller'))\n v.description = loader.name\n v.progress = 0\n const meta = await loader.install(file, {\n report(progress) {\n if (progress.description) v.description = progress.description\n if (typeof progress.progress === 'number')\n v.progress = clampProgress(progress.progress)\n },\n })\n v.progress = 100\n return meta\n },\n )\n\n await pluginStore.$upsertArchives([{ ...pluginMeta, meta }])\n\n await installDepends(m, meta, __installedPlugins)\n pluginInstallLogger.info('plugin update completed', { plugin: pluginMeta.pluginName })\n },\n )\n}\n\nexport const uninstallPlugin = (pluginName: string) => pluginRuntime.uninstall(pluginName)","import { h } from 'vue'\nimport type { FunctionalComponent } from 'vue'\n\nexport const OfflineShareRound: FunctionalComponent = () =>\n h(\n 'svg',\n {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n 'viewBox': '0 0 24 24',\n },\n [\n h('path', {\n d: 'M5 5c-.55 0-1 .45-1 1v15c0 1.1.9 2 2 2h9c.55 0 1-.45 1-1s-.45-1-1-1H6V6c0-.55-.45-1-1-1z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M18 1h-8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 14h-8V5h8v10z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M12.5 10.25h2v.54c0 .45.54.67.85.35l1.29-1.29c.2-.2.2-.51 0-.71l-1.29-1.29a.5.5 0 0 0-.85.35v.54H12c-.55 0-1 .45-1 1v1.5c0 .41.34.75.75.75s.75-.34.75-.75v-.99z',\n fill: 'currentColor',\n }),\n ],\n )\n\nexport const TagOutlined: FunctionalComponent = () =>\n h(\n 'svg',\n {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n 'viewBox': '0 0 1024 1024',\n },\n [\n h('path', {\n d: 'M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8c1.9 1.9 4.4 2.9 7.1 2.9s5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM459.7 834.7L189.3 564.3L589 164.6L836 188l23.4 247l-399.7 399.7zM680 256c-48.5 0-88 39.5-88 88s39.5 88 88 88s88-39.5 88-88s-39.5-88-88-88zm0 120c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z',\n fill: 'currentColor',\n }),\n ],\n )","import { SourcedKeyMap, UniContentPage } from '@delta-comic/model'\nimport { environmentRegistry } from '@delta-comic/ui'\nimport { SharedFunction } from '@delta-comic/utils'\nimport { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from 'lz-string'\nimport { shallowReactive, type Component, type Raw } from 'vue'\n\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { Search, Share, Subscribe, User } from '@/plugin'\n\nimport { usePluginStore } from './driver'\nimport { runtimeExtensions } from './driver/extensions'\nimport { OfflineShareRound, TagOutlined } from './driver/icon'\n\nclass _Global {\n public share = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Share.InitiativeItem>(),\n )\n public shareToken = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Share.ShareToken>(),\n )\n public userActions = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], User.UserAction>(),\n )\n public subscribes = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Subscribe.Config>(),\n )\n public globalNodes = shallowReactive(new Array<Raw<Component>>())\n\n private readonly globalNodeOwners = new Map<Raw<Component>, string>()\n private readonly registrationOwners: string[] = []\n\n /**\n * Associates global registrations made by a plugin with that plugin. The runtime\n * deliberately loads plugins serially while this ambient scope is active.\n */\n public async withRegistrationOwner<T>(plugin: string, action: () => Promise<T>): Promise<T> {\n this.registrationOwners.push(plugin)\n try {\n return await runtimeExtensions.withOwner(plugin, () =>\n environmentRegistry.withOwner(plugin, action),\n )\n } finally {\n this.registrationOwners.pop()\n }\n }\n\n private get registrationOwner() {\n return this.registrationOwners.at(-1)\n }\n\n public addGlobalNode(component: Raw<Component>, plugin = this.registrationOwner) {\n this.globalNodes.push(component)\n if (plugin) this.globalNodeOwners.set(component, plugin)\n return component\n }\n\n /** Removes only registrations owned by the requested plugin. */\n public removeOwnedRegistrations(plugin: string) {\n for (let index = this.globalNodes.length - 1; index >= 0; index--) {\n const component = this.globalNodes[index]\n if (this.globalNodeOwners.get(component) !== plugin) continue\n this.globalNodes.splice(index, 1)\n this.globalNodeOwners.delete(component)\n }\n environmentRegistry.removeOwner(plugin)\n runtimeExtensions.removeOwner(plugin)\n }\n\n public tabbar = shallowReactive(new Map<string, Search.Tabbar[]>())\n public addTabbar(plugin: string, ...tabbar: Search.Tabbar[]) {\n const old = this.tabbar.get(plugin) ?? []\n this.tabbar.set(plugin, old.concat(tabbar))\n }\n\n public categories = shallowReactive(new Map<string, Search.Category[]>())\n public addCategories(plugin: string, ...categories: Search.Category[]) {\n const old = this.categories.get(plugin) ?? []\n this.categories.set(plugin, old.concat(categories))\n }\n\n public barcode = shallowReactive(new Map<string, Search.Barcode[]>())\n public addBarcode(plugin: string, ...barcode: Search.Barcode[]) {\n const old = this.barcode.get(plugin) ?? []\n this.barcode.set(plugin, old.concat(barcode))\n }\n\n public hotSearch = shallowReactive(new Map<string, Search.HotSearchProvider[]>())\n public addHotSearch(plugin: string, ...providers: Search.HotSearchProvider[]) {\n const old = this.hotSearch.get(plugin) ?? []\n this.hotSearch.set(plugin, old.concat(providers))\n }\n\n public levelboard = shallowReactive(new Map<string, Search.HotLevelboard[]>())\n public addLevelboard(plugin: string, ...levelboard: Search.HotLevelboard[]) {\n const old = this.levelboard.get(plugin) ?? []\n this.levelboard.set(plugin, old.concat(levelboard))\n }\n\n public topButton = shallowReactive(new Map<string, Search.HotTopButton[]>())\n public addTopButton(plugin: string, ...topButton: Search.HotTopButton[]) {\n const old = this.topButton.get(plugin) ?? []\n this.topButton.set(plugin, old.concat(topButton))\n }\n\n public mainLists = shallowReactive(new Map<string, Search.HotMainList[]>())\n public addMainList(plugin: string, ...mainLists: Search.HotMainList[]) {\n const old = this.mainLists.get(plugin) ?? []\n this.mainLists.set(plugin, old.concat(mainLists))\n }\n}\n\nexport const Global = new _Global()\n\n// share\n\ninterface CorePluginTokenShareMeta {\n item: { name: string; contentType: string; ep: string }\n plugin: string\n id: string\n}\n\nGlobal.share.set(['core', 'token'], {\n filter: page => !!page.preload,\n icon: TagOutlined,\n key: 'token',\n name: pluginMessageKey('plugin.share.copyToken'),\n async call(page) {\n const item = page.preload?.toJSON()\n if (!item) throw new Error('Not found preload in content. Maybe not fetch detail?')\n\n const compressed = compressToEncodedURIComponent(\n JSON.stringify(<CorePluginTokenShareMeta>{\n item: {\n contentType: UniContentPage.contentPages.key.toString(item.contentType),\n ep: item.thisEp.id,\n name: item.title,\n },\n plugin: page.plugin,\n id: page.id,\n }),\n )\n return { token: `[${item.title}](复制这条口令,打开Delta Comic)${compressed}` }\n },\n})\n\nGlobal.share.set(['core', 'native'], {\n filter: page => !!page.preload,\n icon: OfflineShareRound,\n key: 'native',\n name: pluginMessageKey('plugin.share.native'),\n async call(page) {\n const item = page.preload?.toJSON()\n if (!item) throw new Error('Not found preload in content. Maybe not fetch detail?')\n\n const compressed = compressToEncodedURIComponent(\n JSON.stringify(<CorePluginTokenShareMeta>{\n item: {\n contentType: UniContentPage.contentPages.key.toString(item.contentType),\n ep: item.thisEp.id,\n name: item.title,\n },\n plugin: page.plugin,\n id: page.id,\n }),\n )\n const token = `[${item.title}](复制这条口令,打开Delta Comic)${compressed}`\n await navigator.share({ title: pluginI18n.translate('plugin.share.nativeTitle'), text: token })\n\n return { token }\n },\n})\n\nGlobal.shareToken.set(['core', 'token'], {\n key: 'token',\n name: pluginMessageKey('plugin.share.defaultToken'),\n patten(chipboard) {\n return /^\\[.+\\]\\(复制这条口令,打开Delta Comic\\).+/.test(chipboard)\n },\n show(chipboard) {\n const pluginStore = usePluginStore()\n const meta: CorePluginTokenShareMeta = JSON.parse(\n decompressFromEncodedURIComponent(\n chipboard.replace(/^\\[.+\\]/, '').replaceAll('(复制这条口令,打开Delta Comic)', ''),\n ),\n )\n return {\n title: pluginI18n.translate('plugin.share.tokenTitle'),\n detail: pluginI18n.translate('plugin.share.tokenDetail', {\n item: meta.item.name,\n plugin: pluginStore.$getI18nName(meta.plugin),\n }),\n onNegative() {},\n onPositive() {\n return SharedFunction.call(\n 'routeToContent',\n UniContentPage.contentPages.key.toJSON(meta.item.contentType),\n meta.id,\n meta.item.ep,\n )\n },\n }\n },\n})"],"mappings":";;;;;;;;;;;;;;;AAmFA,MAAa,gBACX,WAC2B;CAC3B,IAAI,WAAW,MAAM,GAAG,OAAO;CAC/B,aAAa;AACf;;AAeA,MAAa,qBAA6C,eACxD;;;ACjGF,IAAa,gBAAb,MAA4E;CAIjE;CACA;CACA;CALT;CAEA,YACE,YACA,QACA,YACA;EAHO,KAAA,aAAA;EACA,KAAA,SAAA;EACA,KAAA,aAAA;EAEP,KAAK,MAAM,OAAO,IAAI,UAAU,YAAY;CAC9C;AACF;;;ACfA,MAAa,aAAa,IAAI,cAC5B,QACA;CACE,eAAe;EAAE,MAAM;EAAU,cAAc;EAAM,MAAM;CAA8B;CACzF,eAAe;EAAE,MAAM;EAAU,cAAc;EAAM,MAAM;CAA4B;CACvF,UAAU;EACR,MAAM;EACN,cAAc;EACd,MAAM;EACN,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAA6B,OAAO;GAAQ;GACrD;IAAE,OAAO;IAA4B,OAAO;GAAO;GACnD;IAAE,OAAO;IAA+B,OAAO;GAAS;EAC1D;CACF;CACA,UAAU;EACR,MAAM;EACN,cAAc;EACd,MAAM;EACN,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAA+B,OAAO;GAAQ;GACvD;IAAE,OAAO;IAA+B,OAAO;GAAQ;GACvD;IAAE,OAAO;IAA+B,OAAO;GAAQ;GACvD;IAAE,OAAO;IAA+B,OAAO;GAAS;EAC1D;CACF;CACA,aAAa;EAAE,MAAM;EAAU,cAAc;EAAO,MAAM;CAAgC;CAC1F,aAAa;EACX,MAAM;EACN,cAAc;EACd,MAAM;EACN,aAAa;CACf;CACA,yBAAyB;EACvB,MAAM;EACN,cAAc;EACd,MAAM;CACR;CACA,cAAc;EAAE,MAAM;EAAU,cAAc;EAAO,MAAM;CAA8B;CACzF,gBAAgB;EACd,MAAM;EACN,cAAc;EACd,MAAM;EACN,aAAa;CACf;CACA,iBAAiB;EACf,MAAM;EACN,cAAc,CAAC;EACf,MAAM;EACN,UAAU;CACZ;AACF,GACA,qBACF;;;ACzCA,IAAa,cAAb,MAAyB;CACvB,OAAuB,gCAAgB,IAAI,IAA6B,CAAC;CACzE,WAA4B,eAAe;EACzC,IAAI,CAAC,KAAK,eAAe,UAAU,GAAG,OAAO,KAAK;EAElD,QADe,KAAK,MAAM,UAAU,CAAC,CAAC,KAAK,MAC5B,UAAf;GACE,KAAK,SACH,OAAO;GACT,KAAK,QACH,OAAO;GAET,SACE,OAAO,KAAK;EAChB;CACF,CAAC;CAED,eACE,WAAW,aAAa,8BAA8B,CAAC,CAAC,WAAW;CAErE,IAAW,SAAS;EAClB,OAAO,KAAK,SAAS;CACvB;CAEA,cAAqB;EAEnB,KAAK,gBAAgB,UAAU;CACjC;CAEA,MAAsC,SAAiD;EACrF,MAAM,QAAQ,KAAK,KAAK,IAAI,QAAQ,GAAG;EACvC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,+BAA+B,QAAQ,WAAW,EAAE;EAChF,OAAO;CACT;CAEA,WAAkB;EAChB,OAAO,KAAK,MAAM,UAAU;CAC9B;CAEA,eAAsB,SAAwB;EAC5C,OAAO,KAAK,KAAK,IAAI,QAAQ,GAAG;CAClC;CAEA,gBAAuB,SAAwB;EAC7C,MAAM,aAAa,KAAK,KAAK,IAAI,QAAQ,GAAG;EAC5C,IAAI,YAAY,OAAO;EAEvB,MAAM,QAAQA,UAAY,QAAQ,YAAY,QAAQ,MAAM;EAC5D,MAAM,QAAyB;GAC7B,MAAM,QAAQ;GACd,MAAM;GACN,MAAM,QAAQ;GACd,OAAQ,MAAkD;EAC5D;EACA,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;EAChC,OAAO;CACT;;CAGA,gBAAuB,SAAwB;EAC7C,OAAO,KAAK,gBAAgB,OAAO;CACrC;CAEA,kBAAyB,SAAwB;EAC/C,KAAK,KAAK,OAAO,QAAQ,GAAG;CAC9B;AACF;AAEA,IAAI;AACJ,MAAaC,oBAAmB,gBAAgB,IAAI,YAAY;;;ACjFhE,MAAa,gBAAgB,SAAiB,OAAO,IAAI,UAAU,MAAM;AAEzE,MAAa,kBAAqB,SAAkC,aAAa,IAAI;AAErF,IAAa,qBAAb,MAAgC;CACK;CAAnC,YAAmB,0BAA0B,IAAI,IAAqB,GAAG;EAAtC,KAAA,UAAA;CAAuC;CAE1E,QAAkB,QAAyB,OAAU;EACnD,KAAK,QAAQ,IAAI,QAAQ,KAAK;EAC9B,OAAO;CACT;CAEA,QAAkB,QAA4B;EAC5C,IAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,GAAG;GAC7B,MAAM,OAAO,OAAO,OAAO,MAAM,KAAK,OAAO,eAAe,OAAO,SAAS;GAC5E,MAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE;EACrD;EACA,OAAO,KAAK,QAAQ,IAAI,MAAM;CAChC;CAEA,IAAW,QAA+B;EACxC,OAAO,KAAK,QAAQ,IAAI,MAAM;CAChC;CAEA,OAAc,QAA+B;EAC3C,OAAO,KAAK,QAAQ,OAAO,MAAM;CACnC;CAEA,QAAe;EACb,KAAK,QAAQ,MAAM;CACrB;AACF;AAIA,MAAa,gCAAgB,IAAI,IAAqB;AACtD,MAAa,4BAA4B,IAAI,mBAAmB,aAAa;AAC7E,MAAa,iCAAiC,IAAI,mBAAmB;AAErE,MAAa,WAAc,QAAyB,UAClD,0BAA0B,QAAQ,QAAQ,KAAK;AAEjD,MAAa,WAAc,WAA+B,0BAA0B,QAAQ,MAAM;;;AClClG,MAAM,mBAAmB;AAEzB,MAAM,6BAAa,IAAI,IAAI;CAAC;CAAa;CAAe;AAAW,CAAC;AAEpE,MAAM,iBACJ,QACA,WACwB;CACxB,IAAI,CAAC,QAAQ,OAAO;CACpB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,WAAW,IAAI,GAAG,GAAG;EACzB,IAAI,OAAO,UAAU,UAAU;GAC7B,OAAO,OAAO;GACd;EACF;EACA,MAAM,UAAU,OAAO;EACvB,OAAO,OAAO,cAAc,OAAO,YAAY,WAAW,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,KAAK;CACtF;CACA,OAAO;AACT;AAEA,IAAa,qBAAb,MAAgC;CAC9B;CACA,eAA6C,CAAC;CAC9C,iCAAkC,IAAI,IAAkC;CAExE,QAAe,SAA4B,cAAoC;EAC7E,KAAK,UAAU;EACf,KAAK,eAAe;EACpB,KAAK,QAAQ,KAAK,QAAQ,CAAC;CAC7B;CAEA,SAAgB,QAAgB,UAAgC;EAC9D,MAAM,WAAW,KAAK,eAAe,IAAI,MAAM;EAC/C,KAAK,eAAe,OAAO,MAAM;EACjC,KAAK,eAAe,IAAI,QAAQ,QAAQ;EACxC,KAAK,wBAAQ,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,GAAG,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC;CAClF;CAEA,OAAc,QAAgB;EAC5B,MAAM,WAAW,KAAK,eAAe,IAAI,MAAM;EAC/C,IAAI,CAAC,UAAU;EACf,KAAK,eAAe,OAAO,MAAM;EACjC,KAAK,QAAQ,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC;CAC7C;CAEA,UAAiB,KAAa,QAA0C;EACtE,OAAO,KAAK,SAAS,YAAY,KAAK,MAAM,KAAK;CACnD;CAEA,QAAgB,QAAgB;EAC9B,MAAM,UAAU,cAAc,CAAC,GAAG,KAAK,aAAa,OAAO;EAC3D,KAAK,MAAM,YAAY,KAAK,eAAe,OAAO,GAAG,cAAc,SAAS,SAAS,OAAO;EAC5F,OAAO;CACT;CAEA,UAAkB;EAChB,MAAM,UAAU,IAAI,IAAI,OAAO,KAAK,KAAK,YAAY,CAAC;EACtD,KAAK,MAAM,YAAY,KAAK,eAAe,OAAO,GAChD,KAAK,MAAM,UAAU,OAAO,KAAK,QAAQ,GAAG,QAAQ,IAAI,MAAM;EAEhE,OAAO;CACT;CAEA,QAAgB,SAA2B;EACzC,IAAI,CAAC,KAAK,SAAS;EACnB,KAAK,MAAM,UAAU,SAAS,KAAK,QAAQ,iBAAiB,QAAQ,KAAK,QAAQ,MAAM,CAAC;CAC1F;AACF;AAEA,MAAa,aAAa,IAAI,mBAAmB;AAEjD,MAAa,oBAAoB,QAAgB,GAAG,mBAAmB;AAEvE,MAAa,uBAAuB,UAClC,MAAM,WAAW,gBAAgB,IAC7B,WAAW,UAAU,MAAM,MAAM,CAAuB,CAAC,IACzD;;;AChFN,MAAM,oBAAoB,OAAO,OAAO,cAAc;AAEtD,IAAa,cAAb,MAAyB;CACvB,UAA0B,gCAAgB,IAAI,IAA+B,CAAC;;CAE9E,QAAwB,gCAAgB,IAAI,IAAY,CAAC;CACzD,WAA2B,WAAW,CAAC;CACvC,cAA+B,gCAAgB,IAAI,IAAoB,CAAC;;;;;;;CAQxE,UAAiB,QAAgB;EAC/B,OAAO,KAAK,MAAM,IAAI,MAAM;CAC9B;;CAGA,aAAoB,QAAgB;EAClC,KAAK,MAAM,OAAO,MAAM;CAC1B;;CAGA,WAAkB,QAAgB;EAChC,KAAK,MAAM,IAAI,MAAM;CACvB;;CAGA,cAAqB,QAAgB;EACnC,KAAK,MAAM,OAAO,MAAM;CAC1B;CAEA,MAAa,oBAAoB;EAC/B,MAAM,QAAQ,MAAM,GAAG,WAAW,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc,aAAa,CAAC,CAAC,CAAC,QAAQ;EAC1F,KAAK,YAAY,MAAM;EACvB,KAAK,MAAM,UAAU,OAAO,KAAK,YAAY,IAAI,OAAO,YAAY,OAAO,WAAW;EACtF,kBAAkB,MAAM,kCAAkC,EAAE,OAAO,MAAM,OAAO,CAAC;CACnF;CAEA,aAAoB,KAAa;EAC/B,OAAO,oBAAoB,KAAK,YAAY,IAAI,GAAG,KAAK,GAAG;CAC7D;CAEA,MAAa,gBAAgB,UAAqC;EAChE,IAAI,SAAS,WAAW,GAAG;EAC3B,MAAM,GACH,YAAY,QAAQ,CAAC,CACrB,OAAO,SAAS,KAAI,aAAY;GAAE,GAAG;GAAS,MAAM,KAAK,UAAU,QAAQ,IAAI;EAAE,EAAE,CAAC,CAAC,CACrF,QAAQ;EACX,MAAM,KAAK,kBAAkB;EAC7B,KAAK,OAAO;EACZ,kBAAkB,KAAK,6BAA6B,EAAE,OAAO,SAAS,OAAO,CAAC;CAChF;CAEA,SAAgB;EACd,KAAK,SAAS;CAChB;AACF;AAEA,MAAa,cAAc,IAAI,YAAY;AAC3C,MAAa,uBAAuB;;;ACvDpC,MAAM,sBAAsB,WAC1B,OAAO,KAAK,QAAQ,KAAI,QAAO,IAAI,EAAE;AAEvC,MAAM,qBAAqB,UAAoB;CAC7C,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;CAC/B,MAAM,YAAY,MAAM,KAAK,GAAG,UAAU,MAAM,MAAM,KAAK,CAAC,CAAC,OAAO,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;CAC1F,UAAU,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,CAAC;CACjE,OAAO,UAAU,EAAE,CAAC,KAAK,IAAI;AAC/B;AAEA,MAAa,kBAAkB,YAAmD;CAChF,MAAM,cAAc,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,UAAU,CAAC;CACpE,MAAM,eAAe,IAAI,IACvB,QAAQ,KAAI,WAAU,CACpB,OAAO,YACP,mBAAmB,MAAM,CAAC,CAAC,QAAO,QAAO,YAAY,IAAI,GAAG,CAAC,CAC/D,CAAC,CACH;CAEA,MAAM,wBAAQ,IAAI,IAAoC;CACtD,MAAM,OAAiB,CAAC;CACxB,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,SAAqB,CAAC;CAE5B,MAAM,SAAS,eAAuB;EACpC,MAAM,IAAI,YAAY,UAAU;EAChC,KAAK,KAAK,UAAU;EAEpB,KAAK,MAAM,kBAAkB,aAAa,IAAI,UAAU,KAAK,CAAC,GAAG;GAC/D,MAAM,kBAAkB,MAAM,IAAI,cAAc;GAChD,IAAI,oBAAoB,YAAY;IAClC,MAAM,aAAa,KAAK,YAAY,cAAc;IAClD,IAAI,eAAe,IAAI;IAEvB,MAAM,QAAQ,KAAK,MAAM,UAAU,CAAC,CAAC,OAAO,cAAc;IAC1D,MAAM,MAAM,kBAAkB,KAAK;IACnC,IAAI,CAAC,UAAU,IAAI,GAAG,GAAG;KACvB,UAAU,IAAI,GAAG;KACjB,OAAO,KAAK,KAAK;IACnB;IACA;GACF;GAEA,IAAI,oBAAoB,WAAW,MAAM,cAAc;EACzD;EAEA,KAAK,IAAI;EACT,MAAM,IAAI,YAAY,SAAS;CACjC;CAEA,KAAK,MAAM,UAAU,SACnB,IAAI,CAAC,MAAM,IAAI,OAAO,UAAU,GAAG,MAAM,OAAO,UAAU;CAG5D,OAAO;AACT;AAEA,MAAa,uBAAuB,YAAuD;CACzF,MAAM,eAAe,IAAI,IAAI,QAAQ,KAAI,WAAU,CAAC,OAAO,YAAY,MAAM,CAAC,CAAC;CAC/E,MAAM,2BAAW,IAAI,IAAoB;CACzC,MAAM,4BAAY,IAAI,IAAsB;CAC5C,MAAM,UAAqC,CAAC;CAE5C,KAAK,MAAM,UAAU,SAAS;EAE5B,MAAM,wBADe,mBAAmB,MACC,CAAC,CAAC,QAAO,mBAAkB;GAClE,MAAM,cAAc,aAAa,IAAI,cAAc;GACnD,IAAI,CAAC,aAAa,QAAQ,KAAK;IAAE,YAAY,OAAO;IAAY;GAAe,CAAC;GAChF,OAAO;EACT,CAAC;EAED,SAAS,IAAI,OAAO,YAAY,sBAAsB,MAAM;EAC5D,KAAK,MAAM,kBAAkB,uBAAuB;GAClD,MAAM,aAAa,UAAU,IAAI,cAAc,KAAK,CAAC;GACrD,WAAW,KAAK,OAAO,UAAU;GACjC,UAAU,IAAI,gBAAgB,UAAU;EAC1C;CACF;CAEA,MAAM,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC,CAClC,QAAQ,GAAG,YAAY,WAAW,CAAC,CAAC,CACpC,KAAK,CAAC,gBAAgB,UAAU;CAEnC,MAAM,SAAsC,CAAC;CAC7C,OAAO,MAAM,SAAS,GAAG;EACvB,MAAM,YAAY,MAAM;EACxB,MAAM,QAAmC,CAAC;EAE1C,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,SAAS;GAC9C,MAAM,aAAa,MAAM,MAAM;GAC/B,IAAI,CAAC,YAAY;GAEjB,MAAM,SAAS,aAAa,IAAI,UAAU;GAC1C,IAAI,QAAQ,MAAM,KAAK,MAAM;GAE7B,KAAK,MAAM,iBAAiB,UAAU,IAAI,UAAU,KAAK,CAAC,GAAG;IAC3D,MAAM,aAAa,SAAS,IAAI,aAAa,KAAK,KAAK;IACvD,SAAS,IAAI,eAAe,SAAS;IACrC,IAAI,cAAc,GAAG,MAAM,KAAK,aAAa;GAC/C;EACF;EAEA,IAAI,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK;CACzC;CAEA,MAAM,aAAa,QAAQ,QAAO,YAAW,SAAS,IAAI,OAAO,UAAU,KAAK,KAAK,CAAC;CAGtF,OAAO;EAAE;EAAQ;EAAS,QAFX,eAAe,UAEC;CAAE;AACnC;AAIA,MAAa,6BACX,MACA,aAAsC,KAAK,WAAW,WAAW,UAAU,KAAK,MAAM,MACnF;CACH,MAAM,WAAqB,CAAC;CAE5B,IAAI,KAAK,QAAQ,SAAS,GAAG;EAC3B,MAAM,UAAU,KAAK,QAClB,KAAK,EAAE,YAAY,qBAAqB,GAAG,WAAW,MAAM,gBAAgB,CAAC,CAC7E,KAAK,IAAI;EACZ,SAAS,KAAK,UAAU,6CAA6C,EAAE,QAAQ,CAAC,CAAC;CACnF;CAEA,IAAI,KAAK,OAAO,SAAS,GAAG;EAC1B,MAAM,QAAQ,KAAK,OAAO,KAAI,SAAQ,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;EAClE,SAAS,KAAK,UAAU,0CAA0C,EAAE,MAAM,CAAC,CAAC;CAC9E;CAEA,OAAO,SAAS,KAAK,MAAM;AAC7B;;;AC5IA,IAAA,kBAAe,kBAAkB;CAC/B,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,aAAa,iBAAiB,yBAAyB;EACvD,SAAS,CAAC;EACV,MAAM;GAAE,SAAS,iBAAiB,qBAAqB;GAAG,IAAI;EAAO;EACrE,SAAS;GAAE,QAAQ;GAAS,aAAa;EAAI;CAC/C;CACA,kBAAkB;CAClB,eAAe;EAAE,MAAM;EAAQ,QAAQ,CAAC,UAAU;CAAE;AACtD,CAAC;;;AChBD,MAAM,iBAAiC,uBAAO,OAAO,EAAC,qBAAqBC,gBAG3E,CAAC;AAED,MAAa,+BACX,gBACiD;CACjD,MAAM,2BAAW,IAAI,IAAqC;CAC1D,KAAK,MAAM,cAAc,aAAa;EACpC,MAAM,aAAa,WAAW,KAAK,KAAK;EACxC,IAAI,CAAC,YAAY,MAAM,IAAI,MAAM,oCAAoC;EACrE,IAAI,SAAS,IAAI,UAAU,GAAG,MAAM,IAAI,MAAM,8BAA8B,YAAY;EACxF,SAAS,IAAI,YAAY,UAAU;CACrC;CACA,OAAO;AACT;AAEA,MAAa,wBAAwB,4BAA4B,OAAO,OAAO,cAAc,CAAC;;;ACd9F,MAAM,gBAAgB,OAAO,OAAO,gBAAgB;AAEpD,MAAa,yBAAyB;AAEtC,MAAa,uBAAuB,eAAuB,sBAAsB,IAAI,UAAU;AAE/F,MAAa,mBAAmB,WAC9B,OAAO,eAAe;AAExB,MAAa,8BACX,YACA,SAAS,WAAW,oBAAoB,UACX;CAC7B,aAAa,WAAW,KAAK,KAAK;CAClC;CACA,eAAe;CACf,cAAc;CACd,YAAY;CACZ,MAAM,WAAW;CACjB,YAAY,WAAW,KAAK,KAAK;AACnC;;AAGA,MAAa,4BAA4B,YAA2B;CAClE,cAAc,KAAK,2CAA2C,EAC5D,iBAAiB,sBAAsB,KACzC,CAAC;CACD,MAAM,EAAE,OAAO,MAAM,OAAO;CAC5B,MAAM,GAAG,YAAY,CAAC,CAAC,QAAQ,OAAM,QAAO;EAC1C,MAAM,WAAW,MAAM,IAAI,WAAW,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ;EACpE,MAAM,iBAAiB,IAAI,IAAI,SAAS,KAAI,WAAU,CAAC,OAAO,YAAY,MAAM,CAAC,CAAC;EAElF,KAAK,MAAM,CAAC,YAAY,eAAe,uBAAuB;GAC5D,MAAM,UAAU,eAAe,IAAI,UAAU;GAC7C,MAAM,UAAU,2BAA2B,YAAY,SAAS,MAAM;GACtE,MAAM,SAAS;IAAE,GAAG;IAAS,MAAM,KAAK,UAAU,QAAQ,IAAI;GAAE;GAChE,IAAI,SACF,MAAM,IAAI,YAAY,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,cAAc,KAAK,UAAU,CAAC,CAAC,QAAQ;QAEzF,MAAM,IAAI,WAAW,QAAQ,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,QAAQ;EAE1D;EAEA,MAAM,eAAe,CAAC,GAAG,sBAAsB,KAAK,CAAC;EACrD,IAAI,aAAa,IAAI,WAAW,QAAQ,CAAC,CAAC,MAAM,cAAc,KAAK,sBAAsB;EACzF,IAAI,aAAa,SAAS,GAAG,aAAa,WAAW,MAAM,cAAc,UAAU,YAAY;EAC/F,MAAM,WAAW,QAAQ;CAC3B,CAAC;CACD,cAAc,KAAK,2CAA2C;AAChE;;;AC5CA,MAAM,wBACJ,KACA,WACG;CACH,KAAK,MAAM,OAAO,IAAI,KAAK,GACzB,IAAI,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,OAAO,GAAG;AAEvD;AAEA,MAAa,iBAAiB,WAAyB;CACrD,MAAM,SAAS,OAAO;CACtB,MAAM,cAAc,eAAe;CACnC,MAAM,SAAoB,CAAC;CAC3B,MAAM,WAAW,WAAuB;EACtC,IAAI;GACF,OAAO;EACT,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;CACF;CAIA,cAAc,YAAY,cAAc,MAAM,CAAC;CAC/C,cAAc,OAAO,OAAO,OAAO,MAAM,CAAC;CAC1C,cAAc,OAAO,WAAW,OAAO,MAAM,CAAC;CAC9C,cAAc,OAAO,QAAQ,OAAO,MAAM,CAAC;CAC3C,cAAc,OAAO,UAAU,OAAO,MAAM,CAAC;CAC7C,cAAc,OAAO,WAAW,OAAO,MAAM,CAAC;CAC9C,cAAc,OAAO,UAAU,OAAO,MAAM,CAAC;CAC7C,cAAc,OAAO,UAAU,OAAO,MAAM,CAAC;CAC7C,cAAc,OAAO,yBAAyB,MAAM,CAAC;CACrD,cAAc,WAAW,OAAO,MAAM,CAAC;CACvC,cAAc,qBAAqB,OAAO,OAAO,MAAM,CAAC;CACxD,cAAc,qBAAqB,OAAO,YAAY,MAAM,CAAC;CAC7D,cAAc,qBAAqB,OAAO,aAAa,MAAM,CAAC;CAC9D,cAAc,qBAAqB,OAAO,YAAY,MAAM,CAAC;CAE7D,KAAK,MAAM,CAAC,aAAa,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EACvE,IAAI,MAAM,QAAQ,cAAc,eAAe,QAAQ,OAAO,WAAW,CAAC;EAC1E,IAAI,MAAM,UAAU,cAAc,QAAQ,UAAU,OAAO,WAAW,CAAC;EACvE,IAAI,MAAM,aAAa,cAAc,eAAe,aAAa,OAAO,WAAW,CAAC;EACpF,IAAI,MAAM,kBAAkB,cAAc,eAAe,kBAAkB,OAAO,WAAW,CAAC;EAC9F,IAAI,MAAM,YAAY,cAAc,WAAW,WAAW,OAAO,WAAW,CAAC;EAC7E,IAAI,MAAM,gBAAgB,cAAc,QAAQ,eAAe,OAAO,WAAW,CAAC;CACpF;CACA,KAAK,MAAM,QAAQ,OAAO,UAAU,SAAS,CAAC,GAAG;EAC/C,cAAc,YAAY,KAAK,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;EAC1D,cAAc,YAAY,eAAe,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;CACtE;CACA,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,UAAU,WAAW,CAAC,CAAC,GAC3D,cAAc,YAAY,iBAAiB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;CAEnE,IAAI,OAAO,MAAM,MAAM,cAAc,QAAQ,UAAU,OAAO,MAAM,CAAC;CACrE,IAAI,OAAO,MAAM,MAAM,cAAc,QAAQ,eAAe,OAAO,MAAM,CAAC;CAC1E,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC,CAAC,GACzD,cAAc,QAAQ,WAAW,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;CAExD,KAAK,MAAM,WAAW,OAAO,UAAU,CAAC,GAAG,cAAcC,YAAU,CAAC,CAAC,kBAAkB,OAAO,CAAC;CAE/F,cAAc,0BAA0B,OAAO,eAAe,MAAM,CAAC,CAAC;CACtE,cAAc,YAAY,QAAQ,OAAO,MAAM,CAAC;CAChD,cAAc,wBAAwB,MAAM,CAAC;CAC7C,IAAI,OAAO,aAAa;OACjB,MAAM,QAAQ,SAAS,iBAAmC,oBAAoB,GACjF,IAAI,KAAK,QAAQ,WAAW,QAAQ,cAAc,KAAK,OAAO,CAAC;CAAA;CAInE,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,eAAe,QAAQ,sCAAsC,OAAO,EAAE;AAEpF;;;AChEA,IAAM,2BAAN,MAAyD;CAKnB;CAJpC,SAAyB,gBAAgB,IAAI,MAAS,CAAC;CACvD,UAAgD,CAAC;CACjD,WAAmB;CAEnB,YAAmB,WAAwD;EAAvC,KAAA,YAAA;CAAwC;CAE5E,SAAgB,WAAc,UAAmC,CAAC,GAAG,OAAgB;EACnF,MAAM,QAA2B;GAC/B;GACA,OAAO,QAAQ,SAAS;GACxB;GACA,UAAU,KAAK;EACjB;EACA,KAAK,QAAQ,KAAK,KAAK;EACvB,KAAK,QAAQ;EACb,aAAa;GACX,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;GACxC,IAAI,QAAQ,GAAG;GACf,KAAK,QAAQ,OAAO,OAAO,CAAC;GAC5B,KAAK,QAAQ;EACf;CACF;CAEA,YAAmB,OAAe;EAChC,IAAI,UAAU;EACd,KAAK,IAAI,QAAQ,KAAK,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS;GAC7D,IAAI,KAAK,QAAQ,MAAM,CAAC,UAAU,OAAO;GACzC,KAAK,QAAQ,OAAO,OAAO,CAAC;GAC5B,UAAU;EACZ;EACA,IAAI,SAAS,KAAK,QAAQ;CAC5B;CAEA,UAAkB;EAChB,MAAM,+BAAe,IAAI,IAA+B;EACxD,KAAK,MAAM,SAAS,KAAK,SAAS,aAAa,IAAI,MAAM,UAAU,MAAM,KAAK;EAC9E,MAAM,YAAY,KAAK,cAAc,cAAc,IAAI;EACvD,MAAM,SAAS,CAAC,GAAG,aAAa,OAAO,CAAC,CAAC,CACtC,MACE,MAAM,WAAW,KAAK,QAAQ,MAAM,SAAS,aAAa,KAAK,WAAW,MAAM,QACnF,CAAC,CACA,KAAI,UAAS,MAAM,SAAS;EAC/B,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,QAAQ,GAAG,MAAM;CACrD;AACF;AAEA,IAAa,0BAAb,MAAqC;CACnC,UAA0B,IAAI,yBAAuC,WAAW;CAChF,aAA6B,IAAI,yBAA0C,YAAY;CACvF,UAA0B,IAAI,yBAAuC,WAAW;CAChF,SAAoC,CAAC;CAErC,eAAsB,QAAsB,SAAmC;EAC7E,OAAO,KAAK,QAAQ,SAAS,QAAQ,SAAS,KAAK,OAAO,GAAG,EAAE,CAAC;CAClE;CAEA,kBAAyB,WAA4B,SAAmC;EACtF,OAAO,KAAK,WAAW,SAAS,WAAW,SAAS,KAAK,OAAO,GAAG,EAAE,CAAC;CACxE;CAEA,eAAsB,QAAsB,SAAmC;EAC7E,OAAO,KAAK,QAAQ,SAAS,QAAQ,SAAS,KAAK,OAAO,GAAG,EAAE,CAAC;CAClE;CAEA,YAAmB,OAAe;EAChC,KAAK,QAAQ,YAAY,KAAK;EAC9B,KAAK,WAAW,YAAY,KAAK;EACjC,KAAK,QAAQ,YAAY,KAAK;CAChC;CAEA,MAAa,UAAa,OAAe,QAAsC;EAC7E,KAAK,OAAO,KAAK,KAAK;EACtB,IAAI;GACF,OAAO,MAAM,OAAO;EACtB,UAAU;GACR,KAAK,OAAO,IAAI;EAClB;CACF;AACF;AAEA,MAAa,oBAAoB,IAAI,wBAAwB;AAE7D,MAAa,iBAAiB,kBAAkB,eAAe,KAAK,iBAAiB;AACrF,MAAa,oBAAoB,kBAAkB,kBAAkB,KAAK,iBAAiB;AAC3F,MAAa,iBAAiB,kBAAkB,eAAe,KAAK,iBAAiB;;;;;;;AC9FrF,MAAM,qBAAqB,OAAO,OAAO,eAAe;AAExD,MAAa,UAAU,kBAAkB,QAAQ;AAEjD,MAAa,aAAa,OACxB,KACA,SACG;CACH,MAAM,QAAQ,eAAe;CAC7B,MAAM,aAAa,IAAI,IAAI;CAE3B,IAAI;EACF,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ,GAAG,CAAC;EAExC,MAAM,MAAwB,CAAC;EAC/B,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM;GAC3C,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,WAAW;IAAE,MAAM,OAAO;IAAM,aAAa;GAAG;GAC3E,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW;IAAE,YAAY;IAAS,QAAQ;GAAU;GACzE,mBAAmB,MAAM,4BAA4B;IAAE,QAAQ,IAAI;IAAM,MAAM;GAAQ,CAAC;GACxF,MAAM,OAAO,KACX,MACA,SAAQ;IACN,IAAI,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,cAAc;SACjE;KACH,IAAI,KAAK,aAAa,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,cAAc,KAAK;KAC7E,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,KAAK;IACjE;GACF,GACA,GACF;EACF;EAEA,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS;EACvC,MAAM,WAAW,IAAI,IAAI;EAEzB,mBAAmB,KAAK,kCAAkC,EAAE,QAAQ,IAAI,KAAK,CAAC;CAChF,SAAS,OAAO;EACd,MAAM,cAAc,IAAI,IAAI;EAC5B,mBAAmB,MAAM,+BAA+B,EAAE,QAAQ,IAAI,KAAK,GAAG,KAAK;EACnF,MAAM;CACR;AACF;;;;;;;;;;;;;;ACrCA,MAAM,qBAAqB,OAAO,OAAO,eAAe;AAExD,MAAa,UAAU,kBAAkB,QAAQ;AAEjD,MAAM,YAAmC,CAAC;AAC1C,MAAM,eAAe,eAAwB,UAAU,gBAAgB,IAAI,MAAM;AAYjF,MAAa,iCAAoD;CAC/D,UAAU;EAAE,QAAQ;EAAQ,YAAY;CAAE;CAC1C,OAAO,CACL;EACE,MAAM,iBAAiB,oCAAoC;EAC3D,aAAa,iBAAiB,0CAA0C;CAC1E,CACF;AACF;AAEA,MAAa,2BACX,MACA,eACI,KAAK,MAAM,gBAAgB,wBAAwB;AAEzD,MAAa,uBACX,MACA,YACA,UACG;CACH,MAAM,cAAc,wBAAwB,MAAM,UAAU;CAC5D,YAAY,WAAW;EACrB,GAAG,YAAY;EACf,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAClE,QAAQ;CACV;AACF;;AAGA,MAAa,aAAa,OACxB,eACA,MACA,UAA6B,CAAC,MAC3B;CACH,MAAM,EAAE,cAAc,aAAa;CACnC,IAAI,cAAc,wBAAwB,MAAM,YAAY;CAE5D,IAAI;CACJ,IAAI;EACF,MAAM,cAAc;GAAE,MAAM;GAAM,UAAU,eAAe,IAAI,UAAU;EAAM,CAAC;EAChF,IAAI,gBAAgB,IAAI,SAAS,cAC/B,MAAM,IAAI,MAAM,yBAAyB,aAAa,KAAK,IAAI,MAAM;EAEvE,MAAM,mBAAmB,KAAK,IAAI;EAClC,OAAO;CACT,SAAS,OAAO;EACd,MAAM,eAAe,gBAAgB,KAAK;EAC1C,IAAI,cAAc,oBAAoB,MAAM,cAAc,KAAK;EAC/D,IAAI,UACF,IAAI;GACF,MAAM,SAAS,KAAK,YAAY;EAClC,SAAS,eAAe;GACtB,mBAAmB,MACjB,+BACA,EAAE,QAAQ,aAAa,GACvB,aACF;EACF;EAEF,MAAM;CACR;AACF;AAEA,MAAa,qBAAqB,OAChC,KACA,SACG;CACH,wBAAwB,MAAM,IAAI,IAAI;CACtC,MAAM,WAAW,KAAK,IAAI;AAC5B;AAEA,MAAa,mBAAmB,OAAO,SAAkC;CACvE,MAAM,OAAO,YAAY,KAAK,UAAU;CACxC,IAAI;EACF,MAAM,KAAK,QAAQ;EACnB,mBAAmB,MAAM,yBAAyB;GAChD,QAAQ,KAAK;GACb,QAAQ,KAAK;EACf,CAAC;EACD,IAAI,gBAAgB,IAAI,GAAG,OAAO,sBAAsB,IAAI,KAAK,UAAU,CAAC,EAAE;EAC9E,MAAM,SAAS,QAAQ,MAAK,UAAS,MAAM,SAAS,KAAK,UAAU;EACnE,IAAI,CAAC,QACH,MAAM,IAAI,MACR,WAAW,UAAU,uCAAuC;GAC1D,QAAQ,KAAK;GACb,QAAQ,KAAK;EACf,CAAC,CACH;EAEF,OAAO,MAAM,OAAO,KAAK,IAAI;CAC/B,UAAU;EACR,KAAK,QAAQ;CACf;AACF;AAEA,MAAa,aAAa,OACxB,MACA,SACG;CACH,mBAAmB,KAAK,uBAAuB,EAAE,QAAQ,KAAK,WAAW,CAAC;CAC1E,wBAAwB,MAAM,KAAK,UAAU;CAC7C,IAAI;EACF,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;EACjD,IAAI,CAAC,eACH,MAAM,IAAI,MACR,WAAW,UAAU,8CAA8C,EACjE,QAAQ,KAAK,WACf,CAAC,CACH;EAEF,MAAM,WAAW,eAAe,MAAM;GACpC,cAAc,KAAK;GACnB,WAAU,WAAU,cAAc,UAAW,EAAE,MAAM,KAAK,WAAW,CAAkB;EACzF,CAAC;EACD,mBAAmB,KAAK,yBAAyB,EAAE,QAAQ,KAAK,WAAW,CAAC;CAC9E,SAAS,OAAO;EACd,mBAAmB,MAAM,sBAAsB,EAAE,QAAQ,KAAK,WAAW,GAAG,KAAK;EACjF,oBAAoB,MAAM,KAAK,YAAY,KAAK;EAChD,MAAM;CACR;AACF;AAWA,MAAa,uBAAA,QAAA,QAAA,CAAA,CAAA,WAAA,eAAA,CAAA,CACS,MAAM,EAAE,oBAAoB,cAAc,WAAW,CAAC;;;AChK5E,MAAa,cAAc,WACzB,OAAO,KAAK,QAAQ;AAEtB,MAAa,yBACX,SACA,MACA,sBAA2C,IAAI,IAC7C,QAAQ,QAAO,WAAU,WAAW,MAAM,MAAM,SAAS,CAAC,CAAC,KAAI,WAAU,OAAO,UAAU,CAC5F,GACA,qBAA0C,wBACZ;CAC9B,MAAM,WAAW,QAAQ,QAAO,WAC9B,SAAS,YACL,oBAAoB,IAAI,OAAO,UAAU,IACzC,CAAC,oBAAoB,IAAI,OAAO,UAAU,CAChD;CACA,IAAI,SAAS,WAAW,OAAO;CAE/B,OAAO,SAAS,KAAI,YAAW;EAC7B,GAAG;EACH,MAAM;GACJ,GAAG,OAAO;GACV,SAAS,OAAO,KAAK,QAAQ,QAAO,eAAc,CAAC,mBAAmB,IAAI,WAAW,EAAE,CAAC;EAC1F;CACF,EAAE;AACJ;AAEA,MAAa,sBACX,QACA,sBACG,OAAO,KAAK,QAAQ,QAAO,eAAc,kBAAkB,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,KAAI,MAAK,EAAE,EAAE;AAEjG,MAAa,4BACX,SACA,gBACI,cAAc,QAAQ,QAAO,WAAU,YAAY,IAAI,OAAO,UAAU,CAAC,IAAI;;;;AChBnF,MAAM,sBAAsB,OAAO,OAAO,gBAAgB;AAE1D,MAAM,cAAc;AAmBpB,MAAM,cAAc,UAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAE7F,MAAM,2BAA8C;CAClD,UAAU;EAAE,QAAQ;EAAQ,YAAY;CAAE;CAC1C,OAAO,CACL;EACE,MAAM,iBAAiB,oCAAoC;EAC3D,aAAa,iBAAiB,0CAA0C;CAC1E,CACF;AACF;AAEA,IAAM,gBAAN,MAAoB;CAClB,yBAA0B,IAAI,IAA0B;CACxD,qCAAsC,IAAI,IAAY;CACtD,kCAAmC,IAAI,IAAwC;CAC/E,kCAAmC,IAAI,IAA0B;CACjE,qCAAsC,IAAI,IAAY;CACtD,sCAAuC,IAAI,IAAY;CACvD;CACA,sBAAwC,CAAC;CACzC;CACA,uBAA+B;CAC/B,mBAA2B;CAE3B,IAAW,0BAA0B;EACnC,OAAO,CAAC,GAAG,KAAK,OAAO,QAAQ,CAAC,CAAC,CAC9B,QAAQ,GAAG,YAAY,OAAO,SAAS,QAAQ,CAAC,CAChD,KAAK,CAAC,UAAU,IAAI;CACzB;CAEA,WAAW,UAA6B,CAAC,GAA2B;EAClE,IAAI,KAAK,iBAAiB,MAAM,IAAI,MAAM,oCAAoC;EAC9E,IAAI,KAAK,gBAAgB,OAAO,KAAK,CAAC,KAAK,kBACzC,MAAM,IAAI,MAAM,8CAA8C;EAEhE,IAAI,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,MAAK,WAAU,OAAO,SAAS,QAAQ,GACnE,MAAM,IAAI,MAAM,uDAAuD;EAEzE,MAAM,WAAW,IAAuC,CAAC,CAAC;EAC1D,oBAAoB,KAAK,gCAAgC,EACvD,eAAe,QAAQ,aAAa,OACtC,CAAC;EACD,MAAM,YAAY,KAAK,SAAS,UAAU,UAAU,OAAO;EAC3D,KAAK,qBAAqB,SAAS;EACnC,OAAO;GAAE;GAAW;EAAS;CAC/B;CAEA,aAAa,UAA6B,CAAC,GAA2B;EACpE,IAAI,KAAK,iBAAiB,MAAM,IAAI,MAAM,oCAAoC;EAC9E,MAAM,WAAW,IAAuC,CAAC,CAAC;EAC1D,oBAAoB,KAAK,kCAAkC,EACzD,eAAe,QAAQ,aAAa,OACtC,CAAC;EACD,MAAM,aAAa,YAAY;GAC7B,MAAM,eAAe,MAAM,KAAK,WAAW,QAAQ;GACnD,MAAM,KAAK,SAAS,UAAU,UAAU,OAAO;GAC/C,IAAI,aAAa,SAAS,GACxB,MAAM,IAAI,eAAe,cAAc,uCAAuC;EAElF,EAAA,CAAG;EACH,KAAK,qBAAqB,SAAS;EACnC,OAAO;GAAE;GAAW;EAAS;CAC/B;CAEA,MAAM,eAAe,KAAgD;EACnE,oBAAoB,KAAK,oCAAoC;EAC7D,MAAM,KAAK,qBAAqB;EAChC,MAAM,YAAY,kBAAkB;EACpC,MAAM,aAAa,MAAM,GAAG,WAAW,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ;EACrE,KAAK,uBAAuB,UAAU;EACtC,MAAM,UAAU,sBACd,WAAW,QAAO,WAAU,OAAO,MAAM,GACzC,WACA,KAAK,qBACL,KAAK,kBACP;EACA,KAAK,sBAAsB,QAAQ,KAAI,WAAU,OAAO,UAAU;EAClE,oBAAoB,MAAM,4BAA4B,EAAE,OAAO,QAAQ,OAAO,CAAC;EAC/E,IAAI,QAAQ,WAAW,GAAG;GACxB,KAAK,mBAAmB;GACxB,OAAO,EAAE,gBAAgB,MAAM;EACjC;EAEA,IAAI;GACF,MAAM,OAAO,oBAAoB,OAAO;GACxC,MAAM,YAAY,0BAA0B,IAAI;GAChD,IAAI,WAAW,MAAM,IAAI,MAAM,SAAS;GACxC,KAAK,MAAM,SAAS,KAAK,QACvB,KAAK,MAAM,WAAW,OACpB,MAAM,OAAO,sBAAsB,QAAQ,YAAY,YAAY;IACjE,MAAM,WAAW,eAAe,IAAI,UAAU;IAC9C,MAAM,UAAU,MAAM,iBAAiB,OAAO;IAC9C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,uCAAuC,QAAQ,YAAY;IAC7E,MAAM,SAAS,QAAQ;KAAE,MAAM;KAAM;IAAS,CAAC;IAC/C,IAAI,OAAO,SAAS,QAAQ,YAC1B,MAAM,IAAI,MAAM,yBAAyB,QAAQ,WAAW,KAAK,OAAO,MAAM;IAEhF,MAAM,cAAcC,YAAU;IAC9B,MAAM,QAAQ,KACX,OAAO,UAAU,CAAC,EAAA,CAAG,KAAI,YAAW,YAAY,gBAAgB,OAAO,CAAC,CAAC,KAAK,CACjF;IACA,MAAM,UAAU,MAAM,OAAO,YAAY;KAAE;KAAK;KAAU,MAAM;IAAK,CAAC;IACtE,IAAI,SAAS,KAAK,gBAAgB,IAAI,OAAO,MAAM,OAAO;IAC1D,KAAK,gBAAgB,IAAI,OAAO,MAAM,MAAM;GAC9C,CAAC;GAGL,oBAAoB,KAAK,wCAAwC,EAAE,OAAO,QAAQ,OAAO,CAAC;GAC1F,OAAO,EAAE,gBAAgB,MAAM;EACjC,SAAS,OAAO;GACd,oBAAoB,MAAM,qCAAqC,KAAK;GACpE,OAAO,MAAM,KAAK,YAAY,KAAK,qBAAqB,KAAK;EAC/D;CACF;CAEA,MAAM,gBAAgB,WAAW,IAAuC,CAAC,CAAC,GAAG;EAC3E,IAAI,KAAK,kBAAkB,OAAO,EAAE,gBAAgB,MAAM;EAC1D,IAAI;GACF,oBAAoB,KAAK,qCAAqC,EAC5D,OAAO,KAAK,gBAAgB,KAC9B,CAAC;GACD,KAAK,MAAM,CAAC,MAAM,WAAW,KAAK,iBAAiB;IACjD,MAAM,OAAO,sBAAsB,MAAM,YAAY;KACnD,MAAM,mBAAmB,QAAQ,QAAQ;IAC3C,CAAC;IACD,KAAK,OAAO,IAAI,MAAM;KAAE;KAAQ,MAAM;IAAU,CAAC;IACjD,KAAK,mBAAmB,IAAI,IAAI;IAChC,KAAK,gBAAgB,OAAO,IAAI;GAClC;GACA,KAAK,gBAAgB,MAAM;GAC3B,KAAK,mBAAmB;GACxB,oBAAoB,KAAK,qCAAqC;GAC9D,OAAO,EAAE,gBAAgB,MAAM;EACjC,SAAS,OAAO;GACd,oBAAoB,MAAM,oCAAoC,KAAK;GACnE,OAAO,MAAM,KAAK,YAAY,KAAK,qBAAqB,KAAK;EAC/D;CACF;CAEA,MAAM,UAAU,YAAoB;EAClC,oBAAoB,KAAK,4BAA4B,EAAE,QAAQ,WAAW,CAAC;EAC3E,MAAM,UAAU,MAAM,GACnB,WAAW,QAAQ,CAAC,CACpB,UAAU,CAAC,CACX,MAAM,cAAc,KAAK,UAAU,CAAC,CACpC,iBAAiB;EACpB,IAAI,CAAC,SAAS;EACd,IAAI,gBAAgB,OAAO,GACzB,MAAM,IAAI,MAAM,oBAAoB,WAAW,wBAAwB;EAGzE,MAAM,SAAoB,CAAC;EAC3B,MAAM,SAAS,KAAK,OAAO,IAAI,UAAU;EACzC,IAAI,QACF,OAAO,KAAK,GAAI,MAAM,KAAK,UAAU,YAAY,QAAQ,IAAI,CAAE;OAC1D;GACL,IAAI;GACJ,IAAI;IACF,MAAM,OAAO,sBAAsB,YAAY,YAAY;KAEzD,UAAS,MADa,iBAAiB,OAAO,EAAA,GAC3B;MAAE,MAAM;MAAM,UAAU,eAAe,IAAI,UAAU;KAAM,CAAC;KAC/E,MAAM,QAAQ,cAAc;IAC9B,CAAC;GACH,SAAS,OAAO;IACd,OAAO,KAAK,KAAK;GACnB;GACA,IAAI,QACF,IAAI;IACF,cAAc,MAAM;GACtB,SAAS,OAAO;IACd,OAAO,KAAK,KAAK;GACnB;QAEA,OAAO,yBAAyB,UAAU;EAE9C;EAEA,MAAM,kBAAkB,UAAU;EAClC,MAAM,GAAG,WAAW,QAAQ,CAAC,CAAC,MAAM,cAAc,KAAK,UAAU,CAAC,CAAC,QAAQ;EAC3E,MAAM,YAAY,kBAAkB;EACpC,YAAY,OAAO;EACnB,oBAAoB,KAAK,8BAA8B;GACrD,mBAAmB,OAAO;GAC1B,QAAQ;EACV,CAAC;EACD,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,eAAe,QAAQ,WAAW,WAAW,kCAAkC;CAE7F;CAEA,eAAuC;EACrC,IAAI;GACF,MAAM,QAAQ,WAAW,cAAc,QAAQ,WAAW;GAC1D,IAAI,CAAC,OAAO,OAAO;GACnB,OAAO,KAAK,MAAM,KAAK;EACzB,SAAS,OAAO;GACd,oBAAoB,KAAK,mCAAmC,KAAK;GACjE,OAAO;EACT;CACF;CAEA,gBAAgB;EACd,IAAI;GACF,WAAW,cAAc,WAAW,WAAW;EACjD,SAAS,OAAO;GACd,oBAAoB,KAAK,oCAAoC,KAAK;EACpE;CACF;CAEA,qBAA6B,WAA0B;EACrD,KAAK,kBAAkB;EACvB,UAAe,WACP;GACJ,KAAK,kBAAkB,KAAA;GACvB,oBAAoB,KAAK,mCAAmC;EAC9D,IACA,UAAS;GACP,KAAK,kBAAkB,KAAA;GACvB,oBAAoB,MAAM,kCAAkC,KAAK;EACnE,CACF;CACF;CAEA,uBAA+B;EAC7B,OAAQ,KAAK,2BAA2B,OAAO,yBAA2B,CAAC,KACzE,OAAO,EAAE,oCAAoC;GAC3C,8BAA8B;GAC9B,MAAM,0BAA0B;EAClC,CACF;CACF;CAEA,uBAA+B,SAAoC;EACjE,IAAI,CAAC,KAAK,sBAAsB,KAAK,oBAAoB,MAAM;EAC/D,KAAK,MAAM,UAAU,SAAS;GAC5B,IAAI,KAAK,mBAAmB,IAAI,OAAO,UAAU,GAAG;GACpD,KAAK,mBAAmB,IAAI,OAAO,UAAU;GAC7C,IAAI,WAAW,MAAM,MAAM,WAAW,KAAK,oBAAoB,IAAI,OAAO,UAAU;EACtF;EACA,KAAK,uBAAuB;CAC9B;CAEA,MAAc,SACZ,MACA,UACA,SACA;EACA,MAAM,KAAK,qBAAqB;EAChC,MAAM,YAAY,kBAAkB;EACpC,MAAM,aAAa,MAAM,GACtB,WAAW,QAAQ,CAAC,CACpB,MAAM,UAAU,MAAM,IAAI,CAAC,CAC3B,UAAU,CAAC,CACX,QAAQ;EACX,KAAK,uBAAuB,UAAU;EACtC,MAAM,UAAU,yBACd,sBAAsB,YAAY,MAAM,KAAK,qBAAqB,KAAK,kBAAkB,GACzF,QAAQ,cAAc,IAAI,IAAI,QAAQ,WAAW,IAAI,KAAA,CACvD;EACA,MAAM,OAAO,oBAAoB,OAAO;EACxC,oBAAoB,KAAK,4BAA4B;GACnD,YAAY,KAAK,OAAO;GACxB,aAAa,QAAQ;EACvB,CAAC;EACD,MAAM,YAAY,0BAA0B,IAAI;EAChD,IAAI,WAAW,MAAM,IAAI,MAAM,SAAS;EAExC,MAAM,yBAAS,IAAI,IAAY;EAC/B,KAAK,MAAM,SAAS,KAAK,QACvB,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,OAAO,QAAQ;GACrB,SAAS,MAAM,UAAU,kBAAkB;GAC3C,MAAM,YAAY,mBAAmB,SAAS,MAAM;GACpD,IAAI,UAAU,SAAS,GAAG;IACxB,OAAO,IAAI,IAAI;IACf,SAAS,MAAM,KAAK,CAAC,WAAW;KAC9B,aAAa,WAAW,UAAU,6CAA6C,EAC7E,SAAS,UAAU,KAAK,IAAI,EAC9B,CAAC;KACD,QAAQ;KACR,YAAY;IACd;IACA;GACF;GAEA,IAAI;GACJ,IAAI;IACF,MAAM,OAAO,sBAAsB,MAAM,YAAY;KACnD,MAAM,UAAU,MAAM,iBAAiB,OAAO;KAC9C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,uCAAuC,MAAM;KAC3E,SAAS,QAAQ;MACf,MAAM,WAAW,QAAQ,YAAY;MACrC,UAAU,eAAe,IAAI,UAAU;KACzC,CAAC;KACD,IAAI,OAAO,SAAS,MAClB,MAAM,IAAI,MAAM,yBAAyB,KAAK,KAAK,OAAO,MAAM;KAElE,MAAM,mBAAmB,QAAQ,QAAQ;IAC3C,CAAC;IACD,KAAK,OAAO,IAAI,MAAM;KAAU;KAAS;IAAK,CAAC;GACjD,SAAS,OAAO;IACd,OAAO,IAAI,IAAI;IACf,IAAI,QACF,IAAI;KACF,cAAc,MAAM;IACtB,SAAS,cAAc;KACrB,oBAAoB,MAAM,0BAA0B,EAAE,QAAQ,KAAK,GAAG,YAAY;IACpF;SAEA,OAAO,yBAAyB,IAAI;IAEtC,MAAM,UAAU,SAAS,MAAM,SAAS,kBAAkB;IAC1D,SAAS,MAAM,QAAQ;KACrB,GAAG;KACH,UAAU;MAAE,GAAG,QAAQ;MAAU,aAAa,WAAW,KAAK;MAAG,QAAQ;KAAQ;IACnF;IACA,oBAAoB,MAAM,sBAAsB,EAAE,QAAQ,KAAK,GAAG,KAAK;GACzE;EACF;CAEJ;CAEA,MAAc,WAAW,MAAwB;EAC/C,MAAM,UAAU,CAAC,GAAG,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,YAAY,OAAO,SAAS,IAAI;EACtF,MAAM,SAAoB,CAAC;EAC3B,oBAAoB,KAAK,+BAA+B;GAAE,OAAO,QAAQ;GAAQ;EAAK,CAAC;EACvF,KAAK,MAAM,CAAC,MAAM,WAAW,QAAQ,QAAQ,GAC3C,OAAO,KAAK,GAAI,MAAM,KAAK,UAAU,MAAM,QAAQ,KAAK,CAAE;EAE5D,oBAAoB,KAAK,iCAAiC;GAAE,YAAY,OAAO;GAAQ;EAAK,CAAC;EAC7F,OAAO;CACT;CAEA,MAAc,UAAU,MAAc,QAAsB,WAAoB;EAC9E,MAAM,SAAoB,CAAC;EAC3B,MAAM,UAAU,OAAO,WAAqD;GAC1E,IAAI,CAAC,QAAQ;GACb,IAAI;IACF,MAAM,OAAO;GACf,SAAS,OAAO;IACd,OAAO,KAAK,KAAK;GACnB;EACF;EAEA,MAAM,QAAQ,OAAO,OAAO,UAAU,KAAK,OAAO,MAAM,CAAC;EACzD,IAAI,WAAW,MAAM,QAAQ,OAAO,OAAO,aAAa,KAAK,OAAO,MAAM,CAAC;EAC3E,MAAM,QAAQ,KAAK,gBAAgB,IAAI,IAAI,CAAC;EAC5C,IAAI;GACF,cAAc,OAAO,MAAM;EAC7B,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;EACA,KAAK,gBAAgB,OAAO,IAAI;EAChC,KAAK,gBAAgB,OAAO,IAAI;EAChC,KAAK,OAAO,OAAO,IAAI;EACvB,KAAK,mBAAmB,OAAO,IAAI;EACnC,OAAO;CACT;CAEA,MAAc,YAAY,aAAuB,OAAgB;EAC/D,MAAM,gBAA2B,CAAC;EAClC,cAAc,KAAK,GAAI,MAAM,KAAK,WAAW,SAAS,CAAE;EACxD,KAAK,MAAM,CAAC,MAAM,WAAW,CAAC,GAAG,KAAK,gBAAgB,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG;GAC1E,IAAI;IACF,MAAM,KAAK,gBAAgB,IAAI,IAAI,CAAC,GAAG;GACzC,SAAS,cAAc;IACrB,cAAc,KAAK,YAAY;GACjC;GACA,IAAI;IACF,cAAc,MAAM;GACtB,SAAS,cAAc;IACrB,cAAc,KAAK,YAAY;GACjC;GACA,KAAK,gBAAgB,OAAO,IAAI;EAClC;EACA,KAAK,gBAAgB,MAAM;EAC3B,KAAK,mBAAmB,MAAM;EAE9B,IAAI,WAAW;EACf,IAAI;GACF,IAAI,YAAY,SAAS,GACvB,MAAM,GACH,YAAY,QAAQ,CAAC,CACrB,IAAI,EAAE,QAAQ,MAAM,CAAC,CAAC,CACtB,MAAM,cAAc,MAAM,WAAW,CAAC,CACtC,QAAQ;EAEf,SAAS,cAAc;GACrB,WAAW;GACX,cAAc,KAAK,YAAY;EACjC;EAEA,MAAM,UAAU,CAAC,WAAW,KAAK,GAAG,GAAG,cAAc,IAAI,UAAU,CAAC;EACpE,MAAM,WAA4B;GAChC,UAAU,KAAK,IAAI;GACnB,SAAS;GACT,QAAQ,QAAQ,KAAK,IAAI;EAC3B;EACA,IAAI;GACF,WAAW,cAAc,QAAQ,aAAa,KAAK,UAAU,QAAQ,CAAC;EACxE,SAAS,cAAc;GACrB,oBAAoB,KAAK,sCAAsC,YAAY;EAC7E;EACA,KAAK,mBAAmB;EACxB,OAAO,EAAE,gBAAgB,SAAS;CACpC;AACF;AAEA,MAAa,gBAAgB,IAAI,cAAc;;;AC9b/C,IAAsB,kBAAtB,MAAsC,CAiBtC;AAEA,IAAsB,eAAtB,MAAmC,CAgBnC;AAeA,IAAsB,eAAtB,MAAmC,CAOnC;;;;;;;;;;;ACnDA,MAAM,sBAAsB,OAAO,OAAO,gBAAgB;AAE1D,MAAM,iBAAiB,aAAqB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAE/E,MAAa,aAAa,kBAAkB,WAAW;AAEvD,MAAa,kBACX,GACA,MACA,qBAEA,EAAE,cAAc,WAAW,UAAU,uCAAuC,GAAG,OAAM,MAAK;CACxF,EAAE,YAAY;CACd,IAAI,QAAQ;CACZ,MAAM,UACJ,oBACA,IAAI,KAAK,MAAM,GAAG,WAAW,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,QAAQ,EAAA,CAAG,KAAI,MAAK,EAAE,UAAU,CAAC;CAC/F,MAAM,YAAYC,YAAU,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM;CACpD,KAAK,MAAM,EAAE,IAAI,cAAc,KAAK,SAAS;EAE3C,IADqB,QAAQ,IAAI,EAClB,KAAK,CAAC,UAAU;EAC/B,oBAAoB,KAAK,wCAAwC;GAC/D,YAAY;GACZ,QAAQ,KAAK,KAAK;EACpB,CAAC;EACD,EAAE,cAAc,WAAW,UAAU,2CAA2C,EAAE,GAAG,CAAC;EACtF,MAAM,kBAAkB,UAAU,MAAK,MAAK,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;EACnE,MAAM,cAAc,eAAe;EACnC;CACF;CACA,EAAE,cAAc,WAAW,UAAU,yCAAyC,EAAE,MAAM,CAAC;AACzF,CAAC;AAEH,MAAM,oBAAoB,OACxB,GACA,MACA,eACA,cACA,uBACG;CACH,oBAAoB,KAAK,uCAAuC,EAAE,WAAW,cAAc,CAAC;CAC5F,MAAM,OAAO,MAAM,EAAE,eACnB,WAAW,UAAU,4BAA4B,GACjD,OAAM,MAAK;EACT,EAAE,YAAY;EACd,MAAM,SAAS,QAAQ,QAAO,QAAO,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE;EAChE,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,WAAW,UAAU,mCAAmC,CAAC;EACtF,EAAE,cAAc,OAAO;EACvB,EAAE,WAAW;EAEb,MAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,EACtC,OAAO,UAAU;GACf,IAAI,SAAS,aAAa,EAAE,cAAc,SAAS;GACnD,IAAI,OAAO,SAAS,aAAa,UAAU,EAAE,WAAW,cAAc,SAAS,QAAQ;EACzF,EACF,CAAC;EACD,IAAI,oBAAoB,KAAK,KAAK,EAAE,GAClC,MAAM,IAAI,MACR,WAAW,UAAU,oCAAoC,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC,CAC/E;EAGF,EAAE,cAAc,WAAW,UAAU,4BAA4B;EACjE,EAAE,WAAW;EACb,MAAM,YAAY,gBAAgB,CAChC;GACE,aAAa,KAAK,KAAK;GACvB,QAAQ;GACR;GACA;GACA,YAAY,OAAO;GACnB;GACA,YAAY,KAAK,KAAK;EACxB,CACF,CAAC;EACD,EAAE,WAAW;EACb,OAAO;CACT,CACF;CACA,oBAAoB,KAAK,4BAA4B,EAAE,QAAQ,KAAK,KAAK,GAAG,CAAC;CAE7E,MAAM,eAAe,GAAG,MAAM,kBAAkB;AAClD;AAEA,MAAa,iBAAiB,OAAe,uBAC3C,sBACE,WAAW,UAAU,iCAAiC,EAAE,MAAM,CAAC,GAC/D,OAAM,MAAK;CACT,MAAM,CAAC,MAAM,aAAa,MAAM,EAAE,cAChC,WAAW,UAAU,6BAA6B,GAClD,OAAM,MAAK;EACT,EAAE,YAAY;EACd,IAAI,YAAY;EAChB,SAAS;GACP,MAAM,YAAY,WAAW,QAAO,QAAO,IAAI,UAAU,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;GACzE,IAAI,CAAC,WACH,MAAM,IAAI,MACR,WAAW,UAAU,sCAAsC,EAAE,OAAO,UAAU,CAAC,CACjF;GAEF,EAAE,cAAc,UAAU;GAC1B,MAAM,OAAO,MAAM,UAAU,SAAS,SAAS;GAC/C,IAAI,SAAS,IAAI,GAAG,YAAY;QAC3B,OAAO,CAAC,MAAM,SAAS;EAC9B;CACF,CACF;CAEA,MAAM,kBAAkB,GAAG,MAAM,UAAU,MAAM,OAAO,kBAAkB;AAC5E,CACF;AAEF,MAAa,qBAAqB,MAAY,uBAC5C,sBACE,WAAW,UAAU,gCAAgC,EAAE,MAAM,KAAK,KAAK,CAAC,GACxE,OAAM,MAAK;CACT,MAAM,kBAAkB,GAAG,MAAM,IAAI,IAAI,kBAAkB;AAC7D,CACF;AAEF,MAAa,eAAe,OAC1B,YACA,uBACG;CACH,IAAI,gBAAgB,UAAU,GAC5B,MAAM,IAAI,MAAM,WAAW,UAAU,qCAAqC,CAAC;CAE7E,OAAO,sBACL,WAAW,UAAU,+BAA+B,EAAE,QAAQ,WAAW,WAAW,CAAC,GACrF,OAAM,MAAK;EACT,oBAAoB,KAAK,yBAAyB,EAAE,QAAQ,WAAW,WAAW,CAAC;EACnF,MAAM,OAAO,MAAM,EAAE,cACnB,WAAW,UAAU,0BAA0B,GAC/C,OAAM,MAAK;GACT,EAAE,YAAY;GACd,IAAI,gBAAgB,WAAW;GAC/B,SAAS;IACP,MAAM,YAAY,WAAW,MAAK,MAAK,EAAE,QAAQ,aAAa;IAC9D,IAAI,CAAC,WACH,MAAM,IAAI,MAAM,WAAW,UAAU,oCAAoC,CAAC;IAC5E,EAAE,cAAc,UAAU;IAC1B,MAAM,OAAO,MAAM,UAAU,OAAO,UAAU;IAC9C,IAAI,SAAS,IAAI,GAAG,gBAAgB;SAC/B,OAAO;GACd;EACF,CACF;EAEA,MAAM,OAAO,MAAM,EAAE,eACnB,WAAW,UAAU,4BAA4B,GACjD,OAAM,MAAK;GACT,EAAE,YAAY;GACd,MAAM,SAAS,QAAQ,MAAK,MAAK,EAAE,QAAQ,WAAW,UAAU;GAChE,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,WAAW,UAAU,mCAAmC,CAAC;GACtF,EAAE,cAAc,OAAO;GACvB,EAAE,WAAW;GACb,MAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,EACtC,OAAO,UAAU;IACf,IAAI,SAAS,aAAa,EAAE,cAAc,SAAS;IACnD,IAAI,OAAO,SAAS,aAAa,UAC/B,EAAE,WAAW,cAAc,SAAS,QAAQ;GAChD,EACF,CAAC;GACD,EAAE,WAAW;GACb,OAAO;EACT,CACF;EAEA,MAAM,YAAY,gBAAgB,CAAC;GAAE,GAAG;GAAY;EAAK,CAAC,CAAC;EAE3D,MAAM,eAAe,GAAG,MAAM,kBAAkB;EAChD,oBAAoB,KAAK,2BAA2B,EAAE,QAAQ,WAAW,WAAW,CAAC;CACvF,CACF;AACF;AAEA,MAAa,mBAAmB,eAAuB,cAAc,UAAU,UAAU;;;AC3LzF,MAAa,0BACX,EACE,OACA;CACE,SAAS;CACT,eAAe;CACf,WAAW;AACb,GACA;CACE,EAAE,QAAQ;EACR,GAAG;EACH,MAAM;CACR,CAAC;CACD,EAAE,QAAQ;EACR,GAAG;EACH,MAAM;CACR,CAAC;CACD,EAAE,QAAQ;EACR,GAAG;EACH,MAAM;CACR,CAAC;AACH,CACF;AAEF,MAAa,oBACX,EACE,OACA;CACE,SAAS;CACT,eAAe;CACf,WAAW;AACb,GACA,CACE,EAAE,QAAQ;CACR,GAAG;CACH,MAAM;AACR,CAAC,CACH,CACF;;;AC5BF,IAAM,UAAN,MAAc;CACZ,QAAe,gBACb,cAAc,eAAoE,CACpF;CACA,aAAoB,gBAClB,cAAc,eAAgE,CAChF;CACA,cAAqB,gBACnB,cAAc,eAA+D,CAC/E;CACA,aAAoB,gBAClB,cAAc,eAAgE,CAChF;CACA,cAAqB,gBAAgB,IAAI,MAAsB,CAAC;CAEhE,mCAAoC,IAAI,IAA4B;CACpE,qBAAgD,CAAC;;;;;CAMjD,MAAa,sBAAyB,QAAgB,QAAsC;EAC1F,KAAK,mBAAmB,KAAK,MAAM;EACnC,IAAI;GACF,OAAO,MAAM,kBAAkB,UAAU,cACvC,oBAAoB,UAAU,QAAQ,MAAM,CAC9C;EACF,UAAU;GACR,KAAK,mBAAmB,IAAI;EAC9B;CACF;CAEA,IAAY,oBAAoB;EAC9B,OAAO,KAAK,mBAAmB,GAAG,EAAE;CACtC;CAEA,cAAqB,WAA2B,SAAS,KAAK,mBAAmB;EAC/E,KAAK,YAAY,KAAK,SAAS;EAC/B,IAAI,QAAQ,KAAK,iBAAiB,IAAI,WAAW,MAAM;EACvD,OAAO;CACT;;CAGA,yBAAgC,QAAgB;EAC9C,KAAK,IAAI,QAAQ,KAAK,YAAY,SAAS,GAAG,SAAS,GAAG,SAAS;GACjE,MAAM,YAAY,KAAK,YAAY;GACnC,IAAI,KAAK,iBAAiB,IAAI,SAAS,MAAM,QAAQ;GACrD,KAAK,YAAY,OAAO,OAAO,CAAC;GAChC,KAAK,iBAAiB,OAAO,SAAS;EACxC;EACA,oBAAoB,YAAY,MAAM;EACtC,kBAAkB,YAAY,MAAM;CACtC;CAEA,SAAgB,gCAAgB,IAAI,IAA6B,CAAC;CAClE,UAAiB,QAAgB,GAAG,QAAyB;EAC3D,MAAM,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,CAAC;EACxC,KAAK,OAAO,IAAI,QAAQ,IAAI,OAAO,MAAM,CAAC;CAC5C;CAEA,aAAoB,gCAAgB,IAAI,IAA+B,CAAC;CACxE,cAAqB,QAAgB,GAAG,YAA+B;EACrE,MAAM,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,CAAC;EAC5C,KAAK,WAAW,IAAI,QAAQ,IAAI,OAAO,UAAU,CAAC;CACpD;CAEA,UAAiB,gCAAgB,IAAI,IAA8B,CAAC;CACpE,WAAkB,QAAgB,GAAG,SAA2B;EAC9D,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,CAAC;EACzC,KAAK,QAAQ,IAAI,QAAQ,IAAI,OAAO,OAAO,CAAC;CAC9C;CAEA,YAAmB,gCAAgB,IAAI,IAAwC,CAAC;CAChF,aAAoB,QAAgB,GAAG,WAAuC;EAC5E,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,CAAC;EAC3C,KAAK,UAAU,IAAI,QAAQ,IAAI,OAAO,SAAS,CAAC;CAClD;CAEA,aAAoB,gCAAgB,IAAI,IAAoC,CAAC;CAC7E,cAAqB,QAAgB,GAAG,YAAoC;EAC1E,MAAM,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,CAAC;EAC5C,KAAK,WAAW,IAAI,QAAQ,IAAI,OAAO,UAAU,CAAC;CACpD;CAEA,YAAmB,gCAAgB,IAAI,IAAmC,CAAC;CAC3E,aAAoB,QAAgB,GAAG,WAAkC;EACvE,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,CAAC;EAC3C,KAAK,UAAU,IAAI,QAAQ,IAAI,OAAO,SAAS,CAAC;CAClD;CAEA,YAAmB,gCAAgB,IAAI,IAAkC,CAAC;CAC1E,YAAmB,QAAgB,GAAG,WAAiC;EACrE,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,CAAC;EAC3C,KAAK,UAAU,IAAI,QAAQ,IAAI,OAAO,SAAS,CAAC;CAClD;AACF;AAEA,MAAa,SAAS,IAAI,QAAQ;AAUlC,OAAO,MAAM,IAAI,CAAC,QAAQ,OAAO,GAAG;CAClC,SAAQ,SAAQ,CAAC,CAAC,KAAK;CACvB,MAAM;CACN,KAAK;CACL,MAAM,iBAAiB,wBAAwB;CAC/C,MAAM,KAAK,MAAM;EACf,MAAM,OAAO,KAAK,SAAS,OAAO;EAClC,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,uDAAuD;EAElF,MAAM,aAAa,8BACjB,KAAK,UAAoC;GACvC,MAAM;IACJ,aAAa,eAAe,aAAa,IAAI,SAAS,KAAK,WAAW;IACtE,IAAI,KAAK,OAAO;IAChB,MAAM,KAAK;GACb;GACA,QAAQ,KAAK;GACb,IAAI,KAAK;EACX,CAAC,CACH;EACA,OAAO,EAAE,OAAO,IAAI,KAAK,MAAM,yBAAyB,aAAa;CACvE;AACF,CAAC;AAED,OAAO,MAAM,IAAI,CAAC,QAAQ,QAAQ,GAAG;CACnC,SAAQ,SAAQ,CAAC,CAAC,KAAK;CACvB,MAAM;CACN,KAAK;CACL,MAAM,iBAAiB,qBAAqB;CAC5C,MAAM,KAAK,MAAM;EACf,MAAM,OAAO,KAAK,SAAS,OAAO;EAClC,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,uDAAuD;EAElF,MAAM,aAAa,8BACjB,KAAK,UAAoC;GACvC,MAAM;IACJ,aAAa,eAAe,aAAa,IAAI,SAAS,KAAK,WAAW;IACtE,IAAI,KAAK,OAAO;IAChB,MAAM,KAAK;GACb;GACA,QAAQ,KAAK;GACb,IAAI,KAAK;EACX,CAAC,CACH;EACA,MAAM,QAAQ,IAAI,KAAK,MAAM,yBAAyB;EACtD,MAAM,UAAU,MAAM;GAAE,OAAO,WAAW,UAAU,0BAA0B;GAAG,MAAM;EAAM,CAAC;EAE9F,OAAO,EAAE,MAAM;CACjB;AACF,CAAC;AAED,OAAO,WAAW,IAAI,CAAC,QAAQ,OAAO,GAAG;CACvC,KAAK;CACL,MAAM,iBAAiB,2BAA2B;CAClD,OAAO,WAAW;EAChB,OAAO,oCAAoC,KAAK,SAAS;CAC3D;CACA,KAAK,WAAW;EACd,MAAM,cAAc,eAAe;EACnC,MAAM,OAAiC,KAAK,MAC1C,kCACE,UAAU,QAAQ,WAAW,EAAE,CAAC,CAAC,WAAW,0BAA0B,EAAE,CAC1E,CACF;EACA,OAAO;GACL,OAAO,WAAW,UAAU,yBAAyB;GACrD,QAAQ,WAAW,UAAU,4BAA4B;IACvD,MAAM,KAAK,KAAK;IAChB,QAAQ,YAAY,aAAa,KAAK,MAAM;GAC9C,CAAC;GACD,aAAa,CAAC;GACd,aAAa;IACX,OAAO,eAAe,KACpB,kBACA,eAAe,aAAa,IAAI,OAAO,KAAK,KAAK,WAAW,GAC5D,KAAK,IACL,KAAK,KAAK,EACZ;GACF;EACF;CACF;AACF,CAAC"}
|
package/dist/lib/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PluginArchiveDB } from "@delta-comic/db";
|
|
2
2
|
import { App, Component, MaybeRefOrGetter, Raw, Ref } from "vue";
|
|
3
|
-
import { FormConfigure, FormResult, FormSingleConfigure, FormSingleResult, SourcedKeyMap, StreamQuery,
|
|
3
|
+
import { FormConfigure, FormResult, FormSingleConfigure, FormSingleResult, SourcedKeyMap, StreamQuery, UniCommentRow, UniContentDownloadProvider, UniContentLayoutComponent, UniContentPage, UniContentPageLike, UniContentType_, UniImage, UniItem, UniItemAuthor, UniItemCardComponent, UniItemRaw, UniItemTranslator, UniResourceProcessInstance, UniResourceType, UniUserCardComponent } from "@delta-comic/model";
|
|
4
4
|
import { DownloadMessageBind } from "@delta-comic/ui";
|
|
5
5
|
|
|
6
6
|
//#region lib/configPointer.d.ts
|
|
@@ -59,39 +59,39 @@ interface PopupConfig {
|
|
|
59
59
|
interface InitiativeItem {
|
|
60
60
|
key: string;
|
|
61
61
|
name: string;
|
|
62
|
-
icon: Component |
|
|
62
|
+
icon: Component | UniImage;
|
|
63
63
|
bgColor?: string;
|
|
64
|
-
call(page:
|
|
64
|
+
call(page: UniContentPage): Promise<{
|
|
65
65
|
token?: string;
|
|
66
66
|
} | void>;
|
|
67
|
-
filter(page:
|
|
67
|
+
filter(page: UniContentPage): boolean;
|
|
68
68
|
}
|
|
69
69
|
declare namespace content_d_exports {
|
|
70
70
|
export { Config$6 as Config };
|
|
71
71
|
}
|
|
72
72
|
type Config$6 = Record<string, {
|
|
73
|
-
itemCard?:
|
|
74
|
-
commentRow?:
|
|
75
|
-
layout?:
|
|
76
|
-
contentPage?:
|
|
77
|
-
downloadProvider?:
|
|
78
|
-
itemTranslator?:
|
|
73
|
+
itemCard?: UniItemCardComponent;
|
|
74
|
+
commentRow?: UniCommentRow;
|
|
75
|
+
layout?: UniContentLayoutComponent;
|
|
76
|
+
contentPage?: UniContentPageLike;
|
|
77
|
+
downloadProvider?: UniContentDownloadProvider;
|
|
78
|
+
itemTranslator?: UniItemTranslator;
|
|
79
79
|
}>;
|
|
80
80
|
declare namespace subscribe_d_exports {
|
|
81
81
|
export { Config$5 as Config };
|
|
82
82
|
}
|
|
83
83
|
interface Config$5 {
|
|
84
84
|
getUpdateList(olds: {
|
|
85
|
-
author:
|
|
86
|
-
list:
|
|
85
|
+
author: UniItemAuthor;
|
|
86
|
+
list: UniItem[];
|
|
87
87
|
}[], signal: AbortSignal): PromiseLike<{
|
|
88
88
|
isUpdated: boolean;
|
|
89
|
-
whichUpdated:
|
|
89
|
+
whichUpdated: UniItemAuthor[];
|
|
90
90
|
}>;
|
|
91
|
-
onAdd?(author:
|
|
92
|
-
onRemove?(author:
|
|
93
|
-
fetchAuthorContent: StreamQuery<
|
|
94
|
-
author:
|
|
91
|
+
onAdd?(author: UniItemAuthor): any;
|
|
92
|
+
onRemove?(author: UniItemAuthor): any;
|
|
93
|
+
fetchAuthorContent: StreamQuery<UniItem, {
|
|
94
|
+
author: UniItemAuthor;
|
|
95
95
|
}>;
|
|
96
96
|
}
|
|
97
97
|
declare namespace user_d_exports {
|
|
@@ -99,15 +99,15 @@ declare namespace user_d_exports {
|
|
|
99
99
|
}
|
|
100
100
|
interface Config$4 {
|
|
101
101
|
edit?: Component;
|
|
102
|
-
card?:
|
|
102
|
+
card?: UniUserCardComponent;
|
|
103
103
|
authorIcon?: Record<string, Component>;
|
|
104
104
|
/**
|
|
105
105
|
* 1. download
|
|
106
106
|
* 2. upload (收藏那些云端未收藏的漫画)
|
|
107
107
|
*/
|
|
108
108
|
syncFavourite?: {
|
|
109
|
-
download: () => PromiseLike<
|
|
110
|
-
upload: (items:
|
|
109
|
+
download: () => PromiseLike<UniItem[]>;
|
|
110
|
+
upload: (items: UniItemRaw[]) => PromiseLike<any>;
|
|
111
111
|
};
|
|
112
112
|
/**
|
|
113
113
|
* 你希望展示的(`userActions`)自己的板块的页面
|
|
@@ -119,7 +119,7 @@ interface Config$4 {
|
|
|
119
119
|
userActions?: Record<string, UserAction>;
|
|
120
120
|
}
|
|
121
121
|
interface UserAction {
|
|
122
|
-
call(author:
|
|
122
|
+
call(author: UniItemAuthor): any;
|
|
123
123
|
name: string;
|
|
124
124
|
icon?: Component;
|
|
125
125
|
}
|
|
@@ -194,7 +194,7 @@ interface Config$1 {
|
|
|
194
194
|
hotSearch?: HotSearchProvider[];
|
|
195
195
|
fetchRandomItems?: ItemProvider;
|
|
196
196
|
}
|
|
197
|
-
type ItemProvider = (signal: AbortSignal) =>
|
|
197
|
+
type ItemProvider = (signal: AbortSignal) => UniItem[] | PromiseLike<UniItem[]>;
|
|
198
198
|
interface SearchMethod {
|
|
199
199
|
name: string;
|
|
200
200
|
sorts: {
|
|
@@ -202,7 +202,7 @@ interface SearchMethod {
|
|
|
202
202
|
value: string;
|
|
203
203
|
}[];
|
|
204
204
|
defaultSort: string;
|
|
205
|
-
fetchSearchResult: StreamQuery<
|
|
205
|
+
fetchSearchResult: StreamQuery<UniItem, {
|
|
206
206
|
input: string;
|
|
207
207
|
sort: string;
|
|
208
208
|
}>;
|
|
@@ -265,7 +265,7 @@ interface Tabbar {
|
|
|
265
265
|
tabbar: Tabbar;
|
|
266
266
|
}>;
|
|
267
267
|
}
|
|
268
|
-
type RouteToContent = (contentType_:
|
|
268
|
+
type RouteToContent = (contentType_: UniContentType_, id: string, ep: string, preload?: UniItem) => PromiseLike<any>;
|
|
269
269
|
interface Barcode {
|
|
270
270
|
match: (searchText: string) => boolean;
|
|
271
271
|
/**
|
|
@@ -305,8 +305,8 @@ declare namespace resource_d_exports {
|
|
|
305
305
|
export { Content };
|
|
306
306
|
}
|
|
307
307
|
interface Content {
|
|
308
|
-
process?: Record<string,
|
|
309
|
-
types?:
|
|
308
|
+
process?: Record<string, UniResourceProcessInstance>;
|
|
309
|
+
types?: UniResourceType[];
|
|
310
310
|
}
|
|
311
311
|
//#endregion
|
|
312
312
|
//#region lib/plugin/index.d.ts
|
|
@@ -917,7 +917,7 @@ declare const uninstallPlugin: (pluginName: string) => Promise<void>;
|
|
|
917
917
|
//#region lib/index.d.ts
|
|
918
918
|
declare module '@delta-comic/utils' {
|
|
919
919
|
interface SharedFunctions {
|
|
920
|
-
routeToContent(contentType_:
|
|
920
|
+
routeToContent(contentType_: UniContentType_, id: string, ep: string, preload?: UniItem): Promise<any>;
|
|
921
921
|
routeToSearch(input: string, source?: [plugin: string, name: string], sort?: string): Promise<any>;
|
|
922
922
|
pushShareToken(token: string): Promise<any>;
|
|
923
923
|
}
|
package/dist/lib/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as pluginI18n, B as require, C as findCyclePaths, D as pluginStore, E as PluginStore, F as declareDepType, G as definePlugin, H as useConfig, I as defaultDependencyRegistry, L as exposeSymbol, M as translatePluginText, N as DependencyRegistry, O as usePluginStore, P as createDependencyRegistry, R as pluginExposes, S as synchronizeBuiltInPlugins, T as planPluginLoadOrder, U as ConfigPointer, V as ConfigStore, W as defineInnerPlugin, _ as runtimeExtensions, a as PluginLoader, b as isBuiltInPlugin, c as filterPluginsBySelection, d as loader_exports, f as booter_exports, g as registerLoader, h as registerInstaller, i as PluginInstaller, j as pluginMessageKey, k as PluginI18nRegistry, l as pluginKind, m as registerBooter, n as install_exports, o as pluginRuntime, p as PluginRuntimeExtensions, r as PluginBooter, s as failedDependencies, t as Global, u as selectPluginsForPhase, v as BUILT_IN_PLUGIN_LOADER, w as formatPluginLoadPlanError, x as isBuiltInPluginName, y as builtInDefinitionToArchive, z as provide } from "../global-
|
|
1
|
+
import { A as pluginI18n, B as require, C as findCyclePaths, D as pluginStore, E as PluginStore, F as declareDepType, G as definePlugin, H as useConfig, I as defaultDependencyRegistry, L as exposeSymbol, M as translatePluginText, N as DependencyRegistry, O as usePluginStore, P as createDependencyRegistry, R as pluginExposes, S as synchronizeBuiltInPlugins, T as planPluginLoadOrder, U as ConfigPointer, V as ConfigStore, W as defineInnerPlugin, _ as runtimeExtensions, a as PluginLoader, b as isBuiltInPlugin, c as filterPluginsBySelection, d as loader_exports, f as booter_exports, g as registerLoader, h as registerInstaller, i as PluginInstaller, j as pluginMessageKey, k as PluginI18nRegistry, l as pluginKind, m as registerBooter, n as install_exports, o as pluginRuntime, p as PluginRuntimeExtensions, r as PluginBooter, s as failedDependencies, t as Global, u as selectPluginsForPhase, v as BUILT_IN_PLUGIN_LOADER, w as formatPluginLoadPlanError, x as isBuiltInPluginName, y as builtInDefinitionToArchive, z as provide } from "../global-3ZqxvD1L.mjs";
|
|
2
2
|
import { t as createPluginAssetUrl } from "../storage-DMKDlPzl.mjs";
|
|
3
3
|
import { logger } from "@delta-comic/logger";
|
|
4
4
|
import semver from "semver";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { A as pluginI18n, F as declareDepType, H as useConfig, O as usePluginStore, a as PluginLoader, g as registerLoader, h as registerInstaller, i as PluginInstaller, j as pluginMessageKey, m as registerBooter, r as PluginBooter, t as Global, z as provide } from "./global-
|
|
1
|
+
import { A as pluginI18n, F as declareDepType, H as useConfig, O as usePluginStore, a as PluginLoader, g as registerLoader, h as registerInstaller, i as PluginInstaller, j as pluginMessageKey, m as registerBooter, r as PluginBooter, t as Global, z as provide } from "./global-3ZqxvD1L.mjs";
|
|
2
2
|
import { a as installZipFile, c as readPluginText, i as installDevCode, n as createPluginModuleUrl, o as isTauriRuntime, s as listPluginFiles, t as createPluginAssetUrl } from "./storage-DMKDlPzl.mjs";
|
|
3
3
|
import { AwesomeRegistryClient, isPluginManifestCompatible, marketplaceDownloadToInstallInput, parsePluginManifest } from "./lib/index.mjs";
|
|
4
4
|
import { i as readLocalFile, r as prepareDevScript, t as decodeDevMeta } from "./native-CHH-Olpj.mjs";
|
|
5
5
|
import { isEmpty, sortBy } from "es-toolkit/compat";
|
|
6
6
|
import { defineComponent, h, markRaw, ref } from "vue";
|
|
7
|
-
import {
|
|
7
|
+
import { UniComment, UniContentPage, UniItem, UniResource, UniUser } from "@delta-comic/model";
|
|
8
8
|
import { createForm } from "@delta-comic/ui";
|
|
9
9
|
import { PageWebviewAuth } from "@delta-comic/utils";
|
|
10
10
|
import { logger } from "@delta-comic/logger";
|
|
@@ -23,16 +23,16 @@ var _ConfigSetter = class extends PluginBooter {
|
|
|
23
23
|
setMeta(pluginMessageKey("plugin.runtime.steps.presets.applying"));
|
|
24
24
|
const { name: plugin, content, resource, search, user, subscribe, share } = cfg;
|
|
25
25
|
if (content) for (const [ct, { commentRow, contentPage, downloadProvider, itemCard, layout, itemTranslator }] of Object.entries(content)) {
|
|
26
|
-
if (layout)
|
|
27
|
-
if (itemCard)
|
|
28
|
-
if (contentPage)
|
|
29
|
-
if (downloadProvider)
|
|
30
|
-
if (commentRow)
|
|
31
|
-
if (itemTranslator)
|
|
26
|
+
if (layout) UniContentPage.layouts.set(ct, layout);
|
|
27
|
+
if (itemCard) UniItem.itemCards.set(ct, itemCard);
|
|
28
|
+
if (contentPage) UniContentPage.contentPages.set(ct, contentPage);
|
|
29
|
+
if (downloadProvider) UniContentPage.downloadProviders.set(ct, downloadProvider);
|
|
30
|
+
if (commentRow) UniComment.commentRow.set(ct, commentRow);
|
|
31
|
+
if (itemTranslator) UniItem.itemTranslator.set(ct, itemTranslator);
|
|
32
32
|
}
|
|
33
33
|
if (resource) {
|
|
34
|
-
if (resource.types) for (const type of resource.types)
|
|
35
|
-
if (resource.process) for (const [name, fn] of Object.entries(resource.process))
|
|
34
|
+
if (resource.types) for (const type of resource.types) UniResource.fork.set([plugin, type.type], type);
|
|
35
|
+
if (resource.process) for (const [name, fn] of Object.entries(resource.process)) UniResource.processInstances.set([plugin, name], fn);
|
|
36
36
|
}
|
|
37
37
|
if (search) {
|
|
38
38
|
if (search.categories) for (const c of search.categories) Global.addCategories(plugin, c);
|
|
@@ -46,10 +46,10 @@ var _ConfigSetter = class extends PluginBooter {
|
|
|
46
46
|
if (search.hotSearch) for (const provider of search.hotSearch) Global.addHotSearch(plugin, provider);
|
|
47
47
|
}
|
|
48
48
|
if (user) {
|
|
49
|
-
if (user.card)
|
|
50
|
-
if (user.edit)
|
|
49
|
+
if (user.card) UniUser.userCards.set(plugin, user.card);
|
|
50
|
+
if (user.edit) UniUser.userEditorBase.set(plugin, user.edit);
|
|
51
51
|
if (user.userActions) for (const [type, value] of Object.entries(user.userActions)) Global.userActions.set([plugin, type], value);
|
|
52
|
-
if (user.authorIcon) for (const [key, value] of Object.entries(user.authorIcon))
|
|
52
|
+
if (user.authorIcon) for (const [key, value] of Object.entries(user.authorIcon)) UniItem.authorIcon.set([plugin, key], value);
|
|
53
53
|
}
|
|
54
54
|
if (subscribe) for (const [key, value] of Object.entries(subscribe)) Global.subscribes.set([plugin, key], value);
|
|
55
55
|
if (cfg.config) for (const config of cfg.config) useConfig().$registerConfig(config);
|
|
@@ -151,7 +151,7 @@ var _TestPluginResource$1 = class extends PluginBooter {
|
|
|
151
151
|
const results = await Promise.all(types.map((type) => testResourceApi(type.val)));
|
|
152
152
|
const displayResult = new Array();
|
|
153
153
|
types.forEach((type, i) => {
|
|
154
|
-
if (results[i][1])
|
|
154
|
+
if (results[i][1]) UniResource.precedenceFork.set([cfg.name, type.type], results[i][0]);
|
|
155
155
|
displayResult.push([type, results[i][1]]);
|
|
156
156
|
});
|
|
157
157
|
if (results.some((v) => v[1] == false)) {
|
|
@@ -412,7 +412,7 @@ var _30_dev_default = new _PluginInstallByDev();
|
|
|
412
412
|
//#endregion
|
|
413
413
|
//#region lib/features/core/installers/40_github.ts
|
|
414
414
|
const defaultGitHubInstallerDependencies = {
|
|
415
|
-
coreVersion: "3.0.0-next.
|
|
415
|
+
coreVersion: "3.0.0-next.5",
|
|
416
416
|
downloadAsset: async (url) => await downloadInstallerAsset(url, { retry: 2 }),
|
|
417
417
|
getConfig: () => useConfig().$loadApp().data.value,
|
|
418
418
|
async *listReleasePages(owner, repo, token) {
|
|
@@ -660,4 +660,4 @@ const registerCoreRuntimeExtensions = () => {
|
|
|
660
660
|
//#endregion
|
|
661
661
|
export { registerCoreRuntimeExtensions };
|
|
662
662
|
|
|
663
|
-
//# sourceMappingURL=runtime-
|
|
663
|
+
//# sourceMappingURL=runtime-C6MmbYYH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-C6MmbYYH.mjs","names":["_TestPluginResource","pkg.version","configSetter","i18n","apiTest","resourceTest","boot","auth","otherProgress","zipLoader","devLoader","fallbackUrlInstaller","localInstaller","devInstaller","githubInstaller","awesomeInstaller"],"sources":["../lib/features/core/booters/0_configSetter.ts","../lib/features/core/booters/5_i18n.ts","../lib/features/core/booters/utils.ts","../lib/features/core/booters/10_apiTest.ts","../lib/features/core/booters/20_resourceTest.ts","../lib/features/core/booters/30_boot.ts","../lib/features/core/booters/40_auth.ts","../lib/plugin/otherProgress.ts","../lib/features/core/booters/50_otherProcess.ts","../lib/features/core/installers/downloadAsset.ts","../lib/features/core/installers/10_normalUrl.ts","../lib/features/core/installers/20_local.ts","../lib/features/core/installers/30_dev.ts","../package.json","../lib/features/core/installers/40_github.ts","../lib/features/core/installers/9999_awesome.ts","../lib/features/core/loaders/1_zip.ts","../lib/features/core/loaders/2_dev.ts","../lib/features/core/runtime.ts"],"sourcesContent":["import { logger } from '@delta-comic/logger'\nimport { UniComment, UniContentPage, UniItem, UniResource, UniUser } from '@delta-comic/model'\n\nimport { useConfig } from '@/config'\nimport { Global } from '@/global'\nimport { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nconst configSetterLogger = logger.scoped('plugin:config-setter')\n\nclass _ConfigSetter extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.presets.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n configSetterLogger.debug('registering plugin capabilities', { plugin: cfg.name })\n setMeta(pluginMessageKey('plugin.runtime.steps.presets.applying'))\n const { name: plugin, content, resource, search, user, subscribe, share } = cfg\n if (content)\n for (const [\n ct,\n { commentRow, contentPage, downloadProvider, itemCard, layout, itemTranslator },\n ] of Object.entries(content)) {\n if (layout) UniContentPage.layouts.set(ct, layout)\n if (itemCard) UniItem.itemCards.set(ct, itemCard)\n if (contentPage) UniContentPage.contentPages.set(ct, contentPage)\n if (downloadProvider) UniContentPage.downloadProviders.set(ct, downloadProvider)\n if (commentRow) UniComment.commentRow.set(ct, commentRow)\n if (itemTranslator) UniItem.itemTranslator.set(ct, itemTranslator)\n }\n\n if (resource) {\n if (resource.types)\n for (const type of resource.types) UniResource.fork.set([plugin, type.type], type)\n if (resource.process)\n for (const [name, fn] of Object.entries(resource.process))\n UniResource.processInstances.set([plugin, name], fn)\n }\n if (search) {\n if (search.categories) for (const c of search.categories) Global.addCategories(plugin, c)\n if (search.tabbar) for (const c of search.tabbar) Global.addTabbar(plugin, c)\n if (search.hotPage) {\n for (const mlc of search.hotPage.mainListCard ?? []) Global.addMainList(plugin, mlc)\n for (const lb of search.hotPage.levelBoard ?? []) Global.addLevelboard(plugin, lb)\n for (const tb of search.hotPage.topButton ?? []) Global.addTopButton(plugin, tb)\n }\n if (search.barcode) {\n for (const barcode of search.barcode ?? []) Global.addBarcode(plugin, barcode)\n }\n if (search.hotSearch) {\n for (const provider of search.hotSearch) Global.addHotSearch(plugin, provider)\n }\n }\n if (user) {\n if (user.card) UniUser.userCards.set(plugin, user.card)\n if (user.edit) UniUser.userEditorBase.set(plugin, user.edit as any)\n if (user.userActions)\n for (const [type, value] of Object.entries(user.userActions))\n Global.userActions.set([plugin, type], value)\n if (user.authorIcon)\n for (const [key, value] of Object.entries(user.authorIcon))\n UniItem.authorIcon.set([plugin, key], value as any)\n }\n if (subscribe) {\n for (const [key, value] of Object.entries(subscribe))\n Global.subscribes.set([plugin, key], value)\n }\n if (cfg.config) {\n for (const config of cfg.config) useConfig().$registerConfig(config)\n }\n if (share) {\n for (const v of share.initiative ?? []) Global.share.set([plugin, v.key], v)\n for (const v of share.tokenListen ?? []) Global.shareToken.set([plugin, v.key], v)\n }\n }\n}\nexport default new _ConfigSetter()","import { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter } from '../../../driver/extensionTypes'\n\nclass PluginI18nBooter extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.language.title')\n\n public override async call(cfg: PluginConfig): Promise<void> {\n if (cfg.i18n) pluginI18n.register(cfg.name, cfg.i18n)\n }\n}\n\nexport default new PluginI18nBooter()","import { logger } from '@delta-comic/logger'\nimport { isEmpty, sortBy } from 'es-toolkit/compat'\n\nimport type { PluginConfig } from '@/plugin'\n\nconst pluginProbeLogger = logger.scoped('plugin:probe')\n\nexport const testApi = async (cfg: NonNullable<PluginConfig['api']>[string]) => {\n const forks = await cfg.forks()\n return await test(forks, cfg.test)\n}\n\nexport const testResourceApi = (\n cfg: NonNullable<NonNullable<PluginConfig['resource']>['types']>[number],\n) => {\n const forks = cfg.urls\n return test(forks, cfg.test)\n}\n\nconst test = async (\n forks: string[],\n test: (url: string, signal: AbortSignal) => PromiseLike<any>,\n) => {\n if (isEmpty(forks)) throw new Error('[plugin test] no fork found')\n const record: [url: string, result: false | number][] = []\n const abortController = new AbortController()\n try {\n await Promise.all(\n forks.map(async (_fork, index) => {\n try {\n const begin = Date.now()\n const stopTimeout = setTimeout(() => {\n abortController.abort()\n }, 10000)\n await test(_fork, abortController.signal)\n clearTimeout(stopTimeout)\n const end = Date.now()\n const time = end - begin\n record.push([_fork, time])\n pluginProbeLogger.debug('plugin endpoint probe succeeded', { index, latencyMs: time })\n abortController.abort()\n } catch {\n record.push([_fork, false])\n pluginProbeLogger.debug('plugin endpoint probe failed', { index })\n }\n }),\n )\n } catch (err) {\n pluginProbeLogger.debug('plugin endpoint probe aborted', err)\n }\n const result = sortBy(\n record.filter(v => v[1] != false),\n v => v[1],\n )[0]\n pluginProbeLogger.debug('plugin endpoint probe completed', { found: Boolean(result) })\n if (!result) {\n return ['', false] as [string, false]\n }\n return result\n}","import { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nimport { testApi } from './utils'\n\nexport type _TestPluginApiResult = Record<string, string | false | undefined>\n\nclass _TestPluginApi extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.apiTest.title')\n public override async call(\n cfg: PluginConfig,\n setMeta: PluginBooterSetMeta,\n env: Record<any, any>,\n ): Promise<any> {\n if (!cfg.api) return\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.starting'))\n\n const namespaces = Object.keys(cfg.api)\n const results = await Promise.all(namespaces.map(namespace => testApi(cfg.api![namespace])))\n const displayResult = new Array<[namespace: string, time: number | false]>()\n const api: _TestPluginApiResult = {}\n namespaces.forEach((namespace, i) => {\n api[namespace] = results[i][0]\n displayResult.push([namespace, results[i][1]])\n })\n\n env.api = api\n\n if (Object.values(api).some(v => v == false)) {\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.unreachable'))\n throw new Error('can not connect to server')\n }\n setMeta(\n pluginI18n.translate('plugin.runtime.steps.tests.complete', {\n results: displayResult.map(ent => `${ent[0]} -> ${ent[1]} ms`).join('\\n'),\n }),\n )\n }\n}\nexport default new _TestPluginApi()","import { UniResource } from '@delta-comic/model'\n\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nimport { testResourceApi } from './utils'\n\nclass _TestPluginResource extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.resourceTest.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.resource?.types?.length) return\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.starting'))\n\n const types = cfg.resource.types.map(v => ({ type: v.type, val: v }))\n const results = await Promise.all(types.map(type => testResourceApi(type.val)))\n const displayResult = new Array<[type: (typeof types)[number], time: number | false]>()\n types.forEach((type, i) => {\n if (results[i][1]) UniResource.precedenceFork.set([cfg.name, type.type], results[i][0])\n displayResult.push([type, results[i][1]])\n })\n if (results.some(v => v[1] == false)) {\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.unreachable'))\n throw new Error('[plugin test] can not connect to server')\n }\n setMeta(\n pluginI18n.translate('plugin.runtime.steps.tests.complete', {\n results: displayResult.map(ent => `${ent[0].type} -> ${ent[1]} ms`).join('\\n'),\n }),\n )\n }\n}\nexport default new _TestPluginResource()","import { declareDepType, provide } from '@/depends'\nimport { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter } from '../../../driver/extensionTypes'\n\nclass _ExposeBootPlugin extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.customBoot.title')\n public override async call(cfg: PluginConfig, _: any, env: Record<any, any>): Promise<any> {\n if (!cfg.onBooted) return\n const expose = await cfg.onBooted({ api: env.api })\n if (expose) provide(declareDepType(cfg.name), expose)\n }\n}\nexport default new _ExposeBootPlugin()","import { logger } from '@delta-comic/logger'\nimport { createForm } from '@delta-comic/ui'\nimport { PageWebviewAuth } from '@delta-comic/utils'\nimport { Mutex } from 'es-toolkit'\nimport { NModal, useDialog } from 'naive-ui'\nimport { defineComponent, h, markRaw, ref } from 'vue'\n\nimport { usePluginStore } from '@/driver/store'\nimport { Global } from '@/global'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { Auth, PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nconst pluginAuthLogger = logger.scoped('plugin:auth')\n\nconst authPopupMutex = new Mutex()\n\nclass _PluginAuth extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.auth.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.auth) return\n const pluginStore = usePluginStore()\n let mutexAcquired = false\n try {\n const pluginName = pluginStore.$getI18nName(cfg.name)\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.checking'))\n const isPass = await cfg.auth.passSelect()\n const waitMethod = Promise.withResolvers<'logIn' | 'signUp'>()\n pluginAuthLogger.info('plugin authentication state checked', {\n authenticated: Boolean(isPass),\n plugin: cfg.name,\n })\n await authPopupMutex.acquire()\n mutexAcquired = true\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.waiting'))\n if (!isPass) {\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.selecting'))\n void useDialog().create({\n type: 'default',\n positiveText: pluginI18n.translate('plugin.runtime.steps.auth.logIn'),\n negativeText: pluginI18n.translate('plugin.runtime.steps.auth.signUp'),\n closable: false,\n maskClosable: false,\n content: pluginI18n.translate('plugin.runtime.steps.auth.selectMethod'),\n title: pluginName,\n onNegativeClick() {\n waitMethod.resolve('signUp')\n },\n onPositiveClick() {\n waitMethod.resolve('logIn')\n },\n })\n } else {\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.skipping'))\n waitMethod.resolve(isPass)\n }\n const method = await waitMethod.promise\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.authenticating'))\n const by: Auth.Method = {\n async form(form) {\n const formInstance = createForm(form)\n Global.addGlobalNode(\n markRaw(\n defineComponent(() => {\n const show = ref(true)\n void formInstance.data.then(() => (show.value = false))\n return () =>\n h(\n NModal,\n { show: show.value, position: 'center', preset: 'dialog', title: pluginName },\n formInstance.comp,\n )\n }),\n ),\n cfg.name,\n )\n const data = await formInstance.data\n return data\n },\n async website<T>(\n url: string,\n injectCode: Auth.InjectCode,\n ): Promise<Auth.CallbackResult<T>> {\n const auth = new PageWebviewAuth<T>(url, injectCode, { title: pluginName })\n return auth.mount()\n },\n }\n if (method == 'logIn') {\n await cfg.auth.logIn(by)\n } else if (method == 'signUp') {\n await cfg.auth.signUp(by)\n }\n authPopupMutex.release()\n mutexAcquired = false\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.success'))\n pluginAuthLogger.info('plugin authentication completed', { plugin: cfg.name })\n } catch (error: any) {\n if (mutexAcquired) authPopupMutex.release()\n setMeta(pluginI18n.translate('plugin.runtime.steps.auth.failure', { error: String(error) }))\n pluginAuthLogger.error('plugin authentication failed', { plugin: cfg.name }, error)\n throw error\n }\n }\n}\nexport default new _PluginAuth()","export interface Config {\n /** Run immediately with adjacent async steps; a trailing async group does not block loading. */\n async?: boolean\n call: (setDescription: (description: string) => void) => PromiseLike<any>\n name: string\n}\n\nexport interface OtherProgressRunnerOptions {\n onBackgroundError?: (error: AggregateError) => void\n setMeta: (meta: { description: string; name: string }) => void\n}\n\nconst runProgress = async (progress: Config, setMeta: OtherProgressRunnerOptions['setMeta']) => {\n setMeta({ name: progress.name, description: '' })\n await progress.call(description => setMeta({ name: progress.name, description }))\n}\n\nexport const runOtherProgress = async (\n progresses: readonly Config[],\n {\n setMeta,\n onBackgroundError = error => otherProgressLogger.error('background plugin steps failed', error),\n }: OtherProgressRunnerOptions,\n) => {\n let parallelGroup: Promise<void>[] = []\n\n for (const progress of progresses) {\n if (progress.async) {\n otherProgressLogger.debug('background plugin step started', { name: progress.name })\n parallelGroup.push(runProgress(progress, setMeta))\n continue\n }\n\n if (parallelGroup.length > 0) {\n await Promise.all(parallelGroup)\n parallelGroup = []\n }\n await runProgress(progress, setMeta)\n otherProgressLogger.debug('plugin step completed', { name: progress.name })\n }\n\n if (parallelGroup.length === 0) return\n void Promise.allSettled(parallelGroup).then(results => {\n const errors = results.flatMap(result => (result.status === 'rejected' ? [result.reason] : []))\n if (errors.length > 0) onBackgroundError(new AggregateError(errors, '后台插件步骤执行失败'))\n })\n}\nimport { logger } from '@delta-comic/logger'\n\nconst otherProgressLogger = logger.scoped('plugin:background-progress')","import { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\nimport { runOtherProgress } from '@/plugin/otherProgress'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nclass _TestPluginResource extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.other.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.otherProgress?.length) return\n\n await runOtherProgress(cfg.otherProgress, { setMeta })\n }\n}\nexport default new _TestPluginResource()","import { Downloader } from '@delta-comic/downloader'\nimport { logger } from '@delta-comic/logger'\nimport ky from 'ky'\n\nimport { isTauriRuntime } from '../../../driver/init/storage'\n\nexport const MAX_PLUGIN_ASSET_BYTES = 128 * 1024 * 1024\nexport const PLUGIN_DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000\n\nconst downloader = Downloader.get()\nconst assetLogger = logger.scoped('plugin:install:asset')\n\nexport interface DownloadInstallerAssetOptions {\n retry: number\n maxBytes?: number\n}\n\n/**\n * Managed downloads are intentionally bypassed here: installer assets are temporary and must\n * never appear in the user's download queue or leave a task record behind.\n */\nexport const downloadInstallerAsset = async (\n url: string,\n options: DownloadInstallerAssetOptions,\n): Promise<Blob> => {\n assetLogger.info('installer asset download started', {\n maxBytes: options.maxBytes ?? MAX_PLUGIN_ASSET_BYTES,\n runtime: isTauriRuntime() ? 'tauri' : 'web',\n })\n if (isTauriRuntime()) {\n const bytes = await downloader.downloadEphemeral(url, {\n maxBytes: options.maxBytes ?? MAX_PLUGIN_ASSET_BYTES,\n })\n assetLogger.info('installer asset download completed', { bytes: bytes.byteLength })\n return new Blob([bytes])\n }\n\n const blob = await ky\n .get(url, { retry: options.retry, timeout: PLUGIN_DOWNLOAD_TIMEOUT_MS })\n .blob()\n assetLogger.info('installer asset download completed', { bytes: blob.size })\n return blob\n}","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginMessageKey } from '../../../i18n'\n\nimport { downloadInstallerAsset } from './downloadAsset'\n\nconst getFileName = (input: string): string => {\n const url = new URL(input)\n const encoded = url.pathname.split('/').filter(Boolean).at(-1) ?? url.hostname\n let decoded = encoded\n try {\n decoded = decodeURIComponent(encoded)\n } catch {\n // Keep malformed percent escapes verbatim; URL parsing has already validated the input.\n }\n const withoutControlCharacters = [...decoded]\n .map(character => {\n const code = character.charCodeAt(0)\n return code < 32 || code === 127 ? '_' : character\n })\n .join('')\n return withoutControlCharacters.replace(/[<>:\"/\\\\|?*]/g, '_').trim() || 'us.js'\n}\n\nexport class _PluginInstallByFallbackUrl extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.url.title'),\n description: pluginMessageKey('plugin.install.methods.url.description'),\n }\n public override name = 'fallbackUrl'\n private async installer(input: string): Promise<File> {\n const data = await downloadInstallerAsset(input, { retry: 3 })\n return new File([data], getFileName(input))\n }\n\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n\n public override isMatched(input: string): boolean {\n return URL.canParse(input)\n }\n}\n\nexport default new _PluginInstallByFallbackUrl()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { readLocalFile } from '../../../driver/init/native'\nimport { isTauriRuntime } from '../../../driver/init/storage'\nimport { pluginMessageKey } from '../../../i18n'\n\nexport class _PluginInstallByLocal extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.local.title'),\n description: pluginMessageKey('plugin.install.methods.local.description'),\n }\n public override name = 'local'\n private async installer(input: string): Promise<File> {\n const path = decodeURIComponent(input.replace(/^local:/, ''))\n return await readLocalFile(path)\n }\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override isMatched(input: string): boolean {\n return isTauriRuntime() && input.startsWith('local:')\n }\n}\n\nexport default new _PluginInstallByLocal()","import type { PluginArchiveDB } from '@delta-comic/db'\nimport ky from 'ky'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { prepareDevScript } from '../../../driver/init/native'\nimport { pluginMessageKey } from '../../../i18n'\n\nexport class _PluginInstallByDev extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.development.title'),\n description: pluginMessageKey('plugin.install.methods.development.description'),\n }\n public override name = 'devUrl'\n private async installer(input: string): Promise<File> {\n const res = await ky\n .get(\n `http://${/:\\d+$/.test(input) ? input : input + ':6173'}/__vite-plugin-monkey.install.user.js?origin=http%3A%2F%2F${input}%3A6173`,\n )\n .text()\n const processed = await prepareDevScript(input, res)\n return new File([processed], 'us.js')\n }\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override isMatched(input: string): boolean {\n return /^(((\\d+\\.?)+)|(localhost))(:\\d+)?$/.test(input)\n }\n}\n\nexport default new _PluginInstallByDev()","","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { Octokit } from '@octokit/rest'\n\nimport pkg from '../../../../package.json'\nimport { useConfig } from '../../../config'\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginI18n, pluginMessageKey } from '../../../i18n'\nimport { isPluginManifestCompatible, parsePluginManifest } from '../../../manifest'\n\nimport { downloadInstallerAsset } from './downloadAsset'\n\ntype GitHubRelease = Awaited<ReturnType<Octokit['rest']['repos']['listReleases']>>['data'][number]\n\ninterface GitHubInstallerConfig {\n githubToken: string\n receivePerReleaseUpdate: boolean\n}\n\nexport interface GitHubInstallerDependencies {\n coreVersion: string\n downloadAsset: (url: string) => Promise<Blob>\n getConfig: () => GitHubInstallerConfig\n listReleasePages: (\n owner: string,\n repo: string,\n token?: string,\n ) => AsyncIterable<readonly GitHubRelease[]>\n}\n\nexport const defaultGitHubInstallerDependencies: GitHubInstallerDependencies = {\n coreVersion: pkg.version,\n downloadAsset: async url => await downloadInstallerAsset(url, { retry: 2 }),\n getConfig: () => useConfig().$loadApp().data.value,\n async *listReleasePages(owner, repo, token) {\n const octokit = new Octokit({ auth: token })\n const pages = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner,\n per_page: 100,\n repo,\n })\n for await (const page of pages) yield page.data\n },\n}\n\nconst parseRepository = (input: string) => {\n const [owner, repo, ...rest] = input.replace(/^gh:/, '').split('/')\n if (!owner || !repo || rest.length > 0) {\n throw new Error(pluginI18n.translate('plugin.install.errors.invalidGitHub', { input }))\n }\n return { owner, repo }\n}\n\nconst decodeManifest = async (blob: Blob): Promise<PluginArchiveDB.Meta | undefined> => {\n try {\n return parsePluginManifest(JSON.parse(await blob.text()))\n } catch {\n return undefined\n }\n}\n\ninterface CompatibleRelease {\n manifest: Blob\n plugin: GitHubRelease['assets'][number]\n}\n\nexport class _PluginInstallByNormalUrl extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.github.title'),\n description: pluginMessageKey('plugin.install.methods.github.description'),\n }\n public override name = 'github'\n\n public constructor(private readonly dependencies = defaultGitHubInstallerDependencies) {\n super()\n }\n\n private async findCompatibleRelease(input: string): Promise<CompatibleRelease> {\n const { githubToken, receivePerReleaseUpdate } = this.dependencies.getConfig()\n const { owner, repo } = parseRepository(input)\n const pages = this.dependencies.listReleasePages(owner, repo, githubToken || undefined)\n\n for await (const releases of pages) {\n for (const release of releases) {\n if (release.draft || (!receivePerReleaseUpdate && release.prerelease)) continue\n\n const manifestAsset = release.assets.find(asset => asset.name === 'manifest.json')\n const plugin = release.assets.find(asset => asset.name === 'plugin.zip')\n if (!manifestAsset || !plugin) continue\n\n const manifest = await this.dependencies.downloadAsset(manifestAsset.browser_download_url)\n const meta = await decodeManifest(manifest)\n if (!meta || !isPluginManifestCompatible(meta, this.dependencies.coreVersion)) {\n continue\n }\n return { manifest, plugin }\n }\n }\n\n throw new Error(\n pluginI18n.translate('plugin.install.errors.noCompatibleRelease', {\n version: this.dependencies.coreVersion,\n }),\n )\n }\n\n private async installer(input: string): Promise<File> {\n const { plugin } = await this.findCompatibleRelease(input)\n const data = await this.dependencies.downloadAsset(plugin.browser_download_url)\n return new File([data], plugin.name)\n }\n\n public override async download(input: string): Promise<File> {\n return await this.installer(input)\n }\n\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n return await this.installer(pluginMeta.installInput)\n }\n\n public override async fetchPluginMetaFile(input: string): Promise<File> {\n const { manifest } = await this.findCompatibleRelease(input)\n return new File([manifest], 'manifest.json')\n }\n\n public override isMatched(input: string): boolean {\n return input.startsWith('gh:') && input.split('/').length === 2\n }\n}\n\nexport default new _PluginInstallByNormalUrl()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginI18n, pluginMessageKey } from '../../../i18n'\nimport {\n AwesomeRegistryClient,\n marketplaceDownloadToInstallInput,\n type AwesomePluginListing,\n} from '../../../marketplace'\n\nexport interface AwesomeInstallerRegistry {\n findListing(id: string): Promise<AwesomePluginListing>\n loadManifest(listing: AwesomePluginListing): Promise<PluginArchiveDB.Meta | undefined>\n}\n\nexport class _PluginInstallByAwesome extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.marketplace.title'),\n description: pluginMessageKey('plugin.install.methods.marketplace.description'),\n }\n public override name = 'awesome'\n public constructor(\n private readonly registry: AwesomeInstallerRegistry = new AwesomeRegistryClient(),\n ) {\n super()\n }\n\n private async listing(input: string) {\n const match = /^ap:([A-Za-z0-9][A-Za-z0-9_-]{0,63})$/.exec(input)\n if (!match) {\n throw new Error(pluginI18n.translate('plugin.install.errors.invalidMarketplaceId', { input }))\n }\n return await this.registry.findListing(match[1])\n }\n\n private async installer(input: string): Promise<File | string> {\n const listing = await this.listing(input)\n return marketplaceDownloadToInstallInput(listing.download)\n }\n public override async download(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File | string> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const listing = await this.listing(input)\n const manifest = await this.registry.loadManifest(listing)\n if (!manifest) return marketplaceDownloadToInstallInput(listing.download)\n return new File([JSON.stringify(manifest)], 'manifest.json', { type: 'application/json' })\n }\n public override isMatched(input: string): boolean {\n return /^ap:[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(input)\n }\n}\n\nexport default new _PluginInstallByAwesome()","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport JSZip from 'jszip'\n\nimport { pluginI18n } from '@/i18n'\nimport type { PluginConfigFactory } from '@/plugin'\n\nimport { PluginLoader, type PluginLoaderInstallContext } from '../../../driver/extensionTypes'\nimport {\n createPluginAssetUrl,\n createPluginModuleUrl,\n installZipFile,\n isTauriRuntime,\n listPluginFiles,\n readPluginText,\n} from '../../../driver/init/storage'\n\nconst zipLoaderLogger = logger.scoped('plugin:loader:zip')\n\nexport const rewriteCssAssetUrls = async (\n cssPath: string,\n css: string,\n createAssetUrl: (path: string) => Promise<string>,\n) => {\n const pattern = /url\\(\\s*(?:([\"'])(.*?)\\1|([^)'\"\\s][^)]*?))\\s*\\)/g\n let output = ''\n let cursor = 0\n for (const match of css.matchAll(pattern)) {\n const index = match.index\n const rawUrl = (match[2] ?? match[3] ?? '').trim()\n if (!rawUrl || /^(?:#|blob:|data:|https?:|\\/\\/)/i.test(rawUrl)) continue\n const resolved = new URL(rawUrl, `https://plugin.local/${cssPath}`)\n const assetUrl = await createAssetUrl(resolved.pathname.slice(1))\n output += css.slice(cursor, index) + `url(\"${assetUrl}${resolved.search}${resolved.hash}\")`\n cursor = index + match[0].length\n }\n return output + css.slice(cursor)\n}\n\nexport default new (class extends PluginLoader {\n public override name = 'zip'\n public override async install(\n file: File,\n context?: PluginLoaderInstallContext,\n ): Promise<PluginArchiveDB.Meta> {\n zipLoaderLogger.info('zip plugin installation started', { bytes: file.size })\n return await installZipFile(file, progress => {\n const percent = progress.total > 0 ? (progress.current / progress.total) * 90 : 0\n context?.report({\n description: progress.path\n ? pluginI18n.translate('plugin.progress.extractingPath', { path: progress.path })\n : pluginI18n.translate('plugin.progress.extracting'),\n progress: percent,\n })\n })\n }\n public override canInstall(file: File): boolean {\n return file.name.endsWith('.zip')\n }\n\n public override async load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined> {\n zipLoaderLogger.debug('zip plugin module load started', { plugin: pluginMeta.pluginName })\n if (!pluginMeta.meta.entry) throw new Error('not found entry')\n const files = await listPluginFiles(pluginMeta.pluginName)\n const javascriptFiles = files.filter(path => /\\.(?:js|mjs)$/i.test(path))\n if (!isTauriRuntime() && javascriptFiles.length > 1) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.webSingleFile', {\n files: javascriptFiles.join(', '),\n }),\n )\n }\n const src = await createPluginModuleUrl(pluginMeta.pluginName, pluginMeta.meta.entry.jsPath)\n const config = await import(/* @vite-ignore */ src).finally(() => {\n if (src.startsWith('blob:')) URL.revokeObjectURL(src)\n })\n const result = config.default as PluginConfigFactory | undefined\n\n if (!pluginMeta.meta.entry?.cssPath) return result\n const cssPath = pluginMeta.meta.entry.cssPath\n\n if (cssPath == 'auto') {\n const discovered = files.find(path => path.endsWith('.css'))\n if (!discovered) return result\n var filePath = discovered\n } else var filePath = cssPath\n\n const style = document.createElement('style')\n style.dataset.plugin = pluginMeta.pluginName\n style.textContent = await rewriteCssAssetUrls(\n filePath,\n await readPluginText(pluginMeta.pluginName, filePath),\n path => createPluginAssetUrl(pluginMeta.pluginName, path),\n )\n document.head.appendChild(style)\n zipLoaderLogger.debug('zip plugin stylesheet attached', { plugin: pluginMeta.pluginName })\n\n return result\n }\n public override async decodeMeta(file: File): Promise<PluginArchiveDB.Meta> {\n const zip = await JSZip.loadAsync(file)\n const manifest = zip.file('manifest.json')\n if (!manifest) throw new Error('plugin archive does not contain manifest.json')\n return JSON.parse(await manifest.async('text')) as PluginArchiveDB.Meta\n }\n\n public override isMetaFile(file: File): boolean {\n return file.name.endsWith('.zip') || file.name == 'manifest.json'\n }\n public override async decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string> {\n if (file.name == 'manifest.json') return JSON.parse(await file.text())\n const jszip = new JSZip()\n const zip = await jszip.loadAsync(file)\n const mFile = await zip.filter(p => p == 'manifest.json')[0].async('text')\n return JSON.parse(mFile)\n }\n})()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type { PluginConfigFactory } from '@/plugin'\n\nimport { PluginLoader } from '../../../driver/extensionTypes'\nimport { decodeDevMeta } from '../../../driver/init/native'\nimport { installDevCode, readPluginText } from '../../../driver/init/storage'\n\nexport default new (class extends PluginLoader {\n public override name = 'dev'\n\n public override async install(file: File): Promise<PluginArchiveDB.Meta> {\n const code = await file.text()\n return await installDevCode(code)\n }\n public override canInstall(file: File): boolean {\n return file.name.endsWith('.js')\n }\n\n public override async load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined> {\n const code = await readPluginText(pluginMeta.pluginName, 'us.js')\n const lastIndex = code.lastIndexOf(';') + 1\n\n const blob = new Blob([code.slice(0, lastIndex)], { type: 'text/javascript' })\n\n const url = URL.createObjectURL(blob)\n try {\n const mod: { default: any } = await import(/* @vite-ignore */ url)\n return mod.default as PluginConfigFactory | undefined\n } finally {\n URL.revokeObjectURL(url)\n }\n }\n public override async decodeMeta(file: File): Promise<PluginArchiveDB.Meta> {\n const code = await file.text()\n return await decodeDevMeta(code)\n }\n\n public override isMetaFile(file: File): boolean {\n return file.name.endsWith('.js')\n }\n public override async decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string> {\n return this.decodeMeta(file)\n }\n})()","import { registerBooter, registerInstaller, registerLoader } from '../../driver/extensions'\n\nimport configSetter from './booters/0_configSetter'\nimport i18n from './booters/5_i18n'\nimport apiTest from './booters/10_apiTest'\nimport resourceTest from './booters/20_resourceTest'\nimport boot from './booters/30_boot'\nimport auth from './booters/40_auth'\nimport otherProgress from './booters/50_otherProcess'\nimport fallbackUrlInstaller from './installers/10_normalUrl'\nimport localInstaller from './installers/20_local'\nimport devInstaller from './installers/30_dev'\nimport githubInstaller from './installers/40_github'\nimport awesomeInstaller from './installers/9999_awesome'\nimport zipLoader from './loaders/1_zip'\nimport devLoader from './loaders/2_dev'\n\nlet registered = false\n\nexport const registerCoreRuntimeExtensions = () => {\n if (registered) return\n registered = true\n\n registerBooter(configSetter, { order: 0 })\n registerBooter(i18n, { order: 5 })\n registerBooter(apiTest, { order: 10 })\n registerBooter(resourceTest, { order: 20 })\n registerBooter(boot, { order: 30 })\n registerBooter(auth, { order: 40 })\n registerBooter(otherProgress, { order: 50 })\n\n registerLoader(zipLoader, { order: 1 })\n registerLoader(devLoader, { order: 2 })\n\n registerInstaller(fallbackUrlInstaller, { order: 10 })\n registerInstaller(localInstaller, { order: 20 })\n registerInstaller(devInstaller, { order: 30 })\n registerInstaller(githubInstaller, { order: 40 })\n registerInstaller(awesomeInstaller, { order: 9999 })\n}"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@delta-comic/plugin",
|
|
3
|
-
"version": "3.0.0-next.
|
|
3
|
+
"version": "3.0.0-next.5",
|
|
4
4
|
"description": "空阙虱楼",
|
|
5
5
|
"homepage": "https://github.com/delta-comic/delta-comic",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"lz-string": "^1.5.0",
|
|
44
44
|
"semver": "^7.8.1",
|
|
45
45
|
"vite-plugin-monkey": "^8.0.6",
|
|
46
|
-
"@delta-comic/downloader": "3.0.0-next.
|
|
47
|
-
"@delta-comic/logger": "3.0.0-next.
|
|
46
|
+
"@delta-comic/downloader": "3.0.0-next.5",
|
|
47
|
+
"@delta-comic/logger": "3.0.0-next.5"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/semver": "^7.7.1",
|
|
@@ -54,10 +54,10 @@
|
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"naive-ui": "^2.44.1",
|
|
56
56
|
"vue": "^3.5.40",
|
|
57
|
-
"@delta-comic/
|
|
58
|
-
"@delta-comic/
|
|
59
|
-
"@delta-comic/
|
|
60
|
-
"@delta-comic/
|
|
57
|
+
"@delta-comic/model": "3.0.0-next.5",
|
|
58
|
+
"@delta-comic/db": "3.0.0-next.5",
|
|
59
|
+
"@delta-comic/utils": "3.0.0-next.5",
|
|
60
|
+
"@delta-comic/ui": "3.0.0-next.5"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build": "vp pack",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"global-B4SQiBzS.mjs","names":["useDbConfig","useConfig","__import_glob__0_0_","useConfig","useConfig","useConfig"],"sources":["../lib/plugin/index.ts","../lib/configPointer.ts","../lib/features/core/config.ts","../lib/config.ts","../lib/depends.ts","../lib/i18n.ts","../lib/driver/store.ts","../lib/driver/loadPlan.ts","../lib/features/core/feature.ts","../lib/features/registry.ts","../lib/driver/builtIn.ts","../lib/driver/cleanup.ts","../lib/driver/extensions.ts","../lib/driver/booter.ts","../lib/driver/loader.ts","../lib/driver/runtimePlan.ts","../lib/driver/runtime.ts","../lib/driver/extensionTypes.ts","../lib/driver/install.ts","../lib/driver/icon.ts","../lib/global.ts"],"sourcesContent":["import { isFunction } from 'es-toolkit/compat'\nimport type { App } from 'vue'\n\nimport type { ConfigPointer } from '@/configPointer'\nimport type { PluginLocaleMessages } from '@/i18n'\n\nimport type * as Share from './share'\nexport type * as Share from './share'\n\nimport type * as Content from './content'\nexport type * as Content from './content'\n\nimport type * as Subscribe from './subscribe'\nexport type * as Subscribe from './subscribe'\n\nimport type * as User from './user'\nexport type * as User from './user'\n\nimport type * as Api from './api'\nexport type * as Api from './api'\n\nimport type * as OtherProgress from './otherProgress'\nexport type * as OtherProgress from './otherProgress'\n\nimport type * as Search from './search'\nexport type * as Search from './search'\n\nimport type * as Auth from './auth'\nexport type * as Auth from './auth'\n\nimport type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type * as Resource from './resource'\nexport type * as Resource from './resource'\n\nexport interface PluginConfigValues {\n name: string\n content?: Content.Config\n resource?: Resource.Content\n api?: Record<string, Api.Config>\n user?: User.Config\n auth?: Auth.Config\n /** Locale messages are merged in plugin load order; later plugins may override existing keys. */\n i18n?: PluginLocaleMessages\n otherProgress?: OtherProgress.Config[]\n search?: Search.Config\n /**\n * 插件的配置项需在此处注册\n * 传入`Store.ConfigPointer`\n */\n config?: ConfigPointer[]\n subscribe?: Record<string, Subscribe.Config>\n share?: Share.Config\n}\n\nexport type DefineResult = { api?: Record<string, string | undefined | false> }\nexport type Platform = 'tauri' | 'web'\nexport interface PluginConfigHooks {\n /** Runs after app.use() registration and before app.mount() for preboot plugins. */\n onPreboot?(context: {\n app: App\n platform: Platform\n safe: boolean\n }): (() => Promise<void> | void) | Promise<(() => Promise<void> | void) | void> | void\n /**\n * 返回值如果不为空,则会await后作为expose暴露\n */\n onBooted?(ins: DefineResult): (PromiseLike<object> | object) | void\n /** Runs before a normal plugin is reloaded or the runtime is disposed. */\n onUnload?(): Promise<void> | void\n /** Runs once before an installed plugin and its persisted files are removed. */\n onUninstall?(): Promise<void> | void\n}\n\nexport type PluginConfig = PluginConfigValues & PluginConfigHooks\n\nexport interface ConfigEnv {\n safe: boolean\n platform: Platform\n}\n/**\n * 这仅是个辅助定义的函数,没有副作用\n */\nexport const definePlugin = <T extends PluginConfig>(\n config: T | PluginConfigFactory<T>,\n): PluginConfigFactory<T> => {\n if (isFunction(config)) return config\n return () => config\n}\n\nexport type PluginExpose<T extends PluginConfig> = ReturnType<\n T['onBooted'] extends () => object ? T['onBooted'] : () => void\n>\n\nexport type PluginConfigFactory<T extends PluginConfig = PluginConfig> = (env: ConfigEnv) => T\n\nexport interface BuiltInPluginDefinition<T extends PluginConfig = PluginConfig> {\n meta: PluginArchiveDB.Meta\n config: PluginConfigFactory<T>\n enabledByDefault?: boolean\n}\n\n/** Defines a trusted plugin that is bundled with the application. */\nexport const defineInnerPlugin = <T extends PluginConfig>(definition: BuiltInPluginDefinition<T>) =>\n definition","import type { FormSingleConfigure } from '@delta-comic/model'\n\nexport type ConfigDescription = Record<\n string,\n Required<Pick<FormSingleConfigure, 'defaultValue'>> & FormSingleConfigure\n>\n\nexport class ConfigPointer<T extends ConfigDescription = ConfigDescription> {\n public readonly key: symbol\n\n constructor(\n public pluginName: string,\n public config: T,\n public configName: string,\n ) {\n this.key = Symbol.for(`config:${pluginName}`)\n }\n}","import { ConfigPointer } from '../../configPointer'\n\nexport const coreConfig = new ConfigPointer(\n 'core',\n {\n recordHistory: { type: 'switch', defaultValue: true, info: 'settings.core.recordHistory' },\n showAIProject: { type: 'switch', defaultValue: true, info: 'settings.core.showAiWorks' },\n darkMode: {\n type: 'radio',\n defaultValue: 'system',\n info: 'settings.core.theme.title',\n comp: 'select',\n selects: [\n { label: 'settings.core.theme.light', value: 'light' },\n { label: 'settings.core.theme.dark', value: 'dark' },\n { label: 'settings.core.systemDefault', value: 'system' },\n ],\n },\n language: {\n type: 'radio',\n defaultValue: 'system',\n info: 'settings.core.language.title',\n comp: 'select',\n selects: [\n { label: 'settings.core.language.zhCN', value: 'zh-CN' },\n { label: 'settings.core.language.zhTW', value: 'zh-TW' },\n { label: 'settings.core.language.enUS', value: 'en-US' },\n { label: 'settings.core.systemDefault', value: 'system' },\n ],\n },\n easilyTitle: { type: 'switch', defaultValue: false, info: 'settings.core.simplifiedTitle' },\n githubToken: {\n type: 'string',\n defaultValue: '',\n info: 'settings.core.githubToken.title',\n placeholder: 'settings.core.githubToken.placeholder',\n },\n receivePerReleaseUpdate: {\n type: 'switch',\n defaultValue: false,\n info: 'settings.core.prereleaseUpdates',\n },\n cloudEnabled: { type: 'switch', defaultValue: false, info: 'settings.core.cloud.enabled' },\n cloudServerUrl: {\n type: 'string',\n defaultValue: '',\n info: 'settings.core.cloud.serverUrl',\n placeholder: 'settings.core.cloud.serverUrlPlaceholder',\n },\n installOverride: {\n type: 'pairs',\n defaultValue: [],\n info: 'settings.core.installOverride',\n required: true,\n },\n },\n 'settings.core.title',\n)","import { useConfig as useDbConfig } from '@delta-comic/db'\nimport type { FormResult } from '@delta-comic/model'\nimport { computed, shallowReactive, type Ref } from 'vue'\n\nimport type { ConfigDescription, ConfigPointer } from './configPointer'\nimport { coreConfig } from './features/core/config'\n\nexport * from './configPointer'\n\nexport type ConfigSave<T> = {\n form: ConfigDescription\n data: Ref<T>\n name: string\n ready: Promise<void>\n}\n\nexport class ConfigStore {\n public readonly form = shallowReactive(new Map<symbol, ConfigSave<any>>())\n private readonly darkMode = computed(() => {\n if (!this.$isExistConfig(coreConfig)) return this.isSystemDark\n const config = this.$load(coreConfig).data.value\n switch (config.darkMode) {\n case 'light':\n return false\n case 'dark':\n return true\n case 'system':\n default:\n return this.isSystemDark\n }\n })\n\n private readonly isSystemDark =\n globalThis.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false\n\n public get isDark() {\n return this.darkMode.value\n }\n\n public constructor() {\n // Core settings remain available when the built-in core runtime is disabled.\n this.$registerConfig(coreConfig)\n }\n\n public $load<T extends ConfigPointer>(pointer: T): ConfigSave<FormResult<T['config']>> {\n const value = this.form.get(pointer.key)\n if (!value) throw new Error(`not found config by plugin \"${pointer.pluginName}\"`)\n return value\n }\n\n public $loadApp() {\n return this.$load(coreConfig)\n }\n\n public $isExistConfig(pointer: ConfigPointer) {\n return this.form.has(pointer.key)\n }\n\n public $registerConfig(pointer: ConfigPointer) {\n const registered = this.form.get(pointer.key)\n if (registered) return registered\n\n const store = useDbConfig(pointer.pluginName, pointer.config)\n const saved: ConfigSave<any> = {\n form: pointer.config,\n data: store,\n name: pointer.configName,\n ready: (store as typeof store & { ready: Promise<void> }).ready,\n }\n this.form.set(pointer.key, saved)\n return saved\n }\n\n /** @deprecated Use `$registerConfig`. */\n public $resignerConfig(pointer: ConfigPointer) {\n return this.$registerConfig(pointer)\n }\n\n public $unregisterConfig(pointer: ConfigPointer) {\n this.form.delete(pointer.key)\n }\n}\n\nlet configStore: ConfigStore | undefined\nexport const useConfig = () => (configStore ??= new ConfigStore())","interface DependDefineConstraint<_T> {}\nexport type DependDefine<T> = symbol & DependDefineConstraint<T> & { _ts: T }\n\nexport const exposeSymbol = (name: string) => Symbol.for(`expose:${name}`)\n\nexport const declareDepType = <T>(name: string) => <DependDefine<T>>exposeSymbol(name)\n\nexport class DependencyRegistry {\n public constructor(public readonly exposes = new Map<symbol, unknown>()) {}\n\n public provide<T>(define: DependDefine<T>, value: T) {\n this.exposes.set(define, value)\n return value\n }\n\n public require<T>(define: DependDefine<T>): T {\n if (!this.exposes.has(define)) {\n const name = Symbol.keyFor(define) ?? define.description ?? define.toString()\n throw new Error(`not found plugin expose \"${name}\"`)\n }\n return this.exposes.get(define) as T\n }\n\n public has(define: DependDefine<unknown>) {\n return this.exposes.has(define)\n }\n\n public delete(define: DependDefine<unknown>) {\n return this.exposes.delete(define)\n }\n\n public clear() {\n this.exposes.clear()\n }\n}\n\nexport type InferDependType<T extends DependDefine<any>> = T['_ts']\n\nexport const pluginExposes = new Map<symbol, unknown>()\nexport const defaultDependencyRegistry = new DependencyRegistry(pluginExposes)\nexport const createDependencyRegistry = () => new DependencyRegistry()\n\nexport const provide = <T>(define: DependDefine<T>, value: T) =>\n defaultDependencyRegistry.provide(define, value)\n\nexport const require = <T>(define: DependDefine<T>): T => defaultDependencyRegistry.require(define)","export interface PluginLocaleMessage {\n [key: string]: PluginLocaleMessage | string\n}\n\nexport type PluginLocaleMessages = Record<string, PluginLocaleMessage>\n\nexport interface PluginI18nAdapter {\n setLocaleMessage(locale: string, message: PluginLocaleMessage): void\n translate?(key: string, params?: Record<string, number | string>): string\n}\n\nconst messageKeyPrefix = 'i18n:'\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype'])\n\nconst mergeMessages = (\n target: PluginLocaleMessage,\n source: PluginLocaleMessage | undefined,\n): PluginLocaleMessage => {\n if (!source) return target\n for (const [key, value] of Object.entries(source)) {\n if (unsafeKeys.has(key)) continue\n if (typeof value === 'string') {\n target[key] = value\n continue\n }\n const current = target[key]\n target[key] = mergeMessages(typeof current === 'object' ? { ...current } : {}, value)\n }\n return target\n}\n\nexport class PluginI18nRegistry {\n private adapter?: PluginI18nAdapter\n private baseMessages: PluginLocaleMessages = {}\n private readonly pluginMessages = new Map<string, PluginLocaleMessages>()\n\n public install(adapter: PluginI18nAdapter, baseMessages: PluginLocaleMessages) {\n this.adapter = adapter\n this.baseMessages = baseMessages\n this.refresh(this.locales())\n }\n\n public register(plugin: string, messages: PluginLocaleMessages) {\n const previous = this.pluginMessages.get(plugin)\n this.pluginMessages.delete(plugin)\n this.pluginMessages.set(plugin, messages)\n this.refresh(new Set([...Object.keys(previous ?? {}), ...Object.keys(messages)]))\n }\n\n public remove(plugin: string) {\n const messages = this.pluginMessages.get(plugin)\n if (!messages) return\n this.pluginMessages.delete(plugin)\n this.refresh(new Set(Object.keys(messages)))\n }\n\n public translate(key: string, params?: Record<string, number | string>) {\n return this.adapter?.translate?.(key, params) ?? key\n }\n\n private compose(locale: string) {\n const message = mergeMessages({}, this.baseMessages[locale])\n for (const messages of this.pluginMessages.values()) mergeMessages(message, messages[locale])\n return message\n }\n\n private locales() {\n const locales = new Set(Object.keys(this.baseMessages))\n for (const messages of this.pluginMessages.values()) {\n for (const locale of Object.keys(messages)) locales.add(locale)\n }\n return locales\n }\n\n private refresh(locales: Iterable<string>) {\n if (!this.adapter) return\n for (const locale of locales) this.adapter.setLocaleMessage(locale, this.compose(locale))\n }\n}\n\nexport const pluginI18n = new PluginI18nRegistry()\n\nexport const pluginMessageKey = (key: string) => `${messageKeyPrefix}${key}`\n\nexport const translatePluginText = (value: string) =>\n value.startsWith(messageKeyPrefix)\n ? pluginI18n.translate(value.slice(messageKeyPrefix.length))\n : value","import { db, type PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport type { Raw } from 'vue'\nimport { shallowReactive, shallowRef } from 'vue'\n\nimport { translatePluginText } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nconst pluginStoreLogger = logger.scoped('plugin:store')\n\nexport class PluginStore {\n public readonly plugins = shallowReactive(new Map<string, Raw<PluginConfig>>())\n /** Plugins whose complete boot pipeline has completed successfully. */\n public readonly ready = shallowReactive(new Set<string>())\n public readonly revision = shallowRef(0)\n private readonly pluginNames = shallowReactive(new Map<string, string>())\n\n /**\n * Returns true only when every registered booter has completed successfully.\n *\n * `plugins.has()` intentionally is not used here: the config is inserted before\n * the first booter runs and can therefore describe a partially initialized plugin.\n */\n public $isLoaded(plugin: string) {\n return this.ready.has(plugin)\n }\n\n /** Starts a new load generation and invalidates the previous readiness state. */\n public $markLoading(plugin: string) {\n this.ready.delete(plugin)\n }\n\n /** Marks a plugin ready after all booters have completed. */\n public $markReady(plugin: string) {\n this.ready.add(plugin)\n }\n\n /** Removes all lifecycle state for a plugin. */\n public $markUnloaded(plugin: string) {\n this.ready.delete(plugin)\n }\n\n public async $refreshI18nNames() {\n const names = await db.selectFrom('plugin').select(['pluginName', 'displayName']).execute()\n this.pluginNames.clear()\n for (const plugin of names) this.pluginNames.set(plugin.pluginName, plugin.displayName)\n pluginStoreLogger.debug('plugin display names refreshed', { count: names.length })\n }\n\n public $getI18nName(key: string) {\n return translatePluginText(this.pluginNames.get(key) || key)\n }\n\n public async $upsertArchives(archives: PluginArchiveDB.Archive[]) {\n if (archives.length === 0) return\n await db\n .replaceInto('plugin')\n .values(archives.map(archive => ({ ...archive, meta: JSON.stringify(archive.meta) })))\n .execute()\n await this.$refreshI18nNames()\n this.$touch()\n pluginStoreLogger.info('plugin archives persisted', { count: archives.length })\n }\n\n public $touch() {\n this.revision.value++\n }\n}\n\nexport const pluginStore = new PluginStore()\nexport const usePluginStore = () => pluginStore","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { pluginI18n } from '@/i18n'\n\nexport interface PluginDependencyMissing {\n pluginName: string\n dependencyName: string\n}\n\nexport interface PluginLoadPlan {\n levels: PluginArchiveDB.Archive[][]\n missing: PluginDependencyMissing[]\n cycles: string[][]\n}\n\nconst getDependencyNames = (plugin: PluginArchiveDB.Archive) =>\n plugin.meta.require.map(dep => dep.id)\n\nconst canonicalCycleKey = (cycle: string[]) => {\n const nodes = cycle.slice(0, -1)\n const rotations = nodes.map((_, index) => nodes.slice(index).concat(nodes.slice(0, index)))\n rotations.sort((a, b) => a.join('\\0').localeCompare(b.join('\\0')))\n return rotations[0].join('\\0')\n}\n\nexport const findCyclePaths = (plugins: PluginArchiveDB.Archive[]): string[][] => {\n const pluginNames = new Set(plugins.map(plugin => plugin.pluginName))\n const dependencies = new Map(\n plugins.map(plugin => [\n plugin.pluginName,\n getDependencyNames(plugin).filter(dep => pluginNames.has(dep)),\n ]),\n )\n\n const state = new Map<string, 'visiting' | 'visited'>()\n const path: string[] = []\n const cycleKeys = new Set<string>()\n const cycles: string[][] = []\n\n const visit = (pluginName: string) => {\n state.set(pluginName, 'visiting')\n path.push(pluginName)\n\n for (const dependencyName of dependencies.get(pluginName) ?? []) {\n const dependencyState = state.get(dependencyName)\n if (dependencyState === 'visiting') {\n const cycleStart = path.lastIndexOf(dependencyName)\n if (cycleStart === -1) continue\n\n const cycle = path.slice(cycleStart).concat(dependencyName)\n const key = canonicalCycleKey(cycle)\n if (!cycleKeys.has(key)) {\n cycleKeys.add(key)\n cycles.push(cycle)\n }\n continue\n }\n\n if (dependencyState !== 'visited') visit(dependencyName)\n }\n\n path.pop()\n state.set(pluginName, 'visited')\n }\n\n for (const plugin of plugins) {\n if (!state.has(plugin.pluginName)) visit(plugin.pluginName)\n }\n\n return cycles\n}\n\nexport const planPluginLoadOrder = (plugins: PluginArchiveDB.Archive[]): PluginLoadPlan => {\n const nameToPlugin = new Map(plugins.map(plugin => [plugin.pluginName, plugin]))\n const inDegree = new Map<string, number>()\n const adjacency = new Map<string, string[]>()\n const missing: PluginDependencyMissing[] = []\n\n for (const plugin of plugins) {\n const dependencies = getDependencyNames(plugin)\n const installedDependencies = dependencies.filter(dependencyName => {\n const isInstalled = nameToPlugin.has(dependencyName)\n if (!isInstalled) missing.push({ pluginName: plugin.pluginName, dependencyName })\n return isInstalled\n })\n\n inDegree.set(plugin.pluginName, installedDependencies.length)\n for (const dependencyName of installedDependencies) {\n const dependents = adjacency.get(dependencyName) ?? []\n dependents.push(plugin.pluginName)\n adjacency.set(dependencyName, dependents)\n }\n }\n\n const queue = [...inDegree.entries()]\n .filter(([, degree]) => degree === 0)\n .map(([pluginName]) => pluginName)\n\n const levels: PluginArchiveDB.Archive[][] = []\n while (queue.length > 0) {\n const levelSize = queue.length\n const level: PluginArchiveDB.Archive[] = []\n\n for (let index = 0; index < levelSize; index++) {\n const pluginName = queue.shift()\n if (!pluginName) continue\n\n const plugin = nameToPlugin.get(pluginName)\n if (plugin) level.push(plugin)\n\n for (const dependentName of adjacency.get(pluginName) ?? []) {\n const newDegree = (inDegree.get(dependentName) ?? 0) - 1\n inDegree.set(dependentName, newDegree)\n if (newDegree === 0) queue.push(dependentName)\n }\n }\n\n if (level.length > 0) levels.push(level)\n }\n\n const unresolved = plugins.filter(plugin => (inDegree.get(plugin.pluginName) ?? 0) > 0)\n const cycles = findCyclePaths(unresolved)\n\n return { levels, missing, cycles }\n}\n\ntype PluginMessageTranslator = (key: string, params: Record<string, number | string>) => string\n\nexport const formatPluginLoadPlanError = (\n plan: Pick<PluginLoadPlan, 'missing' | 'cycles'>,\n translate: PluginMessageTranslator = (key, params) => pluginI18n.translate(key, params),\n) => {\n const sections: string[] = []\n\n if (plan.missing.length > 0) {\n const missing = plan.missing\n .map(({ pluginName, dependencyName }) => `${pluginName} -> ${dependencyName}`)\n .join('\\n')\n sections.push(translate('plugin.runtime.errors.missingDependencies', { missing }))\n }\n\n if (plan.cycles.length > 0) {\n const paths = plan.cycles.map(path => path.join(' -> ')).join('\\n')\n sections.push(translate('plugin.runtime.errors.dependencyCycles', { paths }))\n }\n\n return sections.join('\\n\\n')\n}","import { pluginMessageKey } from '../../i18n'\nimport { defineInnerPlugin } from '../../plugin'\n\nimport { coreConfig } from './config'\n\nexport { coreConfig } from './config'\n\nexport default defineInnerPlugin({\n meta: {\n kind: 'preboot',\n author: 'Delta Comic',\n description: pluginMessageKey('plugin.core.description'),\n require: [],\n name: { display: pluginMessageKey('settings.core.title'), id: 'core' },\n version: { plugin: '2.3.0', supportCore: '*' },\n },\n enabledByDefault: true,\n config: () => ({ name: 'core', config: [coreConfig] }),\n})","import type { BuiltInPluginDefinition } from '../plugin'\n\nconst rawDefinitions = import.meta.glob<BuiltInPluginDefinition>('./*/feature.ts', {\n eager: true,\n import: 'default',\n})\n\nexport const createBuiltInPluginRegistry = (\n definitions: readonly BuiltInPluginDefinition[],\n): ReadonlyMap<string, BuiltInPluginDefinition> => {\n const registry = new Map<string, BuiltInPluginDefinition>()\n for (const definition of definitions) {\n const pluginName = definition.meta.name.id\n if (!pluginName) throw new Error('built-in plugin id cannot be empty')\n if (registry.has(pluginName)) throw new Error(`duplicate built-in plugin: ${pluginName}`)\n registry.set(pluginName, definition)\n }\n return registry\n}\n\nexport const builtInPluginRegistry = createBuiltInPluginRegistry(Object.values(rawDefinitions))","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\n\nimport { builtInPluginRegistry } from '../features/registry'\nimport type { BuiltInPluginDefinition } from '../plugin'\n\nconst builtInLogger = logger.scoped('plugin:builtin')\n\nexport const BUILT_IN_PLUGIN_LOADER = 'builtin'\n\nexport const isBuiltInPluginName = (pluginName: string) => builtInPluginRegistry.has(pluginName)\n\nexport const isBuiltInPlugin = (plugin: Pick<PluginArchiveDB.Archive, 'loaderName'>): boolean =>\n plugin.loaderName === BUILT_IN_PLUGIN_LOADER\n\nexport const builtInDefinitionToArchive = (\n definition: BuiltInPluginDefinition,\n enable = definition.enabledByDefault ?? true,\n): PluginArchiveDB.Archive => ({\n displayName: definition.meta.name.display,\n enable,\n installerName: BUILT_IN_PLUGIN_LOADER,\n installInput: '',\n loaderName: BUILT_IN_PLUGIN_LOADER,\n meta: definition.meta,\n pluginName: definition.meta.name.id,\n})\n\n/** Mirrors compile-time definitions into the plugin catalog while preserving their enable state. */\nexport const synchronizeBuiltInPlugins = async (): Promise<void> => {\n builtInLogger.info('built-in plugin synchronization started', {\n definitionCount: builtInPluginRegistry.size,\n })\n const { db } = await import('@delta-comic/db')\n await db.transaction().execute(async trx => {\n const existing = await trx.selectFrom('plugin').selectAll().execute()\n const existingByName = new Map(existing.map(plugin => [plugin.pluginName, plugin]))\n\n for (const [pluginName, definition] of builtInPluginRegistry) {\n const current = existingByName.get(pluginName)\n const archive = builtInDefinitionToArchive(definition, current?.enable)\n const values = { ...archive, meta: JSON.stringify(archive.meta) }\n if (current) {\n await trx.updateTable('plugin').set(values).where('pluginName', '=', pluginName).execute()\n } else {\n await trx.insertInto('plugin').values(values).execute()\n }\n }\n\n const currentNames = [...builtInPluginRegistry.keys()]\n let staleQuery = trx.deleteFrom('plugin').where('loaderName', '=', BUILT_IN_PLUGIN_LOADER)\n if (currentNames.length > 0) staleQuery = staleQuery.where('pluginName', 'not in', currentNames)\n await staleQuery.execute()\n })\n builtInLogger.info('built-in plugin synchronization completed')\n}","import { uni } from '@delta-comic/model'\n\nimport { useConfig } from '@/config'\nimport { declareDepType, defaultDependencyRegistry } from '@/depends'\nimport { Global } from '@/global'\nimport { pluginI18n } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { releasePluginObjectUrls } from './init/storage'\nimport { usePluginStore } from './store'\n\nconst removeSourcedEntries = (\n map: { keys(): IterableIterator<string>; delete(key: string): boolean },\n plugin: string,\n) => {\n for (const key of map.keys()) {\n if (key.split(':', 1)[0] === plugin) map.delete(key)\n }\n}\n\nexport const cleanupPlugin = (config: PluginConfig) => {\n const plugin = config.name\n const pluginStore = usePluginStore()\n const errors: unknown[] = []\n const attempt = (action: () => void) => {\n try {\n action()\n } catch (error) {\n errors.push(error)\n }\n }\n\n // Invalidate readiness before removing registrations so reactive consumers\n // cannot reconstruct runtime-only classes from a plugin being unloaded.\n attempt(() => pluginStore.$markUnloaded(plugin))\n attempt(() => Global.tabbar.delete(plugin))\n attempt(() => Global.categories.delete(plugin))\n attempt(() => Global.barcode.delete(plugin))\n attempt(() => Global.hotSearch.delete(plugin))\n attempt(() => Global.levelboard.delete(plugin))\n attempt(() => Global.topButton.delete(plugin))\n attempt(() => Global.mainLists.delete(plugin))\n attempt(() => Global.removeOwnedRegistrations(plugin))\n attempt(() => pluginI18n.remove(plugin))\n attempt(() => removeSourcedEntries(Global.share, plugin))\n attempt(() => removeSourcedEntries(Global.shareToken, plugin))\n attempt(() => removeSourcedEntries(Global.userActions, plugin))\n attempt(() => removeSourcedEntries(Global.subscribes, plugin))\n\n for (const [contentType, value] of Object.entries(config.content ?? {})) {\n if (value.layout) attempt(() => uni.content.ContentPage.layouts.delete(contentType))\n if (value.itemCard) attempt(() => uni.item.Item.itemCards.delete(contentType))\n if (value.contentPage) attempt(() => uni.content.ContentPage.contentPages.delete(contentType))\n if (value.downloadProvider)\n attempt(() => uni.content.ContentPage.downloadProviders.delete(contentType))\n if (value.commentRow) attempt(() => uni.comment.Comment.commentRow.delete(contentType))\n if (value.itemTranslator) attempt(() => uni.item.Item.itemTranslator.delete(contentType))\n }\n for (const type of config.resource?.types ?? []) {\n attempt(() => uni.resource.Resource.fork.delete([plugin, type.type]))\n attempt(() => uni.resource.Resource.precedenceFork.delete([plugin, type.type]))\n }\n for (const name of Object.keys(config.resource?.process ?? {})) {\n attempt(() => uni.resource.Resource.processInstances.delete([plugin, name]))\n }\n if (config.user?.card) attempt(() => uni.user.User.userCards.delete(plugin))\n if (config.user?.edit) attempt(() => uni.user.User.userEditorBase.delete(plugin))\n for (const key of Object.keys(config.user?.authorIcon ?? {})) {\n attempt(() => uni.item.Item.authorIcon.delete([plugin, key]))\n }\n for (const pointer of config.config ?? []) attempt(() => useConfig().$unregisterConfig(pointer))\n\n attempt(() => defaultDependencyRegistry.delete(declareDepType(plugin)))\n attempt(() => pluginStore.plugins.delete(plugin))\n attempt(() => releasePluginObjectUrls(plugin))\n if (typeof document !== 'undefined') {\n for (const node of document.querySelectorAll<HTMLStyleElement>('style[data-plugin]')) {\n if (node.dataset.plugin === plugin) attempt(() => node.remove())\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `failed to completely clean plugin \"${plugin}\"`)\n }\n}","import { shallowReactive } from 'vue'\n\nimport type { PluginBooter, PluginInstaller, PluginLoader } from './extensionTypes'\n\ninterface NamedExtension {\n name: string\n}\n\ninterface ExtensionEntry<T extends NamedExtension> {\n extension: T\n order: number\n owner?: string\n sequence: number\n}\n\nexport interface RuntimeExtensionOptions {\n order?: number\n}\n\nclass OrderedExtensionRegistry<T extends NamedExtension> {\n public readonly values = shallowReactive(new Array<T>())\n private readonly entries: ExtensionEntry<T>[] = []\n private sequence = 0\n\n public constructor(private readonly direction: 'ascending' | 'descending') {}\n\n public register(extension: T, options: RuntimeExtensionOptions = {}, owner?: string) {\n const entry: ExtensionEntry<T> = {\n extension,\n order: options.order ?? 0,\n owner,\n sequence: this.sequence++,\n }\n this.entries.push(entry)\n this.refresh()\n return () => {\n const index = this.entries.indexOf(entry)\n if (index < 0) return\n this.entries.splice(index, 1)\n this.refresh()\n }\n }\n\n public removeOwner(owner: string) {\n let changed = false\n for (let index = this.entries.length - 1; index >= 0; index--) {\n if (this.entries[index].owner !== owner) continue\n this.entries.splice(index, 1)\n changed = true\n }\n if (changed) this.refresh()\n }\n\n private refresh() {\n const activeByName = new Map<string, ExtensionEntry<T>>()\n for (const entry of this.entries) activeByName.set(entry.extension.name, entry)\n const direction = this.direction === 'ascending' ? 1 : -1\n const active = [...activeByName.values()]\n .sort(\n (left, right) => (left.order - right.order) * direction || left.sequence - right.sequence,\n )\n .map(entry => entry.extension)\n this.values.splice(0, this.values.length, ...active)\n }\n}\n\nexport class PluginRuntimeExtensions {\n public readonly booters = new OrderedExtensionRegistry<PluginBooter>('ascending')\n public readonly installers = new OrderedExtensionRegistry<PluginInstaller>('descending')\n public readonly loaders = new OrderedExtensionRegistry<PluginLoader>('ascending')\n private readonly owners: string[] = []\n\n public registerBooter(booter: PluginBooter, options?: RuntimeExtensionOptions) {\n return this.booters.register(booter, options, this.owners.at(-1))\n }\n\n public registerInstaller(installer: PluginInstaller, options?: RuntimeExtensionOptions) {\n return this.installers.register(installer, options, this.owners.at(-1))\n }\n\n public registerLoader(loader: PluginLoader, options?: RuntimeExtensionOptions) {\n return this.loaders.register(loader, options, this.owners.at(-1))\n }\n\n public removeOwner(owner: string) {\n this.booters.removeOwner(owner)\n this.installers.removeOwner(owner)\n this.loaders.removeOwner(owner)\n }\n\n public async withOwner<T>(owner: string, action: () => Promise<T>): Promise<T> {\n this.owners.push(owner)\n try {\n return await action()\n } finally {\n this.owners.pop()\n }\n }\n}\n\nexport const runtimeExtensions = new PluginRuntimeExtensions()\n\nexport const registerBooter = runtimeExtensions.registerBooter.bind(runtimeExtensions)\nexport const registerInstaller = runtimeExtensions.registerInstaller.bind(runtimeExtensions)\nexport const registerLoader = runtimeExtensions.registerLoader.bind(runtimeExtensions)","import { logger } from '@delta-comic/logger'\nimport { isString } from 'es-toolkit'\nimport { markRaw, type Ref } from 'vue'\n\nimport type { PluginConfig } from '@/plugin'\n\nimport { runtimeExtensions } from './extensions'\nimport type { PluginLoadingInfo } from './loader'\nimport { usePluginStore } from './store'\n\nconst pluginBooterLogger = logger.scoped('plugin:booter')\n\nexport const booters = runtimeExtensions.booters.values\n\nexport const bootPlugin = async (\n cfg: PluginConfig,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n const store = usePluginStore()\n store.$markLoading(cfg.name)\n\n try {\n store.plugins.set(cfg.name, markRaw(cfg))\n\n const env: Record<any, any> = {}\n for (const booter of booters) {\n const msIndex = info.value[cfg.name].steps.length\n info.value[cfg.name].steps[msIndex] = { name: booter.name, description: '' }\n info.value[cfg.name].progress = { stepsIndex: msIndex, status: 'process' }\n pluginBooterLogger.debug('plugin boot step started', { plugin: cfg.name, step: msIndex })\n await booter.call(\n cfg,\n meta => {\n if (isString(meta)) info.value[cfg.name].steps[msIndex].description = meta\n else {\n if (meta.description) info.value[cfg.name].steps[msIndex].description = meta.description\n if (meta.name) info.value[cfg.name].steps[msIndex].name = meta.name\n }\n },\n env,\n )\n }\n\n info.value[cfg.name].progress.status = 'done'\n store.$markReady(cfg.name)\n\n pluginBooterLogger.info('plugin boot pipeline completed', { plugin: cfg.name })\n } catch (error) {\n store.$markUnloaded(cfg.name)\n pluginBooterLogger.error('plugin boot pipeline failed', { plugin: cfg.name }, error)\n throw error\n }\n}","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { Mutex } from 'es-toolkit'\nimport type { Ref } from 'vue'\n\nimport { builtInPluginRegistry } from '@/features/registry'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig, PluginConfigFactory } from '@/plugin'\n\nimport { bootPlugin } from './booter'\nimport { isBuiltInPlugin } from './builtIn'\nimport { cleanupPlugin } from './cleanup'\nimport { runtimeExtensions } from './extensions'\nimport { isTauriRuntime } from './init/storage'\n\nconst pluginLoaderLogger = logger.scoped('plugin:loader')\n\nexport const loaders = runtimeExtensions.loaders.values\n\nconst loadLocks = <Record<string, Mutex>>{}\nconst getLoadLock = (pluginName: string) => (loadLocks[pluginName] ??= new Mutex())\n\nexport type PluginBootRollback = (\n config: PluginConfig | undefined,\n expectedName: string | undefined,\n) => Promise<void> | void\n\nexport interface BootConfigOptions {\n expectedName?: string\n rollback?: PluginBootRollback\n}\n\nexport const createPluginLoadingInfo = (): PluginLoadingInfo => ({\n progress: { status: 'wait', stepsIndex: 0 },\n steps: [\n {\n name: pluginMessageKey('plugin.runtime.steps.waiting.title'),\n description: pluginMessageKey('plugin.runtime.steps.waiting.description'),\n },\n ],\n})\n\nexport const ensurePluginLoadingInfo = (\n info: Ref<Record<string, PluginLoadingInfo>>,\n pluginName: string,\n) => (info.value[pluginName] ??= createPluginLoadingInfo())\n\nexport const markPluginLoadError = (\n info: Ref<Record<string, PluginLoadingInfo>>,\n pluginName: string,\n error: unknown,\n) => {\n const loadingInfo = ensurePluginLoadingInfo(info, pluginName)\n loadingInfo.progress = {\n ...loadingInfo.progress,\n errorReason: error instanceof Error ? error.message : String(error),\n status: 'error',\n }\n}\n\n/** 解析 config factory 并启动插件;任何中途失败都保留原始错误并执行回滚。 */\nexport const bootConfig = async (\n configFactory: PluginConfigFactory,\n info: Ref<Record<string, PluginLoadingInfo>>,\n options: BootConfigOptions = {},\n) => {\n const { expectedName, rollback } = options\n if (expectedName) ensurePluginLoadingInfo(info, expectedName)\n\n let cfg: PluginConfig | undefined\n try {\n cfg = configFactory({ safe: true, platform: isTauriRuntime() ? 'tauri' : 'web' })\n if (expectedName && cfg.name !== expectedName) {\n throw new Error(`plugin name mismatch: ${expectedName} / ${cfg.name}`)\n }\n await bootResolvedConfig(cfg, info)\n return cfg\n } catch (error) {\n const progressName = expectedName ?? cfg?.name\n if (progressName) markPluginLoadError(info, progressName, error)\n if (rollback) {\n try {\n await rollback(cfg, expectedName)\n } catch (rollbackError) {\n pluginLoaderLogger.error(\n 'plugin boot rollback failed',\n { plugin: progressName },\n rollbackError,\n )\n }\n }\n throw error\n }\n}\n\nexport const bootResolvedConfig = async (\n cfg: ReturnType<PluginConfigFactory>,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n ensurePluginLoadingInfo(info, cfg.name)\n await bootPlugin(cfg, info)\n}\n\nexport const loadPluginConfig = async (meta: PluginArchiveDB.Archive) => {\n const lock = getLoadLock(meta.pluginName)\n try {\n await lock.acquire()\n pluginLoaderLogger.debug('loading plugin config', {\n loader: meta.loaderName,\n plugin: meta.pluginName,\n })\n if (isBuiltInPlugin(meta)) return builtInPluginRegistry.get(meta.pluginName)?.config\n const loader = loaders.find(value => value.name === meta.loaderName)\n if (!loader) {\n throw new Error(\n pluginI18n.translate('plugin.runtime.errors.loaderMissing', {\n loader: meta.loaderName,\n plugin: meta.pluginName,\n }),\n )\n }\n return await loader.load(meta)\n } finally {\n lock.release()\n }\n}\n\nexport const loadPlugin = async (\n meta: PluginArchiveDB.Archive,\n info: Ref<Record<string, PluginLoadingInfo>>,\n) => {\n pluginLoaderLogger.info('plugin boot started', { plugin: meta.pluginName })\n ensurePluginLoadingInfo(info, meta.pluginName)\n try {\n const configFactory = await loadPluginConfig(meta)\n if (!configFactory) {\n throw new Error(\n pluginI18n.translate('plugin.runtime.errors.defaultExportMissing', {\n plugin: meta.pluginName,\n }),\n )\n }\n await bootConfig(configFactory, info, {\n expectedName: meta.pluginName,\n rollback: config => cleanupPlugin(config ?? ({ name: meta.pluginName } as PluginConfig)),\n })\n pluginLoaderLogger.info('plugin boot completed', { plugin: meta.pluginName })\n } catch (error) {\n pluginLoaderLogger.error('plugin boot failed', { plugin: meta.pluginName }, error)\n markPluginLoadError(info, meta.pluginName, error)\n throw error\n }\n}\n\nexport type PluginLoadingInfo = {\n steps: { name: string; description: string }[]\n progress: {\n errorReason?: string\n stepsIndex: number\n status: 'wait' | 'process' | 'error' | 'done'\n }\n}\n\nexport const loadAllPlugins = () =>\n import('./runtime').then(({ pluginRuntime }) => pluginRuntime.loadNormal())","import type { PluginArchiveDB } from '@delta-comic/db'\n\nexport type ClientPluginKind = 'normal' | 'preboot'\n\nexport const pluginKind = (plugin: PluginArchiveDB.Archive): ClientPluginKind =>\n plugin.meta.kind ?? 'normal'\n\nexport const selectPluginsForPhase = (\n plugins: PluginArchiveDB.Archive[],\n kind: ClientPluginKind,\n startupPrebootNames: ReadonlySet<string> = new Set(\n plugins.filter(plugin => pluginKind(plugin) === 'preboot').map(plugin => plugin.pluginName),\n ),\n activePrebootNames: ReadonlySet<string> = startupPrebootNames,\n): PluginArchiveDB.Archive[] => {\n const selected = plugins.filter(plugin =>\n kind === 'preboot'\n ? startupPrebootNames.has(plugin.pluginName)\n : !startupPrebootNames.has(plugin.pluginName),\n )\n if (kind === 'preboot') return selected\n\n return selected.map(plugin => ({\n ...plugin,\n meta: {\n ...plugin.meta,\n require: plugin.meta.require.filter(dependency => !activePrebootNames.has(dependency.id)),\n },\n }))\n}\n\nexport const failedDependencies = (\n plugin: PluginArchiveDB.Archive,\n failedPluginNames: ReadonlySet<string>,\n) => plugin.meta.require.filter(dependency => failedPluginNames.has(dependency.id)).map(v => v.id)\n\nexport const filterPluginsBySelection = (\n plugins: PluginArchiveDB.Archive[],\n pluginNames?: ReadonlySet<string>,\n) => (pluginNames ? plugins.filter(plugin => pluginNames.has(plugin.pluginName)) : plugins)","import { db, type PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { ref, type App, type Ref } from 'vue'\n\nimport { useConfig } from '@/config'\nimport { Global } from '@/global'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { isBuiltInPlugin, synchronizeBuiltInPlugins } from './builtIn'\nimport { cleanupPlugin } from './cleanup'\nimport { isTauriRuntime, removePluginFiles } from './init/storage'\nimport { bootResolvedConfig, type PluginLoadingInfo, loadPluginConfig } from './loader'\nimport { formatPluginLoadPlanError, planPluginLoadOrder } from './loadPlan'\nimport {\n failedDependencies,\n filterPluginsBySelection,\n pluginKind,\n selectPluginsForPhase,\n type ClientPluginKind,\n} from './runtimePlan'\nimport { pluginStore } from './store'\n\nconst pluginRuntimeLogger = logger.scoped('plugin:runtime')\n\nconst recoveryKey = 'delta-comic:preboot-recovery'\n\nexport interface PrebootRecovery {\n failedAt: number\n plugins: string[]\n reason: string\n}\n\nexport interface PluginRuntimeOperation {\n operation: Promise<void>\n progress: Ref<Record<string, PluginLoadingInfo>>\n}\n\nexport interface LoadNormalOptions {\n pluginNames?: readonly string[]\n}\n\ntype ActivePlugin = { config: PluginConfig; kind: ClientPluginKind }\n\nconst reasonText = (error: unknown) => (error instanceof Error ? error.message : String(error))\n\nconst createLoadingInfo = (): PluginLoadingInfo => ({\n progress: { status: 'wait', stepsIndex: 0 },\n steps: [\n {\n name: pluginMessageKey('plugin.runtime.steps.waiting.title'),\n description: pluginMessageKey('plugin.runtime.steps.waiting.description'),\n },\n ],\n})\n\nclass PluginRuntime {\n private readonly active = new Map<string, ActivePlugin>()\n private readonly activePrebootNames = new Set<string>()\n private readonly prebootCleanups = new Map<string, () => Promise<void> | void>()\n private readonly preparedPreboot = new Map<string, PluginConfig>()\n private readonly startupPluginNames = new Set<string>()\n private readonly startupPrebootNames = new Set<string>()\n private builtInSynchronization?: Promise<void>\n private enabledPrebootNames: string[] = []\n private normalOperation?: Promise<void>\n private startupSnapshotReady = false\n private prebootActivated = false\n\n public get activeNormalPluginNames() {\n return [...this.active.entries()]\n .filter(([, plugin]) => plugin.kind === 'normal')\n .map(([name]) => name)\n }\n\n loadNormal(options: LoadNormalOptions = {}): PluginRuntimeOperation {\n if (this.normalOperation) throw new Error('normal plugins are already loading')\n if (this.preparedPreboot.size > 0 && !this.prebootActivated) {\n throw new Error('preboot plugins have not finished activating')\n }\n if ([...this.active.values()].some(plugin => plugin.kind === 'normal')) {\n throw new Error('normal plugins are already active; use reloadNormal()')\n }\n const progress = ref<Record<string, PluginLoadingInfo>>({})\n pluginRuntimeLogger.info('normal plugin load requested', {\n selectedCount: options.pluginNames?.length,\n })\n const operation = this.loadKind('normal', progress, options)\n this.trackNormalOperation(operation)\n return { operation, progress }\n }\n\n reloadNormal(options: LoadNormalOptions = {}): PluginRuntimeOperation {\n if (this.normalOperation) throw new Error('normal plugins are already loading')\n const progress = ref<Record<string, PluginLoadingInfo>>({})\n pluginRuntimeLogger.info('normal plugin reload requested', {\n selectedCount: options.pluginNames?.length,\n })\n const operation = (async () => {\n const unloadErrors = await this.unloadKind('normal')\n await this.loadKind('normal', progress, options)\n if (unloadErrors.length > 0) {\n throw new AggregateError(unloadErrors, 'some plugins failed to unload cleanly')\n }\n })()\n this.trackNormalOperation(operation)\n return { operation, progress }\n }\n\n async preparePreboot(app: App): Promise<{ reloadRequired: boolean }> {\n pluginRuntimeLogger.info('preboot plugin preparation started')\n await this.ensureBuiltInPlugins()\n await pluginStore.$refreshI18nNames()\n const allPlugins = await db.selectFrom('plugin').selectAll().execute()\n this.captureStartupSnapshot(allPlugins)\n const plugins = selectPluginsForPhase(\n allPlugins.filter(plugin => plugin.enable),\n 'preboot',\n this.startupPrebootNames,\n this.activePrebootNames,\n )\n this.enabledPrebootNames = plugins.map(plugin => plugin.pluginName)\n pluginRuntimeLogger.debug('preboot plugins selected', { count: plugins.length })\n if (plugins.length === 0) {\n this.prebootActivated = true\n return { reloadRequired: false }\n }\n\n try {\n const plan = planPluginLoadOrder(plugins)\n const planError = formatPluginLoadPlanError(plan)\n if (planError) throw new Error(planError)\n for (const level of plan.levels) {\n for (const archive of level) {\n await Global.withRegistrationOwner(archive.pluginName, async () => {\n const platform = isTauriRuntime() ? 'tauri' : 'web'\n const factory = await loadPluginConfig(archive)\n if (!factory)\n throw new Error(`plugin entry has no default export: ${archive.pluginName}`)\n const config = factory({ safe: true, platform })\n if (config.name !== archive.pluginName) {\n throw new Error(`plugin name mismatch: ${archive.pluginName} / ${config.name}`)\n }\n const configStore = useConfig()\n await Promise.all(\n (config.config ?? []).map(pointer => configStore.$registerConfig(pointer).ready),\n )\n const cleanup = await config.onPreboot?.({ app, platform, safe: true })\n if (cleanup) this.prebootCleanups.set(config.name, cleanup)\n this.preparedPreboot.set(config.name, config)\n })\n }\n }\n pluginRuntimeLogger.info('preboot plugin preparation completed', { count: plugins.length })\n return { reloadRequired: false }\n } catch (error) {\n pluginRuntimeLogger.error('preboot plugin preparation failed', error)\n return await this.failPreboot(this.enabledPrebootNames, error)\n }\n }\n\n async activatePreboot(progress = ref<Record<string, PluginLoadingInfo>>({})) {\n if (this.prebootActivated) return { reloadRequired: false }\n try {\n pluginRuntimeLogger.info('preboot plugin activation started', {\n count: this.preparedPreboot.size,\n })\n for (const [name, config] of this.preparedPreboot) {\n await Global.withRegistrationOwner(name, async () => {\n await bootResolvedConfig(config, progress)\n })\n this.active.set(name, { config, kind: 'preboot' })\n this.activePrebootNames.add(name)\n this.preparedPreboot.delete(name)\n }\n this.preparedPreboot.clear()\n this.prebootActivated = true\n pluginRuntimeLogger.info('preboot plugin activation completed')\n return { reloadRequired: false }\n } catch (error) {\n pluginRuntimeLogger.error('preboot plugin activation failed', error)\n return await this.failPreboot(this.enabledPrebootNames, error)\n }\n }\n\n async uninstall(pluginName: string) {\n pluginRuntimeLogger.info('plugin uninstall started', { plugin: pluginName })\n const archive = await db\n .selectFrom('plugin')\n .selectAll()\n .where('pluginName', '=', pluginName)\n .executeTakeFirst()\n if (!archive) return\n if (isBuiltInPlugin(archive)) {\n throw new Error(`built-in plugin \"${pluginName}\" cannot be uninstalled`)\n }\n\n const errors: unknown[] = []\n const active = this.active.get(pluginName)\n if (active) {\n errors.push(...(await this.unloadOne(pluginName, active, true)))\n } else {\n let config: PluginConfig | undefined\n try {\n await Global.withRegistrationOwner(pluginName, async () => {\n const factory = await loadPluginConfig(archive)\n config = factory?.({ safe: true, platform: isTauriRuntime() ? 'tauri' : 'web' })\n await config?.onUninstall?.()\n })\n } catch (error) {\n errors.push(error)\n }\n if (config) {\n try {\n cleanupPlugin(config)\n } catch (error) {\n errors.push(error)\n }\n } else {\n Global.removeOwnedRegistrations(pluginName)\n }\n }\n\n await removePluginFiles(pluginName)\n await db.deleteFrom('plugin').where('pluginName', '=', pluginName).execute()\n await pluginStore.$refreshI18nNames()\n pluginStore.$touch()\n pluginRuntimeLogger.info('plugin uninstall completed', {\n cleanupErrorCount: errors.length,\n plugin: pluginName,\n })\n if (errors.length > 0) {\n throw new AggregateError(errors, `plugin \"${pluginName}\" was removed with cleanup errors`)\n }\n }\n\n readRecovery(): PrebootRecovery | null {\n try {\n const value = globalThis.localStorage?.getItem(recoveryKey)\n if (!value) return null\n return JSON.parse(value) as PrebootRecovery\n } catch (error) {\n pluginRuntimeLogger.warn('failed to read preboot recovery', error)\n return null\n }\n }\n\n clearRecovery() {\n try {\n globalThis.localStorage?.removeItem(recoveryKey)\n } catch (error) {\n pluginRuntimeLogger.warn('failed to clear preboot recovery', error)\n }\n }\n\n private trackNormalOperation(operation: Promise<void>) {\n this.normalOperation = operation\n void operation.then(\n () => {\n this.normalOperation = undefined\n pluginRuntimeLogger.info('normal plugin operation completed')\n },\n error => {\n this.normalOperation = undefined\n pluginRuntimeLogger.error('normal plugin operation failed', error)\n },\n )\n }\n\n private ensureBuiltInPlugins() {\n return (this.builtInSynchronization ??= import('../features/core/runtime').then(\n async ({ registerCoreRuntimeExtensions }) => {\n registerCoreRuntimeExtensions()\n await synchronizeBuiltInPlugins()\n },\n ))\n }\n\n private captureStartupSnapshot(plugins: PluginArchiveDB.Archive[]) {\n if (!this.startupSnapshotReady) this.startupPrebootNames.clear()\n for (const plugin of plugins) {\n if (this.startupPluginNames.has(plugin.pluginName)) continue\n this.startupPluginNames.add(plugin.pluginName)\n if (pluginKind(plugin) === 'preboot') this.startupPrebootNames.add(plugin.pluginName)\n }\n this.startupSnapshotReady = true\n }\n\n private async loadKind(\n kind: 'normal',\n progress: Ref<Record<string, PluginLoadingInfo>>,\n options: LoadNormalOptions,\n ) {\n await this.ensureBuiltInPlugins()\n await pluginStore.$refreshI18nNames()\n const allPlugins = await db\n .selectFrom('plugin')\n .where('enable', 'is', true)\n .selectAll()\n .execute()\n this.captureStartupSnapshot(allPlugins)\n const plugins = filterPluginsBySelection(\n selectPluginsForPhase(allPlugins, kind, this.startupPrebootNames, this.activePrebootNames),\n options.pluginNames ? new Set(options.pluginNames) : undefined,\n )\n const plan = planPluginLoadOrder(plugins)\n pluginRuntimeLogger.info('plugin load plan created', {\n levelCount: plan.levels.length,\n pluginCount: plugins.length,\n })\n const planError = formatPluginLoadPlanError(plan)\n if (planError) throw new Error(planError)\n\n const failed = new Set<string>()\n for (const level of plan.levels) {\n for (const archive of level) {\n const name = archive.pluginName\n progress.value[name] ??= createLoadingInfo()\n const blockedBy = failedDependencies(archive, failed)\n if (blockedBy.length > 0) {\n failed.add(name)\n progress.value[name].progress = {\n errorReason: pluginI18n.translate('plugin.runtime.errors.blockedDependencies', {\n plugins: blockedBy.join(', '),\n }),\n status: 'error',\n stepsIndex: 0,\n }\n continue\n }\n\n let config: PluginConfig | undefined\n try {\n await Global.withRegistrationOwner(name, async () => {\n const factory = await loadPluginConfig(archive)\n if (!factory) throw new Error(`plugin entry has no default export: ${name}`)\n config = factory({\n safe: globalThis.window?.$$safe$$ ?? true,\n platform: isTauriRuntime() ? 'tauri' : 'web',\n })\n if (config.name !== name) {\n throw new Error(`plugin name mismatch: ${name} / ${config.name}`)\n }\n await bootResolvedConfig(config, progress)\n })\n this.active.set(name, { config: config!, kind })\n } catch (error) {\n failed.add(name)\n if (config) {\n try {\n cleanupPlugin(config)\n } catch (cleanupError) {\n pluginRuntimeLogger.error('plugin rollback failed', { plugin: name }, cleanupError)\n }\n } else {\n Global.removeOwnedRegistrations(name)\n }\n const current = progress.value[name] ?? createLoadingInfo()\n progress.value[name] = {\n ...current,\n progress: { ...current.progress, errorReason: reasonText(error), status: 'error' },\n }\n pluginRuntimeLogger.error('plugin load failed', { plugin: name }, error)\n }\n }\n }\n }\n\n private async unloadKind(kind: ClientPluginKind) {\n const entries = [...this.active.entries()].filter(([, active]) => active.kind === kind)\n const errors: unknown[] = []\n pluginRuntimeLogger.info('plugin unload phase started', { count: entries.length, kind })\n for (const [name, active] of entries.reverse()) {\n errors.push(...(await this.unloadOne(name, active, false)))\n }\n pluginRuntimeLogger.info('plugin unload phase completed', { errorCount: errors.length, kind })\n return errors\n }\n\n private async unloadOne(name: string, active: ActivePlugin, uninstall: boolean) {\n const errors: unknown[] = []\n const attempt = async (action: (() => Promise<void> | void) | undefined) => {\n if (!action) return\n try {\n await action()\n } catch (error) {\n errors.push(error)\n }\n }\n\n await attempt(active.config.onUnload?.bind(active.config))\n if (uninstall) await attempt(active.config.onUninstall?.bind(active.config))\n await attempt(this.prebootCleanups.get(name))\n try {\n cleanupPlugin(active.config)\n } catch (error) {\n errors.push(error)\n }\n this.prebootCleanups.delete(name)\n this.preparedPreboot.delete(name)\n this.active.delete(name)\n this.activePrebootNames.delete(name)\n return errors\n }\n\n private async failPreboot(pluginNames: string[], error: unknown) {\n const cleanupErrors: unknown[] = []\n cleanupErrors.push(...(await this.unloadKind('preboot')))\n for (const [name, config] of [...this.preparedPreboot.entries()].reverse()) {\n try {\n await this.prebootCleanups.get(name)?.()\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n try {\n cleanupPlugin(config)\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n this.prebootCleanups.delete(name)\n }\n this.preparedPreboot.clear()\n this.activePrebootNames.clear()\n\n let disabled = true\n try {\n if (pluginNames.length > 0) {\n await db\n .updateTable('plugin')\n .set({ enable: false })\n .where('pluginName', 'in', pluginNames)\n .execute()\n }\n } catch (disableError) {\n disabled = false\n cleanupErrors.push(disableError)\n }\n\n const reasons = [reasonText(error), ...cleanupErrors.map(reasonText)]\n const recovery: PrebootRecovery = {\n failedAt: Date.now(),\n plugins: pluginNames,\n reason: reasons.join('\\n'),\n }\n try {\n globalThis.localStorage?.setItem(recoveryKey, JSON.stringify(recovery))\n } catch (storageError) {\n pluginRuntimeLogger.warn('failed to persist preboot recovery', storageError)\n }\n this.prebootActivated = true\n return { reloadRequired: disabled }\n }\n}\n\nexport const pluginRuntime = new PluginRuntime()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type { PluginConfig, PluginConfigFactory } from '@/plugin'\n\nexport interface PluginInstallerDescription {\n title: string\n description: string\n}\nexport abstract class PluginInstaller {\n /**\n * @returns string mean redirect\n */\n public abstract download(input: string): Promise<File | string>\n /**\n * @returns string mean redirect\n */\n public abstract update(pluginMeta: PluginArchiveDB.Archive): Promise<File | string>\n /**\n * @returns string mean redirect\n */\n public abstract fetchPluginMetaFile(input: string): Promise<File | string>\n\n public abstract isMatched(input: string): boolean\n public abstract name: string\n public abstract description: PluginInstallerDescription\n}\n\nexport abstract class PluginLoader {\n public abstract name: string\n public abstract load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined>\n public abstract install(\n file: File,\n context?: PluginLoaderInstallContext,\n ): Promise<PluginArchiveDB.Meta>\n public abstract canInstall(file: File): boolean\n\n /** need full download */\n public abstract decodeMeta(file: File): Promise<PluginArchiveDB.Meta>\n /** no need full download */\n public abstract decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string>\n public abstract isMetaFile(file: File): boolean\n}\n\nexport interface PluginLoaderInstallContext {\n report: (progress: PluginLoaderInstallProgress) => void\n}\n\nexport interface PluginLoaderInstallProgress {\n description?: string\n progress?: number\n}\n\nexport type PluginBooterSetMeta = (\n meta: Partial<{ description: string; name: string }> | string,\n) => void\n\nexport abstract class PluginBooter {\n public abstract name: string\n public abstract call(\n cfg: PluginConfig,\n setMeta: PluginBooterSetMeta,\n env: Record<any, any>,\n ): Promise<any>\n}","import { PluginArchiveDB, db } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport { createDownloadMessage, type DownloadMessageBind } from '@delta-comic/ui'\nimport { isString } from 'es-toolkit'\n\nimport { useConfig } from '@/config'\nimport { pluginI18n } from '@/i18n'\n\nimport { isBuiltInPlugin, isBuiltInPluginName } from './builtIn'\nimport { runtimeExtensions } from './extensions'\nimport { loaders } from './loader'\nimport { pluginRuntime } from './runtime'\nimport { pluginStore } from './store'\n\nconst pluginInstallLogger = logger.scoped('plugin:install')\n\nconst clampProgress = (progress: number) => Math.min(100, Math.max(0, progress))\n\nexport const installers = runtimeExtensions.installers.values\n\nexport const installDepends = (\n m: DownloadMessageBind,\n meta: PluginArchiveDB.Meta,\n installedPlugins?: Set<string>,\n) =>\n m.createLoading(pluginI18n.translate('plugin.progress.dependencies.checking'), async v => {\n v.retryable = true\n let count = 0\n const plugins =\n installedPlugins ??\n new Set((await db.selectFrom('plugin').select('pluginName').execute()).map(v => v.pluginName))\n const overrides = useConfig().$loadApp().data.value.installOverride\n for (const { id, download } of meta.require) {\n const isDownloaded = plugins.has(id)\n if (isDownloaded || !download) continue\n pluginInstallLogger.info('installing missing plugin dependency', {\n dependency: id,\n plugin: meta.name.id,\n })\n v.description = pluginI18n.translate('plugin.progress.dependencies.installing', { id })\n const downloadCommend = overrides.find(c => c.key == id)?.value ?? download\n await installPlugin(downloadCommend)\n count++\n }\n v.description = pluginI18n.translate('plugin.progress.dependencies.complete', { count })\n })\n\nconst installPluginFile = async (\n m: DownloadMessageBind,\n file: File,\n installerName: string,\n installInput: string,\n __installedPlugins?: Set<string>,\n) => {\n pluginInstallLogger.info('plugin archive installation started', { installer: installerName })\n const meta = await m.createProgress(\n pluginI18n.translate('plugin.progress.installing'),\n async v => {\n v.retryable = true\n const loader = loaders.filter(ins => ins.canInstall(file)).at(-1)\n if (!loader) throw new Error(pluginI18n.translate('plugin.install.errors.noInstaller'))\n v.description = loader.name\n v.progress = 0\n\n const meta = await loader.install(file, {\n report(progress) {\n if (progress.description) v.description = progress.description\n if (typeof progress.progress === 'number') v.progress = clampProgress(progress.progress)\n },\n })\n if (isBuiltInPluginName(meta.name.id)) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.reservedId', { id: meta.name.id }),\n )\n }\n\n v.description = pluginI18n.translate('plugin.progress.persisting')\n v.progress = 95\n await pluginStore.$upsertArchives([\n {\n displayName: meta.name.display,\n enable: true,\n installerName,\n installInput,\n loaderName: loader.name,\n meta,\n pluginName: meta.name.id,\n },\n ])\n v.progress = 100\n return meta\n },\n )\n pluginInstallLogger.info('plugin archive installed', { plugin: meta.name.id })\n\n await installDepends(m, meta, __installedPlugins)\n}\n\nexport const installPlugin = (input: string, __installedPlugins?: Set<string>) =>\n createDownloadMessage(\n pluginI18n.translate('plugin.progress.downloadTitle', { input }),\n async m => {\n const [file, installer] = await m.createLoading(\n pluginI18n.translate('plugin.progress.downloading'),\n async v => {\n v.retryable = true\n let dlCommend = input\n for (;;) {\n const installer = installers.filter(ins => ins.isMatched(dlCommend)).at(0)\n if (!installer) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.noDownloader', { input: dlCommend }),\n )\n }\n v.description = installer.name\n const meta = await installer.download(dlCommend)\n if (isString(meta)) dlCommend = meta\n else return [meta, installer] as const\n }\n },\n )\n\n await installPluginFile(m, file, installer.name, input, __installedPlugins)\n },\n )\n\nexport const installFilePlugin = (file: File, __installedPlugins?: Set<string>) =>\n createDownloadMessage(\n pluginI18n.translate('plugin.progress.installTitle', { file: file.name }),\n async m => {\n await installPluginFile(m, file, '', '', __installedPlugins)\n },\n )\n\nexport const updatePlugin = async (\n pluginMeta: PluginArchiveDB.Archive,\n __installedPlugins?: Set<string>,\n) => {\n if (isBuiltInPlugin(pluginMeta)) {\n throw new Error(pluginI18n.translate('plugin.install.errors.builtInUpdate'))\n }\n return createDownloadMessage(\n pluginI18n.translate('plugin.progress.updateTitle', { plugin: pluginMeta.pluginName }),\n async m => {\n pluginInstallLogger.info('plugin update started', { plugin: pluginMeta.pluginName })\n const file = await m.createLoading(\n pluginI18n.translate('plugin.progress.updating'),\n async v => {\n v.retryable = true\n let installerName = pluginMeta.installerName\n for (;;) {\n const installer = installers.find(v => v.name == installerName)\n if (!installer)\n throw new Error(pluginI18n.translate('plugin.install.errors.noDownloader'))\n v.description = installer.name\n const file = await installer.update(pluginMeta)\n if (isString(file)) installerName = file\n else return file\n }\n },\n )\n\n const meta = await m.createProgress(\n pluginI18n.translate('plugin.progress.installing'),\n async v => {\n v.retryable = true\n const loader = loaders.find(v => v.name == pluginMeta.loaderName)\n if (!loader) throw new Error(pluginI18n.translate('plugin.install.errors.noInstaller'))\n v.description = loader.name\n v.progress = 0\n const meta = await loader.install(file, {\n report(progress) {\n if (progress.description) v.description = progress.description\n if (typeof progress.progress === 'number')\n v.progress = clampProgress(progress.progress)\n },\n })\n v.progress = 100\n return meta\n },\n )\n\n await pluginStore.$upsertArchives([{ ...pluginMeta, meta }])\n\n await installDepends(m, meta, __installedPlugins)\n pluginInstallLogger.info('plugin update completed', { plugin: pluginMeta.pluginName })\n },\n )\n}\n\nexport const uninstallPlugin = (pluginName: string) => pluginRuntime.uninstall(pluginName)","import { h } from 'vue'\nimport type { FunctionalComponent } from 'vue'\n\nexport const OfflineShareRound: FunctionalComponent = () =>\n h(\n 'svg',\n {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n 'viewBox': '0 0 24 24',\n },\n [\n h('path', {\n d: 'M5 5c-.55 0-1 .45-1 1v15c0 1.1.9 2 2 2h9c.55 0 1-.45 1-1s-.45-1-1-1H6V6c0-.55-.45-1-1-1z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M18 1h-8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 14h-8V5h8v10z',\n fill: 'currentColor',\n }),\n h('path', {\n d: 'M12.5 10.25h2v.54c0 .45.54.67.85.35l1.29-1.29c.2-.2.2-.51 0-.71l-1.29-1.29a.5.5 0 0 0-.85.35v.54H12c-.55 0-1 .45-1 1v1.5c0 .41.34.75.75.75s.75-.34.75-.75v-.99z',\n fill: 'currentColor',\n }),\n ],\n )\n\nexport const TagOutlined: FunctionalComponent = () =>\n h(\n 'svg',\n {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n 'viewBox': '0 0 1024 1024',\n },\n [\n h('path', {\n d: 'M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8c1.9 1.9 4.4 2.9 7.1 2.9s5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM459.7 834.7L189.3 564.3L589 164.6L836 188l23.4 247l-399.7 399.7zM680 256c-48.5 0-88 39.5-88 88s39.5 88 88 88s88-39.5 88-88s-39.5-88-88-88zm0 120c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z',\n fill: 'currentColor',\n }),\n ],\n )","import { SourcedKeyMap, uni } from '@delta-comic/model'\nimport { environmentRegistry } from '@delta-comic/ui'\nimport { SharedFunction } from '@delta-comic/utils'\nimport { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from 'lz-string'\nimport { shallowReactive, type Component, type Raw } from 'vue'\n\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { Search, Share, Subscribe, User } from '@/plugin'\n\nimport { usePluginStore } from './driver'\nimport { runtimeExtensions } from './driver/extensions'\nimport { OfflineShareRound, TagOutlined } from './driver/icon'\n\nclass _Global {\n public share = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Share.InitiativeItem>(),\n )\n public shareToken = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Share.ShareToken>(),\n )\n public userActions = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], User.UserAction>(),\n )\n public subscribes = shallowReactive(\n SourcedKeyMap.createReactive<[plugin: string, key: string], Subscribe.Config>(),\n )\n public globalNodes = shallowReactive(new Array<Raw<Component>>())\n\n private readonly globalNodeOwners = new Map<Raw<Component>, string>()\n private readonly registrationOwners: string[] = []\n\n /**\n * Associates global registrations made by a plugin with that plugin. The runtime\n * deliberately loads plugins serially while this ambient scope is active.\n */\n public async withRegistrationOwner<T>(plugin: string, action: () => Promise<T>): Promise<T> {\n this.registrationOwners.push(plugin)\n try {\n return await runtimeExtensions.withOwner(plugin, () =>\n environmentRegistry.withOwner(plugin, action),\n )\n } finally {\n this.registrationOwners.pop()\n }\n }\n\n private get registrationOwner() {\n return this.registrationOwners.at(-1)\n }\n\n public addGlobalNode(component: Raw<Component>, plugin = this.registrationOwner) {\n this.globalNodes.push(component)\n if (plugin) this.globalNodeOwners.set(component, plugin)\n return component\n }\n\n /** Removes only registrations owned by the requested plugin. */\n public removeOwnedRegistrations(plugin: string) {\n for (let index = this.globalNodes.length - 1; index >= 0; index--) {\n const component = this.globalNodes[index]\n if (this.globalNodeOwners.get(component) !== plugin) continue\n this.globalNodes.splice(index, 1)\n this.globalNodeOwners.delete(component)\n }\n environmentRegistry.removeOwner(plugin)\n runtimeExtensions.removeOwner(plugin)\n }\n\n public tabbar = shallowReactive(new Map<string, Search.Tabbar[]>())\n public addTabbar(plugin: string, ...tabbar: Search.Tabbar[]) {\n const old = this.tabbar.get(plugin) ?? []\n this.tabbar.set(plugin, old.concat(tabbar))\n }\n\n public categories = shallowReactive(new Map<string, Search.Category[]>())\n public addCategories(plugin: string, ...categories: Search.Category[]) {\n const old = this.categories.get(plugin) ?? []\n this.categories.set(plugin, old.concat(categories))\n }\n\n public barcode = shallowReactive(new Map<string, Search.Barcode[]>())\n public addBarcode(plugin: string, ...barcode: Search.Barcode[]) {\n const old = this.barcode.get(plugin) ?? []\n this.barcode.set(plugin, old.concat(barcode))\n }\n\n public hotSearch = shallowReactive(new Map<string, Search.HotSearchProvider[]>())\n public addHotSearch(plugin: string, ...providers: Search.HotSearchProvider[]) {\n const old = this.hotSearch.get(plugin) ?? []\n this.hotSearch.set(plugin, old.concat(providers))\n }\n\n public levelboard = shallowReactive(new Map<string, Search.HotLevelboard[]>())\n public addLevelboard(plugin: string, ...levelboard: Search.HotLevelboard[]) {\n const old = this.levelboard.get(plugin) ?? []\n this.levelboard.set(plugin, old.concat(levelboard))\n }\n\n public topButton = shallowReactive(new Map<string, Search.HotTopButton[]>())\n public addTopButton(plugin: string, ...topButton: Search.HotTopButton[]) {\n const old = this.topButton.get(plugin) ?? []\n this.topButton.set(plugin, old.concat(topButton))\n }\n\n public mainLists = shallowReactive(new Map<string, Search.HotMainList[]>())\n public addMainList(plugin: string, ...mainLists: Search.HotMainList[]) {\n const old = this.mainLists.get(plugin) ?? []\n this.mainLists.set(plugin, old.concat(mainLists))\n }\n}\n\nexport const Global = new _Global()\n\n// share\n\ninterface CorePluginTokenShareMeta {\n item: { name: string; contentType: string; ep: string }\n plugin: string\n id: string\n}\n\nGlobal.share.set(['core', 'token'], {\n filter: page => !!page.preload,\n icon: TagOutlined,\n key: 'token',\n name: pluginMessageKey('plugin.share.copyToken'),\n async call(page) {\n const item = page.preload?.toJSON()\n if (!item) throw new Error('Not found preload in content. Maybe not fetch detail?')\n\n const compressed = compressToEncodedURIComponent(\n JSON.stringify(<CorePluginTokenShareMeta>{\n item: {\n contentType: uni.content.ContentPage.contentPages.key.toString(item.contentType),\n ep: item.thisEp.id,\n name: item.title,\n },\n plugin: page.plugin,\n id: page.id,\n }),\n )\n return { token: `[${item.title}](复制这条口令,打开Delta Comic)${compressed}` }\n },\n})\n\nGlobal.share.set(['core', 'native'], {\n filter: page => !!page.preload,\n icon: OfflineShareRound,\n key: 'native',\n name: pluginMessageKey('plugin.share.native'),\n async call(page) {\n const item = page.preload?.toJSON()\n if (!item) throw new Error('Not found preload in content. Maybe not fetch detail?')\n\n const compressed = compressToEncodedURIComponent(\n JSON.stringify(<CorePluginTokenShareMeta>{\n item: {\n contentType: uni.content.ContentPage.contentPages.key.toString(item.contentType),\n ep: item.thisEp.id,\n name: item.title,\n },\n plugin: page.plugin,\n id: page.id,\n }),\n )\n const token = `[${item.title}](复制这条口令,打开Delta Comic)${compressed}`\n await navigator.share({ title: pluginI18n.translate('plugin.share.nativeTitle'), text: token })\n\n return { token }\n },\n})\n\nGlobal.shareToken.set(['core', 'token'], {\n key: 'token',\n name: pluginMessageKey('plugin.share.defaultToken'),\n patten(chipboard) {\n return /^\\[.+\\]\\(复制这条口令,打开Delta Comic\\).+/.test(chipboard)\n },\n show(chipboard) {\n const pluginStore = usePluginStore()\n const meta: CorePluginTokenShareMeta = JSON.parse(\n decompressFromEncodedURIComponent(\n chipboard.replace(/^\\[.+\\]/, '').replaceAll('(复制这条口令,打开Delta Comic)', ''),\n ),\n )\n return {\n title: pluginI18n.translate('plugin.share.tokenTitle'),\n detail: pluginI18n.translate('plugin.share.tokenDetail', {\n item: meta.item.name,\n plugin: pluginStore.$getI18nName(meta.plugin),\n }),\n onNegative() {},\n onPositive() {\n return SharedFunction.call(\n 'routeToContent',\n uni.content.ContentPage.contentPages.key.toJSON(meta.item.contentType),\n meta.id,\n meta.item.ep,\n )\n },\n }\n },\n})"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-DQbAfFDr.mjs","names":["_TestPluginResource","pkg.version","configSetter","i18n","apiTest","resourceTest","boot","auth","otherProgress","zipLoader","devLoader","fallbackUrlInstaller","localInstaller","devInstaller","githubInstaller","awesomeInstaller"],"sources":["../lib/features/core/booters/0_configSetter.ts","../lib/features/core/booters/5_i18n.ts","../lib/features/core/booters/utils.ts","../lib/features/core/booters/10_apiTest.ts","../lib/features/core/booters/20_resourceTest.ts","../lib/features/core/booters/30_boot.ts","../lib/features/core/booters/40_auth.ts","../lib/plugin/otherProgress.ts","../lib/features/core/booters/50_otherProcess.ts","../lib/features/core/installers/downloadAsset.ts","../lib/features/core/installers/10_normalUrl.ts","../lib/features/core/installers/20_local.ts","../lib/features/core/installers/30_dev.ts","../package.json","../lib/features/core/installers/40_github.ts","../lib/features/core/installers/9999_awesome.ts","../lib/features/core/loaders/1_zip.ts","../lib/features/core/loaders/2_dev.ts","../lib/features/core/runtime.ts"],"sourcesContent":["import { logger } from '@delta-comic/logger'\nimport { uni } from '@delta-comic/model'\n\nimport { useConfig } from '@/config'\nimport { Global } from '@/global'\nimport { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nconst configSetterLogger = logger.scoped('plugin:config-setter')\n\nclass _ConfigSetter extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.presets.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n configSetterLogger.debug('registering plugin capabilities', { plugin: cfg.name })\n setMeta(pluginMessageKey('plugin.runtime.steps.presets.applying'))\n const { name: plugin, content, resource, search, user, subscribe, share } = cfg\n if (content)\n for (const [\n ct,\n { commentRow, contentPage, downloadProvider, itemCard, layout, itemTranslator },\n ] of Object.entries(content)) {\n if (layout) uni.content.ContentPage.layouts.set(ct, layout)\n if (itemCard) uni.item.Item.itemCards.set(ct, itemCard)\n if (contentPage) uni.content.ContentPage.contentPages.set(ct, contentPage)\n if (downloadProvider) uni.content.ContentPage.downloadProviders.set(ct, downloadProvider)\n if (commentRow) uni.comment.Comment.commentRow.set(ct, commentRow)\n if (itemTranslator) uni.item.Item.itemTranslator.set(ct, itemTranslator)\n }\n\n if (resource) {\n if (resource.types)\n for (const type of resource.types) uni.resource.Resource.fork.set([plugin, type.type], type)\n if (resource.process)\n for (const [name, fn] of Object.entries(resource.process))\n uni.resource.Resource.processInstances.set([plugin, name], fn)\n }\n if (search) {\n if (search.categories) for (const c of search.categories) Global.addCategories(plugin, c)\n if (search.tabbar) for (const c of search.tabbar) Global.addTabbar(plugin, c)\n if (search.hotPage) {\n for (const mlc of search.hotPage.mainListCard ?? []) Global.addMainList(plugin, mlc)\n for (const lb of search.hotPage.levelBoard ?? []) Global.addLevelboard(plugin, lb)\n for (const tb of search.hotPage.topButton ?? []) Global.addTopButton(plugin, tb)\n }\n if (search.barcode) {\n for (const barcode of search.barcode ?? []) Global.addBarcode(plugin, barcode)\n }\n if (search.hotSearch) {\n for (const provider of search.hotSearch) Global.addHotSearch(plugin, provider)\n }\n }\n if (user) {\n if (user.card) uni.user.User.userCards.set(plugin, user.card)\n if (user.edit) uni.user.User.userEditorBase.set(plugin, user.edit as any)\n if (user.userActions)\n for (const [type, value] of Object.entries(user.userActions))\n Global.userActions.set([plugin, type], value)\n if (user.authorIcon)\n for (const [key, value] of Object.entries(user.authorIcon))\n uni.item.Item.authorIcon.set([plugin, key], value as any)\n }\n if (subscribe) {\n for (const [key, value] of Object.entries(subscribe))\n Global.subscribes.set([plugin, key], value)\n }\n if (cfg.config) {\n for (const config of cfg.config) useConfig().$registerConfig(config)\n }\n if (share) {\n for (const v of share.initiative ?? []) Global.share.set([plugin, v.key], v)\n for (const v of share.tokenListen ?? []) Global.shareToken.set([plugin, v.key], v)\n }\n }\n}\nexport default new _ConfigSetter()","import { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter } from '../../../driver/extensionTypes'\n\nclass PluginI18nBooter extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.language.title')\n\n public override async call(cfg: PluginConfig): Promise<void> {\n if (cfg.i18n) pluginI18n.register(cfg.name, cfg.i18n)\n }\n}\n\nexport default new PluginI18nBooter()","import { logger } from '@delta-comic/logger'\nimport { isEmpty, sortBy } from 'es-toolkit/compat'\n\nimport type { PluginConfig } from '@/plugin'\n\nconst pluginProbeLogger = logger.scoped('plugin:probe')\n\nexport const testApi = async (cfg: NonNullable<PluginConfig['api']>[string]) => {\n const forks = await cfg.forks()\n return await test(forks, cfg.test)\n}\n\nexport const testResourceApi = (\n cfg: NonNullable<NonNullable<PluginConfig['resource']>['types']>[number],\n) => {\n const forks = cfg.urls\n return test(forks, cfg.test)\n}\n\nconst test = async (\n forks: string[],\n test: (url: string, signal: AbortSignal) => PromiseLike<any>,\n) => {\n if (isEmpty(forks)) throw new Error('[plugin test] no fork found')\n const record: [url: string, result: false | number][] = []\n const abortController = new AbortController()\n try {\n await Promise.all(\n forks.map(async (_fork, index) => {\n try {\n const begin = Date.now()\n const stopTimeout = setTimeout(() => {\n abortController.abort()\n }, 10000)\n await test(_fork, abortController.signal)\n clearTimeout(stopTimeout)\n const end = Date.now()\n const time = end - begin\n record.push([_fork, time])\n pluginProbeLogger.debug('plugin endpoint probe succeeded', { index, latencyMs: time })\n abortController.abort()\n } catch {\n record.push([_fork, false])\n pluginProbeLogger.debug('plugin endpoint probe failed', { index })\n }\n }),\n )\n } catch (err) {\n pluginProbeLogger.debug('plugin endpoint probe aborted', err)\n }\n const result = sortBy(\n record.filter(v => v[1] != false),\n v => v[1],\n )[0]\n pluginProbeLogger.debug('plugin endpoint probe completed', { found: Boolean(result) })\n if (!result) {\n return ['', false] as [string, false]\n }\n return result\n}","import { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nimport { testApi } from './utils'\n\nexport type _TestPluginApiResult = Record<string, string | false | undefined>\n\nclass _TestPluginApi extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.apiTest.title')\n public override async call(\n cfg: PluginConfig,\n setMeta: PluginBooterSetMeta,\n env: Record<any, any>,\n ): Promise<any> {\n if (!cfg.api) return\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.starting'))\n\n const namespaces = Object.keys(cfg.api)\n const results = await Promise.all(namespaces.map(namespace => testApi(cfg.api![namespace])))\n const displayResult = new Array<[namespace: string, time: number | false]>()\n const api: _TestPluginApiResult = {}\n namespaces.forEach((namespace, i) => {\n api[namespace] = results[i][0]\n displayResult.push([namespace, results[i][1]])\n })\n\n env.api = api\n\n if (Object.values(api).some(v => v == false)) {\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.unreachable'))\n throw new Error('can not connect to server')\n }\n setMeta(\n pluginI18n.translate('plugin.runtime.steps.tests.complete', {\n results: displayResult.map(ent => `${ent[0]} -> ${ent[1]} ms`).join('\\n'),\n }),\n )\n }\n}\nexport default new _TestPluginApi()","import { uni } from '@delta-comic/model'\n\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nimport { testResourceApi } from './utils'\n\nclass _TestPluginResource extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.resourceTest.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.resource?.types?.length) return\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.starting'))\n\n const types = cfg.resource.types.map(v => ({ type: v.type, val: v }))\n const results = await Promise.all(types.map(type => testResourceApi(type.val)))\n const displayResult = new Array<[type: (typeof types)[number], time: number | false]>()\n types.forEach((type, i) => {\n if (results[i][1])\n uni.resource.Resource.precedenceFork.set([cfg.name, type.type], results[i][0])\n displayResult.push([type, results[i][1]])\n })\n if (results.some(v => v[1] == false)) {\n setMeta(pluginMessageKey('plugin.runtime.steps.tests.unreachable'))\n throw new Error('[plugin test] can not connect to server')\n }\n setMeta(\n pluginI18n.translate('plugin.runtime.steps.tests.complete', {\n results: displayResult.map(ent => `${ent[0].type} -> ${ent[1]} ms`).join('\\n'),\n }),\n )\n }\n}\nexport default new _TestPluginResource()","import { declareDepType, provide } from '@/depends'\nimport { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\n\nimport { PluginBooter } from '../../../driver/extensionTypes'\n\nclass _ExposeBootPlugin extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.customBoot.title')\n public override async call(cfg: PluginConfig, _: any, env: Record<any, any>): Promise<any> {\n if (!cfg.onBooted) return\n const expose = await cfg.onBooted({ api: env.api })\n if (expose) provide(declareDepType(cfg.name), expose)\n }\n}\nexport default new _ExposeBootPlugin()","import { logger } from '@delta-comic/logger'\nimport { createForm } from '@delta-comic/ui'\nimport { PageWebviewAuth } from '@delta-comic/utils'\nimport { Mutex } from 'es-toolkit'\nimport { NModal, useDialog } from 'naive-ui'\nimport { defineComponent, h, markRaw, ref } from 'vue'\n\nimport { usePluginStore } from '@/driver/store'\nimport { Global } from '@/global'\nimport { pluginI18n, pluginMessageKey } from '@/i18n'\nimport type { Auth, PluginConfig } from '@/plugin'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nconst pluginAuthLogger = logger.scoped('plugin:auth')\n\nconst authPopupMutex = new Mutex()\n\nclass _PluginAuth extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.auth.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.auth) return\n const pluginStore = usePluginStore()\n let mutexAcquired = false\n try {\n const pluginName = pluginStore.$getI18nName(cfg.name)\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.checking'))\n const isPass = await cfg.auth.passSelect()\n const waitMethod = Promise.withResolvers<'logIn' | 'signUp'>()\n pluginAuthLogger.info('plugin authentication state checked', {\n authenticated: Boolean(isPass),\n plugin: cfg.name,\n })\n await authPopupMutex.acquire()\n mutexAcquired = true\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.waiting'))\n if (!isPass) {\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.selecting'))\n void useDialog().create({\n type: 'default',\n positiveText: pluginI18n.translate('plugin.runtime.steps.auth.logIn'),\n negativeText: pluginI18n.translate('plugin.runtime.steps.auth.signUp'),\n closable: false,\n maskClosable: false,\n content: pluginI18n.translate('plugin.runtime.steps.auth.selectMethod'),\n title: pluginName,\n onNegativeClick() {\n waitMethod.resolve('signUp')\n },\n onPositiveClick() {\n waitMethod.resolve('logIn')\n },\n })\n } else {\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.skipping'))\n waitMethod.resolve(isPass)\n }\n const method = await waitMethod.promise\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.authenticating'))\n const by: Auth.Method = {\n async form(form) {\n const formInstance = createForm(form)\n Global.addGlobalNode(\n markRaw(\n defineComponent(() => {\n const show = ref(true)\n void formInstance.data.then(() => (show.value = false))\n return () =>\n h(\n NModal,\n { show: show.value, position: 'center', preset: 'dialog', title: pluginName },\n formInstance.comp,\n )\n }),\n ),\n cfg.name,\n )\n const data = await formInstance.data\n return data\n },\n async website<T>(\n url: string,\n injectCode: Auth.InjectCode,\n ): Promise<Auth.CallbackResult<T>> {\n const auth = new PageWebviewAuth<T>(url, injectCode, { title: pluginName })\n return auth.mount()\n },\n }\n if (method == 'logIn') {\n await cfg.auth.logIn(by)\n } else if (method == 'signUp') {\n await cfg.auth.signUp(by)\n }\n authPopupMutex.release()\n mutexAcquired = false\n setMeta(pluginMessageKey('plugin.runtime.steps.auth.success'))\n pluginAuthLogger.info('plugin authentication completed', { plugin: cfg.name })\n } catch (error: any) {\n if (mutexAcquired) authPopupMutex.release()\n setMeta(pluginI18n.translate('plugin.runtime.steps.auth.failure', { error: String(error) }))\n pluginAuthLogger.error('plugin authentication failed', { plugin: cfg.name }, error)\n throw error\n }\n }\n}\nexport default new _PluginAuth()","export interface Config {\n /** Run immediately with adjacent async steps; a trailing async group does not block loading. */\n async?: boolean\n call: (setDescription: (description: string) => void) => PromiseLike<any>\n name: string\n}\n\nexport interface OtherProgressRunnerOptions {\n onBackgroundError?: (error: AggregateError) => void\n setMeta: (meta: { description: string; name: string }) => void\n}\n\nconst runProgress = async (progress: Config, setMeta: OtherProgressRunnerOptions['setMeta']) => {\n setMeta({ name: progress.name, description: '' })\n await progress.call(description => setMeta({ name: progress.name, description }))\n}\n\nexport const runOtherProgress = async (\n progresses: readonly Config[],\n {\n setMeta,\n onBackgroundError = error => otherProgressLogger.error('background plugin steps failed', error),\n }: OtherProgressRunnerOptions,\n) => {\n let parallelGroup: Promise<void>[] = []\n\n for (const progress of progresses) {\n if (progress.async) {\n otherProgressLogger.debug('background plugin step started', { name: progress.name })\n parallelGroup.push(runProgress(progress, setMeta))\n continue\n }\n\n if (parallelGroup.length > 0) {\n await Promise.all(parallelGroup)\n parallelGroup = []\n }\n await runProgress(progress, setMeta)\n otherProgressLogger.debug('plugin step completed', { name: progress.name })\n }\n\n if (parallelGroup.length === 0) return\n void Promise.allSettled(parallelGroup).then(results => {\n const errors = results.flatMap(result => (result.status === 'rejected' ? [result.reason] : []))\n if (errors.length > 0) onBackgroundError(new AggregateError(errors, '后台插件步骤执行失败'))\n })\n}\nimport { logger } from '@delta-comic/logger'\n\nconst otherProgressLogger = logger.scoped('plugin:background-progress')","import { pluginMessageKey } from '@/i18n'\nimport type { PluginConfig } from '@/plugin'\nimport { runOtherProgress } from '@/plugin/otherProgress'\n\nimport { PluginBooter, type PluginBooterSetMeta } from '../../../driver/extensionTypes'\n\nclass _TestPluginResource extends PluginBooter {\n public override name = pluginMessageKey('plugin.runtime.steps.other.title')\n public override async call(cfg: PluginConfig, setMeta: PluginBooterSetMeta): Promise<any> {\n if (!cfg.otherProgress?.length) return\n\n await runOtherProgress(cfg.otherProgress, { setMeta })\n }\n}\nexport default new _TestPluginResource()","import { Downloader } from '@delta-comic/downloader'\nimport { logger } from '@delta-comic/logger'\nimport ky from 'ky'\n\nimport { isTauriRuntime } from '../../../driver/init/storage'\n\nexport const MAX_PLUGIN_ASSET_BYTES = 128 * 1024 * 1024\nexport const PLUGIN_DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000\n\nconst downloader = Downloader.get()\nconst assetLogger = logger.scoped('plugin:install:asset')\n\nexport interface DownloadInstallerAssetOptions {\n retry: number\n maxBytes?: number\n}\n\n/**\n * Managed downloads are intentionally bypassed here: installer assets are temporary and must\n * never appear in the user's download queue or leave a task record behind.\n */\nexport const downloadInstallerAsset = async (\n url: string,\n options: DownloadInstallerAssetOptions,\n): Promise<Blob> => {\n assetLogger.info('installer asset download started', {\n maxBytes: options.maxBytes ?? MAX_PLUGIN_ASSET_BYTES,\n runtime: isTauriRuntime() ? 'tauri' : 'web',\n })\n if (isTauriRuntime()) {\n const bytes = await downloader.downloadEphemeral(url, {\n maxBytes: options.maxBytes ?? MAX_PLUGIN_ASSET_BYTES,\n })\n assetLogger.info('installer asset download completed', { bytes: bytes.byteLength })\n return new Blob([bytes])\n }\n\n const blob = await ky\n .get(url, { retry: options.retry, timeout: PLUGIN_DOWNLOAD_TIMEOUT_MS })\n .blob()\n assetLogger.info('installer asset download completed', { bytes: blob.size })\n return blob\n}","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginMessageKey } from '../../../i18n'\n\nimport { downloadInstallerAsset } from './downloadAsset'\n\nconst getFileName = (input: string): string => {\n const url = new URL(input)\n const encoded = url.pathname.split('/').filter(Boolean).at(-1) ?? url.hostname\n let decoded = encoded\n try {\n decoded = decodeURIComponent(encoded)\n } catch {\n // Keep malformed percent escapes verbatim; URL parsing has already validated the input.\n }\n const withoutControlCharacters = [...decoded]\n .map(character => {\n const code = character.charCodeAt(0)\n return code < 32 || code === 127 ? '_' : character\n })\n .join('')\n return withoutControlCharacters.replace(/[<>:\"/\\\\|?*]/g, '_').trim() || 'us.js'\n}\n\nexport class _PluginInstallByFallbackUrl extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.url.title'),\n description: pluginMessageKey('plugin.install.methods.url.description'),\n }\n public override name = 'fallbackUrl'\n private async installer(input: string): Promise<File> {\n const data = await downloadInstallerAsset(input, { retry: 3 })\n return new File([data], getFileName(input))\n }\n\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n\n public override isMatched(input: string): boolean {\n return URL.canParse(input)\n }\n}\n\nexport default new _PluginInstallByFallbackUrl()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { readLocalFile } from '../../../driver/init/native'\nimport { isTauriRuntime } from '../../../driver/init/storage'\nimport { pluginMessageKey } from '../../../i18n'\n\nexport class _PluginInstallByLocal extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.local.title'),\n description: pluginMessageKey('plugin.install.methods.local.description'),\n }\n public override name = 'local'\n private async installer(input: string): Promise<File> {\n const path = decodeURIComponent(input.replace(/^local:/, ''))\n return await readLocalFile(path)\n }\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override isMatched(input: string): boolean {\n return isTauriRuntime() && input.startsWith('local:')\n }\n}\n\nexport default new _PluginInstallByLocal()","import type { PluginArchiveDB } from '@delta-comic/db'\nimport ky from 'ky'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { prepareDevScript } from '../../../driver/init/native'\nimport { pluginMessageKey } from '../../../i18n'\n\nexport class _PluginInstallByDev extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.development.title'),\n description: pluginMessageKey('plugin.install.methods.development.description'),\n }\n public override name = 'devUrl'\n private async installer(input: string): Promise<File> {\n const res = await ky\n .get(\n `http://${/:\\d+$/.test(input) ? input : input + ':6173'}/__vite-plugin-monkey.install.user.js?origin=http%3A%2F%2F${input}%3A6173`,\n )\n .text()\n const processed = await prepareDevScript(input, res)\n return new File([processed], 'us.js')\n }\n public override async download(input: string): Promise<File> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override isMatched(input: string): boolean {\n return /^(((\\d+\\.?)+)|(localhost))(:\\d+)?$/.test(input)\n }\n}\n\nexport default new _PluginInstallByDev()","","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { Octokit } from '@octokit/rest'\n\nimport pkg from '../../../../package.json'\nimport { useConfig } from '../../../config'\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginI18n, pluginMessageKey } from '../../../i18n'\nimport { isPluginManifestCompatible, parsePluginManifest } from '../../../manifest'\n\nimport { downloadInstallerAsset } from './downloadAsset'\n\ntype GitHubRelease = Awaited<ReturnType<Octokit['rest']['repos']['listReleases']>>['data'][number]\n\ninterface GitHubInstallerConfig {\n githubToken: string\n receivePerReleaseUpdate: boolean\n}\n\nexport interface GitHubInstallerDependencies {\n coreVersion: string\n downloadAsset: (url: string) => Promise<Blob>\n getConfig: () => GitHubInstallerConfig\n listReleasePages: (\n owner: string,\n repo: string,\n token?: string,\n ) => AsyncIterable<readonly GitHubRelease[]>\n}\n\nexport const defaultGitHubInstallerDependencies: GitHubInstallerDependencies = {\n coreVersion: pkg.version,\n downloadAsset: async url => await downloadInstallerAsset(url, { retry: 2 }),\n getConfig: () => useConfig().$loadApp().data.value,\n async *listReleasePages(owner, repo, token) {\n const octokit = new Octokit({ auth: token })\n const pages = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner,\n per_page: 100,\n repo,\n })\n for await (const page of pages) yield page.data\n },\n}\n\nconst parseRepository = (input: string) => {\n const [owner, repo, ...rest] = input.replace(/^gh:/, '').split('/')\n if (!owner || !repo || rest.length > 0) {\n throw new Error(pluginI18n.translate('plugin.install.errors.invalidGitHub', { input }))\n }\n return { owner, repo }\n}\n\nconst decodeManifest = async (blob: Blob): Promise<PluginArchiveDB.Meta | undefined> => {\n try {\n return parsePluginManifest(JSON.parse(await blob.text()))\n } catch {\n return undefined\n }\n}\n\ninterface CompatibleRelease {\n manifest: Blob\n plugin: GitHubRelease['assets'][number]\n}\n\nexport class _PluginInstallByNormalUrl extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.github.title'),\n description: pluginMessageKey('plugin.install.methods.github.description'),\n }\n public override name = 'github'\n\n public constructor(private readonly dependencies = defaultGitHubInstallerDependencies) {\n super()\n }\n\n private async findCompatibleRelease(input: string): Promise<CompatibleRelease> {\n const { githubToken, receivePerReleaseUpdate } = this.dependencies.getConfig()\n const { owner, repo } = parseRepository(input)\n const pages = this.dependencies.listReleasePages(owner, repo, githubToken || undefined)\n\n for await (const releases of pages) {\n for (const release of releases) {\n if (release.draft || (!receivePerReleaseUpdate && release.prerelease)) continue\n\n const manifestAsset = release.assets.find(asset => asset.name === 'manifest.json')\n const plugin = release.assets.find(asset => asset.name === 'plugin.zip')\n if (!manifestAsset || !plugin) continue\n\n const manifest = await this.dependencies.downloadAsset(manifestAsset.browser_download_url)\n const meta = await decodeManifest(manifest)\n if (!meta || !isPluginManifestCompatible(meta, this.dependencies.coreVersion)) {\n continue\n }\n return { manifest, plugin }\n }\n }\n\n throw new Error(\n pluginI18n.translate('plugin.install.errors.noCompatibleRelease', {\n version: this.dependencies.coreVersion,\n }),\n )\n }\n\n private async installer(input: string): Promise<File> {\n const { plugin } = await this.findCompatibleRelease(input)\n const data = await this.dependencies.downloadAsset(plugin.browser_download_url)\n return new File([data], plugin.name)\n }\n\n public override async download(input: string): Promise<File> {\n return await this.installer(input)\n }\n\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File> {\n return await this.installer(pluginMeta.installInput)\n }\n\n public override async fetchPluginMetaFile(input: string): Promise<File> {\n const { manifest } = await this.findCompatibleRelease(input)\n return new File([manifest], 'manifest.json')\n }\n\n public override isMatched(input: string): boolean {\n return input.startsWith('gh:') && input.split('/').length === 2\n }\n}\n\nexport default new _PluginInstallByNormalUrl()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport { PluginInstaller, type PluginInstallerDescription } from '../../../driver/extensionTypes'\nimport { pluginI18n, pluginMessageKey } from '../../../i18n'\nimport {\n AwesomeRegistryClient,\n marketplaceDownloadToInstallInput,\n type AwesomePluginListing,\n} from '../../../marketplace'\n\nexport interface AwesomeInstallerRegistry {\n findListing(id: string): Promise<AwesomePluginListing>\n loadManifest(listing: AwesomePluginListing): Promise<PluginArchiveDB.Meta | undefined>\n}\n\nexport class _PluginInstallByAwesome extends PluginInstaller {\n public override description: PluginInstallerDescription = {\n title: pluginMessageKey('plugin.install.methods.marketplace.title'),\n description: pluginMessageKey('plugin.install.methods.marketplace.description'),\n }\n public override name = 'awesome'\n public constructor(\n private readonly registry: AwesomeInstallerRegistry = new AwesomeRegistryClient(),\n ) {\n super()\n }\n\n private async listing(input: string) {\n const match = /^ap:([A-Za-z0-9][A-Za-z0-9_-]{0,63})$/.exec(input)\n if (!match) {\n throw new Error(pluginI18n.translate('plugin.install.errors.invalidMarketplaceId', { input }))\n }\n return await this.registry.findListing(match[1])\n }\n\n private async installer(input: string): Promise<File | string> {\n const listing = await this.listing(input)\n return marketplaceDownloadToInstallInput(listing.download)\n }\n public override async download(input: string): Promise<File | string> {\n const file = await this.installer(input)\n return file\n }\n public override async update(pluginMeta: PluginArchiveDB.Archive): Promise<File | string> {\n const file = await this.installer(pluginMeta.installInput)\n return file\n }\n public override async fetchPluginMetaFile(input: string): Promise<File | string> {\n const listing = await this.listing(input)\n const manifest = await this.registry.loadManifest(listing)\n if (!manifest) return marketplaceDownloadToInstallInput(listing.download)\n return new File([JSON.stringify(manifest)], 'manifest.json', { type: 'application/json' })\n }\n public override isMatched(input: string): boolean {\n return /^ap:[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(input)\n }\n}\n\nexport default new _PluginInstallByAwesome()","import type { PluginArchiveDB } from '@delta-comic/db'\nimport { logger } from '@delta-comic/logger'\nimport JSZip from 'jszip'\n\nimport { pluginI18n } from '@/i18n'\nimport type { PluginConfigFactory } from '@/plugin'\n\nimport { PluginLoader, type PluginLoaderInstallContext } from '../../../driver/extensionTypes'\nimport {\n createPluginAssetUrl,\n createPluginModuleUrl,\n installZipFile,\n isTauriRuntime,\n listPluginFiles,\n readPluginText,\n} from '../../../driver/init/storage'\n\nconst zipLoaderLogger = logger.scoped('plugin:loader:zip')\n\nexport const rewriteCssAssetUrls = async (\n cssPath: string,\n css: string,\n createAssetUrl: (path: string) => Promise<string>,\n) => {\n const pattern = /url\\(\\s*(?:([\"'])(.*?)\\1|([^)'\"\\s][^)]*?))\\s*\\)/g\n let output = ''\n let cursor = 0\n for (const match of css.matchAll(pattern)) {\n const index = match.index\n const rawUrl = (match[2] ?? match[3] ?? '').trim()\n if (!rawUrl || /^(?:#|blob:|data:|https?:|\\/\\/)/i.test(rawUrl)) continue\n const resolved = new URL(rawUrl, `https://plugin.local/${cssPath}`)\n const assetUrl = await createAssetUrl(resolved.pathname.slice(1))\n output += css.slice(cursor, index) + `url(\"${assetUrl}${resolved.search}${resolved.hash}\")`\n cursor = index + match[0].length\n }\n return output + css.slice(cursor)\n}\n\nexport default new (class extends PluginLoader {\n public override name = 'zip'\n public override async install(\n file: File,\n context?: PluginLoaderInstallContext,\n ): Promise<PluginArchiveDB.Meta> {\n zipLoaderLogger.info('zip plugin installation started', { bytes: file.size })\n return await installZipFile(file, progress => {\n const percent = progress.total > 0 ? (progress.current / progress.total) * 90 : 0\n context?.report({\n description: progress.path\n ? pluginI18n.translate('plugin.progress.extractingPath', { path: progress.path })\n : pluginI18n.translate('plugin.progress.extracting'),\n progress: percent,\n })\n })\n }\n public override canInstall(file: File): boolean {\n return file.name.endsWith('.zip')\n }\n\n public override async load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined> {\n zipLoaderLogger.debug('zip plugin module load started', { plugin: pluginMeta.pluginName })\n if (!pluginMeta.meta.entry) throw new Error('not found entry')\n const files = await listPluginFiles(pluginMeta.pluginName)\n const javascriptFiles = files.filter(path => /\\.(?:js|mjs)$/i.test(path))\n if (!isTauriRuntime() && javascriptFiles.length > 1) {\n throw new Error(\n pluginI18n.translate('plugin.install.errors.webSingleFile', {\n files: javascriptFiles.join(', '),\n }),\n )\n }\n const src = await createPluginModuleUrl(pluginMeta.pluginName, pluginMeta.meta.entry.jsPath)\n const config = await import(/* @vite-ignore */ src).finally(() => {\n if (src.startsWith('blob:')) URL.revokeObjectURL(src)\n })\n const result = config.default as PluginConfigFactory | undefined\n\n if (!pluginMeta.meta.entry?.cssPath) return result\n const cssPath = pluginMeta.meta.entry.cssPath\n\n if (cssPath == 'auto') {\n const discovered = files.find(path => path.endsWith('.css'))\n if (!discovered) return result\n var filePath = discovered\n } else var filePath = cssPath\n\n const style = document.createElement('style')\n style.dataset.plugin = pluginMeta.pluginName\n style.textContent = await rewriteCssAssetUrls(\n filePath,\n await readPluginText(pluginMeta.pluginName, filePath),\n path => createPluginAssetUrl(pluginMeta.pluginName, path),\n )\n document.head.appendChild(style)\n zipLoaderLogger.debug('zip plugin stylesheet attached', { plugin: pluginMeta.pluginName })\n\n return result\n }\n public override async decodeMeta(file: File): Promise<PluginArchiveDB.Meta> {\n const zip = await JSZip.loadAsync(file)\n const manifest = zip.file('manifest.json')\n if (!manifest) throw new Error('plugin archive does not contain manifest.json')\n return JSON.parse(await manifest.async('text')) as PluginArchiveDB.Meta\n }\n\n public override isMetaFile(file: File): boolean {\n return file.name.endsWith('.zip') || file.name == 'manifest.json'\n }\n public override async decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string> {\n if (file.name == 'manifest.json') return JSON.parse(await file.text())\n const jszip = new JSZip()\n const zip = await jszip.loadAsync(file)\n const mFile = await zip.filter(p => p == 'manifest.json')[0].async('text')\n return JSON.parse(mFile)\n }\n})()","import type { PluginArchiveDB } from '@delta-comic/db'\n\nimport type { PluginConfigFactory } from '@/plugin'\n\nimport { PluginLoader } from '../../../driver/extensionTypes'\nimport { decodeDevMeta } from '../../../driver/init/native'\nimport { installDevCode, readPluginText } from '../../../driver/init/storage'\n\nexport default new (class extends PluginLoader {\n public override name = 'dev'\n\n public override async install(file: File): Promise<PluginArchiveDB.Meta> {\n const code = await file.text()\n return await installDevCode(code)\n }\n public override canInstall(file: File): boolean {\n return file.name.endsWith('.js')\n }\n\n public override async load(\n pluginMeta: PluginArchiveDB.Archive,\n ): Promise<PluginConfigFactory | undefined> {\n const code = await readPluginText(pluginMeta.pluginName, 'us.js')\n const lastIndex = code.lastIndexOf(';') + 1\n\n const blob = new Blob([code.slice(0, lastIndex)], { type: 'text/javascript' })\n\n const url = URL.createObjectURL(blob)\n try {\n const mod: { default: any } = await import(/* @vite-ignore */ url)\n return mod.default as PluginConfigFactory | undefined\n } finally {\n URL.revokeObjectURL(url)\n }\n }\n public override async decodeMeta(file: File): Promise<PluginArchiveDB.Meta> {\n const code = await file.text()\n return await decodeDevMeta(code)\n }\n\n public override isMetaFile(file: File): boolean {\n return file.name.endsWith('.js')\n }\n public override async decodeMetaFile(file: File): Promise<PluginArchiveDB.Meta | string> {\n return this.decodeMeta(file)\n }\n})()","import { registerBooter, registerInstaller, registerLoader } from '../../driver/extensions'\n\nimport configSetter from './booters/0_configSetter'\nimport i18n from './booters/5_i18n'\nimport apiTest from './booters/10_apiTest'\nimport resourceTest from './booters/20_resourceTest'\nimport boot from './booters/30_boot'\nimport auth from './booters/40_auth'\nimport otherProgress from './booters/50_otherProcess'\nimport fallbackUrlInstaller from './installers/10_normalUrl'\nimport localInstaller from './installers/20_local'\nimport devInstaller from './installers/30_dev'\nimport githubInstaller from './installers/40_github'\nimport awesomeInstaller from './installers/9999_awesome'\nimport zipLoader from './loaders/1_zip'\nimport devLoader from './loaders/2_dev'\n\nlet registered = false\n\nexport const registerCoreRuntimeExtensions = () => {\n if (registered) return\n registered = true\n\n registerBooter(configSetter, { order: 0 })\n registerBooter(i18n, { order: 5 })\n registerBooter(apiTest, { order: 10 })\n registerBooter(resourceTest, { order: 20 })\n registerBooter(boot, { order: 30 })\n registerBooter(auth, { order: 40 })\n registerBooter(otherProgress, { order: 50 })\n\n registerLoader(zipLoader, { order: 1 })\n registerLoader(devLoader, { order: 2 })\n\n registerInstaller(fallbackUrlInstaller, { order: 10 })\n registerInstaller(localInstaller, { order: 20 })\n registerInstaller(devInstaller, { order: 30 })\n registerInstaller(githubInstaller, { order: 40 })\n registerInstaller(awesomeInstaller, { order: 9999 })\n}"],"mappings":";;;;;;;;;;;;;;;;;AAUA,MAAM,qBAAqB,OAAO,OAAO,sBAAsB;AAE/D,IAAM,gBAAN,cAA4B,aAAa;CACvC,OAAuB,iBAAiB,oCAAoC;CAC5E,MAAsB,KAAK,KAAmB,SAA4C;EACxF,mBAAmB,MAAM,mCAAmC,EAAE,QAAQ,IAAI,KAAK,CAAC;EAChF,QAAQ,iBAAiB,uCAAuC,CAAC;EACjE,MAAM,EAAE,MAAM,QAAQ,SAAS,UAAU,QAAQ,MAAM,WAAW,UAAU;EAC5E,IAAI,SACF,KAAK,MAAM,CACT,IACA,EAAE,YAAY,aAAa,kBAAkB,UAAU,QAAQ,qBAC5D,OAAO,QAAQ,OAAO,GAAG;GAC5B,IAAI,QAAQ,IAAI,QAAQ,YAAY,QAAQ,IAAI,IAAI,MAAM;GAC1D,IAAI,UAAU,IAAI,KAAK,KAAK,UAAU,IAAI,IAAI,QAAQ;GACtD,IAAI,aAAa,IAAI,QAAQ,YAAY,aAAa,IAAI,IAAI,WAAW;GACzE,IAAI,kBAAkB,IAAI,QAAQ,YAAY,kBAAkB,IAAI,IAAI,gBAAgB;GACxF,IAAI,YAAY,IAAI,QAAQ,QAAQ,WAAW,IAAI,IAAI,UAAU;GACjE,IAAI,gBAAgB,IAAI,KAAK,KAAK,eAAe,IAAI,IAAI,cAAc;EACzE;EAEF,IAAI,UAAU;GACZ,IAAI,SAAS,OACX,KAAK,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,SAAS,KAAK,IAAI,CAAC,QAAQ,KAAK,IAAI,GAAG,IAAI;GAC7F,IAAI,SAAS,SACX,KAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,SAAS,OAAO,GACtD,IAAI,SAAS,SAAS,iBAAiB,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE;EACnE;EACA,IAAI,QAAQ;GACV,IAAI,OAAO,YAAY,KAAK,MAAM,KAAK,OAAO,YAAY,OAAO,cAAc,QAAQ,CAAC;GACxF,IAAI,OAAO,QAAQ,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,UAAU,QAAQ,CAAC;GAC5E,IAAI,OAAO,SAAS;IAClB,KAAK,MAAM,OAAO,OAAO,QAAQ,gBAAgB,CAAC,GAAG,OAAO,YAAY,QAAQ,GAAG;IACnF,KAAK,MAAM,MAAM,OAAO,QAAQ,cAAc,CAAC,GAAG,OAAO,cAAc,QAAQ,EAAE;IACjF,KAAK,MAAM,MAAM,OAAO,QAAQ,aAAa,CAAC,GAAG,OAAO,aAAa,QAAQ,EAAE;GACjF;GACA,IAAI,OAAO,SACT,KAAK,MAAM,WAAW,OAAO,WAAW,CAAC,GAAG,OAAO,WAAW,QAAQ,OAAO;GAE/E,IAAI,OAAO,WACT,KAAK,MAAM,YAAY,OAAO,WAAW,OAAO,aAAa,QAAQ,QAAQ;EAEjF;EACA,IAAI,MAAM;GACR,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,IAAI,QAAQ,KAAK,IAAI;GAC5D,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,eAAe,IAAI,QAAQ,KAAK,IAAW;GACxE,IAAI,KAAK,aACP,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,WAAW,GACzD,OAAO,YAAY,IAAI,CAAC,QAAQ,IAAI,GAAG,KAAK;GAChD,IAAI,KAAK,YACP,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,UAAU,GACvD,IAAI,KAAK,KAAK,WAAW,IAAI,CAAC,QAAQ,GAAG,GAAG,KAAY;EAC9D;EACA,IAAI,WACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,GACjD,OAAO,WAAW,IAAI,CAAC,QAAQ,GAAG,GAAG,KAAK;EAE9C,IAAI,IAAI,QACN,KAAK,MAAM,UAAU,IAAI,QAAQ,UAAU,CAAC,CAAC,gBAAgB,MAAM;EAErE,IAAI,OAAO;GACT,KAAK,MAAM,KAAK,MAAM,cAAc,CAAC,GAAG,OAAO,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;GAC3E,KAAK,MAAM,KAAK,MAAM,eAAe,CAAC,GAAG,OAAO,WAAW,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;EACnF;CACF;AACF;AACA,IAAA,0BAAe,IAAI,cAAc;;;ACvEjC,IAAM,mBAAN,cAA+B,aAAa;CAC1C,OAAuB,iBAAiB,qCAAqC;CAE7E,MAAsB,KAAK,KAAkC;EAC3D,IAAI,IAAI,MAAM,WAAW,SAAS,IAAI,MAAM,IAAI,IAAI;CACtD;AACF;AAEA,IAAA,kBAAe,IAAI,iBAAiB;;;ACRpC,MAAM,oBAAoB,OAAO,OAAO,cAAc;AAEtD,MAAa,UAAU,OAAO,QAAkD;CAC9E,MAAM,QAAQ,MAAM,IAAI,MAAM;CAC9B,OAAO,MAAM,KAAK,OAAO,IAAI,IAAI;AACnC;AAEA,MAAa,mBACX,QACG;CACH,MAAM,QAAQ,IAAI;CAClB,OAAO,KAAK,OAAO,IAAI,IAAI;AAC7B;AAEA,MAAM,OAAO,OACX,OACA,SACG;CACH,IAAI,QAAQ,KAAK,GAAG,MAAM,IAAI,MAAM,6BAA6B;CACjE,MAAM,SAAkD,CAAC;CACzD,MAAM,kBAAkB,IAAI,gBAAgB;CAC5C,IAAI;EACF,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,OAAO,UAAU;GAChC,IAAI;IACF,MAAM,QAAQ,KAAK,IAAI;IACvB,MAAM,cAAc,iBAAiB;KACnC,gBAAgB,MAAM;IACxB,GAAG,GAAK;IACR,MAAM,KAAK,OAAO,gBAAgB,MAAM;IACxC,aAAa,WAAW;IAExB,MAAM,OADM,KAAK,IACF,IAAI;IACnB,OAAO,KAAK,CAAC,OAAO,IAAI,CAAC;IACzB,kBAAkB,MAAM,mCAAmC;KAAE;KAAO,WAAW;IAAK,CAAC;IACrF,gBAAgB,MAAM;GACxB,QAAQ;IACN,OAAO,KAAK,CAAC,OAAO,KAAK,CAAC;IAC1B,kBAAkB,MAAM,gCAAgC,EAAE,MAAM,CAAC;GACnE;EACF,CAAC,CACH;CACF,SAAS,KAAK;EACZ,kBAAkB,MAAM,iCAAiC,GAAG;CAC9D;CACA,MAAM,SAAS,OACb,OAAO,QAAO,MAAK,EAAE,MAAM,KAAK,IAChC,MAAK,EAAE,EACT,CAAC,CAAC;CACF,kBAAkB,MAAM,mCAAmC,EAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;CACrF,IAAI,CAAC,QACH,OAAO,CAAC,IAAI,KAAK;CAEnB,OAAO;AACT;;;AClDA,IAAM,iBAAN,cAA6B,aAAa;CACxC,OAAuB,iBAAiB,oCAAoC;CAC5E,MAAsB,KACpB,KACA,SACA,KACc;EACd,IAAI,CAAC,IAAI,KAAK;EACd,QAAQ,iBAAiB,qCAAqC,CAAC;EAE/D,MAAM,aAAa,OAAO,KAAK,IAAI,GAAG;EACtC,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,KAAI,cAAa,QAAQ,IAAI,IAAK,UAAU,CAAC,CAAC;EAC3F,MAAM,gBAAgB,IAAI,MAAiD;EAC3E,MAAM,MAA4B,CAAC;EACnC,WAAW,SAAS,WAAW,MAAM;GACnC,IAAI,aAAa,QAAQ,EAAE,CAAC;GAC5B,cAAc,KAAK,CAAC,WAAW,QAAQ,EAAE,CAAC,EAAE,CAAC;EAC/C,CAAC;EAED,IAAI,MAAM;EAEV,IAAI,OAAO,OAAO,GAAG,CAAC,CAAC,MAAK,MAAK,KAAK,KAAK,GAAG;GAC5C,QAAQ,iBAAiB,wCAAwC,CAAC;GAClE,MAAM,IAAI,MAAM,2BAA2B;EAC7C;EACA,QACE,WAAW,UAAU,uCAAuC,EAC1D,SAAS,cAAc,KAAI,QAAO,GAAG,IAAI,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,EAC1E,CAAC,CACH;CACF;AACF;AACA,IAAA,sBAAe,IAAI,eAAe;;;AChClC,IAAMA,wBAAN,cAAkC,aAAa;CAC7C,OAAuB,iBAAiB,yCAAyC;CACjF,MAAsB,KAAK,KAAmB,SAA4C;EACxF,IAAI,CAAC,IAAI,UAAU,OAAO,QAAQ;EAClC,QAAQ,iBAAiB,qCAAqC,CAAC;EAE/D,MAAM,QAAQ,IAAI,SAAS,MAAM,KAAI,OAAM;GAAE,MAAM,EAAE;GAAM,KAAK;EAAE,EAAE;EACpE,MAAM,UAAU,MAAM,QAAQ,IAAI,MAAM,KAAI,SAAQ,gBAAgB,KAAK,GAAG,CAAC,CAAC;EAC9E,MAAM,gBAAgB,IAAI,MAA4D;EACtF,MAAM,SAAS,MAAM,MAAM;GACzB,IAAI,QAAQ,EAAE,CAAC,IACb,IAAI,SAAS,SAAS,eAAe,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,GAAG,QAAQ,EAAE,CAAC,EAAE;GAC/E,cAAc,KAAK,CAAC,MAAM,QAAQ,EAAE,CAAC,EAAE,CAAC;EAC1C,CAAC;EACD,IAAI,QAAQ,MAAK,MAAK,EAAE,MAAM,KAAK,GAAG;GACpC,QAAQ,iBAAiB,wCAAwC,CAAC;GAClE,MAAM,IAAI,MAAM,yCAAyC;EAC3D;EACA,QACE,WAAW,UAAU,uCAAuC,EAC1D,SAAS,cAAc,KAAI,QAAO,GAAG,IAAI,EAAE,CAAC,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,EAC/E,CAAC,CACH;CACF;AACF;AACA,IAAA,2BAAe,IAAIA,sBAAoB;;;AC5BvC,IAAM,oBAAN,cAAgC,aAAa;CAC3C,OAAuB,iBAAiB,uCAAuC;CAC/E,MAAsB,KAAK,KAAmB,GAAQ,KAAqC;EACzF,IAAI,CAAC,IAAI,UAAU;EACnB,MAAM,SAAS,MAAM,IAAI,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC;EAClD,IAAI,QAAQ,QAAQ,eAAe,IAAI,IAAI,GAAG,MAAM;CACtD;AACF;AACA,IAAA,mBAAe,IAAI,kBAAkB;;;ACArC,MAAM,mBAAmB,OAAO,OAAO,aAAa;AAEpD,MAAM,iBAAiB,IAAI,MAAM;AAEjC,IAAM,cAAN,cAA0B,aAAa;CACrC,OAAuB,iBAAiB,iCAAiC;CACzE,MAAsB,KAAK,KAAmB,SAA4C;EACxF,IAAI,CAAC,IAAI,MAAM;EACf,MAAM,cAAc,eAAe;EACnC,IAAI,gBAAgB;EACpB,IAAI;GACF,MAAM,aAAa,YAAY,aAAa,IAAI,IAAI;GACpD,QAAQ,iBAAiB,oCAAoC,CAAC;GAC9D,MAAM,SAAS,MAAM,IAAI,KAAK,WAAW;GACzC,MAAM,aAAa,QAAQ,cAAkC;GAC7D,iBAAiB,KAAK,uCAAuC;IAC3D,eAAe,QAAQ,MAAM;IAC7B,QAAQ,IAAI;GACd,CAAC;GACD,MAAM,eAAe,QAAQ;GAC7B,gBAAgB;GAChB,QAAQ,iBAAiB,mCAAmC,CAAC;GAC7D,IAAI,CAAC,QAAQ;IACX,QAAQ,iBAAiB,qCAAqC,CAAC;IAC/D,UAAe,CAAC,CAAC,OAAO;KACtB,MAAM;KACN,cAAc,WAAW,UAAU,iCAAiC;KACpE,cAAc,WAAW,UAAU,kCAAkC;KACrE,UAAU;KACV,cAAc;KACd,SAAS,WAAW,UAAU,wCAAwC;KACtE,OAAO;KACP,kBAAkB;MAChB,WAAW,QAAQ,QAAQ;KAC7B;KACA,kBAAkB;MAChB,WAAW,QAAQ,OAAO;KAC5B;IACF,CAAC;GACH,OAAO;IACL,QAAQ,iBAAiB,oCAAoC,CAAC;IAC9D,WAAW,QAAQ,MAAM;GAC3B;GACA,MAAM,SAAS,MAAM,WAAW;GAChC,QAAQ,iBAAiB,0CAA0C,CAAC;GACpE,MAAM,KAAkB;IACtB,MAAM,KAAK,MAAM;KACf,MAAM,eAAe,WAAW,IAAI;KACpC,OAAO,cACL,QACE,sBAAsB;MACpB,MAAM,OAAO,IAAI,IAAI;MACrB,aAAkB,KAAK,WAAY,KAAK,QAAQ,KAAM;MACtD,aACE,EACE,QACA;OAAE,MAAM,KAAK;OAAO,UAAU;OAAU,QAAQ;OAAU,OAAO;MAAW,GAC5E,aAAa,IACf;KACJ,CAAC,CACH,GACA,IAAI,IACN;KAEA,OAAO,MADY,aAAa;IAElC;IACA,MAAM,QACJ,KACA,YACiC;KAEjC,OAAO,IADU,gBAAmB,KAAK,YAAY,EAAE,OAAO,WAAW,CAC/D,CAAC,CAAC,MAAM;IACpB;GACF;GACA,IAAI,UAAU,SACZ,MAAM,IAAI,KAAK,MAAM,EAAE;QAClB,IAAI,UAAU,UACnB,MAAM,IAAI,KAAK,OAAO,EAAE;GAE1B,eAAe,QAAQ;GACvB,gBAAgB;GAChB,QAAQ,iBAAiB,mCAAmC,CAAC;GAC7D,iBAAiB,KAAK,mCAAmC,EAAE,QAAQ,IAAI,KAAK,CAAC;EAC/E,SAAS,OAAY;GACnB,IAAI,eAAe,eAAe,QAAQ;GAC1C,QAAQ,WAAW,UAAU,qCAAqC,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC;GAC3F,iBAAiB,MAAM,gCAAgC,EAAE,QAAQ,IAAI,KAAK,GAAG,KAAK;GAClF,MAAM;EACR;CACF;AACF;AACA,IAAA,mBAAe,IAAI,YAAY;;;AC7F/B,MAAM,cAAc,OAAO,UAAkB,YAAmD;CAC9F,QAAQ;EAAE,MAAM,SAAS;EAAM,aAAa;CAAG,CAAC;CAChD,MAAM,SAAS,MAAK,gBAAe,QAAQ;EAAE,MAAM,SAAS;EAAM;CAAY,CAAC,CAAC;AAClF;AAEA,MAAa,mBAAmB,OAC9B,YACA,EACE,SACA,qBAAoB,UAAS,oBAAoB,MAAM,kCAAkC,KAAK,QAE7F;CACH,IAAI,gBAAiC,CAAC;CAEtC,KAAK,MAAM,YAAY,YAAY;EACjC,IAAI,SAAS,OAAO;GAClB,oBAAoB,MAAM,kCAAkC,EAAE,MAAM,SAAS,KAAK,CAAC;GACnF,cAAc,KAAK,YAAY,UAAU,OAAO,CAAC;GACjD;EACF;EAEA,IAAI,cAAc,SAAS,GAAG;GAC5B,MAAM,QAAQ,IAAI,aAAa;GAC/B,gBAAgB,CAAC;EACnB;EACA,MAAM,YAAY,UAAU,OAAO;EACnC,oBAAoB,MAAM,yBAAyB,EAAE,MAAM,SAAS,KAAK,CAAC;CAC5E;CAEA,IAAI,cAAc,WAAW,GAAG;CAChC,QAAa,WAAW,aAAa,CAAC,CAAC,MAAK,YAAW;EACrD,MAAM,SAAS,QAAQ,SAAQ,WAAW,OAAO,WAAW,aAAa,CAAC,OAAO,MAAM,IAAI,CAAC,CAAE;EAC9F,IAAI,OAAO,SAAS,GAAG,kBAAkB,IAAI,eAAe,QAAQ,YAAY,CAAC;CACnF,CAAC;AACH;AAGA,MAAM,sBAAsB,OAAO,OAAO,4BAA4B;;;AC3CtE,IAAM,sBAAN,cAAkC,aAAa;CAC7C,OAAuB,iBAAiB,kCAAkC;CAC1E,MAAsB,KAAK,KAAmB,SAA4C;EACxF,IAAI,CAAC,IAAI,eAAe,QAAQ;EAEhC,MAAM,iBAAiB,IAAI,eAAe,EAAE,QAAQ,CAAC;CACvD;AACF;AACA,IAAA,2BAAe,IAAI,oBAAoB;ACPvC,MAAa,6BAA6B,MAAS;AAEnD,MAAM,aAAa,WAAW,IAAI;AAClC,MAAM,cAAc,OAAO,OAAO,sBAAsB;;;;;AAWxD,MAAa,yBAAyB,OACpC,KACA,YACkB;CAClB,YAAY,KAAK,oCAAoC;EACnD,UAAU,QAAQ,YAAA;EAClB,SAAS,eAAe,IAAI,UAAU;CACxC,CAAC;CACD,IAAI,eAAe,GAAG;EACpB,MAAM,QAAQ,MAAM,WAAW,kBAAkB,KAAK,EACpD,UAAU,QAAQ,YAAA,UACpB,CAAC;EACD,YAAY,KAAK,sCAAsC,EAAE,OAAO,MAAM,WAAW,CAAC;EAClF,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC;CACzB;CAEA,MAAM,OAAO,MAAM,GAChB,IAAI,KAAK;EAAE,OAAO,QAAQ;EAAO,SAAS;CAA2B,CAAC,CAAC,CACvE,KAAK;CACR,YAAY,KAAK,sCAAsC,EAAE,OAAO,KAAK,KAAK,CAAC;CAC3E,OAAO;AACT;;;ACnCA,MAAM,eAAe,UAA0B;CAC7C,MAAM,MAAM,IAAI,IAAI,KAAK;CACzB,MAAM,UAAU,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI;CACtE,IAAI,UAAU;CACd,IAAI;EACF,UAAU,mBAAmB,OAAO;CACtC,QAAQ,CAER;CAOA,OANiC,CAAC,GAAG,OAAO,CAAC,CAC1C,KAAI,cAAa;EAChB,MAAM,OAAO,UAAU,WAAW,CAAC;EACnC,OAAO,OAAO,MAAM,SAAS,MAAM,MAAM;CAC3C,CAAC,CAAC,CACD,KAAK,EACsB,CAAC,CAAC,QAAQ,iBAAiB,GAAG,CAAC,CAAC,KAAK,KAAK;AAC1E;AAEA,IAAa,8BAAb,cAAiD,gBAAgB;CAC/D,cAA0D;EACxD,OAAO,iBAAiB,kCAAkC;EAC1D,aAAa,iBAAiB,wCAAwC;CACxE;CACA,OAAuB;CACvB,MAAc,UAAU,OAA8B;EACpD,MAAM,OAAO,MAAM,uBAAuB,OAAO,EAAE,OAAO,EAAE,CAAC;EAC7D,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY,KAAK,CAAC;CAC5C;CAEA,MAAsB,SAAS,OAA8B;EAE3D,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,MAAsB,OAAO,YAAoD;EAE/E,OAAO,MADY,KAAK,UAAU,WAAW,YAAY;CAE3D;CACA,MAAsB,oBAAoB,OAAuC;EAE/E,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CAEA,UAA0B,OAAwB;EAChD,OAAO,IAAI,SAAS,KAAK;CAC3B;AACF;AAEA,IAAA,wBAAe,IAAI,4BAA4B;;;AC/C/C,IAAa,wBAAb,cAA2C,gBAAgB;CACzD,cAA0D;EACxD,OAAO,iBAAiB,oCAAoC;EAC5D,aAAa,iBAAiB,0CAA0C;CAC1E;CACA,OAAuB;CACvB,MAAc,UAAU,OAA8B;EAEpD,OAAO,MAAM,cADA,mBAAmB,MAAM,QAAQ,WAAW,EAAE,CAC7B,CAAC;CACjC;CACA,MAAsB,SAAS,OAA8B;EAE3D,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,MAAsB,OAAO,YAAoD;EAE/E,OAAO,MADY,KAAK,UAAU,WAAW,YAAY;CAE3D;CACA,MAAsB,oBAAoB,OAAuC;EAE/E,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,UAA0B,OAAwB;EAChD,OAAO,eAAe,KAAK,MAAM,WAAW,QAAQ;CACtD;AACF;AAEA,IAAA,oBAAe,IAAI,sBAAsB;;;AC3BzC,IAAa,sBAAb,cAAyC,gBAAgB;CACvD,cAA0D;EACxD,OAAO,iBAAiB,0CAA0C;EAClE,aAAa,iBAAiB,gDAAgD;CAChF;CACA,OAAuB;CACvB,MAAc,UAAU,OAA8B;EAMpD,MAAM,YAAY,MAAM,iBAAiB,OAAO,MAL9B,GACf,IACC,UAAU,QAAQ,KAAK,KAAK,IAAI,QAAQ,QAAQ,QAAQ,4DAA4D,MAAM,QAC5H,CAAC,CACA,KAAK,CAC2C;EACnD,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,OAAO;CACtC;CACA,MAAsB,SAAS,OAA8B;EAE3D,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,MAAsB,OAAO,YAAoD;EAE/E,OAAO,MADY,KAAK,UAAU,WAAW,YAAY;CAE3D;CACA,MAAsB,oBAAoB,OAAuC;EAE/E,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,UAA0B,OAAwB;EAChD,OAAO,qCAAqC,KAAK,KAAK;CACxD;AACF;AAEA,IAAA,kBAAe,IAAI,oBAAoB;;;AEVvC,MAAa,qCAAkE;CAC7E,aAAaC;CACb,eAAe,OAAM,QAAO,MAAM,uBAAuB,KAAK,EAAE,OAAO,EAAE,CAAC;CAC1E,iBAAiB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK;CAC7C,OAAO,iBAAiB,OAAO,MAAM,OAAO;EAC1C,MAAM,UAAU,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAC;EAC3C,MAAM,QAAQ,QAAQ,SAAS,SAAS,QAAQ,KAAK,MAAM,cAAc;GACvE;GACA,UAAU;GACV;EACF,CAAC;EACD,WAAW,MAAM,QAAQ,OAAO,MAAM,KAAK;CAC7C;AACF;AAEA,MAAM,mBAAmB,UAAkB;CACzC,MAAM,CAAC,OAAO,MAAM,GAAG,QAAQ,MAAM,QAAQ,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG;CAClE,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,GACnC,MAAM,IAAI,MAAM,WAAW,UAAU,uCAAuC,EAAE,MAAM,CAAC,CAAC;CAExF,OAAO;EAAE;EAAO;CAAK;AACvB;AAEA,MAAM,iBAAiB,OAAO,SAA0D;CACtF,IAAI;EACF,OAAO,oBAAoB,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC,CAAC;CAC1D,QAAQ;EACN;CACF;AACF;AAOA,IAAa,4BAAb,cAA+C,gBAAgB;CAOzB;CANpC,cAA0D;EACxD,OAAO,iBAAiB,qCAAqC;EAC7D,aAAa,iBAAiB,2CAA2C;CAC3E;CACA,OAAuB;CAEvB,YAAmB,eAAgC,oCAAoC;EACrF,MAAM;EAD4B,KAAA,eAAA;CAEpC;CAEA,MAAc,sBAAsB,OAA2C;EAC7E,MAAM,EAAE,aAAa,4BAA4B,KAAK,aAAa,UAAU;EAC7E,MAAM,EAAE,OAAO,SAAS,gBAAgB,KAAK;EAC7C,MAAM,QAAQ,KAAK,aAAa,iBAAiB,OAAO,MAAM,eAAe,KAAA,CAAS;EAEtF,WAAW,MAAM,YAAY,OAC3B,KAAK,MAAM,WAAW,UAAU;GAC9B,IAAI,QAAQ,SAAU,CAAC,2BAA2B,QAAQ,YAAa;GAEvE,MAAM,gBAAgB,QAAQ,OAAO,MAAK,UAAS,MAAM,SAAS,eAAe;GACjF,MAAM,SAAS,QAAQ,OAAO,MAAK,UAAS,MAAM,SAAS,YAAY;GACvE,IAAI,CAAC,iBAAiB,CAAC,QAAQ;GAE/B,MAAM,WAAW,MAAM,KAAK,aAAa,cAAc,cAAc,oBAAoB;GACzF,MAAM,OAAO,MAAM,eAAe,QAAQ;GAC1C,IAAI,CAAC,QAAQ,CAAC,2BAA2B,MAAM,KAAK,aAAa,WAAW,GAC1E;GAEF,OAAO;IAAE;IAAU;GAAO;EAC5B;EAGF,MAAM,IAAI,MACR,WAAW,UAAU,6CAA6C,EAChE,SAAS,KAAK,aAAa,YAC7B,CAAC,CACH;CACF;CAEA,MAAc,UAAU,OAA8B;EACpD,MAAM,EAAE,WAAW,MAAM,KAAK,sBAAsB,KAAK;EACzD,MAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO,oBAAoB;EAC9E,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,OAAO,IAAI;CACrC;CAEA,MAAsB,SAAS,OAA8B;EAC3D,OAAO,MAAM,KAAK,UAAU,KAAK;CACnC;CAEA,MAAsB,OAAO,YAAoD;EAC/E,OAAO,MAAM,KAAK,UAAU,WAAW,YAAY;CACrD;CAEA,MAAsB,oBAAoB,OAA8B;EACtE,MAAM,EAAE,aAAa,MAAM,KAAK,sBAAsB,KAAK;EAC3D,OAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,eAAe;CAC7C;CAEA,UAA0B,OAAwB;EAChD,OAAO,MAAM,WAAW,KAAK,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW;CAChE;AACF;AAEA,IAAA,qBAAe,IAAI,0BAA0B;;;AClH7C,IAAa,0BAAb,cAA6C,gBAAgB;CAOxC;CANnB,cAA0D;EACxD,OAAO,iBAAiB,0CAA0C;EAClE,aAAa,iBAAiB,gDAAgD;CAChF;CACA,OAAuB;CACvB,YACE,WAAsD,IAAI,sBAAsB,GAChF;EACA,MAAM;EAFW,KAAA,WAAA;CAGnB;CAEA,MAAc,QAAQ,OAAe;EACnC,MAAM,QAAQ,wCAAwC,KAAK,KAAK;EAChE,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,WAAW,UAAU,8CAA8C,EAAE,MAAM,CAAC,CAAC;EAE/F,OAAO,MAAM,KAAK,SAAS,YAAY,MAAM,EAAE;CACjD;CAEA,MAAc,UAAU,OAAuC;EAE7D,OAAO,mCAAkC,MADnB,KAAK,QAAQ,KAAK,EAAA,CACS,QAAQ;CAC3D;CACA,MAAsB,SAAS,OAAuC;EAEpE,OAAO,MADY,KAAK,UAAU,KAAK;CAEzC;CACA,MAAsB,OAAO,YAA6D;EAExF,OAAO,MADY,KAAK,UAAU,WAAW,YAAY;CAE3D;CACA,MAAsB,oBAAoB,OAAuC;EAC/E,MAAM,UAAU,MAAM,KAAK,QAAQ,KAAK;EACxC,MAAM,WAAW,MAAM,KAAK,SAAS,aAAa,OAAO;EACzD,IAAI,CAAC,UAAU,OAAO,kCAAkC,QAAQ,QAAQ;EACxE,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAG,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;CAC3F;CACA,UAA0B,OAAwB;EAChD,OAAO,sCAAsC,KAAK,KAAK;CACzD;AACF;AAEA,IAAA,wBAAe,IAAI,wBAAwB;;;ACzC3C,MAAM,kBAAkB,OAAO,OAAO,mBAAmB;AAEzD,MAAa,sBAAsB,OACjC,SACA,KACA,mBACG;CACH,MAAM,UAAU;CAChB,IAAI,SAAS;CACb,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,IAAI,SAAS,OAAO,GAAG;EACzC,MAAM,QAAQ,MAAM;EACpB,MAAM,UAAU,MAAM,MAAM,MAAM,MAAM,GAAA,CAAI,KAAK;EACjD,IAAI,CAAC,UAAU,mCAAmC,KAAK,MAAM,GAAG;EAChE,MAAM,WAAW,IAAI,IAAI,QAAQ,wBAAwB,SAAS;EAClE,MAAM,WAAW,MAAM,eAAe,SAAS,SAAS,MAAM,CAAC,CAAC;EAChE,UAAU,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,WAAW,SAAS,SAAS,SAAS,KAAK;EACxF,SAAS,QAAQ,MAAM,EAAE,CAAC;CAC5B;CACA,OAAO,SAAS,IAAI,MAAM,MAAM;AAClC;AAEA,IAAA,iBAAe,IAAK,cAAc,aAAa;CAC7C,OAAuB;CACvB,MAAsB,QACpB,MACA,SAC+B;EAC/B,gBAAgB,KAAK,mCAAmC,EAAE,OAAO,KAAK,KAAK,CAAC;EAC5E,OAAO,MAAM,eAAe,OAAM,aAAY;GAC5C,MAAM,UAAU,SAAS,QAAQ,IAAK,SAAS,UAAU,SAAS,QAAS,KAAK;GAChF,SAAS,OAAO;IACd,aAAa,SAAS,OAClB,WAAW,UAAU,kCAAkC,EAAE,MAAM,SAAS,KAAK,CAAC,IAC9E,WAAW,UAAU,4BAA4B;IACrD,UAAU;GACZ,CAAC;EACH,CAAC;CACH;CACA,WAA2B,MAAqB;EAC9C,OAAO,KAAK,KAAK,SAAS,MAAM;CAClC;CAEA,MAAsB,KACpB,YAC0C;EAC1C,gBAAgB,MAAM,kCAAkC,EAAE,QAAQ,WAAW,WAAW,CAAC;EACzF,IAAI,CAAC,WAAW,KAAK,OAAO,MAAM,IAAI,MAAM,iBAAiB;EAC7D,MAAM,QAAQ,MAAM,gBAAgB,WAAW,UAAU;EACzD,MAAM,kBAAkB,MAAM,QAAO,SAAQ,iBAAiB,KAAK,IAAI,CAAC;EACxE,IAAI,CAAC,eAAe,KAAK,gBAAgB,SAAS,GAChD,MAAM,IAAI,MACR,WAAW,UAAU,uCAAuC,EAC1D,OAAO,gBAAgB,KAAK,IAAI,EAClC,CAAC,CACH;EAEF,MAAM,MAAM,MAAM,sBAAsB,WAAW,YAAY,WAAW,KAAK,MAAM,MAAM;EAI3F,MAAM,UAAS,MAHM;;GAA0B;CAAI,CAAC,cAAc;GAChE,IAAI,IAAI,WAAW,OAAO,GAAG,IAAI,gBAAgB,GAAG;EACtD,CAAC,EAAA,CACqB;EAEtB,IAAI,CAAC,WAAW,KAAK,OAAO,SAAS,OAAO;EAC5C,MAAM,UAAU,WAAW,KAAK,MAAM;EAEtC,IAAI,WAAW,QAAQ;GACrB,MAAM,aAAa,MAAM,MAAK,SAAQ,KAAK,SAAS,MAAM,CAAC;GAC3D,IAAI,CAAC,YAAY,OAAO;GACxB,IAAI,WAAW;EACjB,OAAO,IAAI,WAAW;EAEtB,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,QAAQ,SAAS,WAAW;EAClC,MAAM,cAAc,MAAM,oBACxB,UACA,MAAM,eAAe,WAAW,YAAY,QAAQ,IACpD,SAAQ,qBAAqB,WAAW,YAAY,IAAI,CAC1D;EACA,SAAS,KAAK,YAAY,KAAK;EAC/B,gBAAgB,MAAM,kCAAkC,EAAE,QAAQ,WAAW,WAAW,CAAC;EAEzF,OAAO;CACT;CACA,MAAsB,WAAW,MAA2C;EAE1E,MAAM,YAAW,MADC,MAAM,UAAU,IAAI,EAAA,CACjB,KAAK,eAAe;EACzC,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,+CAA+C;EAC9E,OAAO,KAAK,MAAM,MAAM,SAAS,MAAM,MAAM,CAAC;CAChD;CAEA,WAA2B,MAAqB;EAC9C,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,QAAQ;CACpD;CACA,MAAsB,eAAe,MAAoD;EACvF,IAAI,KAAK,QAAQ,iBAAiB,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;EAGrE,MAAM,QAAQ,OAAM,MADF,IADA,MACI,CAAC,CAAC,UAAU,IAAI,EAAA,CACd,QAAO,MAAK,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM;EACzE,OAAO,KAAK,MAAM,KAAK;CACzB;AACF,EAAG;;;AC9GH,IAAA,iBAAe,IAAK,cAAc,aAAa;CAC7C,OAAuB;CAEvB,MAAsB,QAAQ,MAA2C;EAEvE,OAAO,MAAM,eAAe,MADT,KAAK,KAAK,CACG;CAClC;CACA,WAA2B,MAAqB;EAC9C,OAAO,KAAK,KAAK,SAAS,KAAK;CACjC;CAEA,MAAsB,KACpB,YAC0C;EAC1C,MAAM,OAAO,MAAM,eAAe,WAAW,YAAY,OAAO;EAChE,MAAM,YAAY,KAAK,YAAY,GAAG,IAAI;EAE1C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,kBAAkB,CAAC;EAE7E,MAAM,MAAM,IAAI,gBAAgB,IAAI;EACpC,IAAI;GAEF,QAAO,MAD6B;;IAA0B;GACnD;EACb,UAAU;GACR,IAAI,gBAAgB,GAAG;EACzB;CACF;CACA,MAAsB,WAAW,MAA2C;EAE1E,OAAO,MAAM,cAAc,MADR,KAAK,KAAK,CACE;CACjC;CAEA,WAA2B,MAAqB;EAC9C,OAAO,KAAK,KAAK,SAAS,KAAK;CACjC;CACA,MAAsB,eAAe,MAAoD;EACvF,OAAO,KAAK,WAAW,IAAI;CAC7B;AACF,EAAG;;;AC7BH,IAAI,aAAa;AAEjB,MAAa,sCAAsC;CACjD,IAAI,YAAY;CAChB,aAAa;CAEb,eAAeC,yBAAc,EAAE,OAAO,EAAE,CAAC;CACzC,eAAeC,iBAAM,EAAE,OAAO,EAAE,CAAC;CACjC,eAAeC,qBAAS,EAAE,OAAO,GAAG,CAAC;CACrC,eAAeC,0BAAc,EAAE,OAAO,GAAG,CAAC;CAC1C,eAAeC,kBAAM,EAAE,OAAO,GAAG,CAAC;CAClC,eAAeC,kBAAM,EAAE,OAAO,GAAG,CAAC;CAClC,eAAeC,0BAAe,EAAE,OAAO,GAAG,CAAC;CAE3C,eAAeC,gBAAW,EAAE,OAAO,EAAE,CAAC;CACtC,eAAeC,gBAAW,EAAE,OAAO,EAAE,CAAC;CAEtC,kBAAkBC,uBAAsB,EAAE,OAAO,GAAG,CAAC;CACrD,kBAAkBC,mBAAgB,EAAE,OAAO,GAAG,CAAC;CAC/C,kBAAkBC,iBAAc,EAAE,OAAO,GAAG,CAAC;CAC7C,kBAAkBC,oBAAiB,EAAE,OAAO,GAAG,CAAC;CAChD,kBAAkBC,uBAAkB,EAAE,OAAO,KAAK,CAAC;AACrD"}
|