@delta-comic/plugin 3.0.0-next.7 → 3.0.0-next.8

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.
@@ -426,6 +426,9 @@ const formatPluginLoadPlanError = (plan, translate = (key, params) => pluginI18n
426
426
  return sections.join("\n\n");
427
427
  };
428
428
  //#endregion
429
+ //#region package.json
430
+ var version = "3.0.0-next.8";
431
+ //#endregion
429
432
  //#region lib/features/core/feature.ts
430
433
  var feature_default = defineInnerPlugin({
431
434
  meta: {
@@ -438,8 +441,8 @@ var feature_default = defineInnerPlugin({
438
441
  id: "core"
439
442
  },
440
443
  version: {
441
- plugin: "2.3.0",
442
- supportCore: "*"
444
+ plugin: version,
445
+ supportCore: version
443
446
  }
444
447
  },
445
448
  enabledByDefault: true,
@@ -985,7 +988,7 @@ var PluginRuntime = class {
985
988
  });
986
989
  }
987
990
  ensureBuiltInPlugins() {
988
- return this.builtInSynchronization ??= import("./runtime-Dk50hXwU.mjs").then(async ({ registerCoreRuntimeExtensions }) => {
991
+ return this.builtInSynchronization ??= import("./runtime-rn2XMGzk.mjs").then(async ({ registerCoreRuntimeExtensions }) => {
989
992
  registerCoreRuntimeExtensions();
990
993
  await synchronizeBuiltInPlugins();
991
994
  });
@@ -1438,6 +1441,6 @@ Global.shareToken.set(["core", "token"], {
1438
1441
  }
1439
1442
  });
1440
1443
  //#endregion
1441
- 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 };
1444
+ export { PluginI18nRegistry as A, provide as B, version as C, PluginStore as D, planPluginLoadOrder as E, createDependencyRegistry as F, defineInnerPlugin as G, ConfigStore as H, declareDepType as I, definePlugin as K, defaultDependencyRegistry as L, pluginMessageKey as M, translatePluginText as N, pluginStore as O, DependencyRegistry as P, exposeSymbol as R, synchronizeBuiltInPlugins as S, formatPluginLoadPlanError as T, useConfig$1 as U, require as V, ConfigPointer 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, pluginI18n as j, usePluginStore 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, findCyclePaths as w, isBuiltInPluginName as x, builtInDefinitionToArchive as y, pluginExposes as z };
1442
1445
 
1443
- //# sourceMappingURL=global-BSAsAv3E.mjs.map
1446
+ //# sourceMappingURL=global-1Kghyz5c.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-1Kghyz5c.mjs","names":["useDbConfig","useConfig","pkg.version","__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","../package.json","../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 type UnwrapConfigPointer<T extends ConfigPointer> = T['_type']\n\nexport class ConfigPointer<T extends ConfigDescription = ConfigDescription> {\n public readonly key: symbol\n public readonly _type = {} as T\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 { ConfigPointer, UnwrapConfigPointer } from './configPointer'\nimport { coreConfig } from './features/core/config'\n\nexport * from './configPointer'\n\nexport type ConfigSave<T extends ConfigPointer = ConfigPointer> = {\n form: UnwrapConfigPointer<T>\n data: Ref<FormResult<T['config']>>\n name: string\n ready: Promise<void>\n}\n\nexport class ConfigStore {\n public readonly form = shallowReactive(new Map<symbol, ConfigSave>())\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<T> {\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<T extends ConfigPointer>(pointer: T) {\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<T> = {\n form: pointer.config,\n data: store as any,\n name: pointer.configName,\n ready: store.ready,\n }\n this.form.set(pointer.key, saved)\n return saved\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 pkg from '../../../package.json'\nimport { 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: pkg.version, supportCore: pkg.version },\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":"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"}
@@ -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-BSAsAv3E.mjs";
1
+ import { A as PluginI18nRegistry, B as provide, D as PluginStore, E as planPluginLoadOrder, F as createDependencyRegistry, G as defineInnerPlugin, H as ConfigStore, I as declareDepType, K as definePlugin, L as defaultDependencyRegistry, M as pluginMessageKey, N as translatePluginText, O as pluginStore, P as DependencyRegistry, R as exposeSymbol, S as synchronizeBuiltInPlugins, T as formatPluginLoadPlanError, U as useConfig, V as require, W as ConfigPointer, _ 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 pluginI18n, k as usePluginStore, 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 findCyclePaths, x as isBuiltInPluginName, y as builtInDefinitionToArchive, z as pluginExposes } from "../global-1Kghyz5c.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,4 +1,4 @@
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-BSAsAv3E.mjs";
1
+ import { B as provide, C as version, I as declareDepType, M as pluginMessageKey, U as useConfig, a as PluginLoader, g as registerLoader, h as registerInstaller, i as PluginInstaller, j as pluginI18n, k as usePluginStore, m as registerBooter, r as PluginBooter, t as Global } from "./global-1Kghyz5c.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";
@@ -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.7",
415
+ coreVersion: version,
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-Dk50hXwU.mjs.map
663
+ //# sourceMappingURL=runtime-rn2XMGzk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-rn2XMGzk.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","../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.7",
3
+ "version": "3.0.0-next.8",
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/logger": "3.0.0-next.7",
47
- "@delta-comic/downloader": "3.0.0-next.7"
46
+ "@delta-comic/downloader": "3.0.0-next.8",
47
+ "@delta-comic/logger": "3.0.0-next.8"
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/db": "3.0.0-next.7",
58
- "@delta-comic/model": "3.0.0-next.7",
59
- "@delta-comic/ui": "3.0.0-next.7",
60
- "@delta-comic/utils": "3.0.0-next.7"
57
+ "@delta-comic/model": "3.0.0-next.8",
58
+ "@delta-comic/ui": "3.0.0-next.8",
59
+ "@delta-comic/utils": "3.0.0-next.8",
60
+ "@delta-comic/db": "3.0.0-next.8"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "vp pack",
@@ -1 +0,0 @@
1
- {"version":3,"file":"global-BSAsAv3E.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 type UnwrapConfigPointer<T extends ConfigPointer> = T['_type']\n\nexport class ConfigPointer<T extends ConfigDescription = ConfigDescription> {\n public readonly key: symbol\n public readonly _type = {} as T\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 { ConfigPointer, UnwrapConfigPointer } from './configPointer'\nimport { coreConfig } from './features/core/config'\n\nexport * from './configPointer'\n\nexport type ConfigSave<T extends ConfigPointer = ConfigPointer> = {\n form: UnwrapConfigPointer<T>\n data: Ref<FormResult<T['config']>>\n name: string\n ready: Promise<void>\n}\n\nexport class ConfigStore {\n public readonly form = shallowReactive(new Map<symbol, ConfigSave>())\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<T> {\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<T extends ConfigPointer>(pointer: T) {\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<T> = {\n form: pointer.config,\n data: store as any,\n name: pointer.configName,\n ready: store.ready,\n }\n this.form.set(pointer.key, saved)\n return saved\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;;;AC/FF,IAAa,gBAAb,MAA4E;CAKjE;CACA;CACA;CANT;CACA,QAAwB,CAAC;CAEzB,YACE,YACA,QACA,YACA;EAHO,KAAA,aAAA;EACA,KAAA,SAAA;EACA,KAAA,aAAA;EAEP,KAAK,MAAM,OAAO,IAAI,UAAU,YAAY;CAC9C;AACF;;;AClBA,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,IAAwB,CAAC;CACpE,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,SAA2B;EAC/D,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,gBAAgD,SAAY;EAC1D,MAAM,aAAa,KAAK,KAAK,IAAI,QAAQ,GAAG;EAC5C,IAAI,YAAY,OAAO;EAEvB,MAAM,QAAQA,UAAY,QAAQ,YAAY,QAAQ,MAAM;EAC5D,MAAM,QAAuB;GAC3B,MAAM,QAAQ;GACd,MAAM;GACN,MAAM,QAAQ;GACd,OAAO,MAAM;EACf;EACA,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;EAChC,OAAO;CACT;CAEA,kBAAyB,SAAwB;EAC/C,KAAK,KAAK,OAAO,QAAQ,GAAG;CAC9B;AACF;AAEA,IAAI;AACJ,MAAaC,oBAAmB,gBAAgB,IAAI,YAAY;;;AC5EhE,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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-Dk50hXwU.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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"}