@yongdall/web 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Signal","parse","stringify","parse","toTime","toDate","parse","parse","parseDate","list","defaultGenerators","#config","#hooks","#stringTag","#keys","Pattern.generate","DotRequest","pathRoots","pages","root","enumerations","load","request","exec","Search.exec","ArrayStore","Search.parse","Search.fill","createState","Search.exec","modelService","ArrayStore","ObjectStore","renderStore","renderStoreForm","Store","#waitDestroy","#signal","#destroyed","#container","#root","List","#table","#thead","#createUrl","#renderList","#labelPattern","#fieldsShow","#idFields","#tr","#tbody","#documents","FormList","#pagination","#container","#buttons","#destroyMenu","#menu","#root","#dialog","#ac","#main","#headerAbortController","#header","#footAbortController","#footer","encode","pages","Search.parse","pages","pages","pages","currentPage","rootContainer","loadingContainer","triggerLoading","stringify","parse","parse","Ident.decode","Ident.parse","Ident.stringify","Ident.encode","Code128.encode","#print","#root","#path","#search","#hash","#pageId","#abortController","#define","#ident","#pageHandler","#open","#setRootPath","#onToggle","#onHide","#bootLoading","#href","#title","#icon","#printDeeply","#unsaved","#loading","routerParser.stringify","#rootPath","#destroyDelayed","#root","#container","#root","#container","#destroyMenu","#menu","#root","#container","#inserted","#placeholder","#parent","#root","#header","#body","#container","#inserted","#updateParentUnprintable","#parent","#title","#menuAbortController","#placeholder","#buttons","#signal","#root","#main","#body","#destroyed","#container","#mode","#abortController","#headerAbortController","#header","#headerRoot","#footAbortController","#footer","#footerRoot","#sides","root","#state","#abortController","#pageUI","#container","#destroyDelayed","routerParser.stringify","request","pathRoots","currentPage"],"sources":["../../packages/web/signal.mjs","../../packages/common/Search/util.mjs","../../packages/common/Search/exec.mjs","../../packages/common/Search/fill.mjs","../../packages/common/Search/parse.mjs","../../packages/common/Search/merge.mjs","../../packages/common/Search/stringify.mjs","../../packages/common/Search/toWhere.mjs","../../packages/common/Search/index.mjs","../../packages/common/Datetime.mjs","../../packages/common/Pattern/parse.mjs","../../packages/common/Pattern/toGenerate.mjs","../../packages/common/Pattern/generators.mjs","../../packages/common/Pattern/generate.mjs","../../packages/common/Pattern/index.mjs","../../packages/common/transformError.mjs","../../packages/common/Hook.mjs","../../packages/common/model.mjs","../../packages/common/yieldPermissionConstraintFields.mjs","../../packages/common/index.mjs","../../packages/web/allHooks.mjs","../../packages/web/form/field.mjs","../../packages/web/paths.mjs","../../packages/web/utils/date.mjs","../../packages/web/request.mjs","../../packages/web/configuration.mjs","../../packages/web/utils/state.mjs","../../packages/web/user.mjs","../../packages/web/permission.mjs","../../packages/web/form/toSchema.mjs","../../packages/web/importmap.mjs","../../packages/web/import.mjs","../../packages/web/ResponseError.mjs","../../packages/web/services/createPromisesAndStates.mjs","../../packages/web/services/toPromiseInterface.mjs","../../packages/web/services/model.mjs","../../packages/web/services/enumeration.mjs","../../packages/web/services/formLayout.mjs","../../packages/web/services/permissions.mjs","../../packages/web/services/menu.mjs","../../packages/web/DataSource/modelFilter.mjs","../../packages/web/DataSource/createExec.mjs","../../packages/web/DataSource/filterList.mjs","../../packages/web/DataSource/build.mjs","../../packages/web/enumerations.mjs","../../packages/web/DataSource/loadValues.mjs","../../packages/web/DataSource/loadArray.mjs","../../packages/web/DataSource/flat.mjs","../../packages/web/DataSource/index.mjs","../../packages/web/form/createStoreField.mjs","../../packages/web/form/renderStoreForm.mjs","../../packages/web/constants.mjs","../../packages/web/form/renderForm.mjs","../../packages/web/form/createStore.mjs","../../packages/web/form/createShowField.mjs","../../packages/web/form/createQuickFilters.mjs","../../packages/web/form/createFilter.mjs","../../packages/web/form/createFieldFilter.mjs","../../packages/web/form/createFilters.mjs","../../packages/web/dom/root.mjs","../../packages/web/dom/setIcon.mjs","../../packages/web/dom/createDialog.mjs","../../packages/web/GeneralContext.mjs","../../packages/web/dom/ModalFooter.mjs","../../packages/web/form/List.mjs","../../packages/web/components.mjs","../../packages/web/Menu.mjs","../../packages/web/dom/ModalHeader.mjs","../../packages/web/dom/Modal.mjs","../../packages/web/dom/createModal.mjs","../../packages/web/dom/index.mjs","../../packages/web/form/showFilterDialog.mjs","../../packages/web/utils/toUrl.mjs","../../packages/web/utils/isPluginId.mjs","../../packages/web/utils/waitAbortSignal.mjs","../../packages/web/utils/code128.mjs","../../packages/web/script/index.mjs","../../packages/web/services/page.mjs","../../packages/web/route/pages.mjs","../../packages/web/route/load.mjs","../../packages/web/route/pageManager.mjs","../../packages/web/route/renderHome.mjs","../../packages/web/route/loadingContainer.mjs","../../packages/web/route/home.mjs","../../packages/web/Ident.mjs","../../packages/web/route/route.mjs","../../packages/web/print.mjs","../../packages/web/route/PageHandle.mjs","../../packages/web/route/renderError.mjs","../../packages/web/route/PageFooter.mjs","../../packages/web/route/PageHeader.mjs","../../packages/web/route/PageSection.mjs","../../packages/web/route/PageSider.mjs","../../packages/web/route/Page.mjs","../../packages/web/route/createPage.mjs","../../packages/web/route/PageContext.mjs","../../packages/web/route/createPageFrame.mjs","../../packages/web/route/showPage.mjs","../../packages/web/route/setHistoryUrl.mjs","../../packages/web/route/parse.mjs","../../packages/web/route/setUrl.mjs","../../packages/web/route/index.mjs","../../packages/web/model/createModelDefault.mjs","../../packages/web/model/createDocumentInModal.mjs","../../packages/web/model/showDocumentInModal.mjs","../../packages/web/model/index.mjs","../../packages/web/Command.mjs","../../packages/web/icons/index.mjs","../../packages/web/file.mjs","../../packages/web/buildPlugin.mjs","../../packages/web/start.mjs"],"sourcesContent":["import { Signal } from 'signal-polyfill';\n\n/**\n * @template T\n * @typedef {object} State\n * @property {() => T} get\n * @property {(newValue: T) => void} set\n */\n\n/**\n * 相应式执行\n * @param {() => void} fn 执行函数\n * @param {AbortSignal} [signal]\n * @returns {void}\n */\nexport function effect(fn, signal) {\n\tlet needsEnqueue = true;\n\tif (signal?.aborted) { return; }\n\tconst w = new Signal.subtle.Watcher(() => {\n\t\tif (!needsEnqueue) { return; }\n\t\tneedsEnqueue = false;\n\t\tqueueMicrotask(() => {\n\t\t\tneedsEnqueue = true;\n\t\t\tfor (const s of w.getPending()) {\n\t\t\t\ts.get();\n\t\t\t}\n\t\t\tw.watch();\n\t\t});\n\t});\n\tconst computed = new Signal.Computed(fn);\n\n\tw.watch(computed);\n\tcomputed.get();\n\tsignal?.addEventListener('abort', () => {\n\t\tw.unwatch(computed);\n\t}, { once: true });\n\n}\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {(() => T)[]} getter 取值方法\n * @param {(value: T[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {(() => any)[]} getter 取值方法\n * @param {(value: any[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {() => T} getter 取值方法\n * @param {(value: T) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n/**\n * 创建可赋值计算值\n * @template T\n * @param {(() => T) | (() => T)[]} getter 取值方法\n * @param {(value: T | T[], oldValue?: T | T[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\nexport function watch(getter, callback, { immediate, signal } = {}) {\n\tconst isArray = Array.isArray(getter);\n\tconst getters = isArray ? getter : [getter];\n\t/** @type {T[]?} */\n\tlet value = null;\n\teffect(() => {\n\t\tconst val = getters.map(v => v());\n\t\tconst oldValue = value;\n\t\tvalue = val;\n\t\tif (oldValue) {\n\t\t\tif (oldValue.findIndex((v, i) => !Object.is(v, val[i])) < 0) { return; }\n\t\t\tcallback(isArray ? [...val] : val[0], isArray ? [...oldValue] : oldValue[0]);\n\t\t} else {\n\t\t\tif (!immediate) { return; }\n\t\t\tcallback(isArray ? [...val] : val[0]);\n\t\t}\n\t}, signal);\n}\n\n/**\n * @template T\n * @overload\n * @param {T} initValue\n * @returns {State<T>}\n */\n/**\n * @template T\n * @overload\n * @param {T} [initValue]\n * @returns {State<T | undefined>}\n */\n/**\n * @template T\n * @param {T} [initValue]\n * @returns {State<T | undefined>}\n */\nexport function createState(initValue) {\n\treturn new Signal.State(initValue);\n}\n\n/**\n * \n * @template T\n * @param {() => T} get\n * @param {(newValue: T) => void} [set]\n * @returns {State<T>}\n */\nexport function createComputed(get, set) {\n\tconst s = new Signal.Computed(get);\n\tif (typeof set === 'function') {\n\t\treturn { get() { return s.get(); }, set };\n\t}\n\treturn { get() { return s.get(); }, set: () => { } };\n\n}\n/**\n * @template {Record<string, any>} T\n * @param {State<T>} state\n * @param {Record<string, any>} struct\n * @returns {T}\n */\nexport function createDeeply(state, struct) {\n\t/** @type {[string, PropertyDescriptor][]} */\n\tconst descriptorMap = Object.entries(struct).map(([k, v]) => {\n\t\tconst computed = createComputed(\n\t\t\t() => state.get()?.[k],\n\t\t\t(v) => state.set({ ...state.get(), [k]: v })\n\t\t);\n\t\tlet get = () => computed.get();\n\t\t/** @param {any} v */\n\t\tlet set = v => computed.set(v);\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tlet children = null;\n\t\t\tget = () => children ||= createDeeply(computed, v);\n\t\t\tset = v => computed.set(structuredClone(v));\n\t\t}\n\t\treturn [k, {\n\t\t\tget, set, enumerable: true,\n\t\t\tconfigurable: true,\n\t\t}];\n\t});\n\t// @ts-ignore\n\treturn Object.defineProperties({}, Object.fromEntries(descriptorMap));\n}\n\n/** @type {Map<number, {tick: State<number>, count: number; stop(): void}>} */\nconst ticks = new Map();\n/**\n * \n * @param {number} interval \n * @param {AbortSignal} [signal] \n */\nexport function createTick(interval, signal) {\n\tif (signal?.aborted) { return createComputed(() => 0); }\n\tlet item = ticks.get(interval);\n\tif (!item) {\n\t\tconst tick = createState(0);\n\t\tconst start = performance.now();\n\t\tlet timerId = setTimeout(function step() {\n\t\t\tconst allTimes = performance.now() - start;\n\t\t\tconst n = Math.floor(allTimes / interval);\n\t\t\ttick.set(n);\n\t\t\tconst delay = (n + 1) * interval - allTimes;\n\t\t\ttimerId = setTimeout(step, Math.max(0, delay));\n\t\t}, interval);\n\t\titem = {\n\t\t\ttick: createComputed(() => tick.get()), count: 0, stop() {\n\t\t\t\tclearTimeout(timerId);\n\t\t\t\tif (ticks.get(interval) !== item) { return; }\n\t\t\t\tticks.delete(interval);\n\t\t\t}\n\t\t};\n\t\tticks.set(interval, item);\n\t}\n\titem.count++;\n\tsignal?.addEventListener('abort', () => {\n\t\titem.count--;\n\t\tif (item.count) { return; }\n\t\titem.stop();\n\t}, { once: true });\n\treturn item.tick;\n}\n","\n/**\n * @template T\n * @template TReturn\n * @template TNext\n * @param {Generator<T, TReturn, TNext>} generator \n * @param {(value: T) => TNext} run \n * @param {TNext} def \n */\nexport function runGenerator(generator, run, def) {\n\t/** @type {TNext} */\n\tlet value = def;\n\tfor (; ;) {\n\t\tconst result = generator.next(value);\n\t\tif (result.done) {\n\t\t\treturn result.value;\n\t\t}\n\t\tvalue = run(result.value);\n\t}\n}\n/**\n * @template T\n * @template TReturn\n * @template TNext\n * @param {Generator<T, TReturn, TNext>} generator \n * @param {(value: T) => PromiseLike<TNext> | TNext} run \n * @param {TNext} def \n */\nexport async function asyncRunGenerator(generator, run, def) {\n\t/** @type {TNext} */\n\tlet value = def;\n\tfor (; ;) {\n\t\tconst result = generator.next(value);\n\t\tif (result.done) {\n\t\t\treturn result.value;\n\t\t}\n\t\tvalue = await run(result.value);\n\t}\n}\n","/** @import { Children, Field, Match, Or } from './types.mjs' */\nimport { asyncRunGenerator, runGenerator } from './util.mjs';\n\n\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} fields \n * @returns {any[]}\n */\nfunction select(data, fields) {\n\tlet list = data;\n\tfor (let item of fields) {\n\t\tconst [field, ...sub] = typeof item === 'string' ? [item] : item;\n\n\t\tif (!list.length) { continue; }\n\t\t/** @type {any[]} */\n\t\tconst subList = [];\n\t\tit: for (const item of list) {\n\t\t\tif (!item || typeof item !== 'object') { continue; }\n\t\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\t\tlet value = item[field];\n\t\t\tfor (const index of sub) {\n\t\t\t\tif (!Array.isArray(value)) { continue it; }\n\t\t\t\tvalue = value[index];\n\t\t\t}\n\t\t\tsubList.push(value);\n\t\t}\n\t\tlist = subList.flat(Infinity).filter(v => v && typeof v === 'object');\n\t}\n\treturn list;\n\n}\n\n/**\n * \n * @param {Record<string, any>[]} list \n * @param {string} field \n * @returns {any[]}\n */\nfunction selectValue(list, field) {\n\t/** @type {any[]} */\n\tconst subList = [];\n\tfor (const item of list) {\n\t\tif (!item || typeof item !== 'object') { continue; }\n\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\tsubList.push(item[field]);\n\t}\n\treturn subList;\n\n}\n/**\n * @typedef {object} ExecParam\n * @property {Field[]} fields\n * @property {string} operator\n * @property {string?} [sign]\n * @property {any} value\n * @property {any[]} values\n * @property {string} [field]\n */\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} parentFields \n * @param {Match} match \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execMatch(data, parentFields, match) {\n\tconst fields = [...match[0]];\n\tconst currentFields = [...parentFields, ...fields];\n\tconst last = fields.pop();\n\tif (!last) { return null; }\n\tconst lastField = typeof last === 'string' ? last : last[0];\n\tconst records = select(data, fields);\n\tif (!records.length) { return false; }\n\tconst [, value, operator, sign] = match;\n\tif (operator === null) {\n\t\tconst values = selectValue(records, lastField);\n\t\treturn sign ? values.find(v => v === null) : values.find(v => v !== null);\n\t}\n\tif (typeof value !== 'object' || !value || Array.isArray(value)) {\n\n\t\tconst values = selectValue(records, lastField);\n\t\tif (!values.length) { return false; }\n\n\t\treturn yield ({ fields: currentFields, operator, sign, value, values });\n\t}\n\n\tif (value.filter || value.table || value.placeholder) { return null; }\n\tconst field = value.field;\n\tif (!field) { return null; }\n\n\t/** @type {boolean?} */\n\tlet defResult = false;\n\tfor (const item of records) {\n\t\tif (!item || typeof item !== 'object') { continue; }\n\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\tif (!Object.hasOwn(item, lastField)) { continue; }\n\t\tdefResult = null;\n\t\tconst result = yield ({ fields: currentFields, operator, sign, value: item[field], field, values: [item[lastField]] });\n\t\tif (result === null) { continue; }\n\t\treturn result;\n\t}\n\treturn defResult;\n\n}\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} parentFields \n * @param {Match | Children | Or} match \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execItem(data, parentFields, match) {\n\tif (!Array.isArray(match)) {\n\t\tconst { and, or } = match;\n\t\treturn yield* execOr(data, parentFields, and, or);\n\t}\n\tif (match.length !== 2) {\n\t\treturn yield* execMatch(data, parentFields, match);\n\n\t}\n\t/** @type {boolean?} */\n\tlet defResult = null;\n\tconst values = select(data, match[0]);\n\tif (!values.length) { return false; }\n\tconst fields = [...parentFields, ...match[0]];\n\tfor (const item of match[1]) {\n\t\tconst result = yield* execItem(values, fields, item);\n\t\tif (result === null) { continue; }\n\t\tif (!result) { return false; }\n\t\tdefResult = true;\n\t}\n\treturn defResult;\n}\n/**\n * \n * @param {Record<string, any>[]} list \n * @param {Field[]} parentFields \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execOr(list, parentFields, and, or) {\n\t/** @type {boolean?} */\n\tlet defResult = null;\n\tif (Array.isArray(and)) {\n\t\tfor (const item of and) {\n\t\t\tconst result = yield* execItem(list, parentFields, item);\n\t\t\tif (result === null) { continue; }\n\t\t\tif (!result) { return false; }\n\t\t\tdefResult = true;\n\t\t}\n\t}\n\tif (Array.isArray(or)) {\n\t\tfor (const item of or) {\n\t\t\tconst result = yield* execItem(list, parentFields, item);\n\t\t\tif (result === null) { continue; }\n\t\t\tif (result) { return true; }\n\t\t\tdefResult = true;\n\t\t}\n\t}\n\treturn defResult;\n\n}\n\n/**\n * \n * @param {Record<string, any>} data \n * @param {(value: ExecParam) => boolean?} exec \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n */\nexport function exec(data, exec, and, or) {\n\treturn runGenerator(execOr([data].flat(), [], and, or), exec, null);\n}\n\n/**\n * \n * @param {Record<string, any>} data \n * @param {(value: ExecParam) => PromiseLike<boolean?> | boolean?} exec \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n */\nexport async function asyncExec(data, exec, and, or) {\n\treturn asyncRunGenerator(execOr([data].flat(), [], and, or), exec, null);\n}\n","/** @import { Value } from './types.mjs' */\n/** @import { Children, Field, FieldValue, Match, Or } from './types.mjs' */\n\nimport { runGenerator } from './util.mjs';\n\n\n\n\n\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[]} match \n * @returns {Generator<Value, T[]?, Value | null>}\n */\nfunction* fillList(match) {\n\t/** @type {T[]} */\n\tlet list = [];\n\tlet has = false;\n\tfor (const child of match) {\n\t\tconst val = yield* fillMatch(child);\n\t\tlist.push(val || child);\n\t\tif (val) { has = true; }\n\t}\n\treturn has ? list : null;\n\n}\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T} match \n * @returns {Generator<Value, T?, Value | null>}\n */\nfunction* fillMatch(match) {\n\tif (!Array.isArray(match)) {\n\t\tconst and = match.and && (yield* fillMatches(match.and));\n\t\tconst or = match.or && (yield* fillMatches(match.or));\n\t\tif (!and && !or) { return null; }\n\t\t/** @type {Or} */\n\t\tconst item = { and: and || match.and, or: or || match.or };\n\t\treturn /** @type {T} */(item);\n\t}\n\tif (match.length === 2) {\n\t\tlet children = yield* fillMatches(match[1]);\n\t\tif (!children) { return null; }\n\t\t/** @type {Children} */\n\t\tconst item = [match[0], match[1]];\n\t\treturn /** @type {T} */(item);\n\t}\n\tconst value = yield match[1];\n\tif (value === null) { return null; }\n\t/** @type {Match} */\n\tconst item = [match[0], value, match[2], match[3]];\n\treturn /** @type {T} */(item);\n\n}\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[]} match \n * @returns {Generator<Value, T[]?, Value | null>}\n */\nexport function* fillMatches(match) {\n\t/** @type {T[]} */\n\tconst list = [];\n\tlet has = false;\n\tfor (const child of match) {\n\t\tconst val = yield* fillMatch(child);\n\t\tlist.push(val || child);\n\t\tif (val) { has = true; }\n\t}\n\treturn has ? list : null;\n\n}\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[] | null | undefined} match \n * @param {(placeholder: string) => Value | null} getPlaceholder \n * @returns {T[]}\n */\nexport function fill(match, getPlaceholder) {\n\tif (!match) { return []; }\n\t/**\n\t * \n\t * @template {Value} T \n\t * @param {T} match \n\t * @returns {Value | null}\n\t */\n\tfunction fillValue(match) {\n\t\tif (!match || typeof match !== 'object') { return null; }\n\t\tif (Array.isArray(match)) { return null; }\n\t\tconst placeholder = match.placeholder;\n\t\tif (!placeholder || typeof placeholder !== 'string') { return null; }\n\t\treturn getPlaceholder(placeholder);\n\t}\n\treturn runGenerator(fillList(match), fillValue, null) || match;\n}\n","/** @import { RecursiveArray } from '../types/types.mjs' */\n/** @import { Children, Field, Match, Or, Param, Value } from './types.mjs' */\n\n\n\n/**\n * @typedef {object} Parse.Field\n * @property {string} field\n * @property {string?} [group]\n * @property {number[]} sub\n */\n/**\n * @typedef {object} Parse.Match\n * @property {null} [children]\n * @property {Parse.Field[]} fields\n * @property {string?} operator\n * @property {string} [sign]\n * @property {Value} value\n */\n\n\n/**\n * @typedef {object} Parse.Children\n * @property {Parse.Field[]} fields\n * @property {(Parse.Match | Parse.Children)[]} children\n */\n\n/**\n * \n * @param {Parse.Field[]} fields \n * @returns {Field[]}\n */\nfunction compressFields(fields) {\n\treturn fields.map(\n\t\t({ field, sub }) => sub.length ? [field, ...sub] : field\n\t);\n}\n\n/**\n * \n * @param {Parse.Match | Parse.Children} v \n * @returns {Match | Children}\n */\nfunction compressAndItem(v) {\n\tif (v.children) {\n\treturn [compressFields(v.fields), v.children.map(compressAndItem)];\n\n\t}\n\tconst { fields, operator, value, sign } = v;\n\treturn [compressFields(fields), value, operator, sign];\n}\n\nconst fieldParserRegex = /^([-_\\d\\p{L}]+)((?:\\[-?\\d+\\])*)$/u;\n/**\n * \n * @param {string} l \n */\nfunction parseFields(l) {\n\t/** @type {Parse.Field[]} */\n\tconst fields = [];\n\tfor (const v of l.split('.')) {\n\t\tif (!v || v[0] === '?') { return null; }\n\t\tconst index = v.indexOf('?');\n\t\tconst r = fieldParserRegex.exec(index > 0 ? v.slice(0, index) : v);\n\t\tif (!r) { return null; }\n\t\tconst sub = r[2]?.split(/\\[|\\]/).filter(Boolean).map(v => parseInt(v) || 0) || [];\n\t\tconst group = index > 0 ? v.slice(index) : undefined;\n\t\tfields.push({ field: r[1], group, sub });\n\t}\n\treturn fields;\n\n}\n\n\n/** @param {string} v */\nconst decodeValue = v => decodeURIComponent(v.replaceAll('+', ' '));\n/**\n * \n * @param {string} s \n * @returns {string | RecursiveArray<string>?}\n */\nfunction parseArrayValue(s) {\n\t/** @type {(string | RecursiveArray<string>)[]} */\n\tconst root = [];\n\t/** @type {(string | RecursiveArray<string>)[][]} */\n\tconst stack = [];\n\tlet current = root;\n\t/** @type {string[]} */\n\tlet strings = [];\n\tlet end = false;\n\tlet must = true;\n\tfunction add() {\n\t\tcurrent.push(decodeValue(strings.join()));\n\t\tstrings = [];\n\t}\n\n\tfor (const c of s) {\n\t\tif (c === ',') {\n\t\t\tif (end) {\n\t\t\t\tend = false;\n\t\t\t} else {\n\t\t\t\tadd();\n\t\t\t}\n\t\t\tmust = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === ')') {\n\t\t\tif (must || strings.length) {\n\t\t\t\tadd();\n\t\t\t\tmust = false;\n\t\t\t}\n\t\t\tconst last = stack.pop();\n\t\t\tif (!last) { return null; }\n\t\t\tlast.push(current);\n\t\t\tcurrent = last;\n\t\t\tend = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (end) { return null; }\n\t\tmust = false;\n\t\tif (c !== '(') {\n\t\t\tstrings.push(c);\n\t\t\tcontinue;\n\t\t}\n\t\tif (strings.length) { return null; }\n\t\tstack.push(current);\n\t\tcurrent = [];\n\t}\n\tif (must || strings.length) {\n\t\tadd();\n\t}\n\tif (stack.length) { return null; }\n\treturn root.length === 1 ? root[0] : root;\n}\n\nconst valueQRegex = /^([-_\\d\\p{L}]+)@([-_\\d\\p{L}]+)/u;\n\n\n/**\n * \n * @param {string?} v \n * @returns {Value | true}\n */\nfunction parseValue(v) {\n\tif (v === null) { return true; }\n\tif (v[0] === '?') {\n\t\treturn { placeholder: decodeValue(v.slice(1)) };\n\t}\n\tif (v[0] === ':') {\n\t\treturn { field: decodeValue(v.slice(1)) };\n\t}\n\tif (v[0] === '@') {\n\t\t// TODO: \n\t\treturn null;\n\t}\n\tconst vq = valueQRegex.test(v);\n\tif (vq) {\n\t\t// TODO: \n\t\treturn null;\n\t}\n\tif (v.includes('(') || v.includes(')')) {\n\t\tconst list = parseArrayValue(v);\n\t\tif (list) { return list; }\n\t}\n\tif (v.includes(',')) {\n\t\treturn v.split(',').map(v => decodeValue(v.replaceAll('+', ' ')));\n\t}\n\treturn decodeValue(v);\n}\n/**\n * \n * @param {(Parse.Match | Parse.Children)[]} list \n * @returns {Iterable<Match | Children>}\n */\nfunction* toAnd(list) {\n\t/** @type {[(Parse.Match | Parse.Children), Parse.Field[], Parse.Field[]][]} */\n\tconst values = list.map(v => {\n\t\tconst fields = v.fields;\n\t\tconst index = fields.findLastIndex(v => v.group);\n\t\tif (index < 0 || index >= fields.length - 1) {\n\t\t\treturn [v, [], []];\n\t\t}\n\t\tconst field = fields[index];\n\t\tif (!field) { return [v, [], []]; }\n\t\treturn [{ ...v, fields: fields.slice(index + 1) }, fields.slice(0, index + 1), [...fields.slice(0, index), { ...field, group: undefined }]];\n\t});\n\tconst map = Object.groupBy(values, v => JSON.stringify(v[1]));\n\tyield* map['[]']?.map(v => compressAndItem(v[0])) || [];\n\tdelete map['[]'];\n\t/** @type {Parse.Children[]} */\n\tconst result = Object.values(map).filter(Boolean).map((list = []) => {\n\t\tif (!list?.length) { return { fields: [], children: [] }; }\n\t\treturn { fields: list[0][2] || [], children: list.map(v => v[0]) };\n\t}).filter(v => v.fields.length);\n\tif (!result.length) { return; }\n\n\tyield* toAnd(result);\n}\n\n/**\n * \n * @param {(Parse.Match & {groups: string[]})[]} list \n * @returns {Or}\n */\nfunction toOr(list) {\n\tconst map = Map.groupBy(list, v => v.groups.shift() ?? null);\n\tconst and = map.get(null) || [];\n\tconst baseOr = map.get('') || [];\n\tmap.delete(null);\n\tmap.delete('');\n\n\treturn {\n\t\tor: [\n\t\t\t...baseOr.map(v => compressAndItem(v)),\n\t\t\t...[...map.values()].map(v => toOr(v)),\n\t\t],\n\t\tand: [...toAnd(and)],\n\t};\n}\n/**\n * \n * @param {string} search \n * @returns {Param}\n */\nexport function parse(search, split = '&') {\n\t/** @type {string[]} */\n\tconst values = [];\n\t/** @type {string[]} */\n\tconst select = [];\n\t/** @type {string[]} */\n\tconst primary = [];\n\t/** @type {[field: string, desc?: boolean][]} */\n\tconst sorts = [];\n\tlet limit = 0;\n\tlet offset = 0;\n\tlet page = 0;\n\tlet total = false;\n\t/** @type {Record<string, string>} */\n\tconst placeholders = {};\n\n\n\t/** @type {(Parse.Match & {groups: string[]})[]} */\n\tconst allMatches = [];\n\n\tfor (const s of typeof search === 'string' ? search.split(split) : []) {\n\t\tif (s[0] === '=') {\n\t\t\tvalues.push(s.slice(1));\n\t\t\tcontinue;\n\t\t}\n\t\tconst index = s.indexOf('=');\n\t\tconst key = index < 0 ? s : s.slice(0, index);\n\t\tconst val = index < 0 ? null : s.slice(index + 1);\n\t\tif (index <= 0) { continue; }\n\t\tif (`.!@^*<>{}[]()+|;,\"'\\`\\\\/`.includes(key[0])) { continue; }\n\t\tif (key[0] === '?') {\n\t\t\tplaceholders[decodeValue(key.slice(1))] = decodeValue(val || '');\n\t\t\tcontinue;\n\t\t}\n\t\tif (key[0] === ':') {\n\t\t\tconst name = key.slice(1);\n\t\t\tif (!val) { continue; }\n\t\t\tif (name === 'sort') {\n\t\t\t\tsorts.push(...val.split(',').filter(Boolean).map(v => {\n\t\t\t\t\tconst desc = v[0] === '-';\n\t\t\t\t\tconst name = desc ? v.slice(1) : v;\n\t\t\t\t\treturn /** @type {[field: string, desc?: boolean]} */([decodeValue(name), desc]);\n\t\t\t\t}).filter(Boolean));\n\t\t\t} else if (name === 'select') {\n\t\t\t\tselect.push(...val.split(',').map(decodeValue).filter(Boolean));\n\t\t\t} else if (name === 'primary') {\n\t\t\t\tprimary.push(...val.split(',').map(decodeValue).filter(Boolean));\n\t\t\t} else if (name === 'limit') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { limit = parseInt(val); }\n\t\t\t} else if (name === 'offset') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { offset = parseInt(val); }\n\t\t\t} else if (name === 'page') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { page = parseInt(val); }\n\t\t\t} else if (name === 'total') {\n\t\t\t\tif (val) { total = true; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst sg = key.split('~');\n\t\tlet field = sg.pop() || '';\n\t\tlet sign = '';\n\t\tif ('!'.includes(field[field.length - 1])) {\n\t\t\tsign = '!';\n\t\t\tfield = field.slice(0, -1);\n\t\t}\n\n\t\tconst l = field.split(':', 3);\n\t\tif (l.length > 2) { continue; }\n\t\tconst fields = parseFields(l[0]);\n\t\tif (!fields) { continue; }\n\t\tconst value = parseValue(val);\n\t\tif (value === null) { continue; }\n\n\t\tconst operator = decodeValue(l[1] || '');\n\t\tconst groupIndex = sg.indexOf('');\n\t\tconst groups = groupIndex < 0 ? sg : sg.slice(0, groupIndex + 1);\n\t\tallMatches.push({\n\t\t\tgroups,\n\t\t\tfields,\n\t\t\toperator: !operator && value === true ? null : operator,\n\t\t\tsign,\n\t\t\tvalue: value === true ? null : value\n\t\t});\n\t}\n\n\tconst { and, or } = toOr(allMatches);\n\n\t/** @type {Param} */\n\tconst result = {};\n\tif (values?.length) {\n\t\tresult.values = values;\n\t}\n\tif (total) {\n\t\tresult.total = total;\n\t}\n\tif (limit && limit > 0) {\n\t\tresult.limit = limit;\n\t}\n\tif (page && page > 0) {\n\t\tresult.page = page;\n\t}\n\tif (offset && offset > 0) {\n\t\tresult.offset = offset;\n\t}\n\tif (select?.length) {\n\t\tresult.select = select;\n\t}\n\tif (primary?.length) {\n\t\tresult.primary = primary;\n\t}\n\tif (sorts?.length) {\n\t\tresult.sort = sorts;\n\t}\n\tconst where = and;\n\tif (where?.length) {\n\t\tresult.where = where;\n\t}\n\tconst orWhere = or;\n\tif (orWhere?.length) {\n\t\tresult.orWhere = orWhere;\n\t}\n\tif (Array.isArray(placeholders) && placeholders.length) {\n\t\tresult.placeholders = placeholders;\n\t}\n\n\n\treturn result\n}\n","/** @import { Param } from './types.mjs' */\n\n/**\n * \n * @param {Partial<Param>} a \n * @param {Partial<Param>} b \n * @returns {Param}\n */\nexport function merge(a, b) {\n\tconst limit = b.limit || a.limit || 0;\n\tconst page = b.page ?? a.page;\n\tconst primary = [a.primary || [], b.primary || []].flat().filter(Boolean);\n\tconst offset = \n\tb.offset ?? (b.limit && (b.page || b.page === 0) ? (Math.floor(Math.max(b.page || 0, 1)) - 1) * b.limit : null)\n\t?? a.offset ?? (a.limit && (a.page || a.page === 0) ? (Math.floor(Math.max(a.page || 0, 1)) - 1) * a.limit : null)\n\t?? (Math.floor(Math.max(page || 0, 1)) - 1) * (limit || 10);\n\n\tconst values = [...a.values || [], ...b.values || []]\n\tconst sort = [...a.sort || [], ...b.sort || []]\n\tconst select = [...a.select || [], ...b.select || []]\n\tconst where = [...a.where || [], ...b.where || []]\n\tconst orWhere = [...a.orWhere || [], ...b.orWhere || []]\n\tconst or = [...a.or || [], ...b.or || []]\n\n\t/** @type {Param} */\n\tconst result = {};\n\tif (values?.length) {\n\t\tresult.values = values;\n\t}\n\tif (limit && limit > 0) {\n\t\tresult.limit = limit;\n\t}\n\tif (a.total || b.total) {\n\t\tresult.total = true;\n\t}\n\tif (page && page > 0) {\n\t\tresult.page = page;\n\t}\n\tif (offset && offset > 0) {\n\t\tresult.offset = offset;\n\t}\n\tif (select?.length) {\n\t\tresult.select = select;\n\t}\n\tif (sort?.length) {\n\t\tresult.sort = sort;\n\t}\n\tif (where?.length) {\n\t\tresult.where = where;\n\t}\n\tif (orWhere?.length) {\n\t\tresult.orWhere = orWhere;\n\t}\n\tif (or?.length) {\n\t\tresult.or = or;\n\t}\n\tif (primary.length) {\n\t\tresult.primary = primary;\n\t}\n\n\treturn result;\n}\n","/** @import { RecursiveArray } from '../types/types.mjs' */\n/** @import { Children, Field, FieldValue, Match, Or, Param } from './types.mjs' */\n\n/** @param {string} v */\nconst encodeValue = v => encodeURIComponent(v).replaceAll('%20', '+');\n\n/**\n * \n * @param {string | boolean | number | RecursiveArray<string> | FieldValue} value \n */\nfunction stringifyValue(value) {\n\tif (Array.isArray(value)) {\n\t\t/**\n\t\t * \n\t\t * @param {string | RecursiveArray<string>} v \n\t\t * @returns {string}\n\t\t */\n\t\tfunction s(v) {\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\treturn `(${v.map(s).join(',')})`;\n\t\t\t}\n\t\t\treturn encodeValue(v);\n\t\t}\n\t\tconst val = value.map(s).join(',');\n\t\tif (value.length > 1) { return val; }\n\t\treturn `(${val})`;\n\t}\n\tif (typeof value === 'number') {\n\t\treturn `${value}`;\n\t}\n\tif (typeof value === 'boolean') {\n\t\treturn value ? '1' : 0;\n\t}\n\tif (typeof value !== 'object') {\n\t\treturn encodeValue(value);\n\t}\n\tconst { field, placeholder } = value;\n\tif (placeholder) {\n\t\treturn `?${encodeValue(placeholder)}`;\n\t}\n\tif (field) {\n\t\treturn `:${encodeValue(field)}`;\n\t}\n\t// TODO:\n\treturn '';\n}\n\n/**\n * \n * @param {Field[]} fields \n */\nfunction stringifyFields(fields) {\n\treturn fields.map(item => {\n\t\tconst [field, ...sub] = typeof item === 'string' ? [item] : item;\n\t\treturn `${encodeValue(field)}${sub.map(() => `[k]`).join('')}`;\n\t}\n\t).join('.');\n}\n/**\n * \n * @param {Match} define \n */\nfunction stringifyDefine([fields, value, operator, sign]) {\n\tconst key = operator\n\t\t? `${stringifyFields(fields)}:${encodeValue(operator)}${sign || ''}`\n\t\t: `${stringifyFields(fields)}${sign || ''}`;\n\tif (operator === null) { return key; }\n\tif (value === null) { return ''; }\n\tif (typeof value === 'function') { return ''; }\n\treturn `${key}=${stringifyValue(value)}`;\n}\n/**\n * \n * @param {(Match | Children)[]} list \n * @returns {string[]}\n */\nfunction stringifyAnd(list) {\n\tlet index = 0;\n\treturn list.flatMap(v => {\n\t\tif (v.length !== 2) {\n\t\t\treturn stringifyDefine(v);\n\t\t}\n\t\tconst list = stringifyAnd(v[1]);\n\t\tif (!list.length) { return []; }\n\t\tlet key = stringifyFields(v[0]);\n\t\tif (list.length > 1) {\n\t\t\tkey += `?${(index++).toString(36)}`;\n\t\t}\n\t\treturn list.map(v => `${key}.${v}`);\n\t}).filter(Boolean);\n}\n\n/**\n * \n * @param {(Match | Children | Or)[]} list \n * @returns {string[]}\n */\nfunction stringifyOr(list) {\n\tlet index = 0;\n\treturn list.map(v => {\n\t\tif (Array.isArray(v)) {\n\t\t\treturn stringifyAnd([v]);\n\n\t\t}\n\t\treturn [\n\t\t\t...stringifyAnd(v.and || []),\n\t\t\t...stringifyOr(v.or || []),\n\t\t];\n\t}).flatMap(list => {\n\t\tif (!list) { return []; }\n\t\tconst key = list.length === 1 ? `~` : `${(index++).toString(36)}~`;\n\t\treturn list.map(v => `${key}${v}`);\n\t});\n}\n/**\n * \n * @param {Partial<Param>} query \n * @param {boolean} [usePage] \n */\nexport function stringify({\n\tvalues,\n\twhere,\n\torWhere,\n\tsort,\n\tselect, primary,\n\tlimit, offset, page, total,\n\tplaceholders,\n}, usePage) {\n\t/** @type {string[]} */\n\tlet queries = [];\n\tfor (const v of values || []) {\n\t\tif (!v) { continue; }\n\t\tqueries.push(`=${encodeValue(v)}`);\n\t}\n\tif (limit && limit > 0) {\n\t\tqueries.push(`:limit=${limit}`);\n\t}\n\tif (total) {\n\t\tqueries.push(`:total=${total}`);\n\n\t}\n\tif (usePage) {\n\t\tif (page && page > 0) {\n\t\t\tqueries.push(`:page=${page}`);\n\t\t}\n\t} else {\n\t\tif (offset && offset > 0) {\n\t\t\tqueries.push(`:offset=${offset}`);\n\t\t}\n\t}\n\tconst selectVal = select?.filter(Boolean).map(encodeValue).join(',');\n\tif (selectVal) {\n\t\tqueries.push(`.select=${selectVal}`);\n\t}\n\tconst primaryVal = primary?.filter(Boolean).map(encodeValue).join(',');\n\tif (primaryVal) {\n\t\tqueries.push(`.primary=${primaryVal}`);\n\t}\n\tif (sort) {\n\t\tconst val = sort.filter(Boolean).map(v => {\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\tconst [field, desc] = v;\n\t\t\t\tif (field) {\n\t\t\t\t\treturn `${desc ? '-' : ''}${encodeValue(field)}`;\n\t\t\t\t}\n\t\t\t} else if (v) {\n\t\t\t\treturn encodeValue(v);\n\t\t\t}\n\t\t\treturn '';\n\t\t}).filter(Boolean).join(',');\n\t\tif (val) {\n\t\t\tqueries.push(`.sort=${val}`);\n\t\t}\n\t}\n\tif (placeholders && typeof placeholders === 'object' && !Array.isArray(placeholders)) {\n\t\tfor (const [k, v] of Object.entries(placeholders)) {\n\t\t\tqueries.push(`?${encodeValue(k)}=${encodeValue(v)}`);\n\n\t\t}\n\t}\n\tfor (const v of stringifyAnd(where || [])) {\n\t\tqueries.push(v);\n\t}\n\tfor (const v of stringifyOr(orWhere || [])) {\n\t\tqueries.push(v);\n\t}\n\treturn queries.join('&');\n}\n","import { Search } from '@yongdall/common';\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @typedef {object} Where\n * @property {(where: TWhere) => boolean?} [value]\n * @property {(list: TWhere[]) => TWhere?} or\n * @property {(list: TWhere[]) => TWhere?} and\n * @property {ItemToWhere<TField, TParam, TWhere>} build\n */\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @callback ToWhere\n * @param {TField} fields \n * @param {Search.AndList} [and] \n * @param {...Search.OrList | null | undefined} orList\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @callback ItemToWhere\n * @param {ToWhere<TField, TParam, TWhere>} toWhere \n * @param {TField} fields \n * @param {Search.Match | Search.Children} and\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\n\n\n\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @param {Where<TField, TParam, TWhere>} where \n * @param {TField} fields \n * @param {Search.AndList} [and] \n * @param {...Search.OrList | null | undefined} orList\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\nexport function toWhere(where, fields, and, ...orList) {\n\t/**\n\t * \n\t * @param {TField} fields \n\t * @param {Search.AndList} [and] \n\t * @param {...Search.OrList | null | undefined} orList\n\t * @returns {Generator<TParam, TWhere?, TWhere?>}\n\t */\n\tfunction* toWhere(fields, and, ...orList) {\n\n\t\t/** @type {TWhere[]} */\n\t\tconst list = [];\n\t\tif (and) {\n\t\t\tfor (const item of and) {\n\t\t\t\tconst w = yield* where.build(toWhere, fields, item);\n\t\t\t\tif (w == null) { continue; }\n\t\t\t\tif (where.value?.(w) === false) { return w; }\n\t\t\t\tlist.push(w);\n\t\t\t}\n\t\t}\n\t\torFor: for (const or of orList) {\n\t\t\tif (!or) { continue; }\n\t\t\t/** @type {TWhere[]} */\n\t\t\tconst orList = [];\n\t\t\tfor (const item of or) {\n\t\t\t\tconst w = Array.isArray(item)\n\t\t\t\t\t? yield* where.build(toWhere, fields, item)\n\t\t\t\t\t: yield* toWhere(fields, item.and, item.or);\n\t\t\t\tif (w == null) { continue; }\n\t\t\t\tif (where.value?.(w) === true) {\n\t\t\t\t\tlist.push(w);\n\t\t\t\t\tcontinue orFor;\n\t\t\t\t}\n\t\t\t\torList.push(w);\n\t\t\t}\n\t\t\tconst w = orList.length ? where.or(orList) : null;\n\t\t\tif (w == null) { continue; }\n\t\t\tif (where.value?.(w) === false) { return w; }\n\t\t\tlist.push(w);\n\t\t}\n\t\tif (!list.length) { return null; }\n\t\treturn where.and(list);\n\t}\n\treturn toWhere(fields, and, ...orList);\n}\n","export * from './exec.mjs';\nexport * from './fill.mjs';\nexport { parse } from './parse.mjs';\nexport * from './merge.mjs';\nexport * from './stringify.mjs';\nexport * from './types.mjs';\nexport * from './util.mjs';\nexport * from './toWhere.mjs';\n","export const CST = Intl.DateTimeFormat().resolvedOptions().timeZone === 'Asia/Shanghai';\nexport const TZO = new Date().getTimezoneOffset();\nfunction getTimeZone() {\n\tlet tzo = TZO;\n\tif (!tzo) { return 'Z'; }\n\tconst s = tzo < 0 ? '+' : '-';\n\ttzo = Math.abs(tzo);\n\treturn s + [Math.floor(tzo / 60), tzo % 60].map(v => `${v}`.padStart(2, '0')).join(':');\n}\nexport const TZ = getTimeZone();\n\n\n\nconst dateRegex1 = /^(?:(?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)[t| ])?(?<h>2[0-3]|[01]?\\d):(?<m>[0-5]?\\d)(?::(?<s>[0-5]?\\d)(?:(?:\\.(?<ms>\\d{1,3})?)?))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?$/i;\nconst dateRegex2 = /^(?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)(?:[t| ](?<h>2[0-3]|[01]?\\d):(?<m>[0-5]?\\d)(?::(?<s>[0-5]?\\d)(?:(?:\\.(?<ms>\\d{1,3})?)?))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?)?$/i;\n\n\n/**\n * \n * @param {string | null} [val] \n * @returns \n */\nexport function parseTimeZone(val) {\n\tif (val === 'z' || val === 'Z') { return 'Z'; }\n\tif (!val || typeof val !== 'string') { return TZ; }\n\tif (val.includes(':')) { return val; }\n\treturn `${val}:00`;\n}\n\n\n/**\n * \n * @param {any} value \n * @returns \n */\nexport function parse(value) {\n\tif (value instanceof Date) { return value.valueOf() ? new Date(value) : null; }\n\tif (typeof value === 'number') {\n\t\tconst date = new Date(value);\n\t\treturn date.valueOf() ? date : null;\n\t}\n\tif (typeof value !== 'string') { return null; }\n\tconst ss = dateRegex1.exec(value)?.groups || dateRegex2.exec(value)?.groups;\n\tif (!ss) { return null; }\n\tconst { Y, M, D, h, m, s, ms, tz = '' } = ss;\n\tconst str = [\n\t\t`${Y || 2000}`.padStart(4, '0'),\n\t\t`-`,\n\t\t`${M || 1}`.padStart(2, '0'),\n\t\t`-`,\n\t\t`${D || 1}`.padStart(2, '0'),\n\t\t`T`,\n\t\t`${h || 0}`.padStart(2, '0'),\n\t\t`:`,\n\t\t`${m || 0}`.padStart(2, '0'),\n\t\t`:`,\n\t\t`${s || 0}`.padStart(2, '0'),\n\t\t`.`,\n\t\t`${ms || 0}`.padEnd(3, '0'),\n\t\t`${parseTimeZone(tz)}`\n\t].join('');\n\tconst date = new Date(str);\n\treturn date.valueOf() ? date : null;\n\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTime(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\treturn [\n\t\td.getUTCHours(),\n\t\td.getUTCMinutes(),\n\t\td.getUTCSeconds(),\n\t].map(v => `${v}`.padStart(2, '0')).join(':');\n\n}\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimeTz(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\tconst ms = `${d.getUTCMilliseconds()}`.padStart(3, '0');\n\n\treturn `${h}:${m}:${s}.${ms}${TZ}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetimeTz(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst Y = `${d.getUTCFullYear()}`.padStart(4, '0');\n\tconst M = `${d.getUTCMonth() + 1}`.padStart(2, '0');\n\tconst D = `${d.getUTCDate()}`.padStart(2, '0');\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\tconst ms = `${d.getUTCMilliseconds()}`.padStart(3, '0');\n\n\treturn `${Y}-${M}-${D}T${h}:${m}:${s}.${ms}${TZ}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetime(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst Y = `${d.getUTCFullYear()}`.padStart(4, '0');\n\tconst M = `${d.getUTCMonth() + 1}`.padStart(2, '0');\n\tconst D = `${d.getUTCDate()}`.padStart(2, '0');\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\n\treturn `${Y}-${M}-${D}T${h}:${m}:${s}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDate(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\treturn [\n\t\td.getUTCFullYear(),\n\t\td.getUTCMonth() + 1,\n\t\td.getUTCDate(),\n\t].map(v => `${v}`.padStart(2, '0')).join('-');\n}\n","const unitRegex = /^(.*)\\{(.*)\\}(.*)$/;\n\n/**\n* 表示一个正则匹配配置项,用于描述如何从字符串中提取特定结构(如日期)。\n* \n* @typedef {Object} Pattern\n* @property {string} name - 该配置的名称,用于标识或调试。\n* @property {[name: string, param: string][]} pipes\n* @property {boolean} optional - 是否为可选匹配。若为 true,则即使未匹配也不报错。\n* @property {string} prefix - 匹配内容前必须存在的前缀字符串(字面量,非正则)。\n* @property {string} suffix - 匹配内容后必须存在的后缀字符串(字面量,非正则)。\n*/\n\n/**\n * \n * @param {string} unit \n * @returns {Pattern}\n */\nfunction parseUnit(unit) {\n\tconst unitResult = unitRegex.exec(unit);\n\tlet main = unit;\n\tlet optional = false;\n\tlet prefix = '';\n\tlet suffix = '';\n\tif (unitResult) {\n\t\t[, prefix, main, suffix] = unitResult;\n\t\toptional = true;\n\t}\n\tconst [name, ...pipes] = main.split('|');\n\tpipes.filter(Boolean).map(format => {\n\t\tconst index = format.indexOf(':');\n\t\tif (index < 0) { return [format, '']; }\n\t\tconst type = format.slice(0, index);\n\t\tconst param = format.slice(index + 1);\n\t\treturn [type, param];\n\t});\n\treturn {\n\t\tname, pipes: pipes.filter(Boolean).map(format => {\n\t\t\tconst index = format.indexOf(':');\n\t\t\tif (index < 0) { return [format, '']; }\n\t\t\tconst type = format.slice(0, index);\n\t\t\tconst param = format.slice(index + 1);\n\t\t\treturn [type, param];\n\t\t}), optional, prefix, suffix\n\t};\n}\n/**\n * \n * @param {string | null} [pattern] \n */\nexport function parse(pattern) {\n\tif (typeof pattern !== 'string') { return []; }\n\tconst parseRegex = /\\{([^{}]*\\{[^{}]+\\}[^{}]*|[^{}]+)\\}/g;\n\tlet lastIndex = 0;\n\t/** @type {(string | Pattern)[]} */\n\tconst list = [];\n\tfor (let r = parseRegex.exec(pattern); r; r = parseRegex.exec(pattern)) {\n\t\tconst index = r.index;\n\t\tconst [text, res] = r;\n\t\tif (index > lastIndex) {\n\t\t\tlist.push(pattern.slice(lastIndex, index));\n\t\t}\n\t\tlastIndex = index + text.length;\n\t\tlist.push(parseUnit(res));\n\t}\n\tif (pattern.length - 1 > lastIndex) {\n\t\tlist.push(pattern.slice(lastIndex));\n\t}\n\treturn list;\n}\n","import { parse } from \"./parse.mjs\";\n/** @import { Pattern } from \"./parse.mjs\" */\n\n\n/**\n * \n * @param {*} value \n * @param {boolean} optional \n * @returns {string}\n */\nfunction baseGenerate(value, optional) {\n\tif ((value ?? null) === null) { return ''; }\n\tif (typeof value === 'string') { return value; }\n\tif (typeof value === 'bigint') { return String(value); }\n\tif (typeof value === 'boolean') { return value ? '1' : '0'; }\n\tif (typeof value === 'number') {\n\t\tif (!Number.isFinite(value)) { return ''; }\n\t\tconst text = value.toPrecision(100);\n\t\tif (!text.includes('.')) { return text; }\n\t\tconst index = text.indexOf('.');\n\t\treturn text.slice(0, index + 5).replace(/\\.?0+$/, '');\n\t}\n\tif (!(value instanceof Date)) { return `${value}`; }\n\tconst date = value;\n\tif (!date?.valueOf()) { return ''; }\n\t/** @type {Record<string, number>} */\n\tconst data = {\n\t\tY: date.getFullYear(),\n\t\tM: date.getMonth() + 1,\n\t\td: date.getDate(),\n\t\th: date.getHours(),\n\t\tm: date.getMinutes(),\n\t\ts: date.getSeconds(),\n\t};\n\treturn `YYYY-MM-DD hh:mm:ss`.replace(/([a-zA-Z])\\1*/g, (v, key) => {\n\t\tlet val = `${Object.hasOwn(data, key) ? data[key] : 0}`;\n\t\tconst length = v.length;\n\t\treturn `${val}`.padStart(length, '0').slice(-length);\n\t});\n}\n\n/**\n * \n * @param {Record<string, Generator<any>>} generators \n * @param {string} t \n * @param {string} p \n * @param {boolean} optional \n * @returns {function(any): any}\n */\nfunction buildPipe(generators, t, p, optional) {\n\tconst renderer = Object.hasOwn(generators, t) && generators[t];\n\tif (!renderer) { return () => { }; }\n\tconst params = renderer.parseParam(p);\n\treturn data => renderer.generate(data, params, { optional });\n\n}\n/**\n * @template T\n * @typedef {object} Generator\n * @property {(param: string) => T} parseParam\n * @property {(data: any, param: T, options: {optional: boolean}) => any} generate\n */\n\n/**\n * \n * @param {(string | Pattern)[] | string | null} [pattern] \n * @param {Record<string, Generator<any>>} [generators] \n * @returns {(data?: Record<string, any> | null) => string}\n */\nexport function toGenerate(pattern, generators) {\n\tconst list = (Array.isArray(pattern) ? pattern : parse(pattern))\n\t\t.map(v => {\n\t\t\tif (!v || typeof v !== 'object') { return v; }\n\t\t\tif (!generators) {return {...v, pipes: []}}\n\t\t\treturn {\n\t\t\t\t...v,\n\t\t\t\tpipes: v.pipes.map(([t, p]) => buildPipe(generators, t, p, v.optional)),\n\t\t\t};\n\t\t});\n\t\tif (!list.length) { return () => '';}\n\n\treturn data => {\n\t\tconst doc = typeof data === 'object' && data || {};\n\t\t/** @type {string[]} */\n\t\tconst results = [];\n\t\tfor (const v of list) {\n\t\t\tif (!v || typeof v !== 'object') {\n\t\t\t\tresults.push(v);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { name, prefix, suffix, optional, pipes } = v;\n\t\t\tlet val = Object.hasOwn(doc, name) ? doc[name] ?? null : null;\n\t\t\tfor (const pipe of pipes) {\n\t\t\t\tval = pipe(val);\n\t\t\t}\n\t\t\tconst text = baseGenerate(val, optional);\n\t\t\tif (!text) { continue; }\n\t\t\tresults.push(prefix, text, suffix);\n\t\t}\n\t\treturn results.join('');\n\n\t};\n}\n","/** @import { Generator } from \"./toGenerate.mjs\" */\nimport { parse as parseDate } from \"../Datetime.mjs\";\n\n/**\n * 表示一个正则匹配配置项,用于描述如何从字符串中提取特定结构(如日期)。\n * \n * @typedef {Object} Item\n * @property {string} name - 该配置的名称,用于标识或调试。\n * @property {boolean} optional - 是否为可选匹配。若为 true,则即使未匹配也不报错。\n * @property {string} prefix - 匹配内容前必须存在的前缀字符串(字面量,非正则)。\n * @property {string} suffix - 匹配内容后必须存在的后缀字符串(字面量,非正则)。\n * @property {(value: any) => string} generate\n*/\n\n/**\n * \n * @param {any} value \n * @param {string} param \n * @param {object} options \n * @param {boolean} options.optional \n * @returns {string}\n */\nfunction generateDate(value, param, { optional }) {\n\n\tif (!param) { return ''; }\n\tconst date = parseDate(value) || (optional ? null : new Date);\n\tif (!date?.valueOf()) { return ''; }\n\t/** @type {Record<string, number>} */\n\tconst data = {\n\t\tY: date.getFullYear(),\n\t\tM: date.getMonth() + 1,\n\t\tD: date.getDate(),\n\t\th: date.getHours(),\n\t\tm: date.getMinutes(),\n\t\ts: date.getSeconds(),\n\t};\n\treturn param.replace(/#*([a-zA-Z])\\1*/g, (v, key) => {\n\t\tlet val = `${Object.hasOwn(data, key) ? data[key] : 0}`;\n\t\tconst max = v.length;\n\t\tconst min = v.replaceAll('#', '').length;\n\t\treturn `${val}`.padStart(min, '0').slice(-max);\n\t});\n}\n\n/**\n * \n * @param {string} type \n * @param {string} param \n * @returns {[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]}\n */\nfunction paramNumber(type, param) {\n\tif (!param) {\n\t\tparam = type === 'int' ? '#############0' : type === 'float' ? '#############0.0###' : '#############0.####';\n\t}\n\tconst [intPart, fractionalPart = ''] = param.split('.');\n\tconst intMax = intPart.length || 1;\n\tconst intMin = intPart.replaceAll('#', '').length || 1;\n\tconst fractionalMax = type === 'int' ? 0 : fractionalPart.length;\n\tconst fractionalMin = type === 'int' ? 0 : fractionalPart.replaceAll('#', '').length;\n\n\treturn [intMin, intMax, fractionalMin, fractionalMax];\n\n}\n/**\n * \n * @param {any} value \n * @param {[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]} param \n * @param {object} options \n * @param {boolean} options.optional \n * @returns {string}\n */\nfunction generateNumber(value, [intMin, intMax, fractionalMin, fractionalMax], { optional }) {\n\tlet intPart = '';\n\tlet fractionalPart = '';\n\tif (typeof value === 'bigint') {\n\t\tintPart = String(value);\n\t} else if (typeof value === 'number') {\n\t\tif (Number.isFinite(value)) {\n\t\t\t[intPart, fractionalPart = ''] = value.toPrecision(100).split('.');\n\t\t}\n\t} else if (typeof value === 'string') {\n\t\tif (/^\\s*[+-]?\\s*(\\d_)*\\.?(\\d_)*/.test(value)) {\n\t\t\t[intPart, fractionalPart = ''] = value.replace(/[^\\d.-]/g, '').split('.');\n\t\t}\n\t}\n\tif (!intPart && !fractionalPart && optional) { return ''; }\n\tintPart = intPart.padStart(intMin, '0').slice(-intMax);\n\tfractionalPart = fractionalPart.replace(/0+$/, '').padEnd(fractionalMin, '0').slice(0, fractionalMax);\n\tif (!fractionalPart) { return intPart; }\n\treturn `${intPart}.${fractionalPart}`;\n}\n/** @type {Generator<string>} */\nexport const date = {\n\tparseParam: v => v || 'YYYY-MM-DD',\n\tgenerate: generateDate,\n};\n/** @type {Generator<string>} */\nexport const time = {\n\tparseParam: v => v || 'hh:mm:ss',\n\tgenerate: generateDate,\n};\n/** @type {Generator<string>} */\nexport const datetime = {\n\tparseParam: v => v || 'YYYY-MM-DD hh:mm:ss',\n\tgenerate: generateDate,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const number = {\n\tparseParam: v => paramNumber('number', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const float = {\n\tparseParam: v => paramNumber('float', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const int = {\n\tparseParam: v => paramNumber('int', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<string[]>} */\nexport const list = {\n\tparseParam(param) {\n\t\treturn param.split(';');\n\t},\n\tgenerate(value, list, { optional }) {\n\t\tlet index = -1;\n\t\tif (typeof value === 'bigint') {\n\t\t\tindex = Number(value);\n\t\t} else if (typeof value === 'number') {\n\t\t\tindex = Math.floor(value);\n\t\t} else if (typeof value === 'boolean') {\n\t\t\tindex = value ? 1 : 0;\n\t\t} else if (typeof value === 'string') {\n\t\t\tif (!/^\\s*[+-]\\s*(\\d_)*/.test(value)) { return ''; }\n\t\t\tindex = Number.parseInt(value.replace(/[^\\d.+-]/g, ''));\n\t\t}\n\t\tif (index < 0 || index >= list.length) { return optional ? '' : list[0]; }\n\t\treturn list[index];\n\t},\n};\n/** @type {Generator<Record<string, string>>} */\nexport const map = {\n\tparseParam: param => Object.fromEntries(param.split(';').map(v => {\n\t\tconst index = v.indexOf('=');\n\t\tif (index < 0) { return [v, v]; }\n\t\treturn [v.slice(0, index), v.slice(index + 1)];\n\t})),\n\tgenerate(value, map, { optional }) {\n\t\tlet key = '';\n\t\tif (typeof value === 'bigint') {\n\t\t\tkey = String(value);\n\t\t} else if (typeof value === 'number') {\n\t\t\tkey = String(value);\n\t\t} else if (typeof value === 'boolean') {\n\t\t\tkey = value ? '1' : '0';\n\t\t} else if (typeof value === 'string') {\n\t\t\tkey = value;\n\t\t}\n\t\treturn Object.hasOwn(map, key) ? map[key] : optional ? '' : Object.values(map)[0];\n\t},\n};\n","/** @import { Pattern } from \"./parse.mjs\" */\n/** @import { Generator } from \"./toGenerate.mjs\" */\nimport { toGenerate } from \"./toGenerate.mjs\"\nimport * as defaultGenerators from './generators.mjs';\n\n\n/**\n * \n * @param {(string | Pattern)[] | string | null} [pattern] \n * @param {Record<string, any>?} [data] \n * @param {Record<string, Generator<any>>} [generators] \n */\nexport function generate(pattern, data, generators = defaultGenerators) {\n\tconst generate = toGenerate(pattern, generators);\n\treturn generate(data);\n}\n","export * from './parse.mjs';\nexport * from './generate.mjs';\nexport * from './toGenerate.mjs';\nexport * as generators from './generators.mjs';\n","\nconst prototype = Error.prototype;\n/**\n * @template T\n * @template {Error} E\n * @param {Map<any, (error: E) => T>} transforms \n * @param {E} error \n */\nexport function transformError(transforms, error) {\n\tif (!(error instanceof Error)) { throw error; }\n\tfor (let p = Object.getPrototypeOf(error); p; p = Object.getPrototypeOf(p)) {\n\t\tconst fn = transforms.get(p);\n\t\tif (typeof fn === 'function') { return fn(error); }\n\t\tif (p === prototype) { break; }\n\t}\n\tthrow error;\n}\n","/**\n * @template T\n * @typedef {T | readonly T[]} Hook.MaybeArray\n */\n/**\n * @template T\n * @typedef {T extends readonly any[] ? Readonly<T>\n * : T extends Record<string, any> ? Hook.MaybeArray<Hook.Define<T> | T>\n * : T extends object ? Hook.MaybeArray<Hook.Define<T> | T>\n * : Hook.MaybeArray<T>\n * } Hook.Item\n */\n/**\n * @template T\n * @typedef {T extends Record<string, any> ? { [k in keyof T]?: Hook.Item<T[k]> } : T} Hook.Define\n*/\n\n\n\n\n/** @type {*} */\nconst noopFilter = () => true;\n\n\n\n\n/**\n * \n * @param {Record<string, any>} plugin \n * @param {string[]} name \n * @returns {*[]}\n */\nfunction findHook(plugin, name) {\n\tlet list = [plugin].flat();\n\tfor (const k of name.filter(Boolean)) {\n\t\tconst values = [];\n\t\tfor (const it of list) {\n\t\t\tif (!it || typeof it !== 'object') { continue; }\n\t\t\tif (!Object.hasOwn(it, k)) { continue; }\n\t\t\tvalues.push(it[k]);\n\t\t}\n\t\tif (!values.length) { return []; }\n\t\tlist = values.flat();\n\t}\n\treturn list;\n}\n\n/**\n * \n * @template T\n * @param {any} plugin \n * @param {string[]} names \n * @returns {T | void}\n */\nfunction first(plugin, names) {\n\tif (!names.length) { return plugin; }\n\tif (!plugin || typeof plugin !== 'object') { return; }\n\tconst [name, ...keys] = names;\n\tfor (const v of [plugin].flat()) {\n\t\tconst val = first(v[name], keys);\n\t\tif (val !== undefined) { return val; }\n\t}\n}\n\n/**\n * \n * @template T\n * @param {Record<string, any>} hooks \n * @param {string[]} name \n * @returns {IterableIterator<T>}\n */\nfunction* values(hooks, name) {\n\tfor (const it of Object.values(hooks)) {\n\t\tfor (const value of findHook(it, name)) {\n\t\t\tyield value;\n\t\t}\n\t}\n}\n\n\n\n\n/**\n * @template T\n */\nexport class Hook {\n\t/**\n\t * @template {object} T\n\t * @param {Record<string, Hook.Define<T>> | (() => Record<string, Hook.Define<T>>)} [options]\n\t * @return {Hook<T>}\n\t */\n\tstatic build(options) {\n\t\tconst hook = new Hook();\n\t\treturn Hook.update(hook, options);\n\t}\n\t/**\n\t * \n\t * @template T\n\t * @param {Hook<T>} hook\n\t * @param {Record<string, Hook.Define<T>> | (() => Record<string, Hook.Define<T>>)} [options]\n\t */\n\tstatic update(hook, options) {\n\t\tlet updated = false;\n\t\tif (typeof options === 'function') {\n\t\t\tObject.defineProperty(hook.#config, 'hooks', {\n\t\t\t\tconfigurable: true,\n\t\t\t\tget() {\n\t\t\t\t\tconst r = options();\n\t\t\t\t\treturn typeof r === 'object' && r || {};\n\t\t\t\t},\n\t\t\t});\n\t\t\tupdated = true;\n\t\t} else {\n\t\t\tif (options && typeof options === 'object') {\n\t\t\t\tObject.defineProperty(hook.#config, 'hooks', {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tvalue: options,\n\t\t\t\t});\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t}\n\t\tif (updated) {\n\t\t\tHook.reset(hook);\n\t\t}\n\t\treturn hook;\n\t}\n\t/**\n\t * \n\t * @template T\n\t * @param {Hook<T>} hook\n\t */\n\tstatic reset(hook) {\n\t\tconst hooks = hook.#hooks;\n\t\tconst resetFn = hook.#config.resetFn;\n\t\tresetFn.sort(([, a], [, b]) => a - b);\n\t\tconst before = resetFn.filter(([, p]) => p <= 0);\n\t\tconst after = resetFn.filter(([, p]) => p > 0);\n\t\tfor (const [fn] of before) { fn(); }\n\t\tfor (const fn of values(hooks, ['reset'])) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tfn();\n\t\t}\n\t\tfor (const [fn] of after) { fn(); }\n\t}\n\n\t/** @type {{hooks: any; resetFn: [fn: () => void, hysteresis: number][]}} */\n\t#config = { hooks: Object.create(null), resetFn: [] };\n\t/** @type {string[]} */\n\t#keys = [];\n\t#stringTag = 'Hook';\n\t[Symbol.iterator]() { return this.entries(); }\n\t[Symbol.toStringTag]() { return this.#stringTag; }\n\t/** @param {string} hint */\n\t[Symbol.toPrimitive](hint) {\n\t\tif (hint === 'number') { return NaN; }\n\t\treturn `[${this[Symbol.toStringTag]()}]`;\n\t}\n\n\tget #hooks() { return this.#config.hooks; };\n\t/**\n\t * @template {T extends readonly any[] ? never : T extends object ? string & keyof T : never} K\n\t * @param {K} key \n\t * @returns {Hook<Exclude<T extends readonly any[] ? never : T extends object ? T[K] :never, void | undefined>>}\n\t */\n\tget(key) {\n\t\tconst keys = [...this.#keys, key];\n\t\tconst hook = new Hook();\n\t\thook.#config = this.#config;\n\t\thook.#keys = keys;\n\t\thook.#stringTag = `Hook(${keys.join('.')})`;\n\t\treturn hook;\n\t}\n\t/**\n\t * @param {T extends (...args: infer A) => any ? A : []} args \n\t * @returns \n\t */\n\tcall(...args) {\n\t\tfor (const fn of this.values()) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tfn(...args);\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {string} plugin \n\t * @returns {T | void}\n\t */\n\tfirst(plugin) {\n\t\tconst hooks = this.#hooks;\n\t\tif (!Object.hasOwn(hooks, plugin)) { return; }\n\t\treturn first(hooks[plugin], this.#keys.filter(Boolean));\n\t}\n\n\t/**\n\t * \n\t * @param {string} plugin \n\t * @returns {IterableIterator<T extends readonly (infer V)[] ? V : T>}\n\t */\n\t*plugin(plugin) {\n\t\tconst hooks = this.#hooks;\n\t\tif (!Object.hasOwn(hooks, plugin)) { return; }\n\t\tyield* findHook(hooks[plugin], this.#keys.filter(Boolean));\n\t}\n\n\t/**\n\t * \n\t * @returns {IterableIterator<T extends readonly (infer V)[] ? V : T>}\n\t */\n\tvalues() { return values(this.#hooks, this.#keys); }\n\n\t/**\n\t * \n\t * @returns {IterableIterator<[string, T extends readonly (infer V)[] ? V : T]>}\n\t */\n\t*entries() {\n\t\tconst hooks = this.#hooks;\n\t\tconst name = this.#keys;\n\t\tfor (const [plugin, it] of Object.entries(hooks)) {\n\t\t\tfor (const value of findHook(it, name)) {\n\t\t\t\tyield [plugin, value];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @template [TX=(T extends Record<string, infer TT>? TT extends readonly (infer V)[] ? V : TT : never)]\n\t * @param {(v: *)=>v is TX} filter \n\t * @returns {IterableIterator<[plugin: string, key: string, value: TX]>}\n\t */\n\t*entriesObject(filter = noopFilter) {\n\t\tfor (const [plugin, hooksMap] of this.entries()) {\n\t\t\tif (!hooksMap || typeof hooksMap !== 'object') { continue; }\n\t\t\tfor (const [k, v] of Object.entries(hooksMap)) {\n\t\t\t\tif (!filter(v)) { continue; }\n\t\t\t\tyield [plugin, k, v];\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/**\n\t * @template [TT=(T extends Record<string, infer TT> ? TT : never)]\n\t * @param {(v: *)=>v is TT} [filter] \n\t * @returns {Record<string, TT>}\n\t */\n\tnamed(filter = noopFilter) {\n\t\t/** @type {Record<string, TT>} */\n\t\tconst result = Object.create(null);\n\t\tfor (const hooksMap of this.values()) {\n\t\t\tif (!hooksMap || typeof hooksMap !== 'object') { continue; }\n\t\t\tfor (const [k, v] of Object.entries(hooksMap)) {\n\t\t\t\tif (!filter(v)) { continue; }\n\t\t\t\tresult[k] = v;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t * @param {() => void} fn \n\t * @param {number} [hysteresis] \n\t * @returns \n\t */\n\tlisten(fn, hysteresis) {\n\t\tif (typeof fn !== 'function') { return () => { }; }\n\t\tconst resetFn = this.#config.resetFn;\n\t\t/** @type {[() => void, number]} */\n\t\tconst it = [fn, Number.isFinite(hysteresis) && hysteresis || 0];\n\t\tresetFn.push(it);\n\t\tresetFn.sort(([, a], [, b]) => b - a);\n\t\treturn () => {\n\t\t\tconst index = resetFn.findIndex(v => v === it);\n\t\t\tif (index >= 0) {\n\t\t\t\tresetFn.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n}\n","import * as Pattern from './Pattern/index.mjs';\nconst regex = /\\{([^}{}]+)\\}/g\n/**\n * \n * @param {string?} [pattern] \n */\nexport function getPatternFields(pattern) {\n\tif (!pattern || typeof pattern !== 'string') { return []; }\n\t/** @type {string[]} */\n\tconst fields = [];\n\tfor(let result = regex.exec(pattern); result; result = regex.exec(pattern)) {\n\t\tfields.push(result[1]);\n\t}\n\treturn fields;\n}\n\n/**\n * @protected\n * @param {string?} [pattern] \n * @param {Record<string, any>?} [document] \n * @returns \n */\nexport function runPattern(pattern, document) {\n\treturn Pattern.generate(pattern, document);\n}\n","/** @import { Permission } from '@yongdall/types' */\n\n\n\n\n\n/**\n *\n * @param {Permission} permission\n * @returns {Iterable<string>}\n */\nexport default function* yieldPermissionConstraintFields({ constraints, organizationField }) {\n\tif (organizationField) { yield organizationField; }\n\tif (!constraints) { return; }\n\tfor (const [field, constraint] of Object.entries(constraints)) {\n\t\tif (!constraint) { continue; }\n\t\tconst { value, values, user } = constraint;\n\t\tif (value !== undefined) {\n\t\t\tyield field;\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tyield field;\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tyield field;\n\t\t} else if (user) {\n\t\t\tyield field;\n\t\t}\n\t}\n}\n","export * as Search from './Search/index.mjs';\nexport * as datetime from './Datetime.mjs';\nexport * as pattern from './Pattern/index.mjs';\nexport { transformError } from './transformError.mjs';\nexport { Hook } from './Hook.mjs';\nexport * from './model.mjs';\nexport { default as yieldPermissionConstraintFields } from './yieldPermissionConstraintFields.mjs';\n\n\nexport const pluginIdRegex = /^(?:(?<scope>@[a-zA-Z\\d_.-]+)\\/)?(?<name>[a-zA-Z\\d_.-]+)$/;\nexport const findPluginIdRegex = /^(?<pluginId>(?:(?<scope>@[a-zA-Z\\d_.-]+)\\/)?(?<name>[a-zA-Z\\d_.-]+))(?:\\/(?<path>[^#]*))?(?:#(?<hash>.*))?$/;\n\n/**\n * @typedef {object} Plugin\n * @property {string} [version]\n * @property {Record<string, string>} [assets]\n * @property {string} [hooks]\n * @property {string[]} [styles]\n */\n/**\n * @typedef {object} BootConfiguration\n * @property {string} [id] \n * @property {string} [route] 路由管理器\n * @property {string} [theme] 界面主题\n * @property {string} [authenticator] 登陆器\n * @property {boolean} [authRequired] 是否强制登陆\n * @property {string} [skin]\n * @property {boolean} [multiUser] \n * @property {string} [domain] \n * @property {string | number} [port] \n * @property {string} [path] \n * @property {Record<string, string>} [pages]\n * @property {Record<string, string>} [configurationPages]\n * \n * \n * @property {string} [logo] \n * @property {string} [title] \n * @property {string} [company] \n * @property {string} [type] \n * @property {string} [help] 帮助链接\n * @property {any[]} [userMenus]\n * @property {any[]} [menus]\n */\n/**\n * @typedef {object} Importmap\n * @property {Record<string, string>} imports\n * @property {Record<string, Record<string, string>>} scopes\n */\n/**\n * @typedef {object} Indicator\n * @property {string} color\n * @property {string} label\n * @property {unknown} [filters]\n */\n\n/**\n *\n * @param {*} v\n * @returns {v is (...p: any[]) => any}\n */\nexport function isFunction(v) {\n\treturn typeof v === 'function';\n}\n","/** @import { Hooks } from './typesDefine.mjs' */\n/** @import { PageRenderer } from './route/index.mjs' */\nimport { Hook } from '@yongdall/common';\nimport { createState } from './signal.mjs';\nconst hookState = createState(/** @type {Record<string, Hook.Define<Hooks>>} */({}));\n/** @type {Hook<Hooks>} */\n// @ts-ignore\nexport const allHooks = Hook.build(() => hookState.get());\n/** @typedef {Object.<'main' | 'details' | 'setting' | 'input' | 'edit', string | PageRenderer>} ContinuationDefine */\n\n/**\n * \n * @param {Record<string, Hook.Define<Hooks>>} hooks \n */\nexport function updateHooks(hooks) {\n\thookState.set(hooks);\n\tHook.reset(allHooks);\n}\n","/** @import { FieldFilterComponent, FieldComponent, FieldFilterFns, FieldFilter } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed } from '../signal.mjs';\n/**\n * @typedef {Object} FieldFilterOptions\n * @property {FieldFilterComponent} component - 过滤器组件\n * @property {string} [label] - 标签文本\n */\n/**\n* @typedef {Object} FilterFns\n* @property {FieldFilter.Value[]} value\n* @property {FieldFilter.Value[]} notValue\n* @property {FieldFilter.Named[]} named\n* @property {FieldFilter.Named[]} notNamed\n* @property {FieldFilter.Field[]} field\n* @property {FieldFilter.Field[]} notField\n*/\n\n/**\n * \n * @param {string} type\n * @param {string | boolean} [renderer] \n * @param {boolean} [array] \n * @returns \n */\nfunction getSetKey(type, renderer, array) {\n\tconst rendererName = typeof renderer === 'string' ? renderer : '';\n\tconst arrayKey = renderer === true || array === true ? '[]' : '';\n\tif (!type || type === '.') {\n\t\tif (!rendererName) { return; }\n\t\treturn `:${rendererName}${arrayKey}`;\n\t}\n\tif (!rendererName) { return `${type}${arrayKey}`; }\n\treturn `${type}:${rendererName}${arrayKey}`;\n}\n\n\n\n/**\n * \n * @param {boolean?} where \n */\nfunction toNot(where) {\n\treturn typeof where === 'boolean' ? !where : where;\n}\nconst inputState = createComputed(() => {\n\t/** @type {Map<string, FieldComponent>} */\n\tconst allInputs = new Map();\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, input } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t);\n\t\tif (!key) { continue; }\n\t\tif (typeof input === 'function') {\n\t\t\tallInputs.set(key, input);\n\t\t}\n\t}\n\treturn allInputs;\n});\nconst filterFnState = createComputed(() => {\n\t/** @type {Record<string, Record<string, FilterFns>>} */\n\tconst allFilters = {};\n\t/** @type {Record<string, Record<string, FilterFns>>} */\n\tconst allNotFilters = {};\n\t/**\n\t * \n\t * @param {Record<string, FilterFns>} filterMap \n\t * @param {Record<string, FilterFns>} notFilterMap \n\t * @param {FieldFilterFns} param2 \n\t * @param {string} [operator] \n\t */\n\tfunction setFilterFns(\n\t\tfilterMap,\n\t\tnotFilterMap,\n\t\t{ not, value, notValue, named, notNamed, field, notField },\n\t\toperator = '',\n\t) {\n\t\tif (not) {\n\t\t\tif (typeof value === 'function' && typeof typeof notValue !== 'function') {\n\t\t\t\tnotValue = (...p) => toNot(value(...p));\n\t\t\t}\n\t\t\tif (typeof field === 'function' && typeof typeof notField !== 'function') {\n\t\t\t\tnotField = (...p) => toNot(field(...p));\n\t\t\t}\n\t\t\tif (typeof named === 'function' && typeof typeof notNamed !== 'function') {\n\t\t\t\tnotNamed = (...p) => toNot(named(...p));\n\t\t\t}\n\t\t}\n\n\t\tconst typeFilter = Object.hasOwn(filterMap, operator)\n\t\t\t&& filterMap[operator]\n\t\t\t|| { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\tfilterMap[operator] = typeFilter;\n\t\tif (typeof value === 'function') { typeFilter.value.push(value); }\n\t\tif (typeof notValue === 'function') { typeFilter.notValue.push(notValue); }\n\t\tif (typeof named === 'function') { typeFilter.named.push(named); }\n\t\tif (typeof notNamed === 'function') { typeFilter.notNamed.push(notNamed); }\n\t\tif (typeof field === 'function') { typeFilter.field.push(field); }\n\t\tif (typeof notField === 'function') { typeFilter.notField.push(notField); }\n\t\tconst notOp = typeof not === 'string' && not || '';\n\t\tif (!notOp) { return; }\n\n\t\tconst notTypeFilter = Object.hasOwn(notFilterMap, notOp)\n\t\t\t&& notFilterMap[notOp]\n\t\t\t|| { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\tnotFilterMap[notOp] = typeFilter;\n\n\t\tif (typeof value === 'function') { notTypeFilter.notValue.push(value); }\n\t\tif (typeof notValue === 'function') { notTypeFilter.value.push(notValue); }\n\t\tif (typeof named === 'function') { notTypeFilter.notNamed.push(named); }\n\t\tif (typeof notNamed === 'function') { notTypeFilter.named.push(notNamed); }\n\t\tif (typeof field === 'function') { notTypeFilter.notField.push(field); }\n\t\tif (typeof notField === 'function') { notTypeFilter.field.push(notField); }\n\n\t}\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, filters } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t) || (array ? '[]' : '');\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst filterMap = Object.hasOwn(allFilters, key) && allFilters[key] || {};\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst notFilterMap = Object.hasOwn(allNotFilters, key) && allNotFilters[key] || {};\n\t\tsetFilterFns(filterMap, notFilterMap, field);\n\n\t\tfor (const [operator, fieldFilter] of Object.entries(filters || {})) {\n\t\t\tif (!fieldFilter || Array.isArray(fieldFilter) || typeof fieldFilter !== 'object') { continue; }\n\t\t\tsetFilterFns(filterMap, notFilterMap, fieldFilter, operator);\n\t\t}\n\t\tallFilters[key] = filterMap;\n\t\tallNotFilters[key] = notFilterMap;\n\t}\n\tfor (const type of Object.keys({ ...allFilters, ...allNotFilters })) {\n\t\tconst notTypeFilters = Object.hasOwn(allNotFilters, type) && allNotFilters[type];\n\t\tif (!notTypeFilters) { continue; }\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst typeFilters = Object.hasOwn(allFilters, type) && allFilters[type] || {};\n\t\tallFilters[type] = typeFilters;\n\n\t\tfor (const op of Object.keys({ ...typeFilters, ...notTypeFilters })) {\n\t\t\tconst notOpFilters = Object.hasOwn(notTypeFilters, op) && notTypeFilters[op];\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\t/** @type {FilterFns} */\n\t\t\tconst opFilters = Object.hasOwn(typeFilters, op) && typeFilters[op] || { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\t\ttypeFilters[op] = opFilters;\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\tfor (const fn of notOpFilters.value) { opFilters.value.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notValue) { opFilters.notValue.push(fn); }\n\t\t\tfor (const fn of notOpFilters.named) { opFilters.named.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notNamed) { opFilters.notNamed.push(fn); }\n\t\t\tfor (const fn of notOpFilters.field) { opFilters.field.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notField) { opFilters.notField.push(fn); }\n\t\t}\n\t}\n\treturn allFilters;\n});\nconst filterState = createComputed(() => {\n\t/** @type {Map<string, Map<string, {component: FieldFilterComponent; label?: string}>>} */\n\tconst allFilters = new Map();\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, filter, filters } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t);\n\t\tif (!key) { continue; }\n\t\t/** @type {Map<string, {component: FieldFilterComponent; label?: string}>} */\n\t\tconst filterMap = allFilters.get(key) || new Map();\n\t\tif (typeof filter === 'function') {\n\t\t\tconst item = filterMap.get('');\n\t\t\tif (!item) {\n\t\t\t\tfilterMap.set('', { component: filter, label: '=' });\n\t\t\t} else {\n\t\t\t\titem.component = filter;\n\t\t\t}\n\t\t}\n\t\tfor (const [operator, fieldFilter] of Object.entries(filters || {})) {\n\t\t\tif (!fieldFilter) { continue; }\n\t\t\tconst filter = Array.isArray(fieldFilter) ? fieldFilter[0]\n\t\t\t\t: typeof fieldFilter === 'function' ? fieldFilter\n\t\t\t\t\t: fieldFilter.filter;\n\t\t\tif (typeof filter !== 'function') { continue; }\n\t\t\tconst label = Array.isArray(fieldFilter) ? fieldFilter[1]\n\t\t\t\t: typeof fieldFilter === 'object' ? fieldFilter.label : null;\n\t\t\tconst item = filterMap.get(operator);\n\t\t\tif (!item) {\n\t\t\t\tfilterMap.set(operator, { component: filter, label: typeof label === 'string' ? label : '' });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\titem.component = filter;\n\t\t\tif (typeof label === 'string') { item.label = label; }\n\t\t}\n\t\tif (filterMap.size) {\n\t\t\tallFilters.set(key, filterMap);\n\t\t}\n\t}\n\treturn allFilters;\n});\n\nexport function getAllFilterFns() {\n\treturn filterFnState.get();\n}\n/**\n * \n * @param {string | {component: string; [k: string]: any} | (string | {component: string; [k: string]: any})[]} [def] \n * @returns {Iterable<[renderer: string, options?: object]>}\n */\nfunction* getRenderer(def) {\n\tif (!def) { return; }\n\tfor (const s of Array.isArray(def) ? def : [def]) {\n\t\tif (!s) { continue; }\n\t\tif (typeof s === 'string') {\n\t\t\tyield [s];\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof s !== 'object') { continue; }\n\t\tconst component = s.component;\n\t\tif (!component || typeof component !== 'string') { continue; }\n\t\tyield [component, s];\n\t}\n}\n/**\n * \n * @param {string | FieldScriptConfiguration} field \n * @returns {Iterable<[renderer: string, options?: object]>}\n */\nfunction* getKey(field) {\n\tif (!field) { return; }\n\tconst type = typeof field === 'string' ? field : field.type;\n\tconst renderers = typeof field === 'string' ? '' : field.renderer;\n\tconst array = typeof field === 'string' ? '' : field.array ? '[]' : '';\n\tif (!type) {\n\t\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\t\tyield [`:${renderer}${array}`, options];\n\t\t\tyield [`${renderer}${array}`, options];\n\t\t}\n\t\treturn;\n\t}\n\tif (typeof type === 'object') {\n\t\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\t\tyield [`submodel:${renderer}${array}`, options];\n\t\t\tyield [`${renderer}${array}`, options];\n\t\t}\n\t\tyield [`submodel${array}`];\n\t\treturn;\n\t}\n\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\tyield [`${type}:${renderer}${array}`, options];\n\t\tyield [`:${renderer}${array}`, options];\n\t\tyield [`${renderer}${array}`, options];\n\t}\n\tyield [`${type}${array}`];\n}\n\n/**\n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {false} [skip]\n * @returns {FieldComponent}\n */\n/**\n * \n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {true} skip\n * @returns {FieldComponent?}\n */\n/**\n * \n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {boolean} [skip]\n * @returns {FieldComponent?}\n */\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {boolean} [skip]\n * @returns {FieldComponent?}\n */\nexport function getField(field, skip) {\n\tconst inputs = inputState.get();\n\tfor (const [k, options] of getKey(field)) {\n\t\tconst v = inputs.get(k);\n\t\tif (v) { return ctx => v(ctx, options); }\n\t}\n\tif (skip) { return null; }\n\tconst type = typeof field === 'string' ? field : field.type;\n\treturn () => document.createElement('div');\n}\n\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @returns {boolean}\n */\nexport function hasField(field) {\n\tconst inputs = inputState.get();\n\tfor (const [k] of getKey(field)) {\n\t\tconst v = inputs.get(k);\n\t\tif (v) { return true; }\n\t}\n\tconst type = typeof field === 'string' ? field : field.type;\n\treturn false;\n}\n\n\n\n/** @type {FieldFilterComponent} */\nconst defaultFieldFilter = () => document.createElement('div');\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {string} operator \n * @returns {FieldFilterComponent}\n */\nexport function getFieldFilter(field, operator) {\n\tconst filters = filterState.get();\n\tfor (const [k, options] of getKey(field)) {\n\t\tconst filter = filters.get(k)?.get(operator);\n\t\tif (!filter) { continue; }\n\t\tconst component = filter.component;\n\t\treturn ctx => component(ctx, options);\n\t}\n\treturn defaultFieldFilter;\n}\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @returns {Record<string, string>}\n */\nexport function getFieldFilterOperators(field) {\n\tconst filters = filterState.get();\n\tconst operators = Object.create(null);\n\tfor (const [k] of getKey(field)) {\n\t\tconst filter = filters.get(k);\n\t\tif (!filter) { continue; }\n\t\tfor (const [operator, { label }] of filter) {\n\t\t\tif (operators[operator]) { continue; }\n\t\t\toperators[operator] = label;\n\t\t}\n\t}\n\treturn operators;\n}\n\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {string} operator \n * @returns {boolean}\n */\n\nexport function hasFieldFilter(field, operator) {\n\tconst filters = filterState.get();\n\tfor (const [k] of getKey(field)) {\n\t\tconst v = filters.get(k);\n\t\tif (v?.has(operator)) { return true; }\n\t}\n\treturn false;\n}\n\n/**\n * \n * @param {FieldScriptConfiguration | boolean} field \n * @param {string} operator \n */\nexport function* getFilterFns(field, operator) {\n\tconst filters = filterFnState.get();\n\tfor (const [k] of typeof field === 'boolean' ? field ? [['[]'], ['']] : [['']] : getKey(field)) {\n\t\tconst v = Object.hasOwn(filters, k) && filters[k];\n\t\tif (!v) { continue; }\n\t\tconst op = Object.hasOwn(v, operator) && v[operator];\n\t\tif (!op) { continue; }\n\t\tyield op;\n\t}\n\tconst k = '';\n\tconst v = Object.hasOwn(filters, k) && filters[k];\n\tif (!v) { return; }\n\tconst op = Object.hasOwn(v, operator) && v[operator];\n\tif (!op) { return; }\n\tyield op;\n}\n","export const pathRoots = {\n\tapi: '/api',\n\tfile: '/fileCabinets',\n};\nexport default pathRoots;\n","const regex = /^((?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)[t| ])?(?<h>2[0-3]|[01]\\d):(?<m>[0-5]\\d)(?::(?<s>[0-5]\\d(?:(\\.\\d{1,3})?)))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?$/i;\n\nexport function toTimeZone(date = new Date) {\n\tlet tzo = date.getTimezoneOffset();\n\tif (!tzo) { return 'Z'; }\n\tconst s = tzo < 0 ? '+' : '-';\n\ttzo = Math.abs(tzo);\n\treturn s + [Math.floor(tzo / 60), tzo % 60].map(v => `${v}`.padStart(2, '0')).join(':');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTime(date) {\n\treturn [\n\t\tdate.getHours(),\n\t\tdate.getMinutes(),\n\t\tdate.getSeconds(),\n\t].map(v => `${v}`.padStart(2, '0')).join(':');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDate(date) {\n\treturn [\n\t\t`${date.getFullYear()}`.padStart(4, '0'),\n\t\t`${date.getMonth() + 1}`.padStart(2, '0'),\n\t\t`${date.getDate()}`.padStart(2, '0'),\n\t].join('-');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimetz(date) {\n\treturn toTime(date) + `.${date.getMilliseconds()}`.padStart(3, '0') + toTimeZone(date);\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetime(date) {\n\treturn toDate(date) + ' ' + toTime(date);\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimestamp(date) {\n\treturn toDate(date) + 'T' + toTimetz(date);\n}\n\n/**\n * \n * @param {string | Date | null | number} [val] \n * @returns \n */\nexport function parseDate(val) {\n\tif (!val) { return null; }\n\tif (val instanceof Date) { return val.valueOf() ? val : null; }\n\tif (typeof val === 'number') { return new Date(val); }\n\tif (typeof val !== 'string') { return null; }\n\tconst groups = regex.exec(val)?.groups;\n\tif (!groups) { return null; }\n\tconst currentDate = new Date;\n\tconst { Y, M,D, h, m, s, tz } = groups\n\tconst tzx = tz === 'z' || tz === 'Z' || tz.includes(':') ? tz : tz ? `${tz}:00` : toTimeZone(currentDate);\n\treturn new Date(`${Y || currentDate.getFullYear()}-${M || currentDate.getMonth() + 1}-${D || currentDate.getDate()}T${h}:${m}:${s || '00'}${tzx}`);\n}\n","import DotRequest from 'dot-request';\nimport pathRoots from './paths.mjs';\nimport { toTimestamp } from './utils/date.mjs';\n\nclass ARequest extends DotRequest {\n\tbuild() {\n\t\treturn new ARequest();\n\t}\n\t/**\n\t * \n\t * @param {string} method \n\t * @param {string} [path] \n\t * @returns \n\t */\n\tmethod(method, path) {\n\t\treturn super.method('POST', path).header('X-Method', method);\n\t}\n}\n\n/**\n * \n * @param {Response} response \n * @returns \n */\nexport async function errorHandler(response) {\n\tconst contentType = response.headers.get(\"content-type\")\n\t\t?.split(';')[0].replace(/\\s+/g, '').toLowerCase() || '';\n\tif (contentType === 'application/json' || contentType === 'text/json') {\n\t\treturn await response.json().then(v => Promise.reject(v?.error), v => Promise.reject(null));\n\t}\n\tif (contentType === \"text/plain\") {\n\t\treturn await response.text().then(v => Promise.reject(v));\n\t}\n\treturn Promise.reject(response);\n}\n/**\n * \n * @param {Response} r \n * @returns \n */\nexport function userErrorHandler(r) {\n\tif (r.status === 401) {\n\t\t// logout();\n\t}\n\treturn errorHandler(r);\n\n}\n/**\n * @callback ErrorAlerter\n * @param {*} error \n * @returns {PromiseLike<void> | void}\n */\n/**\n * @param {*} error \n * @returns {PromiseLike<void> | void}\n */\nexport function ErrorAlerter(error) {\n\tif (!error || error instanceof Response) { return alert('未知'); }\n\tif (typeof error === 'string') { return alert(error); }\n\tif (typeof error !== 'object') { return; }\n\tlet { message, code } = error;\n\tif (typeof message !== 'string') { message = ''; }\n\tif (typeof code !== 'string') { code = ''; }\n\tif (!message && !code) { return; }\n\talert([\n\t\tmessage || '为止错误',\n\t\tcode ? `[${code}]` : '',\n\t].filter(Boolean).join(' '));\n}\n/** @type {ErrorAlerter} */\nlet alertError = ErrorAlerter;\n/**\n * \n * @param {Response} r \n * @returns \n */\nexport function errorShowHandler(r) {\n\treturn userErrorHandler(r).catch(async error => {\n\t\tawait alertError(error);\n\t\treturn Promise.reject(error);\n\t});\n}\n\nexport const baseRequest = new ARequest().get().prefix(pathRoots.api).stringifyJSON(v => {\n\treturn JSON.stringify(v, (key, value) => {\n\t\tif (value instanceof Date) { return toTimestamp(value); }\n\t\tif (typeof value === 'bigint') { return String(value); }\n\t\tif (value instanceof Set) { return [...value]; }\n\t\treturn value;\n\t});\n}).errorHandler(errorHandler);\nconst request = baseRequest.clone().errorHandler(errorShowHandler);\nexport default request;\n/**\n * \n * @param {ErrorAlerter?} [fn] \n */\nexport function setErrorAlerter(fn) {\n\tif (typeof fn === 'function') { alertError = fn; }\n}\n","import { baseRequest } from './request.mjs';\nimport { createState } from './signal.mjs';\n/** @import { Plugin, BootConfiguration } from '@yongdall/common' */\n\n/** @type {BootConfiguration} */\nexport const configuration = await baseRequest.clone().get`application`.query({\n\tdomain: location.hostname,\n\tport: location.port,\n\tpath: location.pathname,\n}).json();\n\n/** @type {Record<string, Plugin>} */\n// @ts-ignore\nexport const plugins = window.yongdallPlugins;\n\nconst applicationId = configuration.id;\nexport const pages = configuration.pages || {};\n\n\nconst webRoot = new URL(configuration.path || '/workbench/', location.origin);\nconst root = webRoot.href;\nconst path = webRoot.pathname;\n\nconst menus = createState(configuration.menus || []);\nconst userMenus = createState(configuration.userMenus || []);\n\nconst refreshing = createState(false);\nasync function refresh() {\n\tif (refreshing.get()) { return; }\n\trefreshing.set(true);\n\ttry {\n\t\t/** @type {BootConfiguration} */\n\t\tconst application = await baseRequest.clone().get`applications`.append(`${applicationId}`).json();\n\t\tif (!configuration || typeof application !== 'object') { return; }\n\t\tmenus.set(application.menus || []);\n\t\tuserMenus.set(application.userMenus || []);\n\n\n\t} finally {\n\t\trefreshing.set(false);\n\n\t}\n}\n\n\nexport const application = {\n\tget id() { return applicationId; },\n\tget path() { return path; },\n\tget root() { return root; },\n\n\tget theme() { return configuration.theme; },\n\tget route() { return configuration.route; },\n\tget authenticator() { return configuration.authenticator; },\n\tget skin() { return configuration.skin; },\n\n\n\tget menus() { return menus.get(); },\n\tget userMenus() { return userMenus.get(); },\n\tget logo() { return configuration.logo; },\n\tget title() { return configuration.title; },\n\tget company() { return configuration.company; },\n\tget help() { return configuration.help; },\n\n\tget refreshing() { return refreshing.get(); },\n\trefresh,\n};\n\nexport default configuration;\n","\n/**\n * @template {(...args: any) => any} T\n * @param {T} fn \n * @param {(...p: Parameters<T>) => string} getKey \n * @param {(...p: Parameters<T>) => boolean} [isForce] \n * @returns {T}\n */\nexport function createStates(fn, getKey, isForce) {\n\t/** @type {Record<string, ReturnType<T>>} */\n\tconst data = {};\n\t/**\n\t * @param {Parameters<T>} params\n\t * @returns {ReturnType<T>}\n\t */\n\t function run(...params) {\n\t\tconst key = getKey(...params);\n\t\tif (Object.hasOwn(data, key) && !isForce?.(...params)) {\n\t\t\treturn data[key];\n\t\t}\n\t\tconst result = fn(...params);\n\t\tdata[key] = result;\n\t\treturn result;\n\t};\n\treturn /** @type {T} */(run);\n}\n","/** @import { Permissions } from '@yongdall/types' */\n/** @import { State } from './signal.mjs' */\nimport { configuration } from './configuration.mjs';\nimport { createStates } from './utils/state.mjs';\nimport { baseRequest } from './request.mjs';\nimport { allHooks } from './allHooks.mjs';\nimport { createComputed, createState } from './signal.mjs';\nconst { authRequired, multiUser } = configuration;\n\n\n/**\n * 用户类型定义\n * @typedef {Object} User\n * @property {string} id - 用户ID\n * @property {string} name - 显示名称\n * @property {string} [avatar] - 用户头像\n * @property {string[]} [permissions]\n * @property {Record<string, string[]>} [organizationPermissions]\n * @property {Record<string, string[]>} [organizationRoles]\n * @property {Record<string, string[]>} [organizationRolePermissions]\n * @property {Record<string, Record<string, any>>} [plugins] \n */\n\n/** @type {State<User?>} */\nconst sessionUserState = createState(/** @type {User?} */(null));\n/** @type {State<User?>} */\nconst targetUserState = createState(/** @type {User?} */(null));\nconst currentUserState = createComputed(() => targetUserState.get() || sessionUserState.get());\n\n\n/** @type {<T extends Record<string, any>>(pluginId: string) => { readonly session: T?; readonly target: T?; readonly current: T?}} */\nconst userPlugin = createStates((pluginId) => {\n\t/** @type {State<any?>} */\n\tconst session = createComputed(() => sessionUserState.get()?.plugins?.[pluginId] || null);\n\t/** @type {State<any?>} */\n\tconst target = createComputed(() => targetUserState.get()?.plugins?.[pluginId] || null);\n\t/** @type {State<any?>} */\n\tconst current = createComputed(() => currentUserState.get()?.plugins?.[pluginId] || null);\n\treturn {\n\t\tget session() { return session.get(); },\n\t\tget target() { return target.get(); },\n\t\tget current() { return current.get(); },\n\t};\n}, pluginId => pluginId || '');\n\nconst single = createState(false);\nconst needLogin = createState(false);\nconst waitLogin = createComputed(() => {\n\tif (needLogin.get()) { return true; }\n\tif (!authRequired) { return false; }\n\tif (single.get()) { return false; }\n\tif (sessionUserState.get()) { return false; }\n\treturn true;\n});\n\n\n/**\n * @param {string[]} permissions \n * @returns {Set<string>}\n */\nfunction toPermissions(permissions) {\n\treturn new Set(permissions.filter(v => v && typeof v === 'string'));\n\n}\n/**\n * \n * @param {User} user \n * @returns {Set<string>}\n */\nfunction getPermissions(user) {\n\tconst plugins = user.plugins;\n\tif (plugins && typeof plugins === 'object') {\n\t\tfor (const [pluginId, get] of allHooks.get('user').get('permissions')) {\n\t\t\tif (typeof get !== 'function') { continue; }\n\t\t\tif (!Object.hasOwn(plugins, pluginId)) { continue; }\n\t\t\tconst plugin = plugins[pluginId];\n\t\t\tif (!plugin || typeof plugin !== 'object') { continue; }\n\t\t\tconst p = get(plugin, user);\n\t\t\tif (!(p instanceof Set)) { continue; }\n\t\t\treturn p;\n\t\t}\n\t}\n\tconst permissions = user.permissions;\n\tif (!Array.isArray(permissions)) { return new Set(); }\n\treturn toPermissions(permissions);\n}\n/**\n * \n * @param {User} user \n * @returns {Record<string, Set<string>>?}\n */\nfunction getOrganizationPermissions(user) {\n\tconst plugins = user.plugins;\n\tif (plugins && typeof plugins === 'object') {\n\t\tfor (const [pluginId, get] of allHooks.get('user').get('organizationPermissions')) {\n\t\t\tif (typeof get !== 'function') { continue; }\n\t\t\tif (!Object.hasOwn(plugins, pluginId)) { continue; }\n\t\t\tconst plugin = plugins[pluginId];\n\t\t\tif (!plugin || typeof plugin !== 'object') { continue; }\n\t\t\tconst p = get(plugin, user);\n\t\t\tif (!p) { continue; }\n\t\t\treturn Object.assign(Object.create(null), p);\n\t\t}\n\t}\n\tconst permissions = user.organizationPermissions;\n\tif (permissions && typeof permissions === 'object' && !Array.isArray(permissions)) {\n\t\tconst list = Object.entries(permissions).filter(v => Array.isArray(v[1]));\n\t\tif (list.length) {\n\t\t\treturn Object.assign(\n\t\t\t\tObject.create(null),\n\t\t\t\tObject.fromEntries(list.map(([k, v]) => [k, toPermissions(v)])),\n\t\t\t);\n\t\t}\n\t}\n\tconst { organizationRolePermissions: rolePermissions, organizationRoles: roles } = user;\n\tif (!roles || typeof roles !== 'object' || Array.isArray(roles)) {\n\t\treturn null;\n\t}\n\tif (!rolePermissions || typeof rolePermissions !== 'object' || Array.isArray(rolePermissions)) {\n\t\treturn null;\n\t}\n\treturn Object.assign(\n\t\tObject.create(null),\n\t\tObject.fromEntries(Object.entries(roles).map(([k, v]) => {\n\t\t\tconst permissions = v.flatMap(roleId => Object.hasOwn(rolePermissions, roleId) && rolePermissions[roleId] || []);\n\t\t\treturn [k, toPermissions(permissions)];\n\t\t})),\n\t);\n}\n/** @type {State<Set<string>?>} */\nconst permissions = createComputed(() => {\n\tconst user = currentUserState.get();\n\tif (!user) { return null; }\n\treturn getPermissions(user);\n});\n/** @type {State<Record<string, Set<string>>?>} */\nconst organizationPermissions = createComputed(() => {\n\tconst user = currentUserState.get();\n\tif (!user) { return null; }\n\treturn getOrganizationPermissions(user);\n});\n\nconst allOrganizationPermissions = createComputed(() => {\n\tconst all = organizationPermissions.get();\n\tif (!all) { return null; }\n\treturn new Set(Object.values(all).flatMap(v => [...v]));\n});\n\n/** @returns {Permissions} */\nfunction createPermissions() {\n\tif (single.get()) {\n\t\treturn { has: () => true, get size() { return -1; } };\n\t}\n\treturn new Set();\n}\nexport const User = {\n\tget multi() { return Boolean(multiUser); },\n\tget single() { return single.get(); },\n\t/** 登陆用户 */\n\tget session() { return sessionUserState.get(); },\n\t/** 切换用户 */\n\tget target() { return targetUserState.get(); },\n\t/** 当前用户 */\n\tget current() { return currentUserState.get(); },\n\t/** @param {string} permission */\n\thasPermission(permission) {\n\t\treturn permissions.get()?.has(permission) ?? single.get();\n\t},\n\t/** @param {string} permission @param {string} [organization] */\n\thasOrganizationPermission(permission, organization) {\n\t\tif (typeof organization !== 'string') {\n\t\t\treturn allOrganizationPermissions.get()?.has(permission) ?? single.get();\n\t\t}\n\n\t\tconst organizations = organizationPermissions.get();\n\t\tif (!organizations) { return single.get(); }\n\t\tif (!Object.hasOwn(organizations, organization)) { return false; }\n\t\treturn organizations[organization]?.has(permission) ?? false;\n\t},\n\t/** @returns {Permissions} */\n\tget permissions() { return permissions.get() || createPermissions(); },\n\t/** @returns {Record<string, Permissions | undefined>} */\n\tget organizationPermissions() {\n\t\treturn organizationPermissions.get() || new Proxy({}, {\n\t\t\tget() { return createPermissions(); }\n\t\t});\n\t},\n\t/** @returns {Permissions} */\n\tget allOrganizationPermissions() { return allOrganizationPermissions.get() || createPermissions(); },\n\tget waitLogin() { return waitLogin.get(); },\n\t/**\n\t * @template {Record<string, any>} T\n\t * @param {string} pluginId \n\t * @returns {{ readonly session: T?; readonly target: T?; readonly current: T?}}\n\t */\n\tplugin(pluginId) { return userPlugin(pluginId); },\n\tasync load() {\n\t\tconst { session, target } = await baseRequest.clone().get`user`.json().then(v => v || {}, () => ({}));\n\t\ttargetUserState.set(target || null);\n\t\tif (session === true) {\n\t\t\tsingle.set(true);\n\t\t\tsessionUserState.set(null);\n\t\t} else {\n\t\t\tsingle.set(false);\n\t\t\tsessionUserState.set(session || null);\n\t\t}\n\t\tif (session) { needLogin.set(false); }\n\t\treturn Boolean(session);\n\t},\n\texit() {\n\t\ttargetUserState.set(null);\n\t\tsessionUserState.set(null);\n\t\tbaseRequest.clone().delete`user`.done();\n\t},\n\tlogin(login = true) {\n\t\tneedLogin.set(Boolean(login));\n\t},\n};\n","/** @import { FieldScriptConfiguration, ModelConfiguration, ModelScriptConfiguration } from './types.mjs' */\n\n/**\n * \n * @param {string | string[] | null | void} permission \n */\n\nexport function flatPermission(permission) {\n\tif (!permission) { return []; }\n\tconst list = typeof permission === 'string' ? permission.split('\\n') : permission;\n\tif (!Array.isArray(list)) { return []; }\n\treturn list.filter(v => v && typeof v === 'string');\n\n}\n\n/**\n * \n * @param {object} [options] \n * @param {{has(permission: string): boolean}} [options.permissions] \n * @param {{has(permission: string): boolean}} [options.allOrganizationPermissions] \n * @param {Record<string, {has(permission: string): boolean} | null | undefined>} [options.organizationPermissions] \n * @param {{has(authorization: string): boolean}?} [options.authorizations] \n * @returns {(p: string) => boolean}\n */\nexport function toPermissionFilter({\n\tpermissions,\n\torganizationPermissions,\n\tallOrganizationPermissions,\n\tauthorizations,\n} = {}) {\n\treturn permission => {\n\t\tif (permission[0] === '#') { return authorizations?.has(permission.slice(1)) || false; }\n\t\tconst index = permission.indexOf('&');\n\t\tif (index < 0) { return permissions?.has(permission) || false; }\n\t\tconst orgPerm = permission.slice(0, index);\n\t\tif (!orgPerm) { return false; }\n\t\tconst organization = permission.slice(index + 1);\n\t\tif (!organization) { return allOrganizationPermissions?.has(orgPerm) || false; }\n\t\treturn organizationPermissions?.[organization]?.has(orgPerm) || false;\n\t};\n}\n\n/**\n * \n * @param {string | string[] | null | void} permission \n * @param {{has(permission: string): boolean}} permissions \n * @param {{has(authorization: string): boolean}?} [authorizations] \n */\nexport function filterPermission(permission, permissions, authorizations) {\n\tif (!permission) { return true; }\n\tconst array = flatPermission(permission);\n\tif (!array.length) { return true; }\n\tconst filter = toPermissionFilter({ permissions, authorizations });\n\treturn Boolean(array.find(filter));\n}\n/** @import { Field, Permission } from '@yongdall/types' */\n\nimport { User } from './user.mjs';\n\n/**\n * \n * @param {Permission['constraints']} constraints \n * @param {Record<string, any>?} [data] \n */\nexport function testPermissionConstraints(constraints, data) {\n\tif (!constraints || !data || typeof data !== 'object') { return true; }\n\tfor (const [field, constraint] of Object.entries(constraints)) {\n\t\tif (!constraint) { continue; }\n\t\tconst { value, values, user } = constraint;\n\t\tconst val = data[field];\n\t\tif (value !== undefined) {\n\t\t\tif (val !== value) { return false; }\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tif (!values.includes(val)) { return false; }\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tif (!values.has(val)) { return false; }\n\t\t} else if (user) {\n\t\t\tif (!User.single && val !== User.current?.id) { return false; }\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * \n * @param {Permission} permission \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n * @param {string} [fieldName] \n */\nexport function testPermission({ permission, organizationField, constraints }, data, isNew, fieldName) {\n\tif (!testPermissionConstraints(constraints, data)) { return false; }\n\tif (!permission) { return true; }\n\tif (!organizationField) {\n\t\treturn User.hasPermission(permission);\n\t}\n\tif (organizationField === '_') {\n\t\tif (isNew) {\n\t\t\tif (User.hasOrganizationPermission(permission)) { return true; }\n\t\t}\n\t\treturn false;\n\t}\n\tif (isNew) { return true; }\n\tif (organizationField === fieldName) { return true; }\n\tconst val = String(data?.[organizationField] || '');\n\tif ((!isNew || val)) {\n\t\tif (User.hasOrganizationPermission(permission, val || '')) { return true; }\n\t}\n\treturn true;\n}\n\n/**\n * \n * @param {Permission[]} permissionList \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n */\nexport function getAuthorizations(permissionList, data, isNew) {\n\tconst list = permissionList.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return true; }\n\t\tif (Array.isArray(authorizations)) { return true; }\n\t}).filter(permission => testPermission(permission, data, isNew))\n\t\t.flatMap(({ authorizations }) => authorizations ? [...authorizations] : []);\n\treturn new Set(list);\n}\n\n\n/**\n * \n * @param {string} authorization \n * @param {Permission[]} permissions \n * @param {Record<string, any>} [data] \n * @param {boolean} [isNew] \n * @param {string} [fieldName] \n */\nexport function testPermissions(authorization, permissions, data, isNew, fieldName) {\n\tconst list = permissions.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return authorizations.has(authorization); }\n\t\tif (Array.isArray(authorizations)) { return authorizations.includes(authorization); }\n\t});\n\treturn Boolean(list.find(permission => testPermission(permission, data, isNew, fieldName)));\n}\n/**\n * \n * @param {string} authorization \n * @param {Permission[]} permissions \n * @param {ModelConfiguration | ModelScriptConfiguration} model \n * @returns {Set<string>}\n */\nexport function getPermissionFields(authorization, permissions, model) {\n\tconst userPermissions = permissions.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return authorizations.has(authorization); }\n\t\tif (Array.isArray(authorizations)) { return authorizations.includes(authorization); }\n\t}).filter(({ permission, organizationField }) => {\n\t\tif (!permission) { return true; }\n\t\tif (!organizationField) {\n\t\t\treturn User.hasPermission(permission);\n\t\t}\n\n\t\treturn User.hasOrganizationPermission(permission);\n\t});\n\tif (!userPermissions?.length) { return new Set(); }\n\tconst groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tconst fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\tif (!(groups.size + fieldsAuth.size)) { return new Set(); }\n\n\t/**\n\t *\n\t * @param {[string, (Field | FieldScriptConfiguration) & {group?: string}][]} fields\n\t * @param {string[]} parent\n\t * @returns {Iterable<string>}\n\t */\n\tfunction* filter(fields, parent) {\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif (!field.primary && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tyield key;\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object') { continue; }\n\t\t\tyield* filter(Object.entries(type), fieldNames);\n\t\t}\n\n\t}\n\treturn new Set(filter(Object.entries(model.fields), []));\n\n}\n","/** @import { Schema, Store, StoreLayout } from '@neeloong/form' */\n/** @import { Permission } from '@yongdall/types' */\n/** @import { FieldComponents } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { testPermissions } from '../permission.mjs';\nimport { User } from '../user.mjs';\n\n/**\n * \n * @param {Store} store \n */\nfunction createStoreValueProxy(store) {\n\treturn new Proxy({}, {\n\t\tget(target, p, receiver) {\n\t\t\treturn store.value?.[p];\n\t\t},\n\t\tset() { return false; },\n\t});\n}\n/**\n * \n * @param {string} fieldName\n * @param {boolean?} [def] \n * @param {Permission[]} [permissions]\n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createReadOnlyValue(fieldName, def, permissions, script) {\n\t/** @type {((store: Store) => boolean)?} */\n\tconst f = permissions?.length ? (s) => {\n\t\tconst root = s.root;\n\t\tconst isNew = root.new;\n\t\tconst authorization = isNew ? 'create' : 'update';\n\t\treturn !testPermissions(authorization, permissions, createStoreValueProxy(root), isNew, fieldName);\n\t} : null;\n\tif (typeof script === 'function' && f) {\n\t\treturn (s) => f(s) || Boolean(script(s));\n\t}\n\tif (f) { return f; }\n\tif (typeof script === 'function') {\n\t\treturn (s) => Boolean(script(s));\n\t}\n\treturn typeof def === 'boolean' ? def : null;\n}\n/**\n * \n * @param {string} fieldName\n * @param {FieldScriptConfiguration} field\n * @param {boolean?} [def] \n * @param {Permission[]} [permissions]\n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createHiddenValue(fieldName, field, def, permissions, script) {\n\t/** @type {((store: Store) => boolean)[]} */\n\tconst fns = [];\n\tif (typeof script === 'function') {\n\t\tfns.push(script);\n\t} else if (def === true) {\n\t\treturn true;\n\t}\n\tif (field.uncreatable) {\n\t\tfns.push(store => store.root.new);\n\t}\n\tif (permissions) {\n\t\tfns.push(permissions.length ? (s) => {\n\t\t\tconst root = s.root;\n\t\t\tconst isNew = root.new;\n\t\t\treturn !testPermissions('read', permissions, createStoreValueProxy(root), isNew, fieldName);\n\t\t} : () => !User.single);\n\t}\n\tif (!fns.length) { return null; }\n\treturn (s) => {\n\t\tfor (const f of fns) {\n\t\t\tif (f(s)) { return true; }\n\t\t}\n\t\treturn false;\n\t};\n}\n/**\n * \n * @param {boolean?} [def] \n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createBoolValue(def, script) {\n\tif (typeof script === 'function') {\n\t\treturn (s) => Boolean(script(s));\n\t}\n\treturn typeof def === 'boolean' ? def : null;\n}\n/**\n * \n * @param {FieldScriptConfiguration} field\n * @param {string} name\n * @param {Permission[]?} [permissions] \n * @returns {Schema.Attr}\n */\nfunction createAttr(field, name, permissions) {\n\tconst fieldGroup = field.group || '';\n\tconst script = field.script || {};\n\tconst fieldPermission = permissions?.filter(({ group, fields }) => {\n\t\tif (group === fieldGroup) { return true; }\n\t\tif (Array.isArray(group) && group.includes(fieldGroup)) { return true; }\n\t\tif (fields === name || fields === '*') { return true; }\n\t\tif (!Array.isArray(fields)) { return false; }\n\t\tif (fields.includes(name) || fields.includes('*')) { return true; }\n\t});\n\treturn {\n\t\tmeta: field,\n\t\thidden: createHiddenValue(name, field, field.layout?.hidden, fieldPermission, script?.hidden),\n\t\treadonly: createReadOnlyValue(name, field.readonly, fieldPermission, script.readonly),\n\t\trequired: createBoolValue(field.required, script.required),\n\t\tclearable: createBoolValue(field.clearable, script.clearable),\n\t\tdisabled: createBoolValue(field.disabled, script.disabled),\n\t\tcreatable: !field.uncreatable,\n\t\timmutable: field.immutable,\n\t\tlabel: field.label || name,\n\t\tdescription: field.description,\n\t\tplaceholder: field.placeholder,\n\t\tstep: field.step,\n\t\tmax: field.max,\n\t\tmin: field.min,\n\t\tdefault: script.default || field.default,\n\t\tvalidator: script.validator,\n\t\tvalidators: script.validators,\n\n\t\tevents: {\n\t\t\tinput: script.input,\n\t\t\tchange: script.change,\n\t\t\tclick: script.click,\n\t\t\tfocus: script.focus,\n\t\t\tblur: script.blur,\n\t\t},\n\t};\n}\n/**\n * \n * @param {Record<string, FieldScriptConfiguration>} fields \n * @param {FieldComponents} components \n * @param {Permission[]?} [permissions] \n */\nexport default function toSchema(fields, components, permissions) {\n\t/** @type {Schema} */\n\tlet schema = Object.create(null);\n\tfor (const [name, field] of Object.entries(fields)) {\n\t\tconst component = components[name];\n\t\tconst type = field.type;\n\t\tconst layout = field.layout || {};\n\t\tif (typeof type !== 'object' || !type) {\n\t\t\tschema[name] = {\n\t\t\t\t...createAttr(field, name, permissions),\n\t\t\t\ttype,\n\t\t\t\tarray: Boolean(field.array),\n\t\t\t\tcomponent: typeof component === 'function' ? component : field.script?.component,\n\t\t\t\tlayout: {\n\t\t\t\t\tfield: name,\n\t\t\t\t\tcolStart: layout.colStart,\n\t\t\t\t\tcolSpan: layout.colSpan,\n\t\t\t\t\tcolEnd: layout.colEnd,\n\t\t\t\t\trowStart: layout.rowStart,\n\t\t\t\t\trowSpan: layout.rowSpan,\n\t\t\t\t\trowEnd: layout.rowEnd,\n\t\t\t\t},\n\t\t\t};\n\t\t\tcontinue;\n\n\t\t}\n\t\tconst fields = Object.entries(type).filter(\n\t\t\t/** @type {(v: [string, any]) => v is [string, FieldScriptConfiguration]} */(([, v]) => Boolean(v))\n\t\t);\n\t\tconst levelKey = layout.levelKey || '';\n\t\t/** @type {StoreLayout.Column<any>[]} */\n\t\tconst columns = [];\n\t\tif (levelKey) {\n\t\t\tif (Array.isArray(layout.columns)) {\n\t\t\t\tfor (const { action, actions, field, placeholder, width } of layout.columns) {\n\t\t\t\t\tif (field || width || placeholder) {\n\t\t\t\t\t\tif (field || width) {\n\t\t\t\t\t\t\tcolumns.push({ field, width });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (placeholder && !width) {\n\t\t\t\t\t\t\tcolumns.push({ placeholder });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!columns.length) {\n\t\t\t\tcolumns.push({ actions: ['collapse', 'move'] });\n\t\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t\t.map(([field, define]) => field);\n\t\t\t\tfor (const c of list) {\n\t\t\t\t\tcolumns.push({ field: c });\n\t\t\t\t}\n\t\t\t\tcolumns.push({ placeholder: 1 });\n\t\t\t\tcolumns.push({ actions: ['add', 'remove'] });\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (Array.isArray(layout.columns)) {\n\t\t\t\tfor (const { action, actions, field } of layout.columns) {\n\t\t\t\t\tif (field) {\n\t\t\t\t\t\tcolumns.push({ field });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!columns.length) {\n\t\t\t\tcolumns.push({ actions: ['add', 'trigger', 'move', 'remove', 'serial'] });\n\t\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t\t.map(([field, define]) => field);\n\t\t\t\tfor (const c of list) {\n\t\t\t\t\tcolumns.push({ field: c });\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = toSchema(type, typeof component !== 'function' && component || {}, permissions);\n\n\t\tschema[name] = {\n\t\t\t...createAttr(field, name, permissions),\n\t\t\tlayout: {\n\t\t\t\tfield: name,\n\t\t\t\tfields: Object.entries(children)\n\t\t\t\t\t.sort(([a], [b]) => (type[a]?.layoutOrder || 0) - (type[b]?.layoutOrder || 0))\n\t\t\t\t\t.map(([field, s]) => ({ ...s.layout, field })),\n\t\t\t\tcolumns,\n\t\t\t\tarrayStyle: levelKey ? 'tree' : 'table',\n\t\t\t\tlevelKey,\n\t\t\t\tcolStart: layout.colStart,\n\t\t\t\tcolSpan: layout.colSpan,\n\t\t\t\tcolEnd: layout.colEnd,\n\t\t\t\trowStart: layout.rowStart,\n\t\t\t\trowSpan: layout.rowSpan,\n\t\t\t\trowEnd: layout.rowEnd,\n\t\t\t},\n\t\t\ttype: children,\n\t\t\tarray: Boolean(field.array),\n\t\t\tcomponent: typeof component === 'function' ? component : field.script?.component,\n\t\t};\n\t}\n\treturn schema;\n}\n","/** @import { Importmap } from '@yongdall/common' */\n\n\n/** @type {Importmap} */\nexport let importmap = {imports: {}, scopes: {}};\ntry {\n\tconst {imports = {}, scopes = {}} = JSON.parse(document.querySelector('script[type=importmap]')?.textContent || '');\n\timportmap = {imports, scopes}\n} catch {\n\n}\n\nexport { importmap as default }\n","import { findPluginIdRegex } from '@yongdall/common';\nimport { plugins } from './configuration.mjs';\nimport importmap from './importmap.mjs';\n\n/**\n * @template T\n * @overload\n * @param {string} [id] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\n/**\n * @template T\n * @overload\n * @param {string} [id] \n * @param {string} [pluginId] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\n/**\n * @template T\n * @param {string} [id] \n * @param {((f: string) => Promise<object>) | string} [pluginId] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\nexport async function importWidget(id, pluginId, importFile) {\n\tif (!id) { return; }\n\tif (id[0] === ':') {\n\t\t// TODO: 表示数据库内脚本\n\t}\n\tconst index = id.indexOf('#');\n\tlet file = index < 0 ? id : id.slice(0, index);\n\tif (pluginId && typeof pluginId === 'string') {\n\t\tif (!file || file === '@') {\n\t\t\tfile = pluginId;\n\t\t} else if (file.startsWith('@/')) {\n\t\t\tfile = pluginId + file.slice(1);\n\t\t}\n\t}\n\tconst importFn = [pluginId, importFile].find(\n\t\t/** @type {(v: any) => v is ((f: string) => Promise<object>)} */(\n\t\t\tv => typeof v === 'function'\n\t\t)\n\t) || ((f) => import(f));\n\n\t/** @type {any} */\n\tconst mod = await importFn(file).catch((e) => { console.error(e); });\n\tif (index < 0) { return mod; }\n\tconst key = id.slice(index + 1);\n\tif (!key) { return mod.default; }\n\tlet val = mod;\n\tfor (const k of key.split('.')) {\n\t\tif (!val || typeof val !== 'object') { return; }\n\t\tval = val[k];\n\t}\n\treturn val;\n}\n/**\n * \n * @param {string} path \n * @param {Record<string, string>?} [scope] \n */\nfunction findImport(path, scope) {\n\tif (!scope) { return null; }\n\tconst p = scope[path];\n\tif (p) { return p; }\n\tlet length = 0;\n\t/** @type {string} */\n\tlet base = '';\n\tfor (const item of Object.entries(scope)) {\n\t\tconst [key, target] = item;\n\t\tif (key[key.length - 1] !== '/') { continue; }\n\t\tif (path.startsWith(key) && key.length > length) {\n\t\t\tlength = key.length;\n\t\t\tbase = target;\n\t\t}\n\t}\n\tif (!length) { return null; }\n\tif (base[base.length - 1] !== '/') {\n\t\tbase += '/';\n\t}\n\n\treturn base + path.slice(length);\n\n}\n/**\n * \n * @param {string} path \n * @param {string} root \n */\nfunction importMap(path, root) {\n\tlet bestScopeMatch = '';\n\t/** @type {Record<string, string>?} */\n\tlet scope = null;\n\tfor (const [scopeName, scopeMap] of Object.entries(importmap.scopes)) {\n\t\tif (root.startsWith(scopeName) && scopeName.length > bestScopeMatch.length) {\n\t\t\tbestScopeMatch = scopeName;\n\t\t\tscope = scopeMap;\n\t\t}\n\t}\n\treturn findImport(path, scope) || findImport(path, importmap.imports);\n}\n\n/**\n * 加载样式\n * @param {string} url \n * @param {string} [plugin] \n * @param {boolean} [pluginOnly] \n * @returns {string}\n */\nfunction importURL(url, plugin, pluginOnly) {\n\tconst s = !(pluginOnly && plugin) && findPluginIdRegex.exec(url)?.groups;\n\tif (s) {\n\t\tconst { pluginId, path } = s;\n\t\tconst pluginDefine = Object.hasOwn(plugins, pluginId) && plugins[pluginId] || {};\n\t\tconst VERSION = pluginDefine.version || 'VERSION';\n\t\tconst root = `/assets/plugins/${pluginId}/${VERSION}/`;\n\t\tconst base = location.origin + root;\n\t\tconst u = pluginDefine.assets?.[path] || importMap(url, root);\n\t\tif (u) { return new URL(u, base).href; }\n\n\n\t}\n\n\tconst pluginDefine = plugin && plugins[plugin] || {};\n\tconst VERSION = pluginDefine.version || 'VERSION';\n\tconst root = plugin ? `/assets/plugins/${plugin}/${VERSION}/` : '';\n\t// TODO: 路径处理\n\tconst base = plugin ? location.origin + root : location.href;\n\tif (plugin && url[0] !== '.' && url[0] !== '/') {\n\t\t// TODO: 路径转换\n\t}\n\tconst u = pluginDefine.assets?.[url] || root && importMap(url, root) || url;\n\treturn new URL(u, base).href;\n\n}\n/** @type {Record<string, Promise<HTMLLinkElement>>} */\nconst importCSSMap = Object.create(null);\n/**\n * 加载样式\n * @param {string} url \n * @param {string} [plugin] \n * @param {boolean} [pluginOnly] \n * @returns {Promise<HTMLLinkElement>}\n */\nexport function importStyle(url, plugin, pluginOnly) {\n\tconst link = document.createElement('link');\n\tconst href = importURL(url, plugin, pluginOnly);\n\tconst p = importCSSMap[href];\n\tif (p) { return p; }\n\tconst promise = new Promise((resolve, reject) => {\n\t\tlink.addEventListener('load', () => resolve(link));\n\t\tlink.addEventListener('error', (e) => reject(e.error));\n\t\tlink.href = href;\n\t\tlink.rel = \"stylesheet\";\n\t\tdocument.head.appendChild(link);\n\t});\n\timportCSSMap[href] = promise;\n\tpromise.catch(() => {\n\t\tif (p !== importCSSMap[href]) { return; }\n\t\tdelete importCSSMap[href];\n\t})\n\treturn promise;\n}\n","export class ResponseError extends Error {\n\t/**\n\t * \n\t * @param {number} status \n\t */\n\tconstructor(status) {\n\t\tsuper(`${status}`)\n\t\tthis.status = status;\n\t}\n}\n","/** @import { State } from '../signal.mjs' */\nimport { createState } from '../signal.mjs';\n\n/**\n * @template T\n * @template D\n * @typedef {object} PromisesAndStates\n * @property {(force?: boolean) => Promise<T>} load\n * @property {() => T | D} get\n * @property {() => void} destroy\n */\n/**\n * @template T\n * @template {unknown[]} A\n * @template D\n * @typedef {object} PromisesAndStatesApi\n * @property {(key: string | string[], ...args: A) => PromisesAndStates<T, D>} create\n * @property {(listener: (key: string) => void) => void} listen\n */\n/**\n * @template T\n * @template {unknown[]} A\n * @template D\n * @param {(...a: A) => Promise<T>} run \n * @param {D} def \n * @param {...PromisesAndStatesApi<unknown, any[], unknown>} dependents \n * @returns {PromisesAndStatesApi<T, A, D>}\n */\nexport default function createPromisesAndStates(run, def, ...dependents) {\n\n\t/** @type {Record<string, Promise<T>>} */\n\tconst promises = Object.create(null);\n\t/** @type {Set<string>} */\n\tconst reload = new Set()\n\t/** @type {Record<string, State<T | D> | undefined>} */\n\tconst states = Object.create(null);\n\n\n\t/** @type {Record<string, A | undefined>} */\n\tconst allArgs = Object.create(null);\n\n\t/** @type {((key: string) => void)[]} */\n\tconst listeners = [];\n\t/** @type {Set<string>} */\n\tconst wait = new Set();\n\t/**\n\t * \n\t * @param {string} key \n\t * @param {A} args \n\t */\n\tfunction update(key, args) {\n\t\tconst result = run(...args);\n\t\tpromises[key] = result;\n\t\tresult.then(v => {\n\t\t\tconst state = states[key];\n\t\t\tif (state) { return state.set(v); }\n\t\t\tstates[key] = createState(/** @type {T | D} */(v));\n\t\t\tfor (const l of listeners) {\n\t\t\t\tl(key);\n\t\t\t}\n\t\t}, () => {\n\t\t\tif (promises[key] !== result) { return; }\n\t\t\tdelete promises[key];\n\t\t});\n\t\treturn result;\n\t}\n\t/**\n\t * \n\t * @param {string} key \n\t */\n\tfunction refresh(key) {\n\t\tif (wait.has(key)) { return; }\n\t\twait.add(key);\n\t\trequestIdleCallback(() => {\n\t\t\tif (!wait.has(key)) { return; }\n\t\t\twait.delete(key);\n\t\t\tconst args = allArgs[key];\n\t\t\tif (!args) { return; }\n\t\t\tupdate(key, args);\n\t\t});\n\t}\n\tfor (const d of dependents) {\n\t\td.listen(refresh);\n\t}\n\n\t/**\n\t * \n\t * @param {string | string[]} keys \n\t * @param {A} args \n\t * @returns {PromisesAndStates<T, D>}\n\t */\n\tfunction create(keys, ...args) {\n\t\tconst key = Array.isArray(keys) ? keys.join('\\n') : keys;\n\t\tallArgs[key] = args;\n\t\t/**\n\t\t * \n\t\t * @param {boolean} [force] \n\t\t */\n\t\tfunction load(force) {\n\t\t\tconst promise = !force && Object.hasOwn(promises, key) && promises[key];\n\t\t\tif (promise) { return promise; }\n\t\t\treturn update(key, args);\n\t\t}\n\t\tfunction get() {\n\t\t\tif (!Object.hasOwn(promises, key) || !promises[key] || reload.has(key)) {\n\t\t\t\tupdate(key, args);\n\t\t\t\treload.delete(key);\n\t\t\t}\n\t\t\tlet state = states[key];\n\t\t\tif (!state) {\n\t\t\t\tstate = createState(/** @type {T | D} */(def));\n\t\t\t\tstates[key] = state;\n\n\t\t\t}\n\t\t\treturn state.get();\n\t\t}\n\t\tfunction destroy() {\n\t\t\tif (allArgs[key] !== args) { return; }\n\t\t\tdelete allArgs[key];\n\t\t\tdelete states[key];\n\t\t\tdelete promises[key];\n\t\t}\n\t\treturn { get, load, destroy };\n\n\t}\n\t/**\n\t * \n\t * @param {(key: string) => void} listener \n\t */\n\tfunction listen(listener) {\n\t\tlisteners.push(listener);\n\t}\n\treturn { create, listen };\n}\n","/**\n * @template T\n * @param {() => Promise<T>} load \n * @returns \n */\nexport default function toPromiseInterface(load) {\n\treturn {\n\t\t/**\n\t\t * @template [TResult1=T]\n\t\t * @template [TResult2=never]\n\t\t * @param {((value: T) => TResult1 | PromiseLike<TResult1>)?} [onfulfilled]\n\t\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected]\n\t\t * @returns {Promise<TResult1 | TResult2>};\n\t\t */\n\t\tthen(onfulfilled, onrejected) { return load().then(onfulfilled, onrejected); },\n\t\t/**\n\t\t * @template [TResult2=never]\n\t\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected]\n\t\t * @returns {Promise<T | TResult2>};\n\t\t */\n\t\tcatch(onrejected) { return load().catch(onrejected); },\n\t\t/**\n\t\t * @param {(() => void)?} [onfinally]\n\t\t * @returns {Promise<T>};\n\t\t */\n\t\tfinally(onfinally) { return load().finally(onfinally); },\n\t};\n\n}\n","/** @import { Field, Permission } from '@yongdall/types' */\n/** @import { Search } from '@yongdall/common' */\n/** @import DotRequest from 'dot-request' */\n/** @import { PageConfiguration } from './page.mjs' */\n/** @import { FieldComponent } from '../typesDefine.mjs' */\n\nimport { importWidget } from '../import.mjs';\nimport request, { userErrorHandler } from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n/** @import { Schema, Store, StoreLayout } from '@neeloong/form' */\n/**\n * @typedef {object} ModelConfiguration\n * @property {string} [id] \n * @property {string} [label] \n * @property {Record<string, Field>} fields 字段配置\n * @property {string?} [iconField] 图标字段\n * @property {string?} [imageField] 图像字段\n * @property {string?} [labelField] 标签字段\n * @property {string?} [labelPattern] 标签命名规则\n * @property {Permission[]} [permissions] 权限配置\n * @property {Record<string, unknown>?} [options] 模型选项,关联前端脚本可读取\n * @property {(string | [string, object])[] | null} [scripts] 关联前端脚本\n * @property {Record<string, string | object | null> | null} [pages] 关联默认页面\n * // TODO: 查询配置\n * // TODO: 前端按钮配置\n * // TODO: 是否可销毁、可创建、更新、保存、upsert\n * // TODO: 列表内操作按钮\n * // TODO: 编辑内按钮\n * // TODO: 操作事件\n * // TODO: 是否分页\n */\n\n\n/** @typedef {Omit<Field, 'scripts' | 'type'> & { script?: Omit<FieldScript, 'subFields'>; type: string | Record<string, FieldScriptConfiguration>;}} FieldScriptConfiguration */\n\n/** @typedef {Omit<ModelConfiguration, 'scripts' | 'fields'> & { script?: Omit<ModelScript, 'fields'>; fields: Record<string, FieldScriptConfiguration>;}} ModelScriptConfiguration */\n\n/**\n * @typedef {object} ListScriptParameter\n * @property {ModelScriptConfiguration} model\n * @property {Record<string, any>[]} [checkedDocuments]\n * @property {Record<string, any>[]} [documents]\n */\n/**\n * @typedef {object} DocumentScriptParameter\n * @property {ModelScriptConfiguration} model\n * @property {Record<string, any>} [document]\n * @property {Store} [store]\n */\n/**\n * @typedef {object} ModelScript\n * @property {Record<string, FieldScript>} [fields] 字段配置\n * @property {((document: any, ...fields: (string | number)[]) => void)?} [input]\n * @property {((document: any, ...fields: (string | number)[]) => void)?} [change]\n * @property {((document: any) => void)?} [beforeCreate]\n * @property {((document: any) => void)?} [beforeUpdate]\n * @property {((document: any) => void)?} [beforeSave]\n * @property {((document: any) => void)?} [beforeDestroy]\n * @property {((document: any) => void)?} [beforeUpsert]\n * @property {Record<string, (params: ListScriptParameter) => void>} [listScripts]\n * @property {Record<string, (params: DocumentScriptParameter) => void>} [documentScripts]\n */\n/**\n * @typedef {object} FieldScript\n * @property {Record<string, FieldScript>} [subFields] 子字段配置\n * @property {FieldComponent} [component]\n * @property {((value: InputEvent, store: Store) => void | boolean | null)?} [input]\n * @property {((value: InputEvent, store: Store) => void | boolean | null)?} [change]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [click]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [focus]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [blur]\n * \n * @property {((document: any, field: string, ...fields: (string | number)[]) => void | object)?} [add]\n * @property {((value: any[], document: any, field: string, ...fields: (string | number)[]) => void)?} [remove]\n * @property {((from: number[], to: number, document: any, field: string, ...fields: (string | number)[]) => void)?} [move]\n * \n * @property {((store: Store) => boolean)?} [readonly]\n * @property {((store: Store) => boolean)?} [hidden]\n * @property {((store: Store) => boolean)?} [required]\n * @property {((store: Store) => boolean)?} [clearable]\n * @property {((store: Store) => boolean)?} [disabled]\n * @property {((store: Store) => any)?} [default]\n * \n * @property {((store: Store) => string)?} [label]\n * @property {((store: Store) => string)?} [description]\n * @property {((store: Store) => string)?} [placeholder]\n * @property {Schema.Validator | Schema.Validator[] | null} [validator]\n * \n */\n\n/**\n * \n * @param {(string | [string, object])[] | null} [scripts] \n */\n\nfunction loadScripts(scripts) {\n\treturn Promise.all(Array.isArray(scripts) ? scripts.map(async (s) => {\n\t\tconst path = typeof s === 'string' ? s : s[0];\n\t\tif (!path || typeof path !== 'string') { return; }\n\t\tconst script = await importWidget(path);\n\t\tif (typeof script !== 'function') { return script; }\n\t\tconst options = typeof s === 'string' ? null : s[1];\n\t\treturn script(typeof options == 'object' && options || {});\n\t}) : []);\n}\n/**\n * \n * @param {Field} field \n * @param {any[]} parentScripts \n * @returns {Promise<FieldScriptConfiguration>}\n */\nasync function setFieldScript({ type, scripts, ...field }, parentScripts) {\n\tconst subScripts = Object.create(null);\n\tconst selfScripts = Object.create(null);\n\tfor (const script of [await loadScripts(scripts), parentScripts].flat()) {\n\t\tif (!script || typeof script !== 'object') { continue; }\n\t\tconst { subFields, ...others } = script;\n\t\tfor (const [k, v] of Object.entries(others)) {\n\t\t\tconst list = selfScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tselfScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t\tif (!subFields) { continue; }\n\t\tfor (const [k, v] of Object.entries(subFields)) {\n\t\t\tconst list = subScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tsubScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...field,\n\t\tscript: margeFieldScript(selfScripts),\n\t\ttype: typeof type === 'object' && type ? await setFieldsScript(type, subScripts) : type,\n\t};\n}\n/**\n * \n * @param {Record<string, Field>} fields \n * @param {*} scripts \n * @returns \n */\nasync function setFieldsScript(fields, scripts) {\n\tconst list = Object.entries(fields).map(([k, f]) => Promise.all([k, setFieldScript(f, scripts[k])]));\n\treturn Object.fromEntries(await Promise.all(list));\n}\n\n/**\n * \n * @param {any[]} [list] \n * @param {boolean} [a] \n * @returns {((...p: any) => any)?}\n */\nfunction margeFunc(list, a) {\n\tif (!list) { return null; }\n\tconst fn = list.filter(v => typeof v === 'function');\n\tif (!fn.length) { return null; }\n\tif (a) {\n\t\treturn (...p) => {\n\t\t\tfor (const f of fn) {\n\t\t\t\tf(...p);\n\t\t\t}\n\t\t};\n\t}\n\treturn async (...p) => {\n\t\tfor (const f of fn) {\n\t\t\tawait f(...p);\n\t\t}\n\t};\n}\n/**\n * \n * @param {((store: Store) => any)[] | null | undefined} list \n * @param {boolean | ((value: any) => boolean)} judgment \n * @param {any} [defaultValue] \n * @returns {((store: Store) => any)?}\n */\nfunction margeStoreFunc(list, judgment, defaultValue) {\n\tif (!list) { return null; }\n\tconst fn = list.filter(v => typeof v === 'function');\n\tif (!fn.length) { return null; }\n\t\treturn (...p) => {\n\t\t\tfor (const f of fn) {\n\t\t\t\tconst res = f(...p);\n\t\t\t\tif (res === judgment) { return res;}\n\t\t\t\tif (typeof judgment === 'function' && judgment(res)) { return res }\n\t\t\t}\n\t\t\treturn defaultValue;\n\t\t};\n}\n/**\n * \n * @param {Record<string, any[]>} scripts \n * @returns {Omit<FieldScript, 'subFields'>}\n */\nfunction margeFieldScript(scripts) {\n\treturn {\n\t\tinput: margeFunc(scripts.input),\n\t\tchange: margeFunc(scripts.change),\n\t\tclick: margeFunc(scripts.click),\n\t\tfocus: margeFunc(scripts.focus),\n\t\tblur: margeFunc(scripts.blur),\n\t\tadd: scripts.add?.find(v => typeof v === 'function'),\n\t\tremove: margeFunc(scripts.remove),\n\t\tmove: margeFunc(scripts.move),\n\t\treadonly: margeStoreFunc(scripts.readonly, true, false),\n\t\thidden: margeStoreFunc(scripts.hidden, true, false),\n\t\trequired: margeStoreFunc(scripts.required, true, false),\n\t\tclearable: margeStoreFunc(scripts.clearable, true, false),\n\t\tdisabled: margeStoreFunc(scripts.disabled, true, false),\n\t\tdefault: margeStoreFunc(scripts.default, (v = null) => v !== null, false),\n\t\tlabel: margeStoreFunc(scripts.label, v => v && typeof v === 'string', ''),\n\t\tdescription: margeStoreFunc(scripts.description, v => v && typeof v === 'string', ''),\n\t\tplaceholder: margeStoreFunc(scripts.clearable, v => v && typeof v === 'string', ''),\n\t\tvalidator: [scripts.validator].flat().filter(Boolean),\n\t};\n\n}\n/**\n * \n * @param {Record<string, any[]>} scripts \n * @returns {Omit<ModelScript, 'subFields'>}\n */\nfunction margeModelScript({\n\tlistScripts,\n\tdocumentScripts,\n\t...scripts\n}) {\n\treturn {\n\t\tinput: margeFunc(scripts.input),\n\t\tchange: margeFunc(scripts.change),\n\t\tbeforeCreate: margeFunc(scripts.beforeCreate),\n\t\tbeforeUpdate: margeFunc(scripts.beforeUpdate),\n\t\tbeforeSave: margeFunc(scripts.beforeSave),\n\t\tbeforeDestroy: margeFunc(scripts.beforeDestroy),\n\t\tbeforeUpsert: margeFunc(scripts.beforeUpsert),\n\t\tlistScripts: listScripts ? Object.assign({}, ...listScripts) : {},\n\t\tdocumentScripts: documentScripts ? Object.assign({}, ...documentScripts) : {},\n\t};\n}\n/**\n * \n * @param {ModelConfiguration} model \n * @returns {Promise<ModelScriptConfiguration>}\n */\nasync function setScript({ fields, scripts: scripts, ...model }) {\n\t/** @type {Record<string, any[]>} */\n\tconst fieldsScripts = Object.create(null);\n\t/** @type {Record<string, any[]>} */\n\tconst selfScripts = Object.create(null);\n\tfor (const script of await loadScripts(scripts)) {\n\t\tif (!script || typeof script !== 'object') { continue; }\n\t\tconst { fields, ...others } = script;\n\t\tfor (const [k, v] of Object.entries(others)) {\n\t\t\tconst list = selfScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tselfScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t\tif (!fields) { continue; }\n\t\tfor (const [k, v] of Object.entries(fields)) {\n\t\t\tconst list = fieldsScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tfieldsScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...model,\n\t\tscript: margeModelScript(selfScripts),\n\t\tfields: await setFieldsScript(fields, fieldsScripts),\n\t};\n}\n\n\nconst modelOptions = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<Record<string, any>[]>} */\n\tconst result = req.clone().body({}).json().then(v => v.options);\n\treturn result;\n}, /** @type {Record<string, any>[]} */([]));\n\n\n/**\n * \n * @param {DotRequest} baseReq \n * @param {string} key\n * @returns \n */\nfunction service(baseReq, key) {\n\tconst documentsReq = baseReq.clone().append(`/documents`);\n\tconst optionsReq = baseReq.clone().append(`/options`);\n\tconst { get: getOptions, load: loadOptions } = modelOptions.create(key, optionsReq);\n\n\n\treturn {\n\t\t/**\n\t\t * @param {Search.Param} [options]\n\t\t * @returns {Promise<{documents: any[]; total: number}>}\n\t\t */\n\t\tasync query({ values, where, orWhere, sort, limit = 20, page, offset, select, total, primary } = {}) {\n\t\t\treturn documentsReq.clone().body({ values, where, orWhere, sort, limit, page, offset, select, total, primary }).json();\n\t\t},\n\t\tgetOptions() { return getOptions(); },\n\t\t/**\n\t\t * @overload\n\t\t * @param {boolean} [options]\n\t\t * @returns {Promise<Record<string, any>[]>}\n\t\t */\n\t\t/**\n\t\t * @overload\n\t\t * @param {Search.Param} options\n\t\t * @returns {Promise<{options: Record<string, any>[]; total: number}>}\n\t\t */\n\t\t/**\n\t\t * @param {Search.Param | boolean} [options]\n\t\t * @returns {Promise<Record<string, any>[] | {options: Record<string, any>[]; total: number}>}\n\t\t */\n\t\tasync options(options) {\n\t\t\tif (!options || typeof options === 'boolean') {\n\t\t\t\treturn loadOptions(options);\n\t\t\t}\n\t\t\tconst { values, where, orWhere, sort, limit = 20, page, offset, select, total, primary } = options;\n\t\t\t// TODO:\n\t\t\treturn optionsReq.clone().body({\n\t\t\t\tvalues, where, orWhere, sort, limit, page, offset, select, total, primary,\n\t\t\t}).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {string | number} id\n\t\t */\n\t\tasync option(id) {\n\t\t\t// TODO:\n\t\t\treturn optionsReq.clone().append(`/${encodeURIComponent(id)}`).get().errorHandler(userErrorHandler).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {Record<string, any>} data\n\t\t * @returns \n\t\t */\n\t\tasync create(data) {\n\t\t\t// TODO:\n\t\t\treturn documentsReq.clone().post().body({ document: data }).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {string | number} id\n\t\t */\n\t\tdocument(id) {\n\t\t\tconst idReq = documentsReq.clone().append(`/${encodeURIComponent(id)}`);\n\t\t\t/**\n\t\t\t * \n\t\t\t * @returns {Promise<Record<string, any>>}\n\t\t\t */\n\t\t\tasync function get() {\n\t\t\t\treturn idReq.get().json().then(v => v.document);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tget,\n\t\t\t\t/**\n\t\t\t\t * @param {Record<string, any>} data\n\t\t\t\t * @returns \n\t\t\t\t */\n\t\t\t\tasync update(data) {\n\t\t\t\t\t// TODO:\n\t\t\t\t\treturn idReq.clone().put().body({ document: data }).json();\n\t\t\t\t},\n\t\t\t\tasync delete() {\n\t\t\t\t\t// TODO:\n\t\t\t\t\treturn idReq.delete().done();\n\t\t\t\t},\n\t\t\t\t/** @param {string} field */\n\t\t\t\tfield(field) {\n\t\t\t\t\tconst fieldReq = idReq.clone().append`fields/${field}`;\n\t\t\t\t\t/**\n\t\t\t\t\t * \n\t\t\t\t\t * @returns {Promise<any>}\n\t\t\t\t\t */\n\t\t\t\t\tasync function get() {\n\t\t\t\t\t\treturn fieldReq.get().json().then(v => v.value);\n\t\t\t\t\t}\n\t\t\t\t\treturn {get, ...toPromiseInterface(get)}\n\t\t\t\t},\n\t\t\t\t...toPromiseInterface(get),\n\t\t\t};\n\t\t},\n\t};\n}\nconst models = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<ModelConfiguration?>} */\n\tconst result = req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\treturn result;\n}, null);\nconst modelScripts = createPromisesAndStates((\n\t/** @type {() => Promise<ModelConfiguration?>} */load\n) => {\n\treturn load().then(async v => v && setScript(v));\n}, null, models);\n\n/**\n * \n * @param {string} model \n * @returns \n */\nexport function modelService(model) {\n\tconst modelReq = request.clone().path`models/${model || ''}`;\n\tconst { get: getModel, load: loadModel } = models.create(model, modelReq);\n\tconst { get: getScript, load: loadScript } = modelScripts.create(model, loadModel);\n\n\treturn {\n\t\tloadModel,\n\t\tloadScript,\n\t\tgetModel,\n\t\tgetScript,\n\t\t...service(modelReq, [model, ''].join('\\n')),\n\t\t...toPromiseInterface(loadModel),\n\t};\n}\n","/** @import DotRequest from 'dot-request' */\nimport request from '../request.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\nconst enumerations = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<Record<string, any>[]>} */\n\tconst result = req.json().then(\n\t\tv => typeof v === 'object' && v.values || [],\n\t\t() => /** @type {Record<string, any>[]} */([])\n\t);\n\treturn result;\n}, /** @type {Record<string, any>[]} */([]));\n\n/**\n * \n * @param {string} enumeration \n * @returns \n */\nexport function enumerationsService(enumeration) {\n\tconst modelReq = request.clone().path`enumerations/${enumeration || ''}`;\n\tconst { get: get, load: load } = enumerations.create(enumeration, modelReq);\n\treturn { load, get, ...toPromiseInterface(load) };\n}\n","/** @import DotRequest from 'dot-request' */\n/** @import { FormLayout } from '@yongdall/types' */\nimport request from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\nconst layouts = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<FormLayout?>} */\n\tconst result = req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\treturn result;\n}, null);\n\n/**\n * \n * @param {string} layout \n * @returns \n */\nexport function formLayoutsService(layout) {\n\tconst layoutReq = request.clone().path`formLayouts/${layout || ''}`;\n\tconst { get: get, load: load } = layouts.create(layout, layoutReq);\n\treturn { load, get, ...toPromiseInterface(load) };\n}\n","import request from '../request.mjs';\nimport { createState } from '../signal.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\n\nconst permissionsReq = request.clone().path`permissions`;\n\n/**\n * @typedef {({children: {value: string; label: string}[]; label: string;})} Permission\n */\n/** @type {Promise<Permission[]>?} */\nlet promise = null;\n/** @type {boolean} */\nlet reloaded = false;\nconst state = createState(/** @type {Permission[]} */([]));\n\nfunction update() {\n\t/** @type {Promise<Permission[]>} */\n\tconst result = permissionsReq.json().then(\n\t\tv => Array.isArray(v) && v || [],\n\t);\n\tpromise = result;\n\tresult.then(v => {\n\t\treturn state.set(v);\n\t}, () => {\n\t\tif (promise !== result) { return; }\n\t\tpromise = null;\n\t});\n\treturn result;\n}\n\n\n/**\n * \n * @param {boolean} [force] \n */\nfunction load(force) {\n\tif (!force && promise) { return promise; }\n\treturn update();\n}\nfunction get() {\n\tif (!promise || reloaded) {\n\t\tupdate();\n\t\treloaded = false;\n\t}\n\treturn state.get();\n}\n\nexport default { load, get, ...toPromiseInterface(load) };\n","/** @import { Menu } from '../Menu.mjs' */\nimport request from '../request.mjs';\n\n/**\n * \n * @param {string} type \n * @param {string} group\n * @returns {Promise<Menu.Define[]>}\n */\nasync function _loadMenu(type, group) {\n\tlet req = request.clone()\n\tif (group) {\n\t\treq = req.get`menus/${type}/groups/${group}`;\n\t} else {\n\t\treq = req.get`menus/${type}`;\n\t};\n\tconst { menus } = await req.json();\n\treturn menus\n}\n/** @type {Record<string, Record<string, Promise<Menu.Define[]>?>>} */\nconst allMenus = Object.create(null);\n/**\n * @overload\n * @param {string} type \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * @overload\n * @param {string} type \n * @param {string} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * @overload\n * @param {string} type \n * @param {string | boolean} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * \n * @param {string} type \n * @param {string | boolean} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\nexport function loadMenu(type, group, force) {\n\tlet typeMenus = allMenus[type];\n\tif (!typeMenus) {\n\t\tallMenus[type] = typeMenus = Object.create(null);\n\t}\n\tconst groupName = typeof group === 'string' ? group : '';\n\tif (group !== true && force !== true) {\n\t\tconst groupMenu = typeMenus[groupName];\n\t\tif (groupMenu) { return groupMenu; }\n\t}\n\tconst menus = _loadMenu(type, groupName);\n\ttypeMenus[groupName] = menus;\n\tmenus.catch(() => {\n\t\tif (typeMenus[groupName] !== menus) {return }\n\t\ttypeMenus[groupName] = null;\n\t})\n\treturn menus;\n}\n","/** @import { Field } from '@yongdall/types' */\nimport { Search } from '@yongdall/common';\nimport { getFilterFns } from '../index.mjs';\n\n/**\n * \n * @param {Record<string, Field>} fields 字段配置\n * @param {Search.ExecParam} param \n * @returns \n */\nexport function modelFilter(fields, param) {\n\tlet fieldsMap = fields;\n\tconst fieldNames = param.fields.map(v => Array.isArray(v) ? v[0] : v);\n\tif (!fieldNames.length) { return null; }\n\tconst last = fieldNames.pop() || '';\n\tfor (const f of fieldNames) {\n\t\tconst type = Object.hasOwn(fieldsMap, f) && fieldsMap[f]?.type;\n\t\tif (!type || typeof type !== 'object') { return null; }\n\t\tfieldsMap = type;\n\t}\n\tconst field = Object.hasOwn(fieldsMap, last) && fieldsMap[last];\n\tif (!field) { return null; }\n\tconst eqFieldName = param.field;\n\tconst eqField = eqFieldName && Object.hasOwn(fieldsMap, eqFieldName) && fieldsMap[eqFieldName] || null;\n\tconst not = Boolean(param.sign);\n\tconst { value, values } = param;\n\n\tfor (const fns of getFilterFns(field, param.operator)) {\n\t\tif (eqField) {\n\t\t\tfor (const fn of not ? fns.notField : fns.field) {\n\t\t\t\tconst w = fn(values, value, field, eqField);\n\t\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t\t}\n\t\t\tif (not) {\n\t\t\t\tfor (const fn of fns.field) {\n\t\t\t\t\tconst w = fn(values, value, field, eqField);\n\t\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const fn of not ? fns.notValue : fns.value) {\n\t\t\t\tconst w = fn(values, value, field);\n\t\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t\t}\n\t\t\tif (not) {\n\t\t\t\tfor (const fn of fns.value) {\n\t\t\t\t\tconst w = fn(values, value, field);\n\t\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\treturn null;\n}\n","import { modelService } from '../services/index.mjs';\nimport { Search } from '@yongdall/common';\nimport { getFilterFns } from '../index.mjs';\nimport { modelFilter } from './modelFilter.mjs';\n\n\n\n/**\n * \n * @param {Search.ExecParam} value \n * @returns \n */\nfunction run({ operator, sign, value, values }) {\n\tconst not = Boolean(sign);\n\tfor (const fns of getFilterFns(!values.find(v => !Array.isArray(v)), operator)) {\n\t\tfor (const fn of not ? fns.notValue : fns.value) {\n\t\t\tconst w = fn(values, value);\n\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t}\n\t\tif (not) {\n\t\t\tfor (const fn of fns.value) {\n\t\t\t\tconst w = fn(values, value);\n\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t}\n\t\t}\n\t}\n\tif (!operator) {\n\t\tfor (const v of values) {\n\t\t\tif (v == value) { return !not; }\n\t\t}\n\t\treturn not;\n\t}\n\n\treturn null;\n}\n\n\n/**\n * \n * @param {((value: Search.ExecParam) => boolean?)?} [exec]\n * @param {string?} [type] \n * @param {string?} [name] \n * @returns {(value: Search.ExecParam) => boolean?}\n */\nexport function createExec(exec, type, name) {\n\tif (typeof exec === 'function') { return exec; }\n\tif (type !== 'model') { return run; }\n\tif (!name) { return run; }\n\tconst s = modelService(name);\n\treturn value => {\n\t\tconst model = s.getModel();\n\t\tif (!model) { return run(value); }\n\t\treturn modelFilter(model.fields, value);\n\t};\n}\n","/** @import { DataSource } from './index.mjs' */\nimport { Search } from '@yongdall/common';\n\n\n\n\n/**\n * \n * @param {DataSource.Option[]} list \n * @param {(value: Search.ExecParam) => boolean?} exec \n * @param {(Search.Match | Search.Children)[]} where \n * @param {(Search.Match | Search.Children | Search.Or)[]} orWhere \n */\nexport function filterList(list, exec, where, orWhere) {\n\t/** @type {DataSource.Option[]} */\n\tconst result = [];\n\tfor (const data of list) {\n\t\tconst children = filterList(data.children, exec, where, orWhere);\n\t\tconst disabled = data.disabled || !(Search.exec(data.data, exec, where, orWhere) ?? true);\n\t\tif (!children.length && disabled) { continue; }\n\t\tresult.push({ ...data, children, disabled });\n\t}\n\treturn result;\n\n}\n","/** @import { Field } from '@yongdall/types' */\n/** @import { DataSource } from './index.mjs' */\nimport { runPattern } from '@yongdall/common';\nimport { createComputed } from '../signal.mjs';\n\n/**\n * \n * @param {{get(): Record<string, any>[]}} list \n * @param {Field.Source} options\n */\nexport function build(list, {\n\n\tid,\n\tlabel,\n\tvalue,\n\tparent,\n\tchildren,\n\tsequence,\n\tdisabled,\n} = {}) {\n\tconst idPattern = id || '{id}';\n\tconst valuePattern = value || '{value}';\n\tconst labelPattern = label || '{label}';\n\tconst disabledKey = disabled;\n\tif (parent) {\n\t\tconst parentPattern = parent.includes('{') ? parent : `{${parent}}`;\n\t\treturn createComputed(() => {\n\t\t\t/** @type {DataSource.Option[]} */\n\t\t\tconst data = list.get().map(data => {\n\t\t\t\tconst id = typeof data === 'object' && data ? runPattern(idPattern, data) : data;\n\t\t\t\tconst value = typeof data === 'object' && data ? runPattern(valuePattern, data) : data;\n\t\t\t\tconst label = String(typeof data === 'object' && data && runPattern(labelPattern, data) || value);\n\t\t\t\tconst disabled = Boolean(typeof data === 'object' && disabledKey && data?.[disabledKey]);\n\t\t\t\tconst parentId = typeof data === 'object' && data ? runPattern(parentPattern, data) : '';\n\t\t\t\treturn { id, value, label, data, parentId, disabled, children: [] };\n\t\t\t});\n\t\t\tconst values = new Set(data.map(v => String(v.value)));\n\t\t\tconst groups = Object.groupBy(data, d => d.parentId ?? '');\n\t\t\tconst rootKeys = Object.keys(groups).filter(v => !values.has(v));\n\t\t\tconst root = rootKeys.flatMap(v => groups[v] || []);\n\t\t\tfor (const key of rootKeys) {\n\t\t\t\tdelete groups[key];\n\t\t\t}\n\t\t\tconst queue = [...root];\n\t\t\tfor (let item; item = queue.shift();) {\n\t\t\t\tconst children = groups[item.id];\n\t\t\t\tdelete groups[item.id];\n\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\titem.children = children;\n\t\t\t\tfor (const c of children) {\n\t\t\t\t\tqueue.push(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let keys = Object.keys(groups); keys.length; keys = Object.keys(groups)) {\n\t\t\t\tconst key = keys[0];\n\t\t\t\tconst children = groups[key];\n\t\t\t\tdelete groups[key];\n\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\tfor (const c of children) {\n\t\t\t\t\troot.push(c);\n\t\t\t\t\tqueue.push(c);\n\t\t\t\t}\n\t\t\t\tfor (let item; item = queue.shift();) {\n\t\t\t\t\tconst children = groups[item.id];\n\t\t\t\t\tdelete groups[item.id];\n\t\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\t\titem.children = children;\n\t\t\t\t\tfor (const c of children) {\n\t\t\t\t\t\tqueue.push(c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TODO: 排序\n\t\t\treturn root;\n\n\n\t\t});\n\t}\n\tconst childrenKey = children;\n\t/**\n\t * \n\t * @param {*[]} data \n\t * @returns {DataSource.Option[]}\n\t */\n\tfunction buildItems(data) {\n\t\tconst result = data.map(data => {\n\t\t\tif (typeof data !== 'object' || !data) {\n\t\t\t\treturn { id: data, value: data, label: String(data), data, children: [] };\n\t\t\t}\n\t\t\tconst id = runPattern(idPattern, data);\n\t\t\tconst value = runPattern(valuePattern, data);\n\t\t\tconst label = String(runPattern(labelPattern, data) || value);\n\t\t\tconst disabled = Boolean(disabledKey && data[disabledKey]);\n\t\t\tif (!childrenKey) {\n\t\t\t\treturn { id, value, label, data, disabled, children: [] };\n\t\t\t}\n\t\t\tconst children = data[childrenKey];\n\t\t\treturn {\n\t\t\t\tid, value, label, data, disabled, children: buildItems(children)\n\t\t\t};\n\t\t});\n\t\t// TODO: 排序\n\t\treturn result;\n\t}\n\treturn createComputed(() => buildItems(list.get()));\n\n}\n","import { allHooks } from './allHooks.mjs';\nimport { createStates } from './utils/state.mjs';\nimport { createComputed } from './signal.mjs';\n\n\n\nconst enumerations = createStates((/** @type {string} */name) => {\n\treturn createComputed(() => {\n\t\t/** @type {Record<string, any>[]} */\n\t\tconst list = [];\n\t\tfor (const [plugin, value] of allHooks.get('enumerations').get(name)) {\n\t\t\tfor (const val of typeof value === 'function' ? value() : [value]) {\n\t\t\t\tlist.push({...val, plugin});\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t});\n}, name => name);\n/**\n * \n * @param {string} name \n * @returns {Record<string, any>[]}\n */\nexport function getEnumeration(name) {\n\treturn enumerations(name).get();\n}\n","import { enumerationsService, modelService } from '../services/index.mjs';\nimport { getEnumeration } from '../enumerations.mjs';\nimport { createStates } from '../utils/state.mjs';\nimport { createComputed } from '../signal.mjs';\n\n\nexport const loadValues = createStates((/** @type {string} */type, /** @type {string} */name) => {\n\tif (!name) { return createComputed(() => /** @type {Record<string, any>[]} */([])); }\n\tif (type === 'model') {\n\t\tconst s = modelService(name);\n\t\treturn createComputed(() => s.getOptions());\n\t}\n\tif (type === 'serverEnumeration') {\n\t\tconst s = enumerationsService(name);\n\t\treturn createComputed(() => s.get());\n\t}\n\tif (type === 'webEnumeration') {\n\t\treturn createComputed(() => getEnumeration(name));\n\t}\n\tif (type === 'enumeration') {\n\t\tconst s = enumerationsService(name);\n\t\tconst serverEnumeration = createComputed(() => s.get());\n\t\tconst webEnumeration = createComputed(() => getEnumeration(name));\n\t\treturn createComputed(() => [\n\t\t\t...serverEnumeration.get(),\n\t\t\t...webEnumeration.get(),\n\t\t]);\n\t}\n\treturn createComputed(() => /** @type {Record<string, any>[]} */([]));\n}, (type, name) => name ? [type, name].join('\\n') : '');\n","/** @import { State } from '../signal.mjs' */\nimport { createComputed } from '../signal.mjs';\n\n/**\n * \n * @param {*} values \n * @returns {State<Record<string, any>[]>}\n */\nexport function loadArray(values) {\n\tif (!Array.isArray(values)) {\n\t\treturn createComputed(() => /** @type {Record<string, any>[]} */([]));\n\t}\n\treturn createComputed(() => values);\n}\n","/** @import { State } from '../signal.mjs' */\nimport { createComputed } from '../signal.mjs';\n/**\n * \n * @param {State<Record<string, any>[]>} data \n * @param {*} parent \n * @param {*} children \n */\nexport function flat(data, parent, children) {\n\tif (parent || !children) { return data; }\n\treturn createComputed(() => {\n\t\tconst childrenKey = children;\n\t\t/** @param {*[]} list @returns {Iterable<Record<string, any>>} */\n\t\tfunction* buildItems(list) {\n\t\t\tif (!Array.isArray(list)) { return; }\n\t\t\tfor (const data of list) {\n\t\t\t\tif (typeof data !== 'object' || !data) {\n\t\t\t\t\tyield data;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (childrenKey) { yield* buildItems(data[childrenKey]); };\n\t\t\t\tyield data;\n\t\t\t}\n\t\t}\n\t\treturn [...buildItems(data.get())];\n\t});\n\n}\n","/** @import { Store } from '@neeloong/form' */\n/** @import { Field } from '@yongdall/types' */\n/** @import { State } from '../signal.mjs' */\nimport { Search } from '@yongdall/common';\nimport { ArrayStore, createState, modelService } from '@yongdall/web';\n\nimport { createComputed } from '../signal.mjs';\nimport { createExec } from './createExec.mjs';\nimport { filterList } from './filterList.mjs';\nimport { build } from './build.mjs';\nimport { loadValues } from './loadValues.mjs';\nimport { loadArray } from './loadArray.mjs';\nimport { flat } from './flat.mjs';\n\n\n/**\n * @typedef {object} DataSource.Option\n * @property {string | number} id\n * @property {string | number} value\n * @property {string} label\n * @property {any} data\n * @property {string | number} [parentId]\n * @property {boolean} [disabled]\n * @property {DataSource.Option[]} children\n */\n/**\n * @typedef {object} DataSource\n * \n * @property {string?} [id] id字段(或模式)\n * @property {string?} [label] 标签字段(或模式)\n * @property {string?} [value] 值字段(或模式)\n * @property {string?} [parent] 父节点字段(或模式)\n * \n * @property {string?} [children] 子列表\n * @property {string?} [sequence] 序列字段\n * @property {string?} [disabled] 禁用字段\n * \n * \n * @property {Field.Show[]?} [fields] 显示字段\n * @property {{ field: string; label?: string; operator: string; }[]?} [queryFilters] 快速过滤字段\n * \n * \n * \n * @property {any} configurator 字段配置信息\n * @property {Object.<string, string>} labels\n * @property {DataSource.Option[]} options\n * @property {(DataSource.Option & { level: number; })[]} levelTree\n * @property {Record<string, any>} map\n * @property {string?} [model]\n * @property {ReturnType<typeof modelService>?} [service] \n * @property {(Search.Match | Search.Children)[]} where\n * @property {(Search.Match | Search.Children | Search.Or)[]} orWhere\n */\n/**\n * \n * @param {string?} [id] \n */\nfunction toPattern(id) {\n\tif (!id || typeof id !== 'string') { return null; }\n\treturn id.includes('{') ? id : `{${id}}`;\n\n}\n/**\n * \n * @param {Field.Source} source\n */\nfunction setPattern(source) {\n\tconst {\n\t\tid, value, label\n\t} = Array.isArray(source) ? {} : source || {};\n\tconst isModel = source.type === 'model' && source.name;\n\treturn {\n\t\t...source,\n\t\tid: toPattern(isModel ? id : id || 'id'),\n\t\tvalue: toPattern(isModel ? value : value || 'value'),\n\t\tlabel: toPattern(isModel ? label : label || 'label'),\n\t};\n}\n/**\n * \n * @param {any[] | Field.Source | null} [source] \n * @param {string | null} [model] \n * @returns {Field.Source}\n */\nfunction init(source, model) {\n\tif (Array.isArray(source)) { return setPattern({ values: source }); };\n\tif (!source) { return model ? { type: 'model', name: model } : {}; }\n\tif (source.type && source.name) { return setPattern(source); }\n\tif ((source.type === 'model' || !source.type) && !source.name && model) { return setPattern({ ...source, type: 'model', name: model }); }\n\tif (Array.isArray(source.values)) { return setPattern(source); }\n\tif (!source.type && !source.name && model) { return setPattern({ ...source, name: model }); }\n\treturn setPattern(source);\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toLabels(options) {\n\treturn createComputed(() => {\n\t\tconst queue = [...options.get()];\n\t\t/** @type {Record<string, string>} */\n\t\tconst labels = Object.create(null);\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst children = item.children;\n\t\t\tlabels[item.value] = item.label;\n\t\t\tfor (const c of children) {\n\t\t\t\tqueue.push(c);\n\t\t\t}\n\t\t}\n\t\treturn labels;\n\t});\n}\n\n/**\n * \n * @param {Store?} [store] \n * @returns {Store?}\n */\nfunction findParentState(store) {\n\tlet state = store?.parent;\n\tif (!state) { return null; }\n\tif (state instanceof ArrayStore) { state = state.parent; }\n\tif (!state) { return null; }\n\treturn state;\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toValueMap(options) {\n\treturn createComputed(() => {\n\t\tconst queue = [...options.get()];\n\t\t/** @type {Record<string, any>} */\n\t\tconst values = Object.create(null);\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst children = item.children;\n\t\t\tvalues[item.value] = item.data;\n\t\t\tfor (const c of children) {\n\t\t\t\tqueue.push(c);\n\t\t\t}\n\t\t}\n\t\treturn values;\n\t});\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toLevelTree(options) {\n\treturn createComputed(() => {\n\t\t/** @type {[level: number, option: DataSource.Option][]} */\n\t\tconst queue = options.get().map(v => [0, v]);\n\t\t/** @type {(DataSource.Option & {level: number})[]} */\n\t\tconst list = [];\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst [level, option] = item;\n\t\t\tlist.push({ ...option, level });\n\t\t\tfor (const c of option.children) {\n\t\t\t\tqueue.push([level + 1, c]);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t});\n}\n/**\n * \n * @param {Store} store \n * @param {string} placeholder \n */\nfunction getModelPlaceholder(store, placeholder) {\n\tlet currentState = store;\n\tlet k = 0;\n\twhile (placeholder[k] === '?') {\n\t\tk++;\n\t\tlet parent = currentState.parent;\n\t\tif (!parent) { break; }\n\t\tif (parent instanceof ArrayStore) {\n\t\t\tparent = parent.parent;\n\t\t}\n\t\tif (!parent) { break; }\n\t\tcurrentState = parent;\n\t}\n\twhile (placeholder[k] === '?') { k++; }\n\tconst name = placeholder.slice(k);\n\tconst field = currentState.child(name);\n\tif (!field) { return null; }\n\treturn field.value;\n\n}\n/**\n * \n * @param {any[] | Field.Source | null} [source] \n * @param {string | null} [model] \n * @param {Store | null} [store] \n * @returns {DataSource}\n */\nexport default function buildDataSource(source, model, store) {\n\tconst sourceDefine = init(source, model);\n\tconst { type, name, parent, children, id, label, value, sequence, disabled, fields, queryFilters } = sourceDefine;\n\tconst configuratorKey = sourceDefine.configurator || 'configurator';\n\n\tconst data = type ? loadValues(type, name || '') : loadArray(sourceDefine.values);\n\tconst list = build(data, sourceDefine);\n\tconst labels = toLabels(list);\n\n\tconst searchText = sourceDefine.search;\n\tconst search = searchText && typeof searchText === 'string' ? Search.parse(searchText) : null;\n\tconst where = search?.where?.length ? search.where : null;\n\tconst orWhere = search?.orWhere?.length ? search.orWhere : null;\n\tconst baseStore = findParentState(store);\n\tconst getPlaceholder = baseStore ? getModelPlaceholder.bind(null, baseStore) : null;\n\t/** @typedef {[(Search.Match | Search.Children)[], (Search.Match | Search.Children | Search.Or)[]]} SearchState */\n\tconst searchState = getPlaceholder\n\t\t? createComputed(() => /** @type {SearchState} */([\n\t\t\tSearch.fill(where, getPlaceholder),\n\t\t\tSearch.fill(orWhere, getPlaceholder),\n\t\t])) : where || orWhere\n\t\t? createState(/** @type {SearchState} */([where, orWhere]))\n\t\t: null;\n\n\tconst execFn = createComputed(() => createExec(null, type, name));\n\tconst options = searchState ? createComputed(() => {\n\t\tconst [where, orWhere] = searchState.get();\n\t\treturn filterList(list.get(), execFn.get(), where, orWhere);\n\t}) : list;\n\tconst levelTree = toLevelTree(options);\n\tconst valueMap = toValueMap(options);\n\n\tconst flatted = flat(data, parent, children);\n\tconst configurator = searchState ? createComputed(() => {\n\t\tconst [where, orWhere] = searchState.get();\n\t\tfor (const data of flatted.get()) {\n\t\t\tconst disabled = !(Search.exec(data, execFn.get(), where, orWhere) ?? true);\n\t\t\tif (disabled) { continue; }\n\t\t\treturn data?.[configuratorKey];\n\t\t}\n\t\treturn null;\n\t}) : createComputed(() => flatted.get()[0]?.[configuratorKey]);\n\n\tconst service = type === 'model' && model ? modelService(model) : null;\n\treturn {\n\t\tparent, children, id, label, value, sequence, disabled, fields, queryFilters,\n\t\tget where() { return searchState ? searchState.get()[0] : []; },\n\t\tget orWhere() { return searchState ? searchState.get()[1] : []; },\n\t\tmodel: type === 'model' && model || '',\n\t\tservice,\n\t\tget labels() { return labels.get(); },\n\t\tget options() { return options.get(); },\n\t\tget configurator() { return configurator.get(); },\n\t\tget levelTree() { return levelTree.get(); },\n\t\tget map() { return valueMap.get(); },\n\t};\n}\n","/** @import { Store, StoreLayout } from '@neeloong/form' */\n/** @import { Field } from '@yongdall/types' */\n/** @import { FieldComponent, FieldStyle, FieldComponentEvent } from '../typesDefine.mjs' */\nimport { ArrayStore, ObjectStore } from '@neeloong/form';\nimport { createState } from '../signal.mjs';\nimport { getField } from './field.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n/**\n *\n * @param {Store} store\n * @param {any} [renderer] \n * @returns {FieldComponent?}\n */\nfunction getFieldComponent(store, renderer) {\n\tif (typeof renderer === 'function') { return renderer; }\n\tlet storeComponent = store.component;\n\tif (typeof storeComponent === 'function') { return storeComponent; }\n\tconst meta = store.meta;\n\tconst component = getField({\n\t\ttype: store.type,\n\t\tarray: store instanceof ArrayStore,\n\t\trenderer: [renderer, meta?.renderer, store.component].flat(),\n\t}, true);\n\tif (component) { return component; }\n\tif (store instanceof ObjectStore) { return null; }\n\tif (store instanceof ArrayStore && typeof store.type === 'object') {\n\t\treturn null;\n\t}\n\treturn () => document.createElement('div');\n\n}\n\n/**\n * \n * @param {Store} store \n * @param {Field.Bind?} [bind] \n * @returns {((data: any) => void) | null}\n */\nexport function createBind(store, bind) {\n\tif (!bind || typeof bind !== 'object') { return null; }\n\tconst parent = store.parent;\n\tif (!(parent instanceof ObjectStore)) { return null; }\n\tconst list = Array.isArray(bind) ? bind\n\t\t: Object.entries(bind).map(([field, source]) => {\n\t\t\treturn typeof source === 'string' ? { source, field } : { ...source, field };\n\t\t});\n\tif (!list.length) { return null; }\n\n\treturn data => {\n\t\tfor (const { field, source, clear, fixed, reset, set } of list) {\n\t\t\tconst current = parent.child(field);\n\t\t\tif (!current) { continue; }\n\t\t\tif (!source || typeof source !== 'string') { continue; }\n\t\t\tif (!data) {\n\t\t\t\tif (clear) { current.value = reset; }\n\t\t\t} else if (fixed){\n\t\t\t\tcurrent.value = set;\n\t\t\t} else if (source && typeof source === 'string') {\n\t\t\t\tcurrent.value = data[source];\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n *\n * @param {Store<any, Field?, any>} store\n * @param {FieldStyle} style \n * @param {any} [renderer] \n * @param {StoreLayout.Options?} [options]\n * @returns {Element?}\n */\nexport default function createStoreField(store, style, renderer, options) {\n\tconst component = getFieldComponent(store, renderer);\n\tif (!component) { return null; }\n\tconst { relate } = options || {};\n\t/** @type {Field} */\n\tconst field = store.meta || { type: '' };\n\tlet destroyedState = createState(false);\n\tlet destroyed = false;\n\t/** @type {Map<string, Set<any>>} */\n\tconst events = new Map();\n\tconst bind = createBind(store, field?.bind);\n\n\n\t/**\n\t * @param {string} k \n\t * @param {any} p \n\t */\n\tfunction emitHandler(k, p) {\n\t\t// @ts-ignore\n\t\tstore.emit(k, p);\n\t}\n\tconst stopEffects = new Set();\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tconst editable = options?.editable || false;\n\tconst nullable = Boolean(field.nullable);\n\tconst source = buildDataSource(field.source, field.model, store);\n\n\tconst root = component({\n\t\tfield, style: { ...style }, store,\n\t\tget editable() { return editable; },\n\t\tget name() { return store.index; },\n\t\tget current() { return (store.parent || store.root).value; },\n\t\tget required() { return store.required; },\n\t\tget hidden() { return store.hidden; },\n\t\tget readonly() { return store.readonly; },\n\n\t\tget label() { return store.label || ''; },\n\t\tget placeholder() { return store.placeholder || ''; },\n\t\tget description() { return store.description || ''; },\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tlisten(event, listen) {\n\t\t\tconst fn = listen.bind(this);\n\t\t\tlet set = events.get(event);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tevents.set(event, set);\n\t\t\t}\n\t\t\tset.add(fn);\n\t\t\treturn () => { set?.delete(fn); };\n\t\t},\n\t\temit(event, e) { emitHandler(event, e); },\n\t\tget value() { return store.value; },\n\t\tset value(v) {\n\t\t\tif (destroyed) { return; }\n\t\t\tstore.value = v;\n\t\t},\n\t\tget destroyed() { return destroyedState.get(); },\n\t\tget nullable() { return nullable; },\n\t\tget disabled() { return store.disabled; },\n\t\tget clearable() { return store.clearable; },\n\t\tbind,\n\t});\n\t/**\n\t * @template {keyof FieldComponentEvent} K\n\t * @param {K} k \n\t * @param {Parameters<FieldComponentEvent[K]>} p \n\t */\n\tfunction emit(k, ...p) {\n\t\tfor (const fn of [...events.get(k) || []]) {\n\t\t\tfn(...p);\n\t\t}\n\t}\n\tconst related = relate?.(store, {\n\t\tfocus() { emit('focus'); },\n\t\tscrollIntoView() { emit('scrollIntoView'); },\n\t\troot,\n\t});\n\toptions?.signal?.addEventListener('abort', () => {\n\t\tdestroyed = true;\n\t\tdestroyedState.set(true);\n\t\tfor (const stop of stopEffects) { stop(); }\n\t\trelated?.();\n\t}, { once: true });\n\treturn root;\n}\n","/** @import { Store } from '@neeloong/form' */\n/** @import { FromRenderer } from '../typesDefine.mjs' */\nimport { renderStore } from '@neeloong/form';\nimport createStoreField from './createStoreField.mjs';\nimport DOMPurify from 'dompurify';\nconst formAttrs = new Set([\n\t'nl-form-field',\n\t'nl-form-remove',\n\t'nl-form-move',\n\t'nl-form-add',\n\t'nl-form-event',\n]);\nconst formTags = new Map([\n\t['nl-form-field', new Set(['name', 'mode', 'renderer', 'placeholder'])],\n\t['nl-form-button', new Set(['click'])],\n]);\n/**\n * \n * @param {string} html \n */\nfunction sanitizeHtml(html) {\n\treturn DOMPurify.sanitize(html, {\n\t\tADD_TAGS: Object.keys(formTags),\n\t\tADD_ATTR: (attributeName, tagName) => {\n\t\t\tconst attr = attributeName.toLowerCase();\n\t\t\tif (formAttrs.has(attr)) { return true; }\n\t\t\tconst tagAttrs = formTags.get(tagName.toLowerCase());\n\t\t\tif (tagAttrs?.has(attr)) { return true; }\n\t\t\treturn false;\n\t\t}\n\t});\n}\n/**\n * \n * @param {Store<any, any>} store \n * @param {HTMLElement} root \n * @param {Partial<FromRenderer.Options>} [options] \n */\nexport default function (store, root, { enableLink, design, layout, editable, signal } = {}) {\n\tconst style = { enableLink, design };\n\treturn renderStore(\n\t\tstore,\n\t\t(store, renderer, options) => createStoreField(store, style, renderer, options),\n\t\troot,\n\t\tlayout || {},\n\t\t{ editable: editable || false, signal, sanitizeHtml },\n\t);\n}\n","export const neverAbortedSignal = new AbortController().signal;\n","/** @import { Store } from '@neeloong/form' */\n/** @import { FromRenderer } from '../typesDefine.mjs' */\nimport { allHooks } from '../allHooks.mjs';\nimport renderStoreForm from './renderStoreForm.mjs';\nimport { createComputed } from '../signal.mjs';\nimport { neverAbortedSignal } from '../constants.mjs';\n\nconst rendererState = createComputed(() => allHooks.get('formRenderers').named());\n\n\n/**\n * \n * @param {string?} [type] \n * @returns {FromRenderer['render']?}\n */\nfunction getRender(type) {\n\tif (!type) { return null; }\n\tconst renderers = rendererState.get();\n\tif (!Object.hasOwn(renderers, type)) { return null; }\n\tconst renderer = renderers[type];\n\tif (!renderer) { return null; }\n\tconst render = renderer.render;\n\tif (typeof render !== 'function') { return null; }\n\treturn render;\n}\n/**\n * \n * @param {Store<any, any>} store \n * @param {HTMLElement} root \n * @param {Partial<FromRenderer.Options> & {type?: string}} [options] \n * @returns {void}\n */\nexport default function (store, root, options) {\n\tconst {type, editable, signal, model, layout, enableLink, design, ...others } = options || {};\n\tconst render = getRender(type) || renderStoreForm;\n\trender(store, root, {\n\t\tmodel: model || null,\n\t\tlayout: layout || null,\n\t\teditable: Boolean(editable),\n\t\tsignal: signal || neverAbortedSignal,\n\t\tenableLink: Boolean(enableLink),\n\t\tdesign: Boolean(design),\n\t\t...others,\n\t});\n}\n","/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\n/** @import { FieldComponents } from '../typesDefine.mjs' */\nimport { Store } from '@neeloong/form';\nimport toSchema from './toSchema.mjs';\n\n/**\n * \n * @param {ModelScriptConfiguration} define \n * @param {FieldComponents?} [fieldComponents] \n */\nexport default function createStore(define, fieldComponents) {\n\tconst components = typeof fieldComponents === 'object' && fieldComponents || {};\n\tconst schema = toSchema(define.fields, components, define.permissions);\n\tconst store = Store.create(schema);\n\treturn store;\n}\n","/** @import { FieldShowHandle, FieldStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\nimport { createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\nimport { getField } from './field.mjs';\n\n/**\n *\n * @param {string} name\n * @param {FieldScriptConfiguration} field\n * @param {FieldStyle} style\n * @param {any} data\n * @returns {FieldShowHandle}\n */\nexport default function createShowField(name, field, style, data) {\n\tlet destroyedState = createState(false);\n\tlet destroyed = false;\n\t/** @type {Map<string, Set<any>>} */\n\tconst events = new Map();\n\t/** @type {any} */\n\tconst value = createState(data[name]);\n\tconst component = getField(field);\n\tconst source = buildDataSource(field.source, field.model);\n\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tconst root = component({\n\t\tfield, style: { ...style },\n\t\tget editable() { return false; },\n\t\tget name() { return name; },\n\t\tget current() { return data; },\n\t\tget required() { return false; },\n\t\tget hidden() { return false; },\n\t\tget readonly() { return true; },\n\n\t\tget label() { return ''; },\n\t\tget placeholder() { return ''; },\n\t\tget description() { return ''; },\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tlisten(event, listen) {\n\t\t\tconst fn = listen.bind(this);\n\t\t\tlet set = events.get(event);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tevents.set(event, set);\n\t\t\t}\n\t\t\tset.add(fn);\n\t\t\treturn () => { set?.delete(fn); };\n\t\t},\n\t\temit() { },\n\t\tget value() { return value.get(); },\n\t\tset value(v) { },\n\t\tget destroyed() { return destroyedState.get(); },\n\t\tget nullable() { return true; },\n\t\tget disabled() { return false; },\n\t\tget clearable() { return false; },\n\n\t});\n\n\treturn {\n\t\troot,\n\t\tdestroy() {\n\t\t\tif (destroyed) { return; }\n\t\t\tdestroyed = true;\n\t\t\tdestroyedState.set(true);\n\t\t\tac.abort();\n\t\t},\n\t\tget value() {\n\t\t\treturn value;\n\t\t},\n\t\tset value(v) {\n\t\t\tif (destroyed) { return; }\n\t\t\tvalue.set(v);\n\t\t},\n\t};\n\n}\n","/** @import { Search } from '@yongdall/common' */\n/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { neverAbortedSignal } from '../constants.mjs';\nimport { getFieldFilter } from './field.mjs';\nimport { createComputed, createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n\n\n/**\n * @typedef {object} Handle\n * @property {any} value\n * @property {(value: any, operator: string) => void} update\n * @property {HTMLElement} root\n * @property {() => void} destroy\n */\n\n\n\n/**\n * \n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {string} prop \n * @param {string?} [operator] \n * @param {boolean} [sign] \n */\nexport function createFilterState(andList, prop, operator, sign) {\n\tconst props = prop.split('.');\n\tconst not = Boolean(sign);\n\tconst op = typeof operator === 'string' ? operator : '';\n\t/**\n\t * \n\t * @param {Search.Match | Search.Children} v \n\t * @returns {v is Search.Match}\n\t */\n\tfunction finder(v) {\n\t\tif (!Array.isArray(v)) { return false; }\n\t\tif (v.length === 2) { return false; }\n\t\tif (Boolean(v[3]) !== not) { return false; }\n\t\tif (v[2] !== op) { return false; }\n\t\tconst fields = v[0];\n\t\tif (fields.length !== props.length) { return false; }\n\t\tfor (const [index, field] of fields.entries()) {\n\t\t\tif ((typeof field === 'string' ? field : field[0]) !== props[index]) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * \n\t * @param {any} val \n\t */\n\tfunction set(val) {\n\t\tconst list = andList.get();\n\t\tconst index = list.findIndex(finder);\n\t\tif (index < 0) {\n\t\t\tif (val != null) {\n\t\t\t\tandList.set([...list, [props, val, op, sign ? '!' : '']]);\n\t\t\t}\n\t\t\treturn;\n\n\t\t}\n\t\tif (val !== null) {\n\t\t\t/** @type {Search.Match | Search.Children} */\n\t\t\tconst item = [...list[index]];\n\t\t\titem[1] = val;\n\t\t\tandList.set([\n\t\t\t\t...list.slice(0, index),\n\t\t\t\titem,\n\t\t\t\t...list.slice(index + 1),\n\t\t\t]);\n\t\t} else {\n\t\t\tandList.set([\n\t\t\t\t...list.slice(0, index),\n\t\t\t\t...list.slice(index + 1),\n\t\t\t]);\n\t\t}\n\n\t}\n\tfunction get() {\n\t\treturn andList.get().find(finder)?.[1];\n\t}\n\tconst state = createComputed(get);\n\treturn {\n\t\tget() { return state.get(); },\n\t\tset,\n\t};\n\n}\n\n/**\n *\n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {string} name\n * @param {FieldScriptConfiguration} field\n * @param {string} operator\n * @param {FieldFilterStyle} style\n * @param {AbortSignal} [signal]\n * @returns {HTMLElement}\n */\n\nfunction createQuickFilter(andList, name, field, operator, style, signal) {\n\tconst state = createFilterState(andList, name, operator);\n\tconst component = getFieldFilter(field, operator);\n\tconst destroyed = createState(false);\n\tconst source = buildDataSource(field.source, field.model);\n\n\tconst root = component({\n\t\tfield, style: { ...style, quick: true },\n\t\tget operator() { return operator; },\n\t\tget value() { return state.get(); },\n\t\tset value(val) {\n\t\t\tif (destroyed.get()) { return; }\n\t\t\tstate.set(val);\n\t\t},\n\t\tget source() { return source; },\n\t\tsignal: signal || neverAbortedSignal,\n\t\tget destroyed() { return destroyed.get(); },\n\t});\n\tif (signal?.aborted) {\n\t\tdestroyed.set(true);\n\t} else {\n\t\tsignal?.addEventListener('abort', () => { destroyed.set(true); }, { once: true });\n\t}\n\treturn root;\n}\n\n/**\n * @typedef {object} Match\n * @property {string} field\n * @property {string} [operator]\n * @property {any} value\n */\n/**\n * \n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {HTMLElement} root \n * @param {{field: string; label?: string; operator: string}[]} filters \n * @param {object} options \n * @param {Record<string, FieldScriptConfiguration>} options.fields \n * @param {boolean} [options.inline] \n * @param {boolean} [options.showLabel]\n * @param {AbortSignal} [options.signal]\n */\nexport default function createQuickFilters(andList, root, filters, {\n\tfields, showLabel, inline, signal,\n}) {\n\tif (signal?.aborted) { return; }\n\tconst style = { showLabel, inline };\n\tfor (const { field, operator } of filters) {\n\t\tconst fieldDefine = Object.hasOwn(fields, field) && fields[field];\n\t\tif (!fieldDefine) { continue; }\n\t\tconst type = fieldDefine.type;\n\t\tif (!type || typeof type === 'object') { continue; }\n\t\tconst r = createQuickFilter(andList, field, fieldDefine, operator, style, signal);\n\t\troot.appendChild(r);\n\t\tsignal?.addEventListener('abort', () => { r.remove(); }, { once: true });\n\t}\n}\n","/** @import { FieldFilterComponent, FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { State } from '../signal.mjs' */\n\nimport { createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n/**\n * @typedef {object} Handle\n * @property {HTMLElement} root\n */\n\n/**\n *\n * @param {FieldFilterComponent} component\n * @param {FieldScriptConfiguration} field\n * @param {State<any>} valState\n * @param {State<any>} opState\n * @param {FieldFilterStyle} style\n * @param {AbortSignal} signal\n * @returns {HTMLElement}\n */\nexport default function createFilter(component, field, valState, opState, style, signal) {\n\tconst destroyed = createState(false);\n\tconst state = valState;\n\tconst operatorState = opState;\n\tconst source = buildDataSource(field.source, field.model);\n\n\tsignal.addEventListener('abort', () => {\n\t\tdestroyed.set(true);\n\t}, { once: true });\n\t// TODO: 选项、过滤条件\n\treturn component({\n\t\tfield, style,\n\t\tget operator() { return operatorState.get(); },\n\t\tget value() { return state.get(); },\n\t\tset value(val) {\n\t\t\tif (destroyed.get()) { return; }\n\t\t\tconst value = state.get();\n\t\t\tstate.set(val);\n\t\t\tif (Object.is(value, val)) { return; }\n\t\t},\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tget destroyed() { return destroyed.get(); },\n\t});\n}\n","/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { State } from '../signal.mjs' */\n\nimport createFilter from './createFilter.mjs';\nimport { getFieldFilterOperators } from './field.mjs';\nimport { getFieldFilter } from './field.mjs';\n\n\n\n/**\n *\n * @param {FieldScriptConfiguration} field\n * @param {FieldFilterStyle} userStyle\n * @param {State<any>} valState\n * @param {State<any>} opState\n * @param {AbortSignal?} signal\n */\n\nexport default function createFieldFilter(field, valState, opState, userStyle, signal) {\n\t/** @type {FieldFilterStyle} */\n\tconst style = { ...userStyle };\n\tdelete style.quick;\n\tdelete style.showLabel;\n\tlet destroyed = signal?.aborted || false;\n\tsignal?.addEventListener('abort', () => { destroyed = true; }, { once: true });\n\tconst operators = getFieldFilterOperators(field);\n\n\tconst root = document.createElement('span');\n\troot.classList.add(`FieldFilter-main`);\n\tconst operatorSelector = root.appendChild(document.createElement('select'));\n\n\toperatorSelector.classList.add(`FieldFilter-operator`);\n\tfor (const [value, label] of Object.entries(operators)) {\n\t\tconst option = document.createElement('option');\n\t\toption.value = value;\n\t\toption.label = label || value;\n\t\toperatorSelector.appendChild(option);\n\t}\n\n\tlet currentComponent = getFieldFilter(field, opState.get());\n\tlet handleAbortController = new AbortController();\n\tlet currentHandle = createFilter(currentComponent, field, valState, opState, style, signal ? AbortSignal.any([handleAbortController.signal, signal]) : handleAbortController.signal);\n\tlet handleRoot = root.appendChild(currentHandle);\n\n\thandleRoot.classList.add(`FieldFilter-value`);\n\n\t/** @param {string?} [operator] */\n\tfunction setOperator(operator) {\n\t\tif (destroyed) { return; }\n\t\tif (typeof operator !== 'string' || operator === opState.get()) { return; }\n\t\tif (!(operator in operators)) {\n\t\t\t// TODO: 不存在此操作符\n\t\t}\n\t\toperatorSelector.value = operator;\n\t\tconst component = getFieldFilter(field, operator);\n\t\tif (component === currentComponent) {\n\t\t\topState.set(operator);\n\t\t\treturn;\n\t\t}\n\t\thandleAbortController.abort();\n\t\thandleRoot.remove();\n\t\tcurrentComponent = component;\n\t\topState.set(operator);\n\n\t\thandleAbortController = new AbortController();\n\t\tcurrentHandle = createFilter(currentComponent, field, valState, opState, style, signal ? AbortSignal.any([handleAbortController.signal, signal]) : handleAbortController.signal);\n\t\thandleRoot = root.appendChild(currentHandle);\n\t\thandleRoot.classList.add(`FieldFilter-value`);\n\t}\n\toperatorSelector.addEventListener('input', () => setOperator(operatorSelector.value));\n\tsetOperator(operatorSelector.value);\n\treturn root\n}\n","/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { Search } from '@yongdall/common' */\nimport { createState, effect } from '../signal.mjs';\nimport createFieldFilter from './createFieldFilter.mjs';\n/**\n * @typedef {object} Filters\n * @property {HTMLElement} root\n * @property {() => void} add\n * @property {() => (Search.AndItem | null)[]} destroy\n */\n\n/**\n * \n * @param {HTMLElement} root \n * @param {Record<string, FieldScriptConfiguration>} fields \n * @param {(Search.AndItem | null)[]?} [value] \n * @returns {Filters}\n */\nexport default function createFilters(root, fields, value) {\n\troot.classList.add(`FieldFilter-filters`);\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tlet values = Array.isArray(value) ? structuredClone(value) : [];\n\n\n\tconst fieldsMap = new Map(Object.entries(fields).filter(([, f]) => {\n\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { return false; }\n\t\treturn true;\n\t}));\n\n\tconst style = { quick: false, showLabel: false, inline: true };\n\n\t/**\n\t * \n\t * @param {Search.AndItem?} [v] \n\t * @returns \n\t */\n\tfunction createLine(v) {\n\t\tconst line = root.appendChild(document.createElement('div'));\n\t\tline.classList.add(`FieldFilter-field`);\n\n\t\tconst fieldSelect = document.createElement('select');\n\t\tfieldSelect.classList.add(`FieldFilter-fieldName`);\n\t\tline.appendChild(fieldSelect);\n\t\tconst removeButton = document.createElement('button');\n\t\tremoveButton.classList.add(`FieldFilter-remove`);\n\t\tremoveButton.type = 'button';\n\t\tline.appendChild(removeButton);\n\t\tfieldSelect.appendChild(document.createElement('option'));\n\t\tfor (const [name, f] of fieldsMap) {\n\t\t\tconst type = f.type;\n\t\t\tif (!type || typeof type === 'object') { continue; }\n\t\t\tconst option = document.createElement('option');\n\t\t\toption.value = name;\n\t\t\toption.label = f.label || name;\n\t\t\tfieldSelect.appendChild(option);\n\t\t}\n\t\t/** @type {{name: string; abort(): void}?} */\n\t\tlet fieldFilter = null;\n\t\tremoveButton.appendChild(document.createTextNode('移除'));\n\t\tremoveButton.addEventListener('click', () => {\n\t\t\tfieldFilter?.abort();\n\t\t\tconst index = [...root.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tline.remove();\n\t\t\tvalues.splice(index, 1);\n\t\t});\n\t\tconst state = createState();\n\t\tconst operatorState = createState('');\n\t\tfunction updateLine() {\n\t\t\tconst index = [...root.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tconst f = values[index];\n\t\t\tconst value = state.get();\n\t\t\tconst operator = operatorState.get();\n\t\t\tif (f && f.length !== 2) {\n\t\t\t\tconst fields = f[0];\n\t\t\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\t\t\tconst field = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\t\t\tif (!field && !fieldFilter) { return; }\n\t\t\t\tif (f && fieldFilter && field === fieldFilter.name && f[2] === operator && f[1] === value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tvalues.splice(index, 1, fieldFilter ? [[fieldFilter.name], value, operator] : null);\n\t\t}\n\t\tfieldSelect.addEventListener('change', () => {\n\t\t\tconst name = fieldSelect.value;\n\t\t\tconst field = fieldsMap.get(name);\n\t\t\tif (!fieldFilter && !field) { return; }\n\t\t\tif (fieldFilter?.name === name) { return; }\n\t\t\tfieldFilter?.abort();\n\t\t\tif (!field) {\n\t\t\t\tfieldFilter = null;\n\t\t\t\tupdateLine();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst filterAbortController = new AbortController();\n\t\t\tconst ffSignal = AbortSignal.any([filterAbortController.signal, signal]);\n\n\t\t\tstate.set(undefined);\n\t\t\toperatorState.set('');\n\t\t\tconst filterRoot = createFieldFilter(field, state, operatorState, style, ffSignal)\n\t\t\tfieldFilter = { name, abort() {filterAbortController.abort()} };\n\t\t\t// TODO: 内容进行匹配\n\t\t\tline.insertBefore(filterRoot, removeButton);\n\t\t\tffSignal.addEventListener('abort', () => {\n\t\t\t\tfilterRoot.remove();\n\t\t\t});\n\t\t\teffect(updateLine, ffSignal);\n\t\t});\n\t\tif (!v) { return; }\n\n\t\tconst fields = v[0];\n\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\tconst fieldName = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\tfieldSelect.value = fieldName;\n\t\tif (!fieldSelect.value) { return; }\n\t\tconst currentField = fieldSelect.value;\n\t\tconst field = fieldsMap.get(currentField);\n\t\tif (!field) { return; }\n\t\tconst filterAbortController = new AbortController();\n\t\tconst ffSignal = AbortSignal.any([filterAbortController.signal, signal]);\n\n\t\tif (currentField === fieldName) {\n\t\t\tstate.set(v[1]);\n\t\t\toperatorState.set(v[2] || '');\n\t\t} else {\n\t\t\tstate.set(undefined);\n\t\t\toperatorState.set('');\n\t\t}\n\t\tconst filterRoot = createFieldFilter(field, state, operatorState, style, ffSignal);\n\t\tfieldFilter = { name: currentField, abort() {filterAbortController.abort()} }\n\t\tline.insertBefore(filterRoot, removeButton);\n\t\tffSignal.addEventListener('abort', () => {\n\t\t\tfilterRoot.remove();\n\t\t});\n\t\teffect(updateLine, ffSignal);\n\t}\n\n\n\tfunction reset() {\n\t\tfor (const v of values) {\n\t\t\tcreateLine(v);\n\t\t}\n\t}\n\treset();\n\tlet destroyed = false;\n\treturn {\n\t\troot,\n\t\tadd: () => createLine(),\n\t\tdestroy() {\n\t\t\tif (destroyed) { return values; }\n\t\t\tdestroyed = true;\n\t\t\troot.innerHTML = '';\n\t\t\tac.abort();\n\t\t\treturn values;\n\t\t}\n\t};\n}\n","export const root = document.createElement('div');\n","const head = /** @type {HTMLHeadElement} */(document.querySelector('head'));\nconst oldIconLink = /** @type {HTMLLinkElement?} */(document.querySelector('link[rel=icon]'));\nconst iconLink = oldIconLink || document.createElement('link');\niconLink.rel = 'icon';\nconst defaultIcon = iconLink.href;\nlet currentIcon = defaultIcon;\n/**\n * \n * @param {string?} icon \n */\nexport function setIcon(icon) {\n\tconst newIcon = icon || defaultIcon;\n\tif (newIcon === currentIcon) { return }\n\tcurrentIcon = newIcon;\n\tif (!newIcon) {\n\t\ticonLink.remove();\n\t\treturn;\n\t}\n\ticonLink.href = newIcon;\n\thead.appendChild(iconLink);\n}\n","\n/**\n * @template T\n * @overload\n * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Promise<T>}\n */\n/**\n * @overload\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {HTMLDialogElement}\n */\n/**\n * \n * @template T\n * @param {any} [p1]\n * @param {any} [p2] \n */\nexport function createDialog(p1, p2) {\n\t/** @type {((dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T)?} */\n\tconst exec = [p1, p2].find(v => typeof v === 'function') || null;\n\tconst options = [p1, p2].find(v => v && typeof v === 'object');\n\t/**\n\t * @type {{signal?: AbortSignal; parent?: HTMLElement}}\n\t */\n\tconst { signal, parent } = options || {};\n\tconst dialog = (parent || document.body).appendChild(document.createElement('dialog'));\n\tif (signal?.aborted) {\n\t\tdialog.remove();\n\t\tif (!exec) { return dialog; }\n\t\treturn Promise.reject(signal.reason);\n\t}\n\tdialog.addEventListener('close', () => { dialog.remove(); }, { once: true });\n\tsignal?.addEventListener('abort', () => { dialog.close(); }, { once: true });\n\tdialog.showModal();\n\tif (!exec) { return dialog; }\n\tconst ac = new AbortController();\n\t/** @type {PromiseWithResolvers<never>} */\n\tconst { promise, reject } = Promise.withResolvers();\n\tdialog.addEventListener('close', () => { ac.abort(); reject(); }, { once: true });\n\n\treturn Promise.race([\n\t\tPromise.resolve().then(() => exec(dialog, ac.signal)),\n\t\tpromise,\n\t]).finally(() => dialog.close());\n}\n","import { createState } from './signal.mjs';\nimport { neverAbortedSignal } from './constants.mjs';\n\n\nexport default class GeneralContext {\n\t#destroyed = createState(false);\n\t#waitDestroy;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t */\n\tconstructor(signal) {\n\t\t/*** @type {PromiseWithResolvers<never>} */\n\t\tconst { promise, reject } = Promise.withResolvers();\n\t\tthis.#waitDestroy = promise;\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tthis.#signal = signal;\n\t\t\tif (signal.aborted) {\n\t\t\t\tthis.#destroyed.set(true);\n\t\t\t} else {\n\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\tthis.#destroyed.set(true);\n\t\t\t\t}, { once: true });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#signal = neverAbortedSignal;\n\t\t}\n\t}\n\t/**\n\t * @overload\n\t * @param {false} [useReject]\n\t * @returns {Promise<void>}\n\t */\n\t/**\n\t * @overload\n\t * @param {true} useReject\n\t * @returns {Promise<never>}\n\t */\n\t/**\n\t * @overload\n\t * @param {boolean} [useReject] \n\t * @returns {Promise<void | never>}\n\t */\n\t/**\n\t * \n\t * @param {boolean} [useReject] \n\t * @returns \n\t */\n\twaitDestroy(useReject) {\n\t\tif (useReject) { return this.#waitDestroy; }\n\t\treturn this.#waitDestroy.catch((() => { }));\n\t}\n\tget destroyed() { return this.#destroyed.get(); }\n\t/** @type {AbortSignal} */\n\t#signal;\n\tget signal() { return this.#signal; }\n}\n","import GeneralContext from '../GeneralContext.mjs';\n\n\n\nexport class ModalFooter extends GeneralContext {\n\t#root;\n\t#container = document.createElement('div');\n\tget container() { return this.#container; }\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\troot.className = 'Modal-footer';\n\t\tcontainer.className = 'Modal-footer-main';\n\t}\n}\n","/** @import { FieldScriptConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\nimport { runPattern } from '@yongdall/common';\nimport createShowField from './createShowField.mjs';\n\nexport default class List {\n\t/** @type {((id: string) => string)?} */\n\t#createUrl;\n\t/** @type {readonly [string, FieldScriptConfiguration][]} */\n\t#fieldsShow;\n\t/** @type {string} */\n\t#labelPattern;\n\t/** @type {string[]} */\n\t#idFields;\n\t/** @type {readonly any[]} */\n\t#documents = [];\n\t#table = document.createElement('table');\n\t#thead = this.#table.appendChild(document.createElement('thead'));\n\t#tr = this.#thead.appendChild(document.createElement('tr'));\n\t#tbody = this.#table.appendChild(document.createElement('tbody'));\n\tget root() { return this.#table }\n\tget createUrl() {\n\t\treturn this.#createUrl;\n\t}\n\tset createUrl(fn) {\n\t\tconst createUrl = typeof fn === 'function' ? fn : null;\n\t\tif (this.#createUrl === createUrl) { return }\n\t\tthis.#createUrl = createUrl;\n\t\tthis.#renderList();\n\t}\n\t/**\n\t * \n\t * @param {(id: string) => string} createUrl \n\t * @param {ModelScriptConfiguration} model \n\t */\n\tconstructor(createUrl, model) {\n\t\tconst fieldsShow = Object.entries(model.fields).filter(([,{type}]) => type && typeof type !== 'object');\n\t\tconst idFields = Object.entries(model.fields).filter(([,v]) => v.primary).map(([v]) => v);\n\t\tconst labelPattern = model.labelPattern || '';\n\t\tthis.#labelPattern = labelPattern;\n\t\tthis.#createUrl = typeof createUrl === 'function' ? createUrl : null;\n\t\tthis.#fieldsShow = fieldsShow;\n\t\tthis.#idFields = idFields;\n\t\tconst tr = this.#tr;\n\t\ttr.innerHTML = '';\n\t\tconst th = tr.appendChild(document.createElement('th'));\n\t\tth.appendChild(document.createTextNode('#'));\n\t\tfor (const [name,field] of fieldsShow) {\n\t\t\tconst th = tr.appendChild(document.createElement('th'));\n\t\t\tth.appendChild(document.createTextNode(field.label || name));\n\t\t}\n\t}\n\t#renderList() {\n\t\tconst tbody = this.#tbody;\n\t\ttbody.innerHTML = '';\n\t\tconst idFields = this.#idFields;\n\t\tconst labelPattern = this.#labelPattern;\n\t\tconst fieldsShow = this.#fieldsShow;\n\t\tconst createUrl = this.#createUrl;\n\t\tfor (const r of this.#documents) {\n\t\t\tconst tr = tbody.appendChild(document.createElement('tr'));\n\t\t\tconst td = tr.appendChild(document.createElement('td'));\n\t\t\tconst label = runPattern(labelPattern, r) || idFields.map(v => r[v]).join('$')\n\t\t\tif (createUrl) {\n\t\t\t\tconst a = td.appendChild(document.createElement('a'));\n\t\t\t\ta.href = createUrl(idFields.map(v => r[v]).join('$'));\n\t\t\t\ta.appendChild(document.createTextNode(label));\n\t\t\t} else {\n\t\t\t\ttd.appendChild(document.createTextNode(label));\n\t\t\t}\n\t\t\tfor (const [name,field] of fieldsShow) {\n\t\t\t\tconst td = tr.appendChild(document.createElement('td'));\n\t\t\t\tconst f = createShowField(name, field, {inline: true}, r);\n\t\t\t\ttd.appendChild(f.root);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {readonly any[]} list \n\t */\n\tsetData(list) {\n\t\tthis.#documents = list;\n\t\tthis.#renderList();\n\n\t}\n\tdestroy() {\n\t\t\n\t}\n}\n","/** @import { Menu } from './Menu.mjs' */\nimport FormList from './form/List.mjs';\nexport let List = FormList;\nexport let Pagination = class {\n\t#pagination = document.createElement('div');\n\tget root() {return this.#pagination; }\n\tget size() { return 5}\n\tset size(v) { }\n\tget page() { return 1}\n\tset page(v) { }\n\tget total() { return 0}\n\tset total(v) { }\n\t/**\n\t * \n\t * @param {(p: Pagination) => void} listen \n\t * @returns {() => void}\n\t */\n\tlisten(listen) {\n\t\treturn () => {}\n\t}\n\tdestroy() {\n\t\t\n\t}\n}\n;\n\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {Menu.Renderer} create \n * @param {AbortSignal} signal \n * @returns {Element?}\n */\nexport let createMenuButtons = (menus, create, signal) => null;\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {any} button \n * @param {Menu.Renderer} create \n * @param {AbortSignal} signal \n * @returns {Element?}\n */\nexport let createMenuButton = (menus, button, create, signal) => null;\n\n\n/** @type {Menu.Renderer} */\nexport let createMenuItem = () => null;\n\n/**\n * \n * @param {Record<string, any>} components \n */\nexport default function setComponents(components = {}) {\n\tList = components.list || components.List || List;\n\tPagination = components.pagination || components.Pagination || Pagination;\n\tconst menuButtons = components.createMenuButtons || components.menuButtons;\n\tconst menuButton = components.createMenuButton || components.menuButton;\n\tconst menuItem = components.createMenuItem || components.menuItem;\n\tif (typeof menuButtons === 'function') {\n\t\tcreateMenuButtons = menuButtons;\n\t}\n\tif (typeof menuButton === 'function') {\n\t\tcreateMenuButton = menuButton;\n\t}\n\tif (typeof menuItem === 'function') {\n\t\tcreateMenuItem = menuItem;\n\t}\n}\n","/**\n * @typedef {object} Menu\n * 菜单显示\n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 引用ID\n * @property {string} [refMode] 引用模式:展开/子菜单\n * \n * 菜单操作\n * @property {string} [page] 页面\n * @property {string} [path] 页面路径\n * @property {string} [uri] URI\n * @property {string} [target] URI打开目标窗口\n * @property {string} [command] 指令\n * @property {string} [script] 脚本\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * @property {boolean} [logged]\n * \n * 三方扩展\n * @property {boolean} [autoLogin] 自动登录\n * @property {string} [appId] 关联应用\n * \n * @property {(Menu | null)[]} children\n * @property {Menu.Button[]} buttons\n * \n * @property {string} [permission] 权限\n * \n * @property {boolean} [collapsed] 折叠\n * \n */\n\nimport { createMenuButton, createMenuButtons, createMenuItem } from './components.mjs';\nimport { neverAbortedSignal } from './constants.mjs';\n\n\n/**\n * @typedef {object} Menu.Button\n * \n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 引用ID\n * @property {string} [refMode] 引用模式:展开/子菜单\n * \n * 菜单操作\n * @property {string} [page] 页面\n * @property {string} [path] 页面路径\n * @property {string} [uri] URI\n * @property {string} [target] URI打开目标窗口\n * @property {string} [command] 指令\n * @property {string} [script] 脚本\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * \n * 三方扩展\n * @property {boolean} [autoLogin] 自动登录\n * @property {string} [appId] 关联应用\n * \n * @property {string} [permission] 权限\n * \n */\n\n/**\n * @typedef {object} Menu.Define\n * @property {string} [groupType]\n * @property {string} [group]\n * @property {number} [no]\n * @property {'' | 'button' | 'divider'} type\n * @property {number} level\n * \n * 菜单显示\n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 连接:引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 连接:引用ID\n * @property {string} [refMode] 连接:引用模式:展开/子菜单\n * \n * 菜单操\n * @property {string} [page] 连接:页面\n * @property {string} [path] 连接:页面路径\n * @property {string} [uri] 连接:URI\n * @property {string} [target] 连接:URI打开目标窗口\n * @property {string} [command]\n * @property {string} [script]\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * \n * \n * @property {boolean} [autoLogin] 三方扩展:自动登录\n * @property {string} [appId] 三方扩展:关联应用\n * \n * @property {string} [permission] 权限\n * \n * @property {boolean} [collapsed] 折叠\n * \n */\n/**\n * @typedef {(menu: Menu, signal: AbortSignal, isButton?: boolean) => HTMLElement?} Menu.Renderer\n */\n\nconst actionProps = [\n\t'uri', 'target', 'page', 'path', 'command', 'script', 'click',\n];\n\n\n/**\n * \n * @param {Record<string, any>} data\n * @param {string[]} actionProps \n */\nfunction clear(data, actionProps) {\n\tfor (const k of actionProps) {\n\t\tdelete data[k];\n\n\t}\n\treturn data;\n}\n/**\n * @param {Menu.Define[]} list \n * @param {Menu.Button[]} [rootButtons] \n * @returns {(Menu | null)[]}\n */\nfunction fromDefine(list, rootButtons = []) {\n\t/** @type {(Menu | null)[]} */\n\tconst rootMenus = [];\n\t/** @type {(Menu | null)[]} */\n\tconst parents = [];\n\tfor (const { level: levelX, type, ...item } of list) {\n\t\tconst level = Math.max(0, Math.floor(levelX)) || 0;\n\t\tparents.length = level;\n\t\tconst parent = parents.findLast(Boolean);\n\t\tif (type === 'button') {\n\t\t\t/** @type {Menu.Button} */\n\t\t\tconst button = item;\n\t\t\tif (parent) {\n\t\t\t\tparent.buttons.push(button);\n\t\t\t} else {\n\t\t\t\trootButtons.push(button);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t/** @type {Menu?} */\n\t\tconst menu = type === 'divider' ? null : { ...item, buttons: [], children: [] };\n\t\tif (parent) {\n\t\t\tparent.children.push(menu);\n\t\t} else {\n\t\t\trootMenus.push(menu);\n\t\t}\n\t\tparents[level] = menu;\n\t}\n\treturn rootMenus;\n}\n\n\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {(menu: Menu) => boolean} [filter] \n * @param {boolean?} [expandSingle] \n */\nfunction filterMenu(menus, filter, expandSingle) {\n\t/** @type {(Menu | null)[]} */\n\tconst result = [];\n\tfor (const menu of menus) {\n\t\tif (!menu) {\n\t\t\tresult.push(menu);\n\t\t\tcontinue;\n\t\t}\n\t\tconst { children } = menu;\n\t\tif (filter && !filter(menu)) { continue; }\n\t\tif (!children?.length) {\n\t\t\tresult.push(menu);\n\t\t\tcontinue;\n\t\t}\n\t\tconst list = filterMenu(children, filter, expandSingle).filter((m, i, s) => {\n\t\t\tif (m) { return true; }\n\t\t\tif (i === 0) { return true; }\n\t\t\tif (s[i - 1]) { return true; }\n\t\t\treturn false;\n\t\t});\n\t\tif (!list.length) { continue; }\n\t\tif (expandSingle && list.filter(Boolean).length <= 1) {\n\t\t\tresult.push(...list);\n\t\t} else {\n\t\t\tif (!list[list.length - 1]) { list.pop(); }\n\t\t\tif (!list[0]) { list.shift(); }\n\t\t\tresult.push({ ...menu, children: list });\n\t\t}\n\t}\n\tif (expandSingle && result.length === 1) {\n\t\tconst [item] = result;\n\t\tif (item?.children?.length) {\n\t\t\treturn item.children;\n\t\t}\n\t}\n\treturn result;\n}\n/**\n * @template T\n * @overload\n * @param {Map<string, Map<string, T>>} map \n * @param {T} value \n * @param {string} key1\n * @param {string} key2\n * @returns {void}\n */\n/**\n * \n * @param {Map<any, any>} map \n * @param {*} value \n * @param {...any} keys \n */\nfunction setMapValue(map, value, ...keys) {\n\tlet m = map;\n\tconst last = keys.pop();\n\tfor (const key of keys) {\n\t\tlet map = m.get(key);\n\t\tif (!map) {\n\t\t\tmap = new Map();\n\t\t\tm.set(key, map);\n\t\t}\n\t\tm = map;\n\t}\n\tm.set(last, value);\n}\n\n/**\n * \n * @param {Menu.Define[]} menus \n * @param {string} groupType \n * @param {string} group \n * @param {Menu.Button[]} [buttons]\n * @returns {(Menu | null)[]}\n */\nfunction buildMenu(menus, groupType, group, buttons) {\n\t/** @type {Map<string, Map<string, (Menu | null)[]>>} */\n\tconst menuGroups = new Map();\n\t/** @type {Map<string, Map<string, Menu.Button[]>>} */\n\tconst buttonGroups = new Map();\n\tfor (const [groupType, v] of Map.groupBy(menus, m => m.groupType || '').entries()) {\n\t\tfor (const [group, list] of Map.groupBy(v, m => m.group || '').entries()) {\n\t\t\t/** @type {Menu.Button[]} */\n\t\t\tconst buttons = [];\n\t\t\tconst menu = fromDefine(list, buttons);\n\t\t\tsetMapValue(buttonGroups, buttons, groupType, group);\n\t\t\tsetMapValue(menuGroups, menu, groupType, group);\n\t\t}\n\t}\n\t/** @type {Map<string, Map<string, (Menu | null)[]>>} */\n\tconst allMenuTypes = new Map();\n\t/** @type {Map<string, Map<string, Menu.Button[]>>} */\n\tconst allButtonTypes = new Map();\n\t/**\n\t * \n\t * @param {Menu.Button[]} buttons \n\t */\n\tfunction runButton(buttons) {\n\t\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\t\tconst menu = buttons[i];\n\t\t\tconst { refType, refId } = menu;\n\t\t\tif (!refType || !refId) { continue; }\n\t\t\tclear(menu, actionProps);\n\t\t\tconst subButtons = allButtonTypes.get(refType)?.get(refId);\n\t\t\tbuttons.splice(i, 1, ...subButtons || []);\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t */\n\tfunction runMenu(menus) {\n\t\tfor (let i = menus.length - 1; i >= 0; i--) {\n\t\t\tconst menu = menus[i];\n\t\t\tif (!menu) { continue; }\n\t\t\tif (menu.children?.length) {\n\t\t\t\trunMenu(menu.children);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { refType, refId, refMode } = menu;\n\t\t\tif (!refType || !refId) { continue; }\n\t\t\tclear(menu, actionProps);\n\t\t\tconst subMenus = allMenuTypes.get(refType)?.get(refId);\n\t\t\tconst subButtons = allButtonTypes.get(refType)?.get(refId);\n\t\t\tif (!subMenus?.length && !subButtons?.length) {\n\t\t\t\tmenus.splice(i, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (refMode === 'replace') {\n\t\t\t\tmenus.splice(i, 1, ...subMenus || []);\n\t\t\t} else {\n\t\t\t\tmenu.children = subMenus || [];\n\t\t\t\tmenu.buttons = subButtons || [];\n\t\t\t}\n\t\t}\n\t}\n\tconst types = ['builtin', 'module', 'group'];\n\tfor (const type of types) {\n\t\tconst menus = menuGroups.get(type);\n\t\tif (menus) {\n\t\t\tfor (const list of menus.values()) {\n\t\t\t\trunMenu(list);\n\t\t\t}\n\t\t\tallMenuTypes.set(type, menus);\n\t\t}\n\t\tconst buttons = buttonGroups.get(type);\n\t\tif (buttons) {\n\t\t\tfor (const list of buttons.values()) {\n\t\t\t\trunButton(list);\n\t\t\t}\n\t\t\tallButtonTypes.set(type, buttons);\n\t\t}\n\t\tmenuGroups.delete(type);\n\t\tbuttonGroups.delete(type);\n\t}\n\tfor (const t of menuGroups.values()) {\n\t\tfor (const menus of t.values()) {\n\t\t\trunMenu(menus);\n\t\t}\n\t}\n\tfor (const t of buttonGroups.values()) {\n\t\tfor (const list of t.values()) {\n\t\t\trunButton(list);\n\t\t}\n\t}\n\tfor (const [k, v] of buttonGroups.entries()) {\n\t\tallButtonTypes.set(k, v);\n\t}\n\tfor (const [k, v] of menuGroups.entries()) {\n\t\tallMenuTypes.set(k, v);\n\t}\n\tif (buttons) {\n\t\tfor (const button of allButtonTypes.get(groupType)?.get(group) || []) {\n\t\t\tbuttons.push(button);\n\t\t}\n\t}\n\treturn allMenuTypes.get(groupType)?.get(group) || [];\n}\n\n\nexport const Menu = {\n\t/**\n\t * @param {Menu.Define[]} list \n\t * @param {Menu.Button[]} [buttons] \n\t * @returns {(Menu | null)[]}\n\t */\n\tfromDefine(list, buttons) { return fromDefine(list, buttons); },\n\t/**\n\t * \n\t * @param {Menu.Define[]} menus \n\t * @param {string} groupType \n\t * @param {string} group \n\t * @param {Menu.Button[]} [buttons]\n\t * @returns {(Menu | null)[]}\n\t */\n\tbuild(menus, groupType, group, buttons) {\n\t\treturn buildMenu(menus, groupType, group, buttons);\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {(menu: Menu) => boolean} [filter] \n\t * @param {boolean?} [expandSingle] \n\t */\n\tfilter(menus, filter, expandSingle) {\n\t\tconst result = filterMenu(menus, filter, expandSingle);\n\t\t/** @type {(Menu | null)[]} */\n\t\tconst list = [];\n\t\tlet divider = false;\n\t\tfor (const r of result) {\n\t\t\tif (r) {\n\t\t\t\tif (divider) {\n\t\t\t\t\tlist.push(null);\n\t\t\t\t}\n\t\t\t\tdivider = false;\n\t\t\t\tlist.push(r);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!list.length) { continue; }\n\t\t\tdivider = true;\n\t\t}\n\t\treturn list;\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {any} button \n\t * @param {Menu.Renderer} create \n\t * @param {AbortSignal?} [signal] \n\t * @returns {Element?}\n\t */\n\tcreateButton(menus, button, create, signal) {\n\t\treturn createMenuButton(menus, button, create, signal || neverAbortedSignal)\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {Menu.Renderer} create \n\t * @param {AbortSignal?} [signal] \n\t * @returns {Element?}\n\t */\n\tcreateButtons(menus, create, signal) {\n\t\treturn createMenuButtons(menus, create, signal || neverAbortedSignal)\n\t},\n\t/**\n\t * \n\t * @param {Menu} menu \n\t * @param {AbortSignal?} [signal] \n * @param {boolean} [isButton] \n\t */\n\tcreateItem(menu, signal, isButton) {\n\t\treturn createMenuItem(menu, signal || neverAbortedSignal, isButton);\n\t},\n};\n","import GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\n\n\n\nexport class ModalHeader extends GeneralContext {\n\t#root;\n\t#container = document.createElement('div');\n\t#menu = document.createElement('div');\n\t#buttons = document.createElement('div');\n\tget container() { return this.#container; }\n\tget buttons() { return this.#buttons; }\n\t#destroyMenu = () => { };\n\t/**\n\t * \n\t * @param {*} menus \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, create = Menu.createItem) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#destroyMenu();\n\t\tconst menuContainer = this.#menu;\n\t\tconst ac = new AbortController();\n\t\tconst menu = Menu.createButtons(menus, create, AbortSignal.any([ac.signal, this.signal]));\n\t\tif (menu) { menuContainer.appendChild(menu); }\n\t\tthis.#destroyMenu = () => { ac.abort(); menu?.remove(); this.#destroyMenu = () => { }; };\n\t}\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\tconst menu = root.appendChild(this.#menu);\n\t\tconst buttons = root.appendChild(this.#buttons);\n\t\troot.className = 'Modal-header';\n\t\tcontainer.className = 'Modal-header-main';\n\t\tmenu.className = 'Modal-header-menu';\n\t\tbuttons.className = 'Modal-header-buttons';\n\t}\n}\n","import GeneralContext from '../GeneralContext.mjs';\nimport { ModalFooter } from './ModalFooter.mjs';\nimport { ModalHeader } from './ModalHeader.mjs';\nexport class Modal extends GeneralContext {\n\t#dialog = document.createElement('dialog');\n\t#ac;\n\t#main = this.#dialog.appendChild(document.createElement('div'));\n\t/**\n\t * @param {object} [options] \n\t * @param {AbortSignal} [options.signal] \n\t * @param {HTMLElement} [options.parent] \n\t */\n\tconstructor(options) {\n\t\tconst { signal, parent } = options || {};\n\t\tconst ac = new AbortController();\n\t\tsuper(\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, ac.signal])\n\t\t\t\t: ac.signal,\n\t\t);\n\t\tconst dialog = (parent || document.body).appendChild(this.#dialog);\n\t\tthis.#ac = ac;\n\t\tdialog.addEventListener('close', () => { ac.abort(); dialog.remove(); }, { once: true });\n\t\tthis.signal.addEventListener('abort', () => { dialog.close(); }, { once: true });\n\t\tdialog.className = 'Modal';\n\t\tthis.#main.className = 'Modal-body';\n\t\tdialog.showModal();\n\t}\n\tget container() { return this.#main; }\n\t/**\n\t * @template T\n\t * @param {(dialog: this) => PromiseLike<T> | T} exec\n\t * @returns {Promise<T>}\n\t */\n\tasync do(exec) {\n\t\tthis.signal.throwIfAborted();\n\t\ttry {\n\t\t\treturn await Promise.race([\n\t\t\t\texec(this),\n\t\t\t\tthis.waitDestroy(true),\n\t\t\t]);\n\t\t} finally {\n\t\t\tthis.#ac.abort();\n\t\t}\n\t}\n\n\t/** @type {ModalHeader?} */\n\t#header = null;\n\t/** @type {AbortController?} */\n\t#headerAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateHeader(signal) {\n\t\tthis.signal.throwIfAborted();\n\t\tif (signal?.aborted) {\n\t\t\tconst headerAbortController = this.#headerAbortController;\n\t\t\tif (headerAbortController) {\n\t\t\t\theaderAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#header) { return this.#header; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#dialog.insertBefore(root, this.#main);\n\t\tthis.#headerAbortController = abortController;\n\t\tconst header = new ModalHeader(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#header = header;\n\t\theader.signal.addEventListener('abort', () => {\n\t\t\tthis.#headerAbortController = null;\n\t\t\tthis.#header = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#header;\n\t}\n\t/** @type {ModalFooter?} */\n\t#footer = null;\n\t/** @type {AbortController?} */\n\t#footAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateFooter(signal) {\n\t\tthis.signal.throwIfAborted();\n\t\tif (signal?.aborted) {\n\t\t\tconst footAbortController = this.#footAbortController;\n\t\t\tif (footAbortController) {\n\t\t\t\tfootAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#footer) { return this.#footer; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#dialog.appendChild(root);\n\t\tthis.#footAbortController = abortController;\n\t\tconst footer = new ModalFooter(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#footer = footer;\n\n\t\tfooter.signal.addEventListener('abort', () => {\n\t\t\tthis.#footAbortController = null;\n\t\t\tthis.#footer = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#footer;\n\t}\n}\n","import { Modal } from './Modal.mjs';\n\n/**\n * @template T\n * @overload\n * @param {(modal: Modal) => PromiseLike<T> | T} exec\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Promise<T>}\n */\n/**\n * @overload\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Modal}\n */\n\n\n/**\n * \n * @template T\n * @param {any} [p1]\n * @param {any} [p2] \n */\nexport function createModal(p1, p2) {\n\tconst options = [p1, p2].find(v => v && typeof v === 'object');\n\tconst modal = new Modal(options);\n\t/** @type {((modal: Modal) => PromiseLike<T> | T)?} */\n\tconst exec = [p1, p2].find(v => typeof v === 'function') || null;\n\tif (typeof exec !== 'function') { return modal; }\n\treturn modal.do(exec);\n}\n","export { root } from './root.mjs';\nexport { setIcon } from './setIcon.mjs';\nexport { createDialog } from './createDialog.mjs';\nexport { createModal } from './createModal.mjs';\nexport { Modal } from './Modal.mjs';\nexport { ModalFooter } from './ModalFooter.mjs';\nexport { ModalHeader } from './ModalHeader.mjs';\n\n\nexport const isMac = (() => {\n\t// @ts-ignore\n\tconst userAgentData = navigator.userAgentData;\n if (userAgentData?.platform) { return userAgentData.platform === 'macOS'; }\n const isMacUA = /macintosh|mac os x/i.test(navigator.userAgent.toLowerCase());\n\tif (isMacUA) { return true; }\n return navigator.platform.toLowerCase().includes('mac');\n})();\n","/** @import { Search } from '@yongdall/common' */\n/** @import { FieldScriptConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\n/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n\nimport { createDialog } from '../dom/index.mjs';\nimport { createState, effect, watch } from '../signal.mjs';\nimport createFilter from './createFilter.mjs';\nimport { getFieldFilterOperators } from './field.mjs';\nimport { getFieldFilter } from './field.mjs';\n\n/**\n * \n * @param {ModelScriptConfiguration} modelDefine \n * @param {Search.AndItem[]?} [value] \n * @param {HTMLElement} [root] \n * @param {AbortSignal} [signal] \n * @returns {Promise<Search.AndItem[]>}\n */\nexport default async function showFilterDialog(modelDefine, value, root, signal) {\n\tif (signal?.aborted) { return Promise.reject(signal.reason); }\n\tconst { resolve, reject, promise } = Promise.withResolvers();\n\tconst fields = modelDefine.fields;\n\tconst values = Array.isArray(value) ? structuredClone(value) : [];\n\tconst fieldsMap = new Map(Object.entries(fields).filter(([, f]) => {\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { return false; }\n\t\treturn true;\n\t}));\n\tconst dialog = createDialog({parent: root});\n\tconst list = dialog.appendChild(document.createElement('div'));\n\tconst form = dialog.appendChild(document.createElement('form'));\n\tconst addItem = form.appendChild(document.createElement('select'));\n\tconst okButton = form.appendChild(document.createElement('button'));\n\tconst cancelButton = form.appendChild(document.createElement('button'));\n\n\tdialog.classList.add(`Modal`);\n\tlist.classList.add(`Modal-body`);\n\tform.classList.add(`Modal-footer`);\n\tform.classList.add(`MenuButtons`);\n\n\tlist.classList.add(`FieldFilter-filters`);\n\tokButton.value = 'ok';\n\tform.method = 'dialog';\n\tokButton.appendChild(document.createTextNode('确认'));\n\tcancelButton.appendChild(document.createTextNode('取消'));\n\n\n\n\n\tconst v = addItem.appendChild(document.createElement('option'));\n\tv.label = '<添加>';\n\tfor (const [name, f] of fieldsMap) {\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { continue; }\n\t\tconst option = document.createElement('option');\n\t\toption.value = name;\n\t\toption.label = f.label || name;\n\t\taddItem.appendChild(option);\n\t}\n\n\t/**\n\t * \n\t * @param {Search.AndItem} v\n\t * @param {string} fieldName\n\t * @param {FieldScriptConfiguration} field\n\t * @param {Search.Field[]} fields\n\t * @returns \n\t */\n\tfunction createLine(v, fieldName, field, fields) {\n\t\tconst ac = new AbortController();\n\t\tconst lineSignal = signal ? AbortSignal.any([signal, ac.signal]) : ac.signal;\n\t\tconst line = list.appendChild(document.createElement('div'));\n\t\tline.classList.add(`FieldFilter-field`);\n\n\t\tconst fieldNameSelect = document.createElement('span');\n\t\tfieldNameSelect.classList.add(`FieldFilter-fieldName`);\n\t\tline.appendChild(fieldNameSelect);\n\t\tfieldNameSelect.appendChild(document.createTextNode(field.label || fieldName));\n\n\n\n\t\t/** @type {FieldFilterStyle} */\n\t\tconst style = { inline: true };\n\t\tconst operators = getFieldFilterOperators(field);\n\t\tconst root = document.createElement('span');\n\t\troot.classList.add(`FieldFilter-main`);\n\t\tconst operatorSelector = line.appendChild(document.createElement('select'));\n\t\toperatorSelector.classList.add(`FieldFilter-operator`);\n\n\t\tfor (const [value, label] of Object.entries(operators)) {\n\t\t\tconst option = document.createElement('option');\n\t\t\toption.value = value;\n\t\t\toption.label = label || value;\n\t\t\toperatorSelector.appendChild(option);\n\t\t}\n\n\t\tconst removeButton = document.createElement('button');\n\t\tremoveButton.classList.add(`FieldFilter-remove`);\n\t\tremoveButton.type = 'button';\n\t\tline.appendChild(removeButton);\n\t\tremoveButton.appendChild(document.createTextNode('移除'));\n\t\tremoveButton.addEventListener('click', () => {\n\t\t\tac.abort();\n\t\t\tconst index = [...list.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tline.remove();\n\t\t\tvalues.splice(index, 1);\n\n\t\t});\n\t\t/**\n\t\t * \n\t\t * @param {*} value \n\t\t * @param {string} operator \n\t\t * @returns \n\t\t */\n\t\tfunction find(value, operator) {\n\t\t\tconst index = [...list.children].indexOf(line);\n\t\t\tif (index < 0) { return -1; }\n\t\t\tconst item = values[index];\n\t\t\tif (!item) { return index; }\n\t\t\tif (Object.is(value, item[1])) { return index; }\n\t\t\tif (Object.is(operator, item[2])) { return index; }\n\t\t\treturn -1;\n\n\t\t}\n\n\n\t\tlet operator = v[2] || '';\n\t\toperatorSelector.value = operator;\n\t\t/** @type {any} */\n\t\tlet newValue = v[1];\n\t\tif (operatorSelector.value != operator) {\n\t\t\toperator = operatorSelector.value;\n\t\t\tnewValue = null;\n\t\t}\n\t\tconst state = createState(newValue);\n\t\tconst operatorState = createState(operator);\n\t\teffect(() => {\n\t\t\tconst value = state.get();\n\t\t\tconst operator = operatorState.get();\n\t\t\tconst index = find(value, operator);\n\t\t\tif (index < 0) { return; }\n\t\t\tvalues.splice(index, 1, [fields, value, operator]);\n\t\t}, lineSignal);\n\t\t\n\t\tlet currentComponent = getFieldFilter(field, operatorState.get());\n\n\t\tlet handleAbortController = new AbortController();\n\t\tlet currentHandle = createFilter(currentComponent, field, state, operatorState, style, AbortSignal.any([handleAbortController.signal, lineSignal]));\n\t\toperatorSelector.value = operatorState.get();\n\t\tlet handleRoot = line.insertBefore(currentHandle, removeButton);\n\t\thandleRoot.classList.add(`FieldFilter-value`);\n\n\n\t\toperatorSelector.addEventListener('input', () => {\n\t\t\tconst newOperator = operatorSelector.value;\n\t\t\tif (!(newOperator in operators)) {\n\t\t\t\t// TODO: 不存在此操作符\n\t\t\t}\n\t\t\tif (typeof newOperator !== 'string') { return; }\n\t\t\tconst component = getFieldFilter(field, newOperator);\n\t\t\tif (component === currentComponent) {\n\t\t\t\toperatorState.set(newOperator);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleAbortController.abort();\n\t\t\thandleRoot.remove();\n\t\t\tcurrentComponent = component;\n\t\t\toperatorState.set(newOperator);\n\t\t\thandleAbortController = new AbortController();\n\t\t\tcurrentHandle = createFilter(currentComponent, field, state, operatorState, style, AbortSignal.any([handleAbortController.signal, lineSignal]));\n\t\t\thandleRoot = line.insertBefore(currentHandle, removeButton);\n\t\t\thandleRoot.classList.add(`FieldFilter-value`);\n\t\t});\n\t}\n\tfor (const v of values) {\n\n\t\tconst fields = v[0];\n\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\tconst fieldName = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\tconst field = fieldsMap.get(fieldName);\n\t\tif (!field) {\n\t\t\t// TODO: 添加占位符\n\t\t\tcontinue;\n\t\t}\n\t\tcreateLine(v, fieldName, field, fields);\n\t}\n\n\n\n\taddItem.addEventListener('change', () => {\n\t\tconst name = addItem.value;\n\t\taddItem.value = '';\n\t\tconst field = fieldsMap.get(name);\n\t\tif (!field) { return; }\n\t\tcreateLine([[name], '', ''], name, field, [[name]]);\n\t});\n\n\tdialog.addEventListener('close', () => {\n\t\tlist.innerHTML = '';\n\t\tif (signal?.aborted) { return reject(signal.reason); }\n\t\tif (dialog.returnValue !== 'ok') { return reject(new Error('User canceled')); }\n\t\tresolve(values.filter(/** @type {(v: Search.AndItem?) => v is Search.AndItem} */(/** @type {any} */(Boolean))));\n\t});\n\n\treturn promise.finally(() => dialog.close());\n\n}\n","import { application } from '../configuration.mjs';\n\n/**\n * \n * @param {...string} paths \n * @returns \n */\nexport default function toUrl(...paths) {\n\tlet url = '/'\n\tfor (const path of paths) {\n\t\tconst a = url.lastIndexOf('?');\n\t\tif (a >= 0 && url.lastIndexOf('#') < a) {\n\t\t\turl += '#'\n\t\t}\n\t\turl += '/' + path;\n\t}\n\turl = url.split('#').map(s => {\n\t\tconst index = s.indexOf('?');\n\t\tconst path = index >= 0 ? s.slice(0, index) : s;\n\t\tconst search = index >= 0 ? s.slice(index) : '';\n\t\tconst p = path.split('/');\n\t\tconst first = p.shift() || '';\n\t\t/** @type {string[]} */\n\t\tconst list = [];\n\t\tfor (const k of p) {\n\t\t\tif (!k) { continue; }\n\t\t\tif (k === '.') { continue; }\n\t\t\tif (k === '..'){\n\t\t\t\tlist.pop();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(k);\n\t\t}\n\t\tlist.unshift(first);\n\t\treturn `${list.join('/')}${search}`;\n\t}).join('#');\n\tconst root = application.path;\n\tif (url.startsWith(root)) { return url }\n\tconst k1 = url.indexOf('?');\n\tconst k2 = url.indexOf('#');\n\tconst k = k1 < 0 ? k2 : k2 < 0 ? k1 : Math.min(k1,k2);\n\tconst path = k < 0 ? url : url.slice(0, k);\n\tif (path.length !== root.length - 1) { return url}\n\tif (!root.startsWith(path)) { return url; }\n\tif (k < 0) { return root};\n\treturn root + url.slice(k);\n}\n","import { pluginIdRegex } from '@yongdall/common';\n\n/**\n * \n * @param {string} n \n * @returns {boolean}\n */\nexport default function isPluginId(n) {\n\tif (!n || typeof n !== 'string') { return false}\n\treturn pluginIdRegex.test(n);\n}\n","\n/**\n * \n * @overload\n * @param {AbortSignal | null | undefined} signal \n * @param {true} useReject \n * @returns {Promise<never>}\n */\n\n/**\n * \n * @overload\n * @param {AbortSignal?} [signal] \n * @param {boolean?} [useReject] \n * @returns {Promise<void | never>}\n */\n\n/**\n * \n * @param {AbortSignal?} [signal] \n * @param {boolean?} [useReject] \n * @returns {Promise<void | never>}\n */\nexport default function waitAbortSignal(signal, useReject) {\n\t/** @type {PromiseWithResolvers<void | never>} */\n\tconst { promise, resolve, reject } = Promise.withResolvers();\n\tif (!(signal instanceof AbortSignal)) { return promise; }\n\tif (signal.aborted) {\n\t\tif (useReject) {\n\t\t\treject(signal.reason);\n\t\t} else {\n\t\t\tresolve();\n\t\t}\n\t} else {\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tif (useReject) {\n\t\t\t\treject(signal.reason);\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, { once: true });\n\t}\n\treturn promise;\n}\n","/** @type {(0|1)[][]} */\nconst bars = [\n\t[1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0],\n\t[1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0],\n\t[1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0],\n\t[1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0],\n\t[1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0],\n\t[1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0],\n\t[1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0],\n\t[1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0],\n\t[1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0],\n\t[1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0],\n\t[1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0],\n\t[1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0],\n\t[1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1]\n];\n/**\n * @template T\n * @param {T[]} array \n * @param {T} val \n * @param {number} start \n * @param {number} end \n */\nfunction fillArray(array, val, start, end) {\n\tfor (let i = start; i < end; i++) {\n\t\tarray[i] = val;\n\t}\n}\n/**\n * @template T\n * @param {T[]} array \n * @param {(value: T) => unknown} predicate \n * @param {number} fromIndex \n */\nfunction findIndex(array, predicate, fromIndex) {\n\tfor (let i = fromIndex; i < array.length; i++) {\n\t\tif (predicate(array[i])) { return i; }\n\t}\n\treturn -1;\n\n}\nlet char0 = '0'.charCodeAt(0) || 0;\nlet char9 = '9'.charCodeAt(0) || 0;\n/**\n * \n * @param {string} text \n */\nexport function encode(text) {\n\tconst chars = [...text].map(v => typeof v === 'number' ? v : v.charCodeAt(0) || 0);\n\t/** @type {(1 | 2 | 3 | 0)[]} */\n\tconst modes = chars.map(v => {\n\t\tif (v < 32) { return 1; }\n\t\tif (v > 96) { return 2; }\n\t\treturn 0;\n\t});\n\n\tfor (let end = 0; end >= 0;) {\n\t\tlet start = findIndex(chars, c => c >= char0 && c <= char9, end);\n\t\tif (start < 0) { break; }\n\t\tend = findIndex(chars, c => c < char0 || c > char9, start + 1);\n\t\tlet count = (end < 0 ? chars.length : end) - start;\n\t\tif (count < 4) { continue; }\n\t\tif (count % 2) {\n\t\t\tcount -= 1;\n\t\t\tif (start && end < 0) { start += 1; }\n\t\t}\n\t\tfillArray(modes, 3, start, start + count);\n\t}\n\n\tfor (let end = 0; end >= 0;) {\n\t\tconst start = modes.indexOf(0, end);\n\t\tif (start < 0) { break; }\n\t\tend = findIndex(modes, Boolean, start + 1);\n\n\t\tconst mode1 = modes[start - 1] || 0;\n\t\tconst mode2 = modes[end] || 0;\n\t\tconst endModes = [mode1, mode2];\n\t\tconst mode = endModes.includes(1) && !endModes.includes(2) ? 1 : 2;\n\t\tfillArray(modes, mode, start, end < 0 ? chars.length : end);\n\t}\n\tconst codes = [];\n\t/** @type {1 | 2 | 3 | 0} */\n\tlet mode = 0;\n\tfor (let i = 0; i < chars.length; i++) {\n\t\tlet currentMode = modes[i] || 2;\n\t\tconst nextMode = modes[i + 1] || 2;\n\t\tlet char = chars[i];\n\t\tif (currentMode === 3) {\n\t\t\tif (nextMode !== 3) {\n\t\t\t\tcurrentMode = nextMode;\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t\tchar = ((char - char0) || 0) * 10 + ((chars[i] - char0) || 0);\n\n\t\t\t}\n\t\t}\n\t\tif (currentMode === 2) {\n\t\t\tchar -= 32;\n\t\t} else if (currentMode === 1) {\n\t\t\tchar = (char + 64) % 96;\n\t\t}\n\t\tif (mode !== currentMode) {\n\n\t\t\tif (mode === nextMode && mode !== 3 && currentMode !== 3) {\n\t\t\t\tcodes.push(98);\n\t\t\t} else {\n\t\t\t\tcodes.push(mode ? 102 - currentMode : 102 + currentMode);\n\t\t\t\tmode = currentMode;\n\t\t\t}\n\t\t}\n\t\tcodes.push(char);\n\t}\n\tcodes.push(codes.reduce((s, v, i) => (s + v * i), codes[0]) % 103);\n\tcodes.push(106);\n\treturn codes.flatMap(v => bars[v] || []);\n\n}\n","\n/**\n * \n * @param {string?} script \n * @param {Record<string, unknown>} scope \n * @returns {unknown}\n */\nexport function execScript(script, scope) {\n\t\tif (!script || typeof script !== 'string') { return null }\n\t\tconst s = script.slice(0,2);\n\t\tlet type = '';\n\t\tif (s === '#!' || s === '#?') {\n\t\t\tconst index = s.indexOf('\\n');\n\t\t\tif (index < 0) { return null }\n\t\t\ttype = script.slice(0, index);\n\t\t\tscript = script.slice(index + 1);\n\t\t}\n\t\t// TODO: 根据类型执行\n\t\treturn null\n}\n","/** @import DotRequest from 'dot-request' */\n/** @import { Field, PageForm } from '@yongdall/types' */\nimport { Search } from '@yongdall/common';\nimport { Menu } from '../Menu.mjs';\nimport request from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\nimport { application } from '../configuration.mjs';\n\n/**\n * @typedef {object} PageConfiguration\n * @property {string} [id]\n * @property {string} [model]\n * @property {string} [user]\n * @property {string} [organization]\n * @property {string} [workspace]\n * @property {string} [page]\n * @property {string} [url]\n * \n * @property {string?} [widget]\n * \n * @property {string} [title]\n * @property {string} [titlePattern]\n * @property {Record<string, any>} [config]\n * @property {Field.Show[]} [fields]\n * @property {{widget: string; options: string}[]} [sides]\n * @property {Menu.Button[]} [menuButtons]\n * @property {(Menu | null)[]} [menus]\n * @property {Record<string, PageForm?>} [forms]\n * @property {Search.AndList} [where]\n * @property {Search.OrList} [orWhere]\n * @property {string} [defaultQuery]\n * @property {{ field: string; label?: string; operator: string; }[]} [filters]\n * \n * \n * // TODO: 是否分页\n * \n */\n\n/**\n * @typedef {object} PageParam\n * @property {string?} [model]\n * @property {string?} [organization] \n * @property {string?} [user] \n * @property {string?} [workspace]\n * @property {string} page \n */\n\nconst pages = createPromisesAndStates(async (\n\t/** @type {DotRequest} */req\n) => {\n\tconst result = await req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\tif (!result || typeof result !== 'object') { return null; }\n\n\t/** @type {Menu.Button[]} */\n\tconst menuButtons = [];\n\tconst menus = Menu.fromDefine(result.menus || [], menuButtons);\n\tconst { where, orWhere } = Search.parse(result.hiddenFilter || '');\n\t/** @type {PageConfiguration} */\n\tconst page = {\n\t\t...result,\n\t\twhere,\n\t\torWhere,\n\t\tmenuButtons,\n\t\tmenus,\n\t\tforms: Object.fromEntries(result.forms?.map((/** @type {{ type: any; }} */ v) => [v.type, v]) || []),\n\t};\n\treturn page;\n}, null);\n/**\n * \n * @param {PageParam} page \n * @returns \n */\nexport function pageService({\n\tmodel, organization, user, workspace, page,\n}) {\n\tlet key = [\n\t\tmodel,\n\t\torganization,\n\t\tuser,\n\t\tworkspace,\n\t\tpage,\n\t].map(v => v || '').join('\\n');\n\tlet pageReq = request.clone().path`page`;\n\tif (model) { pageReq = pageReq.query({ model }); }\n\tif (organization) { pageReq = pageReq.query({ organization }); }\n\tif (user) { pageReq = pageReq.query({ user }); }\n\tif (workspace) { pageReq = pageReq.query({ workspace }); }\n\tconst applicationId = application.id;\n\tif (applicationId) { pageReq = pageReq.query({ application: applicationId }); }\n\tpageReq = pageReq.query({ page });\n\tconst { get: getPage, load: loadPage } = pages.create(key, pageReq);\n\n\n\treturn {\n\t\tloadPage,\n\t\tgetPage,\n\t\tloadConfiguration() {\n\t\t\treturn loadPage().then((v) => typeof v === 'object' && v?.config);\n\t\t},\n\t\t...toPromiseInterface(loadPage),\n\t};\n\n}\n","import { importWidget } from '../import.mjs';\nimport { pages } from '../configuration.mjs';\n/** @import { PageRenderer } from './index.mjs' */\n/** @typedef {Object.<'main' | 'details' | 'setting' | 'input' | 'edit', string | PageRenderer>} ContinuationDefine */\n/** @typedef {ContinuationDefine & {continuations: Record<string, ContinuationDefine | string | PageRenderer>}} WorkspaceDefine */\n\n\n/**\n * @typedef {object} ContinuationPages\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} main\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} details\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} setting\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} input\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} edit\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} copy\n */\n\n/** @type {ContinuationPages} */\nexport let modelPages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n/** @type {ContinuationPages} */\nexport let userPages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n/** @type {ContinuationPages} */\nexport let workspacePages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n\nexport function setDefaultPages() {\n\tconst {\n\t\tmodel,\n\t\tmodelDetails,\n\t\tmodelSetting,\n\t\tmodelInput,\n\t\tmodelEdit,\n\t\tmodelCopy,\n\n\t\tuser,\n\t\tuserDetails,\n\t\tuserSetting,\n\t\tuserInput,\n\t\tuserEdit,\n\t\tuserCopy,\n\n\t\tworkspace,\n\t\tworkspaceDetails,\n\t\tworkspaceSetting,\n\t\tworkspaceInput,\n\t\tworkspaceEdit,\n\t\tworkspaceCopy,\n\t} = pages;\n\tmodelPages = {\n\t\tmain: model ? () => importWidget(model) : null,\n\t\tdetails: modelDetails ? () => importWidget(modelDetails) : null,\n\t\tsetting: modelSetting ? () => importWidget(modelSetting) : null,\n\t\tinput: modelInput ? () => importWidget(modelInput) : null,\n\t\tedit: modelEdit ? () => importWidget(modelEdit) : null,\n\t\tcopy: modelCopy ? () => importWidget(modelCopy) : null,\n\t};\n\tuserPages = {\n\t\tmain: user ? () => importWidget(user) : null,\n\t\tdetails: userDetails ? () => importWidget(userDetails) : null,\n\t\tsetting: userSetting ? () => importWidget(userSetting) : null,\n\t\tinput: userInput ? () => importWidget(userInput) : null,\n\t\tedit: userEdit ? () => importWidget(userEdit) : null,\n\t\tcopy: userCopy ? () => importWidget(userCopy) : null,\n\t};\n\tworkspacePages = {\n\t\tmain: workspace ? () => importWidget(workspace) : null,\n\t\tdetails: workspaceDetails ? () => importWidget(workspaceDetails) : null,\n\t\tsetting: workspaceSetting ? () => importWidget(workspaceSetting) : null,\n\t\tinput: workspaceInput ? () => importWidget(workspaceInput) : null,\n\t\tedit: workspaceEdit ? () => importWidget(workspaceEdit) : null,\n\t\tcopy: workspaceCopy ? () => importWidget(workspaceCopy) : null,\n\t};\n}\nsetDefaultPages();\nexport {}\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { PageRenderer } from './index.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n\nimport { configuration, pages } from '../configuration.mjs';\nimport { importWidget } from '../import.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport { modelService } from '../services/index.mjs';\nimport { pageService } from '../services/page.mjs';\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed } from '../signal.mjs';\nimport { modelPages } from './pages.mjs';\n\n/** @typedef {() => PageRenderer | null | undefined | PromiseLike<PageRenderer | null | undefined>} PageRendererLoader */\n\n\nconst configurationPages = createComputed(() => {\n\t/** @type {Record<string, PageRendererLoader>} */\n\tconst configurationPages = {};\n\tfor (const [key, page] of Object.entries(allHooks.get('configurationPages').named())) {\n\t\tif (!page) { continue; }\n\t\tif (typeof page === 'function') {\n\t\t\tconfigurationPages[key] = () => page;\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof page === 'string') {\n\t\t\tconfigurationPages[key] = () => importWidget(page);\n\t\t\tcontinue;\n\t\t}\n\t}\n\tfor (const [key, page] of Object.entries(configuration.configurationPages || {})) {\n\t\tconfigurationPages[key] = () => importWidget(page);\n\t}\n\treturn configurationPages;\n\n\n});\n/**\n * \n * @param {PageIdent.Model} modelIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Model; page: PageConfiguration? }>}\n */\nasync function getModel(modelIdent) {\n\tconst { model, id, workspace, setting, edit, input, continuation } = modelIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Model} */\n\tconst ident = {\n\t\ttype: 'model',\n\t\tmodel,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tlet pageInfo = await pageService({ ...ident, page });\n\tif (!pageInfo && !workspace) {\n\t\tconst info = await modelService(model)\n\t\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\t\tif (!info || typeof info !== 'object') { return null; }\n\t\tconst pages = info.pages;\n\t\tconst pageDefine = pages && Object.hasOwn(pages, page) && pages[page];\n\t\tif (pageDefine === '') { return null; }\n\t\tpageInfo = typeof pageDefine === 'string'\n\t\t\t? { widget: pageDefine }\n\t\t\t: typeof pageDefine === 'object' && pageDefine || {};\n\t}\n\tif (typeof pageInfo !== 'object') { return pageInfo; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widgetId = pageInfo?.widget;\n\tif (widgetId === '') { return null; }\n\tconst widget = typeof widgetId === 'string'\n\t\t? () => importWidget(widgetId)\n\t\t: !workspace && modelPages[page] || null;\n\tif (!widget) { return null; }\n\treturn { ident, widget, page: pageInfo || null };\n}\n\n/**\n * \n * @param {PageIdent.Workspace} workspaceIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Workspace; page: PageConfiguration? }>}\n */\nasync function getWorkspace(workspaceIdent) {\n\tconst { id, edit, input, workspace, setting, continuation } = workspaceIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Workspace} */\n\tconst ident = {\n\t\ttype: 'workspace',\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page });\n\n\tif (typeof pageInfo !== 'object') { return pageInfo; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: typeof pageInfo === 'object' && pageInfo || null\n\t};\n}\n\n/**\n * \n * @param {PageIdent.Organization} organizationIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Organization; page: PageConfiguration? }>}\n */\nasync function getOrganization(organizationIdent) {\n\tconst { id, organization, edit, input, workspace, setting, continuation } = organizationIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Organization} */\n\tconst ident = {\n\t\ttype: 'organization',\n\t\torganization,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page })\n\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\n\tif (typeof pageInfo !== 'object') { return null; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: pageInfo || null\n\t};\n}\n/**\n * \n * @param {PageIdent.User} userIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.User; page: PageConfiguration? }>}\n */\nasync function getUser(userIdent) {\n\tconst { id, user, edit, input, workspace, setting, continuation } = userIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.User} */\n\tconst ident = {\n\t\ttype: 'user',\n\t\tuser,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page })\n\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\n\tif (typeof pageInfo !== 'object') { return null; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: typeof pageInfo === 'object' && pageInfo || null\n\t};\n}\n\n\n/**\n * @param {PageIdent} pageIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent; page: PageConfiguration? }>}\n */\nexport default async function load(pageIdent) {\n\tconst { type } = pageIdent;\n\n\tif (type === 'model') {\n\t\treturn getModel(pageIdent);\n\t}\n\tif (type === 'workspace') {\n\t\treturn getWorkspace(pageIdent);\n\t}\n\tif (type === 'organization') {\n\t\treturn getOrganization(pageIdent);\n\t}\n\tif (type === 'user') {\n\t\treturn getUser(pageIdent);\n\t}\n\tif (type === 'configuration') {\n\t\tconst pages = configurationPages.get();\n\t\tconst { continuation } = pageIdent;\n\t\tconst widget = Object.hasOwn(pages, continuation) ? pages[continuation] : null;\n\t\tif (typeof widget !== 'function') { return null; }\n\t\treturn { widget, ident: pageIdent, page: null };\n\t}\n\tconst widget = type && type in pages && pages[type];\n\tif (typeof widget === 'string') { return { widget: () => importWidget(widget), ident: pageIdent, page: null }; }\n\treturn null;\n}\n","/** @import { CurrentPage } from '../typesDefine.mjs' */\n/** @import { PageInfo } from './home.mjs' */\n/** @import { PageHandle } from './PageHandle.mjs' */\nimport { application } from '../configuration.mjs';\nimport { User } from '../user.mjs';\nimport setUrl from './setUrl.mjs';\nimport { createComputed, createState } from '../signal.mjs';\n\n\n/**\n * 页面管理器\n * @callback PageManager\n * @param {PageHandle} page\n * @returns {void}\n */\n/** @type {Map<symbol, PageManager>} */\nconst managers = new Map();\n\n/**\n * \n * @param {PageManager} manager \n * @returns \n */\nexport function addManager(manager) {\n\tconst symbol = Symbol();\n\tmanagers.set(symbol, manager);\n\treturn () => { managers.delete(symbol); };\n}\n\n/** @type {Map<PageInfo, PageHandle>} */\nconst pages = new Map();\n/** @type {PageHandle[]} */\nlet list = [];\nconst currentState = createState(/** @type {PageHandle | null} */(null));\n/**\n * \n * @param {PageInfo} [page] \n * @returns \n */\nexport function switchTo(page) {\n\tconst button = page && pages.get(page);\n\tconst current = currentState.get();\n\tif (current === button) { return; }\n\tcurrentState.set(button || null);\n\tif (button) {\n\t\tconst index = list.indexOf(button);\n\t\tif (index > 0) {\n\t\t\tlist.splice(index, 1);\n\t\t}\n\t\tif (index) {\n\t\t\tlist.push(button);\n\t\t}\n\t}\n\n}\nexport function getPages() {\n\treturn [...pages.values()];\n}\n/**\n * \n * @param {PageInfo} pageRoot \n * @param {PageHandle} state \n * @returns \n */\nexport function createButton(pageRoot, state) {\n\tpages.set(pageRoot, state);\n\tcurrentState.set(state);\n\tfor (const manager of [...managers.values()]) {\n\t\tmanager(state);\n\t}\n}\n/**\n * \n * @param {PageInfo} node \n * @returns \n */\nexport function remove(node) {\n\tconst page = pages.get(node);\n\tpages.delete(node);\n\tif (!page) { return; }\n\tconst index = list.indexOf(page);\n\tif (index >= 0) { list.splice(index, 1); }\n\tif (currentState.get() !== page) { return; }\n\tcurrentState.set(null);\n\tif (User.waitLogin) { return; }\n\tconst newPage = list[0];\n\tsetUrl(newPage?.href || application.path, false, true);\n}\nexport function closeAll() {\n\tfor (const page of [...pages.values()]) {\n\t\tpage.destroy();\n\t}\n}\n\nconst title = createComputed(() => currentState.get()?.title || '');\nconst icon = createComputed(() => currentState.get()?.icon || '');\nconst print = createComputed(() => currentState.get()?.print || {});\nconst loading = createComputed(() => currentState.get()?.loading || false);\nconst unsaved = createComputed(() => currentState.get()?.unsaved || false);\n/** @type {CurrentPage} */\nexport const currentPage = {\n\tget title() { return title.get(); },\n\tget icon() { return icon.get(); },\n\tget print() { return structuredClone(print.get()); },\n\tget unsaved() { return unsaved.get(); },\n\tget loading() { return loading.get(); },\n}\n","\n/**\n * @param {HTMLElement} container\n */\nexport default function renderHome(container) {\n\tcontainer.appendChild(document.createTextNode('主页'));\n\n}\n","const loadingDiv = document.createElement('div');\nconst shadow = loadingDiv.attachShadow({\"mode\": \"closed\"});\nshadow.innerHTML = `<style>\ndiv::after, div::before {\ncontent: '';\nheight: 100px;\nwidth: 100px;\nposition: absolute;\nmargin: auto;\ninset: 0;\nborder-radius: 100%;\nbackground-color: #000;\nanimation: animation infinite linear 1.5s;\ntransform: scale(0);\n}\ndiv::before {\nanimation-delay: -0.75s;\n}\n@keyframes animation {\n0% {\ntransform: scale(0);\nopacity: .8;\nz-index: 0;\n}\n100% {\ntransform: scale(1);\nopacity: 0;\nz-index: 1;\n}\n}\n</style><div></div>`\n\n\nconst container = document.createElement('div');\n\tcontainer.appendChild(loadingDiv);\nexport default container;\n/**\n * \n * @param {boolean} show \n */\nexport function toggle(show) {\n\tcontainer.hidden = !show;\n}\n","import { root as rootContainer } from '../dom/index.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport { application } from '../configuration.mjs';\nimport { switchTo } from './pageManager.mjs';\nimport { openUrl } from './setUrl.mjs';\nimport renderHome from './renderHome.mjs';\nimport loadingContainer, { toggle as triggerLoading } from './loadingContainer.mjs';\nimport { createState } from '../signal.mjs';\n\n\nrootContainer.appendChild(loadingContainer);\n\n/**\n * @callback Trigger\n * @param {boolean} show \n * @returns {void} \n */\n\n/** \n * @typedef {object} PageInfo\n * @property {Trigger} toggle\n * @property {() => void} hide\n */\n\n/** @type {Trigger} */\nlet currentDom = triggerLoading;\n\n\n\nexport const currentDomPage = createState(/** @type {PageInfo | undefined} */(undefined));\nexport const currentPage = createState(/** @type {PageInfo?} */(null));\n\n\n/**\n * \n * @param {Trigger} dom\n * @param {PageInfo} [domPage]\n * @returns {void}\n */\nfunction setDom(dom, domPage) {\n\tif (currentDom === dom) { return; }\n\tif (currentDom) {\n\t\tcurrentDom(false);\n\t}\n\tconst old = currentDomPage.get();\n\tcurrentDom = dom;\n\tcurrentDomPage.set(domPage);\n\told?.hide();\n\tif (!dom) { return; }\n\tdom(true);\n}\n\nconst homeContainer = document.createElement('div');\nhomeContainer.hidden = true;\n/**\n * \n * @param {boolean} show \n */\nfunction triggerHome(show) {\n\thomeContainer.hidden = !show;\n}\n\nrootContainer.appendChild(homeContainer);\nconst search = createState('?')\nconst hash = createState('#')\n/** @type {Map<string, Set<any>>} */\nconst events = new Map();\n\nevents.set('update', new Set([() => {\n\thomeContainer.innerHTML = '';\n\t\treturn renderHome(homeContainer);\n}]));\n\n/**\n * \n * @param {'update' | 'destroy'} e \n */\nfunction runEvent(e) {\n\tfor (const f of [...events.get(e) || []]) {\n\t\tf();\n\t}\n}\nexport class HomeContext {\n\tget container() { return homeContainer; }\n\tget current() { return currentDom === triggerHome; }\n\tget home() { return true; }\n\tget search() { return search.get(); }\n\tget hash() { return hash.get(); }\n\t/**\n\t * \n\t * @param {string} url \n\t * @param {boolean} replace \n\t */\n\topen(url, replace) {\n\t\topenUrl(url[0] === '/' ? url : toUrl(application.path, url), replace);\n\t}\n\t/**\n\t * \n\t * @param {'update' | 'destroy'} event \n\t * @param {() => void} listen \n\t * @returns {() => void}\n\t */\n\tlisten(event, listen) {\n\t\tconst fn = listen.bind(this);\n\t\tlet set = events.get(event);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tevents.set(event, set);\n\t\t}\n\t\tset.add(fn);\n\t\treturn () => { set?.delete(fn); };\n\t}\n}\n/**\n * @param {(ctx: HomeContext) => void} [renderer]\n */\nexport function switchHome(renderer) {\n\tif (typeof renderer !== 'function') { return false; }\n\trunEvent('destroy');\n\thomeContainer.innerHTML = '';\n\tevents.clear();\n\trenderer(new HomeContext());\n\treturn true;\n}\n\n\nfunction toShowHome() {\n\tconst oldPage = currentPage.get()\n\tif (oldPage) {\n\t\tcurrentPage.set(null);\n\t\toldPage.hide();\n\t}\n\tsetDom(triggerHome);\n\tswitchTo();\n\trunEvent('update');\n}\n/**\n * \n * @param {string} s \n * @param {string} h \n */\nexport function showHome(s, h) {\n\tsearch.set(s || '?');\n\thash.set(h || '#');\n\ttoShowHome();\n}\n\n/**\n * @type {string | number | NodeJS.Timeout | null}\n */\nlet timeoutId = null;\n\nexport function showEmpty() {\n\tif (timeoutId !== null) {\n\t\tclearTimeout(timeoutId);\n\t\ttimeoutId = null;\n\t}\n\ttoShowHome();\n}\n\n/**\n * \n * @param {boolean} v \n */\nexport function setLoading(v) {\n\tconst page = currentPage.get();\n\tif (!page) { return; }\n\tif (!v) {\n\t\tif (timeoutId !== null) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\ttimeoutId = null;\n\t\t}\n\t\tsetDom(page.toggle, page);\n\t\treturn;\n\t}\n\tif (timeoutId !== null) { return; }\n\ttimeoutId = setTimeout(() => {\n\t\ttimeoutId = null;\n\t\tsetDom(triggerLoading);\n\t\tswitchTo();\n\t}, 300);\n}\n\n/**\n * \n * @param {PageInfo} page \n * @param {boolean} loading \n */\nexport function switchPage(page, loading) {\n\tconst oldPage = currentPage.get();\n\tif (oldPage === page) {\n\t\tsetLoading(loading);\n\t\tswitchTo(oldPage);\n\t\treturn;\n\t}\n\tconst old = oldPage;\n\tif (!oldPage) {\n\t\trunEvent('update');\n\t}\n\tconst newPage = page;\n\tcurrentPage.set(newPage);\n\told?.hide();\n\tsetLoading(loading);\n\tswitchTo(newPage);\n}\n","/** @import { PageIdent } from './route/route.mjs' */\n\n/**\n * @param {string} t \n * @returns {string}\n */\nexport function decode(t) {\n\treturn decodeURIComponent(t.replace(/\\+/g, '%20'));\n}\n/**\n * @param {string | PageIdent} t \n * @returns {string}\n */\nexport function encode(t) {\n\treturn encodeURIComponent(typeof t === 'string' ? t : stringify(t))\n\t\t.replace(/%20/g, '+')\n\t\t.replace(/%3A/g, ':')\n\t\t.replace(/%3D/g, '=')\n\t\t.replace(/%26/g, '&')\n\t\t.replace(/%24/g, '$')\n\t\t.replace(/%40/g, '@');\n}\n\n\n/**\n * @param {string} ident\n * @returns {PageIdent}\n */\nexport function parse(ident) {\n\tif (!ident) { return { type: 'home' }; }\n\tswitch (ident) {\n\t\t// 代办\n\t\tcase '!': case '!': return { type: 'todo' };\n\t\t// 设置\n\t\tcase '-': case '-': return { type: 'settings' };\n\t\t// 搜索\n\t\tcase '=': case '=': return { type: 'search' };\n\t\t// 状态管理\n\t\tcase ':': case ':': return { type: 'status' };\n\t\t// 开发工具\n\t\tcase '+': case '+': return { type: 'devtools' };\n\t\tcase '&': // TODO: ?组织列表\n\t\tcase '@': // TODO: ?用户列表\n\t\tcase '~': // TODO: ?\n\t\tcase '_': // TODO: ?\n\t\tcase '*': // TODO: ?个人资料编辑\n\t}\n\t/**\n\t * \n\t * @param {RegExp} regex \n\t * @param {string} [def] \n\t */\n\tfunction get(regex, def) {\n\t\tconst { index } = regex.exec(ident) || { index: -1 };\n\t\tif (index < 0) { return; }\n\t\tconst value = ident.substring(index + 1) || def;\n\t\tident = ident.substring(0, index);\n\t\treturn value;\n\t}\n\tconst id = get(/[==]/);\n\n\tident = ident\n\t\t.replaceAll(/[~~]+/g, '~')\n\t\t.replaceAll(/[!!]+/g, '!')\n\t\t.replaceAll(/[@@]+/g, '@')\n\t\t.replaceAll(/[&&]+/g, '&')\n\t\t.replaceAll(/[**]/g, '*')\n\t\t.replaceAll(/[::]+/g, ':')\n\t\t.replaceAll(/[((]+/g, '(')\n\t\t.replaceAll(/[))]+/g, ')');\n\tconst edit = id ? Boolean(get(/(?<!\\*)\\*$/, '*')) : undefined;\n\tconst input = edit ? undefined : get(/\\*.*/, '*')?.replace(/[~!@&()].*/, '');\n\tconst setting = Boolean(get(/!$/, input || id ? undefined : '!'));\n\tconst regex = /(?=[~!@&])/;\n\t/** @type {Map<string, string[]>} */\n\tlet map = new Map([['&', []], ['@', []], ['~', []], ['!', []], ['*', []]]);\n\t/** @type {string[]} */\n\tlet base = [];\n\tfor (const v of ident.split(regex)) {\n\t\t(map.get(v[0]) || base).push(v);\n\t}\n\tconst continuation = map.get('!')?.join('').slice(1) || '';\n\tconst workspace = map.get('~')?.join('').slice(1) || '';\n\tconst organization = map.get('&')?.join('').slice(1) || '';\n\tconst user = map.get('@')?.join('').slice(1) || '';\n\tconst model = base.join('');\n\tif (model) {\n\t\treturn { type: 'model', model, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (organization) {\n\t\treturn { type: 'organization', organization, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (user) {\n\t\treturn { type: 'user', user, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (workspace) {\n\t\treturn { type: 'workspace', workspace, continuation, setting, edit, input, id };\n\t}\n\tif (continuation) {\n\t\treturn { type: 'configuration', continuation, setting, edit, input, id };\n\t}\n\treturn { type: 'home' };\n}\n\n\n\n/**\n * \n * @param {PageIdent} a \n * @returns {string}\n */\nexport function stringify(a) {\n\tswitch (a.type) {\n\t\tcase 'home': return '/';\n\t\tcase 'settings': return '-';\n\t\tcase 'todo': return '!';\n\t\tcase 'search': return '=';\n\t\tcase 'status': return ':';\n\t\tcase 'devtools': return '+';\n\t}\n\tconst { model, user, organization, workspace, continuation, setting, input, edit, id } = a;\n\tlet ident = '';\n\tif (model) {\n\t\tident = model;\n\t} else if (organization) {\n\t\tident += `&${organization}`;\n\t} else if (user) {\n\t\tident += `@${user}`;\n\t}\n\tif (workspace) {\n\t\tident += `~${workspace}`;\n\t}\n\tif (continuation) {\n\t\tident += `!${continuation}`;\n\t}\n\tif (setting) {\n\t\tident += `!`;\n\t\treturn ident;\n\t}\n\tif (id) {\n\t\tif (input) {\n\t\t\tident += `*${input}`;\n\t\t} else if (edit) {\n\t\t\tident += `*`;\n\t\t}\n\t\tident += `=${id}`;\n\t\treturn ident;\n\t}\n\tif (input) {\n\t\tident += `*`;\n\t\tif (input !== '*') {\n\t\t\tident += `${input}`;\n\t\t}\n\t\treturn ident;\n\t}\n\treturn ident;\n}\n\n/**\n * \n * @param {PageIdent} a \n * @returns {Iterable<string>}\n */\nexport function* stringifyPaths(a) {\n\tswitch (a.type) {\n\t\tcase 'home': return yield '/';\n\t\tcase 'settings': return yield '-';\n\t\tcase 'todo': return yield '!';\n\t\tcase 'search': return yield '=';\n\t\tcase 'status': return yield ':';\n\t\tcase 'devtools': return yield '+';\n\t}\n\tconst { model, user, organization, workspace, continuation, setting, input, edit, id } = a;\n\tlet ident = '';\n\tif (model) {\n\t\tident = model;\n\t} else if (organization) {\n\t\tident += `&${organization}`;\n\t} else if (user) {\n\t\tident += `@${user}`;\n\t}\n\tif (ident) { yield ident; }\n\tif (workspace) {\n\t\tident += `~${workspace}`;\n\t\tyield ident;\n\t}\n\tif (continuation) {\n\t\tident += `!${continuation}`;\n\t\tyield ident;\n\t}\n\tif (setting) {\n\t\tident += `!`;\n\t\treturn yield ident;\n\t}\n\tif (id) {\n\t\tif (input) {\n\t\t\tyield ident + `*`;\n\t\t\tident += `*${input}`;\n\t\t} else if (edit) {\n\t\t\tyield ident + `=${id}`;\n\t\t\tident += `*`;\n\t\t}\n\t\tident += `=${id}`;\n\t\treturn yield ident;\n\t}\n\tif (input) {\n\t\tident += `*`;\n\t\tyield ident;\n\t\tif (input !== '*') {\n\t\t\tident += `${input}`;\n\t\t\tyield ident;\n\t\t}\n\t}\n}\n","import * as Ident from '../Ident.mjs';\nimport { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\n/**\n * @typedef {PageIdent.Model | PageIdent.Organization | PageIdent.User | PageIdent.Workspace | PageIdent.Page | PageIdent.Configuration} PageIdent\n */\n/**\n * @typedef {object} PageIdent.Model\n * @property {'model'} type\n * @property {string} model\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n/**\n * @typedef {object} PageIdent.Organization\n * @property {'organization'} type\n * @property {null} [model]\n * @property {string} organization\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.User\n * @property {'user'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {string} user\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.Workspace\n * @property {'workspace'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string} workspace\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n/**\n * @typedef {object} PageIdent.Configuration\n * @property {'configuration'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {null} [workspace]\n * @property {string} continuation\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.Page\n * @property {'todo' | 'settings' | 'search' | 'status' | 'devtools' | 'home'} type\n * @property {null} [continuation]\n */\n\n// TODO: 用户页面\n// TODO: 组织页面\n// TODO: 全局工作区\n\n\n\n\n/**\n * @typedef {object} PageIdent.Route\n * @property {PageIdent} page\n * @property {string} pageRoot\n * @property {string} path\n * @property {boolean} redirect\n */\n\n/**\n * @callback PageIdent.Stringify\n * @param {PageIdent} pageIdent \n * @returns {string}\n */\n/**\n * @callback PageIdent.Parser\n * @param {string} path\n * @returns {PageIdent.Route}\n */\n\n/** @type {PageIdent.Parser} */\nexport let parse = (subPath) => {\n\tconst index = subPath.indexOf('/');\n\tconst pathIdent = Ident.decode(index < 0 ? subPath : subPath.slice(0, index));\n\tconst path = index < 0 ? '/' : subPath.slice(index);\n\tconst page = Ident.parse(pathIdent);\n\tconst pageId = Ident.stringify(page);\n\tconst pageRoot = Ident.encode(pageId);\n\treturn { page, pageRoot, path, redirect: pageRoot !== pathIdent };\n};\n/** @type {PageIdent.Stringify} */\nlet stringifyIdent = (page) => Ident.encode(Ident.stringify(page));\n/**\n * @param {PageIdent} page \n * @param {...string | null | undefined} paths \n * @returns {string}\n */\nexport function stringify(page, ...paths) {\n\tconst root = stringifyIdent(page);\n\tconst path = paths.filter(Boolean).join('');\n\tif (!path) { return root; }\n\tif (['/', '?', '#'].includes(path[0])) { return `${root}${path}`}\n\treturn `${root}/${path}`;\n};\n/**\n * @param {PageIdent} page \n * @param {...string | null | undefined} paths \n * @returns {string}\n */\nexport function toHref(page, ...paths) {\n\treturn toUrl(\n\t\tapplication.path,\n\t\tstringifyIdent(page),\n\t\tpaths.filter(Boolean).join(''),\n\t);\n}\n/**\n * @typedef {object} PageIdent.Router\n * @property {PageIdent.Stringify} stringify\n * @property {PageIdent.Parser} parse\n */\n/**\n * \n * @param {PageIdent.Router} options \n */\nexport function setRouter(options) {\n\tparse = options.parse;\n\tstringifyIdent = options.stringify;\n}\n\nexport const PageIdent = {\n\tget parse() { return parse },\n\tget stringify() { return stringify },\n\tget toHref() { return toHref },\n}\n","import { Code128 } from './utils/index.mjs';\n/**\n * @typedef {Object} Print.MarginBox\n * @property {Print.Context[] | Print.Context} [content]\n * @property {string} [fontFamily] - 字体族\n * @property {string|number} [fontSize] - 字体大小\n * @property {boolean} [bold]\n * @property {boolean} [italic]\n * @property {string} [color] - 文字颜色\n * @property {'ltr'|'rtl'} [direction] - 文本方向\n * @property {number|string} [lineHeight] - 行高\n * @property {number} [zIndex] - 层叠顺序\n * @property {'left'|'right'|'center'|'justify'|'start'|'end'} [textAlign] - 文本对齐\n * @property {'baseline'|'sub'|'super'|'top'|'text-top'|'middle'|'bottom'|'text-bottom'|number} [verticalAlign] - 垂直对齐\n * @property {Record<'top' | 'right' | 'bottom' | 'left', string|number>} [padding] - 内边距属性对象\n * @property {Print.Border} [border] \n */\n/**\n * @typedef {string | Print.Newline | Print.Image | Print.Barcode | Print.Counter} Print.Context\n */\n/**\n * @typedef {object} Print.Newline\n * @property {'newline'} type\n */\n/**\n * @typedef {object} Print.Counter\n * @property {'page' | 'pages'} type\n */\n/**\n * @typedef {object} Print.Image\n * @property {'image'} type\n * @property {string} url\n * @property {string} [alt]\n * @property {string | number} [width]\n * @property {string | number} [height]\n */\n/**\n * @typedef {object} Print.Barcode\n * @property {'barcode' | 'code128'} type\n * @property {string} text\n * @property {string | number} [width]\n * @property {string | number} [height]\n */\n\n\n\n/**\n * @typedef {Object} Print.Border\n * @property {string|number} [width] - 边框宽度复合属性\n * @property {string} [color] - 边框颜色复合属性\n * @property {'dotted'|'dashed'|'solid'|'double'|'groove'|'ridge'|'inset'|'outset'} [style] - 边框样式复合属性\n */\n/**\n * @typedef {Object} Print.Page\n * @property {'A3'|'B4'|'A4'|'B5'|'A5'|{width?: string; height?: string}} [size] 页面尺寸\n * @property {'portrait'|'landscape'|'auto'} [orientation] 页面方向\n * @property {string|[string, string?, string?, string?]} [margin] 页边距\n * @property {Print.MarginBox} [topLeft] \n * @property {Print.MarginBox} [topCenter] \n * @property {Print.MarginBox} [topRight] \n * @property {Print.MarginBox} [bottomLeft] \n * @property {Print.MarginBox} [bottomCenter] \n * @property {Print.MarginBox} [bottomRight] \n * \n * @property {Print.MarginBox} [leftTop] \n * @property {Print.MarginBox} [leftMiddle] \n * @property {Print.MarginBox} [leftBottom] \n * @property {Print.MarginBox} [rightTop] \n * @property {Print.MarginBox} [rightMiddle] \n * @property {Print.MarginBox} [rightBottom] \n * \n * @property {Print.MarginBox} [topLeftCorner] \n * @property {Print.MarginBox} [topRightCorner] \n * @property {Print.MarginBox} [bottomLeftCorner] \n * @property {Print.MarginBox} [bottomRightCorner] \n * \n * @property {Print.Border} [topBorder] \n * @property {Print.Border} [bottomBorder] \n * @property {Print.Border} [leftBorder] \n * @property {Print.Border} [rightBorder] \n * \n * \n */\n\n/**\n * @typedef {Object} Print.Pages\n * @property {Print.Page} [left] 左侧页面/节点\n * @property {Print.Page} [right] 右侧页面/节点\n * @property {Print.Page} [first] 首页页面/节点\n * @property {Print.Page} [blank] 空白页面/节点\n */\n\n\n/**\n * @typedef {Print.Page & Print.Pages} Print\n */\n\n\n/**\n * 将字符串转换为 Base64\n * @param {string} str \n */\nfunction toSvgURI(str) {\n\treturn `data:image/svg+xml;charset=utf-8,${encodeURIComponent(str)}`;;\n}\n/**\n * \n * @param {string} val \n * @returns \n */\nfunction stringifyContentText(val) {\n\tconst text = typeof val === 'bigint' || typeof val === 'number' ? String(val) : val;\n\tif (!text || typeof text !== 'string') { return ''; }\n\n\treturn `\"${text\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/'/g, \"\\\\'\")\n\t\t.replace(/\\n/g, '\\\\A').replace(/\\r/g, '\\\\D')}\"`;\n}\n/**\n * \n * @param {string} url \n * @returns \n */\nfunction toUrlContent(url) {\n\tif (!url) { return ''; }\n\treturn `url(${stringifyContentText(url)})`;\n}\n\n/**\n * 解析尺寸,统一转换为带单位的字符串 (默认为 em)\n * @param {string | number} [val] \n */\nfunction parseDimension(val, defaultUnit = 'em') {\n\tif (!val) return null;\n\tif (typeof val === 'number') return `${val}${defaultUnit}`;\n\tif (typeof val !== 'string') { return null; }\n\tconst t = val.replace(/^\\s+|\\s+$/gs, '');\n\tif (/^\\d+(\\.\\d*)?|\\.\\d+$/.test(t)) { return `${t}${defaultUnit}`; }\n\treturn t; // 其他情况原样返回\n}\n\n/**\n * 生成图片的 SVG Data URL\n * @param {Print.Image} item \n */\nfunction imageToContent(item) {\n\tconst { url } = item;\n\tif (!url) { return ''; }\n\tconst width = parseDimension(item.width) || '';\n\tconst height = parseDimension(item.height) || '';\n\tif (!width && !height) { toUrlContent(url); }\n\tconst svgContent = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n\t\t\t\t\t<image href=\"${item.url}\" width=\"100%\" height=\"100%\" />\n\t\t\t</svg>\n\t\t`.trim();\n\treturn toUrlContent(toSvgURI(svgContent.replace(/\\s+/g, ' ')));\n}\n\n/**\n * 生成条码的 SVG Data URL\n * @param {Print.Barcode} item \n * @param {boolean} [rotation] \n */\nfunction barcodeToContent(item, rotation) {\n\tconst bits = Code128.encode(item.text);\n\tif (!bits?.length) { return ''; }\n\n\n\n\tconst paths = [];\n\tfor (let i = 0; i < bits.length; i++) {\n\t\tif (!bits[i]) { continue; }\n\t\tconst start = i - bits.length / 2;\n\t\tlet len = 1;\n\n\t\twhile (bits[i + 1]) {\n\t\t\tlen++;\n\t\t\ti++;\n\t\t}\n\n\t\tpaths.push(rotation ? `M-0.5 ${start}v${len}h1v-${len}Z` : `M${start} -0.5h${len}v1h-${len}Z`);\n\t}\n\tif (!paths.length) { return ''; }\n\n\n\tlet height = parseDimension(item.height) || '1em';\n\tlet width = parseDimension(item.width) || `${(bits.length + 20) * 0.06}em`;\n\tlet vbWidth = bits.length + 20;\n\tlet vbHeight = 1;\n\tif (rotation) {\n\t\t[vbWidth, vbHeight] = [vbHeight, vbWidth];\n\t\t[width, height] = [height, width]\n\t}\n\n\tconst svgContent = `\n\t<svg xmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"${width}\" height=\"${height}\"\n viewBox=\"${-vbWidth / 2} ${-vbHeight / 2} ${vbWidth} ${vbHeight}\"\n\t\t\tpreserveAspectRatio=\"none\">\n\t\t<path d=\"${paths.join(\" \")}\" fill=\"black\"\n\t\t />\n\t</svg>\n\t`.trim();\n\n\tconst minifiedSvg = svgContent.replace(/\\s+/g, ' ');\n\treturn `url(${toSvgURI(minifiedSvg)})`;\n}\n/**\n * 主函数:将 Print.Context | Print.Context[] 转换为 CSS content 属性值\n * @param {Print.Context | Print.Context[]} [input] \n * @param {boolean} [rotation] \n * @returns {string} CSS content 属性的值部分 (不含分号)\n */\nfunction toContent(input, rotation) {\n\tif (input === '') { return '\"\"'; }\n\tif (!input) { return ''; }\n\n\tconst items = Array.isArray(input) ? input : [input];\n\treturn items.map(item => {\n\t\tif (!item) { return ''; }\n\t\tif (typeof item === 'string') { return stringifyContentText(item); }\n\t\tconst type = item.type;\n\t\tif (type === 'newline') { return '\"\\\\A\"'; }\n\t\tif (type === 'image') { return imageToContent(item); }\n\t\tif (type === 'barcode' || type === 'code128') { return barcodeToContent(item, rotation); }\n\t\tif (type === 'page') { return `counter(page)`; }\n\t\tif (type === 'pages') { return `counter(pages)`; }\n\t\treturn ''; // 未知类型\n\t}).filter(Boolean).join(' ');\n\n}\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {\"top\" | \"left\" | \"right\" | \"bottom\" | ''} borderArea\n * @param {CSSStyleDeclaration?} [style] \n * @param {Print.MarginBox} [config] \n * @param {boolean} [base] \n * @param {boolean} [rotation] \n * @returns \n */\nfunction applyMarginRule(borderArea, style, config, base, rotation) {\n\tif (!style) { return; }\n\tconst {\n\t\tcontent, fontFamily, fontSize, bold, italic, color, direction, lineHeight,\n\t\tzIndex, textAlign, verticalAlign, padding, border,\n\t} = config || {};\n\n\tstyle.content = toContent(content, rotation) || (base ? '\"\"' : '');\n\tstyle.fontFamily = fontFamily || '';\n\tstyle.fontSize = parseDimension(fontSize, 'px') || '';\n\tstyle.fontWeight = typeof bold === 'boolean' ? bold ? 'bold' : 'normal' : '';\n\tstyle.fontStyle = typeof italic === 'boolean' ? italic ? 'italic' : 'normal' : '';\n\tstyle.color = color || '';\n\tstyle.direction = direction || '';\n\tstyle.lineHeight = parseDimension(lineHeight, 'em') || '';\n\tstyle.zIndex = zIndex ? String(zIndex) : '';\n\tstyle.textAlign = textAlign || '';\n\tstyle.verticalAlign = parseDimension(verticalAlign, '%') || '';\n\tstyle.direction = direction || 'inherit';\n\tstyle.whiteSpace = 'pre-wrap';\n\tconst { top, right, bottom, left } = padding || {};\n\tstyle.paddingTop = parseDimension(top, 'px') || '';\n\tstyle.paddingRight = parseDimension(right, 'px') || '';\n\tstyle.paddingBottom = parseDimension(bottom, 'px') || '';\n\tstyle.paddingLeft = parseDimension(left, 'px') || '';\n\tif (borderArea) {\n\t\tapplyBorderRule(borderArea, style, border, base);\n\t}\n}\n\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {CSSStyleDeclaration?} [styleDeclaration] \n * @param {Print.Border} [border] \n * @param {'top' | 'left' | 'right' | 'bottom'} [area] \n * @param {boolean} [base] \n * @returns \n */\nfunction applyBorderRule(area, styleDeclaration, border, base) {\n\tif (!styleDeclaration) { return; }\n\tconst { width, color, style } = border || {};\n\tif (width || width === 0 || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-width`, typeof width === 'number' ? `${width || 0}px` : width || '1px');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-width`);\n\t}\n\tif (color || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-color`, color || 'currentColor');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-color`);\n\t}\n\tif (style || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-style`, style || 'none');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-style`);\n\t}\n}\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {ReturnType<createPageRule>} rule \n * @param {Print.Page} [config] \n * @param {boolean} [base] \n * @returns \n */\nfunction applyPageRule(rule, config, base) {\n\tif (!rule) { return; }\n\tconst style = rule.page;\n\n\tapplyMarginRule('bottom', rule.topLeft, config?.topLeft, base);\n\tapplyMarginRule('bottom', rule.topCenter, config?.topCenter, base);\n\tapplyMarginRule('bottom', rule.topRight, config?.topRight, base);\n\tapplyMarginRule('top', rule.bottomLeft, config?.bottomLeft, base);\n\tapplyMarginRule('top', rule.bottomCenter, config?.bottomCenter, base);\n\tapplyMarginRule('top', rule.bottomRight, config?.bottomRight, base);\n\n\tapplyMarginRule('right', rule.leftTop, config?.leftTop, base, true);\n\tapplyMarginRule('right', rule.leftMiddle, config?.leftMiddle, base, true);\n\tapplyMarginRule('right', rule.leftBottom, config?.leftBottom, base, true);\n\tapplyMarginRule('left', rule.rightTop, config?.rightTop, base, true);\n\tapplyMarginRule('left', rule.rightMiddle, config?.rightMiddle, base, true);\n\tapplyMarginRule('left', rule.rightBottom, config?.rightBottom, base, true);\n\n\tapplyMarginRule('', rule.topLeftCorner, config?.topLeftCorner, base);\n\tapplyMarginRule('', rule.topRightCorner, config?.topRightCorner, base);\n\tapplyMarginRule('', rule.bottomLeftCorner, config?.bottomLeftCorner, base);\n\tapplyMarginRule('', rule.bottomRightCorner, config?.bottomRightCorner, base);\n\n\n\tapplyBorderRule('top', style, config?.topBorder, base);\n\tapplyBorderRule('bottom', style, config?.bottomBorder, base);\n\tapplyBorderRule('left', style, config?.leftBorder, base);\n\tapplyBorderRule('right', style, config?.rightBorder, base);\n\n\n\n\n\tconst { size, orientation, margin } = config || {};\n\n\tlet sizeValue = '';\n\tif (typeof size === 'object' && size !== null) {\n\t\tsizeValue = `${size.width} ${size.height}`;\n\t} else if (typeof size === 'string') {\n\t\tsizeValue = size;\n\t}\n\tif (orientation) {\n\t\tsizeValue = `${sizeValue} ${orientation}`;\n\t}\n\tif (sizeValue) {\n\t\tstyle.setProperty('size', sizeValue);\n\t} else {\n\t\tstyle.removeProperty('size');\n\t}\n\n\n\tlet marginValue = '';\n\tif (typeof margin === 'string') {\n\t\tmarginValue = margin;\n\t} else if (Array.isArray(margin)) {\n\t\tmarginValue = margin.filter(v => v !== undefined).join(' ');\n\t}\n\tif (marginValue) {\n\t\tstyle.setProperty('margin', marginValue);\n\t} else {\n\t\tstyle.removeProperty('margin');\n\n\t}\n}\n\nconst sheet = new CSSStyleSheet();\ndocument.adoptedStyleSheets.push(sheet);\n\n\n/**\n * \n * @param {CSSPageRule} page \n * @param {string} selector \n * @param {boolean} [fitWidth] \n * @param {boolean} [fitHeight] \n * @returns {CSSStyleDeclaration | null}\n */\nfunction createMarginRule(page, selector, fitWidth, fitHeight) {\n\ttry {\n\t\tconst ruleIndex = page.insertRule(`${selector} {}`, page.cssRules.length);\n\n\t\tconst rule = page.cssRules[ruleIndex];\n\t\t// @ts-ignore\n\t\tif (!(rule instanceof CSSMarginRule)) { return null; }\n\t\t/** @type {CSSStyleDeclaration} */\n\t\t// @ts-ignore\n\t\tconst style = rule.style;\n\t\tif (fitWidth) {\n\t\t\tstyle.width = 'fit-content';\n\t\t}\n\t\tif (fitHeight) {\n\t\t\tstyle.height = 'fit-content';\n\t\t}\n\t\treturn style;\n\t} catch (e) {\n\t}\n\treturn null;\n\n}\n/**\n * \n * @param {CSSStyleSheet} sheet\n * @param {string} [selector] \n */\nfunction createPageRule(sheet, selector) {\n\ttry {\n\t\tconst ruleIndex = sheet.insertRule(`@page ${selector || ''} {}`, sheet.cssRules.length);\n\n\t\tconst rule = sheet.cssRules[ruleIndex];\n\t\tif (!(rule instanceof CSSPageRule)) { return null; }\n\t\treturn {\n\t\t\tpage: rule.style,\n\t\t\ttopLeft: createMarginRule(rule, '@top-left', true),\n\t\t\ttopCenter: createMarginRule(rule, '@top-center'),\n\t\t\ttopRight: createMarginRule(rule, '@top-right', true),\n\t\t\tbottomLeft: createMarginRule(rule, '@bottom-left', true),\n\t\t\tbottomCenter: createMarginRule(rule, '@bottom-center'),\n\t\t\tbottomRight: createMarginRule(rule, '@bottom-right', true),\n\n\t\t\tleftTop: createMarginRule(rule, '@left-top', false, true),\n\t\t\tleftMiddle: createMarginRule(rule, '@left-middle'),\n\t\t\tleftBottom: createMarginRule(rule, '@left-bottom', false, true),\n\t\t\trightTop: createMarginRule(rule, '@right-top', false, true),\n\t\t\trightMiddle: createMarginRule(rule, '@right-middle'),\n\t\t\trightBottom: createMarginRule(rule, '@right-bottom', false, true),\n\n\t\t\ttopLeftCorner: createMarginRule(rule, '@top-left-corner'),\n\t\t\ttopRightCorner: createMarginRule(rule, '@top-right-corner'),\n\t\t\tbottomLeftCorner: createMarginRule(rule, '@bottom-left-corner'),\n\t\t\tbottomRightCorner: createMarginRule(rule, '@bottom-right-corner'),\n\t\t};\n\t} catch (e) {\n\t}\n\treturn null;\n}\nconst commonPage = createPageRule(sheet);\nconst firstPage = createPageRule(sheet, ':first');\nconst leftPage = createPageRule(sheet, ':left');\nconst rightPage = createPageRule(sheet, ':right');\nconst blankPage = createPageRule(sheet, ':blank');\n/**\n * 核心函数:使用 CSSOM 操作,无字符串拼接\n * @param {Print} print \n */\nexport function updatePrintStyle(print) {\n\tapplyPageRule(commonPage, print, true);\n\tapplyPageRule(firstPage, print.first);\n\tapplyPageRule(leftPage, print.left);\n\tapplyPageRule(rightPage, print.right);\n\tapplyPageRule(blankPage, print.blank);\n}\n\n/**\n * @type {Print.Border}\n */\nconst BorderDefine = {\n\twidth: '2px',\n\tcolor: '#0066cc',\n\tstyle: 'solid'\n};\n/**\n * @type {Print.MarginBox}\n */\nconst MarginBoxDefine = {\n\tcontent: [],\n\tfontFamily: 'Arial, sans-serif',\n\tfontSize: '18px',\n\titalic: false,\n\tbold: true,\n\tcolor: '#333333',\n\ttextAlign: 'center',\n\tlineHeight: '1.5',\n\tdirection: 'ltr',\n\tverticalAlign: 'baseline',\n\tpadding: { top: '10px', right: '5px', bottom: '10px', left: '5px' },\n\tzIndex: 1,\n\tborder: BorderDefine,\n};\n/**\n * @type {Print.Page}\n */\nconst PrintPageDefine = {\n\tsize: 'A4',\n\torientation: 'auto',\n\tmargin: ['20px', '30px', '25px', '30px'],\n\n\ttopLeft: MarginBoxDefine,\n\ttopCenter: MarginBoxDefine,\n\ttopRight: MarginBoxDefine,\n\n\tbottomLeft: MarginBoxDefine,\n\tbottomCenter: MarginBoxDefine,\n\tbottomRight: MarginBoxDefine,\n\n\tleftTop: MarginBoxDefine,\n\tleftMiddle: MarginBoxDefine,\n\tleftBottom: MarginBoxDefine,\n\n\trightTop: MarginBoxDefine,\n\trightMiddle: MarginBoxDefine,\n\trightBottom: MarginBoxDefine,\n\n\n\ttopLeftCorner: MarginBoxDefine,\n\ttopRightCorner: MarginBoxDefine,\n\tbottomLeftCorner: MarginBoxDefine,\n\tbottomRightCorner: MarginBoxDefine,\n\n\ttopBorder: BorderDefine,\n\tbottomBorder: BorderDefine,\n\tleftBorder: BorderDefine,\n\trightBorder: BorderDefine,\n};\n\n\n/**\n * @type {Print}\n */\nexport const PrintDefine = {\n\t...PrintPageDefine,\n\tleft: PrintPageDefine,\n\tright: PrintPageDefine,\n\tfirst: PrintPageDefine,\n\tblank: PrintPageDefine,\n\n};\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { Print } from '../print.mjs' */\n/** @import { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.mjs' */\nimport { PrintDefine } from '../print.mjs';\nimport { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { createButton, remove } from './pageManager.mjs';\nimport { setLoading, switchPage, currentDomPage, currentPage } from './home.mjs';\nimport * as routerParser from './route.mjs';\nimport { createComputed, createDeeply, createState } from '../signal.mjs';\n\n\n\n/**\n * @typedef {object} RootPageExt\n * @property {() => { path: string; search: string; hash: string; }} get\n * @property {(path: string,search: string, hash: string) => void} update\n */\n\nexport class PageHandle extends GeneralContext {\n\t/** @readonly */\n\t#title = createState('');\n\t/** @readonly */\n\t#icon = createState('');\n\t/** @readonly */\n\t#print = createState(/** @type {Print} */({}));\n\t/** @readonly */\n\t#printDeeply = createDeeply(this.#print, PrintDefine);\n\t/** @readonly */\n\t#loading = createState(true);\n\t/** @readonly */\n\t#unsaved = createState(false);\n\t/** @readonly */\n\t#destroyDelayed = createState(false);\n\t/** @readonly */\n\t#bootLoading = createState(true);\n\n\t#onHide = () => { };\n\t/** @readonly @type {string} */\n\t#pageId;\n\n\n\t/** @readonly @type {string} */\n\t#root;\n\t/** @readonly */\n\t#path = createState('');\n\t/** @readonly */\n\t#search = createState('');\n\t/** @readonly */\n\t#hash = createState('');\n\n\t/** @readonly */\n\t#href = createComputed(() => {\n\t\treturn toUrl(this.#root, `${this.#path.get()}${this.#search.get()}${this.#hash.get()}`);\n\t});\n\t/** @readonly */\n\t#rootPath = createComputed(() => `${this.#pageId}/${this.#path.get()}${this.#search.get()}${this.#hash.get()}`);\n\t/** @readonly @type {PageConfiguration?} */\n\t#define;\n\t/** @readonly @type {PageIdent} */\n\t#ident;\n\n\t/** @readonly @type {PageInfo & RootPageExt} */\n\t#pageHandler;\n\t/** @readonly @type {(url: string, replace?: boolean) => void} */\n\t#open;\n\t/** @readonly @type {(p: string, replace?: boolean) => void} */\n\t#setRootPath;\n\t#abortController;\n\t/**\n\t * \n\t * @param {Object} options \n\t * @param {string} options.pageId\n\t * @param {PageConfiguration?} options.define\n\t * @param {PageIdent} options.ident\n\t * @param {string} options.root\n\t * @param {string} options.path\n\t * @param {string} options.search\n\t * @param {string} options.hash\n\t * @param {PageInfo & RootPageExt} options.pageHandler\n\t * @param {(url: string, replace?: boolean) => void} options.open\n\t * @param {(p: string, replace?: boolean) => void} options.setRootPath\n\t */\n\tconstructor({\n\t\tpageId, define, ident, root, path, search, hash, pageHandler, open, setRootPath,\n\t}) {\n\n\t\tconst ac = new AbortController();\n\t\tsuper(ac.signal);\n\t\tthis.#abortController = ac;\n\t\tthis.#root = root;\n\t\tthis.#path.set(path);\n\t\tthis.#search.set(search);\n\t\tthis.#hash.set(hash);\n\n\t\tthis.#define = define;\n\t\tthis.#ident = ident;\n\n\t\tthis.#pageId = pageId;\n\n\t\tthis.#pageHandler = pageHandler;\n\t\tthis.#open = open;\n\t\tthis.#setRootPath = setRootPath;\n\n\t\tconst list = this.#onToggle;\n\t\tpageHandler.toggle = (show) => { \n\t\t\tfor (const fn of [...list]) { fn(show); }\n\t\t };\n\t\tpageHandler.hide = () => { this.#onHide(); };\n\t\tpageHandler.get = () => ({\n\t\t\tpath: this.#path.get(),\n\t\t\tsearch: this.#search.get(),\n\t\t\thash: this.#hash.get(),\n\t\t});\n\t\tpageHandler.update = (p, s, h) => {\n\t\t\tthis.#path.set(p);\n\t\t\tthis.#search.set(s);\n\t\t\tthis.#hash.set(h);\n\t\t\tswitchPage(pageHandler, this.#bootLoading.get());\n\t\t};\n\t\tconst title = define?.title;\n\t\tif (title) { this.title = title; }\n\t\tcreateButton(pageHandler, this);\n\t}\n\n\t/** @type {Set<(show: boolean) => void>} */\n\t#onToggle = new Set();\n\t/**\n\t * \n\t * @param {(show: boolean) => void} fn \n\t * @param {AbortSignal} signal \n\t */\n\tonToggle(fn, signal) {\n\t\tif (signal?.aborted) { return }\n\t\tconst list = this.#onToggle;\n\t\tlist.add(fn);\n\t\tsignal.addEventListener('abort', () => {list.delete(fn)}, {once: true});\n\t}\n\tget bootLoading() { return this.#bootLoading.get(); }\n\tget define() { return this.#define; }\n\tget ident() { return this.#ident; }\n\tget root() { return this.#root; }\n\tget path() { return this.#path.get(); }\n\tget search() { return this.#search.get(); }\n\tget hash() { return this.#hash.get(); }\n\tget href() { return this.#href.get(); }\n\tget current() { return this.#pageHandler === currentPage.get(); }\n\tget shown() { return this.#pageHandler === currentDomPage.get(); }\n\tget title() { return this.#title.get(); }\n\tset title(title) { this.#title.set(title); }\n\tget icon() { return this.#icon.get(); }\n\tset icon(icon) { this.#icon.set(icon); }\n\tget print() { return this.#printDeeply; }\n\tset print(print) { this.#print.set(structuredClone(print)); }\n\tget unsaved() { return this.#unsaved.get(); }\n\tset unsaved(unsaved) { this.#unsaved.set(unsaved); }\n\tget loading() { return this.#loading.get(); }\n\tset loading(loading) {\n\t\tthis.#loading.set(loading);\n\t\tif (!loading) { this.#bootLoading.set(false); }\n\t\tif (this.#pageHandler !== currentPage.get()) { return; }\n\t\tif (this.#bootLoading.get()) { return; }\n\t\tsetLoading(false);\n\t}\n\n\t/**\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @returns {string}\n\t */\n\ttoUrl(url, page) {\n\t\tif (page) {\n\t\t\tif (typeof page === 'string') {\n\t\t\t\treturn toUrl(application.path, page, url);\n\t\t\t} else if (typeof page === 'object') {\n\t\t\t\treturn toUrl(application.path, routerParser.stringify(page), url);\n\t\t\t}\n\t\t}\n\t\treturn url[0] === '/' ? url : toUrl(this.#root, url);\n\t}\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\topen(url, page, replace) {\n\t\tthis.#open(\n\t\t\tthis.toUrl(url, typeof page === 'boolean' ? '' : page),\n\t\t\ttypeof page === 'boolean' ? page : replace,\n\t\t);\n\t}\n\t/**\n\t * \n\t * @param {string} p \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tsetPath(p, replace) {\n\t\tconst hashIndex = p.indexOf('#');\n\t\tthis.#hash.set(hashIndex >= 0 ? p.slice(hashIndex) : '');\n\t\tif (hashIndex >= 0) { p = p.slice(0, hashIndex); }\n\t\tif (p) {\n\t\t\tconst searchIndex = p.indexOf('?');\n\t\t\tthis.#search.set(searchIndex >= 0 ? p.slice(searchIndex) : '');\n\t\t\tif (searchIndex >= 0) { p = p.slice(0, searchIndex); }\n\t\t}\n\t\tif (p) { this.#path.set(p); }\n\t\tif (this.#pageHandler !== currentPage.get()) { return; }\n\t\tthis.#setRootPath(this.#rootPath.get(), replace);\n\t}\n\t/**\n\t * \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tshow(replace) {\n\t\tif (this.#pageHandler === currentPage.get()) { return; }\n\t\tthis.#setRootPath(this.#rootPath.get(), replace);\n\t}\n\tget destroyDeferred() { return !this.destroyed && this.#destroyDelayed.get(); }\n\t/**\n\t * @param {boolean} [defer]\n\t * @returns {boolean}\n\t */\n\tdestroy(defer) {\n\t\tconst destroyPage = () => {\n\t\t\tthis.#onHide = () => { };\n\t\t\tconst abortController = this.#abortController;\n\t\t\tif (abortController.signal.aborted) { return false; }\n\t\t\tabortController.abort();\n\t\t\tremove(this.#pageHandler);\n\t\t\treturn true;\n\t\t};\n\t\tif (!defer) {\n\t\t\treturn destroyPage();\n\t\t}\n\t\tif (this.#destroyDelayed.get() || this.destroyed) { return false; }\n\t\tthis.#destroyDelayed.set(true);\n\t\tif (currentDomPage.get() !== this.#pageHandler) {\n\t\t\treturn destroyPage();\n\t\t}\n\t\tthis.#onHide = destroyPage;\n\t\treturn true;\n\t}\n}\n","/** @import { PageContext } from './PageContext.mjs' */\n\n/**\n * @typedef {object} PageError\n * @property {string} title\n * @property {string} [description]\n */\n\n/** @type {Record<string, PageError>} */\nexport const errors = {\n\t404: {\n\t\ttitle: '您所请求的页面无法找到',\n\t\tdescription: '服务器无法正常提供信息。\\n目标页面可能已经被更改、删除或移到其他位置,或您所输入页面地址错误。',\n\t}\n};\n/**\n * @param {PageContext} ctx\n * @param {unknown} error\n * @returns {void}\n */\nexport let renderError = function renderError(ctx, error) {\n\tconst e = (typeof error === 'number' || typeof error === 'string')\n\t\t&& Object.hasOwn(errors, error) && errors[error]\n\t\t|| errors['404'];\n\tconst title = e?.title || 'Error';\n\tconst info = e?.description;\n\tconst errorContainer = document.createElement('div');\n\tconst main = errorContainer.appendChild(document.createElement('div'));\n\tconst titleDiv = main.appendChild(document.createElement('div'));\n\tconst infoDiv = main.appendChild(document.createElement('div'));\n\terrorContainer.style.marginBlock = '8%';\n\terrorContainer.style.marginInline = 'auto';\n\terrorContainer.style.inlineSize = '600px';\n\terrorContainer.style.maxInlineSize = '100%';\n\terrorContainer.style.padding = '20px';\n\ttitleDiv.style.paddingBlock = '20px';\n\ttitleDiv.style.fontSize = '20px';\n\ttitleDiv.style.color = '#8e8e8e';\n\ttitleDiv.style.textAlign = 'center';\n\tinfoDiv.style.fontSize = '13px';\n\tinfoDiv.style.lineHeight = '1.3em';\n\tinfoDiv.style.color = '#b5b5b5';\n\ttitleDiv.appendChild(document.createTextNode(title));\n\tctx.title = title || 'Error'\n\tif (info && typeof info === 'string') {\n\t\tfor (const p of info.split('\\n')) {\n\t\t\tinfoDiv.appendChild(document.createTextNode(p));\n\t\t\tinfoDiv.appendChild(document.createElement('br'));\n\t\t}\n\t}\n\tctx.container.appendChild(errorContainer);\n\tctx.loading = false;\n}\n\n/**\n * @param {typeof renderError} [renderer]\n */\nexport function switchRenderError(renderer) {\n\tif (typeof renderer !== 'function') { return false; }\n\trenderError = renderer;\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\n\n\n\nexport class PageFooter extends GeneralContext {\n\t#root;\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\tget sticky() { return this.#root.classList.contains('Page-sticky'); }\n\tset sticky(sticky) {\n\t\tif (sticky) {\n\t\t\tthis.#root.classList.add('Page-sticky');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-sticky');\n\t\t}\n\t}\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t#container = document.createElement('div');\n\tget container() { return this.#container; }\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\troot.className = 'Page-footer';\n\t\tcontainer.className = 'Page-footer-main';\n\t}\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\n\n\n\nexport class PageHeader extends GeneralContext {\n\t#root;\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\tget sticky() { return this.#root.classList.contains('Page-sticky'); }\n\tset sticky(sticky) {\n\t\tif (sticky) {\n\t\t\tthis.#root.classList.add('Page-sticky');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-sticky');\n\t\t}\n\t}\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t#container = document.createElement('div');\n\t#menu = document.createElement('div');\n\tget container() { return this.#container; }\n\t#destroyMenu = () => { };\n\t/**\n\t * \n\t * @param {*} menus \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, create = Menu.createItem) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#destroyMenu();\n\t\tconst menuContainer = this.#menu;\n\t\tconst ac = new AbortController();\n\t\tconst menu = Menu.createButtons(menus, create, AbortSignal.any([ac.signal, this.signal]));\n\t\tif (menu) { menuContainer.appendChild(menu); }\n\t\tthis.#destroyMenu = () => { ac.abort(); menu?.remove(); this.#destroyMenu = () => { }; };\n\t}\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\tconst menu = root.appendChild(this.#menu);\n\t\troot.className = 'Page-header';\n\t\tcontainer.className = 'Page-header-main';\n\t\tmenu.className = 'Page-header-menu';\n\t}\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { createState } from '../signal.mjs';\n\nexport class PageSection extends GeneralContext {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#container = this.#root.appendChild(document.createElement('div'));\n\tget container() { return this.#container; }\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t/** @readonly @type {ParentNode} */\n\t#parent;\n\t/** @readonly @type {Node} */\n\t#placeholder;\n\t#inserted = createState(false);\n\tget inserted() { return this.#inserted.get(); }\n\tinsert() {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#inserted.set(true);\n\t\tif (this.#root.nextSibling === this.#placeholder) { return; }\n\t\tthis.#parent.insertBefore(this.#root, this.#placeholder);\n\t}\n\tremove() { this.#root.remove(); this.#inserted.set(false); }\n\t/**\n\t * \n\t * @param {ParentNode} parent \n\t * @param {Node?} next \n\t * @param {boolean} inserted \n\t * @param {AbortSignal} signal \n\t * @returns \n\t */\n\tconstructor(parent, next, inserted, signal) {\n\t\tsuper(signal);\n\t\tconst placeholder = parent.insertBefore(document.createComment(''), next);\n\t\tthis.#parent = parent;\n\t\tthis.#placeholder = placeholder;\n\n\n\t\tconst root = this.#root;\n\t\tconst container = this.#container;\n\n\t\troot.className = 'Page-section';\n\t\tcontainer.className = 'Page-section-main';\n\n\t\tif (inserted) {\n\t\t\tparent.insertBefore(root, placeholder);\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\troot.remove();\n\t\t\tplaceholder.remove();\n\t\t\tthis.#inserted.set(false);\n\t\t}, { once: true });\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\nimport { createState } from '../signal.mjs';\n\nexport class PageSider extends GeneralContext {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#header = this.#root.appendChild(document.createElement('div'));\n\t#body = this.#root.appendChild(document.createElement('div'));\n\t#title = this.#header.appendChild(document.createElement('div'));\n\t#buttons = this.#header.appendChild(document.createElement('div'));\n\t#container = this.#body.appendChild(document.createElement('div'));\n\tget container() { return this.#container; }\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t\tif (!this.#inserted.get()) { return; }\n\t\tthis.#updateParentUnprintable();\n\t}\n\t#updateParentUnprintable() {\n\t\tconst parent = this.#parent;\n\t\tif ([...parent.children].find(v => !v.classList.contains('unprintable'))) {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t}\n\n\t}\n\tget panel() { return this.#body.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#body.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#body.classList.remove('Page-panel');\n\t\t}\n\t}\n\tget title() { return this.#title.textContent || ''; }\n\tset title(t) { this.#title.textContent = t; }\n\t/** @type {AbortController?} */\n\t#menuAbortController = null;\n\t/** @readonly @type {ParentNode} */\n\t#parent;\n\t/** @readonly @type {Node} */\n\t#placeholder;\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {Menu?} button \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, button, create = Menu.createItem) {\n\t\tif (this.signal.aborted) { return; }\n\t\tthis.#menuAbortController?.abort();\n\t\tconst menuAbortController = new AbortController();\n\t\tthis.#menuAbortController = menuAbortController;\n\t\tconst menuSignal = AbortSignal.any([menuAbortController.signal, this.signal]);\n\t\tconst menu = Menu.createButton(menus, button, create, menuSignal);\n\t\tif (!menu) { return; }\n\t\tthis.#header.appendChild(menu);\n\t\tmenuSignal.addEventListener('abort', () => {\n\t\t\tmenu.remove();\n\t\t}, { once: true });\n\t}\n\t#inserted = createState(false);\n\tget inserted() { return this.#inserted.get(); }\n\tinsert() {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#inserted.set(true);\n\t\tif (this.#root.nextSibling === this.#placeholder) { return; }\n\t\tthis.#parent.insertBefore(this.#root, this.#placeholder);\n\t\tthis.#updateParentUnprintable();\n\t}\n\tremove() {\n\t\tthis.#root.remove();\n\t\tthis.#inserted.set(false);\n\t\tthis.#updateParentUnprintable();\n\t}\n\t/**\n\t * \n\t * @param {ParentNode} parent \n\t * @param {Node?} next \n\t * @param {boolean} inserted \n\t * @param {AbortSignal} signal \n\t * @returns \n\t */\n\tconstructor(parent, next, inserted, signal) {\n\t\tsuper(signal);\n\t\tconst placeholder = parent.insertBefore(document.createComment(''), next);\n\t\tthis.#parent = parent;\n\t\tthis.#placeholder = placeholder;\n\t\tconst root = this.#root;\n\t\tconst header = this.#header;\n\t\tconst body = this.#body;\n\t\tconst title = this.#title;\n\t\tconst buttons = this.#buttons;\n\t\tconst container = this.#container;\n\t\troot.className = 'Page-sider';\n\t\theader.className = 'Page-sider-header';\n\t\tbody.className = 'Page-sider-body';\n\t\tcontainer.className = 'Page-sider-body-main';\n\t\ttitle.className = 'Page-sider-title';\n\t\tbuttons.className = 'Page-sider-buttons';\n\t\tif (inserted) {\n\t\t\tparent.insertBefore(root, placeholder);\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\troot.remove();\n\t\t\tplaceholder.remove();\n\t\t\tthis.#inserted.set(false);\n\t\t\tthis.#updateParentUnprintable();\n\n\t\t}, { once: true });\n\t}\n}\n","import { createDialog, createModal, Modal, root as rootContainer } from '../dom/index.mjs';\nimport { PageFooter } from './PageFooter.mjs';\nimport { PageHeader } from './PageHeader.mjs';\nimport { PageSection } from './PageSection.mjs';\nimport { PageSider } from './PageSider.mjs';\n\n\n\n/**\n * \n * @param {ParentNode} parent \n * @param {Node?} next \n * @param {boolean} inserted \n * @param {AbortSignal} signal \n * @returns \n */\nexport function createSider(parent, next, inserted, signal) {\n\treturn new PageSider(parent, next, inserted, signal);\n}\nexport class Page {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.#signal]) : this.#signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.#signal]) : this.#signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#sides = this.#root.appendChild(document.createElement('div'));\n\t#main = this.#root.appendChild(document.createElement('div'));\n\t#body = this.#main.appendChild(document.createElement('div'));\n\t#container = this.#body.appendChild(document.createElement('div'));\n\t#destroyed = false;\n\t/** @type {PageHeader?} */\n\t#header = null;\n\t/** @type {PageFooter?} */\n\t#footer = null;\n\t/** @type {'scroll' | 'flex'} */\n\t#mode = 'scroll';\n\tget destroyed() { return this.#destroyed; }\n\tget container() { return this.#container; }\n\tget mode() { return this.#mode; }\n\tset mode(mode) {\n\t\tconst root = this.#root;\n\t\troot.classList.remove(`Page-mode-${this.#mode}`);\n\t\tthis.#mode = mode;\n\t\troot.classList.add(`Page-mode-${mode}`);\n\t}\n\tget panel() { return this.#body.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#body.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#body.classList.remove('Page-panel');\n\t\t}\n\t}\n\tget show() { return !this.#root.hidden; }\n\t/**\n\t * \n\t * @param {boolean} show \n\t */\n\ttoggle(show) {\n\t\tthis.#root.hidden = !show;\n\t}\n\tdestroy() {\n\t\tif (this.#destroyed) { return false; }\n\t\tthis.#destroyed = true;\n\t\tthis.#root.remove();\n\t\tthis.#abortController.abort();\n\t\treturn true;\n\t}\n\t/** @type {HTMLElement?} */\n\t#headerRoot = null;\n\t/** @type {AbortController?} */\n\t#headerAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateHeader(signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tif (signal?.aborted) {\n\t\t\tconst headerAbortController = this.#headerAbortController;\n\t\t\tif (headerAbortController) {\n\t\t\t\theaderAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#header) { return this.#header; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#main.insertBefore(root, this.#main.firstChild);\n\t\tthis.#headerRoot = root;\n\t\tthis.#headerAbortController = abortController;\n\t\tconst header = new PageHeader(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#header = header;\n\t\theader.signal.addEventListener('abort', () => {\n\t\t\tthis.#headerAbortController = null;\n\t\t\tthis.#header = null;\n\t\t\tthis.#headerRoot = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#header;\n\t}\n\t/** @type {HTMLDivElement?} */\n\t#footerRoot = null;\n\t/** @type {AbortController?} */\n\t#footAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateFooter(signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tif (signal?.aborted) {\n\t\t\tconst footAbortController = this.#footAbortController;\n\t\t\tif (footAbortController) {\n\t\t\t\tfootAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#footer) { return this.#footer; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#main.appendChild(root);\n\t\tthis.#footerRoot = root;\n\t\tthis.#footAbortController = abortController;\n\t\tconst footer = new PageFooter(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#footer = footer;\n\n\t\tfooter.signal.addEventListener('abort', () => {\n\t\t\tthis.#footAbortController = null;\n\t\t\tthis.#footer = null;\n\t\t\tthis.#footerRoot = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#footer;\n\t}\n\t/**\n\t * \n\t * @param {'start' | 'end' | 'before' | 'after'} position \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSection}\n\t */\n\tcreateSection(position, inserted, signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tsignal?.throwIfAborted();\n\t\tconst parent = this.#main;\n\t\tlet next = null;\n\t\tswitch (position) {\n\t\t\tcase 'start': next = this.#headerRoot || parent.firstChild; break;\n\t\t\tcase 'before': next = this.#container; break;\n\t\t\tdefault:\n\t\t\tcase 'after': next = this.#container.nextSibling; break;\n\t\t\tcase 'end': next = this.#footerRoot; break;\n\t\t}\n\t\treturn new PageSection(\n\t\t\tparent,\n\t\t\tnext,\n\t\t\tinserted !== false,\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, this.#signal])\n\t\t\t\t: this.#signal\n\t\t);\n\t}\n\t#abortController = new AbortController();\n\t#signal = this.#abortController.signal;\n\tget signal() { return this.#signal; }\n\tget siderOpen() { return !this.#sides.hidden; }\n\tset siderOpen(open) { this.#sides.hidden = !open; }\n\t/**\n\t * \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSider}\n\t */\n\tcreateSider(inserted, signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tsignal?.throwIfAborted();\n\t\tconst parent = this.#sides;\n\t\treturn createSider(\n\t\t\tparent,\n\t\t\tnull,\n\t\t\tinserted !== false,\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, this.#signal])\n\t\t\t\t: this.#signal\n\t\t);\n\t}\n\t/**\n\t * \n\t * @param {boolean} show \n\t */\n\tconstructor(show) {\n\t\tthis.#main.className = 'Page-main';\n\t\tthis.#body.className = 'Page-body';\n\t\tthis.#container.className = 'Page-body-main';\n\t\tthis.#sides.className = 'Page-sides';\n\t\tconst root = this.#root;\n\t\troot.className = 'Page';\n\t\troot.hidden = !show;\n\t\trootContainer.appendChild(root);\n\t}\n}\n","/** @import { PageFrame } from '../typesDefine.mjs' */\nimport { root } from '../dom/index.mjs';\nimport { Page } from './Page.mjs';\n\n/**\n * @param {boolean} show\n */\nexport let createPage = (show) => new Page(show);\n\n/**\n * @param {PageFrame.Context} ctx\n * @returns {PageFrame}\n */\nexport let createFrame = (ctx) => {\n\tconst iframe = document.createElement('iframe')\n\tiframe.classList.add('Page-frame');\n\tctx.loading = false;\n\tiframe.hidden = !ctx.show;\n\tiframe.src = ctx.url;\n\troot.appendChild(iframe);\n\treturn {\n\t\t/**\n\t\t * \n\t\t * @param {boolean} show \n\t\t */\n\t\ttoggle(show) {\n\t\t\tiframe.hidden = !show;\n\t\t},\n\t\tdestroy() {\n\t\t\tiframe.remove();\n\t\t}\n\t};\n};\n\n/**\n * @param {(show: boolean) => Page} [renderer]\n * @param {(ctx: PageFrame.Context) => PageFrame} [frame]\n */\nexport function switchCreatePage(renderer, frame) {\n\tif (typeof renderer === 'function') {\n\t\tcreatePage = renderer;\n\t}\n\tif (typeof frame === 'function') {\n\t\tcreateFrame = frame;\n\t}\n}\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { PageSectionParam } from '../typesDefine.mjs' */\n/** @import { Page } from './Page.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n/** @import { PageHandle } from './PageHandle.mjs' */\n/** @import { PageSection } from './PageSection.mjs' */\n/** @import { PageHeader } from './PageHeader.mjs' */\n/** @import { PageFooter } from './PageFooter.mjs' */\nimport GeneralContext from '../GeneralContext.mjs';\nimport { importWidget } from '../import.mjs';\nimport { renderError } from './renderError.mjs';\nimport { createPage } from './createPage.mjs';\nimport { createState } from '../signal.mjs';\n/** @import { Modal } from '../dom/index.mjs' */\n\n\n\n\nexport class PageContext extends GeneralContext {\n\t/** @readonly */\n\t#destroyDelayed = createState(false);\n\t/** @readonly @type {Page} */\n\t#pageUI;\n\t/** @readonly @type {HTMLElement} */\n\t#container;\n\t/** @readonly @type {AbortController} */\n\t#abortController;\n\t/** @readonly @type {PageHandle} */\n\t#state;\n\t/**\n\t * \n\t * @param {PageHandle} state \n\t */\n\tconstructor(state) {\n\n\t\tconst ac = new AbortController();\n\t\tsuper(AbortSignal.any([ac.signal, state.signal]));\n\t\tthis.#state = state;\n\t\tthis.#abortController = ac;\n\n\t\tconst pageUI = createPage(state.current && !state.bootLoading);\n\t\tthis.#pageUI = pageUI;\n\t\tthis.#container = pageUI.container;\n\t\tif (this.signal.aborted) {\n\t\t\tpageUI.destroy?.();\n\t\t\treturn;\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\tpageUI.destroy?.();\n\t\t}, { once: true });\n\t\tstate.onToggle((show) => { pageUI.toggle(show && !state.bootLoading); }, this.signal);\n\n\t}\n\t/**\n\t * \n\t * @param {unknown} [err] \n\t * @returns \n\t */\n\tsetError(err) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#abortController.abort();\n\t\tconst ctx = new PageContext(this.#state);\n\t\trenderError(ctx, err);\n\t}\n\n\tget bootLoading() { return this.#state.bootLoading; }\n\tget define() { return this.#state.define; }\n\tget ident() { return this.#state.ident; }\n\tget root() { return this.#state.root; }\n\tget path() { return this.#state.path; }\n\tget search() { return this.#state.search; }\n\tget hash() { return this.#state.hash; }\n\tget href() { return this.#state.href; }\n\tget current() { return this.#state.current; }\n\tget shown() { return this.#state.shown; }\n\tget title() { return this.#state.title; }\n\tset title(title) { this.#state.title = title; }\n\tget icon() { return this.#state.icon; }\n\tset icon(icon) { this.#state.icon = icon; }\n\tget print() { return this.#state.print; }\n\tset print(print) { this.#state.print = print; }\n\tget unsaved() { return this.#state.unsaved; }\n\tset unsaved(unsaved) { this.#state.unsaved = unsaved; }\n\tget loading() { return this.#state.loading; }\n\tset loading(loading) { this.#state.loading = loading; }\n\n\tget container() { return this.#container; }\n\tget panel() { return this.#pageUI.panel; }\n\tset panel(panel) { this.#pageUI.panel = Boolean(panel); }\n\tget mode() { return this.#pageUI.mode; }\n\tset mode(mode) {\n\t\tif (!['scroll', 'flex'].includes(mode)) { return; }\n\t\tthis.#pageUI.mode = mode;\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) { return this.#pageUI.createDialog(p1, p2); }\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) { return this.#pageUI.createModal(p1, p2); }\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageHeader}\n\t */\n\tcreateHeader(signal) { return this.#pageUI.createHeader(signal); }\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageFooter}\n\t */\n\tcreateFooter(signal) { return this.#pageUI.createFooter(signal); }\n\t/**\n\t * \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateSider(inserted, signal) {\n\t\treturn this.#pageUI.createSider(inserted, signal);\n\t}\n\t/**\n\t * \n\t * @param {'start' | 'end' | 'before' | 'after'} position \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSection}\n\t */\n\tcreateSection(position, inserted, signal) {\n\t\treturn this.#pageUI.createSection(position, inserted, signal);\n\t}\n\t/**\n\t * \n\t * @param {{widget: string; options: string}[]} sides \n\t * @param {PageSectionParam} param \n\t */\n\trenderSides(sides, param) {\n\t\tfor (const def of sides) {\n\t\t\tconst { widget } = def;\n\t\t\tif (!widget) { continue; }\n\t\t\tconst ac = new AbortController();\n\t\t\tconst sider = this.#pageUI.createSider(false, ac.signal);\n\t\t\tif (!sider) { continue; }\n\t\t\timportWidget(widget).then(fn => {\n\t\t\t\tif (typeof fn !== 'function') {\n\t\t\t\t\tac.abort();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsider.insert();\n\t\t\t\tfn(sider, def, param);\n\t\t\t});\n\t\t}\n\n\t}\n\t/**\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @returns {string}\n\t */\n\ttoUrl(url, page) { return this.#state.toUrl(url, page); }\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\topen(url, page, replace) { return this.#state.open(url, page, replace); }\n\t/**\n\t * \n\t * @param {string} p \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tsetPath(p, replace) { return this.#state.setPath(p, replace); }\n\t/**\n\t * \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tshow(replace) { return this.#state.show(replace); }\n\tget destroyDeferred() { return !this.destroyed && this.#destroyDelayed.get(); }\n\t/**\n\t * @param {boolean} [defer]\n\t * @returns {boolean}\n\t */\n\tdestroy(defer) { return this.#state.destroy(defer); }\n}\n","/** @import { PageHandle } from './PageHandle.mjs' */\nimport { createFrame } from './createPage.mjs';\n\n\n/**\n * \n * @param {PageHandle} state \n * @param {string} url \n * @param {string} [title] \n */\nexport function createPageFrame(state, url, title = '') {\n\tif (title) { state.title = title; }\n\tconst signal = state.signal;\n\n\tif (signal.aborted) { return; }\n\tconst pageUI = createFrame({\n\t\tget url() { return url;},\n\t\tget show() { return state.current && !state.bootLoading;},\n\t\tget title() { return state.title; },\n\t\tset title(title) { if (signal.aborted) { return; } state.title = title; },\n\t\tget icon() { return state.icon; },\n\t\tset icon(icon) { if (signal.aborted) { return; } state.icon = icon; },\n\t\tget loading() { return state.loading; },\n\t\tset loading(loading) { if (signal.aborted) { return; } state.loading = loading; },\n\t});\n\tsignal.addEventListener('abort', () => {\n\t\tpageUI.destroy?.();\n\t}, { once: true });\n\tstate.onToggle((show) => { pageUI.toggle(show && !state.bootLoading); }, signal);\n\n}\n","/** @import { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n/** @import { RootPageExt } from './PageHandle.mjs' */\nimport load from './load.mjs';\nimport { switchPage, currentPage } from './home.mjs';\nimport * as routerParser from './route.mjs';\nimport { PageHandle } from './PageHandle.mjs';\nimport { PageContext } from './PageContext.mjs';\nimport { createPageFrame } from './createPageFrame.mjs';\n\n/** @type {Map<string, PageInfo & RootPageExt>} */\nconst pages = new Map();\n\n/**\n * \n * @param {string} pageRoot \n * @returns \n */\nexport function find(pageRoot) {\n\treturn pages.get(pageRoot)?.get();\n}\n/**\n * \n * @param {(url: string, replace?: boolean) => void} open \n * @param {PageIdent} pageIdent \n * @param {string} parentRoot \n * @param {string} pageRoot \n * @param {string} path \n * @param {string} search \n * @param {string} hash \n * @param {(p: string, replace?: boolean) => void} setRootPath \n * @returns \n */\nexport default async function showPage(\n\topen,\n\tpageIdent,\n\tparentRoot,\n\tpageRoot,\n\tpath,\n\tsearch,\n\thash,\n\tsetRootPath,\n) {\n\tlet pageId = pageRoot;\n\tlet old = pages.get(pageId);\n\tif (old) {\n\t\told.update(path, search, hash);\n\t\treturn;\n\t}\n\t/** @type {PageInfo & RootPageExt} */\n\tconst pageHandler = {\n\t\ttoggle() { },\n\t\thide() { },\n\t\tget() { return { path, search, hash }; },\n\t\tupdate(p, s, h) {\n\t\t\tpath = p;\n\t\t\tsearch = s;\n\t\t\thash = h;\n\t\t\tswitchPage(pageHandler, true);\n\t\t},\n\t};\n\tpages.set(pageId, pageHandler);\n\tswitchPage(pageHandler, true);\n\tconst data = await load(pageIdent).catch(() => null);\n\tif (pageHandler !== currentPage.get()) {\n\t\t// 请求完数据前已经切换了,那就移除\n\t\tpages.delete(pageId);\n\t\treturn;\n\t}\n\tif (!data) {\n\t\tconst state = new PageHandle({\n\t\t\troot: `${parentRoot}${pageId}`,\n\t\t\tdefine: null,\n\t\t\tident: pageIdent,\n\t\t\tpageId: pageId,\n\t\t\tpath, search, hash,\n\t\t\tpageHandler,\n\t\t\topen,\n\t\t\tsetRootPath,\n\t\t});\n\t\tstate.signal.addEventListener('abort', () => {\n\t\t\tpages.delete(pageId);\n\t\t}, { once: true });\n\t\t// 出现错误,显示错误\n\t\tnew PageContext(state).setError(404);\n\t\treturn;\n\t}\n\tconst newPage = data.ident;\n\t// TODO: 获取新页面的 pageRoot\n\tconst newPageRoot = routerParser.stringify(newPage);\n\tif (pageId !== newPageRoot) {\n\t\tpageIdent = newPage;\n\t\t// 原始页面不存在,需要跳转为其他页面\n\t\tif (pages.get(pageId) !== pageHandler) { return; }\n\t\tpages.delete(pageId);\n\t\tconst targetPage = pages.get(newPageRoot);\n\t\tif (targetPage) {\n\t\t\t// 目标页面已存在,则单纯切换\n\t\t\tsetRootPath(`${newPageRoot}/${path}${search}${hash}`, true);\n\t\t\treturn;\n\t\t}\n\t\tpageId = newPageRoot;\n\t\tpages.set(pageId, pageHandler);\n\t\tsetRootPath(`${newPageRoot}/${path}${search}${hash}`, true);\n\t}\n\tconst widget = data.widget;\n\tif (typeof widget === 'string') {\n\t\tconst state = new PageHandle({\n\t\t\troot: `${parentRoot}${pageId}`,\n\t\t\tdefine: data.page || null,\n\t\t\tident: pageIdent,\n\t\t\tpageId: pageId,\n\t\t\tpath, search, hash,\n\t\t\tpageHandler,\n\t\t\topen,\n\t\t\tsetRootPath,\n\t\t});\n\t\tstate.signal.addEventListener('abort', () => {\n\t\t\tpages.delete(pageId);\n\t\t}, { once: true });\n\t\tcreatePageFrame(state, widget);\n\t\treturn;\n\t}\n\n\n\tconst renderer = await widget();\n\tif (pageHandler !== currentPage.get()) {\n\t\t// 页面已切换\n\t\tpages.delete(pageId);\n\t\treturn;\n\t}\n\tconst state = new PageHandle({\n\t\troot: `${parentRoot}${pageId}`,\n\t\tdefine: data.page || null,\n\t\tident: pageIdent,\n\t\tpageId: pageId,\n\t\tpath, search, hash,\n\t\tpageHandler,\n\t\topen,\n\t\tsetRootPath,\n\t});\n\tstate.signal.addEventListener('abort', () => {\n\t\tpages.delete(pageId);\n\t}, { once: true });\n\tconst pc = new PageContext(state);\n\tif (typeof renderer !== 'function') {\n\t\tpc.setError();\n\t\treturn;\n\t}\n\ttry {\n\t\tawait renderer(pc);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpc.setError(e);\n\t}\n}\n","/**\n *\n * @param {string} url\n * @param {boolean} [replace]\n * @returns\n */\nexport default function setHistoryUrl(url, replace) {\n\tconst {href} = location;\n\tconst u = new URL(url, href);\n\tif (u.href === href) { return; }\n\tif (replace) {\n\t\thistory.replaceState({}, '', url);\n\t} else {\n\t\thistory.pushState({}, '', url);\n\t}\n}\n","import { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport showPage, { find } from './showPage.mjs';\nimport { showHome } from './home.mjs';\nimport { openUrl } from './setUrl.mjs';\nimport setHistoryUrl from './setHistoryUrl.mjs';\nimport { PageIdent } from './route.mjs';\n\n\n/**\n * 页面管理器\n * @callback PathListener\n * @param {string} path\n * @param {string} search\n * @param {string} hash\n * @param {(PageIdent & {path: string})?} page \n * @returns {void}\n */\n/** @type {Map<symbol, PathListener>} */\nconst listeners = new Map();\n\n/**\n * \n * @param {PathListener} listener \n * @returns \n */\nexport function listenPath(listener) {\n\tconst symbol = Symbol();\n\tlisteners.set(symbol, listener);\n\treturn () => { listeners.delete(symbol); };\n}\n/**\n * \n * @param {(PageIdent & {path: string})?} page \n */\nexport function updatePath(page) {\n\tconst {\n\t\tpathname, search, hash,\n\t} = new URL(location.href);\n\tfor (const updatePath of [...listeners.values()]) {\n\t\tupdatePath(pathname, search, hash, page ? { ...page } : null);\n\t}\n}\n\n/**\n * \n * @param {string} path \n * @param {boolean} [replace] \n * @returns \n */\nfunction setRoot(path, replace) {\n\tsetHistoryUrl(toUrl(application.path, path), replace);\n\tparse();\n}\n/**\n * \n * @param {URL | Location} u \n * @param {boolean} [replace] \n * @param {boolean} [inLink] \n * @returns \n */\nexport function parseFormUrl({ pathname, search, hash }, replace = true, inLink) {\n\tconst root = application.path;\n\tlet subPath = pathname.replace(/(^|[\\\\\\/])[\\\\\\/]*/, '/');\n\tif (!subPath || subPath === '/' || subPath === root || subPath + '/' === root) {\n\t\tsetHistoryUrl(`${root}${search}${hash}`, replace);\n\t\tupdatePath(null);\n\t\tshowHome(search, hash);\n\t\treturn;\n\t}\n\tsubPath = subPath.slice(subPath.startsWith(`${root}`) ? root.length : 1);\n\tlet { path, page, pageRoot } = PageIdent.parse(subPath);\n\tif (inLink && (path || '/') === '/' && (search || '?') === '?' && (hash || '#') === '#') {\n\t\tconst page = find(pageRoot);\n\t\tif (page) { ({ path, search, search } = page); }\n\t}\n\tsetHistoryUrl(`${root}${pageRoot}${path}${search}${hash}`, replace);\n\tupdatePath({ ...page, path });\n\tshowPage(openUrl, page, root, pageRoot, path, search, hash, setRoot);\n}\n\nexport default function parse() {\n\tparseFormUrl(location)\n}\n","import { application } from '../configuration.mjs';\nimport { parseFormUrl } from './parse.mjs';\n\n/**\n * \n * @param {string} url \n * @param {boolean} [replace] \n * @returns \n */\nexport function openUrl(url, replace) {\n\tif (setUrl(url, replace)) { return; }\n\tlocation.href = url;\n}\n\n/** @type {Set<(url: URL) => boolean>} */\nconst urlGuard = new Set();\n/**\n * \n * @param {(url: URL) => boolean} fn \n */\nexport function addUrlGuard(fn) {\n\tconst f = fn.bind(null);\n\turlGuard.add(f);\n\treturn () => { urlGuard.delete(f); };\n\n}\n/**\n * \n * @param {string} url \n * @param {boolean} [replace] \n * @param {boolean} [skipGuard] \n * @param {boolean} [inLink] \n * @returns \n */\nexport default function setUrl(url, replace, skipGuard, inLink) {\n\tconst u = new URL(url, location.href);\n\tif (u.origin !== location.origin) { return false; }\n\tif (!skipGuard) {\n\t\tfor (const fn of [...urlGuard]) {\n\t\t\tif (fn(u) === false) { return false; }\n\t\t}\n\t}\n\tif (u.origin !== location.origin) { return false; }\n\tconst path = u.pathname;\n\tif (!path.startsWith(application.path)) { return false; }\n\tparseFormUrl(u, Boolean(replace), inLink);\n\treturn true;\n}\n","/** @import { MaybePromise } from '@yongdall/types' */\n/** @import { PageContext } from './PageContext.mjs' */\nimport setUrl from './setUrl.mjs';\nimport parse from './parse.mjs';\nimport { closeAll } from './pageManager.mjs';\nimport { isMac } from '../dom/index.mjs';\n\n/**\n * @callback PageRenderer\n * @param {PageContext} ctx\n * @returns {MaybePromise<void>}\n */\n\n/**\n * \n * @param {PointerEvent} e \n * @returns \n */\nfunction clickEventListener(e) {\n\tif (e.shiftKey) { return; }\n\tif (isMac ? e.metaKey : e.ctrlKey) { return; }\n\tif (e.defaultPrevented) { return; }\n\tfor (const a of e.composedPath()) {\n\t\tif (!(a instanceof HTMLAnchorElement)) { continue; }\n\t\tconst url = a.href;\n\t\tif (!url) { continue; }\n\t\tif ((a.target || '_self') !== '_self') { return; }\n\t\tif (setUrl(url, Boolean(a.getAttribute('replace')), false, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\t\treturn;\n\t}\n}\nexport function initRouter() {\n\twindow.addEventListener('click', clickEventListener);\n\twindow.addEventListener('popstate', parse);\n\tparse();\n}\nexport function stopRouter() {\n\twindow.removeEventListener('click', clickEventListener);\n\twindow.removeEventListener('popstate', parse);\n\tcloseAll();\n}\n\nexport { addUrlGuard } from './setUrl.mjs';\nexport { switchHome } from './home.mjs';\nexport { switchCreatePage } from './createPage.mjs';\nexport { switchRenderError } from './renderError.mjs';\nexport { PageIdent, setRouter } from './route.mjs';\n\nexport { addManager, getPages, currentPage } from './pageManager.mjs';\nexport { Page } from './Page.mjs';\nexport { PageSider } from './PageSider.mjs';\nexport { PageSection } from './PageSection.mjs';\nexport { PageHeader } from './PageHeader.mjs';\nexport { PageFooter } from './PageFooter.mjs';\nexport { listenPath } from './parse.mjs';\nexport { createFrame } from './createPage.mjs';\n","/** @import { ModelConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\n\n/**\n * \n * @param {ModelScriptConfiguration | ModelConfiguration} model \n * @param {Record<string, any> | [key: string, value: any][]} params \n * @param {Record<string, any>} [defaultValue] \n * @returns \n */\nexport const createModelDefault = (model, params, defaultValue) => {\n\tconst fields = model.fields;\n\treturn (Array.isArray(params) ? params : Object.entries(params)).reduceRight((r, [k, v]) => {\n\t\tconst field = Object.hasOwn(fields, k) && fields[k];\n\t\tif (!field) { return r; }\n\t\tconst type = field?.type;\n\t\tif (!type || typeof type !== 'string') { return r; }\n\t\tif (!v && field.array) { return r; }\n\t\tif (!v && field.nullable) {\n\t\t\tr[k] = null;\n\t\t\treturn r;\n\t\t}\n\t\tif (typeof v !== 'string') {\n\t\t\tr[k] = v;\n\t\t\treturn r;\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'i16':\n\t\t\tcase 'i32':\n\t\t\t\tif (/^[+-]?\\d+$/.test(v)) { r[k] = Number.parseInt(v); }\n\t\t\t\treturn r;\n\t\t\tcase 'i64':\n\t\t\t\tif (/^[+-]?\\d+$/.test(v)) { r[k] = v; }\n\t\t\t\treturn r;\n\t\t\tcase 'f32':\n\t\t\tcase 'f64':\n\t\t\t\tif (/^[+-]?\\d+(\\.\\d*)?([eE][+-]?\\d*)$/.test(v)) { r[k] = Number.parseFloat(v); }\n\t\t\t\treturn r;\n\t\t\tcase 'decimal':\n\t\t\tcase 'numeric':\n\t\t\tcase 'money':\n\t\t\t\tif (/^[+-]?\\d+(\\.\\d*)?([eE][+-]?\\d*)$/.test(v)) { r[k] = v; }\n\t\t\t\treturn r;\n\t\t\tcase 'bool':\n\t\t\t\tswitch (v.toLowerCase()) {\n\t\t\t\t\tcase '0': case 'n': case 'no': case 'f': case 'false':\n\t\t\t\t\t\tr[k] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '1': case 'y': case 'yes': case 't': case 'true':\n\t\t\t\t\t\tr[k] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn r;\n\t\t\tdefault:\n\t\t\t\tr[k] = v;\n\t\t\t\treturn r;\n\t\t}\n\t}, defaultValue || {});\n};\n","/** @import { FormLayout } from '@yongdall/types' */\n\nimport { createStore, renderForm } from '../form/index.mjs';\nimport { createModelDefault } from './createModelDefault.mjs';\n\n/** @import { Modal } from '../dom/index.mjs' */\n/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\nimport { modelService } from '../services/model.mjs';\n\n/**\n * \n * @param {Modal} modal \n * @param {ModelScriptConfiguration} model \n * @param {ReturnType<typeof modelService> | string} currentModel \n * @param {FormLayout?} [layout] \n * @param {Record<string, any> | [key: string, value: any][] | null} [newParams] \n */\nexport async function createDocumentInModal(modal, model, currentModel, layout, newParams) {\n\tconst header = modal.createHeader();\n\tconst body = modal.container;\n\tconst store = createStore(model);\n\tstore.new = true;\n\trenderForm(store, body, {\n\t\tmodel, editable: true,\n\t\tsignal: modal.signal,\n\t\tenableLink: Boolean(layout?.enableLinkEditable ?? layout?.enableLink),\n\t\tlayout: layout?.layout,\n\t\ttype: layout?.type\n\t});\n\tstore.reset(createModelDefault(model, newParams || [], store.createDefault()));\n\n\n\tconst label = model?.label || model.id || '';\n\tconst titleArea = header.container;\n\ttitleArea.classList.add('Modal-title');\n\ttitleArea.innerText = label ? `新建:${label}` : '新建';\n\n\tconst { promise, resolve } = Promise.withResolvers();\n\n\tconst buttons = header.buttons;\n\tbuttons.classList.add('MenuButtons');\n\n\tlet creating = false;\n\tconst createButton = buttons.appendChild(document.createElement('button'));\n\tcreateButton.innerText = '创建';\n\tbuttons.appendChild(document.createElement('hr'));\n\tconst closeButton = buttons.appendChild(document.createElement('button'));\n\tcloseButton.innerText = '取消';\n\tcreateButton.addEventListener('click', async () => {\n\t\tif (creating) { return; }\n\t\tcreating = true;\n\t\tcloseButton.disabled = true;\n\t\tcreateButton.disabled = true;\n\t\ttry {\n\t\t\tconst created = await (typeof currentModel === 'string' ? modelService(currentModel) : currentModel).create(store.value);\n\t\t\talert('创建完成');\n\t\t\tresolve(created);\n\t\t} finally {\n\t\t\tcloseButton.disabled = false;\n\t\t\tcreateButton.disabled = false;\n\t\t\tcreating = false;\n\t\t}\n\t});\n\tcloseButton.addEventListener('click', () => {\n\t\tif (creating) { return; }\n\t\tresolve(null);\n\t});\n\treturn promise;\n}\n","/** @import { FormLayout } from '@yongdall/types' */\n\nimport { runPattern } from '@yongdall/common';\nimport { isMac } from '../dom/index.mjs';\nimport { createStore, renderForm } from '../form/index.mjs';\nimport { createComputed, createState, effect } from '../signal.mjs';\nimport { testPermissions } from '../permission.mjs';\n/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\nimport { modelService } from '../services/model.mjs';\n\n/** @import { Modal } from '../dom/index.mjs' */\n\n/**\n * \n * @param {Modal} modal \n * @param {ModelScriptConfiguration} model \n * @param {ReturnType<typeof modelService>} currentModel \n * @param {string} id \n * @param {FormLayout?} [layout] \n * @param {object} [options] \n * @param {string} [options.href] \n * @param {boolean} [options.editable] \n * @param {boolean} [options.destroyable] \n */\nexport async function showDocumentInModal(modal, model, currentModel, id, layout, options) {\n\tconst header = modal.createHeader();\n\tconst body = modal.container;\n\tconst currentDocument = (typeof currentModel === 'string' ? modelService(currentModel) : currentModel).document(id);\n\n\tconst label = model?.label || model.id || '';\n\tconst titleArea = header.container;\n\ttitleArea.classList.add('Modal-title');\n\tconst title = label ? `详情:${label}` : '详情';\n\ttitleArea.innerText = label ? `详情:${label}` : '详情';\n\n\tconst doc = await currentDocument.get();\n\tif (modal.destroyed) { return; }\n\ttitleArea.innerText = runPattern(model?.labelPattern, doc) || title;\n\tconst store = createStore(model);\n\tconst { editable, destroyable } = options || {};\n\tstore.readonly = !editable;\n\trenderForm(store, body, {\n\t\tmodel, editable,\n\t\tsignal: modal.signal,\n\t\tenableLink: Boolean(editable ? layout?.enableLinkEditable ?? layout?.enableLink : layout?.enableLink),\n\t\tlayout: layout?.layout,\n\t\ttype: layout?.type\n\t});\n\tstore.reset(doc);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t/** @type {PromiseWithResolvers<void>} */\n\tconst { promise, resolve } = Promise.withResolvers();\n\n\tconst buttons = header.buttons;\n\tbuttons.classList.add('MenuButtons');\n\n\n\tconst running = createState(false);\n\tif (destroyable) {\n\t\tconst destroyable = createComputed(() => {\n\t\t\treturn testPermissions('destroy', model.permissions || [], store.value);\n\t\t});\n\t\tconst destroyButton = buttons.appendChild(document.createElement('button'));\n\t\tdestroyButton.innerText = '删除';\n\t\tbuttons.appendChild(document.createElement('hr'));\n\t\teffect(() => destroyButton.disabled = running.get() || !destroyable.get(), modal.signal);\n\t\tdestroyButton.addEventListener('click', async () => {\n\t\t\tif (!destroyable?.get()) { return; }\n\t\t\tif (modal.destroyed) { return; }\n\t\t\tif (running.get()) { return; }\n\t\t\tif (!confirm('确定要删除此文档吗?')) { return; }\n\t\t\trunning.set(true);\n\t\t\ttry {\n\t\t\t\tawait currentDocument.delete();\n\t\t\t\tresolve();\n\t\t\t} finally {\n\t\t\t\trunning.set(false);\n\t\t\t}\n\t\t});\n\t}\n\tif (editable) {\n\t\tconst createButton = buttons.appendChild(document.createElement('button'));\n\t\tcreateButton.innerText = '保存';\n\t\tbuttons.appendChild(document.createElement('hr'));\n\t\teffect(() => createButton.disabled = running.get(), modal.signal);\n\t\tcreateButton.addEventListener('click', async () => {\n\t\t\tif (modal.destroyed) { return; }\n\t\t\tif (running.get()) { return; }\n\t\t\trunning.set(true);\n\t\t\ttry {\n\t\t\t\tconst data = await currentDocument.update(store.value);\n\t\t\t\tresolve();\n\t\t\t} finally {\n\t\t\t\trunning.set(false);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconst { href } = options || {};\n\t\tif (href) {\n\t\t\tconst openButton = buttons.appendChild(document.createElement('button'));\n\t\t\tconst a = openButton.appendChild(document.createElement('a'));\n\t\t\ta.innerText = '打开';\n\t\t\ta.href = href;\n\t\t\tbuttons.appendChild(document.createElement('hr'));\n\t\t\teffect(() => openButton.disabled = running.get(), modal.signal);\n\t\t\ta.addEventListener('click', event => {\n\t\t\t\tif (event.shiftKey) { return; }\n\t\t\t\tif (isMac ? event.metaKey : event.ctrlKey) { return; }\n\t\t\t\tif (event.altKey) { return; }\n\t\t\t\tif (modal.destroyed) { return; }\n\t\t\t\tif (running.get()) { return; }\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\t}\n\tconst closeButton = buttons.appendChild(document.createElement('button'));\n\tcloseButton.innerText = '关闭';\n\teffect(() => closeButton.disabled = running.get(), modal.signal);\n\tcloseButton.addEventListener('click', () => {\n\t\tif (running.get()) { return; }\n\t\tresolve();\n\t});\n\treturn promise;\n}\n","/** @import { ModelConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\nconst regex = /\\{([^}{}]+)\\}/g\n\n/**\n *\n * @param {ModelConfiguration | ModelScriptConfiguration} model\n * @returns\n */\nexport function getPrimaryFields(model) {\n\treturn Object.entries(model.fields)\n\t\t.filter(v => v[1].primary)\n\t\t.sort(([,{primary: a}],[,{primary: b}]) => (a || 0) - (b || 0))\n\t\t.map(([v]) => v);\n}\n/**\n *\n * @param {ModelConfiguration | ModelScriptConfiguration | string[]} model\n * @param {Record<string, any>} document\n * @returns\n */\nexport function toId(document, model) {\n\treturn (Array.isArray(model) ? model :getPrimaryFields(model)).map(v => document[v]).join('$');\n}\nexport { createModelDefault } from './createModelDefault.mjs'\nexport { createDocumentInModal } from './createDocumentInModal.mjs'\nexport { showDocumentInModal } from './showDocumentInModal.mjs'\n","/** @import { Menu } from './Menu.mjs' */\n/** @import { ModelScriptConfiguration } from './services/model.mjs' */\n/** @import { PageIdent } from './route/route.mjs' */\n/** @import { Store } from '@neeloong/form' */\n\nimport { allHooks } from './allHooks.mjs';\nimport { createComputed } from './signal.mjs';\n\n/**\n * 命令选项\n * @typedef {Object} Command.Options\n * @property {'documents' | 'document' | 'createDocument' | 'editDocument'} type \n * @property {ModelScriptConfiguration} [model]\n * @property {PageIdent} [pageIdent]\n * @property {Record<string, any>} [document]\n * @property {Array<Record<string, any>>} [documents]\n * @property {Array<Record<string, any>>} [checkedDocuments]\n * @property {Store} [store]\n */\n\n/**\n * 命令接口\n * @typedef {Object} Command\n * @property {(options: Command.Options, menu: Menu, command: string) => boolean} disabled\n * @property {(options: Command.Options, menu: Menu, command: string) => string} toHref\n * @property {(options: Command.Options, menu: Menu, command: string) => void} exec\n */\n/**\n * @type {Partial<Command>}\n */\nconst scriptCommand = {\n\texec(options, menu, command) {\n\t\tconst { model } = options;\n\t\tif (!model) { return; }\n\t\tconst index = command.indexOf(':');\n\t\tif (index < 0) { return; }\n\t\tconst name = command.slice(index + 1);\n\t\tswitch (options.type) {\n\t\t\tcase 'documents': {\n\t\t\t\tconst scripts = model.script?.listScripts || {};\n\t\t\t\tconst script = scripts[name];\n\t\t\t\tif (typeof script !== 'function') { return; }\n\t\t\t\treturn script({\n\t\t\t\t\tmodel,\n\t\t\t\t\tget checkedDocuments() { return options.checkedDocuments; },\n\t\t\t\t\tget documents() { return options.documents; },\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'document':\n\t\t\tcase 'editDocument': {\n\t\t\t\tconst { store } = options;\n\t\t\t\tif (!store) { return; }\n\t\t\t\tconst scripts = model.script?.documentScripts || {};\n\t\t\t\tconst script = scripts[name];\n\t\t\t\tif (typeof script !== 'function') { return; }\n\t\t\t\treturn script({\n\t\t\t\t\tmodel,\n\t\t\t\t\tget document() { return options.document; },\n\t\t\t\t\tget store() { return store; },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n};\nconst commandStore = createComputed(() => {\n\t/** @type {Record<string, Partial<Command>>} */\n\tconst commands = {\n\t\tscript: scriptCommand,\n\t\t...allHooks.get('commands').named(),\n\t};\n\treturn commands;\n});\n\n/**\n * @template {keyof Command} K\n * @param {K} name \n * @param {Command.Options} options \n * @param {Menu} menu \n * @returns {ReturnType<Command[K]> | void}\n */\nfunction runCommand(name, options, menu) {\n\tconst command = menu.command;\n\tif (!command) { return; }\n\tconst index = command.indexOf(':');\n\tif (index < 0) { return; }\n\tconst type = command.slice(0, index);\n\tif (!type) { return; }\n\tconst commands = commandStore.get();\n\tconst cmd = Object.hasOwn(commands, type) && commands[type];\n\tif (!cmd) { return; }\n\tconst fn = Object.hasOwn(cmd, name) && cmd[name];\n\tif (typeof fn !== 'function') { return; }\n\tconst result = fn(options, menu, command);\n\t// @ts-ignore\n\treturn result;\n}\nexport const Command = {\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {boolean}\n\t */\n\tdisabled(options, menu) {\n\t\treturn runCommand('disabled', options, menu) || false;\n\t},\n\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {string}\n\t */\n\ttoHref(options, menu) {\n\t\treturn runCommand('toHref', options, menu) || '';\n\n\t},\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {void}\n\t */\n\texec(options, menu) {\n\t\treturn runCommand('exec', options, menu);\n\n\t}\n\n};\n","/** @import { IconDefine } from '../typesDefine.mjs' */\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed, watch } from '../signal.mjs';\nimport { neverAbortedSignal } from '../constants.mjs';\nconst logoPath = `\nM 0.29739625333333336 0.04334391666666666 M 0.06325983999999997 0.34186114333333334 H 0.08357982999999995 V 0.27435362333333335 L 0.1393469133333333 0.18517144333333335 H 0.1169949233333333 L 0.07500027666666663 0.25606563000000004 H 0.07364560999999996 L 0.03142518666666665 0.18517144333333332 H 0.007944309999999984 L 0.06325983999999997 0.2745794 Z M 0.29739625333333336 0.04334391666666666 M 0.21046684333333332 0.34411892 C 0.24659127 0.34411892 0.26668548233333333 0.32944337333333334 0.26668548233333333 0.28090117333333336 C 0.26668548233333333 0.2323589766666667 0.24659127 0.21768343000000004 0.21046684333333332 0.21768343000000004 C 0.17434241666666667 0.21768343000000004 0.15402242666666668 0.2323589766666667 0.15402242666666668 0.28090117333333336 C 0.15402242666666668 0.32944337333333334 0.17434241666666667 0.34411892 0.21046684333333332 0.34411892 Z M 0.21046684333333332 0.32763715000000004 C 0.18405085666666665 0.32763715000000004 0.17479397333333332 0.31657404666666666 0.17479397333333332 0.28090117333333336 C 0.17479397333333332 0.24545408000000002 0.18314774666666667 0.23393942 0.21046684333333332 0.23393942 C 0.23710860666666667 0.23393942 0.24613971333333332 0.24545408000000002 0.24613971333333332 0.28090117333333336 C 0.24613971333333332 0.3165740466666667 0.2382374966666667 0.32763715000000004 0.21046684333333332 0.32763715000000004 Z M 0.29739625333333336 0.04334391666666666 M 0.3592538966666667 0.21768342999999998 C 0.34435257 0.21768342999999998 0.3274192466666667 0.22152165 0.32019436133333334 0.23732608666666666 V 0.21994120666666667 H 0.30077748233333335 V 0.34186114333333334 H 0.3201943613333333 V 0.2594522966666667 C 0.32674191366666666 0.2380034166666667 0.3418690166666667 0.23506831000000003 0.35722189666666665 0.23506831000000003 C 0.37641300000000005 0.23506831000000003 0.3804769966666667 0.2459056366666667 0.3804769966666667 0.26464518333333337 V 0.34186114333333334 H 0.4001196533333333 V 0.2574202966666667 C 0.4001196533333333 0.2341651966666667 0.39108854666666665 0.21768343000000004 0.3592538966666667 0.21768343000000004 Z M 0.5233938433333333 0.21994120666666667 V 0.24274475 C 0.5186525133333334 0.22829498000000004 0.50849252 0.21768342999999998 0.48388275333333336 0.21768342999999998 C 0.4432427733333333 0.21768342999999998 0.43330855666666673 0.24613141333333333 0.43330855666666673 0.2797722866666667 C 0.43330855666666673 0.31679982333333334 0.4432427733333333 0.3418611433333334 0.48388275333333336 0.3418611433333334 C 0.5073636300000001 0.3418611433333334 0.5182009566666667 0.3335073700000001 0.5233938433333333 0.31905760000000005 V 0.3312495933333333 C 0.5233938433333333 0.35924602333333333 0.5105245166666667 0.37030913 0.4834311966666667 0.37030913 C 0.47281964666666665 0.37030913 0.46288543 0.36940602 0.4536285466666667 0.3675997966666667 V 0.38408158333333337 C 0.4615307633333333 0.3856620166666667 0.47259386999999997 0.38701668333333333 0.48320541999999994 0.38701668333333333 C 0.5245227333333333 0.38701668333333333 0.5428107233333334 0.36692246333333334 0.5428107233333334 0.33328159333333335 V 0.21994120666666667 Z M 0.48659208666666665 0.32560515333333334 C 0.45769254333333337 0.32560515333333334 0.45408010000000004 0.3050593833333333 0.45408010000000004 0.2797722866666667 C 0.45408010000000004 0.25606563 0.45701521 0.23393942 0.48659208666666665 0.23393942 C 0.51616896 0.23393942 0.5240711766666667 0.2517758566666667 0.5240711766666667 0.2797722866666667 C 0.5240711766666667 0.3088976033333333 0.51616896 0.32560515333333334 0.48659208666666665 0.32560515333333334 Z M 0.29739625333333336 0.04334391666666666 M 0.5841279533333333 0.18517144333333332 V 0.34186114333333334 H 0.6292834866666667 C 0.6742132533333334 0.34186114333333334 0.7049190200000001 0.32402471 0.7049190200000001 0.2635162933333333 C 0.7049190200000001 0.19826654999999999 0.6742132533333334 0.1851714433333333 0.6292834866666667 0.1851714433333333 Z M 0.6044479433333334 0.32402471000000005 V 0.20278210333333335 H 0.6288319333333333 C 0.6604408199999999 0.20278210333333335 0.6839216866666666 0.21361943000000003 0.6839216866666666 0.2635162933333334 C 0.6839216866666666 0.31070382666666674 0.6615696866666667 0.32402471000000005 0.6288319333333333 0.32402471000000005 Z M 0.7900370533333333 0.21768342999999998 C 0.78123172 0.21768342999999998 0.7712974866666666 0.21836076000000001 0.7622663866666667 0.21948964999999998 V 0.23664875333333335 C 0.77107172 0.23484252999999997 0.7810059533333333 0.23393942 0.7891339533333334 0.23393942 C 0.8137436866666667 0.23393942 0.8191623533333334 0.24409941666666665 0.8191623533333334 0.25877496333333333 V 0.26893495666666667 H 0.7819090533333334 C 0.75300952 0.26893495666666667 0.7335926199999999 0.27886917666666666 0.7335926199999999 0.30776871666666666 C 0.7335926199999999 0.33102381666666664 0.7464619533333333 0.34411892 0.7755872866666667 0.34411892 C 0.7941010533333333 0.34411892 0.8119374866666667 0.33644248000000004 0.8191623533333333 0.3233473766666667 L 0.8220974866666666 0.34186114333333334 H 0.8385792533333333 V 0.2553883 C 0.8385792533333333 0.23348786666666665 0.8286450200000001 0.21768342999999998 0.7900370533333333 0.21768342999999998 Z M 0.7773934866666666 0.32786293000000005 C 0.7602343866666667 0.32786293000000005 0.7536868533333334 0.32108960000000003 0.7536868533333334 0.30754294000000004 C 0.7536868533333334 0.2885776166666667 0.76316952 0.2845136166666667 0.7832637200000001 0.2845136166666667 H 0.8191623533333334 V 0.30460783 C 0.8128405866666667 0.31905760000000005 0.7979392533333334 0.32786293000000005 0.7773934866666666 0.32786293000000005 Z M 0.9069897533333334 0.34321581 C 0.9124084200000001 0.34321581 0.9162466533333335 0.3427642533333333 0.9198590866666666 0.34186114333333334 V 0.32583092999999996 C 0.9164724200000001 0.32673404 0.9133115200000002 0.3269598166666667 0.9106021866666667 0.3269598166666667 C 0.9026999866666667 0.3269598166666667 0.8993133200000001 0.32470203999999997 0.8993133200000001 0.31228427 V 0.17027012 H 0.8798964533333333 V 0.31725137999999997 C 0.8798964533333333 0.33553936999999995 0.8889275533333334 0.34321580999999995 0.9069897533333334 0.34321580999999995 Z M 0.9715620200000001 0.34321581 C 0.9769806533333334 0.34321581 0.9808188866666668 0.3427642533333333 0.98443132 0.34186114333333334 V 0.32583092999999996 C 0.9810446533333335 0.32673404 0.9778837866666668 0.3269598166666667 0.9751744533333333 0.3269598166666667 C 0.9672722200000001 0.3269598166666667 0.9638855533333334 0.32470203999999997 0.9638855533333334 0.31228427 V 0.17027012 H 0.9444686866666666 V 0.31725137999999997 C 0.9444686866666666 0.33553936999999995 0.9534997866666667 0.34321580999999995 0.9715620200000001 0.34321580999999995 Z M 0.29739625333333336 0.04334391666666666 M 0.20087005 0.5902171833333334 L 0.1977091533333333 0.5730580500000001 C 0.18867801999999997 0.57802515 0.17513132 0.5838954166666667 0.1575206133333333 0.5911203166666668 V 0.5143556833333334 H 0.20087004999999997 V 0.4827467166666667 H 0.1575206133333333 V 0.4005634166666667 L 0.1263632033333333 0.39920871666666674 V 0.4827467166666667 H 0.07940130999999999 V 0.5143556833333334 H 0.12636320333333334 V 0.6037638833333334 C 0.10514004 0.6118919166666668 0.08572310333333333 0.6186652499999999 0.06811239666666666 0.62408395 L 0.07578885666666665 0.6574991500000001 C 0.09249645333333331 0.6516288833333335 0.10965560666666664 0.6453071166666667 0.1263632033333333 0.6385337500000001 V 0.7432948833333335 C 0.1263632033333333 0.7581962833333334 0.12004140999999997 0.7636149500000001 0.10152758666666664 0.7654211833333334 L 0.08211064999999997 0.7676789500000002 L 0.09294800999999996 0.8001910500000001 L 0.11010716333333329 0.7979332500000001 C 0.1466832533333333 0.7934176833333335 0.15752061333333328 0.7875474500000001 0.15752061333333328 0.7541322500000002 V 0.6258901833333335 L 0.20357938999999997 0.6060216833333334 Z M 0.21757764666666665 0.60105455 C 0.21667453333333334 0.7058156833333333 0.21125585333333333 0.7306513166666667 0.17603443333333332 0.7929661166666667 L 0.20538561666666666 0.8069643833333334 C 0.21848075999999997 0.7848381166666667 0.22796344999999998 0.7631633833333334 0.2347368 0.7423917833333333 C 0.24151014999999998 0.7216201833333333 0.24557416 0.6976876833333334 0.24783194333333333 0.6705942833333334 H 0.3173716663333333 V 0.7934176833333334 H 0.3485290766666667 V 0.6705942833333335 H 0.4185203566666667 V 0.7383277833333335 C 0.4185203566666667 0.7590993833333335 0.4149079033333333 0.7604540500000001 0.39323318333333335 0.7631633833333334 L 0.37336469 0.7649696166666667 L 0.3846536066666667 0.7974816833333335 L 0.4036189866666667 0.7952239166666668 C 0.43929196333333337 0.7907083500000002 0.45058088 0.7830318833333334 0.45058088 0.7482620166666668 V 0.42404435000000007 H 0.21757764666666665 Z M 0.24963817 0.53241795 V 0.4565564166666667 H 0.3173716663333333 V 0.5324179500000001 Z M 0.34852907666666666 0.4565564166666667 H 0.4185203566666667 V 0.53241795 H 0.3485290766666667 Z M 0.24918661333333333 0.63853375 C 0.24963817 0.6331150833333334 0.24963817 0.6249870500000001 0.24963817 0.61369815 V 0.5640269166666667 H 0.3173716663333333 V 0.63853375 Z M 0.4185203566666667 0.5640269166666667 V 0.63853375 H 0.3485290766666667 V 0.5640269166666667 Z M 0.6610059533333333 0.5107432166666667 V 0.7184592833333333 H 0.8745922533333332 V 0.5107432166666667 H 0.7720888866666666 C 0.7761528866666666 0.49900274999999994 0.7797653533333333 0.4868107166666666 0.7829262533333332 0.4737155833333333 H 0.9116198866666666 V 0.4448159499999999 H 0.8262756866666666 C 0.8384677199999999 0.4299145833333333 0.8493050533333332 0.41501321666666663 0.8587877533333332 0.40011184999999994 L 0.8294365866666666 0.38430734999999994 C 0.8253725533333333 0.39198381666666665 0.81859922 0.4019180833333333 0.8100196533333334 0.41365854999999996 C 0.8014400533333333 0.4253990166666666 0.7937635866666666 0.4357848166666666 0.78608712 0.4448159499999999 H 0.7305456533333333 L 0.74047992 0.43804261666666666 C 0.7373190199999999 0.43126924999999994 0.7319003533333334 0.4222381166666666 0.7251269866666666 0.4114007499999999 C 0.7183536533333332 0.40011184999999994 0.7129349533333332 0.3919838166666666 0.7084193866666666 0.38611358333333323 L 0.6826806533333333 0.4014665166666666 C 0.6899055533333333 0.41049764999999994 0.7011944866666665 0.42901148333333333 0.7088709533333333 0.4448159499999999 H 0.6307516533333333 V 0.4737155833333333 H 0.7481563866666666 C 0.7440923533333332 0.4886169499999999 0.7404799199999998 0.5012605499999999 0.7368674533333333 0.5107432166666667 Z M 0.6199142900000001 0.48861695 C 0.6140440533333333 0.47732801666666663 0.6045613633333333 0.46242665 0.59146622 0.44436438333333333 C 0.5788226333333334 0.42585058333333337 0.5679852733333334 0.4118523166666667 0.5594056966666667 0.40236961666666665 L 0.5318607433333333 0.42178655 C 0.5413434300000001 0.43262391666666666 0.5517292333333335 0.44707375 0.5639212633333334 0.46558755 C 0.5761132933333333 0.48410138333333336 0.5851444266666667 0.4994543166666666 0.5910146633333333 0.51254945 Z M 0.6939695866666667 0.53648195 H 0.84162862 V 0.5712518166666667 H 0.6939695866666667 Z M 0.8027947200000001 0.7586478166666666 C 0.77073422 0.7586478166666666 0.7418345866666667 0.7581962833333333 0.7169989533333333 0.7568415833333333 C 0.6573934866666666 0.75322915 0.63617032 0.74781045 0.6045613633333333 0.7008485833333333 V 0.5473193166666667 H 0.5205718266666667 V 0.58118605 H 0.5729523966666666 V 0.7017516833333334 L 0.5169593733333333 0.7609056166666668 L 0.5354731966666667 0.7911599166666667 C 0.5571479133333334 0.7708398500000001 0.57521018 0.7518744833333335 0.5896599933333334 0.7347153166666668 C 0.6262360833333334 0.7803225500000001 0.6483623533333335 0.7857412166666669 0.7120318533333334 0.7884505500000001 C 0.7368674533333334 0.78980525 0.7657670866666667 0.7902567833333334 0.7978276200000001 0.7902567833333334 C 0.8253725533333334 0.7902567833333334 0.8651095533333334 0.7893536833333334 0.9170385533333335 0.78754745 L 0.9224572533333333 0.7559384833333334 C 0.87052822 0.7577447166666667 0.8307912533333335 0.7586478166666667 0.8027947200000001 0.7586478166666667 Z M 0.84162862 0.6317604166666667 H 0.6939695866666667 V 0.59699055 H 0.84162862 Z M 0.84162862 0.6570475833333334 V 0.69272055 H 0.6939695866666667 V 0.6570475833333334 Z\n`;\nconst defaultIcons = {\n\tuser: `\nM 0.4 0.65\nA 0.3 0.3 0 1 1 0.6 0.65\nA 0.3 0.3 0 0 1 0.4 0.65\n\nM 0.1 0.8\nA 0.4 0.18 0 0 1 0.9 0.8\nA 0.4 0.10 0 0 1 0.1 0.8\n`,\n\n\tsingleUser: `\nM 0.05 0.25\nL 0.40 0.25\n\nL 0.5 0.35\n\nL 0.6 0.25\nL 0.95 0.25\n\nL 0.80 0.4\nL 0.55 0.4\n\nL 0.5 0.35\n\nL 0.45 0.4\nL0.20 0.4\n\n\nZ\n\nM 0.12530012009609615 0.36\nA 0.4 0.4 0 1 0 0.8746998799039039 0.36\nL 0.8588523373199624 0.375\nA 0.38 0.38 0 1 1 0.14114766268003764 0.375\nZ\n\n\nM 0.20487290873252584 0.23\nA 0.4 0.4 0 0 1 0.7951270912674742 0.23\nL 0.7673948391424188 0.23\nA 0.38 0.38 0 0 0 0.2326051608575812 0.23\nZ\n`\n};\nconst iconsState = createComputed(() => {\n\t/** @type {Record<string, IconDefine>} */\n\tconst icons = {\n\t\t...defaultIcons,\n\t\t...allHooks.get('icons').named(),\n\t\tlogo: logoPath,\n\t};\n\treturn icons;\n});\n/**\n * \n * @param {string | string[]} key \n * @param {AbortSignal | boolean} [signal] \n */\nexport function createIcon(key, signal) {\n\tconst root = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\troot.setAttribute('fill', `currentColor`);\n\troot.classList.add('icon');\n\tconst keys = [key].flat().filter(Boolean);\n\tconst iconState = createComputed(keys.length ? () => {\n\t\tconst icons = iconsState.get();\n\t\tfor (const key of keys) {\n\t\t\tconst icon = Object.hasOwn(icons, key) && icons[key];\n\t\t\tif (icon) { return icon; }\n\t\t}\n\t\treturn null;\n\t} : () => null);\n\tif (signal instanceof AbortSignal && signal.aborted) { return root; }\n\tconst abortSignal = signal instanceof AbortSignal ? signal : neverAbortedSignal;\n\t/**\n\t * \n\t * @param {IconDefine?} icon \n\t * @returns \n\t */\n\tfunction run(icon) {\n\t\tif (Array.isArray(icon) && icon.length <= 2) {\n\t\t\tconst [iconPath, viewBox] = icon;\n\t\t\troot.setAttribute('viewBox', viewBox || '0 0 1 1');\n\t\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\t\troot.appendChild(path);\n\t\t\tpath.setAttribute('d', iconPath);\n\t\t\treturn;\n\t\t}\n\t\troot.setAttribute('viewBox', '0 0 1 1');\n\t\tif (!icon) { return; }\n\t\tif (typeof icon === 'string') {\n\t\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\t\troot.appendChild(path);\n\t\t\tpath.setAttribute('d', icon);\n\t\t\treturn;\n\t\t}\n\t\tif (typeof icon !== 'function') { return; }\n\t\ticon({ root }, abortSignal);\n\t}\n\tif (!signal) {\n\t\trun(iconState.get());\n\t} else {\n\t\twatch(() => iconState.get(), run, {\n\t\t\tsignal: abortSignal,\n\t\t\timmediate: true,\n\t\t});\n\t}\n\n\treturn root;\n\n}\n","import { pathRoots } from './paths.mjs';\n\n/**\n * @param {object} [options]\n * @param {FileSystemHandleQueryOptions['types']} [options.types]\n * @param {boolean} [options.excludeAcceptAllOption]\n * @returns {Promise<File?>}\n */\nexport async function selectFile({ types, excludeAcceptAllOption } = {}) {\n\tif ('showOpenFilePicker' in window && typeof showOpenFilePicker === 'function') {\n\t\tconst [file] = await showOpenFilePicker({\n\t\t\ttypes,\n\t\t\texcludeAcceptAllOption: Boolean(excludeAcceptAllOption && Array.isArray(types) && types.length),\n\t\t});\n\t\tif (!file) { return null; }\n\t\treturn file.getFile();\n\t}\n\tconst input = document.createElement('input');\n\tinput.type = 'file';\n\tconst accepted = Array.isArray(types) && types.map(v => Object.entries(v.accept)).flat(3) || '';\n\tif (accepted) {\n\t\tinput.accept = accepted.join(',');\n\t}\n\n\t// 如果 excludeAcceptAllOption 为 true,且没有设置 accept,则禁用所有文件选项(通过 accept 强制限制)\n\t// 但实际上 input 无法完全移除 \"All Files\",只能尽量限制\n\tif (excludeAcceptAllOption && accepted) {\n\t\t// 没有指定类型时,可以设为 '*' 来允许所有?但逻辑上 exclude 应该表示只允许明确类型\n\t\t// 所以这里我们不做特殊处理,由调用者传入 types 控制\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tinput.addEventListener('change', () => { resolve(input.files?.[0] || null); });\n\t\tinput.addEventListener('error', (e) => { reject(e.error); });\n\t\tinput.click();\n\t});\n}\n\nconst filePrefix = `+file://`\n/**\n * \n * @param {object} file \n * @param {string} file.domain \n * @param {string} file.path\n * @param {string} [name]\n */\nexport function toFileURL(file, name) {\n\tlet path = file.path;\n\tif (path[0] === '/') { path = path.slice(1); }\n\tconst d = `${filePrefix}${file.domain}/${path}`;\n\treturn name ? `${d}#${name}` : d;\n}\n\n/**\n * \n * @param {string} [uri] \n * @returns \n */\nexport function toFileLink(uri) {\n\tif (!uri || typeof uri !== 'string') { return null; }\n\tconst index = uri.indexOf('#');\n\tconst name = decodeURIComponent(\n\t\t(index >= 0 ? uri.slice(index + 1) : '')\n\t\t|| uri.replace(/[#?].*/, '').split('/').filter(Boolean).pop()\n\t\t|| '',\n\t);\n\tif (uri.slice(0, filePrefix.length).toLowerCase() === filePrefix) {\n\t\tconst [hostname, ...pathname] = uri.slice(filePrefix.length).replace(/[?#].*$/, '').split('/');\n\t\tconst filePath = pathname.filter(Boolean).join('/');\n\t\tif (!filePath) { return null; }\n\t\treturn { name, href: `${pathRoots.file}/${hostname || '_'}/files/${filePath}` };\n\t}\n\treturn { name, href: uri };\n}\n","import { importStyle, importWidget } from './import.mjs';\nimport pathRoots from './paths.mjs';\nimport request from './request.mjs';\nimport { User } from './user.mjs';\nimport isPluginId from './utils/isPluginId.mjs';\n\n\n/**\n * \n * @param {string} pluginId \n */\nexport default function buildPlugin(pluginId) {\n\tif (!isPluginId(pluginId)) {\n\t\tthrow new Error(`无效的 plugin: ${pluginId}`);\n\t}\n\treturn {\n\t\t/**\n\t\t * \n\t\t * @param {string} url \n\t\t * @returns \n\t\t */\n\t\timportStyle(url) { return importStyle(url, pluginId, true); },\n\t\t/**\n\t\t * \n\t\t * @param {string} url \n\t\t * @returns \n\t\t */\n\t\timport(url) { return importWidget(url, pluginId); },\n\t\trequest: request.clone().prefix(`${pathRoots.api}/plugins/${pluginId}`),\n\t\tuser: User.plugin(pluginId),\n\t};\n}\n","/** @import { MaybePromise } from '@yongdall/types' */\n/** @import { Authenticator, Theme } from './typesDefine.mjs' */\n/** @import { PageIdent } from './route/route.mjs' */\nimport { addManager, initRouter, stopRouter, switchCreatePage, switchRenderError, switchHome, setRouter, listenPath, currentPage } from './route/index.mjs';\nimport { importStyle, importWidget } from './import.mjs';\nimport { root } from './dom/index.mjs';\nimport setComponents from './components.mjs';\nimport { application, plugins } from './configuration.mjs';\nimport { allHooks, updateHooks } from './allHooks.mjs';\nimport { User } from './user.mjs';\nimport { watch } from './signal.mjs';\nimport { updatePrintStyle } from './print.mjs';\nimport { setErrorAlerter } from './request.mjs';\n\n/**\n * @template T\n * @param {() => MaybePromise<T>} fn \n * @returns {() => Promise<T>}\n */\nfunction onceFn(fn) {\n\t/** @type {Promise<T>} */\n\tlet result;\n\treturn () => result ||= Promise.resolve().then(() => fn());\n\n}\nasync function initHooks() {\n\t/** @type {[string, any][]} */\n\tconst promises = Object.entries(plugins).map(([plugin, { hooks: hookPath }]) => {\n\t\tif (typeof hookPath !== 'string') { return ['', '']; }\n\t\tif (!hookPath) {\n\t\t\treturn [plugin, importWidget(`${plugin}`)];\n\t\t}\n\t\tif ('/#?'.includes(hookPath[0])) {\n\t\t\treturn [plugin, importWidget(`${plugin}${hookPath}`)];\n\t\t}\n\t\treturn [plugin, importWidget(`${plugin}/${hookPath}`)];\n\t});\n\tconst stylesPromises =\n\t\tObject.entries(plugins).flatMap(([plugin, { styles }]) => [styles].flat().map(path => {\n\t\t\tif (!path || typeof path !== 'string') { return; }\n\t\t\treturn importStyle(path, plugin, true);\n\t\t}));\n\tconst loaded = await Promise.all(\n\t\tpromises.filter(([plugin]) => plugin).map(v => Promise.all(v)),\n\t).then(l => l.filter(([, hook]) => hook && typeof hook === 'object'));\n\tawait Promise.all(stylesPromises);\n\tupdateHooks(Object.fromEntries(loaded));\n}\n/** @typedef {[file: string, plugin: string]} uiStyle */\n/**\n * \n * @param {uiStyle[]} [uiStyles] \n */\nasync function addStyles(uiStyles) {\n\tconst promises = [];\n\tfor (const [file, plugin] of uiStyles || []) {\n\t\tpromises.push(importStyle(file, plugin, true));\n\t}\n\tfor (const [plugin, style] of allHooks.get('styles')) {\n\t\tif (typeof style === 'string') {\n\t\t\tpromises.push(importStyle(style, plugin, true));\n\t\t}\n\t}\n\tawait Promise.all(promises);\n}\n\n/** @type {() => MaybePromise<Partial<Omit<Authenticator, \"styleFiles\"> & Record<\"styleFiles\", uiStyle[]>>>} */\nlet loadAuthenticator = () => ({});\n/** @type {() => MaybePromise<Partial<Omit<Theme, \"styleFiles\"> & Record<\"styleFiles\", uiStyle[]>>>} */\nlet loadTheme = () => ({});\n\nlet clearPage = () => { };\nlet isWorkbench = false;\nasync function toWorkbench() {\n\tif (isWorkbench) { return; }\n\tisWorkbench = true;\n\tclearPage();\n\tlet stopped = false;\n\tclearPage = () => { stopped = true; isWorkbench = false; };\n\tconst { classNames, elements, rootClassName, setup, pageManager, updatePath, title, icon } = await loadTheme();\n\tif (stopped) { return; }\n\t/** @type {(() => void)[]} */\n\tconst destroyList = [];\n\tfor (const cn of [classNames, allHooks.get('className').values()].flat()) {\n\t\tif (cn && typeof cn === 'string') {\n\t\t\tdocument.body.classList.add(cn);\n\t\t}\n\t}\n\tif (rootClassName && typeof rootClassName === 'string') {\n\t\troot.classList.add(rootClassName);\n\t}\n\tfor (const el of [elements, allHooks.get('elements').values()].flat()) {\n\t\tif (el instanceof Element) {\n\t\t\tdocument.body.appendChild(el);\n\t\t}\n\t}\n\tif (typeof pageManager === 'function') {\n\t\tdestroyList.push(addManager(pageManager));\n\t}\n\tif (typeof updatePath === 'function') {\n\t\tdestroyList.push(listenPath(updatePath));\n\t}\n\tfor (const pageManager of allHooks.get('pageManager').values()) {\n\t\tif (!pageManager) { continue; }\n\t\tdestroyList.push(addManager(pageManager));\n\t}\n\n\tinitRouter();\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\n\twatch(() => title?.(currentPage) || currentPage.title || application.title || '拥道YongDall', title => {\n\t\tdocument.title = title;\n\t}, { signal, immediate: true });\n\twatch(() => currentPage.print, print => { updatePrintStyle(print); }, { signal, immediate: true });\n\n\tclearPage = () => {\n\t\tclearPage = () => { };\n\t\tac.abort();\n\t\tisWorkbench = false;\n\t\tstopRouter();\n\t\tfor (const destroy of destroyList) { destroy(); }\n\t\tfor (const el of [elements, allHooks.get('elements').values()].flat()) {\n\t\t\tif (el instanceof Element) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t}\n\t\tif (rootClassName && typeof rootClassName === 'string') {\n\t\t\troot.classList.remove(rootClassName);\n\t\t}\n\t\tfor (const cn of [classNames, allHooks.get('className').values()].flat()) {\n\t\t\tif (cn && typeof cn === 'string') {\n\t\t\t\tdocument.body.classList.remove(cn);\n\t\t\t}\n\t\t}\n\t};\n\tsetup?.(signal);\n}\nasync function toLogin() {\n\tclearPage();\n\tlet stopped = false;\n\tclearPage = () => { stopped = true; };\n\tconst authenticator = await loadAuthenticator();\n\tif (stopped) { return; }\n\tconst { classNames, elements, rootClassName } = authenticator;\n\n\tfor (const cn of [classNames].flat()) {\n\t\tif (cn && typeof cn === 'string') {\n\t\t\tdocument.body.classList.add(cn);\n\t\t}\n\t}\n\tif (rootClassName && typeof rootClassName === 'string') {\n\t\troot.classList.add(rootClassName);\n\t}\n\tfor (const el of [elements].flat()) {\n\t\tif (el instanceof Element) {\n\t\t\tdocument.body.appendChild(el);\n\t\t}\n\t}\n\tconst ac = new AbortController();\n\tclearPage = () => {\n\t\tclearPage = () => { };\n\t\tac.abort();\n\t\tfor (const el of [elements].flat()) {\n\t\t\tif (el instanceof Element) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t}\n\t\tif (rootClassName && typeof rootClassName === 'string') {\n\t\t\troot.classList.remove(rootClassName);\n\t\t}\n\t\tfor (const cn of [classNames].flat()) {\n\t\t\tif (cn && typeof cn === 'string') {\n\t\t\t\tdocument.body.classList.remove(cn);\n\t\t\t}\n\t\t}\n\t};\n\tawait authenticator.login?.(ac.signal);\n\tif (ac.signal.aborted) { return; }\n\tawait User.load();\n}\nlet started = false;\n/**\n * \n * @param {typeof loadAuthenticator} _loadAuthenticator \n * @param {typeof loadTheme} _loadTheme \n * @param {() => MaybePromise<PageIdent.Router?>} _loadRoute \n * @returns \n */\nexport default async function start(_loadAuthenticator, _loadTheme, _loadRoute) {\n\tif (started) { return; }\n\tstarted = true;\n\tloadAuthenticator = onceFn(async () => {\n\t\tconst authenticator = await _loadAuthenticator();\n\t\tconst { styleFiles } = authenticator;\n\t\tawait addStyles(styleFiles);\n\t\treturn authenticator;\n\t});\n\tloadTheme = onceFn(async () => {\n\t\tconst [theme, router] = await Promise.all([\n\t\t\t_loadTheme(),\n\t\t\t_loadRoute(),\n\t\t]);\n\t\tif (router) { setRouter(router); }\n\n\t\tconst {\n\t\t\thome, components, styleFiles,\n\t\t\tcreatePage, createFrame, renderError,\n\t\t\talertError,\n\t\t} = theme;\n\t\tawait addStyles(styleFiles);\n\t\tswitchHome(home);\n\t\tsetComponents(components);\n\t\tsetErrorAlerter(alertError);\n\t\tswitchCreatePage(createPage, createFrame);\n\t\tswitchRenderError(renderError);\n\t\treturn theme;\n\t});\n\tawait initHooks();\n\tawait User.load();\n\twatch(() => User.waitLogin, waitLogin => {\n\t\tif (waitLogin) {\n\t\t\ttoLogin();\n\t\t} else {\n\t\t\ttoWorkbench();\n\t\t}\n\t}, {\n\t\timmediate: true\n\t});\n}\n"],"mappings":"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AAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,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"}
1
+ {"version":3,"file":"index.mjs","names":["Signal","parse","stringify","parse","toTime","toDate","parse","parse","parseDate","list","defaultGenerators","#config","#hooks","#stringTag","#keys","#handlers","#do","Pattern.generate","DotRequest","pathRoots","pages","root","enumerations","load","request","exec","Search.exec","ArrayStore","Search.parse","Search.fill","createState","Search.exec","modelService","ArrayStore","ObjectStore","renderStore","renderStoreForm","Store","#waitDestroy","#signal","#destroyed","#container","#root","List","#table","#thead","#createUrl","#renderList","#labelPattern","#fieldsShow","#idFields","#tr","#tbody","#documents","FormList","#pagination","#container","#buttons","#destroyMenu","#menu","#root","#dialog","#ac","#main","#headerAbortController","#header","#footAbortController","#footer","encode","pages","Search.parse","pages","pages","pages","currentPage","rootContainer","loadingContainer","triggerLoading","stringify","parse","parse","Ident.decode","Ident.parse","Ident.stringify","Ident.encode","Code128.encode","#print","#root","#path","#search","#hash","#pageId","#abortController","#define","#ident","#pageHandler","#open","#setRootPath","#onToggle","#onHide","#bootLoading","#href","#title","#icon","#printDeeply","#unsaved","#loading","routerParser.stringify","#rootPath","#destroyDelayed","#root","#container","#root","#container","#destroyMenu","#menu","#root","#container","#inserted","#placeholder","#parent","#root","#header","#body","#container","#inserted","#updateParentUnprintable","#parent","#title","#menuAbortController","#placeholder","#buttons","#signal","#root","#main","#body","#destroyed","#container","#mode","#abortController","#headerAbortController","#header","#headerRoot","#footAbortController","#footer","#footerRoot","#sides","root","#state","#abortController","#pageUI","#container","#destroyDelayed","routerParser.stringify","request","pathRoots","currentPage"],"sources":["../../packages/web/signal.mjs","../../packages/common/Search/util.mjs","../../packages/common/Search/exec.mjs","../../packages/common/Search/fill.mjs","../../packages/common/Search/parse.mjs","../../packages/common/Search/merge.mjs","../../packages/common/Search/stringify.mjs","../../packages/common/Search/toWhere.mjs","../../packages/common/Search/index.mjs","../../packages/common/Datetime.mjs","../../packages/common/Pattern/parse.mjs","../../packages/common/Pattern/toGenerate.mjs","../../packages/common/Pattern/generators.mjs","../../packages/common/Pattern/generate.mjs","../../packages/common/Pattern/index.mjs","../../packages/common/transformError.mjs","../../packages/common/Hook.mjs","../../packages/common/ErrorHandler.mjs","../../packages/common/LazyPromise.mjs","../../packages/common/model.mjs","../../packages/common/yieldPermissionConstraintFields.mjs","../../packages/common/index.mjs","../../packages/web/allHooks.mjs","../../packages/web/form/field.mjs","../../packages/web/paths.mjs","../../packages/web/utils/date.mjs","../../packages/web/request.mjs","../../packages/web/configuration.mjs","../../packages/web/utils/state.mjs","../../packages/web/user.mjs","../../packages/web/permission.mjs","../../packages/web/form/toSchema.mjs","../../packages/web/importmap.mjs","../../packages/web/import.mjs","../../packages/web/ResponseError.mjs","../../packages/web/services/createPromisesAndStates.mjs","../../packages/web/services/toPromiseInterface.mjs","../../packages/web/services/model.mjs","../../packages/web/services/enumeration.mjs","../../packages/web/services/formLayout.mjs","../../packages/web/services/permissions.mjs","../../packages/web/services/menu.mjs","../../packages/web/DataSource/modelFilter.mjs","../../packages/web/DataSource/createExec.mjs","../../packages/web/DataSource/filterList.mjs","../../packages/web/DataSource/build.mjs","../../packages/web/enumerations.mjs","../../packages/web/DataSource/loadValues.mjs","../../packages/web/DataSource/loadArray.mjs","../../packages/web/DataSource/flat.mjs","../../packages/web/DataSource/index.mjs","../../packages/web/form/createStoreField.mjs","../../packages/web/form/renderStoreForm.mjs","../../packages/web/constants.mjs","../../packages/web/form/renderForm.mjs","../../packages/web/form/createStore.mjs","../../packages/web/form/createShowField.mjs","../../packages/web/form/createQuickFilters.mjs","../../packages/web/form/createFilter.mjs","../../packages/web/form/createFieldFilter.mjs","../../packages/web/form/createFilters.mjs","../../packages/web/dom/root.mjs","../../packages/web/dom/setIcon.mjs","../../packages/web/dom/createDialog.mjs","../../packages/web/GeneralContext.mjs","../../packages/web/dom/ModalFooter.mjs","../../packages/web/form/List.mjs","../../packages/web/components.mjs","../../packages/web/Menu.mjs","../../packages/web/dom/ModalHeader.mjs","../../packages/web/dom/Modal.mjs","../../packages/web/dom/createModal.mjs","../../packages/web/dom/index.mjs","../../packages/web/form/showFilterDialog.mjs","../../packages/web/utils/toUrl.mjs","../../packages/web/utils/isPluginId.mjs","../../packages/web/utils/waitAbortSignal.mjs","../../packages/web/utils/code128.mjs","../../packages/web/script/index.mjs","../../packages/web/services/page.mjs","../../packages/web/route/pages.mjs","../../packages/web/route/load.mjs","../../packages/web/route/pageManager.mjs","../../packages/web/route/renderHome.mjs","../../packages/web/route/loadingContainer.mjs","../../packages/web/route/home.mjs","../../packages/web/Ident.mjs","../../packages/web/route/route.mjs","../../packages/web/print.mjs","../../packages/web/route/PageHandle.mjs","../../packages/web/route/renderError.mjs","../../packages/web/route/PageFooter.mjs","../../packages/web/route/PageHeader.mjs","../../packages/web/route/PageSection.mjs","../../packages/web/route/PageSider.mjs","../../packages/web/route/Page.mjs","../../packages/web/route/createPage.mjs","../../packages/web/route/PageContext.mjs","../../packages/web/route/createPageFrame.mjs","../../packages/web/route/showPage.mjs","../../packages/web/route/setHistoryUrl.mjs","../../packages/web/route/parse.mjs","../../packages/web/route/setUrl.mjs","../../packages/web/route/index.mjs","../../packages/web/model/createModelDefault.mjs","../../packages/web/model/createDocumentInModal.mjs","../../packages/web/model/showDocumentInModal.mjs","../../packages/web/model/index.mjs","../../packages/web/Command.mjs","../../packages/web/icons/index.mjs","../../packages/web/file.mjs","../../packages/web/buildPlugin.mjs","../../packages/web/start.mjs"],"sourcesContent":["import { Signal } from 'signal-polyfill';\n\n/**\n * @template T\n * @typedef {object} State\n * @property {() => T} get\n * @property {(newValue: T) => void} set\n */\n\n/**\n * 相应式执行\n * @param {() => void} fn 执行函数\n * @param {AbortSignal} [signal]\n * @returns {void}\n */\nexport function effect(fn, signal) {\n\tlet needsEnqueue = true;\n\tif (signal?.aborted) { return; }\n\tconst w = new Signal.subtle.Watcher(() => {\n\t\tif (!needsEnqueue) { return; }\n\t\tneedsEnqueue = false;\n\t\tqueueMicrotask(() => {\n\t\t\tneedsEnqueue = true;\n\t\t\tfor (const s of w.getPending()) {\n\t\t\t\ts.get();\n\t\t\t}\n\t\t\tw.watch();\n\t\t});\n\t});\n\tconst computed = new Signal.Computed(fn);\n\n\tw.watch(computed);\n\tcomputed.get();\n\tsignal?.addEventListener('abort', () => {\n\t\tw.unwatch(computed);\n\t}, { once: true });\n\n}\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {(() => T)[]} getter 取值方法\n * @param {(value: T[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {(() => any)[]} getter 取值方法\n * @param {(value: any[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n\n/**\n * 创建可赋值计算值\n * @template T\n * @overload\n * @param {() => T} getter 取值方法\n * @param {(value: T) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\n/**\n * 创建可赋值计算值\n * @template T\n * @param {(() => T) | (() => T)[]} getter 取值方法\n * @param {(value: T | T[], oldValue?: T | T[]) => void} callback 取值方法\n * @param {object} [options]\n * @param {boolean} [options.immediate] 是否立即执行一次\n * @param {AbortSignal} [options.signal]\n * @returns {void}\n */\nexport function watch(getter, callback, { immediate, signal } = {}) {\n\tconst isArray = Array.isArray(getter);\n\tconst getters = isArray ? getter : [getter];\n\t/** @type {T[]?} */\n\tlet value = null;\n\teffect(() => {\n\t\tconst val = getters.map(v => v());\n\t\tconst oldValue = value;\n\t\tvalue = val;\n\t\tif (oldValue) {\n\t\t\tif (oldValue.findIndex((v, i) => !Object.is(v, val[i])) < 0) { return; }\n\t\t\tcallback(isArray ? [...val] : val[0], isArray ? [...oldValue] : oldValue[0]);\n\t\t} else {\n\t\t\tif (!immediate) { return; }\n\t\t\tcallback(isArray ? [...val] : val[0]);\n\t\t}\n\t}, signal);\n}\n\n/**\n * @template T\n * @overload\n * @param {T} initValue\n * @returns {State<T>}\n */\n/**\n * @template T\n * @overload\n * @param {T} [initValue]\n * @returns {State<T | undefined>}\n */\n/**\n * @template T\n * @param {T} [initValue]\n * @returns {State<T | undefined>}\n */\nexport function createState(initValue) {\n\treturn new Signal.State(initValue);\n}\n\n/**\n * \n * @template T\n * @param {() => T} get\n * @param {(newValue: T) => void} [set]\n * @returns {State<T>}\n */\nexport function createComputed(get, set) {\n\tconst s = new Signal.Computed(get);\n\tif (typeof set === 'function') {\n\t\treturn { get() { return s.get(); }, set };\n\t}\n\treturn { get() { return s.get(); }, set: () => { } };\n\n}\n/**\n * @template {Record<string, any>} T\n * @param {State<T>} state\n * @param {Record<string, any>} struct\n * @returns {T}\n */\nexport function createDeeply(state, struct) {\n\t/** @type {[string, PropertyDescriptor][]} */\n\tconst descriptorMap = Object.entries(struct).map(([k, v]) => {\n\t\tconst computed = createComputed(\n\t\t\t() => state.get()?.[k],\n\t\t\t(v) => state.set({ ...state.get(), [k]: v })\n\t\t);\n\t\tlet get = () => computed.get();\n\t\t/** @param {any} v */\n\t\tlet set = v => computed.set(v);\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tlet children = null;\n\t\t\tget = () => children ||= createDeeply(computed, v);\n\t\t\tset = v => computed.set(structuredClone(v));\n\t\t}\n\t\treturn [k, {\n\t\t\tget, set, enumerable: true,\n\t\t\tconfigurable: true,\n\t\t}];\n\t});\n\t// @ts-ignore\n\treturn Object.defineProperties({}, Object.fromEntries(descriptorMap));\n}\n\n/** @type {Map<number, {tick: State<number>, count: number; stop(): void}>} */\nconst ticks = new Map();\n/**\n * \n * @param {number} interval \n * @param {AbortSignal} [signal] \n */\nexport function createTick(interval, signal) {\n\tif (signal?.aborted) { return createComputed(() => 0); }\n\tlet item = ticks.get(interval);\n\tif (!item) {\n\t\tconst tick = createState(0);\n\t\tconst start = performance.now();\n\t\tlet timerId = setTimeout(function step() {\n\t\t\tconst allTimes = performance.now() - start;\n\t\t\tconst n = Math.floor(allTimes / interval);\n\t\t\ttick.set(n);\n\t\t\tconst delay = (n + 1) * interval - allTimes;\n\t\t\ttimerId = setTimeout(step, Math.max(0, delay));\n\t\t}, interval);\n\t\titem = {\n\t\t\ttick: createComputed(() => tick.get()), count: 0, stop() {\n\t\t\t\tclearTimeout(timerId);\n\t\t\t\tif (ticks.get(interval) !== item) { return; }\n\t\t\t\tticks.delete(interval);\n\t\t\t}\n\t\t};\n\t\tticks.set(interval, item);\n\t}\n\titem.count++;\n\tsignal?.addEventListener('abort', () => {\n\t\titem.count--;\n\t\tif (item.count) { return; }\n\t\titem.stop();\n\t}, { once: true });\n\treturn item.tick;\n}\n","\n/**\n * @template T\n * @template TReturn\n * @template TNext\n * @param {Generator<T, TReturn, TNext>} generator \n * @param {(value: T) => TNext} run \n * @param {TNext} def \n */\nexport function runGenerator(generator, run, def) {\n\t/** @type {TNext} */\n\tlet value = def;\n\tfor (; ;) {\n\t\tconst result = generator.next(value);\n\t\tif (result.done) {\n\t\t\treturn result.value;\n\t\t}\n\t\tvalue = run(result.value);\n\t}\n}\n/**\n * @template T\n * @template TReturn\n * @template TNext\n * @param {Generator<T, TReturn, TNext>} generator \n * @param {(value: T) => PromiseLike<TNext> | TNext} run \n * @param {TNext} def \n */\nexport async function asyncRunGenerator(generator, run, def) {\n\t/** @type {TNext} */\n\tlet value = def;\n\tfor (; ;) {\n\t\tconst result = generator.next(value);\n\t\tif (result.done) {\n\t\t\treturn result.value;\n\t\t}\n\t\tvalue = await run(result.value);\n\t}\n}\n","/** @import { Children, Field, Match, Or } from './types.mjs' */\nimport { asyncRunGenerator, runGenerator } from './util.mjs';\n\n\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} fields \n * @returns {any[]}\n */\nfunction select(data, fields) {\n\tlet list = data;\n\tfor (let item of fields) {\n\t\tconst [field, ...sub] = typeof item === 'string' ? [item] : item;\n\n\t\tif (!list.length) { continue; }\n\t\t/** @type {any[]} */\n\t\tconst subList = [];\n\t\tit: for (const item of list) {\n\t\t\tif (!item || typeof item !== 'object') { continue; }\n\t\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\t\tlet value = item[field];\n\t\t\tfor (const index of sub) {\n\t\t\t\tif (!Array.isArray(value)) { continue it; }\n\t\t\t\tvalue = value[index];\n\t\t\t}\n\t\t\tsubList.push(value);\n\t\t}\n\t\tlist = subList.flat(Infinity).filter(v => v && typeof v === 'object');\n\t}\n\treturn list;\n\n}\n\n/**\n * \n * @param {Record<string, any>[]} list \n * @param {string} field \n * @returns {any[]}\n */\nfunction selectValue(list, field) {\n\t/** @type {any[]} */\n\tconst subList = [];\n\tfor (const item of list) {\n\t\tif (!item || typeof item !== 'object') { continue; }\n\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\tsubList.push(item[field]);\n\t}\n\treturn subList;\n\n}\n/**\n * @typedef {object} ExecParam\n * @property {Field[]} fields\n * @property {string} operator\n * @property {string?} [sign]\n * @property {any} value\n * @property {any[]} values\n * @property {string} [field]\n */\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} parentFields \n * @param {Match} match \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execMatch(data, parentFields, match) {\n\tconst fields = [...match[0]];\n\tconst currentFields = [...parentFields, ...fields];\n\tconst last = fields.pop();\n\tif (!last) { return null; }\n\tconst lastField = typeof last === 'string' ? last : last[0];\n\tconst records = select(data, fields);\n\tif (!records.length) { return false; }\n\tconst [, value, operator, sign] = match;\n\tif (operator === null) {\n\t\tconst values = selectValue(records, lastField);\n\t\treturn sign ? values.find(v => v === null) : values.find(v => v !== null);\n\t}\n\tif (typeof value !== 'object' || !value || Array.isArray(value)) {\n\n\t\tconst values = selectValue(records, lastField);\n\t\tif (!values.length) { return false; }\n\n\t\treturn yield ({ fields: currentFields, operator, sign, value, values });\n\t}\n\n\tif (value.filter || value.table || value.placeholder) { return null; }\n\tconst field = value.field;\n\tif (!field) { return null; }\n\n\t/** @type {boolean?} */\n\tlet defResult = false;\n\tfor (const item of records) {\n\t\tif (!item || typeof item !== 'object') { continue; }\n\t\tif (!Object.hasOwn(item, field)) { continue; }\n\t\tif (!Object.hasOwn(item, lastField)) { continue; }\n\t\tdefResult = null;\n\t\tconst result = yield ({ fields: currentFields, operator, sign, value: item[field], field, values: [item[lastField]] });\n\t\tif (result === null) { continue; }\n\t\treturn result;\n\t}\n\treturn defResult;\n\n}\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {Field[]} parentFields \n * @param {Match | Children | Or} match \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execItem(data, parentFields, match) {\n\tif (!Array.isArray(match)) {\n\t\tconst { and, or } = match;\n\t\treturn yield* execOr(data, parentFields, and, or);\n\t}\n\tif (match.length !== 2) {\n\t\treturn yield* execMatch(data, parentFields, match);\n\n\t}\n\t/** @type {boolean?} */\n\tlet defResult = null;\n\tconst values = select(data, match[0]);\n\tif (!values.length) { return false; }\n\tconst fields = [...parentFields, ...match[0]];\n\tfor (const item of match[1]) {\n\t\tconst result = yield* execItem(values, fields, item);\n\t\tif (result === null) { continue; }\n\t\tif (!result) { return false; }\n\t\tdefResult = true;\n\t}\n\treturn defResult;\n}\n/**\n * \n * @param {Record<string, any>[]} list \n * @param {Field[]} parentFields \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n * @returns {Generator<ExecParam, boolean?, boolean?>}\n */\nfunction* execOr(list, parentFields, and, or) {\n\t/** @type {boolean?} */\n\tlet defResult = null;\n\tif (Array.isArray(and)) {\n\t\tfor (const item of and) {\n\t\t\tconst result = yield* execItem(list, parentFields, item);\n\t\t\tif (result === null) { continue; }\n\t\t\tif (!result) { return false; }\n\t\t\tdefResult = true;\n\t\t}\n\t}\n\tif (Array.isArray(or)) {\n\t\tfor (const item of or) {\n\t\t\tconst result = yield* execItem(list, parentFields, item);\n\t\t\tif (result === null) { continue; }\n\t\t\tif (result) { return true; }\n\t\t\tdefResult = true;\n\t\t}\n\t}\n\treturn defResult;\n\n}\n\n/**\n * \n * @param {Record<string, any>} data \n * @param {(value: ExecParam) => boolean?} exec \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n */\nexport function exec(data, exec, and, or) {\n\treturn runGenerator(execOr([data].flat(), [], and, or), exec, null);\n}\n\n/**\n * \n * @param {Record<string, any>} data \n * @param {(value: ExecParam) => PromiseLike<boolean?> | boolean?} exec \n * @param {(Match | Children)[]} [and] \n * @param {(Match | Children | Or)[]} [or] \n */\nexport async function asyncExec(data, exec, and, or) {\n\treturn asyncRunGenerator(execOr([data].flat(), [], and, or), exec, null);\n}\n","/** @import { Value } from './types.mjs' */\n/** @import { Children, Field, FieldValue, Match, Or } from './types.mjs' */\n\nimport { runGenerator } from './util.mjs';\n\n\n\n\n\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[]} match \n * @returns {Generator<Value, T[]?, Value | null>}\n */\nfunction* fillList(match) {\n\t/** @type {T[]} */\n\tlet list = [];\n\tlet has = false;\n\tfor (const child of match) {\n\t\tconst val = yield* fillMatch(child);\n\t\tlist.push(val || child);\n\t\tif (val) { has = true; }\n\t}\n\treturn has ? list : null;\n\n}\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T} match \n * @returns {Generator<Value, T?, Value | null>}\n */\nfunction* fillMatch(match) {\n\tif (!Array.isArray(match)) {\n\t\tconst and = match.and && (yield* fillMatches(match.and));\n\t\tconst or = match.or && (yield* fillMatches(match.or));\n\t\tif (!and && !or) { return null; }\n\t\t/** @type {Or} */\n\t\tconst item = { and: and || match.and, or: or || match.or };\n\t\treturn /** @type {T} */(item);\n\t}\n\tif (match.length === 2) {\n\t\tlet children = yield* fillMatches(match[1]);\n\t\tif (!children) { return null; }\n\t\t/** @type {Children} */\n\t\tconst item = [match[0], match[1]];\n\t\treturn /** @type {T} */(item);\n\t}\n\tconst value = yield match[1];\n\tif (value === null) { return null; }\n\t/** @type {Match} */\n\tconst item = [match[0], value, match[2], match[3]];\n\treturn /** @type {T} */(item);\n\n}\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[]} match \n * @returns {Generator<Value, T[]?, Value | null>}\n */\nexport function* fillMatches(match) {\n\t/** @type {T[]} */\n\tconst list = [];\n\tlet has = false;\n\tfor (const child of match) {\n\t\tconst val = yield* fillMatch(child);\n\t\tlist.push(val || child);\n\t\tif (val) { has = true; }\n\t}\n\treturn has ? list : null;\n\n}\n\n/**\n * \n * @template {Match | Children | Or} T \n * @param {T[] | null | undefined} match \n * @param {(placeholder: string) => Value | null} getPlaceholder \n * @returns {T[]}\n */\nexport function fill(match, getPlaceholder) {\n\tif (!match) { return []; }\n\t/**\n\t * \n\t * @template {Value} T \n\t * @param {T} match \n\t * @returns {Value | null}\n\t */\n\tfunction fillValue(match) {\n\t\tif (!match || typeof match !== 'object') { return null; }\n\t\tif (Array.isArray(match)) { return null; }\n\t\tconst placeholder = match.placeholder;\n\t\tif (!placeholder || typeof placeholder !== 'string') { return null; }\n\t\treturn getPlaceholder(placeholder);\n\t}\n\treturn runGenerator(fillList(match), fillValue, null) || match;\n}\n","/** @import { RecursiveArray } from '../types/types.mjs' */\n/** @import { Children, Field, Match, Or, Param, Value } from './types.mjs' */\n\n\n\n/**\n * @typedef {object} Parse.Field\n * @property {string} field\n * @property {string?} [group]\n * @property {number[]} sub\n */\n/**\n * @typedef {object} Parse.Match\n * @property {null} [children]\n * @property {Parse.Field[]} fields\n * @property {string?} operator\n * @property {string} [sign]\n * @property {Value} value\n */\n\n\n/**\n * @typedef {object} Parse.Children\n * @property {Parse.Field[]} fields\n * @property {(Parse.Match | Parse.Children)[]} children\n */\n\n/**\n * \n * @param {Parse.Field[]} fields \n * @returns {Field[]}\n */\nfunction compressFields(fields) {\n\treturn fields.map(\n\t\t({ field, sub }) => sub.length ? [field, ...sub] : field\n\t);\n}\n\n/**\n * \n * @param {Parse.Match | Parse.Children} v \n * @returns {Match | Children}\n */\nfunction compressAndItem(v) {\n\tif (v.children) {\n\treturn [compressFields(v.fields), v.children.map(compressAndItem)];\n\n\t}\n\tconst { fields, operator, value, sign } = v;\n\treturn [compressFields(fields), value, operator, sign];\n}\n\nconst fieldParserRegex = /^([-_\\d\\p{L}]+)((?:\\[-?\\d+\\])*)$/u;\n/**\n * \n * @param {string} l \n */\nfunction parseFields(l) {\n\t/** @type {Parse.Field[]} */\n\tconst fields = [];\n\tfor (const v of l.split('.')) {\n\t\tif (!v || v[0] === '?') { return null; }\n\t\tconst index = v.indexOf('?');\n\t\tconst r = fieldParserRegex.exec(index > 0 ? v.slice(0, index) : v);\n\t\tif (!r) { return null; }\n\t\tconst sub = r[2]?.split(/\\[|\\]/).filter(Boolean).map(v => parseInt(v) || 0) || [];\n\t\tconst group = index > 0 ? v.slice(index) : undefined;\n\t\tfields.push({ field: r[1], group, sub });\n\t}\n\treturn fields;\n\n}\n\n\n/** @param {string} v */\nconst decodeValue = v => decodeURIComponent(v.replaceAll('+', ' '));\n/**\n * \n * @param {string} s \n * @returns {string | RecursiveArray<string>?}\n */\nfunction parseArrayValue(s) {\n\t/** @type {(string | RecursiveArray<string>)[]} */\n\tconst root = [];\n\t/** @type {(string | RecursiveArray<string>)[][]} */\n\tconst stack = [];\n\tlet current = root;\n\t/** @type {string[]} */\n\tlet strings = [];\n\tlet end = false;\n\tlet must = true;\n\tfunction add() {\n\t\tcurrent.push(decodeValue(strings.join()));\n\t\tstrings = [];\n\t}\n\n\tfor (const c of s) {\n\t\tif (c === ',') {\n\t\t\tif (end) {\n\t\t\t\tend = false;\n\t\t\t} else {\n\t\t\t\tadd();\n\t\t\t}\n\t\t\tmust = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === ')') {\n\t\t\tif (must || strings.length) {\n\t\t\t\tadd();\n\t\t\t\tmust = false;\n\t\t\t}\n\t\t\tconst last = stack.pop();\n\t\t\tif (!last) { return null; }\n\t\t\tlast.push(current);\n\t\t\tcurrent = last;\n\t\t\tend = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (end) { return null; }\n\t\tmust = false;\n\t\tif (c !== '(') {\n\t\t\tstrings.push(c);\n\t\t\tcontinue;\n\t\t}\n\t\tif (strings.length) { return null; }\n\t\tstack.push(current);\n\t\tcurrent = [];\n\t}\n\tif (must || strings.length) {\n\t\tadd();\n\t}\n\tif (stack.length) { return null; }\n\treturn root.length === 1 ? root[0] : root;\n}\n\nconst valueQRegex = /^([-_\\d\\p{L}]+)@([-_\\d\\p{L}]+)/u;\n\n\n/**\n * \n * @param {string?} v \n * @returns {Value | true}\n */\nfunction parseValue(v) {\n\tif (v === null) { return true; }\n\tif (v[0] === '?') {\n\t\treturn { placeholder: decodeValue(v.slice(1)) };\n\t}\n\tif (v[0] === ':') {\n\t\treturn { field: decodeValue(v.slice(1)) };\n\t}\n\tif (v[0] === '@') {\n\t\t// TODO: \n\t\treturn null;\n\t}\n\tconst vq = valueQRegex.test(v);\n\tif (vq) {\n\t\t// TODO: \n\t\treturn null;\n\t}\n\tif (v.includes('(') || v.includes(')')) {\n\t\tconst list = parseArrayValue(v);\n\t\tif (list) { return list; }\n\t}\n\tif (v.includes(',')) {\n\t\treturn v.split(',').map(v => decodeValue(v.replaceAll('+', ' ')));\n\t}\n\treturn decodeValue(v);\n}\n/**\n * \n * @param {(Parse.Match | Parse.Children)[]} list \n * @returns {Iterable<Match | Children>}\n */\nfunction* toAnd(list) {\n\t/** @type {[(Parse.Match | Parse.Children), Parse.Field[], Parse.Field[]][]} */\n\tconst values = list.map(v => {\n\t\tconst fields = v.fields;\n\t\tconst index = fields.findLastIndex(v => v.group);\n\t\tif (index < 0 || index >= fields.length - 1) {\n\t\t\treturn [v, [], []];\n\t\t}\n\t\tconst field = fields[index];\n\t\tif (!field) { return [v, [], []]; }\n\t\treturn [{ ...v, fields: fields.slice(index + 1) }, fields.slice(0, index + 1), [...fields.slice(0, index), { ...field, group: undefined }]];\n\t});\n\tconst map = Object.groupBy(values, v => JSON.stringify(v[1]));\n\tyield* map['[]']?.map(v => compressAndItem(v[0])) || [];\n\tdelete map['[]'];\n\t/** @type {Parse.Children[]} */\n\tconst result = Object.values(map).filter(Boolean).map((list = []) => {\n\t\tif (!list?.length) { return { fields: [], children: [] }; }\n\t\treturn { fields: list[0][2] || [], children: list.map(v => v[0]) };\n\t}).filter(v => v.fields.length);\n\tif (!result.length) { return; }\n\n\tyield* toAnd(result);\n}\n\n/**\n * \n * @param {(Parse.Match & {groups: string[]})[]} list \n * @returns {Or}\n */\nfunction toOr(list) {\n\tconst map = Map.groupBy(list, v => v.groups.shift() ?? null);\n\tconst and = map.get(null) || [];\n\tconst baseOr = map.get('') || [];\n\tmap.delete(null);\n\tmap.delete('');\n\n\treturn {\n\t\tor: [\n\t\t\t...baseOr.map(v => compressAndItem(v)),\n\t\t\t...[...map.values()].map(v => toOr(v)),\n\t\t],\n\t\tand: [...toAnd(and)],\n\t};\n}\n/**\n * \n * @param {string} search \n * @returns {Param}\n */\nexport function parse(search, split = '&') {\n\t/** @type {string[]} */\n\tconst values = [];\n\t/** @type {string[]} */\n\tconst select = [];\n\t/** @type {string[]} */\n\tconst primary = [];\n\t/** @type {[field: string, desc?: boolean][]} */\n\tconst sorts = [];\n\tlet limit = 0;\n\tlet offset = 0;\n\tlet page = 0;\n\tlet total = false;\n\t/** @type {Record<string, string>} */\n\tconst placeholders = {};\n\n\n\t/** @type {(Parse.Match & {groups: string[]})[]} */\n\tconst allMatches = [];\n\n\tfor (const s of typeof search === 'string' ? search.split(split) : []) {\n\t\tif (s[0] === '=') {\n\t\t\tvalues.push(s.slice(1));\n\t\t\tcontinue;\n\t\t}\n\t\tconst index = s.indexOf('=');\n\t\tconst key = index < 0 ? s : s.slice(0, index);\n\t\tconst val = index < 0 ? null : s.slice(index + 1);\n\t\tif (index <= 0) { continue; }\n\t\tif (`.!@^*<>{}[]()+|;,\"'\\`\\\\/`.includes(key[0])) { continue; }\n\t\tif (key[0] === '?') {\n\t\t\tplaceholders[decodeValue(key.slice(1))] = decodeValue(val || '');\n\t\t\tcontinue;\n\t\t}\n\t\tif (key[0] === ':') {\n\t\t\tconst name = key.slice(1);\n\t\t\tif (!val) { continue; }\n\t\t\tif (name === 'sort') {\n\t\t\t\tsorts.push(...val.split(',').filter(Boolean).map(v => {\n\t\t\t\t\tconst desc = v[0] === '-';\n\t\t\t\t\tconst name = desc ? v.slice(1) : v;\n\t\t\t\t\treturn /** @type {[field: string, desc?: boolean]} */([decodeValue(name), desc]);\n\t\t\t\t}).filter(Boolean));\n\t\t\t} else if (name === 'select') {\n\t\t\t\tselect.push(...val.split(',').map(decodeValue).filter(Boolean));\n\t\t\t} else if (name === 'primary') {\n\t\t\t\tprimary.push(...val.split(',').map(decodeValue).filter(Boolean));\n\t\t\t} else if (name === 'limit') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { limit = parseInt(val); }\n\t\t\t} else if (name === 'offset') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { offset = parseInt(val); }\n\t\t\t} else if (name === 'page') {\n\t\t\t\tif (val && /^\\d+$/.test(val)) { page = parseInt(val); }\n\t\t\t} else if (name === 'total') {\n\t\t\t\tif (val) { total = true; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst sg = key.split('~');\n\t\tlet field = sg.pop() || '';\n\t\tlet sign = '';\n\t\tif ('!'.includes(field[field.length - 1])) {\n\t\t\tsign = '!';\n\t\t\tfield = field.slice(0, -1);\n\t\t}\n\n\t\tconst l = field.split(':', 3);\n\t\tif (l.length > 2) { continue; }\n\t\tconst fields = parseFields(l[0]);\n\t\tif (!fields) { continue; }\n\t\tconst value = parseValue(val);\n\t\tif (value === null) { continue; }\n\n\t\tconst operator = decodeValue(l[1] || '');\n\t\tconst groupIndex = sg.indexOf('');\n\t\tconst groups = groupIndex < 0 ? sg : sg.slice(0, groupIndex + 1);\n\t\tallMatches.push({\n\t\t\tgroups,\n\t\t\tfields,\n\t\t\toperator: !operator && value === true ? null : operator,\n\t\t\tsign,\n\t\t\tvalue: value === true ? null : value\n\t\t});\n\t}\n\n\tconst { and, or } = toOr(allMatches);\n\n\t/** @type {Param} */\n\tconst result = {};\n\tif (values?.length) {\n\t\tresult.values = values;\n\t}\n\tif (total) {\n\t\tresult.total = total;\n\t}\n\tif (limit && limit > 0) {\n\t\tresult.limit = limit;\n\t}\n\tif (page && page > 0) {\n\t\tresult.page = page;\n\t}\n\tif (offset && offset > 0) {\n\t\tresult.offset = offset;\n\t}\n\tif (select?.length) {\n\t\tresult.select = select;\n\t}\n\tif (primary?.length) {\n\t\tresult.primary = primary;\n\t}\n\tif (sorts?.length) {\n\t\tresult.sort = sorts;\n\t}\n\tconst where = and;\n\tif (where?.length) {\n\t\tresult.where = where;\n\t}\n\tconst orWhere = or;\n\tif (orWhere?.length) {\n\t\tresult.orWhere = orWhere;\n\t}\n\tif (Array.isArray(placeholders) && placeholders.length) {\n\t\tresult.placeholders = placeholders;\n\t}\n\n\n\treturn result\n}\n","/** @import { Param } from './types.mjs' */\n\n/**\n * \n * @param {Partial<Param>} a \n * @param {Partial<Param>} b \n * @returns {Param}\n */\nexport function merge(a, b) {\n\tconst limit = b.limit || a.limit || 0;\n\tconst page = b.page ?? a.page;\n\tconst primary = [a.primary || [], b.primary || []].flat().filter(Boolean);\n\tconst offset = \n\tb.offset ?? (b.limit && (b.page || b.page === 0) ? (Math.floor(Math.max(b.page || 0, 1)) - 1) * b.limit : null)\n\t?? a.offset ?? (a.limit && (a.page || a.page === 0) ? (Math.floor(Math.max(a.page || 0, 1)) - 1) * a.limit : null)\n\t?? (Math.floor(Math.max(page || 0, 1)) - 1) * (limit || 10);\n\n\tconst values = [...a.values || [], ...b.values || []]\n\tconst sort = [...a.sort || [], ...b.sort || []]\n\tconst select = [...a.select || [], ...b.select || []]\n\tconst where = [...a.where || [], ...b.where || []]\n\tconst orWhere = [...a.orWhere || [], ...b.orWhere || []]\n\tconst or = [...a.or || [], ...b.or || []]\n\n\t/** @type {Param} */\n\tconst result = {};\n\tif (values?.length) {\n\t\tresult.values = values;\n\t}\n\tif (limit && limit > 0) {\n\t\tresult.limit = limit;\n\t}\n\tif (a.total || b.total) {\n\t\tresult.total = true;\n\t}\n\tif (page && page > 0) {\n\t\tresult.page = page;\n\t}\n\tif (offset && offset > 0) {\n\t\tresult.offset = offset;\n\t}\n\tif (select?.length) {\n\t\tresult.select = select;\n\t}\n\tif (sort?.length) {\n\t\tresult.sort = sort;\n\t}\n\tif (where?.length) {\n\t\tresult.where = where;\n\t}\n\tif (orWhere?.length) {\n\t\tresult.orWhere = orWhere;\n\t}\n\tif (or?.length) {\n\t\tresult.or = or;\n\t}\n\tif (primary.length) {\n\t\tresult.primary = primary;\n\t}\n\n\treturn result;\n}\n","/** @import { RecursiveArray } from '../types/types.mjs' */\n/** @import { Children, Field, FieldValue, Match, Or, Param } from './types.mjs' */\n\n/** @param {string} v */\nconst encodeValue = v => encodeURIComponent(v).replaceAll('%20', '+');\n\n/**\n * \n * @param {string | boolean | number | RecursiveArray<string> | FieldValue} value \n */\nfunction stringifyValue(value) {\n\tif (Array.isArray(value)) {\n\t\t/**\n\t\t * \n\t\t * @param {string | RecursiveArray<string>} v \n\t\t * @returns {string}\n\t\t */\n\t\tfunction s(v) {\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\treturn `(${v.map(s).join(',')})`;\n\t\t\t}\n\t\t\treturn encodeValue(v);\n\t\t}\n\t\tconst val = value.map(s).join(',');\n\t\tif (value.length > 1) { return val; }\n\t\treturn `(${val})`;\n\t}\n\tif (typeof value === 'number') {\n\t\treturn `${value}`;\n\t}\n\tif (typeof value === 'boolean') {\n\t\treturn value ? '1' : 0;\n\t}\n\tif (typeof value !== 'object') {\n\t\treturn encodeValue(value);\n\t}\n\tconst { field, placeholder } = value;\n\tif (placeholder) {\n\t\treturn `?${encodeValue(placeholder)}`;\n\t}\n\tif (field) {\n\t\treturn `:${encodeValue(field)}`;\n\t}\n\t// TODO:\n\treturn '';\n}\n\n/**\n * \n * @param {Field[]} fields \n */\nfunction stringifyFields(fields) {\n\treturn fields.map(item => {\n\t\tconst [field, ...sub] = typeof item === 'string' ? [item] : item;\n\t\treturn `${encodeValue(field)}${sub.map(() => `[k]`).join('')}`;\n\t}\n\t).join('.');\n}\n/**\n * \n * @param {Match} define \n */\nfunction stringifyDefine([fields, value, operator, sign]) {\n\tconst key = operator\n\t\t? `${stringifyFields(fields)}:${encodeValue(operator)}${sign || ''}`\n\t\t: `${stringifyFields(fields)}${sign || ''}`;\n\tif (operator === null) { return key; }\n\tif (value === null) { return ''; }\n\tif (typeof value === 'function') { return ''; }\n\treturn `${key}=${stringifyValue(value)}`;\n}\n/**\n * \n * @param {(Match | Children)[]} list \n * @returns {string[]}\n */\nfunction stringifyAnd(list) {\n\tlet index = 0;\n\treturn list.flatMap(v => {\n\t\tif (v.length !== 2) {\n\t\t\treturn stringifyDefine(v);\n\t\t}\n\t\tconst list = stringifyAnd(v[1]);\n\t\tif (!list.length) { return []; }\n\t\tlet key = stringifyFields(v[0]);\n\t\tif (list.length > 1) {\n\t\t\tkey += `?${(index++).toString(36)}`;\n\t\t}\n\t\treturn list.map(v => `${key}.${v}`);\n\t}).filter(Boolean);\n}\n\n/**\n * \n * @param {(Match | Children | Or)[]} list \n * @returns {string[]}\n */\nfunction stringifyOr(list) {\n\tlet index = 0;\n\treturn list.map(v => {\n\t\tif (Array.isArray(v)) {\n\t\t\treturn stringifyAnd([v]);\n\n\t\t}\n\t\treturn [\n\t\t\t...stringifyAnd(v.and || []),\n\t\t\t...stringifyOr(v.or || []),\n\t\t];\n\t}).flatMap(list => {\n\t\tif (!list) { return []; }\n\t\tconst key = list.length === 1 ? `~` : `${(index++).toString(36)}~`;\n\t\treturn list.map(v => `${key}${v}`);\n\t});\n}\n/**\n * \n * @param {Partial<Param>} query \n * @param {boolean} [usePage] \n */\nexport function stringify({\n\tvalues,\n\twhere,\n\torWhere,\n\tsort,\n\tselect, primary,\n\tlimit, offset, page, total,\n\tplaceholders,\n}, usePage) {\n\t/** @type {string[]} */\n\tlet queries = [];\n\tfor (const v of values || []) {\n\t\tif (!v) { continue; }\n\t\tqueries.push(`=${encodeValue(v)}`);\n\t}\n\tif (limit && limit > 0) {\n\t\tqueries.push(`:limit=${limit}`);\n\t}\n\tif (total) {\n\t\tqueries.push(`:total=${total}`);\n\n\t}\n\tif (usePage) {\n\t\tif (page && page > 0) {\n\t\t\tqueries.push(`:page=${page}`);\n\t\t}\n\t} else {\n\t\tif (offset && offset > 0) {\n\t\t\tqueries.push(`:offset=${offset}`);\n\t\t}\n\t}\n\tconst selectVal = select?.filter(Boolean).map(encodeValue).join(',');\n\tif (selectVal) {\n\t\tqueries.push(`:select=${selectVal}`);\n\t}\n\tconst primaryVal = primary?.filter(Boolean).map(encodeValue).join(',');\n\tif (primaryVal) {\n\t\tqueries.push(`:primary=${primaryVal}`);\n\t}\n\tif (sort) {\n\t\tconst val = sort.filter(Boolean).map(v => {\n\t\t\tif (Array.isArray(v)) {\n\t\t\t\tconst [field, desc] = v;\n\t\t\t\tif (field) {\n\t\t\t\t\treturn `${desc ? '-' : ''}${encodeValue(field)}`;\n\t\t\t\t}\n\t\t\t} else if (v) {\n\t\t\t\treturn encodeValue(v);\n\t\t\t}\n\t\t\treturn '';\n\t\t}).filter(Boolean).join(',');\n\t\tif (val) {\n\t\t\tqueries.push(`:sort=${val}`);\n\t\t}\n\t}\n\tif (placeholders && typeof placeholders === 'object' && !Array.isArray(placeholders)) {\n\t\tfor (const [k, v] of Object.entries(placeholders)) {\n\t\t\tqueries.push(`?${encodeValue(k)}=${encodeValue(v)}`);\n\n\t\t}\n\t}\n\tfor (const v of stringifyAnd(where || [])) {\n\t\tqueries.push(v);\n\t}\n\tfor (const v of stringifyOr(orWhere || [])) {\n\t\tqueries.push(v);\n\t}\n\treturn queries.join('&');\n}\n","import { Search } from '@yongdall/common';\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @typedef {object} Where\n * @property {(where: TWhere) => boolean?} [value]\n * @property {(list: TWhere[]) => TWhere?} or\n * @property {(list: TWhere[]) => TWhere?} and\n * @property {ItemToWhere<TField, TParam, TWhere>} build\n */\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @callback ToWhere\n * @param {TField} fields \n * @param {Search.AndList} [and] \n * @param {...Search.OrList | null | undefined} orList\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @callback ItemToWhere\n * @param {ToWhere<TField, TParam, TWhere>} toWhere \n * @param {TField} fields \n * @param {Search.Match | Search.Children} and\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\n\n\n\n\n/**\n * \n * @template TField\n * @template TParam\n * @template TWhere\n * @param {Where<TField, TParam, TWhere>} where \n * @param {TField} fields \n * @param {Search.AndList} [and] \n * @param {...Search.OrList | null | undefined} orList\n * @returns {Generator<TParam, TWhere?, TWhere?>}\n */\nexport function toWhere(where, fields, and, ...orList) {\n\t/**\n\t * \n\t * @param {TField} fields \n\t * @param {Search.AndList} [and] \n\t * @param {...Search.OrList | null | undefined} orList\n\t * @returns {Generator<TParam, TWhere?, TWhere?>}\n\t */\n\tfunction* toWhere(fields, and, ...orList) {\n\n\t\t/** @type {TWhere[]} */\n\t\tconst list = [];\n\t\tif (and) {\n\t\t\tfor (const item of and) {\n\t\t\t\tconst w = yield* where.build(toWhere, fields, item);\n\t\t\t\tif (w == null) { continue; }\n\t\t\t\tif (where.value?.(w) === false) { return w; }\n\t\t\t\tlist.push(w);\n\t\t\t}\n\t\t}\n\t\torFor: for (const or of orList) {\n\t\t\tif (!or) { continue; }\n\t\t\t/** @type {TWhere[]} */\n\t\t\tconst orList = [];\n\t\t\tfor (const item of or) {\n\t\t\t\tconst w = Array.isArray(item)\n\t\t\t\t\t? yield* where.build(toWhere, fields, item)\n\t\t\t\t\t: yield* toWhere(fields, item.and, item.or);\n\t\t\t\tif (w == null) { continue; }\n\t\t\t\tif (where.value?.(w) === true) {\n\t\t\t\t\tlist.push(w);\n\t\t\t\t\tcontinue orFor;\n\t\t\t\t}\n\t\t\t\torList.push(w);\n\t\t\t}\n\t\t\tconst w = orList.length ? where.or(orList) : null;\n\t\t\tif (w == null) { continue; }\n\t\t\tif (where.value?.(w) === false) { return w; }\n\t\t\tlist.push(w);\n\t\t}\n\t\tif (!list.length) { return null; }\n\t\treturn where.and(list);\n\t}\n\treturn toWhere(fields, and, ...orList);\n}\n","export * from './exec.mjs';\nexport * from './fill.mjs';\nexport { parse } from './parse.mjs';\nexport * from './merge.mjs';\nexport * from './stringify.mjs';\nexport * from './types.mjs';\nexport * from './util.mjs';\nexport * from './toWhere.mjs';\n","export const CST = Intl.DateTimeFormat().resolvedOptions().timeZone === 'Asia/Shanghai';\nexport const TZO = new Date().getTimezoneOffset();\nfunction getTimeZone() {\n\tlet tzo = TZO;\n\tif (!tzo) { return 'Z'; }\n\tconst s = tzo < 0 ? '+' : '-';\n\ttzo = Math.abs(tzo);\n\treturn s + [Math.floor(tzo / 60), tzo % 60].map(v => `${v}`.padStart(2, '0')).join(':');\n}\nexport const TZ = getTimeZone();\n\n\n\nconst dateRegex1 = /^(?:(?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)[t| ])?(?<h>2[0-3]|[01]?\\d):(?<m>[0-5]?\\d)(?::(?<s>[0-5]?\\d)(?:(?:\\.(?<ms>\\d{1,3})?)?))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?$/i;\nconst dateRegex2 = /^(?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)(?:[t| ](?<h>2[0-3]|[01]?\\d):(?<m>[0-5]?\\d)(?::(?<s>[0-5]?\\d)(?:(?:\\.(?<ms>\\d{1,3})?)?))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?)?$/i;\n\n\n/**\n * \n * @param {string | null} [val] \n * @returns \n */\nexport function parseTimeZone(val) {\n\tif (val === 'z' || val === 'Z') { return 'Z'; }\n\tif (!val || typeof val !== 'string') { return TZ; }\n\tif (val.includes(':')) { return val; }\n\treturn `${val}:00`;\n}\n\n\n/**\n * \n * @param {any} value \n * @returns \n */\nexport function parse(value) {\n\tif (value instanceof Date) { return value.valueOf() ? new Date(value) : null; }\n\tif (typeof value === 'number') {\n\t\tconst date = new Date(value);\n\t\treturn date.valueOf() ? date : null;\n\t}\n\tif (typeof value !== 'string') { return null; }\n\tconst ss = dateRegex1.exec(value)?.groups || dateRegex2.exec(value)?.groups;\n\tif (!ss) { return null; }\n\tconst { Y, M, D, h, m, s, ms, tz = '' } = ss;\n\tconst str = [\n\t\t`${Y || 2000}`.padStart(4, '0'),\n\t\t`-`,\n\t\t`${M || 1}`.padStart(2, '0'),\n\t\t`-`,\n\t\t`${D || 1}`.padStart(2, '0'),\n\t\t`T`,\n\t\t`${h || 0}`.padStart(2, '0'),\n\t\t`:`,\n\t\t`${m || 0}`.padStart(2, '0'),\n\t\t`:`,\n\t\t`${s || 0}`.padStart(2, '0'),\n\t\t`.`,\n\t\t`${ms || 0}`.padEnd(3, '0'),\n\t\t`${parseTimeZone(tz)}`\n\t].join('');\n\tconst date = new Date(str);\n\treturn date.valueOf() ? date : null;\n\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTime(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\treturn [\n\t\td.getUTCHours(),\n\t\td.getUTCMinutes(),\n\t\td.getUTCSeconds(),\n\t].map(v => `${v}`.padStart(2, '0')).join(':');\n\n}\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimeTz(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\tconst ms = `${d.getUTCMilliseconds()}`.padStart(3, '0');\n\n\treturn `${h}:${m}:${s}.${ms}${TZ}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetimeTz(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst Y = `${d.getUTCFullYear()}`.padStart(4, '0');\n\tconst M = `${d.getUTCMonth() + 1}`.padStart(2, '0');\n\tconst D = `${d.getUTCDate()}`.padStart(2, '0');\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\tconst ms = `${d.getUTCMilliseconds()}`.padStart(3, '0');\n\n\treturn `${Y}-${M}-${D}T${h}:${m}:${s}.${ms}${TZ}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetime(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\n\tconst Y = `${d.getUTCFullYear()}`.padStart(4, '0');\n\tconst M = `${d.getUTCMonth() + 1}`.padStart(2, '0');\n\tconst D = `${d.getUTCDate()}`.padStart(2, '0');\n\tconst h = `${d.getUTCHours()}`.padStart(2, '0');\n\tconst m = `${d.getUTCMinutes()}`.padStart(2, '0');\n\tconst s = `${d.getUTCSeconds()}`.padStart(2, '0');\n\n\treturn `${Y}-${M}-${D}T${h}:${m}:${s}`;\n}\n\n\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDate(date) {\n\tconst d = new Date(date.valueOf() - TZO * 60000);\n\treturn [\n\t\td.getUTCFullYear(),\n\t\td.getUTCMonth() + 1,\n\t\td.getUTCDate(),\n\t].map(v => `${v}`.padStart(2, '0')).join('-');\n}\n","const unitRegex = /^(.*)\\{(.*)\\}(.*)$/;\nconst sequenceRegex = /^\\{(?<seq>#*(?<min>0*))\\}$/;\n\n/**\n * 表示一个正则匹配配置项,用于描述如何从字符串中提取特定结构(如日期)。\n * \n * @typedef {Object} Filler\n * @property {string} name - 该配置的名称,用于标识或调试。\n * @property {[name: string, param: string][]} pipes\n * @property {boolean} optional - 是否为可选匹配。若为 true,则即使未匹配也不报错。\n * @property {string} prefix - 匹配内容前必须存在的前缀字符串(字面量,非正则)。\n * @property {string} suffix - 匹配内容后必须存在的后缀字符串(字面量,非正则)。\n */\n/**\n * 表示一个正则匹配配置项,用于描述如何从字符串中提取特定结构(如日期)。\n * \n * @typedef {Object} Sequence\n * @property {null} [name]\n * @property {number} min\n * @property {number} max\n */\n\n/**\n * \n * @param {string} unit \n * @returns {Filler | Sequence}\n */\nfunction parseUnit(unit) {\n\tconst sequenceResult = sequenceRegex.exec(unit)?.groups;\n\tif (sequenceResult) {\n\t\tconst {seq, min} = sequenceResult;\n\t\treturn {name: null, max: seq.length, min: min.length};\n\t}\n\tconst unitResult = unitRegex.exec(unit);\n\tlet main = unit;\n\tlet optional = false;\n\tlet prefix = '';\n\tlet suffix = '';\n\tif (unitResult) {\n\t\t[, prefix, main, suffix] = unitResult;\n\t\toptional = true;\n\t}\n\tconst [name, ...pipes] = main.split('|');\n\tpipes.filter(Boolean).map(format => {\n\t\tconst index = format.indexOf(':');\n\t\tif (index < 0) { return [format, '']; }\n\t\tconst type = format.slice(0, index);\n\t\tconst param = format.slice(index + 1);\n\t\treturn [type, param];\n\t});\n\treturn {\n\t\tname, pipes: pipes.filter(Boolean).map(format => {\n\t\t\tconst index = format.indexOf(':');\n\t\t\tif (index < 0) { return [format, '']; }\n\t\t\tconst type = format.slice(0, index);\n\t\t\tconst param = format.slice(index + 1);\n\t\t\treturn [type, param];\n\t\t}), optional, prefix, suffix\n\t};\n}\n/**\n * \n * @param {string | null} [pattern] \n */\nexport function parse(pattern) {\n\tif (typeof pattern !== 'string') { return []; }\n\tconst parseRegex = /\\{([^{}]*\\{[^{}]+\\}[^{}]*|[^{}]+)\\}/g;\n\tlet lastIndex = 0;\n\t/** @type {(string | Filler | Sequence)[]} */\n\tconst list = [];\n\tfor (let r = parseRegex.exec(pattern); r; r = parseRegex.exec(pattern)) {\n\t\tconst index = r.index;\n\t\tconst [text, res] = r;\n\t\tif (index > lastIndex) {\n\t\t\tlist.push(pattern.slice(lastIndex, index));\n\t\t}\n\t\tlastIndex = index + text.length;\n\t\tlist.push(parseUnit(res));\n\t}\n\tif (pattern.length > lastIndex) {\n\t\tlist.push(pattern.slice(lastIndex));\n\t}\n\treturn list;\n}\n","import { parse } from \"./parse.mjs\";\n/** @import { Filler, Sequence } from \"./parse.mjs\" */\n\n\n/**\n * \n * @param {*} value \n * @param {boolean} optional \n * @returns {string}\n */\nfunction baseGenerate(value, optional) {\n\tif ((value ?? null) === null) { return ''; }\n\tif (typeof value === 'string') { return value; }\n\tif (typeof value === 'bigint') { return String(value); }\n\tif (typeof value === 'boolean') { return value ? '1' : '0'; }\n\tif (typeof value === 'number') {\n\t\tif (!Number.isFinite(value)) { return ''; }\n\t\tconst text = value.toPrecision(100);\n\t\tif (!text.includes('.')) { return text; }\n\t\tconst index = text.indexOf('.');\n\t\treturn text.slice(0, index + 5).replace(/\\.?0+$/, '');\n\t}\n\tif (!(value instanceof Date)) { return `${value}`; }\n\tconst date = value;\n\tif (!date?.valueOf()) { return ''; }\n\t/** @type {Record<string, number>} */\n\tconst data = {\n\t\tY: date.getFullYear(),\n\t\tM: date.getMonth() + 1,\n\t\td: date.getDate(),\n\t\th: date.getHours(),\n\t\tm: date.getMinutes(),\n\t\ts: date.getSeconds(),\n\t};\n\treturn `YYYY-MM-DD hh:mm:ss`.replace(/([a-zA-Z])\\1*/g, (v, key) => {\n\t\tlet val = `${Object.hasOwn(data, key) ? data[key] : 0}`;\n\t\tconst length = v.length;\n\t\treturn `${val}`.padStart(length, '0').slice(-length);\n\t});\n}\n\n/**\n * \n * @param {Record<string, Generator<any>>} generators \n * @param {string} t \n * @param {string} p \n * @param {boolean} optional \n * @returns {function(any): any}\n */\nfunction buildPipe(generators, t, p, optional) {\n\tconst renderer = Object.hasOwn(generators, t) && generators[t];\n\tif (!renderer) { return () => { }; }\n\tconst params = renderer.parseParam(p);\n\treturn data => renderer.generate(data, params, { optional });\n\n}\n/**\n * @template T\n * @typedef {object} Generator\n * @property {(param: string) => T} parseParam\n * @property {(data: any, param: T, options: {optional: boolean}) => any} generate\n */\n\n/**\n * \n * @param {(string | Filler | Sequence)[] | string | null} [pattern] \n * @param {Record<string, Generator<any>>} [generators] \n * @returns {(data?: Record<string, any>?, sequence?: number?) => string}\n */\nexport function toGenerate(pattern, generators) {\n\tconst list = (Array.isArray(pattern) ? pattern : parse(pattern))\n\t\t.map(v => {\n\t\t\tif (!v || typeof v !== 'object') { return v; }\n\t\t\tif (v.name == null) { return { ...v, name: null }; }\n\t\t\tif (!generators) { return { ...v, pipes: [] }; }\n\t\t\treturn {\n\t\t\t\t...v,\n\t\t\t\tpipes: v.pipes.map(([t, p]) => buildPipe(generators, t, p, v.optional)),\n\t\t\t};\n\t\t});\n\tif (!list.length) { return () => ''; }\n\n\treturn (data, sequence) => {\n\t\tconst doc = typeof data === 'object' && data || {};\n\t\t/** @type {string[]} */\n\t\tconst results = [];\n\t\tfor (const v of list) {\n\t\t\tif (!v || typeof v !== 'object') {\n\t\t\t\tresults.push(v);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (v.name === null) {\n\t\t\t\tconst { min, max } = v;\n\t\t\t\tconst seq = (Math.floor(sequence || 0) || 0)\n\t\t\t\t\t.toPrecision(100).replace(/\\.\\d*$/, '')\n\t\t\t\t\t.padStart(min, '0')\n\t\t\t\t\t.slice(-max);\n\t\t\t\tresults.push(seq);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { name, prefix, suffix, optional, pipes } = v;\n\t\t\tlet val = Object.hasOwn(doc, name) ? doc[name] ?? null : null;\n\t\t\tfor (const pipe of pipes) {\n\t\t\t\tval = pipe(val);\n\t\t\t}\n\t\t\tconst text = baseGenerate(val, optional);\n\t\t\tif (!text) { continue; }\n\t\t\tresults.push(prefix, text, suffix);\n\t\t}\n\t\treturn results.join('');\n\n\t};\n}\n","/** @import { Generator } from \"./toGenerate.mjs\" */\nimport { parse as parseDate } from \"../Datetime.mjs\";\n\n/**\n * 表示一个正则匹配配置项,用于描述如何从字符串中提取特定结构(如日期)。\n * \n * @typedef {Object} Item\n * @property {string} name - 该配置的名称,用于标识或调试。\n * @property {boolean} optional - 是否为可选匹配。若为 true,则即使未匹配也不报错。\n * @property {string} prefix - 匹配内容前必须存在的前缀字符串(字面量,非正则)。\n * @property {string} suffix - 匹配内容后必须存在的后缀字符串(字面量,非正则)。\n * @property {(value: any) => string} generate\n*/\n\n/**\n * \n * @param {any} value \n * @param {string} param \n * @param {object} options \n * @param {boolean} options.optional \n * @returns {string}\n */\nfunction generateDate(value, param, { optional }) {\n\n\tif (!param) { return ''; }\n\tconst date = parseDate(value) || (optional ? null : new Date);\n\tif (!date?.valueOf()) { return ''; }\n\t/** @type {Record<string, number>} */\n\tconst data = {\n\t\tY: date.getFullYear(),\n\t\tM: date.getMonth() + 1,\n\t\tD: date.getDate(),\n\t\th: date.getHours(),\n\t\tm: date.getMinutes(),\n\t\ts: date.getSeconds(),\n\t};\n\treturn param.replace(/#*([a-zA-Z])\\1*/g, (v, key) => {\n\t\tlet val = `${Object.hasOwn(data, key) ? data[key] : 0}`;\n\t\tconst max = v.length;\n\t\tconst min = v.replaceAll('#', '').length;\n\t\treturn `${val}`.padStart(min, '0').slice(-max);\n\t});\n}\n\n/**\n * \n * @param {string} type \n * @param {string} param \n * @returns {[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]}\n */\nfunction paramNumber(type, param) {\n\tif (!param) {\n\t\tparam = type === 'int' ? '#############0' : type === 'float' ? '#############0.0###' : '#############0.####';\n\t}\n\tconst [intPart, fractionalPart = ''] = param.split('.');\n\tconst intMax = intPart.length || 1;\n\tconst intMin = intPart.replaceAll('#', '').length || 1;\n\tconst fractionalMax = type === 'int' ? 0 : fractionalPart.length;\n\tconst fractionalMin = type === 'int' ? 0 : fractionalPart.replaceAll('#', '').length;\n\n\treturn [intMin, intMax, fractionalMin, fractionalMax];\n\n}\n/**\n * \n * @param {any} value \n * @param {[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]} param \n * @param {object} options \n * @param {boolean} options.optional \n * @returns {string}\n */\nfunction generateNumber(value, [intMin, intMax, fractionalMin, fractionalMax], { optional }) {\n\tlet intPart = '';\n\tlet fractionalPart = '';\n\tif (typeof value === 'bigint') {\n\t\tintPart = String(value);\n\t} else if (typeof value === 'number') {\n\t\tif (Number.isFinite(value)) {\n\t\t\t[intPart, fractionalPart = ''] = value.toPrecision(100).split('.');\n\t\t}\n\t} else if (typeof value === 'string') {\n\t\tif (/^\\s*[+-]?\\s*(\\d_)*\\.?(\\d_)*/.test(value)) {\n\t\t\t[intPart, fractionalPart = ''] = value.replace(/[^\\d.-]/g, '').split('.');\n\t\t}\n\t}\n\tif (!intPart && !fractionalPart && optional) { return ''; }\n\tintPart = intPart.padStart(intMin, '0').slice(-intMax);\n\tfractionalPart = fractionalPart.replace(/0+$/, '').padEnd(fractionalMin, '0').slice(0, fractionalMax);\n\tif (!fractionalPart) { return intPart; }\n\treturn `${intPart}.${fractionalPart}`;\n}\n/** @type {Generator<string>} */\nexport const date = {\n\tparseParam: v => v || 'YYYY-MM-DD',\n\tgenerate: generateDate,\n};\n/** @type {Generator<string>} */\nexport const time = {\n\tparseParam: v => v || 'hh:mm:ss',\n\tgenerate: generateDate,\n};\n/** @type {Generator<string>} */\nexport const datetime = {\n\tparseParam: v => v || 'YYYY-MM-DD hh:mm:ss',\n\tgenerate: generateDate,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const number = {\n\tparseParam: v => paramNumber('number', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const float = {\n\tparseParam: v => paramNumber('float', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<[intMin: number, intMax: number, fractionalMin: number, fractionalMax: number]>} */\nexport const int = {\n\tparseParam: v => paramNumber('int', v),\n\tgenerate: generateNumber,\n};\n/** @type {Generator<string[]>} */\nexport const list = {\n\tparseParam(param) {\n\t\treturn param.split(';');\n\t},\n\tgenerate(value, list, { optional }) {\n\t\tlet index = -1;\n\t\tif (typeof value === 'bigint') {\n\t\t\tindex = Number(value);\n\t\t} else if (typeof value === 'number') {\n\t\t\tindex = Math.floor(value);\n\t\t} else if (typeof value === 'boolean') {\n\t\t\tindex = value ? 1 : 0;\n\t\t} else if (typeof value === 'string') {\n\t\t\tif (!/^\\s*[+-]\\s*(\\d_)*/.test(value)) { return ''; }\n\t\t\tindex = Number.parseInt(value.replace(/[^\\d.+-]/g, ''));\n\t\t}\n\t\tif (index < 0 || index >= list.length) { return optional ? '' : list[0]; }\n\t\treturn list[index];\n\t},\n};\n/** @type {Generator<Record<string, string>>} */\nexport const map = {\n\tparseParam: param => Object.fromEntries(param.split(';').map(v => {\n\t\tconst index = v.indexOf('=');\n\t\tif (index < 0) { return [v, v]; }\n\t\treturn [v.slice(0, index), v.slice(index + 1)];\n\t})),\n\tgenerate(value, map, { optional }) {\n\t\tlet key = '';\n\t\tif (typeof value === 'bigint') {\n\t\t\tkey = String(value);\n\t\t} else if (typeof value === 'number') {\n\t\t\tkey = String(value);\n\t\t} else if (typeof value === 'boolean') {\n\t\t\tkey = value ? '1' : '0';\n\t\t} else if (typeof value === 'string') {\n\t\t\tkey = value;\n\t\t}\n\t\treturn Object.hasOwn(map, key) ? map[key] : optional ? '' : Object.values(map)[0];\n\t},\n};\n","/** @import { Filler, Sequence } from \"./parse.mjs\" */\n/** @import { Generator } from \"./toGenerate.mjs\" */\nimport { toGenerate } from \"./toGenerate.mjs\"\nimport * as defaultGenerators from './generators.mjs';\n\n/**\n * \n * @overload\n * @param {(string | Filler | Sequence)[] | string | null} [pattern] \n * @param {Record<string, any>?} [data] \n * @param {number?} [sequence] \n * @param {Record<string, Generator<any>>} [generators] \n * @returns {string}\n */\n/**\n * \n * @overload\n * @param {(string | Filler | Sequence)[] | string | null} [pattern] \n * @param {Record<string, any>?} [data] \n * @param {number?} [sequence] \n * @param {Record<string, Generator<any>>} [generators] \n * @returns {string}\n */\n/**\n * @overload\n * @param {(string | Filler | Sequence)[] | string | null} [pattern] \n * @param {Record<string, any>?} [data] \n * @param {number | Record<string, Generator<any>> | null} [sequence] \n * @param {Record<string, Generator<any>>?} [generators] \n * @returns {string}\n */\n/**\n * \n * @param {(string | Filler | Sequence)[] | string | null} [pattern] \n * @param {Record<string, any>?} [data] \n * @param {number | Record<string, Generator<any>> | null} [sequence] \n * @param {Record<string, Generator<any>>?} [generators] \n * @returns {string}\n */\nexport function generate(pattern, data, sequence, generators) {\n\tconst seq = typeof sequence === 'number' ? sequence : 0;\n\tconst allGenerators = [sequence, generators]\n\t\t.filter(Boolean)\n\t\t.find(v => typeof v === 'object') || defaultGenerators;\n\tconst generate = toGenerate(pattern, allGenerators);\n\treturn generate(data, seq);\n}\n","export * from './parse.mjs';\nexport * from './generate.mjs';\nexport * from './toGenerate.mjs';\nexport * as generators from './generators.mjs';\n","\nconst prototype = Error.prototype;\n/**\n * @template T\n * @template {Error} E\n * @param {Map<any, (error: E) => T>} transforms \n * @param {E} error \n */\nexport function transformError(transforms, error) {\n\tif (!(error instanceof Error)) { throw error; }\n\tfor (let p = Object.getPrototypeOf(error); p; p = Object.getPrototypeOf(p)) {\n\t\tconst fn = transforms.get(p);\n\t\tif (typeof fn === 'function') { return fn(error); }\n\t\tif (p === prototype) { break; }\n\t}\n\tthrow error;\n}\n","/**\n * @template T\n * @typedef {T | readonly T[]} Hook.MaybeArray\n */\n/**\n * @template T\n * @typedef {T extends readonly any[] ? Readonly<T>\n * : T extends Record<string, any> ? Hook.MaybeArray<Hook.Define<T> | T>\n * : T extends object ? Hook.MaybeArray<Hook.Define<T> | T>\n * : Hook.MaybeArray<T>\n * } Hook.Item\n */\n/**\n * @template T\n * @typedef {T extends Record<string, any> ? { [k in keyof T]?: Hook.Item<T[k]> } : T} Hook.Define\n*/\n\n\n\n\n/** @type {*} */\nconst noopFilter = () => true;\n\n\n\n\n/**\n * \n * @param {Record<string, any>} plugin \n * @param {string[]} name \n * @returns {*[]}\n */\nfunction findHook(plugin, name) {\n\tlet list = [plugin].flat();\n\tfor (const k of name.filter(Boolean)) {\n\t\tconst values = [];\n\t\tfor (const it of list) {\n\t\t\tif (!it || typeof it !== 'object') { continue; }\n\t\t\tif (!Object.hasOwn(it, k)) { continue; }\n\t\t\tvalues.push(it[k]);\n\t\t}\n\t\tif (!values.length) { return []; }\n\t\tlist = values.flat();\n\t}\n\treturn list;\n}\n\n/**\n * \n * @template T\n * @param {any} plugin \n * @param {string[]} names \n * @returns {T | void}\n */\nfunction first(plugin, names) {\n\tif (!names.length) { return plugin; }\n\tif (!plugin || typeof plugin !== 'object') { return; }\n\tconst [name, ...keys] = names;\n\tfor (const v of [plugin].flat()) {\n\t\tconst val = first(v[name], keys);\n\t\tif (val !== undefined) { return val; }\n\t}\n}\n\n/**\n * \n * @template T\n * @param {Record<string, any>} hooks \n * @param {string[]} name \n * @returns {IterableIterator<T>}\n */\nfunction* values(hooks, name) {\n\tfor (const it of Object.values(hooks)) {\n\t\tfor (const value of findHook(it, name)) {\n\t\t\tyield value;\n\t\t}\n\t}\n}\n\n\n\n\n/**\n * @template T\n */\nexport class Hook {\n\t/**\n\t * @template {object} T\n\t * @param {Record<string, Hook.Define<T>> | (() => Record<string, Hook.Define<T>>)} [options]\n\t * @return {Hook<T>}\n\t */\n\tstatic build(options) {\n\t\tconst hook = new Hook();\n\t\treturn Hook.update(hook, options);\n\t}\n\t/**\n\t * \n\t * @template T\n\t * @param {Hook<T>} hook\n\t * @param {Record<string, Hook.Define<T>> | (() => Record<string, Hook.Define<T>>)} [options]\n\t */\n\tstatic update(hook, options) {\n\t\tlet updated = false;\n\t\tif (typeof options === 'function') {\n\t\t\tObject.defineProperty(hook.#config, 'hooks', {\n\t\t\t\tconfigurable: true,\n\t\t\t\tget() {\n\t\t\t\t\tconst r = options();\n\t\t\t\t\treturn typeof r === 'object' && r || {};\n\t\t\t\t},\n\t\t\t});\n\t\t\tupdated = true;\n\t\t} else {\n\t\t\tif (options && typeof options === 'object') {\n\t\t\t\tObject.defineProperty(hook.#config, 'hooks', {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tvalue: options,\n\t\t\t\t});\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t}\n\t\tif (updated) {\n\t\t\tHook.reset(hook);\n\t\t}\n\t\treturn hook;\n\t}\n\t/**\n\t * \n\t * @template T\n\t * @param {Hook<T>} hook\n\t */\n\tstatic reset(hook) {\n\t\tconst hooks = hook.#hooks;\n\t\tconst resetFn = hook.#config.resetFn;\n\t\tresetFn.sort(([, a], [, b]) => a - b);\n\t\tconst before = resetFn.filter(([, p]) => p <= 0);\n\t\tconst after = resetFn.filter(([, p]) => p > 0);\n\t\tfor (const [fn] of before) { fn(); }\n\t\tfor (const fn of values(hooks, ['reset'])) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tfn();\n\t\t}\n\t\tfor (const [fn] of after) { fn(); }\n\t}\n\n\t/** @type {{hooks: any; resetFn: [fn: () => void, hysteresis: number][]}} */\n\t#config = { hooks: Object.create(null), resetFn: [] };\n\t/** @type {string[]} */\n\t#keys = [];\n\t#stringTag = 'Hook';\n\t[Symbol.iterator]() { return this.entries(); }\n\t[Symbol.toStringTag]() { return this.#stringTag; }\n\t/** @param {string} hint */\n\t[Symbol.toPrimitive](hint) {\n\t\tif (hint === 'number') { return NaN; }\n\t\treturn `[${this[Symbol.toStringTag]()}]`;\n\t}\n\n\tget #hooks() { return this.#config.hooks; };\n\t/**\n\t * @template {T extends readonly any[] ? never : T extends object ? string & keyof T : never} K\n\t * @param {K} key \n\t * @returns {Hook<Exclude<T extends readonly any[] ? never : T extends object ? T[K] :never, void | undefined>>}\n\t */\n\tget(key) {\n\t\tconst keys = [...this.#keys, key];\n\t\tconst hook = new Hook();\n\t\thook.#config = this.#config;\n\t\thook.#keys = keys;\n\t\thook.#stringTag = `Hook(${keys.join('.')})`;\n\t\treturn hook;\n\t}\n\t/**\n\t * @param {T extends (...args: infer A) => any ? A : []} args \n\t * @returns \n\t */\n\tcall(...args) {\n\t\tfor (const fn of this.values()) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tfn(...args);\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {string} plugin \n\t * @returns {T | void}\n\t */\n\tfirst(plugin) {\n\t\tconst hooks = this.#hooks;\n\t\tif (!Object.hasOwn(hooks, plugin)) { return; }\n\t\treturn first(hooks[plugin], this.#keys.filter(Boolean));\n\t}\n\n\t/**\n\t * \n\t * @param {string} plugin \n\t * @returns {IterableIterator<T extends readonly (infer V)[] ? V : T>}\n\t */\n\t*plugin(plugin) {\n\t\tconst hooks = this.#hooks;\n\t\tif (!Object.hasOwn(hooks, plugin)) { return; }\n\t\tyield* findHook(hooks[plugin], this.#keys.filter(Boolean));\n\t}\n\n\t/**\n\t * \n\t * @returns {IterableIterator<T extends readonly (infer V)[] ? V : T>}\n\t */\n\tvalues() { return values(this.#hooks, this.#keys); }\n\n\t/**\n\t * \n\t * @returns {IterableIterator<[string, T extends readonly (infer V)[] ? V : T]>}\n\t */\n\t*entries() {\n\t\tconst hooks = this.#hooks;\n\t\tconst name = this.#keys;\n\t\tfor (const [plugin, it] of Object.entries(hooks)) {\n\t\t\tfor (const value of findHook(it, name)) {\n\t\t\t\tyield [plugin, value];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * @template [TX=(T extends Record<string, infer TT>? TT extends readonly (infer V)[] ? V : TT : never)]\n\t * @param {(v: *)=>v is TX} filter \n\t * @returns {IterableIterator<[plugin: string, key: string, value: TX]>}\n\t */\n\t*entriesObject(filter = noopFilter) {\n\t\tfor (const [plugin, hooksMap] of this.entries()) {\n\t\t\tif (!hooksMap || typeof hooksMap !== 'object') { continue; }\n\t\t\tfor (const [k, v] of Object.entries(hooksMap)) {\n\t\t\t\tif (!filter(v)) { continue; }\n\t\t\t\tyield [plugin, k, v];\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/**\n\t * @template [TT=(T extends Record<string, infer TT> ? TT : never)]\n\t * @param {(v: *)=>v is TT} [filter] \n\t * @returns {Record<string, TT>}\n\t */\n\tnamed(filter = noopFilter) {\n\t\t/** @type {Record<string, TT>} */\n\t\tconst result = Object.create(null);\n\t\tfor (const hooksMap of this.values()) {\n\t\t\tif (!hooksMap || typeof hooksMap !== 'object') { continue; }\n\t\t\tfor (const [k, v] of Object.entries(hooksMap)) {\n\t\t\t\tif (!filter(v)) { continue; }\n\t\t\t\tresult[k] = v;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * \n\t * @param {() => void} fn \n\t * @param {number} [hysteresis] \n\t * @returns \n\t */\n\tlisten(fn, hysteresis) {\n\t\tif (typeof fn !== 'function') { return () => { }; }\n\t\tconst resetFn = this.#config.resetFn;\n\t\t/** @type {[() => void, number]} */\n\t\tconst it = [fn, Number.isFinite(hysteresis) && hysteresis || 0];\n\t\tresetFn.push(it);\n\t\tresetFn.sort(([, a], [, b]) => b - a);\n\t\treturn () => {\n\t\t\tconst index = resetFn.findIndex(v => v === it);\n\t\t\tif (index >= 0) {\n\t\t\t\tresetFn.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n}\n","const errorPrototype = Error.prototype;\n/**\n * @template T\n */\nexport class ErrorHandler {\n\t/** \n\t * 使用 WeakMap 存储 错误原型 -> 处理函数\n\t * \n\t * 键是 Error 的 prototype 对象,值是对应的处理函数\n\t * \n\t * @type {WeakMap<Error, (error: any) => PromiseLike<T?> | T?>}\n\t */\n\t#handlers = new WeakMap();\n\n\t/**\n\t * 注册错误处理函数\n\t * @template {Error} C\n\t * @param {{new(...p: any): C; prototype: C}} ErrorClass - 错误类的构造函数\n\t * @param {(error: C) => PromiseLike<T?> | T?} handler - 处理函数\n\t */\n\tregister(ErrorClass, handler) {\n\t\tif (typeof handler !== 'function') {\n\t\t\tthrow new TypeError('Handler must be a function');\n\t\t}\n\t\tif (typeof ErrorClass !== 'function') {\n\t\t\tthrow new TypeError('Registered error class must be a subclass of Error');\n\t\t}\n\t\tconst prototype = ErrorClass.prototype;\n\t\tif (!(prototype instanceof Error)) {\n\t\t\tthrow new TypeError('Registered error class must be a subclass of Error');\n\t\t}\n\t\tthis.#handlers.set(prototype, handler);\n\t}\n\n\t/**\n\t * 将错误对象转换为友好的文本信息\n\t * @param {any} error - 需要处理的错误对象\n\t * @returns {Promise<T?>} - 处理后的文本信息\n\t */\n\tasync convert(error) {\n\t\tif (!(error instanceof Error)) { throw error; }\n\t\tconst handlers = this.#handlers;\n\t\tfor (\n\t\t\tlet prototype = Object.getPrototypeOf(error);\n\t\t\tprototype && prototype !== errorPrototype;\n\t\t\tprototype = Object.getPrototypeOf(prototype)\n\t\t) {\n\t\t\tconst handler = handlers.get(prototype);\n\t\t\tif (!handler) { continue; }\n\t\t\tconst res = await handler(error) ?? null;\n\t\t\tif (res !== null) { return res; }\n\t\t}\n\t\tconst handler = handlers.get(errorPrototype);\n\t\treturn handler ? await handler(error) ?? null : null;\n\t}\n}\n","/**\n * @template T\n * @extends {Promise<T>}\n */\nexport class LazyPromise extends Promise {\n\tstatic get [Symbol.species]() { return Promise; }\n\t/** @type {() => void} */\n\t#do;\n\t/**\n\t * \n\t * @param {(resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void} executor \n\t */\n\tconstructor(executor) {\n\t\t/** @type {(() => void) | null} */\n\t\tlet run = null;\n\t\tsuper((resolve, reject) => {\n\t\t\trun = () => {\n\t\t\t\ttry {\n\t\t\t\t\texecutor(resolve, reject);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treject(e);\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t\tthis.#do = () => {\n\t\t\tconst r = run;\n\t\t\trun = null;\n\t\t\tif (r) { r(); }\n\t\t};\n\t}\n\n\t/**\n\t * @template [TResult1=T]\n\t * @template [TResult2=never]\n\t * @param {((value: T) => TResult1 | PromiseLike<TResult1>)?} [onfulfilled] \n\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected] \n\t * @returns {Promise<TResult1 | TResult2>}\n\t */\n\tthen(onfulfilled, onrejected) {\n\t\tthis.#do();\n\t\treturn super.then(onfulfilled, onrejected);\n\t}\n\t/**\n\t * @template [TResult1=T]\n\t * @template [TResult2=never]\n\t * @param {((value: T) => TResult1 | PromiseLike<TResult1>)?} [onfulfilled] \n\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected] \n\t * @returns {LazyPromise<TResult1 | TResult2>}\n\t */\n\tlazyThen(onfulfilled, onrejected) {\n\t\treturn new LazyPromise((resolve, reject) => {\n\t\t\t// 这里调用原生的 .then() 来监听当前 Promise 的状态\n\t\t\t// 但我们将结果传递给新 LazyPromise 的 resolve/reject\n\t\t\tthis.then(\n\t\t\t\t(value) => {\n\t\t\t\t\tif (typeof onfulfilled === 'function') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresolve(onfulfilled(value));\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tresolve(value);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t(reason) => {\n\t\t\t\t\tif (typeof onrejected === 'function') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresolve(onrejected(reason));\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(reason);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\t/**\n\t * @template [TResult=never]\n\t * @param {((reason: any) => TResult | PromiseLike<TResult>)?} [onrejected] \n\t * @returns {LazyPromise<T | TResult>}\n\t */\n\tlazyCatch(onrejected) {\n\t\t// Promise.prototype.catch 本质上就是 then(undefined, onRejected)\n\t\t// 调用 lazyThen 确保返回的是 LazyPromise\n\t\tthis.finally\n\t\treturn this.lazyThen(undefined, onrejected);\n\t}\n\n\t/**\n\t * @param {(() => PromiseLike<void> | void)?} [onfinally] \n\t * @returns {LazyPromise<T>}\n\t */\n\tlazyFinally(onfinally) {\n\t\tif (typeof onfinally !== 'function') { return this; }\n\n\t\treturn this.lazyThen(\n\t\t\tasync (value) => {\n\t\t\t\tawait onfinally();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tasync (reason) => {\n\t\t\t\tawait onfinally();\n\t\t\t\tthrow reason;\n\t\t\t}\n\t\t);\n\t}\n\t/**\n\t * 创建一个已解决的 LazyPromise。\n\t * @overload\n\t * @returns {LazyPromise<void>}\n\t */\n\t/**\n\t * 创建一个已解决的 LazyPromise。\n\t * @template T\n\t * @overload\n\t * @param {T} value - 用于解决 Promise 的值。\n\t * @returns {LazyPromise<Awaited<T>>}\n\t */\n\t/**\n\t * 创建一个已解决的 LazyPromise。\n\t * @template T\n\t * @overload\n\t * @param {T | PromiseLike<T>} value - 用于解决 Promise 的值。\n\t * @returns {LazyPromise<Awaited<T>>}\n\t */\n\t/**\n\t * 创建一个已解决的 LazyPromise。\n\t * @template T\n\t * @param {T | PromiseLike<T>} [value] - 用于解决 Promise 的值。\n\t * @returns {LazyPromise<Awaited<T>>}\n\t */\n\tstatic resolve(value) {\n\t\treturn new LazyPromise((resolve) => {\n\t\t\t// @ts-ignore\n\t\t\tresolve(value);\n\t\t});\n\t}\n\n\t/**\n\t * 创建一个已拒绝的 LazyPromise。\n\t * @template T\n\t * @param {any} reason - 拒绝 Promise 的原因。\n\t * @returns {LazyPromise<T>}\n\t */\n\tstatic reject(reason) {\n\t\treturn new LazyPromise((_, reject) => {\n\t\t\treject(reason);\n\t\t});\n\t}\n\n\t/**\n\t * 等待所有传入的 Promise 成功,或其中一个失败。\n\t * @template {readonly unknown[] | []} T\n\t * @param {T} iterable - 一个可迭代对象,如数组。\n\t * @returns {LazyPromise<{ -readonly [P in keyof T]: Awaited<T[P]> }>}\n\t */\n\tstatic all(iterable) {\n\t\treturn new LazyPromise((resolve, reject) => {\n\t\t\tPromise.all(iterable).then(resolve, reject);\n\t\t});\n\t}\n\n\t/**\n\t * 等待所有传入的 Promise 完成(无论成功或失败)。\n\t * @template {readonly unknown[] | []} T\n\t * @param {T} iterable - 一个可迭代对象,如数组。\n\t * @returns {LazyPromise<{ -readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>> }>}\n\t */\n\tstatic allSettled(iterable) {\n\t\treturn new LazyPromise((resolve) => {\n\t\t\tPromise.allSettled(iterable).then(resolve);\n\t\t});\n\t}\n\n\t/**\n\t * 等待其中一个 Promise 成功,或所有 Promise 都失败。\n\t * @template {readonly unknown[] | []} T\n\t * @param {T} iterable - 一个可迭代对象,如数组。\n\t * @returns {LazyPromise<Awaited<T[number]>>}\n\t */\n\tstatic any(iterable) {\n\t\treturn new LazyPromise((resolve, reject) => {\n\t\t\tPromise.any(iterable).then(resolve, reject);\n\t\t});\n\t}\n\n\t/**\n\t * 等待其中一个 Promise 完成(无论成功或失败)。\n\t * @template {readonly unknown[] | []} T\n\t * @param {T} iterable - 一个可迭代对象,如数组。\n\t * @returns {LazyPromise<Awaited<T[number]>>}\n\t */\n\tstatic race(iterable) {\n\t\treturn new LazyPromise((resolve, reject) => {\n\t\t\tPromise.race(iterable).then(resolve, reject);\n\t\t});\n\t}\n\t/**\n\t * 创建一个惰性执行的 Promise,该 Promise 会执行传入的回调函数。\n\t * 与原生 Promise.try() 立即执行不同,LazyPromise.try() 是惰性的。\n\t * @template T\n\t * @template {unknown[]} U\n\t * @param {(...args: U) => T | PromiseLike<T>} callbackFn - 要执行的回调函数。\n\t * @param {U} args - 传递给回调函数的参数。\n\t * @returns {LazyPromise<Awaited<T>>}\n\t */\n\tstatic try(callbackFn, ...args) {\n\t\treturn new LazyPromise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// @ts-ignore\n\t\t\t\tresolve(callbackFn(...args));\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t}\n\tstatic withResolvers() {\n\t\treturn Promise.withResolvers();\n\t}\n}\n","import * as Pattern from './Pattern/index.mjs';\nconst regex = /\\{([^}{}]+)\\}/g\n/**\n * \n * @param {string?} [pattern] \n */\nexport function getPatternFields(pattern) {\n\tif (!pattern || typeof pattern !== 'string') { return []; }\n\t/** @type {string[]} */\n\tconst fields = [];\n\tfor(let result = regex.exec(pattern); result; result = regex.exec(pattern)) {\n\t\tfields.push(result[1]);\n\t}\n\treturn fields;\n}\n\n/**\n * @deprecated\n * @param {string?} [pattern] \n * @param {Record<string, any>?} [document] \n * @returns \n */\nexport function runPattern(pattern, document) {\n\treturn Pattern.generate(pattern, document);\n}\n","/** @import { Permission } from '@yongdall/types' */\n\n\n\n\n\n/**\n *\n * @param {Permission} permission\n * @returns {Iterable<string>}\n */\nexport default function* yieldPermissionConstraintFields({ constraints, organizationField }) {\n\tif (organizationField) { yield organizationField; }\n\tif (!constraints) { return; }\n\tfor (const [field, constraint] of Object.entries(constraints)) {\n\t\tif (!constraint) { continue; }\n\t\tconst { value, values, user } = constraint;\n\t\tif (value !== undefined) {\n\t\t\tyield field;\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tyield field;\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tyield field;\n\t\t} else if (user) {\n\t\t\tyield field;\n\t\t}\n\t}\n}\n","export * as Search from './Search/index.mjs';\nexport * as Datetime from './Datetime.mjs';\nexport * as Pattern from './Pattern/index.mjs';\nexport { transformError } from './transformError.mjs';\nexport { Hook } from './Hook.mjs';\nexport { ErrorHandler } from './ErrorHandler.mjs';\nexport { LazyPromise } from './LazyPromise.mjs';\nexport * from './model.mjs';\nexport { default as yieldPermissionConstraintFields } from './yieldPermissionConstraintFields.mjs';\n\n\nexport const pluginIdRegex = /^(?:(?<scope>@[a-zA-Z\\d_.-]+)\\/)?(?<name>[a-zA-Z\\d_.-]+)$/;\nexport const findPluginIdRegex = /^(?<pluginId>(?:(?<scope>@[a-zA-Z\\d_.-]+)\\/)?(?<name>[a-zA-Z\\d_.-]+))(?:\\/(?<path>[^#]*))?(?:#(?<hash>.*))?$/;\n\n/**\n * @typedef {object} Plugin\n * @property {string} [version]\n * @property {Record<string, string>} [assets]\n * @property {string} [hooks]\n * @property {string[]} [styles]\n */\n/**\n * @typedef {object} BootConfiguration\n * @property {string} [id] \n * @property {string} [route] 路由管理器\n * @property {string} [theme] 界面主题\n * @property {string} [authenticator] 登陆器\n * @property {boolean} [authRequired] 是否强制登陆\n * @property {string} [skin]\n * @property {boolean} [multiUser] \n * @property {string} [userType] \n * @property {string} [domain] \n * @property {string | number} [port] \n * @property {string} [path] \n * @property {Record<string, string>} [pages]\n * @property {Record<string, string>} [configurationPages]\n * \n * \n * @property {string} [logo] \n * @property {string} [title] \n * @property {string} [company] \n * @property {string} [type] \n * @property {string} [help] 帮助链接\n * @property {any[]} [userMenus]\n * @property {any[]} [menus]\n */\n/**\n * @typedef {object} Importmap\n * @property {Record<string, string>} imports\n * @property {Record<string, Record<string, string>>} scopes\n */\n/**\n * @typedef {object} Indicator\n * @property {string} color\n * @property {string} label\n * @property {unknown} [filters]\n */\n\n/**\n *\n * @param {*} v\n * @returns {v is (...p: any[]) => any}\n */\nexport function isFunction(v) {\n\treturn typeof v === 'function';\n}\n","/** @import { Hooks } from './typesDefine.mjs' */\n/** @import { PageRenderer } from './route/index.mjs' */\nimport { Hook } from '@yongdall/common';\nimport { createState } from './signal.mjs';\nconst hookState = createState(/** @type {Record<string, Hook.Define<Hooks>>} */({}));\n/** @type {Hook<Hooks>} */\n// @ts-ignore\nexport const allHooks = Hook.build(() => hookState.get());\n/** @typedef {Object.<'main' | 'details' | 'setting' | 'input' | 'edit', string | PageRenderer>} ContinuationDefine */\n\n/**\n * \n * @param {Record<string, Hook.Define<Hooks>>} hooks \n */\nexport function updateHooks(hooks) {\n\thookState.set(hooks);\n\tHook.reset(allHooks);\n}\n","/** @import { FieldFilterComponent, FieldComponent, FieldFilterFns, FieldFilter } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed } from '../signal.mjs';\n/**\n * @typedef {Object} FieldFilterOptions\n * @property {FieldFilterComponent} component - 过滤器组件\n * @property {string} [label] - 标签文本\n */\n/**\n* @typedef {Object} FilterFns\n* @property {FieldFilter.Value[]} value\n* @property {FieldFilter.Value[]} notValue\n* @property {FieldFilter.Named[]} named\n* @property {FieldFilter.Named[]} notNamed\n* @property {FieldFilter.Field[]} field\n* @property {FieldFilter.Field[]} notField\n*/\n\n/**\n * \n * @param {string} type\n * @param {string | boolean} [renderer] \n * @param {boolean} [array] \n * @returns \n */\nfunction getSetKey(type, renderer, array) {\n\tconst rendererName = typeof renderer === 'string' ? renderer : '';\n\tconst arrayKey = renderer === true || array === true ? '[]' : '';\n\tif (!type || type === '.') {\n\t\tif (!rendererName) { return; }\n\t\treturn `:${rendererName}${arrayKey}`;\n\t}\n\tif (!rendererName) { return `${type}${arrayKey}`; }\n\treturn `${type}:${rendererName}${arrayKey}`;\n}\n\n\n\n/**\n * \n * @param {boolean?} where \n */\nfunction toNot(where) {\n\treturn typeof where === 'boolean' ? !where : where;\n}\nconst inputState = createComputed(() => {\n\t/** @type {Map<string, FieldComponent>} */\n\tconst allInputs = new Map();\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, input } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t);\n\t\tif (!key) { continue; }\n\t\tif (typeof input === 'function') {\n\t\t\tallInputs.set(key, input);\n\t\t}\n\t}\n\treturn allInputs;\n});\nconst filterFnState = createComputed(() => {\n\t/** @type {Record<string, Record<string, FilterFns>>} */\n\tconst allFilters = {};\n\t/** @type {Record<string, Record<string, FilterFns>>} */\n\tconst allNotFilters = {};\n\t/**\n\t * \n\t * @param {Record<string, FilterFns>} filterMap \n\t * @param {Record<string, FilterFns>} notFilterMap \n\t * @param {FieldFilterFns} param2 \n\t * @param {string} [operator] \n\t */\n\tfunction setFilterFns(\n\t\tfilterMap,\n\t\tnotFilterMap,\n\t\t{ not, value, notValue, named, notNamed, field, notField },\n\t\toperator = '',\n\t) {\n\t\tif (not) {\n\t\t\tif (typeof value === 'function' && typeof typeof notValue !== 'function') {\n\t\t\t\tnotValue = (...p) => toNot(value(...p));\n\t\t\t}\n\t\t\tif (typeof field === 'function' && typeof typeof notField !== 'function') {\n\t\t\t\tnotField = (...p) => toNot(field(...p));\n\t\t\t}\n\t\t\tif (typeof named === 'function' && typeof typeof notNamed !== 'function') {\n\t\t\t\tnotNamed = (...p) => toNot(named(...p));\n\t\t\t}\n\t\t}\n\n\t\tconst typeFilter = Object.hasOwn(filterMap, operator)\n\t\t\t&& filterMap[operator]\n\t\t\t|| { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\tfilterMap[operator] = typeFilter;\n\t\tif (typeof value === 'function') { typeFilter.value.push(value); }\n\t\tif (typeof notValue === 'function') { typeFilter.notValue.push(notValue); }\n\t\tif (typeof named === 'function') { typeFilter.named.push(named); }\n\t\tif (typeof notNamed === 'function') { typeFilter.notNamed.push(notNamed); }\n\t\tif (typeof field === 'function') { typeFilter.field.push(field); }\n\t\tif (typeof notField === 'function') { typeFilter.notField.push(notField); }\n\t\tconst notOp = typeof not === 'string' && not || '';\n\t\tif (!notOp) { return; }\n\n\t\tconst notTypeFilter = Object.hasOwn(notFilterMap, notOp)\n\t\t\t&& notFilterMap[notOp]\n\t\t\t|| { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\tnotFilterMap[notOp] = typeFilter;\n\n\t\tif (typeof value === 'function') { notTypeFilter.notValue.push(value); }\n\t\tif (typeof notValue === 'function') { notTypeFilter.value.push(notValue); }\n\t\tif (typeof named === 'function') { notTypeFilter.notNamed.push(named); }\n\t\tif (typeof notNamed === 'function') { notTypeFilter.named.push(notNamed); }\n\t\tif (typeof field === 'function') { notTypeFilter.notField.push(field); }\n\t\tif (typeof notField === 'function') { notTypeFilter.field.push(notField); }\n\n\t}\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, filters } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t) || (array ? '[]' : '');\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst filterMap = Object.hasOwn(allFilters, key) && allFilters[key] || {};\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst notFilterMap = Object.hasOwn(allNotFilters, key) && allNotFilters[key] || {};\n\t\tsetFilterFns(filterMap, notFilterMap, field);\n\n\t\tfor (const [operator, fieldFilter] of Object.entries(filters || {})) {\n\t\t\tif (!fieldFilter || Array.isArray(fieldFilter) || typeof fieldFilter !== 'object') { continue; }\n\t\t\tsetFilterFns(filterMap, notFilterMap, fieldFilter, operator);\n\t\t}\n\t\tallFilters[key] = filterMap;\n\t\tallNotFilters[key] = notFilterMap;\n\t}\n\tfor (const type of Object.keys({ ...allFilters, ...allNotFilters })) {\n\t\tconst notTypeFilters = Object.hasOwn(allNotFilters, type) && allNotFilters[type];\n\t\tif (!notTypeFilters) { continue; }\n\t\t/** @type {Record<string, FilterFns>} */\n\t\tconst typeFilters = Object.hasOwn(allFilters, type) && allFilters[type] || {};\n\t\tallFilters[type] = typeFilters;\n\n\t\tfor (const op of Object.keys({ ...typeFilters, ...notTypeFilters })) {\n\t\t\tconst notOpFilters = Object.hasOwn(notTypeFilters, op) && notTypeFilters[op];\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\t/** @type {FilterFns} */\n\t\t\tconst opFilters = Object.hasOwn(typeFilters, op) && typeFilters[op] || { value: [], named: [], field: [], notValue: [], notNamed: [], notField: [] };\n\t\t\ttypeFilters[op] = opFilters;\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\tfor (const fn of notOpFilters.value) { opFilters.value.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notValue) { opFilters.notValue.push(fn); }\n\t\t\tfor (const fn of notOpFilters.named) { opFilters.named.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notNamed) { opFilters.notNamed.push(fn); }\n\t\t\tfor (const fn of notOpFilters.field) { opFilters.field.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notField) { opFilters.notField.push(fn); }\n\t\t}\n\t}\n\treturn allFilters;\n});\nconst filterState = createComputed(() => {\n\t/** @type {Map<string, Map<string, {component: FieldFilterComponent; label?: string}>>} */\n\tconst allFilters = new Map();\n\tfor (const field of allHooks.get('formFields').values()) {\n\t\tconst { type, array, renderer, filter, filters } = field;\n\t\tconst key = getSetKey(\n\t\t\ttypeof type === 'string' ? type : '',\n\t\t\ttypeof renderer === 'string' ? renderer : '',\n\t\t\tBoolean(array),\n\t\t);\n\t\tif (!key) { continue; }\n\t\t/** @type {Map<string, {component: FieldFilterComponent; label?: string}>} */\n\t\tconst filterMap = allFilters.get(key) || new Map();\n\t\tif (typeof filter === 'function') {\n\t\t\tconst item = filterMap.get('');\n\t\t\tif (!item) {\n\t\t\t\tfilterMap.set('', { component: filter, label: '=' });\n\t\t\t} else {\n\t\t\t\titem.component = filter;\n\t\t\t}\n\t\t}\n\t\tfor (const [operator, fieldFilter] of Object.entries(filters || {})) {\n\t\t\tif (!fieldFilter) { continue; }\n\t\t\tconst filter = Array.isArray(fieldFilter) ? fieldFilter[0]\n\t\t\t\t: typeof fieldFilter === 'function' ? fieldFilter\n\t\t\t\t\t: fieldFilter.filter;\n\t\t\tif (typeof filter !== 'function') { continue; }\n\t\t\tconst label = Array.isArray(fieldFilter) ? fieldFilter[1]\n\t\t\t\t: typeof fieldFilter === 'object' ? fieldFilter.label : null;\n\t\t\tconst item = filterMap.get(operator);\n\t\t\tif (!item) {\n\t\t\t\tfilterMap.set(operator, { component: filter, label: typeof label === 'string' ? label : '' });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\titem.component = filter;\n\t\t\tif (typeof label === 'string') { item.label = label; }\n\t\t}\n\t\tif (filterMap.size) {\n\t\t\tallFilters.set(key, filterMap);\n\t\t}\n\t}\n\treturn allFilters;\n});\n\nexport function getAllFilterFns() {\n\treturn filterFnState.get();\n}\n/**\n * \n * @param {string | {component: string; [k: string]: any} | (string | {component: string; [k: string]: any})[]} [def] \n * @returns {Iterable<[renderer: string, options?: object]>}\n */\nfunction* getRenderer(def) {\n\tif (!def) { return; }\n\tfor (const s of Array.isArray(def) ? def : [def]) {\n\t\tif (!s) { continue; }\n\t\tif (typeof s === 'string') {\n\t\t\tyield [s];\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof s !== 'object') { continue; }\n\t\tconst component = s.component;\n\t\tif (!component || typeof component !== 'string') { continue; }\n\t\tyield [component, s];\n\t}\n}\n/**\n * \n * @param {string | FieldScriptConfiguration} field \n * @returns {Iterable<[renderer: string, options?: object]>}\n */\nfunction* getKey(field) {\n\tif (!field) { return; }\n\tconst type = typeof field === 'string' ? field : field.type;\n\tconst renderers = typeof field === 'string' ? '' : field.renderer;\n\tconst array = typeof field === 'string' ? '' : field.array ? '[]' : '';\n\tif (!type) {\n\t\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\t\tyield [`:${renderer}${array}`, options];\n\t\t\tyield [`${renderer}${array}`, options];\n\t\t}\n\t\treturn;\n\t}\n\tif (typeof type === 'object') {\n\t\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\t\tyield [`submodel:${renderer}${array}`, options];\n\t\t\tyield [`${renderer}${array}`, options];\n\t\t}\n\t\tyield [`submodel${array}`];\n\t\treturn;\n\t}\n\tfor (const [renderer, options] of getRenderer(renderers)) {\n\t\tyield [`${type}:${renderer}${array}`, options];\n\t\tyield [`:${renderer}${array}`, options];\n\t\tyield [`${renderer}${array}`, options];\n\t}\n\tyield [`${type}${array}`];\n}\n\n/**\n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {false} [skip]\n * @returns {FieldComponent}\n */\n/**\n * \n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {true} skip\n * @returns {FieldComponent?}\n */\n/**\n * \n * @overload\n * @param {FieldScriptConfiguration} field \n * @param {boolean} [skip]\n * @returns {FieldComponent?}\n */\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {boolean} [skip]\n * @returns {FieldComponent?}\n */\nexport function getField(field, skip) {\n\tconst inputs = inputState.get();\n\tfor (const [k, options] of getKey(field)) {\n\t\tconst v = inputs.get(k);\n\t\tif (v) { return ctx => v(ctx, options); }\n\t}\n\tif (skip) { return null; }\n\tconst type = typeof field === 'string' ? field : field.type;\n\treturn () => document.createElement('div');\n}\n\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @returns {boolean}\n */\nexport function hasField(field) {\n\tconst inputs = inputState.get();\n\tfor (const [k] of getKey(field)) {\n\t\tconst v = inputs.get(k);\n\t\tif (v) { return true; }\n\t}\n\tconst type = typeof field === 'string' ? field : field.type;\n\treturn false;\n}\n\n\n\n/** @type {FieldFilterComponent} */\nconst defaultFieldFilter = () => document.createElement('div');\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {string} operator \n * @returns {FieldFilterComponent}\n */\nexport function getFieldFilter(field, operator) {\n\tconst filters = filterState.get();\n\tfor (const [k, options] of getKey(field)) {\n\t\tconst filter = filters.get(k)?.get(operator);\n\t\tif (!filter) { continue; }\n\t\tconst component = filter.component;\n\t\treturn ctx => component(ctx, options);\n\t}\n\treturn defaultFieldFilter;\n}\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @returns {Record<string, string>}\n */\nexport function getFieldFilterOperators(field) {\n\tconst filters = filterState.get();\n\tconst operators = Object.create(null);\n\tfor (const [k] of getKey(field)) {\n\t\tconst filter = filters.get(k);\n\t\tif (!filter) { continue; }\n\t\tfor (const [operator, { label }] of filter) {\n\t\t\tif (operators[operator]) { continue; }\n\t\t\toperators[operator] = label;\n\t\t}\n\t}\n\treturn operators;\n}\n\n/**\n * \n * @param {FieldScriptConfiguration} field \n * @param {string} operator \n * @returns {boolean}\n */\n\nexport function hasFieldFilter(field, operator) {\n\tconst filters = filterState.get();\n\tfor (const [k] of getKey(field)) {\n\t\tconst v = filters.get(k);\n\t\tif (v?.has(operator)) { return true; }\n\t}\n\treturn false;\n}\n\n/**\n * \n * @param {FieldScriptConfiguration | boolean} field \n * @param {string} operator \n */\nexport function* getFilterFns(field, operator) {\n\tconst filters = filterFnState.get();\n\tfor (const [k] of typeof field === 'boolean' ? field ? [['[]'], ['']] : [['']] : getKey(field)) {\n\t\tconst v = Object.hasOwn(filters, k) && filters[k];\n\t\tif (!v) { continue; }\n\t\tconst op = Object.hasOwn(v, operator) && v[operator];\n\t\tif (!op) { continue; }\n\t\tyield op;\n\t}\n\tconst k = '';\n\tconst v = Object.hasOwn(filters, k) && filters[k];\n\tif (!v) { return; }\n\tconst op = Object.hasOwn(v, operator) && v[operator];\n\tif (!op) { return; }\n\tyield op;\n}\n","export const pathRoots = {\n\tapi: '/api',\n\tfile: '/fileCabinets',\n};\nexport default pathRoots;\n","const regex = /^((?<Y>\\d+)-(?<M>\\d+)-(?<D>\\d+)[t| ])?(?<h>2[0-3]|[01]\\d):(?<m>[0-5]\\d)(?::(?<s>[0-5]\\d(?:(\\.\\d{1,3})?)))?(?<tz>z|[+-]\\d\\d(:?\\d\\d)?)?$/i;\n\nexport function toTimeZone(date = new Date) {\n\tlet tzo = date.getTimezoneOffset();\n\tif (!tzo) { return 'Z'; }\n\tconst s = tzo < 0 ? '+' : '-';\n\ttzo = Math.abs(tzo);\n\treturn s + [Math.floor(tzo / 60), tzo % 60].map(v => `${v}`.padStart(2, '0')).join(':');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTime(date) {\n\treturn [\n\t\tdate.getHours(),\n\t\tdate.getMinutes(),\n\t\tdate.getSeconds(),\n\t].map(v => `${v}`.padStart(2, '0')).join(':');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDate(date) {\n\treturn [\n\t\t`${date.getFullYear()}`.padStart(4, '0'),\n\t\t`${date.getMonth() + 1}`.padStart(2, '0'),\n\t\t`${date.getDate()}`.padStart(2, '0'),\n\t].join('-');\n}\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimetz(date) {\n\treturn toTime(date) + `.${date.getMilliseconds()}`.padStart(3, '0') + toTimeZone(date);\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toDatetime(date) {\n\treturn toDate(date) + ' ' + toTime(date);\n}\n\n/**\n * \n * @param {Date} date \n * @returns \n */\nexport function toTimestamp(date) {\n\treturn toDate(date) + 'T' + toTimetz(date);\n}\n\n/**\n * \n * @param {string | Date | null | number} [val] \n * @returns \n */\nexport function parseDate(val) {\n\tif (!val) { return null; }\n\tif (val instanceof Date) { return val.valueOf() ? val : null; }\n\tif (typeof val === 'number') { return new Date(val); }\n\tif (typeof val !== 'string') { return null; }\n\tconst groups = regex.exec(val)?.groups;\n\tif (!groups) { return null; }\n\tconst currentDate = new Date;\n\tconst { Y, M,D, h, m, s, tz } = groups\n\tconst tzx = tz === 'z' || tz === 'Z' || tz.includes(':') ? tz : tz ? `${tz}:00` : toTimeZone(currentDate);\n\treturn new Date(`${Y || currentDate.getFullYear()}-${M || currentDate.getMonth() + 1}-${D || currentDate.getDate()}T${h}:${m}:${s || '00'}${tzx}`);\n}\n","import DotRequest from 'dot-request';\nimport pathRoots from './paths.mjs';\nimport { toTimestamp } from './utils/date.mjs';\n\nclass ARequest extends DotRequest {\n\tbuild() {\n\t\treturn new ARequest();\n\t}\n\t/**\n\t * \n\t * @param {string} method \n\t * @param {string} [path] \n\t * @returns \n\t */\n\tmethod(method, path) {\n\t\treturn super.method('POST', path).header('X-Method', method);\n\t}\n}\n\n/**\n * \n * @param {Response} response \n * @returns \n */\nexport async function errorHandler(response) {\n\tconst contentType = response.headers.get(\"content-type\")\n\t\t?.split(';')[0].replace(/\\s+/g, '').toLowerCase() || '';\n\tif (contentType === 'application/json' || contentType === 'text/json') {\n\t\treturn await response.json().then(v => Promise.reject(v?.error), v => Promise.reject(null));\n\t}\n\tif (contentType === \"text/plain\") {\n\t\treturn await response.text().then(v => Promise.reject(v));\n\t}\n\treturn Promise.reject(response);\n}\n/**\n * \n * @param {Response} r \n * @returns \n */\nexport function userErrorHandler(r) {\n\tif (r.status === 401) {\n\t\t// logout();\n\t}\n\treturn errorHandler(r);\n\n}\n/**\n * @callback ErrorAlerter\n * @param {*} error \n * @returns {PromiseLike<void> | void}\n */\n/**\n * @param {*} error \n * @returns {PromiseLike<void> | void}\n */\nexport function ErrorAlerter(error) {\n\tif (!error || error instanceof Response) { return alert('未知'); }\n\tif (typeof error === 'string') { return alert(error); }\n\tif (typeof error !== 'object') { return; }\n\tlet { message, code } = error;\n\tif (typeof message !== 'string') { message = ''; }\n\tif (typeof code !== 'string') { code = ''; }\n\tif (!message && !code) { return; }\n\talert([\n\t\tmessage || '为止错误',\n\t\tcode ? `[${code}]` : '',\n\t].filter(Boolean).join(' '));\n}\n/** @type {ErrorAlerter} */\nlet alertError = ErrorAlerter;\n/**\n * \n * @param {Response} r \n * @returns \n */\nexport function errorShowHandler(r) {\n\treturn userErrorHandler(r).catch(async error => {\n\t\tawait alertError(error);\n\t\treturn Promise.reject(error);\n\t});\n}\n\nexport const baseRequest = new ARequest().get().prefix(pathRoots.api).stringifyJSON(v => {\n\treturn JSON.stringify(v, (key, value) => {\n\t\tif (value instanceof Date) { return toTimestamp(value); }\n\t\tif (typeof value === 'bigint') { return String(value); }\n\t\tif (value instanceof Set) { return [...value]; }\n\t\treturn value;\n\t});\n}).errorHandler(errorHandler);\nconst request = baseRequest.clone().errorHandler(errorShowHandler);\nexport default request;\n/**\n * \n * @param {ErrorAlerter?} [fn] \n */\nexport function setErrorAlerter(fn) {\n\tif (typeof fn === 'function') { alertError = fn; }\n}\n","import { baseRequest } from './request.mjs';\nimport { createState } from './signal.mjs';\n/** @import { Plugin, BootConfiguration } from '@yongdall/common' */\n\n/** @type {BootConfiguration} */\nexport const configuration = await baseRequest.clone().get`application`.query({\n\tdomain: location.hostname,\n\tport: location.port,\n\tpath: location.pathname,\n}).json();\n\n/** @type {Record<string, Plugin>} */\n// @ts-ignore\nexport const plugins = window.yongdallPlugins;\n\nconst applicationId = configuration.id;\nexport const pages = configuration.pages || {};\n\n\nconst webRoot = new URL(configuration.path || '/workbench/', location.origin);\nconst root = webRoot.href;\nconst path = webRoot.pathname;\n\nconst menus = createState(configuration.menus || []);\nconst userMenus = createState(configuration.userMenus || []);\n\nconst refreshing = createState(false);\nasync function refresh() {\n\tif (refreshing.get()) { return; }\n\trefreshing.set(true);\n\ttry {\n\t\t/** @type {BootConfiguration} */\n\t\tconst application = await baseRequest.clone().get`applications`.append(`${applicationId}`).json();\n\t\tif (!configuration || typeof application !== 'object') { return; }\n\t\tmenus.set(application.menus || []);\n\t\tuserMenus.set(application.userMenus || []);\n\n\n\t} finally {\n\t\trefreshing.set(false);\n\n\t}\n}\n\n\nexport const application = {\n\tget id() { return applicationId; },\n\tget path() { return path; },\n\tget root() { return root; },\n\n\tget theme() { return configuration.theme; },\n\tget route() { return configuration.route; },\n\tget authenticator() { return configuration.authenticator; },\n\tget type() { return configuration.type; },\n\tget skin() { return configuration.skin; },\n\n\n\tget menus() { return menus.get(); },\n\tget userMenus() { return userMenus.get(); },\n\tget logo() { return configuration.logo; },\n\tget title() { return configuration.title; },\n\tget company() { return configuration.company; },\n\tget help() { return configuration.help; },\n\n\tget refreshing() { return refreshing.get(); },\n\trefresh,\n};\n\nexport default configuration;\n","\n/**\n * @template {(...args: any) => any} T\n * @param {T} fn \n * @param {(...p: Parameters<T>) => string} getKey \n * @param {(...p: Parameters<T>) => boolean} [isForce] \n * @returns {T}\n */\nexport function createStates(fn, getKey, isForce) {\n\t/** @type {Record<string, ReturnType<T>>} */\n\tconst data = {};\n\t/**\n\t * @param {Parameters<T>} params\n\t * @returns {ReturnType<T>}\n\t */\n\t function run(...params) {\n\t\tconst key = getKey(...params);\n\t\tif (Object.hasOwn(data, key) && !isForce?.(...params)) {\n\t\t\treturn data[key];\n\t\t}\n\t\tconst result = fn(...params);\n\t\tdata[key] = result;\n\t\treturn result;\n\t};\n\treturn /** @type {T} */(run);\n}\n","/** @import { Permissions } from '@yongdall/types' */\n/** @import { State } from './signal.mjs' */\nimport { configuration } from './configuration.mjs';\nimport { createStates } from './utils/state.mjs';\nimport { baseRequest } from './request.mjs';\nimport { allHooks } from './allHooks.mjs';\nimport { createComputed, createState } from './signal.mjs';\nconst { authRequired, multiUser, userType } = configuration;\n\nconst visitor = userType === 'visitor';\n/**\n * 用户类型定义\n * @typedef {Object} User\n * @property {string} id - 用户ID\n * @property {string} name - 显示名称\n * @property {string} [avatar] - 用户头像\n * @property {string[]} [permissions]\n * @property {Record<string, string[]>} [organizationPermissions]\n * @property {Record<string, string[]>} [organizationRoles]\n * @property {Record<string, string[]>} [organizationRolePermissions]\n * @property {Record<string, Record<string, any>>} [plugins] \n */\n\n/** @type {State<User?>} */\nconst sessionUserState = createState(/** @type {User?} */(null));\n/** @type {State<User?>} */\nconst visitorState = createState(/** @type {User?} */(null));\n/** @type {State<User?>} */\nconst targetUserState = createState(/** @type {User?} */(null));\nconst currentUserState = createComputed(() => targetUserState.get() || sessionUserState.get());\n\n\n/** @type {<T extends Record<string, any>>(pluginId: string) => { readonly session: T?; readonly target: T?; readonly current: T?}} */\nconst userPlugin = createStates((pluginId) => {\n\tif (visitor) {\n\t\treturn {\n\t\t\tget session() { return null; },\n\t\t\tget target() { return null; },\n\t\t\tget current() { return null; },\n\t\t};\n\t}\n\t/** @type {State<any?>} */\n\tconst session = createComputed(() => sessionUserState.get()?.plugins?.[pluginId] || null);\n\t/** @type {State<any?>} */\n\tconst target = createComputed(() => targetUserState.get()?.plugins?.[pluginId] || null);\n\t/** @type {State<any?>} */\n\tconst current = createComputed(() => currentUserState.get()?.plugins?.[pluginId] || null);\n\treturn {\n\t\tget session() { return session.get(); },\n\t\tget target() { return target.get(); },\n\t\tget current() { return current.get(); },\n\t};\n}, pluginId => pluginId || '');\n\nconst single = createState(false);\nconst needLogin = createState(false);\nconst waitLogin = createComputed(() => {\n\tif (needLogin.get()) { return true; }\n\tif (!authRequired) { return false; }\n\tif (single.get()) { return false; }\n\tif (sessionUserState.get()) { return false; }\n\treturn true;\n});\n\n\n/**\n * @param {string[]} permissions \n * @returns {Set<string>}\n */\nfunction toPermissions(permissions) {\n\treturn new Set(permissions.filter(v => v && typeof v === 'string'));\n\n}\n/**\n * \n * @param {User} user \n * @returns {Set<string>}\n */\nfunction getPermissions(user) {\n\tconst plugins = user.plugins;\n\tif (plugins && typeof plugins === 'object') {\n\t\tfor (const [pluginId, get] of allHooks.get('user').get('permissions')) {\n\t\t\tif (typeof get !== 'function') { continue; }\n\t\t\tif (!Object.hasOwn(plugins, pluginId)) { continue; }\n\t\t\tconst plugin = plugins[pluginId];\n\t\t\tif (!plugin || typeof plugin !== 'object') { continue; }\n\t\t\tconst p = get(plugin, user);\n\t\t\tif (!(p instanceof Set)) { continue; }\n\t\t\treturn p;\n\t\t}\n\t}\n\tconst permissions = user.permissions;\n\tif (!Array.isArray(permissions)) { return new Set(); }\n\treturn toPermissions(permissions);\n}\n/**\n * \n * @param {User} user \n * @returns {Record<string, Set<string>>?}\n */\nfunction getOrganizationPermissions(user) {\n\tconst plugins = user.plugins;\n\tif (plugins && typeof plugins === 'object') {\n\t\tfor (const [pluginId, get] of allHooks.get('user').get('organizationPermissions')) {\n\t\t\tif (typeof get !== 'function') { continue; }\n\t\t\tif (!Object.hasOwn(plugins, pluginId)) { continue; }\n\t\t\tconst plugin = plugins[pluginId];\n\t\t\tif (!plugin || typeof plugin !== 'object') { continue; }\n\t\t\tconst p = get(plugin, user);\n\t\t\tif (!p) { continue; }\n\t\t\treturn Object.assign(Object.create(null), p);\n\t\t}\n\t}\n\tconst permissions = user.organizationPermissions;\n\tif (permissions && typeof permissions === 'object' && !Array.isArray(permissions)) {\n\t\tconst list = Object.entries(permissions).filter(v => Array.isArray(v[1]));\n\t\tif (list.length) {\n\t\t\treturn Object.assign(\n\t\t\t\tObject.create(null),\n\t\t\t\tObject.fromEntries(list.map(([k, v]) => [k, toPermissions(v)])),\n\t\t\t);\n\t\t}\n\t}\n\tconst { organizationRolePermissions: rolePermissions, organizationRoles: roles } = user;\n\tif (!roles || typeof roles !== 'object' || Array.isArray(roles)) {\n\t\treturn null;\n\t}\n\tif (!rolePermissions || typeof rolePermissions !== 'object' || Array.isArray(rolePermissions)) {\n\t\treturn null;\n\t}\n\treturn Object.assign(\n\t\tObject.create(null),\n\t\tObject.fromEntries(Object.entries(roles).map(([k, v]) => {\n\t\t\tconst permissions = v.flatMap(roleId => Object.hasOwn(rolePermissions, roleId) && rolePermissions[roleId] || []);\n\t\t\treturn [k, toPermissions(permissions)];\n\t\t})),\n\t);\n}\n/** @type {State<Set<string>?>} */\nconst permissions = createComputed(() => {\n\tconst user = currentUserState.get();\n\tif (!user) { return null; }\n\treturn getPermissions(user);\n});\n/** @type {State<Record<string, Set<string>>?>} */\nconst organizationPermissions = createComputed(() => {\n\tconst user = currentUserState.get();\n\tif (!user) { return null; }\n\treturn getOrganizationPermissions(user);\n});\n\nconst allOrganizationPermissions = createComputed(() => {\n\tconst all = organizationPermissions.get();\n\tif (!all) { return null; }\n\treturn new Set(Object.values(all).flatMap(v => [...v]));\n});\n\n/** @returns {Permissions} */\nfunction createPermissions() {\n\tif (single.get()) {\n\t\treturn { has: () => true, get size() { return -1; } };\n\t}\n\treturn new Set();\n}\nexport const User = {\n\tget visitor() { return visitor; },\n\tget multi() { return visitor || Boolean(multiUser); },\n\tget single() { return single.get(); },\n\t/** 登陆用户 */\n\tget session() { return visitor ? visitorState.get() : sessionUserState.get(); },\n\t/** 切换用户 */\n\tget target() { return visitor ? null : targetUserState.get(); },\n\t/** 当前用户 */\n\tget current() { return visitor ? visitorState.get() : currentUserState.get(); },\n\t/** @param {string} permission */\n\thasPermission(permission) {\n\t\tif (visitor) { return false; }\n\t\treturn permissions.get()?.has(permission) ?? single.get();\n\t},\n\t/** @param {string} permission @param {string} [organization] */\n\thasOrganizationPermission(permission, organization) {\n\t\tif (visitor) { return false; }\n\t\tif (typeof organization !== 'string') {\n\t\t\treturn allOrganizationPermissions.get()?.has(permission) ?? single.get();\n\t\t}\n\n\t\tconst organizations = organizationPermissions.get();\n\t\tif (!organizations) { return single.get(); }\n\t\tif (!Object.hasOwn(organizations, organization)) { return false; }\n\t\treturn organizations[organization]?.has(permission) ?? false;\n\t},\n\t/** @returns {Permissions} */\n\tget permissions() {\n\t\tif (visitor) { return new Set(); }\n\t\treturn permissions.get() || createPermissions();\n\t},\n\t/** @returns {Record<string, Permissions | undefined>} */\n\tget organizationPermissions() {\n\t\tif (visitor) { return Object.create(null); }\n\t\treturn organizationPermissions.get() || new Proxy({}, {\n\t\t\tget() { return createPermissions(); }\n\t\t});\n\t},\n\t/** @returns {Permissions} */\n\tget allOrganizationPermissions() {\n\t\tif (visitor) { return new Set(); }\n\t\treturn allOrganizationPermissions.get() || createPermissions();\n\t},\n\tget waitLogin() { return waitLogin.get(); },\n\t/**\n\t * @template {Record<string, any>} T\n\t * @param {string} pluginId \n\t * @returns {{ readonly session: T?; readonly target: T?; readonly current: T?}}\n\t */\n\tplugin(pluginId) { return userPlugin(pluginId); },\n\tasync load() {\n\t\tif (visitor) {\n\t\t\tconst { visitor } = await baseRequest.clone().get`visitor`.json().then(v => v || {}, () => ({}));\n\t\t\tsingle.set(false);\n\t\t\tvisitorState.set(visitor || null);\n\t\t\tif (visitor) { needLogin.set(false); }\n\t\t\treturn Boolean(visitor);\n\t\t}\n\t\tconst { session, target } = await baseRequest.clone().get`user`.json().then(v => v || {}, () => ({}));\n\t\ttargetUserState.set(target || null);\n\t\tif (session === true) {\n\t\t\tsingle.set(true);\n\t\t\tsessionUserState.set(null);\n\t\t} else {\n\t\t\tsingle.set(false);\n\t\t\tsessionUserState.set(session || null);\n\t\t}\n\t\tif (session) { needLogin.set(false); }\n\t\treturn Boolean(session);\n\t},\n\texit() {\n\t\tif (visitor) {\n\t\t\tvisitorState.set(null);\n\t\t\tbaseRequest.clone().delete`visitor`.done();\n\t\t\treturn;\n\t\t}\n\t\ttargetUserState.set(null);\n\t\tsessionUserState.set(null);\n\t\tbaseRequest.clone().delete`user`.done();\n\t},\n\tlogin(login = true) {\n\t\tneedLogin.set(Boolean(login));\n\t},\n};\n","/** @import { FieldScriptConfiguration, ModelConfiguration, ModelScriptConfiguration } from './types.mjs' */\n\n/**\n * \n * @param {string | string[] | null | void} permission \n */\n\nexport function flatPermission(permission) {\n\tif (!permission) { return []; }\n\tconst list = typeof permission === 'string' ? permission.split('\\n') : permission;\n\tif (!Array.isArray(list)) { return []; }\n\treturn list.filter(v => v && typeof v === 'string');\n\n}\n\n/**\n * \n * @param {object} [options] \n * @param {{has(permission: string): boolean}} [options.permissions] \n * @param {{has(permission: string): boolean}} [options.allOrganizationPermissions] \n * @param {Record<string, {has(permission: string): boolean} | null | undefined>} [options.organizationPermissions] \n * @param {{has(authorization: string): boolean}?} [options.authorizations] \n * @returns {(p: string) => boolean}\n */\nexport function toPermissionFilter({\n\tpermissions,\n\torganizationPermissions,\n\tallOrganizationPermissions,\n\tauthorizations,\n} = {}) {\n\treturn permission => {\n\t\tif (permission[0] === '#') { return authorizations?.has(permission.slice(1)) || false; }\n\t\tconst index = permission.indexOf('&');\n\t\tif (index < 0) { return permissions?.has(permission) || false; }\n\t\tconst orgPerm = permission.slice(0, index);\n\t\tif (!orgPerm) { return false; }\n\t\tconst organization = permission.slice(index + 1);\n\t\tif (!organization) { return allOrganizationPermissions?.has(orgPerm) || false; }\n\t\treturn organizationPermissions?.[organization]?.has(orgPerm) || false;\n\t};\n}\n\n/**\n * \n * @param {string | string[] | null | void} permission \n * @param {{has(permission: string): boolean}} permissions \n * @param {{has(authorization: string): boolean}?} [authorizations] \n */\nexport function filterPermission(permission, permissions, authorizations) {\n\tif (!permission) { return true; }\n\tconst array = flatPermission(permission);\n\tif (!array.length) { return true; }\n\tconst filter = toPermissionFilter({ permissions, authorizations });\n\treturn Boolean(array.find(filter));\n}\n/** @import { Field, Permission } from '@yongdall/types' */\n\nimport { User } from './user.mjs';\n\n/**\n * \n * @param {Permission['constraints']} constraints \n * @param {Record<string, any>?} [data] \n */\nexport function testPermissionConstraints(constraints, data) {\n\tif (!constraints || !data || typeof data !== 'object') { return true; }\n\tfor (const [field, constraint] of Object.entries(constraints)) {\n\t\tif (!constraint) { continue; }\n\t\tconst { value, values, user } = constraint;\n\t\tconst val = data[field];\n\t\tif (value !== undefined) {\n\t\t\tif (val !== value) { return false; }\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tif (!values.includes(val)) { return false; }\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tif (!values.has(val)) { return false; }\n\t\t} else if (user) {\n\t\t\tif (!User.single && val !== User.current?.id) { return false; }\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * \n * @param {Permission} permission \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n * @param {string} [fieldName] \n */\nexport function testPermission({ permission, organizationField, constraints }, data, isNew, fieldName) {\n\tif (!testPermissionConstraints(constraints, data)) { return false; }\n\tif (!permission) { return true; }\n\tif (!organizationField) {\n\t\treturn User.hasPermission(permission);\n\t}\n\tif (organizationField === '_') {\n\t\tif (isNew) {\n\t\t\tif (User.hasOrganizationPermission(permission)) { return true; }\n\t\t}\n\t\treturn false;\n\t}\n\tif (isNew) { return true; }\n\tif (organizationField === fieldName) { return true; }\n\tconst val = String(data?.[organizationField] || '');\n\tif ((!isNew || val)) {\n\t\tif (User.hasOrganizationPermission(permission, val || '')) { return true; }\n\t}\n\treturn true;\n}\n\n/**\n * \n * @param {Permission[]} permissionList \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n */\nexport function getAuthorizations(permissionList, data, isNew) {\n\tconst list = permissionList.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return true; }\n\t\tif (Array.isArray(authorizations)) { return true; }\n\t}).filter(permission => testPermission(permission, data, isNew))\n\t\t.flatMap(({ authorizations }) => authorizations ? [...authorizations] : []);\n\treturn new Set(list);\n}\n\n\n/**\n * \n * @param {string} authorization \n * @param {Permission[]} permissions \n * @param {Record<string, any>} [data] \n * @param {boolean} [isNew] \n * @param {string} [fieldName] \n */\nexport function testPermissions(authorization, permissions, data, isNew, fieldName) {\n\tconst list = permissions.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return authorizations.has(authorization); }\n\t\tif (Array.isArray(authorizations)) { return authorizations.includes(authorization); }\n\t});\n\treturn Boolean(list.find(permission => testPermission(permission, data, isNew, fieldName)));\n}\n/**\n * \n * @param {string} authorization \n * @param {Permission[]} permissions \n * @param {ModelConfiguration | ModelScriptConfiguration} model \n * @returns {Set<string>}\n */\nexport function getPermissionFields(authorization, permissions, model) {\n\tconst userPermissions = permissions.filter(({ authorizations }) => {\n\t\tif (authorizations instanceof Set) { return authorizations.has(authorization); }\n\t\tif (Array.isArray(authorizations)) { return authorizations.includes(authorization); }\n\t}).filter(({ permission, organizationField }) => {\n\t\tif (!permission) { return true; }\n\t\tif (!organizationField) {\n\t\t\treturn User.hasPermission(permission);\n\t\t}\n\n\t\treturn User.hasOrganizationPermission(permission);\n\t});\n\tif (!userPermissions?.length) { return new Set(); }\n\tconst groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tconst fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\tif (!(groups.size + fieldsAuth.size)) { return new Set(); }\n\n\t/**\n\t *\n\t * @param {[string, (Field | FieldScriptConfiguration) & {group?: string}][]} fields\n\t * @param {string[]} parent\n\t * @returns {Iterable<string>}\n\t */\n\tfunction* filter(fields, parent) {\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif (!field.primary && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tyield key;\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object') { continue; }\n\t\t\tyield* filter(Object.entries(type), fieldNames);\n\t\t}\n\n\t}\n\treturn new Set(filter(Object.entries(model.fields), []));\n\n}\n","/** @import { Schema, Store, StoreLayout } from '@neeloong/form' */\n/** @import { Permission } from '@yongdall/types' */\n/** @import { FieldComponents } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { testPermissions } from '../permission.mjs';\nimport { User } from '../user.mjs';\n\n/**\n * \n * @param {Store} store \n */\nfunction createStoreValueProxy(store) {\n\treturn new Proxy({}, {\n\t\tget(target, p, receiver) {\n\t\t\treturn store.value?.[p];\n\t\t},\n\t\tset() { return false; },\n\t});\n}\n/**\n * \n * @param {string} fieldName\n * @param {boolean?} [def] \n * @param {Permission[]} [permissions]\n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createReadOnlyValue(fieldName, def, permissions, script) {\n\t/** @type {((store: Store) => boolean)?} */\n\tconst f = permissions?.length ? (s) => {\n\t\tconst root = s.root;\n\t\tconst isNew = root.new;\n\t\tconst authorization = isNew ? 'create' : 'update';\n\t\treturn !testPermissions(authorization, permissions, createStoreValueProxy(root), isNew, fieldName);\n\t} : null;\n\tif (typeof script === 'function' && f) {\n\t\treturn (s) => f(s) || Boolean(script(s));\n\t}\n\tif (f) { return f; }\n\tif (typeof script === 'function') {\n\t\treturn (s) => Boolean(script(s));\n\t}\n\treturn typeof def === 'boolean' ? def : null;\n}\n/**\n * \n * @param {string} fieldName\n * @param {FieldScriptConfiguration} field\n * @param {boolean?} [def] \n * @param {Permission[]} [permissions]\n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createHiddenValue(fieldName, field, def, permissions, script) {\n\t/** @type {((store: Store) => boolean)[]} */\n\tconst fns = [];\n\tif (typeof script === 'function') {\n\t\tfns.push(script);\n\t} else if (def === true) {\n\t\treturn true;\n\t}\n\tif (field.uncreatable) {\n\t\tfns.push(store => store.root.new);\n\t}\n\tif (permissions) {\n\t\tfns.push(permissions.length ? (s) => {\n\t\t\tconst root = s.root;\n\t\t\tconst isNew = root.new;\n\t\t\treturn !testPermissions('read', permissions, createStoreValueProxy(root), isNew, fieldName);\n\t\t} : () => !User.single);\n\t}\n\tif (!fns.length) { return null; }\n\treturn (s) => {\n\t\tfor (const f of fns) {\n\t\t\tif (f(s)) { return true; }\n\t\t}\n\t\treturn false;\n\t};\n}\n/**\n * \n * @param {boolean?} [def] \n * @param {((store: Store) => boolean)?} [script] \n * @returns {boolean | ((store: Store) => boolean) | null}\n */\nfunction createBoolValue(def, script) {\n\tif (typeof script === 'function') {\n\t\treturn (s) => Boolean(script(s));\n\t}\n\treturn typeof def === 'boolean' ? def : null;\n}\n/**\n * \n * @param {FieldScriptConfiguration} field\n * @param {string} name\n * @param {Permission[]?} [permissions] \n * @returns {Schema.Attr}\n */\nfunction createAttr(field, name, permissions) {\n\tconst fieldGroup = field.group || '';\n\tconst script = field.script || {};\n\tconst fieldPermission = permissions?.filter(({ group, fields }) => {\n\t\tif (group === fieldGroup) { return true; }\n\t\tif (Array.isArray(group) && group.includes(fieldGroup)) { return true; }\n\t\tif (fields === name || fields === '*') { return true; }\n\t\tif (!Array.isArray(fields)) { return false; }\n\t\tif (fields.includes(name) || fields.includes('*')) { return true; }\n\t});\n\treturn {\n\t\tmeta: field,\n\t\thidden: createHiddenValue(name, field, field.layout?.hidden, fieldPermission, script?.hidden),\n\t\treadonly: createReadOnlyValue(name, field.readonly, fieldPermission, script.readonly),\n\t\trequired: createBoolValue(field.required, script.required),\n\t\tclearable: createBoolValue(field.clearable, script.clearable),\n\t\tdisabled: createBoolValue(field.disabled, script.disabled),\n\t\tcreatable: !field.uncreatable,\n\t\timmutable: field.immutable,\n\t\tlabel: field.label || name,\n\t\tdescription: field.description,\n\t\tplaceholder: field.placeholder,\n\t\tstep: field.step,\n\t\tmax: field.max,\n\t\tmin: field.min,\n\t\tdefault: script.default || field.default,\n\t\tvalidator: script.validator,\n\t\tvalidators: script.validators,\n\n\t\tevents: {\n\t\t\tinput: script.input,\n\t\t\tchange: script.change,\n\t\t\tclick: script.click,\n\t\t\tfocus: script.focus,\n\t\t\tblur: script.blur,\n\t\t},\n\t};\n}\n/**\n * \n * @param {Record<string, FieldScriptConfiguration>} fields \n * @param {FieldComponents} components \n * @param {Permission[]?} [permissions] \n */\nexport default function toSchema(fields, components, permissions) {\n\t/** @type {Schema} */\n\tlet schema = Object.create(null);\n\tfor (const [name, field] of Object.entries(fields)) {\n\t\tconst component = components[name];\n\t\tconst type = field.type;\n\t\tconst layout = field.layout || {};\n\t\tif (typeof type !== 'object' || !type) {\n\t\t\tschema[name] = {\n\t\t\t\t...createAttr(field, name, permissions),\n\t\t\t\ttype,\n\t\t\t\tarray: Boolean(field.array),\n\t\t\t\tcomponent: typeof component === 'function' ? component : field.script?.component,\n\t\t\t\tlayout: {\n\t\t\t\t\tfield: name,\n\t\t\t\t\tcolStart: layout.colStart,\n\t\t\t\t\tcolSpan: layout.colSpan,\n\t\t\t\t\tcolEnd: layout.colEnd,\n\t\t\t\t\trowStart: layout.rowStart,\n\t\t\t\t\trowSpan: layout.rowSpan,\n\t\t\t\t\trowEnd: layout.rowEnd,\n\t\t\t\t},\n\t\t\t};\n\t\t\tcontinue;\n\n\t\t}\n\t\tconst fields = Object.entries(type).filter(\n\t\t\t/** @type {(v: [string, any]) => v is [string, FieldScriptConfiguration]} */(([, v]) => Boolean(v))\n\t\t);\n\t\tconst levelKey = layout.levelKey || '';\n\t\t/** @type {StoreLayout.Column<any>[]} */\n\t\tconst columns = [];\n\t\tif (levelKey) {\n\t\t\tif (Array.isArray(layout.columns)) {\n\t\t\t\tfor (const { action, actions, field, placeholder, width } of layout.columns) {\n\t\t\t\t\tif (field || width || placeholder) {\n\t\t\t\t\t\tif (field || width) {\n\t\t\t\t\t\t\tcolumns.push({ field, width });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (placeholder && !width) {\n\t\t\t\t\t\t\tcolumns.push({ placeholder });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!columns.length) {\n\t\t\t\tcolumns.push({ actions: ['collapse', 'move'] });\n\t\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t\t.map(([field, define]) => field);\n\t\t\t\tfor (const c of list) {\n\t\t\t\t\tcolumns.push({ field: c });\n\t\t\t\t}\n\t\t\t\tcolumns.push({ placeholder: 1 });\n\t\t\t\tcolumns.push({ actions: ['add', 'remove'] });\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (Array.isArray(layout.columns)) {\n\t\t\t\tfor (const { action, actions, field } of layout.columns) {\n\t\t\t\t\tif (field) {\n\t\t\t\t\t\tcolumns.push({ field });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!columns.length) {\n\t\t\t\tcolumns.push({ actions: ['add', 'trigger', 'move', 'remove', 'serial'] });\n\t\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t\t.map(([field, define]) => field);\n\t\t\t\tfor (const c of list) {\n\t\t\t\t\tcolumns.push({ field: c });\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = toSchema(type, typeof component !== 'function' && component || {}, permissions);\n\n\t\tschema[name] = {\n\t\t\t...createAttr(field, name, permissions),\n\t\t\tlayout: {\n\t\t\t\tfield: name,\n\t\t\t\tfields: Object.entries(children)\n\t\t\t\t\t.sort(([a], [b]) => (type[a]?.layoutOrder || 0) - (type[b]?.layoutOrder || 0))\n\t\t\t\t\t.map(([field, s]) => ({ ...s.layout, field })),\n\t\t\t\tcolumns,\n\t\t\t\tarrayStyle: levelKey ? 'tree' : 'table',\n\t\t\t\tlevelKey,\n\t\t\t\tcolStart: layout.colStart,\n\t\t\t\tcolSpan: layout.colSpan,\n\t\t\t\tcolEnd: layout.colEnd,\n\t\t\t\trowStart: layout.rowStart,\n\t\t\t\trowSpan: layout.rowSpan,\n\t\t\t\trowEnd: layout.rowEnd,\n\t\t\t},\n\t\t\ttype: children,\n\t\t\tarray: Boolean(field.array),\n\t\t\tcomponent: typeof component === 'function' ? component : field.script?.component,\n\t\t};\n\t}\n\treturn schema;\n}\n","/** @import { Importmap } from '@yongdall/common' */\n\n\n/** @type {Importmap} */\nexport let importmap = {imports: {}, scopes: {}};\ntry {\n\tconst {imports = {}, scopes = {}} = JSON.parse(document.querySelector('script[type=importmap]')?.textContent || '');\n\timportmap = {imports, scopes}\n} catch {\n\n}\n\nexport { importmap as default }\n","import { findPluginIdRegex } from '@yongdall/common';\nimport { plugins } from './configuration.mjs';\nimport importmap from './importmap.mjs';\n\n/**\n * @template T\n * @overload\n * @param {string} [id] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\n/**\n * @template T\n * @overload\n * @param {string} [id] \n * @param {string} [pluginId] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\n/**\n * @template T\n * @param {string} [id] \n * @param {((f: string) => Promise<object>) | string} [pluginId] \n * @param {(f: string) => Promise<object>} [importFile] \n * @returns {Promise<T | undefined>}\n */\nexport async function importWidget(id, pluginId, importFile) {\n\tif (!id) { return; }\n\tif (id[0] === ':') {\n\t\t// TODO: 表示数据库内脚本\n\t}\n\tconst index = id.indexOf('#');\n\tlet file = index < 0 ? id : id.slice(0, index);\n\tif (pluginId && typeof pluginId === 'string') {\n\t\tif (!file || file === '@') {\n\t\t\tfile = pluginId;\n\t\t} else if (file.startsWith('@/')) {\n\t\t\tfile = pluginId + file.slice(1);\n\t\t}\n\t}\n\tconst importFn = [pluginId, importFile].find(\n\t\t/** @type {(v: any) => v is ((f: string) => Promise<object>)} */(\n\t\t\tv => typeof v === 'function'\n\t\t)\n\t) || ((f) => import(f));\n\n\t/** @type {any} */\n\tconst mod = await importFn(file).catch((e) => { console.error(e); });\n\tif (index < 0) { return mod; }\n\tconst key = id.slice(index + 1);\n\tif (!key) { return mod.default; }\n\tlet val = mod;\n\tfor (const k of key.split('.')) {\n\t\tif (!val || typeof val !== 'object') { return; }\n\t\tval = val[k];\n\t}\n\treturn val;\n}\n/**\n * \n * @param {string} path \n * @param {Record<string, string>?} [scope] \n */\nfunction findImport(path, scope) {\n\tif (!scope) { return null; }\n\tconst p = scope[path];\n\tif (p) { return p; }\n\tlet length = 0;\n\t/** @type {string} */\n\tlet base = '';\n\tfor (const item of Object.entries(scope)) {\n\t\tconst [key, target] = item;\n\t\tif (key[key.length - 1] !== '/') { continue; }\n\t\tif (path.startsWith(key) && key.length > length) {\n\t\t\tlength = key.length;\n\t\t\tbase = target;\n\t\t}\n\t}\n\tif (!length) { return null; }\n\tif (base[base.length - 1] !== '/') {\n\t\tbase += '/';\n\t}\n\n\treturn base + path.slice(length);\n\n}\n/**\n * \n * @param {string} path \n * @param {string} root \n */\nfunction importMap(path, root) {\n\tlet bestScopeMatch = '';\n\t/** @type {Record<string, string>?} */\n\tlet scope = null;\n\tfor (const [scopeName, scopeMap] of Object.entries(importmap.scopes)) {\n\t\tif (root.startsWith(scopeName) && scopeName.length > bestScopeMatch.length) {\n\t\t\tbestScopeMatch = scopeName;\n\t\t\tscope = scopeMap;\n\t\t}\n\t}\n\treturn findImport(path, scope) || findImport(path, importmap.imports);\n}\n\n/**\n * 加载样式\n * @param {string} url \n * @param {string} [plugin] \n * @param {boolean} [pluginOnly] \n * @returns {string}\n */\nfunction importURL(url, plugin, pluginOnly) {\n\tconst s = !(pluginOnly && plugin) && findPluginIdRegex.exec(url)?.groups;\n\tif (s) {\n\t\tconst { pluginId, path } = s;\n\t\tconst pluginDefine = Object.hasOwn(plugins, pluginId) && plugins[pluginId] || {};\n\t\tconst VERSION = pluginDefine.version || 'VERSION';\n\t\tconst root = `/assets/plugins/${pluginId}/${VERSION}/`;\n\t\tconst base = location.origin + root;\n\t\tconst u = pluginDefine.assets?.[path] || importMap(url, root);\n\t\tif (u) { return new URL(u, base).href; }\n\n\n\t}\n\n\tconst pluginDefine = plugin && plugins[plugin] || {};\n\tconst VERSION = pluginDefine.version || 'VERSION';\n\tconst root = plugin ? `/assets/plugins/${plugin}/${VERSION}/` : '';\n\t// TODO: 路径处理\n\tconst base = plugin ? location.origin + root : location.href;\n\tif (plugin && url[0] !== '.' && url[0] !== '/') {\n\t\t// TODO: 路径转换\n\t}\n\tconst u = pluginDefine.assets?.[url] || root && importMap(url, root) || url;\n\treturn new URL(u, base).href;\n\n}\n/** @type {Record<string, Promise<HTMLLinkElement>>} */\nconst importCSSMap = Object.create(null);\n/**\n * 加载样式\n * @param {string} url \n * @param {string} [plugin] \n * @param {boolean} [pluginOnly] \n * @returns {Promise<HTMLLinkElement>}\n */\nexport function importStyle(url, plugin, pluginOnly) {\n\tconst link = document.createElement('link');\n\tconst href = importURL(url, plugin, pluginOnly);\n\tconst p = importCSSMap[href];\n\tif (p) { return p; }\n\tconst promise = new Promise((resolve, reject) => {\n\t\tlink.addEventListener('load', () => resolve(link));\n\t\tlink.addEventListener('error', (e) => reject(e.error));\n\t\tlink.href = href;\n\t\tlink.rel = \"stylesheet\";\n\t\tdocument.head.appendChild(link);\n\t});\n\timportCSSMap[href] = promise;\n\tpromise.catch(() => {\n\t\tif (p !== importCSSMap[href]) { return; }\n\t\tdelete importCSSMap[href];\n\t})\n\treturn promise;\n}\n","export class ResponseError extends Error {\n\t/**\n\t * \n\t * @param {number} status \n\t */\n\tconstructor(status) {\n\t\tsuper(`${status}`)\n\t\tthis.status = status;\n\t}\n}\n","/** @import { State } from '../signal.mjs' */\nimport { createState } from '../signal.mjs';\n\n/**\n * @template T\n * @template D\n * @typedef {object} PromisesAndStates\n * @property {(force?: boolean) => Promise<T>} load\n * @property {() => T | D} get\n * @property {() => void} destroy\n */\n/**\n * @template T\n * @template {unknown[]} A\n * @template D\n * @typedef {object} PromisesAndStatesApi\n * @property {(key: string | string[], ...args: A) => PromisesAndStates<T, D>} create\n * @property {(listener: (key: string) => void) => void} listen\n */\n/**\n * @template T\n * @template {unknown[]} A\n * @template D\n * @param {(...a: A) => Promise<T>} run \n * @param {D} def \n * @param {...PromisesAndStatesApi<unknown, any[], unknown>} dependents \n * @returns {PromisesAndStatesApi<T, A, D>}\n */\nexport default function createPromisesAndStates(run, def, ...dependents) {\n\n\t/** @type {Record<string, Promise<T>>} */\n\tconst promises = Object.create(null);\n\t/** @type {Set<string>} */\n\tconst reload = new Set()\n\t/** @type {Record<string, State<T | D> | undefined>} */\n\tconst states = Object.create(null);\n\n\n\t/** @type {Record<string, A | undefined>} */\n\tconst allArgs = Object.create(null);\n\n\t/** @type {((key: string) => void)[]} */\n\tconst listeners = [];\n\t/** @type {Set<string>} */\n\tconst wait = new Set();\n\t/**\n\t * \n\t * @param {string} key \n\t * @param {A} args \n\t */\n\tfunction update(key, args) {\n\t\tconst result = run(...args);\n\t\tpromises[key] = result;\n\t\tresult.then(v => {\n\t\t\tconst state = states[key];\n\t\t\tif (state) { return state.set(v); }\n\t\t\tstates[key] = createState(/** @type {T | D} */(v));\n\t\t\tfor (const l of listeners) {\n\t\t\t\tl(key);\n\t\t\t}\n\t\t}, () => {\n\t\t\tif (promises[key] !== result) { return; }\n\t\t\tdelete promises[key];\n\t\t});\n\t\treturn result;\n\t}\n\t/**\n\t * \n\t * @param {string} key \n\t */\n\tfunction refresh(key) {\n\t\tif (wait.has(key)) { return; }\n\t\twait.add(key);\n\t\trequestIdleCallback(() => {\n\t\t\tif (!wait.has(key)) { return; }\n\t\t\twait.delete(key);\n\t\t\tconst args = allArgs[key];\n\t\t\tif (!args) { return; }\n\t\t\tupdate(key, args);\n\t\t});\n\t}\n\tfor (const d of dependents) {\n\t\td.listen(refresh);\n\t}\n\n\t/**\n\t * \n\t * @param {string | string[]} keys \n\t * @param {A} args \n\t * @returns {PromisesAndStates<T, D>}\n\t */\n\tfunction create(keys, ...args) {\n\t\tconst key = Array.isArray(keys) ? keys.join('\\n') : keys;\n\t\tallArgs[key] = args;\n\t\t/**\n\t\t * \n\t\t * @param {boolean} [force] \n\t\t */\n\t\tfunction load(force) {\n\t\t\tconst promise = !force && Object.hasOwn(promises, key) && promises[key];\n\t\t\tif (promise) { return promise; }\n\t\t\treturn update(key, args);\n\t\t}\n\t\tfunction get() {\n\t\t\tif (!Object.hasOwn(promises, key) || !promises[key] || reload.has(key)) {\n\t\t\t\tupdate(key, args);\n\t\t\t\treload.delete(key);\n\t\t\t}\n\t\t\tlet state = states[key];\n\t\t\tif (!state) {\n\t\t\t\tstate = createState(/** @type {T | D} */(def));\n\t\t\t\tstates[key] = state;\n\n\t\t\t}\n\t\t\treturn state.get();\n\t\t}\n\t\tfunction destroy() {\n\t\t\tif (allArgs[key] !== args) { return; }\n\t\t\tdelete allArgs[key];\n\t\t\tdelete states[key];\n\t\t\tdelete promises[key];\n\t\t}\n\t\treturn { get, load, destroy };\n\n\t}\n\t/**\n\t * \n\t * @param {(key: string) => void} listener \n\t */\n\tfunction listen(listener) {\n\t\tlisteners.push(listener);\n\t}\n\treturn { create, listen };\n}\n","/**\n * @template T\n * @param {() => Promise<T>} load \n * @returns \n */\nexport default function toPromiseInterface(load) {\n\treturn {\n\t\t/**\n\t\t * @template [TResult1=T]\n\t\t * @template [TResult2=never]\n\t\t * @param {((value: T) => TResult1 | PromiseLike<TResult1>)?} [onfulfilled]\n\t\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected]\n\t\t * @returns {Promise<TResult1 | TResult2>};\n\t\t */\n\t\tthen(onfulfilled, onrejected) { return load().then(onfulfilled, onrejected); },\n\t\t/**\n\t\t * @template [TResult2=never]\n\t\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected]\n\t\t * @returns {Promise<T | TResult2>};\n\t\t */\n\t\tcatch(onrejected) { return load().catch(onrejected); },\n\t\t/**\n\t\t * @param {(() => void)?} [onfinally]\n\t\t * @returns {Promise<T>};\n\t\t */\n\t\tfinally(onfinally) { return load().finally(onfinally); },\n\t};\n\n}\n","/** @import { Field, Permission } from '@yongdall/types' */\n/** @import { Search } from '@yongdall/common' */\n/** @import DotRequest from 'dot-request' */\n/** @import { PageConfiguration } from './page.mjs' */\n/** @import { FieldComponent } from '../typesDefine.mjs' */\n\nimport { importWidget } from '../import.mjs';\nimport request, { userErrorHandler } from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n/** @import { Schema, Store, StoreLayout } from '@neeloong/form' */\n/**\n * @typedef {object} ModelConfiguration\n * @property {string} [id] \n * @property {string} [label] \n * @property {Record<string, Field>} fields 字段配置\n * @property {string?} [iconField] 图标字段\n * @property {string?} [imageField] 图像字段\n * @property {string?} [labelField] 标签字段\n * @property {string?} [labelPattern] 标签命名规则\n * @property {Permission[]} [permissions] 权限配置\n * @property {Record<string, unknown>?} [options] 模型选项,关联前端脚本可读取\n * @property {(string | [string, object])[] | null} [scripts] 关联前端脚本\n * @property {Record<string, string | object | null> | null} [pages] 关联默认页面\n * // TODO: 查询配置\n * // TODO: 前端按钮配置\n * // TODO: 是否可销毁、可创建、更新、保存、upsert\n * // TODO: 列表内操作按钮\n * // TODO: 编辑内按钮\n * // TODO: 操作事件\n * // TODO: 是否分页\n */\n\n\n/** @typedef {Omit<Field, 'scripts' | 'type'> & { script?: Omit<FieldScript, 'subFields'>; type: string | Record<string, FieldScriptConfiguration>;}} FieldScriptConfiguration */\n\n/** @typedef {Omit<ModelConfiguration, 'scripts' | 'fields'> & { script?: Omit<ModelScript, 'fields'>; fields: Record<string, FieldScriptConfiguration>;}} ModelScriptConfiguration */\n\n/**\n * @typedef {object} ListScriptParameter\n * @property {ModelScriptConfiguration} model\n * @property {Record<string, any>[]} [checkedDocuments]\n * @property {Record<string, any>[]} [documents]\n */\n/**\n * @typedef {object} DocumentScriptParameter\n * @property {ModelScriptConfiguration} model\n * @property {Record<string, any>} [document]\n * @property {Store} [store]\n */\n/**\n * @typedef {object} ModelScript\n * @property {Record<string, FieldScript>} [fields] 字段配置\n * @property {((document: any, ...fields: (string | number)[]) => void)?} [input]\n * @property {((document: any, ...fields: (string | number)[]) => void)?} [change]\n * @property {((document: any) => void)?} [beforeCreate]\n * @property {((document: any) => void)?} [beforeUpdate]\n * @property {((document: any) => void)?} [beforeSave]\n * @property {((document: any) => void)?} [beforeDestroy]\n * @property {((document: any) => void)?} [beforeUpsert]\n * @property {Record<string, (params: ListScriptParameter) => void>} [listScripts]\n * @property {Record<string, (params: DocumentScriptParameter) => void>} [documentScripts]\n */\n/**\n * @typedef {object} FieldScript\n * @property {Record<string, FieldScript>} [subFields] 子字段配置\n * @property {FieldComponent} [component]\n * @property {((value: InputEvent, store: Store) => void | boolean | null)?} [input]\n * @property {((value: InputEvent, store: Store) => void | boolean | null)?} [change]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [click]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [focus]\n * @property {((value: Event, store: Store) => void | boolean | null)?} [blur]\n * \n * @property {((document: any, field: string, ...fields: (string | number)[]) => void | object)?} [add]\n * @property {((value: any[], document: any, field: string, ...fields: (string | number)[]) => void)?} [remove]\n * @property {((from: number[], to: number, document: any, field: string, ...fields: (string | number)[]) => void)?} [move]\n * \n * @property {((store: Store) => boolean)?} [readonly]\n * @property {((store: Store) => boolean)?} [hidden]\n * @property {((store: Store) => boolean)?} [required]\n * @property {((store: Store) => boolean)?} [clearable]\n * @property {((store: Store) => boolean)?} [disabled]\n * @property {((store: Store) => any)?} [default]\n * \n * @property {((store: Store) => string)?} [label]\n * @property {((store: Store) => string)?} [description]\n * @property {((store: Store) => string)?} [placeholder]\n * @property {Schema.Validator | Schema.Validator[] | null} [validator]\n * \n */\n\n/**\n * \n * @param {(string | [string, object])[] | null} [scripts] \n */\n\nfunction loadScripts(scripts) {\n\treturn Promise.all(Array.isArray(scripts) ? scripts.map(async (s) => {\n\t\tconst path = typeof s === 'string' ? s : s[0];\n\t\tif (!path || typeof path !== 'string') { return; }\n\t\tconst script = await importWidget(path);\n\t\tif (typeof script !== 'function') { return script; }\n\t\tconst options = typeof s === 'string' ? null : s[1];\n\t\treturn script(typeof options == 'object' && options || {});\n\t}) : []);\n}\n/**\n * \n * @param {Field} field \n * @param {any[]} parentScripts \n * @returns {Promise<FieldScriptConfiguration>}\n */\nasync function setFieldScript({ type, scripts, ...field }, parentScripts) {\n\tconst subScripts = Object.create(null);\n\tconst selfScripts = Object.create(null);\n\tfor (const script of [await loadScripts(scripts), parentScripts].flat()) {\n\t\tif (!script || typeof script !== 'object') { continue; }\n\t\tconst { subFields, ...others } = script;\n\t\tfor (const [k, v] of Object.entries(others)) {\n\t\t\tconst list = selfScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tselfScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t\tif (!subFields) { continue; }\n\t\tfor (const [k, v] of Object.entries(subFields)) {\n\t\t\tconst list = subScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tsubScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...field,\n\t\tscript: margeFieldScript(selfScripts),\n\t\ttype: typeof type === 'object' && type ? await setFieldsScript(type, subScripts) : type,\n\t};\n}\n/**\n * \n * @param {Record<string, Field>} fields \n * @param {*} scripts \n * @returns \n */\nasync function setFieldsScript(fields, scripts) {\n\tconst list = Object.entries(fields).map(([k, f]) => Promise.all([k, setFieldScript(f, scripts[k])]));\n\treturn Object.fromEntries(await Promise.all(list));\n}\n\n/**\n * \n * @param {any[]} [list] \n * @param {boolean} [a] \n * @returns {((...p: any) => any)?}\n */\nfunction margeFunc(list, a) {\n\tif (!list) { return null; }\n\tconst fn = list.filter(v => typeof v === 'function');\n\tif (!fn.length) { return null; }\n\tif (a) {\n\t\treturn (...p) => {\n\t\t\tfor (const f of fn) {\n\t\t\t\tf(...p);\n\t\t\t}\n\t\t};\n\t}\n\treturn async (...p) => {\n\t\tfor (const f of fn) {\n\t\t\tawait f(...p);\n\t\t}\n\t};\n}\n/**\n * \n * @param {((store: Store) => any)[] | null | undefined} list \n * @param {boolean | ((value: any) => boolean)} judgment \n * @param {any} [defaultValue] \n * @returns {((store: Store) => any)?}\n */\nfunction margeStoreFunc(list, judgment, defaultValue) {\n\tif (!list) { return null; }\n\tconst fn = list.filter(v => typeof v === 'function');\n\tif (!fn.length) { return null; }\n\t\treturn (...p) => {\n\t\t\tfor (const f of fn) {\n\t\t\t\tconst res = f(...p);\n\t\t\t\tif (res === judgment) { return res;}\n\t\t\t\tif (typeof judgment === 'function' && judgment(res)) { return res }\n\t\t\t}\n\t\t\treturn defaultValue;\n\t\t};\n}\n/**\n * \n * @param {Record<string, any[]>} scripts \n * @returns {Omit<FieldScript, 'subFields'>}\n */\nfunction margeFieldScript(scripts) {\n\treturn {\n\t\tinput: margeFunc(scripts.input),\n\t\tchange: margeFunc(scripts.change),\n\t\tclick: margeFunc(scripts.click),\n\t\tfocus: margeFunc(scripts.focus),\n\t\tblur: margeFunc(scripts.blur),\n\t\tadd: scripts.add?.find(v => typeof v === 'function'),\n\t\tremove: margeFunc(scripts.remove),\n\t\tmove: margeFunc(scripts.move),\n\t\treadonly: margeStoreFunc(scripts.readonly, true, false),\n\t\thidden: margeStoreFunc(scripts.hidden, true, false),\n\t\trequired: margeStoreFunc(scripts.required, true, false),\n\t\tclearable: margeStoreFunc(scripts.clearable, true, false),\n\t\tdisabled: margeStoreFunc(scripts.disabled, true, false),\n\t\tdefault: margeStoreFunc(scripts.default, (v = null) => v !== null, false),\n\t\tlabel: margeStoreFunc(scripts.label, v => v && typeof v === 'string', ''),\n\t\tdescription: margeStoreFunc(scripts.description, v => v && typeof v === 'string', ''),\n\t\tplaceholder: margeStoreFunc(scripts.clearable, v => v && typeof v === 'string', ''),\n\t\tvalidator: [scripts.validator].flat().filter(Boolean),\n\t};\n\n}\n/**\n * \n * @param {Record<string, any[]>} scripts \n * @returns {Omit<ModelScript, 'subFields'>}\n */\nfunction margeModelScript({\n\tlistScripts,\n\tdocumentScripts,\n\t...scripts\n}) {\n\treturn {\n\t\tinput: margeFunc(scripts.input),\n\t\tchange: margeFunc(scripts.change),\n\t\tbeforeCreate: margeFunc(scripts.beforeCreate),\n\t\tbeforeUpdate: margeFunc(scripts.beforeUpdate),\n\t\tbeforeSave: margeFunc(scripts.beforeSave),\n\t\tbeforeDestroy: margeFunc(scripts.beforeDestroy),\n\t\tbeforeUpsert: margeFunc(scripts.beforeUpsert),\n\t\tlistScripts: listScripts ? Object.assign({}, ...listScripts) : {},\n\t\tdocumentScripts: documentScripts ? Object.assign({}, ...documentScripts) : {},\n\t};\n}\n/**\n * \n * @param {ModelConfiguration} model \n * @returns {Promise<ModelScriptConfiguration>}\n */\nasync function setScript({ fields, scripts: scripts, ...model }) {\n\t/** @type {Record<string, any[]>} */\n\tconst fieldsScripts = Object.create(null);\n\t/** @type {Record<string, any[]>} */\n\tconst selfScripts = Object.create(null);\n\tfor (const script of await loadScripts(scripts)) {\n\t\tif (!script || typeof script !== 'object') { continue; }\n\t\tconst { fields, ...others } = script;\n\t\tfor (const [k, v] of Object.entries(others)) {\n\t\t\tconst list = selfScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tselfScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t\tif (!fields) { continue; }\n\t\tfor (const [k, v] of Object.entries(fields)) {\n\t\t\tconst list = fieldsScripts[k];\n\t\t\tif (!list) {\n\t\t\t\tfieldsScripts[k] = [v];\n\t\t\t} else {\n\t\t\t\tlist.push(v);\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\t...model,\n\t\tscript: margeModelScript(selfScripts),\n\t\tfields: await setFieldsScript(fields, fieldsScripts),\n\t};\n}\n\n\nconst modelOptions = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<Record<string, any>[]>} */\n\tconst result = req.clone().body({}).json().then(v => v.options);\n\treturn result;\n}, /** @type {Record<string, any>[]} */([]));\n\n\n/**\n * \n * @param {DotRequest} baseReq \n * @param {string} key\n * @returns \n */\nfunction service(baseReq, key) {\n\tconst documentsReq = baseReq.clone().append(`/documents`);\n\tconst optionsReq = baseReq.clone().append(`/options`);\n\tconst { get: getOptions, load: loadOptions } = modelOptions.create(key, optionsReq);\n\n\n\treturn {\n\t\t/**\n\t\t * @param {Search.Param} [options]\n\t\t * @returns {Promise<{documents: any[]; total: number}>}\n\t\t */\n\t\tasync query({ values, where, orWhere, sort, limit = 20, page, offset, select, total, primary } = {}) {\n\t\t\treturn documentsReq.clone().body({ values, where, orWhere, sort, limit, page, offset, select, total, primary }).json();\n\t\t},\n\t\tgetOptions() { return getOptions(); },\n\t\t/**\n\t\t * @overload\n\t\t * @param {boolean} [options]\n\t\t * @returns {Promise<Record<string, any>[]>}\n\t\t */\n\t\t/**\n\t\t * @overload\n\t\t * @param {Search.Param} options\n\t\t * @returns {Promise<{options: Record<string, any>[]; total: number}>}\n\t\t */\n\t\t/**\n\t\t * @param {Search.Param | boolean} [options]\n\t\t * @returns {Promise<Record<string, any>[] | {options: Record<string, any>[]; total: number}>}\n\t\t */\n\t\tasync options(options) {\n\t\t\tif (!options || typeof options === 'boolean') {\n\t\t\t\treturn loadOptions(options);\n\t\t\t}\n\t\t\tconst { values, where, orWhere, sort, limit = 20, page, offset, select, total, primary } = options;\n\t\t\t// TODO:\n\t\t\treturn optionsReq.clone().body({\n\t\t\t\tvalues, where, orWhere, sort, limit, page, offset, select, total, primary,\n\t\t\t}).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {string | number} id\n\t\t */\n\t\tasync option(id) {\n\t\t\t// TODO:\n\t\t\treturn optionsReq.clone().append(`/${encodeURIComponent(id)}`).get().errorHandler(userErrorHandler).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {Record<string, any>} data\n\t\t * @returns \n\t\t */\n\t\tasync create(data) {\n\t\t\t// TODO:\n\t\t\treturn documentsReq.clone().post().body({ document: data }).json();\n\t\t},\n\t\t/**\n\t\t * \n\t\t * @param {string | number} id\n\t\t */\n\t\tdocument(id) {\n\t\t\tconst idReq = documentsReq.clone().append(`/${encodeURIComponent(id)}`);\n\t\t\t/**\n\t\t\t * \n\t\t\t * @returns {Promise<Record<string, any>>}\n\t\t\t */\n\t\t\tasync function get() {\n\t\t\t\treturn idReq.get().json().then(v => v.document);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tget,\n\t\t\t\t/**\n\t\t\t\t * @param {Record<string, any>} data\n\t\t\t\t * @returns \n\t\t\t\t */\n\t\t\t\tasync update(data) {\n\t\t\t\t\t// TODO:\n\t\t\t\t\treturn idReq.clone().put().body({ document: data }).json();\n\t\t\t\t},\n\t\t\t\tasync delete() {\n\t\t\t\t\t// TODO:\n\t\t\t\t\treturn idReq.delete().done();\n\t\t\t\t},\n\t\t\t\t/** @param {string} field */\n\t\t\t\tfield(field) {\n\t\t\t\t\tconst fieldReq = idReq.clone().append`fields/${field}`;\n\t\t\t\t\t/**\n\t\t\t\t\t * \n\t\t\t\t\t * @returns {Promise<any>}\n\t\t\t\t\t */\n\t\t\t\t\tasync function get() {\n\t\t\t\t\t\treturn fieldReq.get().json().then(v => v.value);\n\t\t\t\t\t}\n\t\t\t\t\treturn {get, ...toPromiseInterface(get)}\n\t\t\t\t},\n\t\t\t\t...toPromiseInterface(get),\n\t\t\t};\n\t\t},\n\t};\n}\nconst models = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<ModelConfiguration?>} */\n\tconst result = req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\treturn result;\n}, null);\nconst modelScripts = createPromisesAndStates((\n\t/** @type {() => Promise<ModelConfiguration?>} */load\n) => {\n\treturn load().then(async v => v && setScript(v));\n}, null, models);\n\n/**\n * \n * @param {string} model \n * @returns \n */\nexport function modelService(model) {\n\tconst modelReq = request.clone().path`models/${model || ''}`;\n\tconst { get: getModel, load: loadModel } = models.create(model, modelReq);\n\tconst { get: getScript, load: loadScript } = modelScripts.create(model, loadModel);\n\n\treturn {\n\t\tloadModel,\n\t\tloadScript,\n\t\tgetModel,\n\t\tgetScript,\n\t\t...service(modelReq, [model, ''].join('\\n')),\n\t\t...toPromiseInterface(loadModel),\n\t};\n}\n","/** @import DotRequest from 'dot-request' */\nimport request from '../request.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\nconst enumerations = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<Record<string, any>[]>} */\n\tconst result = req.json().then(\n\t\tv => typeof v === 'object' && v.values || [],\n\t\t() => /** @type {Record<string, any>[]} */([])\n\t);\n\treturn result;\n}, /** @type {Record<string, any>[]} */([]));\n\n/**\n * \n * @param {string} enumeration \n * @returns \n */\nexport function enumerationsService(enumeration) {\n\tconst modelReq = request.clone().path`enumerations/${enumeration || ''}`;\n\tconst { get: get, load: load } = enumerations.create(enumeration, modelReq);\n\treturn { load, get, ...toPromiseInterface(load) };\n}\n","/** @import DotRequest from 'dot-request' */\n/** @import { FormLayout } from '@yongdall/types' */\nimport request from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\nconst layouts = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<FormLayout?>} */\n\tconst result = req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\treturn result;\n}, null);\n\n/**\n * \n * @param {string} layout \n * @returns \n */\nexport function formLayoutsService(layout) {\n\tconst layoutReq = request.clone().path`formLayouts/${layout || ''}`;\n\tconst { get: get, load: load } = layouts.create(layout, layoutReq);\n\treturn { load, get, ...toPromiseInterface(load) };\n}\n","import request from '../request.mjs';\nimport { createState } from '../signal.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n\n\nconst permissionsReq = request.clone().path`permissions`;\n\n/**\n * @typedef {({children: {value: string; label: string}[]; label: string;})} Permission\n */\n/** @type {Promise<Permission[]>?} */\nlet promise = null;\n/** @type {boolean} */\nlet reloaded = false;\nconst state = createState(/** @type {Permission[]} */([]));\n\nfunction update() {\n\t/** @type {Promise<Permission[]>} */\n\tconst result = permissionsReq.json().then(\n\t\tv => Array.isArray(v) && v || [],\n\t);\n\tpromise = result;\n\tresult.then(v => {\n\t\treturn state.set(v);\n\t}, () => {\n\t\tif (promise !== result) { return; }\n\t\tpromise = null;\n\t});\n\treturn result;\n}\n\n\n/**\n * \n * @param {boolean} [force] \n */\nfunction load(force) {\n\tif (!force && promise) { return promise; }\n\treturn update();\n}\nfunction get() {\n\tif (!promise || reloaded) {\n\t\tupdate();\n\t\treloaded = false;\n\t}\n\treturn state.get();\n}\n\nexport default { load, get, ...toPromiseInterface(load) };\n","/** @import { Menu } from '../Menu.mjs' */\nimport request from '../request.mjs';\n\n/**\n * \n * @param {string} type \n * @param {string} group\n * @returns {Promise<Menu.Define[]>}\n */\nasync function _loadMenu(type, group) {\n\tlet req = request.clone()\n\tif (group) {\n\t\treq = req.get`menus/${type}/groups/${group}`;\n\t} else {\n\t\treq = req.get`menus/${type}`;\n\t};\n\tconst { menus } = await req.json();\n\treturn menus\n}\n/** @type {Record<string, Record<string, Promise<Menu.Define[]>?>>} */\nconst allMenus = Object.create(null);\n/**\n * @overload\n * @param {string} type \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * @overload\n * @param {string} type \n * @param {string} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * @overload\n * @param {string} type \n * @param {string | boolean} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\n/**\n * \n * @param {string} type \n * @param {string | boolean} [group] \n * @param {boolean} [force] \n * @returns {Promise<Menu.Define[]>}\n */\nexport function loadMenu(type, group, force) {\n\tlet typeMenus = allMenus[type];\n\tif (!typeMenus) {\n\t\tallMenus[type] = typeMenus = Object.create(null);\n\t}\n\tconst groupName = typeof group === 'string' ? group : '';\n\tif (group !== true && force !== true) {\n\t\tconst groupMenu = typeMenus[groupName];\n\t\tif (groupMenu) { return groupMenu; }\n\t}\n\tconst menus = _loadMenu(type, groupName);\n\ttypeMenus[groupName] = menus;\n\tmenus.catch(() => {\n\t\tif (typeMenus[groupName] !== menus) {return }\n\t\ttypeMenus[groupName] = null;\n\t})\n\treturn menus;\n}\n","/** @import { Field } from '@yongdall/types' */\nimport { Search } from '@yongdall/common';\nimport { getFilterFns } from '../index.mjs';\n\n/**\n * \n * @param {Record<string, Field>} fields 字段配置\n * @param {Search.ExecParam} param \n * @returns \n */\nexport function modelFilter(fields, param) {\n\tlet fieldsMap = fields;\n\tconst fieldNames = param.fields.map(v => Array.isArray(v) ? v[0] : v);\n\tif (!fieldNames.length) { return null; }\n\tconst last = fieldNames.pop() || '';\n\tfor (const f of fieldNames) {\n\t\tconst type = Object.hasOwn(fieldsMap, f) && fieldsMap[f]?.type;\n\t\tif (!type || typeof type !== 'object') { return null; }\n\t\tfieldsMap = type;\n\t}\n\tconst field = Object.hasOwn(fieldsMap, last) && fieldsMap[last];\n\tif (!field) { return null; }\n\tconst eqFieldName = param.field;\n\tconst eqField = eqFieldName && Object.hasOwn(fieldsMap, eqFieldName) && fieldsMap[eqFieldName] || null;\n\tconst not = Boolean(param.sign);\n\tconst { value, values } = param;\n\n\tfor (const fns of getFilterFns(field, param.operator)) {\n\t\tif (eqField) {\n\t\t\tfor (const fn of not ? fns.notField : fns.field) {\n\t\t\t\tconst w = fn(values, value, field, eqField);\n\t\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t\t}\n\t\t\tif (not) {\n\t\t\t\tfor (const fn of fns.field) {\n\t\t\t\t\tconst w = fn(values, value, field, eqField);\n\t\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const fn of not ? fns.notValue : fns.value) {\n\t\t\t\tconst w = fn(values, value, field);\n\t\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t\t}\n\t\t\tif (not) {\n\t\t\t\tfor (const fn of fns.value) {\n\t\t\t\t\tconst w = fn(values, value, field);\n\t\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\treturn null;\n}\n","import { modelService } from '../services/index.mjs';\nimport { Search } from '@yongdall/common';\nimport { getFilterFns } from '../index.mjs';\nimport { modelFilter } from './modelFilter.mjs';\n\n\n\n/**\n * \n * @param {Search.ExecParam} value \n * @returns \n */\nfunction run({ operator, sign, value, values }) {\n\tconst not = Boolean(sign);\n\tfor (const fns of getFilterFns(!values.find(v => !Array.isArray(v)), operator)) {\n\t\tfor (const fn of not ? fns.notValue : fns.value) {\n\t\t\tconst w = fn(values, value);\n\t\t\tif (typeof w === 'boolean') { return w; }\n\t\t}\n\t\tif (not) {\n\t\t\tfor (const fn of fns.value) {\n\t\t\t\tconst w = fn(values, value);\n\t\t\t\tif (typeof w === 'boolean') { return !w; }\n\t\t\t}\n\t\t}\n\t}\n\tif (!operator) {\n\t\tfor (const v of values) {\n\t\t\tif (v == value) { return !not; }\n\t\t}\n\t\treturn not;\n\t}\n\n\treturn null;\n}\n\n\n/**\n * \n * @param {((value: Search.ExecParam) => boolean?)?} [exec]\n * @param {string?} [type] \n * @param {string?} [name] \n * @returns {(value: Search.ExecParam) => boolean?}\n */\nexport function createExec(exec, type, name) {\n\tif (typeof exec === 'function') { return exec; }\n\tif (type !== 'model') { return run; }\n\tif (!name) { return run; }\n\tconst s = modelService(name);\n\treturn value => {\n\t\tconst model = s.getModel();\n\t\tif (!model) { return run(value); }\n\t\treturn modelFilter(model.fields, value);\n\t};\n}\n","/** @import { DataSource } from './index.mjs' */\nimport { Search } from '@yongdall/common';\n\n\n\n\n/**\n * \n * @param {DataSource.Option[]} list \n * @param {(value: Search.ExecParam) => boolean?} exec \n * @param {(Search.Match | Search.Children)[]} where \n * @param {(Search.Match | Search.Children | Search.Or)[]} orWhere \n */\nexport function filterList(list, exec, where, orWhere) {\n\t/** @type {DataSource.Option[]} */\n\tconst result = [];\n\tfor (const data of list) {\n\t\tconst children = filterList(data.children, exec, where, orWhere);\n\t\tconst disabled = data.disabled || !(Search.exec(data.data, exec, where, orWhere) ?? true);\n\t\tif (!children.length && disabled) { continue; }\n\t\tresult.push({ ...data, children, disabled });\n\t}\n\treturn result;\n\n}\n","/** @import { Field } from '@yongdall/types' */\n/** @import { DataSource } from './index.mjs' */\nimport { runPattern } from '@yongdall/common';\nimport { createComputed } from '../signal.mjs';\n\n/**\n * \n * @param {{get(): Record<string, any>[]}} list \n * @param {Field.Source} options\n */\nexport function build(list, {\n\n\tid,\n\tlabel,\n\tvalue,\n\tparent,\n\tchildren,\n\tsequence,\n\tdisabled,\n} = {}) {\n\tconst idPattern = id || '{id}';\n\tconst valuePattern = value || '{value}';\n\tconst labelPattern = label || '{label}';\n\tconst disabledKey = disabled;\n\tif (parent) {\n\t\tconst parentPattern = parent.includes('{') ? parent : `{${parent}}`;\n\t\treturn createComputed(() => {\n\t\t\t/** @type {DataSource.Option[]} */\n\t\t\tconst data = list.get().map(data => {\n\t\t\t\tconst id = typeof data === 'object' && data ? runPattern(idPattern, data) : data;\n\t\t\t\tconst value = typeof data === 'object' && data ? runPattern(valuePattern, data) : data;\n\t\t\t\tconst label = String(typeof data === 'object' && data && runPattern(labelPattern, data) || value);\n\t\t\t\tconst disabled = Boolean(typeof data === 'object' && disabledKey && data?.[disabledKey]);\n\t\t\t\tconst parentId = typeof data === 'object' && data ? runPattern(parentPattern, data) : '';\n\t\t\t\treturn { id, value, label, data, parentId, disabled, children: [] };\n\t\t\t});\n\t\t\tconst values = new Set(data.map(v => String(v.value)));\n\t\t\tconst groups = Object.groupBy(data, d => d.parentId ?? '');\n\t\t\tconst rootKeys = Object.keys(groups).filter(v => !values.has(v));\n\t\t\tconst root = rootKeys.flatMap(v => groups[v] || []);\n\t\t\tfor (const key of rootKeys) {\n\t\t\t\tdelete groups[key];\n\t\t\t}\n\t\t\tconst queue = [...root];\n\t\t\tfor (let item; item = queue.shift();) {\n\t\t\t\tconst children = groups[item.id];\n\t\t\t\tdelete groups[item.id];\n\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\titem.children = children;\n\t\t\t\tfor (const c of children) {\n\t\t\t\t\tqueue.push(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let keys = Object.keys(groups); keys.length; keys = Object.keys(groups)) {\n\t\t\t\tconst key = keys[0];\n\t\t\t\tconst children = groups[key];\n\t\t\t\tdelete groups[key];\n\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\tfor (const c of children) {\n\t\t\t\t\troot.push(c);\n\t\t\t\t\tqueue.push(c);\n\t\t\t\t}\n\t\t\t\tfor (let item; item = queue.shift();) {\n\t\t\t\t\tconst children = groups[item.id];\n\t\t\t\t\tdelete groups[item.id];\n\t\t\t\t\tif (!children?.length) { continue; }\n\t\t\t\t\titem.children = children;\n\t\t\t\t\tfor (const c of children) {\n\t\t\t\t\t\tqueue.push(c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TODO: 排序\n\t\t\treturn root;\n\n\n\t\t});\n\t}\n\tconst childrenKey = children;\n\t/**\n\t * \n\t * @param {*[]} data \n\t * @returns {DataSource.Option[]}\n\t */\n\tfunction buildItems(data) {\n\t\tconst result = data.map(data => {\n\t\t\tif (typeof data !== 'object' || !data) {\n\t\t\t\treturn { id: data, value: data, label: String(data), data, children: [] };\n\t\t\t}\n\t\t\tconst id = runPattern(idPattern, data);\n\t\t\tconst value = runPattern(valuePattern, data);\n\t\t\tconst label = String(runPattern(labelPattern, data) || value);\n\t\t\tconst disabled = Boolean(disabledKey && data[disabledKey]);\n\t\t\tif (!childrenKey) {\n\t\t\t\treturn { id, value, label, data, disabled, children: [] };\n\t\t\t}\n\t\t\tconst children = data[childrenKey];\n\t\t\treturn {\n\t\t\t\tid, value, label, data, disabled, children: buildItems(children)\n\t\t\t};\n\t\t});\n\t\t// TODO: 排序\n\t\treturn result;\n\t}\n\treturn createComputed(() => buildItems(list.get()));\n\n}\n","import { allHooks } from './allHooks.mjs';\nimport { createStates } from './utils/state.mjs';\nimport { createComputed } from './signal.mjs';\n\n\n\nconst enumerations = createStates((/** @type {string} */name) => {\n\treturn createComputed(() => {\n\t\t/** @type {Record<string, any>[]} */\n\t\tconst list = [];\n\t\tfor (const [plugin, value] of allHooks.get('enumerations').get(name)) {\n\t\t\tfor (const val of typeof value === 'function' ? value() : [value]) {\n\t\t\t\tlist.push({...val, plugin});\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t});\n}, name => name);\n/**\n * \n * @param {string} name \n * @returns {Record<string, any>[]}\n */\nexport function getEnumeration(name) {\n\treturn enumerations(name).get();\n}\n","import { enumerationsService, modelService } from '../services/index.mjs';\nimport { getEnumeration } from '../enumerations.mjs';\nimport { createStates } from '../utils/state.mjs';\nimport { createComputed } from '../signal.mjs';\n\n\nexport const loadValues = createStates((/** @type {string} */type, /** @type {string} */name) => {\n\tif (!name) { return createComputed(() => /** @type {Record<string, any>[]} */([])); }\n\tif (type === 'model') {\n\t\tconst s = modelService(name);\n\t\treturn createComputed(() => s.getOptions());\n\t}\n\tif (type === 'serverEnumeration') {\n\t\tconst s = enumerationsService(name);\n\t\treturn createComputed(() => s.get());\n\t}\n\tif (type === 'webEnumeration') {\n\t\treturn createComputed(() => getEnumeration(name));\n\t}\n\tif (type === 'enumeration') {\n\t\tconst s = enumerationsService(name);\n\t\tconst serverEnumeration = createComputed(() => s.get());\n\t\tconst webEnumeration = createComputed(() => getEnumeration(name));\n\t\treturn createComputed(() => [\n\t\t\t...serverEnumeration.get(),\n\t\t\t...webEnumeration.get(),\n\t\t]);\n\t}\n\treturn createComputed(() => /** @type {Record<string, any>[]} */([]));\n}, (type, name) => name ? [type, name].join('\\n') : '');\n","/** @import { State } from '../signal.mjs' */\nimport { createComputed } from '../signal.mjs';\n\n/**\n * \n * @param {*} values \n * @returns {State<Record<string, any>[]>}\n */\nexport function loadArray(values) {\n\tif (!Array.isArray(values)) {\n\t\treturn createComputed(() => /** @type {Record<string, any>[]} */([]));\n\t}\n\treturn createComputed(() => values);\n}\n","/** @import { State } from '../signal.mjs' */\nimport { createComputed } from '../signal.mjs';\n/**\n * \n * @param {State<Record<string, any>[]>} data \n * @param {*} parent \n * @param {*} children \n */\nexport function flat(data, parent, children) {\n\tif (parent || !children) { return data; }\n\treturn createComputed(() => {\n\t\tconst childrenKey = children;\n\t\t/** @param {*[]} list @returns {Iterable<Record<string, any>>} */\n\t\tfunction* buildItems(list) {\n\t\t\tif (!Array.isArray(list)) { return; }\n\t\t\tfor (const data of list) {\n\t\t\t\tif (typeof data !== 'object' || !data) {\n\t\t\t\t\tyield data;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (childrenKey) { yield* buildItems(data[childrenKey]); };\n\t\t\t\tyield data;\n\t\t\t}\n\t\t}\n\t\treturn [...buildItems(data.get())];\n\t});\n\n}\n","/** @import { Store } from '@neeloong/form' */\n/** @import { Field } from '@yongdall/types' */\n/** @import { State } from '../signal.mjs' */\nimport { Search } from '@yongdall/common';\nimport { ArrayStore, createState, modelService } from '@yongdall/web';\n\nimport { createComputed } from '../signal.mjs';\nimport { createExec } from './createExec.mjs';\nimport { filterList } from './filterList.mjs';\nimport { build } from './build.mjs';\nimport { loadValues } from './loadValues.mjs';\nimport { loadArray } from './loadArray.mjs';\nimport { flat } from './flat.mjs';\n\n\n/**\n * @typedef {object} DataSource.Option\n * @property {string | number} id\n * @property {string | number} value\n * @property {string} label\n * @property {any} data\n * @property {string | number} [parentId]\n * @property {boolean} [disabled]\n * @property {DataSource.Option[]} children\n */\n/**\n * @typedef {object} DataSource\n * \n * @property {string?} [id] id字段(或模式)\n * @property {string?} [label] 标签字段(或模式)\n * @property {string?} [value] 值字段(或模式)\n * @property {string?} [parent] 父节点字段(或模式)\n * \n * @property {string?} [children] 子列表\n * @property {string?} [sequence] 序列字段\n * @property {string?} [disabled] 禁用字段\n * \n * \n * @property {Field.Show[]?} [fields] 显示字段\n * @property {{ field: string; label?: string; operator: string; }[]?} [queryFilters] 快速过滤字段\n * \n * \n * \n * @property {any} configurator 字段配置信息\n * @property {Object.<string, string>} labels\n * @property {DataSource.Option[]} options\n * @property {(DataSource.Option & { level: number; })[]} levelTree\n * @property {Record<string, any>} map\n * @property {string?} [model]\n * @property {ReturnType<typeof modelService>?} [service] \n * @property {(Search.Match | Search.Children)[]} where\n * @property {(Search.Match | Search.Children | Search.Or)[]} orWhere\n */\n/**\n * \n * @param {string?} [id] \n */\nfunction toPattern(id) {\n\tif (!id || typeof id !== 'string') { return null; }\n\treturn id.includes('{') ? id : `{${id}}`;\n\n}\n/**\n * \n * @param {Field.Source} source\n */\nfunction setPattern(source) {\n\tconst {\n\t\tid, value, label\n\t} = Array.isArray(source) ? {} : source || {};\n\tconst isModel = source.type === 'model' && source.name;\n\treturn {\n\t\t...source,\n\t\tid: toPattern(isModel ? id : id || 'id'),\n\t\tvalue: toPattern(isModel ? value : value || 'value'),\n\t\tlabel: toPattern(isModel ? label : label || 'label'),\n\t};\n}\n/**\n * \n * @param {any[] | Field.Source | null} [source] \n * @param {string | null} [model] \n * @returns {Field.Source}\n */\nfunction init(source, model) {\n\tif (Array.isArray(source)) { return setPattern({ values: source }); };\n\tif (!source) { return model ? { type: 'model', name: model } : {}; }\n\tif (source.type && source.name) { return setPattern(source); }\n\tif ((source.type === 'model' || !source.type) && !source.name && model) { return setPattern({ ...source, type: 'model', name: model }); }\n\tif (Array.isArray(source.values)) { return setPattern(source); }\n\tif (!source.type && !source.name && model) { return setPattern({ ...source, name: model }); }\n\treturn setPattern(source);\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toLabels(options) {\n\treturn createComputed(() => {\n\t\tconst queue = [...options.get()];\n\t\t/** @type {Record<string, string>} */\n\t\tconst labels = Object.create(null);\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst children = item.children;\n\t\t\tlabels[item.value] = item.label;\n\t\t\tfor (const c of children) {\n\t\t\t\tqueue.push(c);\n\t\t\t}\n\t\t}\n\t\treturn labels;\n\t});\n}\n\n/**\n * \n * @param {Store?} [store] \n * @returns {Store?}\n */\nfunction findParentState(store) {\n\tlet state = store?.parent;\n\tif (!state) { return null; }\n\tif (state instanceof ArrayStore) { state = state.parent; }\n\tif (!state) { return null; }\n\treturn state;\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toValueMap(options) {\n\treturn createComputed(() => {\n\t\tconst queue = [...options.get()];\n\t\t/** @type {Record<string, any>} */\n\t\tconst values = Object.create(null);\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst children = item.children;\n\t\t\tvalues[item.value] = item.data;\n\t\t\tfor (const c of children) {\n\t\t\t\tqueue.push(c);\n\t\t\t}\n\t\t}\n\t\treturn values;\n\t});\n}\n\n/**\n * \n * @param {State<DataSource.Option[]>} options \n */\nfunction toLevelTree(options) {\n\treturn createComputed(() => {\n\t\t/** @type {[level: number, option: DataSource.Option][]} */\n\t\tconst queue = options.get().map(v => [0, v]);\n\t\t/** @type {(DataSource.Option & {level: number})[]} */\n\t\tconst list = [];\n\t\tfor (let item; item = queue.shift();) {\n\t\t\tconst [level, option] = item;\n\t\t\tlist.push({ ...option, level });\n\t\t\tfor (const c of option.children) {\n\t\t\t\tqueue.push([level + 1, c]);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t});\n}\n/**\n * \n * @param {Store} store \n * @param {string} placeholder \n */\nfunction getModelPlaceholder(store, placeholder) {\n\tlet currentState = store;\n\tlet k = 0;\n\twhile (placeholder[k] === '?') {\n\t\tk++;\n\t\tlet parent = currentState.parent;\n\t\tif (!parent) { break; }\n\t\tif (parent instanceof ArrayStore) {\n\t\t\tparent = parent.parent;\n\t\t}\n\t\tif (!parent) { break; }\n\t\tcurrentState = parent;\n\t}\n\twhile (placeholder[k] === '?') { k++; }\n\tconst name = placeholder.slice(k);\n\tconst field = currentState.child(name);\n\tif (!field) { return null; }\n\treturn field.value;\n\n}\n/**\n * \n * @param {any[] | Field.Source | null} [source] \n * @param {string | null} [model] \n * @param {Store | null} [store] \n * @returns {DataSource}\n */\nexport default function buildDataSource(source, model, store) {\n\tconst sourceDefine = init(source, model);\n\tconst { type, name, parent, children, id, label, value, sequence, disabled, fields, queryFilters } = sourceDefine;\n\tconst configuratorKey = sourceDefine.configurator || 'configurator';\n\n\tconst data = type ? loadValues(type, name || '') : loadArray(sourceDefine.values);\n\tconst list = build(data, sourceDefine);\n\tconst labels = toLabels(list);\n\n\tconst searchText = sourceDefine.search;\n\tconst search = searchText && typeof searchText === 'string' ? Search.parse(searchText) : null;\n\tconst where = search?.where?.length ? search.where : null;\n\tconst orWhere = search?.orWhere?.length ? search.orWhere : null;\n\tconst baseStore = findParentState(store);\n\tconst getPlaceholder = baseStore ? getModelPlaceholder.bind(null, baseStore) : null;\n\t/** @typedef {[(Search.Match | Search.Children)[], (Search.Match | Search.Children | Search.Or)[]]} SearchState */\n\tconst searchState = getPlaceholder\n\t\t? createComputed(() => /** @type {SearchState} */([\n\t\t\tSearch.fill(where, getPlaceholder),\n\t\t\tSearch.fill(orWhere, getPlaceholder),\n\t\t])) : where || orWhere\n\t\t? createState(/** @type {SearchState} */([where, orWhere]))\n\t\t: null;\n\n\tconst execFn = createComputed(() => createExec(null, type, name));\n\tconst options = searchState ? createComputed(() => {\n\t\tconst [where, orWhere] = searchState.get();\n\t\treturn filterList(list.get(), execFn.get(), where, orWhere);\n\t}) : list;\n\tconst levelTree = toLevelTree(options);\n\tconst valueMap = toValueMap(options);\n\n\tconst flatted = flat(data, parent, children);\n\tconst configurator = searchState ? createComputed(() => {\n\t\tconst [where, orWhere] = searchState.get();\n\t\tfor (const data of flatted.get()) {\n\t\t\tconst disabled = !(Search.exec(data, execFn.get(), where, orWhere) ?? true);\n\t\t\tif (disabled) { continue; }\n\t\t\treturn data?.[configuratorKey];\n\t\t}\n\t\treturn null;\n\t}) : createComputed(() => flatted.get()[0]?.[configuratorKey]);\n\n\tconst service = type === 'model' && model ? modelService(model) : null;\n\treturn {\n\t\tparent, children, id, label, value, sequence, disabled, fields, queryFilters,\n\t\tget where() { return searchState ? searchState.get()[0] : []; },\n\t\tget orWhere() { return searchState ? searchState.get()[1] : []; },\n\t\tmodel: type === 'model' && model || '',\n\t\tservice,\n\t\tget labels() { return labels.get(); },\n\t\tget options() { return options.get(); },\n\t\tget configurator() { return configurator.get(); },\n\t\tget levelTree() { return levelTree.get(); },\n\t\tget map() { return valueMap.get(); },\n\t};\n}\n","/** @import { Store, StoreLayout } from '@neeloong/form' */\n/** @import { Field } from '@yongdall/types' */\n/** @import { FieldComponent, FieldStyle, FieldComponentEvent } from '../typesDefine.mjs' */\nimport { ArrayStore, ObjectStore } from '@neeloong/form';\nimport { createState } from '../signal.mjs';\nimport { getField } from './field.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n/**\n *\n * @param {Store} store\n * @param {any} [renderer] \n * @returns {FieldComponent?}\n */\nfunction getFieldComponent(store, renderer) {\n\tif (typeof renderer === 'function') { return renderer; }\n\tlet storeComponent = store.component;\n\tif (typeof storeComponent === 'function') { return storeComponent; }\n\tconst meta = store.meta;\n\tconst component = getField({\n\t\ttype: store.type,\n\t\tarray: store instanceof ArrayStore,\n\t\trenderer: [renderer, meta?.renderer, store.component].flat(),\n\t}, true);\n\tif (component) { return component; }\n\tif (store instanceof ObjectStore) { return null; }\n\tif (store instanceof ArrayStore && typeof store.type === 'object') {\n\t\treturn null;\n\t}\n\treturn () => document.createElement('div');\n\n}\n\n/**\n * \n * @param {Store} store \n * @param {Field.Bind?} [bind] \n * @returns {((data: any) => void) | null}\n */\nexport function createBind(store, bind) {\n\tif (!bind || typeof bind !== 'object') { return null; }\n\tconst parent = store.parent;\n\tif (!(parent instanceof ObjectStore)) { return null; }\n\tconst list = Array.isArray(bind) ? bind\n\t\t: Object.entries(bind).map(([field, source]) => {\n\t\t\treturn typeof source === 'string' ? { source, field } : { ...source, field };\n\t\t});\n\tif (!list.length) { return null; }\n\n\treturn data => {\n\t\tfor (const { field, source, clear, fixed, reset, set } of list) {\n\t\t\tconst current = parent.child(field);\n\t\t\tif (!current) { continue; }\n\t\t\tif (!source || typeof source !== 'string') { continue; }\n\t\t\tif (!data) {\n\t\t\t\tif (clear) { current.value = reset; }\n\t\t\t} else if (fixed){\n\t\t\t\tcurrent.value = set;\n\t\t\t} else if (source && typeof source === 'string') {\n\t\t\t\tcurrent.value = data[source];\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n *\n * @param {Store<any, Field?, any>} store\n * @param {FieldStyle} style \n * @param {any} [renderer] \n * @param {StoreLayout.Options?} [options]\n * @returns {Element?}\n */\nexport default function createStoreField(store, style, renderer, options) {\n\tconst component = getFieldComponent(store, renderer);\n\tif (!component) { return null; }\n\tconst { relate } = options || {};\n\t/** @type {Field} */\n\tconst field = store.meta || { type: '' };\n\tlet destroyedState = createState(false);\n\tlet destroyed = false;\n\t/** @type {Map<string, Set<any>>} */\n\tconst events = new Map();\n\tconst bind = createBind(store, field?.bind);\n\n\n\t/**\n\t * @param {string} k \n\t * @param {any} p \n\t */\n\tfunction emitHandler(k, p) {\n\t\t// @ts-ignore\n\t\tstore.emit(k, p);\n\t}\n\tconst stopEffects = new Set();\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tconst editable = options?.editable || false;\n\tconst nullable = Boolean(field.nullable);\n\tconst source = buildDataSource(field.source, field.model, store);\n\n\tconst root = component({\n\t\tfield, style: { ...style }, store,\n\t\tget editable() { return editable; },\n\t\tget name() { return store.index; },\n\t\tget current() { return (store.parent || store.root).value; },\n\t\tget required() { return store.required; },\n\t\tget hidden() { return store.hidden; },\n\t\tget readonly() { return store.readonly; },\n\n\t\tget label() { return store.label || ''; },\n\t\tget placeholder() { return store.placeholder || ''; },\n\t\tget description() { return store.description || ''; },\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tlisten(event, listen) {\n\t\t\tconst fn = listen.bind(this);\n\t\t\tlet set = events.get(event);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tevents.set(event, set);\n\t\t\t}\n\t\t\tset.add(fn);\n\t\t\treturn () => { set?.delete(fn); };\n\t\t},\n\t\temit(event, e) { emitHandler(event, e); },\n\t\tget value() { return store.value; },\n\t\tset value(v) {\n\t\t\tif (destroyed) { return; }\n\t\t\tstore.value = v;\n\t\t},\n\t\tget destroyed() { return destroyedState.get(); },\n\t\tget nullable() { return nullable; },\n\t\tget disabled() { return store.disabled; },\n\t\tget clearable() { return store.clearable; },\n\t\tbind,\n\t});\n\t/**\n\t * @template {keyof FieldComponentEvent} K\n\t * @param {K} k \n\t * @param {Parameters<FieldComponentEvent[K]>} p \n\t */\n\tfunction emit(k, ...p) {\n\t\tfor (const fn of [...events.get(k) || []]) {\n\t\t\tfn(...p);\n\t\t}\n\t}\n\tconst related = relate?.(store, {\n\t\tfocus() { emit('focus'); },\n\t\tscrollIntoView() { emit('scrollIntoView'); },\n\t\troot,\n\t});\n\toptions?.signal?.addEventListener('abort', () => {\n\t\tdestroyed = true;\n\t\tdestroyedState.set(true);\n\t\tfor (const stop of stopEffects) { stop(); }\n\t\trelated?.();\n\t}, { once: true });\n\treturn root;\n}\n","/** @import { Store } from '@neeloong/form' */\n/** @import { FromRenderer } from '../typesDefine.mjs' */\nimport { renderStore } from '@neeloong/form';\nimport createStoreField from './createStoreField.mjs';\nimport DOMPurify from 'dompurify';\nconst formAttrs = new Set([\n\t'nl-form-field',\n\t'nl-form-remove',\n\t'nl-form-move',\n\t'nl-form-add',\n\t'nl-form-event',\n]);\nconst formTags = new Map([\n\t['nl-form-field', new Set(['name', 'mode', 'renderer', 'placeholder'])],\n\t['nl-form-button', new Set(['click'])],\n]);\n/**\n * \n * @param {string} html \n */\nfunction sanitizeHtml(html) {\n\treturn DOMPurify.sanitize(html, {\n\t\tADD_TAGS: Object.keys(formTags),\n\t\tADD_ATTR: (attributeName, tagName) => {\n\t\t\tconst attr = attributeName.toLowerCase();\n\t\t\tif (formAttrs.has(attr)) { return true; }\n\t\t\tconst tagAttrs = formTags.get(tagName.toLowerCase());\n\t\t\tif (tagAttrs?.has(attr)) { return true; }\n\t\t\treturn false;\n\t\t}\n\t});\n}\n/**\n * \n * @param {Store<any, any>} store \n * @param {HTMLElement} root \n * @param {Partial<FromRenderer.Options>} [options] \n */\nexport default function (store, root, { enableLink, design, layout, editable, signal } = {}) {\n\tconst style = { enableLink, design };\n\treturn renderStore(\n\t\tstore,\n\t\t(store, renderer, options) => createStoreField(store, style, renderer, options),\n\t\troot,\n\t\tlayout || {},\n\t\t{ editable: editable || false, signal, sanitizeHtml },\n\t);\n}\n","export const neverAbortedSignal = new AbortController().signal;\n","/** @import { Store } from '@neeloong/form' */\n/** @import { FromRenderer } from '../typesDefine.mjs' */\nimport { allHooks } from '../allHooks.mjs';\nimport renderStoreForm from './renderStoreForm.mjs';\nimport { createComputed } from '../signal.mjs';\nimport { neverAbortedSignal } from '../constants.mjs';\n\nconst rendererState = createComputed(() => allHooks.get('formRenderers').named());\n\n\n/**\n * \n * @param {string?} [type] \n * @returns {FromRenderer['render']?}\n */\nfunction getRender(type) {\n\tif (!type) { return null; }\n\tconst renderers = rendererState.get();\n\tif (!Object.hasOwn(renderers, type)) { return null; }\n\tconst renderer = renderers[type];\n\tif (!renderer) { return null; }\n\tconst render = renderer.render;\n\tif (typeof render !== 'function') { return null; }\n\treturn render;\n}\n/**\n * \n * @param {Store<any, any>} store \n * @param {HTMLElement} root \n * @param {Partial<FromRenderer.Options> & {type?: string}} [options] \n * @returns {void}\n */\nexport default function (store, root, options) {\n\tconst {type, editable, signal, model, layout, enableLink, design, ...others } = options || {};\n\tconst render = getRender(type) || renderStoreForm;\n\trender(store, root, {\n\t\tmodel: model || null,\n\t\tlayout: layout || null,\n\t\teditable: Boolean(editable),\n\t\tsignal: signal || neverAbortedSignal,\n\t\tenableLink: Boolean(enableLink),\n\t\tdesign: Boolean(design),\n\t\t...others,\n\t});\n}\n","/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\n/** @import { FieldComponents } from '../typesDefine.mjs' */\nimport { Store } from '@neeloong/form';\nimport toSchema from './toSchema.mjs';\n\n/**\n * \n * @param {ModelScriptConfiguration} define \n * @param {FieldComponents?} [fieldComponents] \n */\nexport default function createStore(define, fieldComponents) {\n\tconst components = typeof fieldComponents === 'object' && fieldComponents || {};\n\tconst schema = toSchema(define.fields, components, define.permissions);\n\tconst store = Store.create(schema);\n\treturn store;\n}\n","/** @import { FieldShowHandle, FieldStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\nimport { createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\nimport { getField } from './field.mjs';\n\n/**\n *\n * @param {string} name\n * @param {FieldScriptConfiguration} field\n * @param {FieldStyle} style\n * @param {any} data\n * @returns {FieldShowHandle}\n */\nexport default function createShowField(name, field, style, data) {\n\tlet destroyedState = createState(false);\n\tlet destroyed = false;\n\t/** @type {Map<string, Set<any>>} */\n\tconst events = new Map();\n\t/** @type {any} */\n\tconst value = createState(data[name]);\n\tconst component = getField(field);\n\tconst source = buildDataSource(field.source, field.model);\n\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tconst root = component({\n\t\tfield, style: { ...style },\n\t\tget editable() { return false; },\n\t\tget name() { return name; },\n\t\tget current() { return data; },\n\t\tget required() { return false; },\n\t\tget hidden() { return false; },\n\t\tget readonly() { return true; },\n\n\t\tget label() { return ''; },\n\t\tget placeholder() { return ''; },\n\t\tget description() { return ''; },\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tlisten(event, listen) {\n\t\t\tconst fn = listen.bind(this);\n\t\t\tlet set = events.get(event);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tevents.set(event, set);\n\t\t\t}\n\t\t\tset.add(fn);\n\t\t\treturn () => { set?.delete(fn); };\n\t\t},\n\t\temit() { },\n\t\tget value() { return value.get(); },\n\t\tset value(v) { },\n\t\tget destroyed() { return destroyedState.get(); },\n\t\tget nullable() { return true; },\n\t\tget disabled() { return false; },\n\t\tget clearable() { return false; },\n\n\t});\n\n\treturn {\n\t\troot,\n\t\tdestroy() {\n\t\t\tif (destroyed) { return; }\n\t\t\tdestroyed = true;\n\t\t\tdestroyedState.set(true);\n\t\t\tac.abort();\n\t\t},\n\t\tget value() {\n\t\t\treturn value;\n\t\t},\n\t\tset value(v) {\n\t\t\tif (destroyed) { return; }\n\t\t\tvalue.set(v);\n\t\t},\n\t};\n\n}\n","/** @import { Search } from '@yongdall/common' */\n/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { neverAbortedSignal } from '../constants.mjs';\nimport { getFieldFilter } from './field.mjs';\nimport { createComputed, createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n\n\n/**\n * @typedef {object} Handle\n * @property {any} value\n * @property {(value: any, operator: string) => void} update\n * @property {HTMLElement} root\n * @property {() => void} destroy\n */\n\n\n\n/**\n * \n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {string} prop \n * @param {string?} [operator] \n * @param {boolean} [sign] \n */\nexport function createFilterState(andList, prop, operator, sign) {\n\tconst props = prop.split('.');\n\tconst not = Boolean(sign);\n\tconst op = typeof operator === 'string' ? operator : '';\n\t/**\n\t * \n\t * @param {Search.Match | Search.Children} v \n\t * @returns {v is Search.Match}\n\t */\n\tfunction finder(v) {\n\t\tif (!Array.isArray(v)) { return false; }\n\t\tif (v.length === 2) { return false; }\n\t\tif (Boolean(v[3]) !== not) { return false; }\n\t\tif (v[2] !== op) { return false; }\n\t\tconst fields = v[0];\n\t\tif (fields.length !== props.length) { return false; }\n\t\tfor (const [index, field] of fields.entries()) {\n\t\t\tif ((typeof field === 'string' ? field : field[0]) !== props[index]) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * \n\t * @param {any} val \n\t */\n\tfunction set(val) {\n\t\tconst list = andList.get();\n\t\tconst index = list.findIndex(finder);\n\t\tif (index < 0) {\n\t\t\tif (val != null) {\n\t\t\t\tandList.set([...list, [props, val, op, sign ? '!' : '']]);\n\t\t\t}\n\t\t\treturn;\n\n\t\t}\n\t\tif (val !== null) {\n\t\t\t/** @type {Search.Match | Search.Children} */\n\t\t\tconst item = [...list[index]];\n\t\t\titem[1] = val;\n\t\t\tandList.set([\n\t\t\t\t...list.slice(0, index),\n\t\t\t\titem,\n\t\t\t\t...list.slice(index + 1),\n\t\t\t]);\n\t\t} else {\n\t\t\tandList.set([\n\t\t\t\t...list.slice(0, index),\n\t\t\t\t...list.slice(index + 1),\n\t\t\t]);\n\t\t}\n\n\t}\n\tfunction get() {\n\t\treturn andList.get().find(finder)?.[1];\n\t}\n\tconst state = createComputed(get);\n\treturn {\n\t\tget() { return state.get(); },\n\t\tset,\n\t};\n\n}\n\n/**\n *\n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {string} name\n * @param {FieldScriptConfiguration} field\n * @param {string} operator\n * @param {FieldFilterStyle} style\n * @param {AbortSignal} [signal]\n * @returns {HTMLElement}\n */\n\nfunction createQuickFilter(andList, name, field, operator, style, signal) {\n\tconst state = createFilterState(andList, name, operator);\n\tconst component = getFieldFilter(field, operator);\n\tconst destroyed = createState(false);\n\tconst source = buildDataSource(field.source, field.model);\n\n\tconst root = component({\n\t\tfield, style: { ...style, quick: true },\n\t\tget operator() { return operator; },\n\t\tget value() { return state.get(); },\n\t\tset value(val) {\n\t\t\tif (destroyed.get()) { return; }\n\t\t\tstate.set(val);\n\t\t},\n\t\tget source() { return source; },\n\t\tsignal: signal || neverAbortedSignal,\n\t\tget destroyed() { return destroyed.get(); },\n\t});\n\tif (signal?.aborted) {\n\t\tdestroyed.set(true);\n\t} else {\n\t\tsignal?.addEventListener('abort', () => { destroyed.set(true); }, { once: true });\n\t}\n\treturn root;\n}\n\n/**\n * @typedef {object} Match\n * @property {string} field\n * @property {string} [operator]\n * @property {any} value\n */\n/**\n * \n * @param {{get(): Search.AndList, set(v: Search.AndList): void}} andList \n * @param {HTMLElement} root \n * @param {{field: string; label?: string; operator: string}[]} filters \n * @param {object} options \n * @param {Record<string, FieldScriptConfiguration>} options.fields \n * @param {boolean} [options.inline] \n * @param {boolean} [options.showLabel]\n * @param {AbortSignal} [options.signal]\n */\nexport default function createQuickFilters(andList, root, filters, {\n\tfields, showLabel, inline, signal,\n}) {\n\tif (signal?.aborted) { return; }\n\tconst style = { showLabel, inline };\n\tfor (const { field, operator } of filters) {\n\t\tconst fieldDefine = Object.hasOwn(fields, field) && fields[field];\n\t\tif (!fieldDefine) { continue; }\n\t\tconst type = fieldDefine.type;\n\t\tif (!type || typeof type === 'object') { continue; }\n\t\tconst r = createQuickFilter(andList, field, fieldDefine, operator, style, signal);\n\t\troot.appendChild(r);\n\t\tsignal?.addEventListener('abort', () => { r.remove(); }, { once: true });\n\t}\n}\n","/** @import { FieldFilterComponent, FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { State } from '../signal.mjs' */\n\nimport { createState } from '../signal.mjs';\nimport buildDataSource from '../DataSource/index.mjs';\n\n/**\n * @typedef {object} Handle\n * @property {HTMLElement} root\n */\n\n/**\n *\n * @param {FieldFilterComponent} component\n * @param {FieldScriptConfiguration} field\n * @param {State<any>} valState\n * @param {State<any>} opState\n * @param {FieldFilterStyle} style\n * @param {AbortSignal} signal\n * @returns {HTMLElement}\n */\nexport default function createFilter(component, field, valState, opState, style, signal) {\n\tconst destroyed = createState(false);\n\tconst state = valState;\n\tconst operatorState = opState;\n\tconst source = buildDataSource(field.source, field.model);\n\n\tsignal.addEventListener('abort', () => {\n\t\tdestroyed.set(true);\n\t}, { once: true });\n\t// TODO: 选项、过滤条件\n\treturn component({\n\t\tfield, style,\n\t\tget operator() { return operatorState.get(); },\n\t\tget value() { return state.get(); },\n\t\tset value(val) {\n\t\t\tif (destroyed.get()) { return; }\n\t\t\tconst value = state.get();\n\t\t\tstate.set(val);\n\t\t\tif (Object.is(value, val)) { return; }\n\t\t},\n\t\tget source() { return source; },\n\t\tsignal,\n\t\tget destroyed() { return destroyed.get(); },\n\t});\n}\n","/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { State } from '../signal.mjs' */\n\nimport createFilter from './createFilter.mjs';\nimport { getFieldFilterOperators } from './field.mjs';\nimport { getFieldFilter } from './field.mjs';\n\n\n\n/**\n *\n * @param {FieldScriptConfiguration} field\n * @param {FieldFilterStyle} userStyle\n * @param {State<any>} valState\n * @param {State<any>} opState\n * @param {AbortSignal?} signal\n */\n\nexport default function createFieldFilter(field, valState, opState, userStyle, signal) {\n\t/** @type {FieldFilterStyle} */\n\tconst style = { ...userStyle };\n\tdelete style.quick;\n\tdelete style.showLabel;\n\tlet destroyed = signal?.aborted || false;\n\tsignal?.addEventListener('abort', () => { destroyed = true; }, { once: true });\n\tconst operators = getFieldFilterOperators(field);\n\n\tconst root = document.createElement('span');\n\troot.classList.add(`FieldFilter-main`);\n\tconst operatorSelector = root.appendChild(document.createElement('select'));\n\n\toperatorSelector.classList.add(`FieldFilter-operator`);\n\tfor (const [value, label] of Object.entries(operators)) {\n\t\tconst option = document.createElement('option');\n\t\toption.value = value;\n\t\toption.label = label || value;\n\t\toperatorSelector.appendChild(option);\n\t}\n\n\tlet currentComponent = getFieldFilter(field, opState.get());\n\tlet handleAbortController = new AbortController();\n\tlet currentHandle = createFilter(currentComponent, field, valState, opState, style, signal ? AbortSignal.any([handleAbortController.signal, signal]) : handleAbortController.signal);\n\tlet handleRoot = root.appendChild(currentHandle);\n\n\thandleRoot.classList.add(`FieldFilter-value`);\n\n\t/** @param {string?} [operator] */\n\tfunction setOperator(operator) {\n\t\tif (destroyed) { return; }\n\t\tif (typeof operator !== 'string' || operator === opState.get()) { return; }\n\t\tif (!(operator in operators)) {\n\t\t\t// TODO: 不存在此操作符\n\t\t}\n\t\toperatorSelector.value = operator;\n\t\tconst component = getFieldFilter(field, operator);\n\t\tif (component === currentComponent) {\n\t\t\topState.set(operator);\n\t\t\treturn;\n\t\t}\n\t\thandleAbortController.abort();\n\t\thandleRoot.remove();\n\t\tcurrentComponent = component;\n\t\topState.set(operator);\n\n\t\thandleAbortController = new AbortController();\n\t\tcurrentHandle = createFilter(currentComponent, field, valState, opState, style, signal ? AbortSignal.any([handleAbortController.signal, signal]) : handleAbortController.signal);\n\t\thandleRoot = root.appendChild(currentHandle);\n\t\thandleRoot.classList.add(`FieldFilter-value`);\n\t}\n\toperatorSelector.addEventListener('input', () => setOperator(operatorSelector.value));\n\tsetOperator(operatorSelector.value);\n\treturn root\n}\n","/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n/** @import { Search } from '@yongdall/common' */\nimport { createState, effect } from '../signal.mjs';\nimport createFieldFilter from './createFieldFilter.mjs';\n/**\n * @typedef {object} Filters\n * @property {HTMLElement} root\n * @property {() => void} add\n * @property {() => (Search.AndItem | null)[]} destroy\n */\n\n/**\n * \n * @param {HTMLElement} root \n * @param {Record<string, FieldScriptConfiguration>} fields \n * @param {(Search.AndItem | null)[]?} [value] \n * @returns {Filters}\n */\nexport default function createFilters(root, fields, value) {\n\troot.classList.add(`FieldFilter-filters`);\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\tlet values = Array.isArray(value) ? structuredClone(value) : [];\n\n\n\tconst fieldsMap = new Map(Object.entries(fields).filter(([, f]) => {\n\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { return false; }\n\t\treturn true;\n\t}));\n\n\tconst style = { quick: false, showLabel: false, inline: true };\n\n\t/**\n\t * \n\t * @param {Search.AndItem?} [v] \n\t * @returns \n\t */\n\tfunction createLine(v) {\n\t\tconst line = root.appendChild(document.createElement('div'));\n\t\tline.classList.add(`FieldFilter-field`);\n\n\t\tconst fieldSelect = document.createElement('select');\n\t\tfieldSelect.classList.add(`FieldFilter-fieldName`);\n\t\tline.appendChild(fieldSelect);\n\t\tconst removeButton = document.createElement('button');\n\t\tremoveButton.classList.add(`FieldFilter-remove`);\n\t\tremoveButton.type = 'button';\n\t\tline.appendChild(removeButton);\n\t\tfieldSelect.appendChild(document.createElement('option'));\n\t\tfor (const [name, f] of fieldsMap) {\n\t\t\tconst type = f.type;\n\t\t\tif (!type || typeof type === 'object') { continue; }\n\t\t\tconst option = document.createElement('option');\n\t\t\toption.value = name;\n\t\t\toption.label = f.label || name;\n\t\t\tfieldSelect.appendChild(option);\n\t\t}\n\t\t/** @type {{name: string; abort(): void}?} */\n\t\tlet fieldFilter = null;\n\t\tremoveButton.appendChild(document.createTextNode('移除'));\n\t\tremoveButton.addEventListener('click', () => {\n\t\t\tfieldFilter?.abort();\n\t\t\tconst index = [...root.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tline.remove();\n\t\t\tvalues.splice(index, 1);\n\t\t});\n\t\tconst state = createState();\n\t\tconst operatorState = createState('');\n\t\tfunction updateLine() {\n\t\t\tconst index = [...root.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tconst f = values[index];\n\t\t\tconst value = state.get();\n\t\t\tconst operator = operatorState.get();\n\t\t\tif (f && f.length !== 2) {\n\t\t\t\tconst fields = f[0];\n\t\t\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\t\t\tconst field = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\t\t\tif (!field && !fieldFilter) { return; }\n\t\t\t\tif (f && fieldFilter && field === fieldFilter.name && f[2] === operator && f[1] === value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tvalues.splice(index, 1, fieldFilter ? [[fieldFilter.name], value, operator] : null);\n\t\t}\n\t\tfieldSelect.addEventListener('change', () => {\n\t\t\tconst name = fieldSelect.value;\n\t\t\tconst field = fieldsMap.get(name);\n\t\t\tif (!fieldFilter && !field) { return; }\n\t\t\tif (fieldFilter?.name === name) { return; }\n\t\t\tfieldFilter?.abort();\n\t\t\tif (!field) {\n\t\t\t\tfieldFilter = null;\n\t\t\t\tupdateLine();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst filterAbortController = new AbortController();\n\t\t\tconst ffSignal = AbortSignal.any([filterAbortController.signal, signal]);\n\n\t\t\tstate.set(undefined);\n\t\t\toperatorState.set('');\n\t\t\tconst filterRoot = createFieldFilter(field, state, operatorState, style, ffSignal)\n\t\t\tfieldFilter = { name, abort() {filterAbortController.abort()} };\n\t\t\t// TODO: 内容进行匹配\n\t\t\tline.insertBefore(filterRoot, removeButton);\n\t\t\tffSignal.addEventListener('abort', () => {\n\t\t\t\tfilterRoot.remove();\n\t\t\t});\n\t\t\teffect(updateLine, ffSignal);\n\t\t});\n\t\tif (!v) { return; }\n\n\t\tconst fields = v[0];\n\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\tconst fieldName = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\tfieldSelect.value = fieldName;\n\t\tif (!fieldSelect.value) { return; }\n\t\tconst currentField = fieldSelect.value;\n\t\tconst field = fieldsMap.get(currentField);\n\t\tif (!field) { return; }\n\t\tconst filterAbortController = new AbortController();\n\t\tconst ffSignal = AbortSignal.any([filterAbortController.signal, signal]);\n\n\t\tif (currentField === fieldName) {\n\t\t\tstate.set(v[1]);\n\t\t\toperatorState.set(v[2] || '');\n\t\t} else {\n\t\t\tstate.set(undefined);\n\t\t\toperatorState.set('');\n\t\t}\n\t\tconst filterRoot = createFieldFilter(field, state, operatorState, style, ffSignal);\n\t\tfieldFilter = { name: currentField, abort() {filterAbortController.abort()} }\n\t\tline.insertBefore(filterRoot, removeButton);\n\t\tffSignal.addEventListener('abort', () => {\n\t\t\tfilterRoot.remove();\n\t\t});\n\t\teffect(updateLine, ffSignal);\n\t}\n\n\n\tfunction reset() {\n\t\tfor (const v of values) {\n\t\t\tcreateLine(v);\n\t\t}\n\t}\n\treset();\n\tlet destroyed = false;\n\treturn {\n\t\troot,\n\t\tadd: () => createLine(),\n\t\tdestroy() {\n\t\t\tif (destroyed) { return values; }\n\t\t\tdestroyed = true;\n\t\t\troot.innerHTML = '';\n\t\t\tac.abort();\n\t\t\treturn values;\n\t\t}\n\t};\n}\n","export const root = document.createElement('div');\n","const head = /** @type {HTMLHeadElement} */(document.querySelector('head'));\nconst oldIconLink = /** @type {HTMLLinkElement?} */(document.querySelector('link[rel=icon]'));\nconst iconLink = oldIconLink || document.createElement('link');\niconLink.rel = 'icon';\nconst defaultIcon = iconLink.href;\nlet currentIcon = defaultIcon;\n/**\n * \n * @param {string?} icon \n */\nexport function setIcon(icon) {\n\tconst newIcon = icon || defaultIcon;\n\tif (newIcon === currentIcon) { return }\n\tcurrentIcon = newIcon;\n\tif (!newIcon) {\n\t\ticonLink.remove();\n\t\treturn;\n\t}\n\ticonLink.href = newIcon;\n\thead.appendChild(iconLink);\n}\n","\n/**\n * @template T\n * @overload\n * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Promise<T>}\n */\n/**\n * @overload\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {HTMLDialogElement}\n */\n/**\n * \n * @template T\n * @param {any} [p1]\n * @param {any} [p2] \n */\nexport function createDialog(p1, p2) {\n\t/** @type {((dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T)?} */\n\tconst exec = [p1, p2].find(v => typeof v === 'function') || null;\n\tconst options = [p1, p2].find(v => v && typeof v === 'object');\n\t/**\n\t * @type {{signal?: AbortSignal; parent?: HTMLElement}}\n\t */\n\tconst { signal, parent } = options || {};\n\tconst dialog = (parent || document.body).appendChild(document.createElement('dialog'));\n\tif (signal?.aborted) {\n\t\tdialog.remove();\n\t\tif (!exec) { return dialog; }\n\t\treturn Promise.reject(signal.reason);\n\t}\n\tdialog.addEventListener('close', () => { dialog.remove(); }, { once: true });\n\tsignal?.addEventListener('abort', () => { dialog.close(); }, { once: true });\n\tdialog.showModal();\n\tif (!exec) { return dialog; }\n\tconst ac = new AbortController();\n\t/** @type {PromiseWithResolvers<never>} */\n\tconst { promise, reject } = Promise.withResolvers();\n\tdialog.addEventListener('close', () => { ac.abort(); reject(); }, { once: true });\n\n\treturn Promise.race([\n\t\tPromise.resolve().then(() => exec(dialog, ac.signal)),\n\t\tpromise,\n\t]).finally(() => dialog.close());\n}\n","import { createState } from './signal.mjs';\nimport { neverAbortedSignal } from './constants.mjs';\n\n\nexport default class GeneralContext {\n\t#destroyed = createState(false);\n\t#waitDestroy;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t */\n\tconstructor(signal) {\n\t\t/*** @type {PromiseWithResolvers<never>} */\n\t\tconst { promise, reject } = Promise.withResolvers();\n\t\tthis.#waitDestroy = promise;\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tthis.#signal = signal;\n\t\t\tif (signal.aborted) {\n\t\t\t\tthis.#destroyed.set(true);\n\t\t\t} else {\n\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\tthis.#destroyed.set(true);\n\t\t\t\t}, { once: true });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#signal = neverAbortedSignal;\n\t\t}\n\t}\n\t/**\n\t * @overload\n\t * @param {false} [useReject]\n\t * @returns {Promise<void>}\n\t */\n\t/**\n\t * @overload\n\t * @param {true} useReject\n\t * @returns {Promise<never>}\n\t */\n\t/**\n\t * @overload\n\t * @param {boolean} [useReject] \n\t * @returns {Promise<void | never>}\n\t */\n\t/**\n\t * \n\t * @param {boolean} [useReject] \n\t * @returns \n\t */\n\twaitDestroy(useReject) {\n\t\tif (useReject) { return this.#waitDestroy; }\n\t\treturn this.#waitDestroy.catch((() => { }));\n\t}\n\tget destroyed() { return this.#destroyed.get(); }\n\t/** @type {AbortSignal} */\n\t#signal;\n\tget signal() { return this.#signal; }\n}\n","import GeneralContext from '../GeneralContext.mjs';\n\n\n\nexport class ModalFooter extends GeneralContext {\n\t#root;\n\t#container = document.createElement('div');\n\tget container() { return this.#container; }\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\troot.className = 'Modal-footer';\n\t\tcontainer.className = 'Modal-footer-main';\n\t}\n}\n","/** @import { FieldScriptConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\nimport { runPattern } from '@yongdall/common';\nimport createShowField from './createShowField.mjs';\n\nexport default class List {\n\t/** @type {((id: string) => string)?} */\n\t#createUrl;\n\t/** @type {readonly [string, FieldScriptConfiguration][]} */\n\t#fieldsShow;\n\t/** @type {string} */\n\t#labelPattern;\n\t/** @type {string[]} */\n\t#idFields;\n\t/** @type {readonly any[]} */\n\t#documents = [];\n\t#table = document.createElement('table');\n\t#thead = this.#table.appendChild(document.createElement('thead'));\n\t#tr = this.#thead.appendChild(document.createElement('tr'));\n\t#tbody = this.#table.appendChild(document.createElement('tbody'));\n\tget root() { return this.#table }\n\tget createUrl() {\n\t\treturn this.#createUrl;\n\t}\n\tset createUrl(fn) {\n\t\tconst createUrl = typeof fn === 'function' ? fn : null;\n\t\tif (this.#createUrl === createUrl) { return }\n\t\tthis.#createUrl = createUrl;\n\t\tthis.#renderList();\n\t}\n\t/**\n\t * \n\t * @param {(id: string) => string} createUrl \n\t * @param {ModelScriptConfiguration} model \n\t */\n\tconstructor(createUrl, model) {\n\t\tconst fieldsShow = Object.entries(model.fields).filter(([,{type}]) => type && typeof type !== 'object');\n\t\tconst idFields = Object.entries(model.fields).filter(([,v]) => v.primary).map(([v]) => v);\n\t\tconst labelPattern = model.labelPattern || '';\n\t\tthis.#labelPattern = labelPattern;\n\t\tthis.#createUrl = typeof createUrl === 'function' ? createUrl : null;\n\t\tthis.#fieldsShow = fieldsShow;\n\t\tthis.#idFields = idFields;\n\t\tconst tr = this.#tr;\n\t\ttr.innerHTML = '';\n\t\tconst th = tr.appendChild(document.createElement('th'));\n\t\tth.appendChild(document.createTextNode('#'));\n\t\tfor (const [name,field] of fieldsShow) {\n\t\t\tconst th = tr.appendChild(document.createElement('th'));\n\t\t\tth.appendChild(document.createTextNode(field.label || name));\n\t\t}\n\t}\n\t#renderList() {\n\t\tconst tbody = this.#tbody;\n\t\ttbody.innerHTML = '';\n\t\tconst idFields = this.#idFields;\n\t\tconst labelPattern = this.#labelPattern;\n\t\tconst fieldsShow = this.#fieldsShow;\n\t\tconst createUrl = this.#createUrl;\n\t\tfor (const r of this.#documents) {\n\t\t\tconst tr = tbody.appendChild(document.createElement('tr'));\n\t\t\tconst td = tr.appendChild(document.createElement('td'));\n\t\t\tconst label = runPattern(labelPattern, r) || idFields.map(v => r[v]).join('$')\n\t\t\tif (createUrl) {\n\t\t\t\tconst a = td.appendChild(document.createElement('a'));\n\t\t\t\ta.href = createUrl(idFields.map(v => r[v]).join('$'));\n\t\t\t\ta.appendChild(document.createTextNode(label));\n\t\t\t} else {\n\t\t\t\ttd.appendChild(document.createTextNode(label));\n\t\t\t}\n\t\t\tfor (const [name,field] of fieldsShow) {\n\t\t\t\tconst td = tr.appendChild(document.createElement('td'));\n\t\t\t\tconst f = createShowField(name, field, {inline: true}, r);\n\t\t\t\ttd.appendChild(f.root);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {readonly any[]} list \n\t */\n\tsetData(list) {\n\t\tthis.#documents = list;\n\t\tthis.#renderList();\n\n\t}\n\tdestroy() {\n\t\t\n\t}\n}\n","/** @import { Menu } from './Menu.mjs' */\nimport FormList from './form/List.mjs';\nexport let List = FormList;\nexport let Pagination = class {\n\t#pagination = document.createElement('div');\n\tget root() {return this.#pagination; }\n\tget size() { return 5}\n\tset size(v) { }\n\tget page() { return 1}\n\tset page(v) { }\n\tget total() { return 0}\n\tset total(v) { }\n\t/**\n\t * \n\t * @param {(p: Pagination) => void} listen \n\t * @returns {() => void}\n\t */\n\tlisten(listen) {\n\t\treturn () => {}\n\t}\n\tdestroy() {\n\t\t\n\t}\n}\n;\n\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {Menu.Renderer} create \n * @param {AbortSignal} signal \n * @returns {Element?}\n */\nexport let createMenuButtons = (menus, create, signal) => null;\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {any} button \n * @param {Menu.Renderer} create \n * @param {AbortSignal} signal \n * @returns {Element?}\n */\nexport let createMenuButton = (menus, button, create, signal) => null;\n\n\n/** @type {Menu.Renderer} */\nexport let createMenuItem = () => null;\n\n/**\n * \n * @param {Record<string, any>} components \n */\nexport default function setComponents(components = {}) {\n\tList = components.list || components.List || List;\n\tPagination = components.pagination || components.Pagination || Pagination;\n\tconst menuButtons = components.createMenuButtons || components.menuButtons;\n\tconst menuButton = components.createMenuButton || components.menuButton;\n\tconst menuItem = components.createMenuItem || components.menuItem;\n\tif (typeof menuButtons === 'function') {\n\t\tcreateMenuButtons = menuButtons;\n\t}\n\tif (typeof menuButton === 'function') {\n\t\tcreateMenuButton = menuButton;\n\t}\n\tif (typeof menuItem === 'function') {\n\t\tcreateMenuItem = menuItem;\n\t}\n}\n","/**\n * @typedef {object} Menu\n * 菜单显示\n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 引用ID\n * @property {string} [refMode] 引用模式:展开/子菜单\n * \n * 菜单操作\n * @property {string} [page] 页面\n * @property {string} [path] 页面路径\n * @property {string} [uri] URI\n * @property {string} [target] URI打开目标窗口\n * @property {string} [command] 指令\n * @property {string} [script] 脚本\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * @property {boolean} [logged]\n * \n * 三方扩展\n * @property {boolean} [autoLogin] 自动登录\n * @property {string} [appId] 关联应用\n * \n * @property {(Menu | null)[]} children\n * @property {Menu.Button[]} buttons\n * \n * @property {string} [permission] 权限\n * \n * @property {boolean} [collapsed] 折叠\n * \n */\n\nimport { createMenuButton, createMenuButtons, createMenuItem } from './components.mjs';\nimport { neverAbortedSignal } from './constants.mjs';\n\n\n/**\n * @typedef {object} Menu.Button\n * \n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 引用ID\n * @property {string} [refMode] 引用模式:展开/子菜单\n * \n * 菜单操作\n * @property {string} [page] 页面\n * @property {string} [path] 页面路径\n * @property {string} [uri] URI\n * @property {string} [target] URI打开目标窗口\n * @property {string} [command] 指令\n * @property {string} [script] 脚本\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * \n * 三方扩展\n * @property {boolean} [autoLogin] 自动登录\n * @property {string} [appId] 关联应用\n * \n * @property {string} [permission] 权限\n * \n */\n\n/**\n * @typedef {object} Menu.Define\n * @property {string} [groupType]\n * @property {string} [group]\n * @property {number} [no]\n * @property {'' | 'button' | 'divider'} type\n * @property {number} level\n * \n * 菜单显示\n * @property {string} [label] 外观:标签\n * @property {string} [icon] 外观:图标\n * @property {string} [image] 外观:图片\n * @property {string} [color] 外观:颜色\n * @property {string} [title] 外观:标题\n * @property {string} [description] 外观:描述\n * \n * @property {string} [refType] 连接:引用类型:分组(group)、模块(module)、内置(builtin)\n * @property {string} [refId] 连接:引用ID\n * @property {string} [refMode] 连接:引用模式:展开/子菜单\n * \n * 菜单操\n * @property {string} [page] 连接:页面\n * @property {string} [path] 连接:页面路径\n * @property {string} [uri] 连接:URI\n * @property {string} [target] 连接:URI打开目标窗口\n * @property {string} [command]\n * @property {string} [script]\n * @property {() => void} [click] 点击事件\n * @property {(() => boolean) | boolean} [disabled] 点击事件\n * \n * \n * @property {boolean} [autoLogin] 三方扩展:自动登录\n * @property {string} [appId] 三方扩展:关联应用\n * \n * @property {string} [permission] 权限\n * \n * @property {boolean} [collapsed] 折叠\n * \n */\n/**\n * @typedef {(menu: Menu, signal: AbortSignal, isButton?: boolean) => HTMLElement?} Menu.Renderer\n */\n\nconst actionProps = [\n\t'uri', 'target', 'page', 'path', 'command', 'script', 'click',\n];\n\n\n/**\n * \n * @param {Record<string, any>} data\n * @param {string[]} actionProps \n */\nfunction clear(data, actionProps) {\n\tfor (const k of actionProps) {\n\t\tdelete data[k];\n\n\t}\n\treturn data;\n}\n/**\n * @param {Menu.Define[]} list \n * @param {Menu.Button[]} [rootButtons] \n * @returns {(Menu | null)[]}\n */\nfunction fromDefine(list, rootButtons = []) {\n\t/** @type {(Menu | null)[]} */\n\tconst rootMenus = [];\n\t/** @type {(Menu | null)[]} */\n\tconst parents = [];\n\tfor (const { level: levelX, type, ...item } of list) {\n\t\tconst level = Math.max(0, Math.floor(levelX)) || 0;\n\t\tparents.length = level;\n\t\tconst parent = parents.findLast(Boolean);\n\t\tif (type === 'button') {\n\t\t\t/** @type {Menu.Button} */\n\t\t\tconst button = item;\n\t\t\tif (parent) {\n\t\t\t\tparent.buttons.push(button);\n\t\t\t} else {\n\t\t\t\trootButtons.push(button);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t/** @type {Menu?} */\n\t\tconst menu = type === 'divider' ? null : { ...item, buttons: [], children: [] };\n\t\tif (parent) {\n\t\t\tparent.children.push(menu);\n\t\t} else {\n\t\t\trootMenus.push(menu);\n\t\t}\n\t\tparents[level] = menu;\n\t}\n\treturn rootMenus;\n}\n\n\n/**\n * \n * @param {(Menu | null)[]} menus \n * @param {(menu: Menu) => boolean} [filter] \n * @param {boolean?} [expandSingle] \n */\nfunction filterMenu(menus, filter, expandSingle) {\n\t/** @type {(Menu | null)[]} */\n\tconst result = [];\n\tfor (const menu of menus) {\n\t\tif (!menu) {\n\t\t\tresult.push(menu);\n\t\t\tcontinue;\n\t\t}\n\t\tconst { children } = menu;\n\t\tif (filter && !filter(menu)) { continue; }\n\t\tif (!children?.length) {\n\t\t\tresult.push(menu);\n\t\t\tcontinue;\n\t\t}\n\t\tconst list = filterMenu(children, filter, expandSingle).filter((m, i, s) => {\n\t\t\tif (m) { return true; }\n\t\t\tif (i === 0) { return true; }\n\t\t\tif (s[i - 1]) { return true; }\n\t\t\treturn false;\n\t\t});\n\t\tif (!list.length) { continue; }\n\t\tif (expandSingle && list.filter(Boolean).length <= 1) {\n\t\t\tresult.push(...list);\n\t\t} else {\n\t\t\tif (!list[list.length - 1]) { list.pop(); }\n\t\t\tif (!list[0]) { list.shift(); }\n\t\t\tresult.push({ ...menu, children: list });\n\t\t}\n\t}\n\tif (expandSingle && result.length === 1) {\n\t\tconst [item] = result;\n\t\tif (item?.children?.length) {\n\t\t\treturn item.children;\n\t\t}\n\t}\n\treturn result;\n}\n/**\n * @template T\n * @overload\n * @param {Map<string, Map<string, T>>} map \n * @param {T} value \n * @param {string} key1\n * @param {string} key2\n * @returns {void}\n */\n/**\n * \n * @param {Map<any, any>} map \n * @param {*} value \n * @param {...any} keys \n */\nfunction setMapValue(map, value, ...keys) {\n\tlet m = map;\n\tconst last = keys.pop();\n\tfor (const key of keys) {\n\t\tlet map = m.get(key);\n\t\tif (!map) {\n\t\t\tmap = new Map();\n\t\t\tm.set(key, map);\n\t\t}\n\t\tm = map;\n\t}\n\tm.set(last, value);\n}\n\n/**\n * \n * @param {Menu.Define[]} menus \n * @param {string} groupType \n * @param {string} group \n * @param {Menu.Button[]} [buttons]\n * @returns {(Menu | null)[]}\n */\nfunction buildMenu(menus, groupType, group, buttons) {\n\t/** @type {Map<string, Map<string, (Menu | null)[]>>} */\n\tconst menuGroups = new Map();\n\t/** @type {Map<string, Map<string, Menu.Button[]>>} */\n\tconst buttonGroups = new Map();\n\tfor (const [groupType, v] of Map.groupBy(menus, m => m.groupType || '').entries()) {\n\t\tfor (const [group, list] of Map.groupBy(v, m => m.group || '').entries()) {\n\t\t\t/** @type {Menu.Button[]} */\n\t\t\tconst buttons = [];\n\t\t\tconst menu = fromDefine(list, buttons);\n\t\t\tsetMapValue(buttonGroups, buttons, groupType, group);\n\t\t\tsetMapValue(menuGroups, menu, groupType, group);\n\t\t}\n\t}\n\t/** @type {Map<string, Map<string, (Menu | null)[]>>} */\n\tconst allMenuTypes = new Map();\n\t/** @type {Map<string, Map<string, Menu.Button[]>>} */\n\tconst allButtonTypes = new Map();\n\t/**\n\t * \n\t * @param {Menu.Button[]} buttons \n\t */\n\tfunction runButton(buttons) {\n\t\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\t\tconst menu = buttons[i];\n\t\t\tconst { refType, refId } = menu;\n\t\t\tif (!refType || !refId) { continue; }\n\t\t\tclear(menu, actionProps);\n\t\t\tconst subButtons = allButtonTypes.get(refType)?.get(refId);\n\t\t\tbuttons.splice(i, 1, ...subButtons || []);\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t */\n\tfunction runMenu(menus) {\n\t\tfor (let i = menus.length - 1; i >= 0; i--) {\n\t\t\tconst menu = menus[i];\n\t\t\tif (!menu) { continue; }\n\t\t\tif (menu.children?.length) {\n\t\t\t\trunMenu(menu.children);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { refType, refId, refMode } = menu;\n\t\t\tif (!refType || !refId) { continue; }\n\t\t\tclear(menu, actionProps);\n\t\t\tconst subMenus = allMenuTypes.get(refType)?.get(refId);\n\t\t\tconst subButtons = allButtonTypes.get(refType)?.get(refId);\n\t\t\tif (!subMenus?.length && !subButtons?.length) {\n\t\t\t\tmenus.splice(i, 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (refMode === 'replace') {\n\t\t\t\tmenus.splice(i, 1, ...subMenus || []);\n\t\t\t} else {\n\t\t\t\tmenu.children = subMenus || [];\n\t\t\t\tmenu.buttons = subButtons || [];\n\t\t\t}\n\t\t}\n\t}\n\tconst types = ['builtin', 'module', 'group'];\n\tfor (const type of types) {\n\t\tconst menus = menuGroups.get(type);\n\t\tif (menus) {\n\t\t\tfor (const list of menus.values()) {\n\t\t\t\trunMenu(list);\n\t\t\t}\n\t\t\tallMenuTypes.set(type, menus);\n\t\t}\n\t\tconst buttons = buttonGroups.get(type);\n\t\tif (buttons) {\n\t\t\tfor (const list of buttons.values()) {\n\t\t\t\trunButton(list);\n\t\t\t}\n\t\t\tallButtonTypes.set(type, buttons);\n\t\t}\n\t\tmenuGroups.delete(type);\n\t\tbuttonGroups.delete(type);\n\t}\n\tfor (const t of menuGroups.values()) {\n\t\tfor (const menus of t.values()) {\n\t\t\trunMenu(menus);\n\t\t}\n\t}\n\tfor (const t of buttonGroups.values()) {\n\t\tfor (const list of t.values()) {\n\t\t\trunButton(list);\n\t\t}\n\t}\n\tfor (const [k, v] of buttonGroups.entries()) {\n\t\tallButtonTypes.set(k, v);\n\t}\n\tfor (const [k, v] of menuGroups.entries()) {\n\t\tallMenuTypes.set(k, v);\n\t}\n\tif (buttons) {\n\t\tfor (const button of allButtonTypes.get(groupType)?.get(group) || []) {\n\t\t\tbuttons.push(button);\n\t\t}\n\t}\n\treturn allMenuTypes.get(groupType)?.get(group) || [];\n}\n\n\nexport const Menu = {\n\t/**\n\t * @param {Menu.Define[]} list \n\t * @param {Menu.Button[]} [buttons] \n\t * @returns {(Menu | null)[]}\n\t */\n\tfromDefine(list, buttons) { return fromDefine(list, buttons); },\n\t/**\n\t * \n\t * @param {Menu.Define[]} menus \n\t * @param {string} groupType \n\t * @param {string} group \n\t * @param {Menu.Button[]} [buttons]\n\t * @returns {(Menu | null)[]}\n\t */\n\tbuild(menus, groupType, group, buttons) {\n\t\treturn buildMenu(menus, groupType, group, buttons);\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {(menu: Menu) => boolean} [filter] \n\t * @param {boolean?} [expandSingle] \n\t */\n\tfilter(menus, filter, expandSingle) {\n\t\tconst result = filterMenu(menus, filter, expandSingle);\n\t\t/** @type {(Menu | null)[]} */\n\t\tconst list = [];\n\t\tlet divider = false;\n\t\tfor (const r of result) {\n\t\t\tif (r) {\n\t\t\t\tif (divider) {\n\t\t\t\t\tlist.push(null);\n\t\t\t\t}\n\t\t\t\tdivider = false;\n\t\t\t\tlist.push(r);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!list.length) { continue; }\n\t\t\tdivider = true;\n\t\t}\n\t\treturn list;\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {any} button \n\t * @param {Menu.Renderer} create \n\t * @param {AbortSignal?} [signal] \n\t * @returns {Element?}\n\t */\n\tcreateButton(menus, button, create, signal) {\n\t\treturn createMenuButton(menus, button, create, signal || neverAbortedSignal)\n\t},\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {Menu.Renderer} create \n\t * @param {AbortSignal?} [signal] \n\t * @returns {Element?}\n\t */\n\tcreateButtons(menus, create, signal) {\n\t\treturn createMenuButtons(menus, create, signal || neverAbortedSignal)\n\t},\n\t/**\n\t * \n\t * @param {Menu} menu \n\t * @param {AbortSignal?} [signal] \n * @param {boolean} [isButton] \n\t */\n\tcreateItem(menu, signal, isButton) {\n\t\treturn createMenuItem(menu, signal || neverAbortedSignal, isButton);\n\t},\n};\n","import GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\n\n\n\nexport class ModalHeader extends GeneralContext {\n\t#root;\n\t#container = document.createElement('div');\n\t#menu = document.createElement('div');\n\t#buttons = document.createElement('div');\n\tget container() { return this.#container; }\n\tget buttons() { return this.#buttons; }\n\t#destroyMenu = () => { };\n\t/**\n\t * \n\t * @param {*} menus \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, create = Menu.createItem) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#destroyMenu();\n\t\tconst menuContainer = this.#menu;\n\t\tconst ac = new AbortController();\n\t\tconst menu = Menu.createButtons(menus, create, AbortSignal.any([ac.signal, this.signal]));\n\t\tif (menu) { menuContainer.appendChild(menu); }\n\t\tthis.#destroyMenu = () => { ac.abort(); menu?.remove(); this.#destroyMenu = () => { }; };\n\t}\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\tconst menu = root.appendChild(this.#menu);\n\t\tconst buttons = root.appendChild(this.#buttons);\n\t\troot.className = 'Modal-header';\n\t\tcontainer.className = 'Modal-header-main';\n\t\tmenu.className = 'Modal-header-menu';\n\t\tbuttons.className = 'Modal-header-buttons';\n\t}\n}\n","import GeneralContext from '../GeneralContext.mjs';\nimport { ModalFooter } from './ModalFooter.mjs';\nimport { ModalHeader } from './ModalHeader.mjs';\nexport class Modal extends GeneralContext {\n\t#dialog = document.createElement('dialog');\n\t#ac;\n\t#main = this.#dialog.appendChild(document.createElement('div'));\n\t/**\n\t * @param {object} [options] \n\t * @param {AbortSignal} [options.signal] \n\t * @param {HTMLElement} [options.parent] \n\t */\n\tconstructor(options) {\n\t\tconst { signal, parent } = options || {};\n\t\tconst ac = new AbortController();\n\t\tsuper(\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, ac.signal])\n\t\t\t\t: ac.signal,\n\t\t);\n\t\tconst dialog = (parent || document.body).appendChild(this.#dialog);\n\t\tthis.#ac = ac;\n\t\tdialog.addEventListener('close', () => { ac.abort(); dialog.remove(); }, { once: true });\n\t\tthis.signal.addEventListener('abort', () => { dialog.close(); }, { once: true });\n\t\tdialog.className = 'Modal';\n\t\tthis.#main.className = 'Modal-body';\n\t\tdialog.showModal();\n\t}\n\tget container() { return this.#main; }\n\t/**\n\t * @template T\n\t * @param {(dialog: this) => PromiseLike<T> | T} exec\n\t * @returns {Promise<T>}\n\t */\n\tasync do(exec) {\n\t\tthis.signal.throwIfAborted();\n\t\ttry {\n\t\t\treturn await Promise.race([\n\t\t\t\texec(this),\n\t\t\t\tthis.waitDestroy(true),\n\t\t\t]);\n\t\t} finally {\n\t\t\tthis.#ac.abort();\n\t\t}\n\t}\n\n\t/** @type {ModalHeader?} */\n\t#header = null;\n\t/** @type {AbortController?} */\n\t#headerAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateHeader(signal) {\n\t\tthis.signal.throwIfAborted();\n\t\tif (signal?.aborted) {\n\t\t\tconst headerAbortController = this.#headerAbortController;\n\t\t\tif (headerAbortController) {\n\t\t\t\theaderAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#header) { return this.#header; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#dialog.insertBefore(root, this.#main);\n\t\tthis.#headerAbortController = abortController;\n\t\tconst header = new ModalHeader(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#header = header;\n\t\theader.signal.addEventListener('abort', () => {\n\t\t\tthis.#headerAbortController = null;\n\t\t\tthis.#header = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#header;\n\t}\n\t/** @type {ModalFooter?} */\n\t#footer = null;\n\t/** @type {AbortController?} */\n\t#footAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateFooter(signal) {\n\t\tthis.signal.throwIfAborted();\n\t\tif (signal?.aborted) {\n\t\t\tconst footAbortController = this.#footAbortController;\n\t\t\tif (footAbortController) {\n\t\t\t\tfootAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#footer) { return this.#footer; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#dialog.appendChild(root);\n\t\tthis.#footAbortController = abortController;\n\t\tconst footer = new ModalFooter(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#footer = footer;\n\n\t\tfooter.signal.addEventListener('abort', () => {\n\t\t\tthis.#footAbortController = null;\n\t\t\tthis.#footer = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#footer;\n\t}\n}\n","import { Modal } from './Modal.mjs';\n\n/**\n * @template T\n * @overload\n * @param {(modal: Modal) => PromiseLike<T> | T} exec\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Promise<T>}\n */\n/**\n * @overload\n * @param {object} [options] \n * @param {AbortSignal} [options.signal] \n * @param {HTMLElement} [options.parent] \n * @returns {Modal}\n */\n\n\n/**\n * \n * @template T\n * @param {any} [p1]\n * @param {any} [p2] \n */\nexport function createModal(p1, p2) {\n\tconst options = [p1, p2].find(v => v && typeof v === 'object');\n\tconst modal = new Modal(options);\n\t/** @type {((modal: Modal) => PromiseLike<T> | T)?} */\n\tconst exec = [p1, p2].find(v => typeof v === 'function') || null;\n\tif (typeof exec !== 'function') { return modal; }\n\treturn modal.do(exec);\n}\n","export { root } from './root.mjs';\nexport { setIcon } from './setIcon.mjs';\nexport { createDialog } from './createDialog.mjs';\nexport { createModal } from './createModal.mjs';\nexport { Modal } from './Modal.mjs';\nexport { ModalFooter } from './ModalFooter.mjs';\nexport { ModalHeader } from './ModalHeader.mjs';\n\n\nexport const isMac = (() => {\n\t// @ts-ignore\n\tconst userAgentData = navigator.userAgentData;\n if (userAgentData?.platform) { return userAgentData.platform === 'macOS'; }\n const isMacUA = /macintosh|mac os x/i.test(navigator.userAgent.toLowerCase());\n\tif (isMacUA) { return true; }\n return navigator.platform.toLowerCase().includes('mac');\n})();\n","/** @import { Search } from '@yongdall/common' */\n/** @import { FieldScriptConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\n/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n\nimport { createDialog } from '../dom/index.mjs';\nimport { createState, effect, watch } from '../signal.mjs';\nimport createFilter from './createFilter.mjs';\nimport { getFieldFilterOperators } from './field.mjs';\nimport { getFieldFilter } from './field.mjs';\n\n/**\n * \n * @param {ModelScriptConfiguration} modelDefine \n * @param {Search.AndItem[]?} [value] \n * @param {HTMLElement} [root] \n * @param {AbortSignal} [signal] \n * @returns {Promise<Search.AndItem[]>}\n */\nexport default async function showFilterDialog(modelDefine, value, root, signal) {\n\tif (signal?.aborted) { return Promise.reject(signal.reason); }\n\tconst { resolve, reject, promise } = Promise.withResolvers();\n\tconst fields = modelDefine.fields;\n\tconst values = Array.isArray(value) ? structuredClone(value) : [];\n\tconst fieldsMap = new Map(Object.entries(fields).filter(([, f]) => {\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { return false; }\n\t\treturn true;\n\t}));\n\tconst dialog = createDialog({parent: root});\n\tconst list = dialog.appendChild(document.createElement('div'));\n\tconst form = dialog.appendChild(document.createElement('form'));\n\tconst addItem = form.appendChild(document.createElement('select'));\n\tconst okButton = form.appendChild(document.createElement('button'));\n\tconst cancelButton = form.appendChild(document.createElement('button'));\n\n\tdialog.classList.add(`Modal`);\n\tlist.classList.add(`Modal-body`);\n\tform.classList.add(`Modal-footer`);\n\tform.classList.add(`MenuButtons`);\n\n\tlist.classList.add(`FieldFilter-filters`);\n\tokButton.value = 'ok';\n\tform.method = 'dialog';\n\tokButton.appendChild(document.createTextNode('确认'));\n\tcancelButton.appendChild(document.createTextNode('取消'));\n\n\n\n\n\tconst v = addItem.appendChild(document.createElement('option'));\n\tv.label = '<添加>';\n\tfor (const [name, f] of fieldsMap) {\n\t\tconst type = f.type;\n\t\tif (!type || typeof type === 'object') { continue; }\n\t\tconst option = document.createElement('option');\n\t\toption.value = name;\n\t\toption.label = f.label || name;\n\t\taddItem.appendChild(option);\n\t}\n\n\t/**\n\t * \n\t * @param {Search.AndItem} v\n\t * @param {string} fieldName\n\t * @param {FieldScriptConfiguration} field\n\t * @param {Search.Field[]} fields\n\t * @returns \n\t */\n\tfunction createLine(v, fieldName, field, fields) {\n\t\tconst ac = new AbortController();\n\t\tconst lineSignal = signal ? AbortSignal.any([signal, ac.signal]) : ac.signal;\n\t\tconst line = list.appendChild(document.createElement('div'));\n\t\tline.classList.add(`FieldFilter-field`);\n\n\t\tconst fieldNameSelect = document.createElement('span');\n\t\tfieldNameSelect.classList.add(`FieldFilter-fieldName`);\n\t\tline.appendChild(fieldNameSelect);\n\t\tfieldNameSelect.appendChild(document.createTextNode(field.label || fieldName));\n\n\n\n\t\t/** @type {FieldFilterStyle} */\n\t\tconst style = { inline: true };\n\t\tconst operators = getFieldFilterOperators(field);\n\t\tconst root = document.createElement('span');\n\t\troot.classList.add(`FieldFilter-main`);\n\t\tconst operatorSelector = line.appendChild(document.createElement('select'));\n\t\toperatorSelector.classList.add(`FieldFilter-operator`);\n\n\t\tfor (const [value, label] of Object.entries(operators)) {\n\t\t\tconst option = document.createElement('option');\n\t\t\toption.value = value;\n\t\t\toption.label = label || value;\n\t\t\toperatorSelector.appendChild(option);\n\t\t}\n\n\t\tconst removeButton = document.createElement('button');\n\t\tremoveButton.classList.add(`FieldFilter-remove`);\n\t\tremoveButton.type = 'button';\n\t\tline.appendChild(removeButton);\n\t\tremoveButton.appendChild(document.createTextNode('移除'));\n\t\tremoveButton.addEventListener('click', () => {\n\t\t\tac.abort();\n\t\t\tconst index = [...list.children].indexOf(line);\n\t\t\tif (index < 0) { return; }\n\t\t\tline.remove();\n\t\t\tvalues.splice(index, 1);\n\n\t\t});\n\t\t/**\n\t\t * \n\t\t * @param {*} value \n\t\t * @param {string} operator \n\t\t * @returns \n\t\t */\n\t\tfunction find(value, operator) {\n\t\t\tconst index = [...list.children].indexOf(line);\n\t\t\tif (index < 0) { return -1; }\n\t\t\tconst item = values[index];\n\t\t\tif (!item) { return index; }\n\t\t\tif (Object.is(value, item[1])) { return index; }\n\t\t\tif (Object.is(operator, item[2])) { return index; }\n\t\t\treturn -1;\n\n\t\t}\n\n\n\t\tlet operator = v[2] || '';\n\t\toperatorSelector.value = operator;\n\t\t/** @type {any} */\n\t\tlet newValue = v[1];\n\t\tif (operatorSelector.value != operator) {\n\t\t\toperator = operatorSelector.value;\n\t\t\tnewValue = null;\n\t\t}\n\t\tconst state = createState(newValue);\n\t\tconst operatorState = createState(operator);\n\t\teffect(() => {\n\t\t\tconst value = state.get();\n\t\t\tconst operator = operatorState.get();\n\t\t\tconst index = find(value, operator);\n\t\t\tif (index < 0) { return; }\n\t\t\tvalues.splice(index, 1, [fields, value, operator]);\n\t\t}, lineSignal);\n\t\t\n\t\tlet currentComponent = getFieldFilter(field, operatorState.get());\n\n\t\tlet handleAbortController = new AbortController();\n\t\tlet currentHandle = createFilter(currentComponent, field, state, operatorState, style, AbortSignal.any([handleAbortController.signal, lineSignal]));\n\t\toperatorSelector.value = operatorState.get();\n\t\tlet handleRoot = line.insertBefore(currentHandle, removeButton);\n\t\thandleRoot.classList.add(`FieldFilter-value`);\n\n\n\t\toperatorSelector.addEventListener('input', () => {\n\t\t\tconst newOperator = operatorSelector.value;\n\t\t\tif (!(newOperator in operators)) {\n\t\t\t\t// TODO: 不存在此操作符\n\t\t\t}\n\t\t\tif (typeof newOperator !== 'string') { return; }\n\t\t\tconst component = getFieldFilter(field, newOperator);\n\t\t\tif (component === currentComponent) {\n\t\t\t\toperatorState.set(newOperator);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleAbortController.abort();\n\t\t\thandleRoot.remove();\n\t\t\tcurrentComponent = component;\n\t\t\toperatorState.set(newOperator);\n\t\t\thandleAbortController = new AbortController();\n\t\t\tcurrentHandle = createFilter(currentComponent, field, state, operatorState, style, AbortSignal.any([handleAbortController.signal, lineSignal]));\n\t\t\thandleRoot = line.insertBefore(currentHandle, removeButton);\n\t\t\thandleRoot.classList.add(`FieldFilter-value`);\n\t\t});\n\t}\n\tfor (const v of values) {\n\n\t\tconst fields = v[0];\n\t\tconst fieldItem = fields.length === 1 && fields[0];\n\t\tconst fieldName = typeof fieldItem === 'string' ? fieldItem : Array.isArray(fieldItem) && fieldItem.length === 1 ? fieldItem[0] : '';\n\n\t\tconst field = fieldsMap.get(fieldName);\n\t\tif (!field) {\n\t\t\t// TODO: 添加占位符\n\t\t\tcontinue;\n\t\t}\n\t\tcreateLine(v, fieldName, field, fields);\n\t}\n\n\n\n\taddItem.addEventListener('change', () => {\n\t\tconst name = addItem.value;\n\t\taddItem.value = '';\n\t\tconst field = fieldsMap.get(name);\n\t\tif (!field) { return; }\n\t\tcreateLine([[name], '', ''], name, field, [[name]]);\n\t});\n\n\tdialog.addEventListener('close', () => {\n\t\tlist.innerHTML = '';\n\t\tif (signal?.aborted) { return reject(signal.reason); }\n\t\tif (dialog.returnValue !== 'ok') { return reject(new Error('User canceled')); }\n\t\tresolve(values.filter(/** @type {(v: Search.AndItem?) => v is Search.AndItem} */(/** @type {any} */(Boolean))));\n\t});\n\n\treturn promise.finally(() => dialog.close());\n\n}\n","import { application } from '../configuration.mjs';\n\n/**\n * \n * @param {...string} paths \n * @returns \n */\nexport default function toUrl(...paths) {\n\tlet url = '/'\n\tfor (const path of paths) {\n\t\tconst a = url.lastIndexOf('?');\n\t\tif (a >= 0 && url.lastIndexOf('#') < a) {\n\t\t\turl += '#'\n\t\t}\n\t\turl += '/' + path;\n\t}\n\turl = url.split('#').map(s => {\n\t\tconst index = s.indexOf('?');\n\t\tconst path = index >= 0 ? s.slice(0, index) : s;\n\t\tconst search = index >= 0 ? s.slice(index) : '';\n\t\tconst p = path.split('/');\n\t\tconst first = p.shift() || '';\n\t\t/** @type {string[]} */\n\t\tconst list = [];\n\t\tfor (const k of p) {\n\t\t\tif (!k) { continue; }\n\t\t\tif (k === '.') { continue; }\n\t\t\tif (k === '..'){\n\t\t\t\tlist.pop();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(k);\n\t\t}\n\t\tlist.unshift(first);\n\t\treturn `${list.join('/')}${search}`;\n\t}).join('#');\n\tconst root = application.path;\n\tif (url.startsWith(root)) { return url }\n\tconst k1 = url.indexOf('?');\n\tconst k2 = url.indexOf('#');\n\tconst k = k1 < 0 ? k2 : k2 < 0 ? k1 : Math.min(k1,k2);\n\tconst path = k < 0 ? url : url.slice(0, k);\n\tif (path.length !== root.length - 1) { return url}\n\tif (!root.startsWith(path)) { return url; }\n\tif (k < 0) { return root};\n\treturn root + url.slice(k);\n}\n","import { pluginIdRegex } from '@yongdall/common';\n\n/**\n * \n * @param {string} n \n * @returns {boolean}\n */\nexport default function isPluginId(n) {\n\tif (!n || typeof n !== 'string') { return false}\n\treturn pluginIdRegex.test(n);\n}\n","\n/**\n * \n * @overload\n * @param {AbortSignal | null | undefined} signal \n * @param {true} useReject \n * @returns {Promise<never>}\n */\n\n/**\n * \n * @overload\n * @param {AbortSignal?} [signal] \n * @param {boolean?} [useReject] \n * @returns {Promise<void | never>}\n */\n\n/**\n * \n * @param {AbortSignal?} [signal] \n * @param {boolean?} [useReject] \n * @returns {Promise<void | never>}\n */\nexport default function waitAbortSignal(signal, useReject) {\n\t/** @type {PromiseWithResolvers<void | never>} */\n\tconst { promise, resolve, reject } = Promise.withResolvers();\n\tif (!(signal instanceof AbortSignal)) { return promise; }\n\tif (signal.aborted) {\n\t\tif (useReject) {\n\t\t\treject(signal.reason);\n\t\t} else {\n\t\t\tresolve();\n\t\t}\n\t} else {\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tif (useReject) {\n\t\t\t\treject(signal.reason);\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, { once: true });\n\t}\n\treturn promise;\n}\n","/** @type {(0|1)[][]} */\nconst bars = [\n\t[1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0],\n\t[1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0],\n\t[1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0],\n\t[1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0],\n\t[1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0],\n\t[1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0],\n\t[1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0],\n\t[1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],\n\t[1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0],\n\t[1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0],\n\t[1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0],\n\t[1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0],\n\t[1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0],\n\t[1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0],\n\t[1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0],\n\t[1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0],\n\t[1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0],\n\t[1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0],\n\t[1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0],\n\t[1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0],\n\t[1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0],\n\t[1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0],\n\t[1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0],\n\t[1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0],\n\t[1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0],\n\t[1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0],\n\t[1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0],\n\t[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0],\n\t[1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0],\n\t[1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1]\n];\n/**\n * @template T\n * @param {T[]} array \n * @param {T} val \n * @param {number} start \n * @param {number} end \n */\nfunction fillArray(array, val, start, end) {\n\tfor (let i = start; i < end; i++) {\n\t\tarray[i] = val;\n\t}\n}\n/**\n * @template T\n * @param {T[]} array \n * @param {(value: T) => unknown} predicate \n * @param {number} fromIndex \n */\nfunction findIndex(array, predicate, fromIndex) {\n\tfor (let i = fromIndex; i < array.length; i++) {\n\t\tif (predicate(array[i])) { return i; }\n\t}\n\treturn -1;\n\n}\nlet char0 = '0'.charCodeAt(0) || 0;\nlet char9 = '9'.charCodeAt(0) || 0;\n/**\n * \n * @param {string} text \n */\nexport function encode(text) {\n\tconst chars = [...text].map(v => typeof v === 'number' ? v : v.charCodeAt(0) || 0);\n\t/** @type {(1 | 2 | 3 | 0)[]} */\n\tconst modes = chars.map(v => {\n\t\tif (v < 32) { return 1; }\n\t\tif (v > 96) { return 2; }\n\t\treturn 0;\n\t});\n\n\tfor (let end = 0; end >= 0;) {\n\t\tlet start = findIndex(chars, c => c >= char0 && c <= char9, end);\n\t\tif (start < 0) { break; }\n\t\tend = findIndex(chars, c => c < char0 || c > char9, start + 1);\n\t\tlet count = (end < 0 ? chars.length : end) - start;\n\t\tif (count < 4) { continue; }\n\t\tif (count % 2) {\n\t\t\tcount -= 1;\n\t\t\tif (start && end < 0) { start += 1; }\n\t\t}\n\t\tfillArray(modes, 3, start, start + count);\n\t}\n\n\tfor (let end = 0; end >= 0;) {\n\t\tconst start = modes.indexOf(0, end);\n\t\tif (start < 0) { break; }\n\t\tend = findIndex(modes, Boolean, start + 1);\n\n\t\tconst mode1 = modes[start - 1] || 0;\n\t\tconst mode2 = modes[end] || 0;\n\t\tconst endModes = [mode1, mode2];\n\t\tconst mode = endModes.includes(1) && !endModes.includes(2) ? 1 : 2;\n\t\tfillArray(modes, mode, start, end < 0 ? chars.length : end);\n\t}\n\tconst codes = [];\n\t/** @type {1 | 2 | 3 | 0} */\n\tlet mode = 0;\n\tfor (let i = 0; i < chars.length; i++) {\n\t\tlet currentMode = modes[i] || 2;\n\t\tconst nextMode = modes[i + 1] || 2;\n\t\tlet char = chars[i];\n\t\tif (currentMode === 3) {\n\t\t\tif (nextMode !== 3) {\n\t\t\t\tcurrentMode = nextMode;\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t\tchar = ((char - char0) || 0) * 10 + ((chars[i] - char0) || 0);\n\n\t\t\t}\n\t\t}\n\t\tif (currentMode === 2) {\n\t\t\tchar -= 32;\n\t\t} else if (currentMode === 1) {\n\t\t\tchar = (char + 64) % 96;\n\t\t}\n\t\tif (mode !== currentMode) {\n\n\t\t\tif (mode === nextMode && mode !== 3 && currentMode !== 3) {\n\t\t\t\tcodes.push(98);\n\t\t\t} else {\n\t\t\t\tcodes.push(mode ? 102 - currentMode : 102 + currentMode);\n\t\t\t\tmode = currentMode;\n\t\t\t}\n\t\t}\n\t\tcodes.push(char);\n\t}\n\tcodes.push(codes.reduce((s, v, i) => (s + v * i), codes[0]) % 103);\n\tcodes.push(106);\n\treturn codes.flatMap(v => bars[v] || []);\n\n}\n","\n/**\n * \n * @param {string?} script \n * @param {Record<string, unknown>} scope \n * @returns {unknown}\n */\nexport function execScript(script, scope) {\n\t\tif (!script || typeof script !== 'string') { return null }\n\t\tconst s = script.slice(0,2);\n\t\tlet type = '';\n\t\tif (s === '#!' || s === '#?') {\n\t\t\tconst index = s.indexOf('\\n');\n\t\t\tif (index < 0) { return null }\n\t\t\ttype = script.slice(0, index);\n\t\t\tscript = script.slice(index + 1);\n\t\t}\n\t\t// TODO: 根据类型执行\n\t\treturn null\n}\n","/** @import DotRequest from 'dot-request' */\n/** @import { Field, PageForm } from '@yongdall/types' */\nimport { Search } from '@yongdall/common';\nimport { Menu } from '../Menu.mjs';\nimport request from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\nimport { application } from '../configuration.mjs';\n\n/**\n * @typedef {object} PageConfiguration\n * @property {string} [id]\n * @property {string} [model]\n * @property {string} [user]\n * @property {string} [organization]\n * @property {string} [workspace]\n * @property {string} [page]\n * @property {string} [url]\n * \n * @property {string?} [widget]\n * \n * @property {string} [title]\n * @property {string} [titlePattern]\n * @property {Record<string, any>} [config]\n * @property {Field.Show[]} [fields]\n * @property {{widget: string; options: string}[]} [sides]\n * @property {Menu.Button[]} [menuButtons]\n * @property {(Menu | null)[]} [menus]\n * @property {Record<string, PageForm?>} [forms]\n * @property {Search.AndList} [where]\n * @property {Search.OrList} [orWhere]\n * @property {string} [defaultQuery]\n * @property {{ field: string; label?: string; operator: string; }[]} [filters]\n * \n * \n * // TODO: 是否分页\n * \n */\n\n/**\n * @typedef {object} PageParam\n * @property {string?} [model]\n * @property {string?} [organization] \n * @property {string?} [user] \n * @property {string?} [workspace]\n * @property {string} page \n */\n\nconst pages = createPromisesAndStates(async (\n\t/** @type {DotRequest} */req\n) => {\n\tconst result = await req.result().then(\n\t\tv => typeof v === 'object' && v || null,\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\tif (!result || typeof result !== 'object') { return null; }\n\n\t/** @type {Menu.Button[]} */\n\tconst menuButtons = [];\n\tconst menus = Menu.fromDefine(result.menus || [], menuButtons);\n\tconst { where, orWhere } = Search.parse(result.hiddenFilter || '');\n\t/** @type {PageConfiguration} */\n\tconst page = {\n\t\t...result,\n\t\twhere,\n\t\torWhere,\n\t\tmenuButtons,\n\t\tmenus,\n\t\tforms: Object.fromEntries(result.forms?.map((/** @type {{ type: any; }} */ v) => [v.type, v]) || []),\n\t};\n\treturn page;\n}, null);\n/**\n * \n * @param {PageParam} page \n * @returns \n */\nexport function pageService({\n\tmodel, organization, user, workspace, page,\n}) {\n\tlet key = [\n\t\tmodel,\n\t\torganization,\n\t\tuser,\n\t\tworkspace,\n\t\tpage,\n\t].map(v => v || '').join('\\n');\n\tlet pageReq = request.clone().path`page`;\n\tif (model) { pageReq = pageReq.query({ model }); }\n\tif (organization) { pageReq = pageReq.query({ organization }); }\n\tif (user) { pageReq = pageReq.query({ user }); }\n\tif (workspace) { pageReq = pageReq.query({ workspace }); }\n\tconst applicationId = application.id;\n\tif (applicationId) { pageReq = pageReq.query({ application: applicationId }); }\n\tpageReq = pageReq.query({ page });\n\tconst { get: getPage, load: loadPage } = pages.create(key, pageReq);\n\n\n\treturn {\n\t\tloadPage,\n\t\tgetPage,\n\t\tloadConfiguration() {\n\t\t\treturn loadPage().then((v) => typeof v === 'object' && v?.config);\n\t\t},\n\t\t...toPromiseInterface(loadPage),\n\t};\n\n}\n","import { importWidget } from '../import.mjs';\nimport { pages } from '../configuration.mjs';\n/** @import { PageRenderer } from './index.mjs' */\n/** @typedef {Object.<'main' | 'details' | 'setting' | 'input' | 'edit', string | PageRenderer>} ContinuationDefine */\n/** @typedef {ContinuationDefine & {continuations: Record<string, ContinuationDefine | string | PageRenderer>}} WorkspaceDefine */\n\n\n/**\n * @typedef {object} ContinuationPages\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} main\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} details\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} setting\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} input\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} edit\n * @property {(() => PageRenderer | Promise<PageRenderer | undefined>)?} copy\n */\n\n/** @type {ContinuationPages} */\nexport let modelPages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n/** @type {ContinuationPages} */\nexport let userPages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n/** @type {ContinuationPages} */\nexport let workspacePages = {\n\tmain: null,\n\tdetails: null,\n\tsetting: null,\n\tinput: null,\n\tedit: null,\n\tcopy: null,\n};\n\nexport function setDefaultPages() {\n\tconst {\n\t\tmodel,\n\t\tmodelDetails,\n\t\tmodelSetting,\n\t\tmodelInput,\n\t\tmodelEdit,\n\t\tmodelCopy,\n\n\t\tuser,\n\t\tuserDetails,\n\t\tuserSetting,\n\t\tuserInput,\n\t\tuserEdit,\n\t\tuserCopy,\n\n\t\tworkspace,\n\t\tworkspaceDetails,\n\t\tworkspaceSetting,\n\t\tworkspaceInput,\n\t\tworkspaceEdit,\n\t\tworkspaceCopy,\n\t} = pages;\n\tmodelPages = {\n\t\tmain: model ? () => importWidget(model) : null,\n\t\tdetails: modelDetails ? () => importWidget(modelDetails) : null,\n\t\tsetting: modelSetting ? () => importWidget(modelSetting) : null,\n\t\tinput: modelInput ? () => importWidget(modelInput) : null,\n\t\tedit: modelEdit ? () => importWidget(modelEdit) : null,\n\t\tcopy: modelCopy ? () => importWidget(modelCopy) : null,\n\t};\n\tuserPages = {\n\t\tmain: user ? () => importWidget(user) : null,\n\t\tdetails: userDetails ? () => importWidget(userDetails) : null,\n\t\tsetting: userSetting ? () => importWidget(userSetting) : null,\n\t\tinput: userInput ? () => importWidget(userInput) : null,\n\t\tedit: userEdit ? () => importWidget(userEdit) : null,\n\t\tcopy: userCopy ? () => importWidget(userCopy) : null,\n\t};\n\tworkspacePages = {\n\t\tmain: workspace ? () => importWidget(workspace) : null,\n\t\tdetails: workspaceDetails ? () => importWidget(workspaceDetails) : null,\n\t\tsetting: workspaceSetting ? () => importWidget(workspaceSetting) : null,\n\t\tinput: workspaceInput ? () => importWidget(workspaceInput) : null,\n\t\tedit: workspaceEdit ? () => importWidget(workspaceEdit) : null,\n\t\tcopy: workspaceCopy ? () => importWidget(workspaceCopy) : null,\n\t};\n}\nsetDefaultPages();\nexport {}\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { PageRenderer } from './index.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n\nimport { configuration, pages } from '../configuration.mjs';\nimport { importWidget } from '../import.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport { modelService } from '../services/index.mjs';\nimport { pageService } from '../services/page.mjs';\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed } from '../signal.mjs';\nimport { modelPages } from './pages.mjs';\n\n/** @typedef {() => PageRenderer | null | undefined | PromiseLike<PageRenderer | null | undefined>} PageRendererLoader */\n\n\nconst configurationPages = createComputed(() => {\n\t/** @type {Record<string, PageRendererLoader>} */\n\tconst configurationPages = {};\n\tfor (const [key, page] of Object.entries(allHooks.get('configurationPages').named())) {\n\t\tif (!page) { continue; }\n\t\tif (typeof page === 'function') {\n\t\t\tconfigurationPages[key] = () => page;\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof page === 'string') {\n\t\t\tconfigurationPages[key] = () => importWidget(page);\n\t\t\tcontinue;\n\t\t}\n\t}\n\tfor (const [key, page] of Object.entries(configuration.configurationPages || {})) {\n\t\tconfigurationPages[key] = () => importWidget(page);\n\t}\n\treturn configurationPages;\n\n\n});\n/**\n * \n * @param {PageIdent.Model} modelIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Model; page: PageConfiguration? }>}\n */\nasync function getModel(modelIdent) {\n\tconst { model, id, workspace, setting, edit, input, continuation } = modelIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Model} */\n\tconst ident = {\n\t\ttype: 'model',\n\t\tmodel,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tlet pageInfo = await pageService({ ...ident, page });\n\tif (!pageInfo && !workspace) {\n\t\tconst info = await modelService(model)\n\t\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\t\tif (!info || typeof info !== 'object') { return null; }\n\t\tconst pages = info.pages;\n\t\tconst pageDefine = pages && Object.hasOwn(pages, page) && pages[page];\n\t\tif (pageDefine === '') { return null; }\n\t\tpageInfo = typeof pageDefine === 'string'\n\t\t\t? { widget: pageDefine }\n\t\t\t: typeof pageDefine === 'object' && pageDefine || {};\n\t}\n\tif (typeof pageInfo !== 'object') { return pageInfo; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widgetId = pageInfo?.widget;\n\tif (widgetId === '') { return null; }\n\tconst widget = typeof widgetId === 'string'\n\t\t? () => importWidget(widgetId)\n\t\t: !workspace && modelPages[page] || null;\n\tif (!widget) { return null; }\n\treturn { ident, widget, page: pageInfo || null };\n}\n\n/**\n * \n * @param {PageIdent.Workspace} workspaceIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Workspace; page: PageConfiguration? }>}\n */\nasync function getWorkspace(workspaceIdent) {\n\tconst { id, edit, input, workspace, setting, continuation } = workspaceIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Workspace} */\n\tconst ident = {\n\t\ttype: 'workspace',\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page });\n\n\tif (typeof pageInfo !== 'object') { return pageInfo; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: typeof pageInfo === 'object' && pageInfo || null\n\t};\n}\n\n/**\n * \n * @param {PageIdent.Organization} organizationIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.Organization; page: PageConfiguration? }>}\n */\nasync function getOrganization(organizationIdent) {\n\tconst { id, organization, edit, input, workspace, setting, continuation } = organizationIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.Organization} */\n\tconst ident = {\n\t\ttype: 'organization',\n\t\torganization,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page })\n\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\n\tif (typeof pageInfo !== 'object') { return null; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: pageInfo || null\n\t};\n}\n/**\n * \n * @param {PageIdent.User} userIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent.User; page: PageConfiguration? }>}\n */\nasync function getUser(userIdent) {\n\tconst { id, user, edit, input, workspace, setting, continuation } = userIdent;\n\tif (continuation) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn null;\n\t}\n\t/** @type {PageIdent.User} */\n\tconst ident = {\n\t\ttype: 'user',\n\t\tuser,\n\t\tworkspace,\n\t\tid: '',\n\t\tinput: '',\n\t\tedit: false,\n\t};\n\n\t/** @type {'main' | 'input' | 'copy' | 'edit' | 'details'} */\n\tlet page = 'main';\n\tif (id) {\n\t\tident.id = id;\n\t\tif (input) {\n\t\t\tident.input = input;\n\t\t\tpage = 'copy';\n\t\t} else if (edit) {\n\t\t\tident.edit = true;\n\t\t\tpage = 'edit';\n\t\t} else {\n\t\t\tpage = 'details';\n\t\t}\n\t} else if (input) {\n\t\tident.input = input;\n\t\tpage = 'input';\n\t}\n\tconst pageInfo = await pageService({ ...ident, page })\n\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\n\tif (typeof pageInfo !== 'object') { return null; }\n\tconst url = pageInfo?.url;\n\tif (url && typeof url === 'string') { return { ident, widget: url, page: pageInfo || null }; }\n\n\tconst widget = pageInfo?.widget;\n\tif (!widget) { return null; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: typeof pageInfo === 'object' && pageInfo || null\n\t};\n}\n\n\n/**\n * @param {PageIdent} pageIdent \n * @returns {Promise<null | { widget: PageRendererLoader | string; ident: PageIdent; page: PageConfiguration? }>}\n */\nexport default async function load(pageIdent) {\n\tconst { type } = pageIdent;\n\n\tif (type === 'model') {\n\t\treturn getModel(pageIdent);\n\t}\n\tif (type === 'workspace') {\n\t\treturn getWorkspace(pageIdent);\n\t}\n\tif (type === 'organization') {\n\t\treturn getOrganization(pageIdent);\n\t}\n\tif (type === 'user') {\n\t\treturn getUser(pageIdent);\n\t}\n\tif (type === 'configuration') {\n\t\tconst pages = configurationPages.get();\n\t\tconst { continuation } = pageIdent;\n\t\tconst widget = Object.hasOwn(pages, continuation) ? pages[continuation] : null;\n\t\tif (typeof widget !== 'function') { return null; }\n\t\treturn { widget, ident: pageIdent, page: null };\n\t}\n\tconst widget = type && type in pages && pages[type];\n\tif (typeof widget === 'string') { return { widget: () => importWidget(widget), ident: pageIdent, page: null }; }\n\treturn null;\n}\n","/** @import { CurrentPage } from '../typesDefine.mjs' */\n/** @import { PageInfo } from './home.mjs' */\n/** @import { PageHandle } from './PageHandle.mjs' */\nimport { application } from '../configuration.mjs';\nimport { User } from '../user.mjs';\nimport setUrl from './setUrl.mjs';\nimport { createComputed, createState } from '../signal.mjs';\n\n\n/**\n * 页面管理器\n * @callback PageManager\n * @param {PageHandle} page\n * @returns {void}\n */\n/** @type {Map<symbol, PageManager>} */\nconst managers = new Map();\n\n/**\n * \n * @param {PageManager} manager \n * @returns \n */\nexport function addManager(manager) {\n\tconst symbol = Symbol();\n\tmanagers.set(symbol, manager);\n\treturn () => { managers.delete(symbol); };\n}\n\n/** @type {Map<PageInfo, PageHandle>} */\nconst pages = new Map();\n/** @type {PageHandle[]} */\nlet list = [];\nconst currentState = createState(/** @type {PageHandle | null} */(null));\n/**\n * \n * @param {PageInfo} [page] \n * @returns \n */\nexport function switchTo(page) {\n\tconst button = page && pages.get(page);\n\tconst current = currentState.get();\n\tif (current === button) { return; }\n\tcurrentState.set(button || null);\n\tif (button) {\n\t\tconst index = list.indexOf(button);\n\t\tif (index > 0) {\n\t\t\tlist.splice(index, 1);\n\t\t}\n\t\tif (index) {\n\t\t\tlist.push(button);\n\t\t}\n\t}\n\n}\nexport function getPages() {\n\treturn [...pages.values()];\n}\n/**\n * \n * @param {PageInfo} pageRoot \n * @param {PageHandle} state \n * @returns \n */\nexport function createButton(pageRoot, state) {\n\tpages.set(pageRoot, state);\n\tcurrentState.set(state);\n\tfor (const manager of [...managers.values()]) {\n\t\tmanager(state);\n\t}\n}\n/**\n * \n * @param {PageInfo} node \n * @returns \n */\nexport function remove(node) {\n\tconst page = pages.get(node);\n\tpages.delete(node);\n\tif (!page) { return; }\n\tconst index = list.indexOf(page);\n\tif (index >= 0) { list.splice(index, 1); }\n\tif (currentState.get() !== page) { return; }\n\tcurrentState.set(null);\n\tif (User.waitLogin) { return; }\n\tconst newPage = list[0];\n\tsetUrl(newPage?.href || application.path, false, true);\n}\nexport function closeAll() {\n\tfor (const page of [...pages.values()]) {\n\t\tpage.destroy();\n\t}\n}\n\nconst title = createComputed(() => currentState.get()?.title || '');\nconst icon = createComputed(() => currentState.get()?.icon || '');\nconst print = createComputed(() => currentState.get()?.print || {});\nconst loading = createComputed(() => currentState.get()?.loading || false);\nconst unsaved = createComputed(() => currentState.get()?.unsaved || false);\n/** @type {CurrentPage} */\nexport const currentPage = {\n\tget title() { return title.get(); },\n\tget icon() { return icon.get(); },\n\tget print() { return structuredClone(print.get()); },\n\tget unsaved() { return unsaved.get(); },\n\tget loading() { return loading.get(); },\n}\n","\n/**\n * @param {HTMLElement} container\n */\nexport default function renderHome(container) {\n\tcontainer.appendChild(document.createTextNode('主页'));\n\n}\n","const loadingDiv = document.createElement('div');\nconst shadow = loadingDiv.attachShadow({\"mode\": \"closed\"});\nshadow.innerHTML = `<style>\ndiv::after, div::before {\ncontent: '';\nheight: 100px;\nwidth: 100px;\nposition: absolute;\nmargin: auto;\ninset: 0;\nborder-radius: 100%;\nbackground-color: #000;\nanimation: animation infinite linear 1.5s;\ntransform: scale(0);\n}\ndiv::before {\nanimation-delay: -0.75s;\n}\n@keyframes animation {\n0% {\ntransform: scale(0);\nopacity: .8;\nz-index: 0;\n}\n100% {\ntransform: scale(1);\nopacity: 0;\nz-index: 1;\n}\n}\n</style><div></div>`\n\n\nconst container = document.createElement('div');\n\tcontainer.appendChild(loadingDiv);\nexport default container;\n/**\n * \n * @param {boolean} show \n */\nexport function toggle(show) {\n\tcontainer.hidden = !show;\n}\n","import { root as rootContainer } from '../dom/index.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport { application } from '../configuration.mjs';\nimport { switchTo } from './pageManager.mjs';\nimport { openUrl } from './setUrl.mjs';\nimport renderHome from './renderHome.mjs';\nimport loadingContainer, { toggle as triggerLoading } from './loadingContainer.mjs';\nimport { createState } from '../signal.mjs';\n\n\nrootContainer.appendChild(loadingContainer);\n\n/**\n * @callback Trigger\n * @param {boolean} show \n * @returns {void} \n */\n\n/** \n * @typedef {object} PageInfo\n * @property {Trigger} toggle\n * @property {() => void} hide\n */\n\n/** @type {Trigger} */\nlet currentDom = triggerLoading;\n\n\n\nexport const currentDomPage = createState(/** @type {PageInfo | undefined} */(undefined));\nexport const currentPage = createState(/** @type {PageInfo?} */(null));\n\n\n/**\n * \n * @param {Trigger} dom\n * @param {PageInfo} [domPage]\n * @returns {void}\n */\nfunction setDom(dom, domPage) {\n\tif (currentDom === dom) { return; }\n\tif (currentDom) {\n\t\tcurrentDom(false);\n\t}\n\tconst old = currentDomPage.get();\n\tcurrentDom = dom;\n\tcurrentDomPage.set(domPage);\n\told?.hide();\n\tif (!dom) { return; }\n\tdom(true);\n}\n\nconst homeContainer = document.createElement('div');\nhomeContainer.hidden = true;\n/**\n * \n * @param {boolean} show \n */\nfunction triggerHome(show) {\n\thomeContainer.hidden = !show;\n}\n\nrootContainer.appendChild(homeContainer);\nconst search = createState('?')\nconst hash = createState('#')\n/** @type {Map<string, Set<any>>} */\nconst events = new Map();\n\nevents.set('update', new Set([() => {\n\thomeContainer.innerHTML = '';\n\t\treturn renderHome(homeContainer);\n}]));\n\n/**\n * \n * @param {'update' | 'destroy'} e \n */\nfunction runEvent(e) {\n\tfor (const f of [...events.get(e) || []]) {\n\t\tf();\n\t}\n}\nexport class HomeContext {\n\tget container() { return homeContainer; }\n\tget current() { return currentDom === triggerHome; }\n\tget home() { return true; }\n\tget search() { return search.get(); }\n\tget hash() { return hash.get(); }\n\t/**\n\t * \n\t * @param {string} url \n\t * @param {boolean} replace \n\t */\n\topen(url, replace) {\n\t\topenUrl(url[0] === '/' ? url : toUrl(application.path, url), replace);\n\t}\n\t/**\n\t * \n\t * @param {'update' | 'destroy'} event \n\t * @param {() => void} listen \n\t * @returns {() => void}\n\t */\n\tlisten(event, listen) {\n\t\tconst fn = listen.bind(this);\n\t\tlet set = events.get(event);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tevents.set(event, set);\n\t\t}\n\t\tset.add(fn);\n\t\treturn () => { set?.delete(fn); };\n\t}\n}\n/**\n * @param {(ctx: HomeContext) => void} [renderer]\n */\nexport function switchHome(renderer) {\n\tif (typeof renderer !== 'function') { return false; }\n\trunEvent('destroy');\n\thomeContainer.innerHTML = '';\n\tevents.clear();\n\trenderer(new HomeContext());\n\treturn true;\n}\n\n\nfunction toShowHome() {\n\tconst oldPage = currentPage.get()\n\tif (oldPage) {\n\t\tcurrentPage.set(null);\n\t\toldPage.hide();\n\t}\n\tsetDom(triggerHome);\n\tswitchTo();\n\trunEvent('update');\n}\n/**\n * \n * @param {string} s \n * @param {string} h \n */\nexport function showHome(s, h) {\n\tsearch.set(s || '?');\n\thash.set(h || '#');\n\ttoShowHome();\n}\n\n/**\n * @type {string | number | NodeJS.Timeout | null}\n */\nlet timeoutId = null;\n\nexport function showEmpty() {\n\tif (timeoutId !== null) {\n\t\tclearTimeout(timeoutId);\n\t\ttimeoutId = null;\n\t}\n\ttoShowHome();\n}\n\n/**\n * \n * @param {boolean} v \n */\nexport function setLoading(v) {\n\tconst page = currentPage.get();\n\tif (!page) { return; }\n\tif (!v) {\n\t\tif (timeoutId !== null) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\ttimeoutId = null;\n\t\t}\n\t\tsetDom(page.toggle, page);\n\t\treturn;\n\t}\n\tif (timeoutId !== null) { return; }\n\ttimeoutId = setTimeout(() => {\n\t\ttimeoutId = null;\n\t\tsetDom(triggerLoading);\n\t\tswitchTo();\n\t}, 300);\n}\n\n/**\n * \n * @param {PageInfo} page \n * @param {boolean} loading \n */\nexport function switchPage(page, loading) {\n\tconst oldPage = currentPage.get();\n\tif (oldPage === page) {\n\t\tsetLoading(loading);\n\t\tswitchTo(oldPage);\n\t\treturn;\n\t}\n\tconst old = oldPage;\n\tif (!oldPage) {\n\t\trunEvent('update');\n\t}\n\tconst newPage = page;\n\tcurrentPage.set(newPage);\n\told?.hide();\n\tsetLoading(loading);\n\tswitchTo(newPage);\n}\n","/** @import { PageIdent } from './route/route.mjs' */\n\n/**\n * @param {string} t \n * @returns {string}\n */\nexport function decode(t) {\n\treturn decodeURIComponent(t.replace(/\\+/g, '%20'));\n}\n/**\n * @param {string | PageIdent} t \n * @returns {string}\n */\nexport function encode(t) {\n\treturn encodeURIComponent(typeof t === 'string' ? t : stringify(t))\n\t\t.replace(/%20/g, '+')\n\t\t.replace(/%3A/g, ':')\n\t\t.replace(/%3D/g, '=')\n\t\t.replace(/%26/g, '&')\n\t\t.replace(/%24/g, '$')\n\t\t.replace(/%40/g, '@');\n}\n\n\n/**\n * @param {string} ident\n * @returns {PageIdent}\n */\nexport function parse(ident) {\n\tif (!ident) { return { type: 'home' }; }\n\tswitch (ident) {\n\t\t// 代办\n\t\tcase '!': case '!': return { type: 'todo' };\n\t\t// 设置\n\t\tcase '-': case '-': return { type: 'settings' };\n\t\t// 搜索\n\t\tcase '=': case '=': return { type: 'search' };\n\t\t// 状态管理\n\t\tcase ':': case ':': return { type: 'status' };\n\t\t// 开发工具\n\t\tcase '+': case '+': return { type: 'devtools' };\n\t\tcase '&': // TODO: ?组织列表\n\t\tcase '@': // TODO: ?用户列表\n\t\tcase '~': // TODO: ?\n\t\tcase '_': // TODO: ?\n\t\tcase '*': // TODO: ?个人资料编辑\n\t}\n\t/**\n\t * \n\t * @param {RegExp} regex \n\t * @param {string} [def] \n\t */\n\tfunction get(regex, def) {\n\t\tconst { index } = regex.exec(ident) || { index: -1 };\n\t\tif (index < 0) { return; }\n\t\tconst value = ident.substring(index + 1) || def;\n\t\tident = ident.substring(0, index);\n\t\treturn value;\n\t}\n\tconst id = get(/[==]/);\n\n\tident = ident\n\t\t.replaceAll(/[~~]+/g, '~')\n\t\t.replaceAll(/[!!]+/g, '!')\n\t\t.replaceAll(/[@@]+/g, '@')\n\t\t.replaceAll(/[&&]+/g, '&')\n\t\t.replaceAll(/[**]/g, '*')\n\t\t.replaceAll(/[::]+/g, ':')\n\t\t.replaceAll(/[((]+/g, '(')\n\t\t.replaceAll(/[))]+/g, ')');\n\tconst edit = id ? Boolean(get(/(?<!\\*)\\*$/, '*')) : undefined;\n\tconst input = edit ? undefined : get(/\\*.*/, '*')?.replace(/[~!@&()].*/, '');\n\tconst setting = Boolean(get(/!$/, input || id ? undefined : '!'));\n\tconst regex = /(?=[~!@&])/;\n\t/** @type {Map<string, string[]>} */\n\tlet map = new Map([['&', []], ['@', []], ['~', []], ['!', []], ['*', []]]);\n\t/** @type {string[]} */\n\tlet base = [];\n\tfor (const v of ident.split(regex)) {\n\t\t(map.get(v[0]) || base).push(v);\n\t}\n\tconst continuation = map.get('!')?.join('').slice(1) || '';\n\tconst workspace = map.get('~')?.join('').slice(1) || '';\n\tconst organization = map.get('&')?.join('').slice(1) || '';\n\tconst user = map.get('@')?.join('').slice(1) || '';\n\tconst model = base.join('');\n\tif (model) {\n\t\treturn { type: 'model', model, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (organization) {\n\t\treturn { type: 'organization', organization, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (user) {\n\t\treturn { type: 'user', user, workspace, continuation, setting, edit, input, id };\n\t}\n\tif (workspace) {\n\t\treturn { type: 'workspace', workspace, continuation, setting, edit, input, id };\n\t}\n\tif (continuation) {\n\t\treturn { type: 'configuration', continuation, setting, edit, input, id };\n\t}\n\treturn { type: 'home' };\n}\n\n\n\n/**\n * \n * @param {PageIdent} a \n * @returns {string}\n */\nexport function stringify(a) {\n\tswitch (a.type) {\n\t\tcase 'home': return '/';\n\t\tcase 'settings': return '-';\n\t\tcase 'todo': return '!';\n\t\tcase 'search': return '=';\n\t\tcase 'status': return ':';\n\t\tcase 'devtools': return '+';\n\t}\n\tconst { model, user, organization, workspace, continuation, setting, input, edit, id } = a;\n\tlet ident = '';\n\tif (model) {\n\t\tident = model;\n\t} else if (organization) {\n\t\tident += `&${organization}`;\n\t} else if (user) {\n\t\tident += `@${user}`;\n\t}\n\tif (workspace) {\n\t\tident += `~${workspace}`;\n\t}\n\tif (continuation) {\n\t\tident += `!${continuation}`;\n\t}\n\tif (setting) {\n\t\tident += `!`;\n\t\treturn ident;\n\t}\n\tif (id) {\n\t\tif (input) {\n\t\t\tident += `*${input}`;\n\t\t} else if (edit) {\n\t\t\tident += `*`;\n\t\t}\n\t\tident += `=${id}`;\n\t\treturn ident;\n\t}\n\tif (input) {\n\t\tident += `*`;\n\t\tif (input !== '*') {\n\t\t\tident += `${input}`;\n\t\t}\n\t\treturn ident;\n\t}\n\treturn ident;\n}\n\n/**\n * \n * @param {PageIdent} a \n * @returns {Iterable<string>}\n */\nexport function* stringifyPaths(a) {\n\tswitch (a.type) {\n\t\tcase 'home': return yield '/';\n\t\tcase 'settings': return yield '-';\n\t\tcase 'todo': return yield '!';\n\t\tcase 'search': return yield '=';\n\t\tcase 'status': return yield ':';\n\t\tcase 'devtools': return yield '+';\n\t}\n\tconst { model, user, organization, workspace, continuation, setting, input, edit, id } = a;\n\tlet ident = '';\n\tif (model) {\n\t\tident = model;\n\t} else if (organization) {\n\t\tident += `&${organization}`;\n\t} else if (user) {\n\t\tident += `@${user}`;\n\t}\n\tif (ident) { yield ident; }\n\tif (workspace) {\n\t\tident += `~${workspace}`;\n\t\tyield ident;\n\t}\n\tif (continuation) {\n\t\tident += `!${continuation}`;\n\t\tyield ident;\n\t}\n\tif (setting) {\n\t\tident += `!`;\n\t\treturn yield ident;\n\t}\n\tif (id) {\n\t\tif (input) {\n\t\t\tyield ident + `*`;\n\t\t\tident += `*${input}`;\n\t\t} else if (edit) {\n\t\t\tyield ident + `=${id}`;\n\t\t\tident += `*`;\n\t\t}\n\t\tident += `=${id}`;\n\t\treturn yield ident;\n\t}\n\tif (input) {\n\t\tident += `*`;\n\t\tyield ident;\n\t\tif (input !== '*') {\n\t\t\tident += `${input}`;\n\t\t\tyield ident;\n\t\t}\n\t}\n}\n","import * as Ident from '../Ident.mjs';\nimport { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\n/**\n * @typedef {PageIdent.Model | PageIdent.Organization | PageIdent.User | PageIdent.Workspace | PageIdent.Page | PageIdent.Configuration} PageIdent\n */\n/**\n * @typedef {object} PageIdent.Model\n * @property {'model'} type\n * @property {string} model\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n/**\n * @typedef {object} PageIdent.Organization\n * @property {'organization'} type\n * @property {null} [model]\n * @property {string} organization\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.User\n * @property {'user'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {string} user\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string?} [workspace]\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.Workspace\n * @property {'workspace'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {string} workspace\n * @property {string} [continuation]\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n/**\n * @typedef {object} PageIdent.Configuration\n * @property {'configuration'} type\n * @property {null} [model]\n * @property {null} [organization]\n * @property {null} [user]\n * \n * @property {null} [error]\n * @property {null} [page]\n * @property {null} [workspace]\n * @property {string} continuation\n * @property {boolean} [setting]\n * @property {boolean} [edit]\n * @property {string} [id]\n * @property {string} [input]\n */\n\n/**\n * @typedef {object} PageIdent.Page\n * @property {'todo' | 'settings' | 'search' | 'status' | 'devtools' | 'home'} type\n * @property {null} [continuation]\n */\n\n// TODO: 用户页面\n// TODO: 组织页面\n// TODO: 全局工作区\n\n\n\n\n/**\n * @typedef {object} PageIdent.Route\n * @property {PageIdent} page\n * @property {string} pageRoot\n * @property {string} path\n * @property {boolean} redirect\n */\n\n/**\n * @callback PageIdent.Stringify\n * @param {PageIdent} pageIdent \n * @returns {string}\n */\n/**\n * @callback PageIdent.Parser\n * @param {string} path\n * @returns {PageIdent.Route}\n */\n\n/** @type {PageIdent.Parser} */\nexport let parse = (subPath) => {\n\tconst index = subPath.indexOf('/');\n\tconst pathIdent = Ident.decode(index < 0 ? subPath : subPath.slice(0, index));\n\tconst path = index < 0 ? '/' : subPath.slice(index);\n\tconst page = Ident.parse(pathIdent);\n\tconst pageId = Ident.stringify(page);\n\tconst pageRoot = Ident.encode(pageId);\n\treturn { page, pageRoot, path, redirect: pageRoot !== pathIdent };\n};\n/** @type {PageIdent.Stringify} */\nlet stringifyIdent = (page) => Ident.encode(Ident.stringify(page));\n/**\n * @param {PageIdent} page \n * @param {...string | null | undefined} paths \n * @returns {string}\n */\nexport function stringify(page, ...paths) {\n\tconst root = stringifyIdent(page);\n\tconst path = paths.filter(Boolean).join('');\n\tif (!path) { return root; }\n\tif (['/', '?', '#'].includes(path[0])) { return `${root}${path}`}\n\treturn `${root}/${path}`;\n};\n/**\n * @param {PageIdent} page \n * @param {...string | null | undefined} paths \n * @returns {string}\n */\nexport function toHref(page, ...paths) {\n\treturn toUrl(\n\t\tapplication.path,\n\t\tstringifyIdent(page),\n\t\tpaths.filter(Boolean).join(''),\n\t);\n}\n/**\n * @typedef {object} PageIdent.Router\n * @property {PageIdent.Stringify} stringify\n * @property {PageIdent.Parser} parse\n */\n/**\n * \n * @param {PageIdent.Router} options \n */\nexport function setRouter(options) {\n\tparse = options.parse;\n\tstringifyIdent = options.stringify;\n}\n\nexport const PageIdent = {\n\tget parse() { return parse },\n\tget stringify() { return stringify },\n\tget toHref() { return toHref },\n}\n","import { Code128 } from './utils/index.mjs';\n/**\n * @typedef {Object} Print.MarginBox\n * @property {Print.Context[] | Print.Context} [content]\n * @property {string} [fontFamily] - 字体族\n * @property {string|number} [fontSize] - 字体大小\n * @property {boolean} [bold]\n * @property {boolean} [italic]\n * @property {string} [color] - 文字颜色\n * @property {'ltr'|'rtl'} [direction] - 文本方向\n * @property {number|string} [lineHeight] - 行高\n * @property {number} [zIndex] - 层叠顺序\n * @property {'left'|'right'|'center'|'justify'|'start'|'end'} [textAlign] - 文本对齐\n * @property {'baseline'|'sub'|'super'|'top'|'text-top'|'middle'|'bottom'|'text-bottom'|number} [verticalAlign] - 垂直对齐\n * @property {Record<'top' | 'right' | 'bottom' | 'left', string|number>} [padding] - 内边距属性对象\n * @property {Print.Border} [border] \n */\n/**\n * @typedef {string | Print.Newline | Print.Image | Print.Barcode | Print.Counter} Print.Context\n */\n/**\n * @typedef {object} Print.Newline\n * @property {'newline'} type\n */\n/**\n * @typedef {object} Print.Counter\n * @property {'page' | 'pages'} type\n */\n/**\n * @typedef {object} Print.Image\n * @property {'image'} type\n * @property {string} url\n * @property {string} [alt]\n * @property {string | number} [width]\n * @property {string | number} [height]\n */\n/**\n * @typedef {object} Print.Barcode\n * @property {'barcode' | 'code128'} type\n * @property {string} text\n * @property {string | number} [width]\n * @property {string | number} [height]\n */\n\n\n\n/**\n * @typedef {Object} Print.Border\n * @property {string|number} [width] - 边框宽度复合属性\n * @property {string} [color] - 边框颜色复合属性\n * @property {'dotted'|'dashed'|'solid'|'double'|'groove'|'ridge'|'inset'|'outset'} [style] - 边框样式复合属性\n */\n/**\n * @typedef {Object} Print.Page\n * @property {'A3'|'B4'|'A4'|'B5'|'A5'|{width?: string; height?: string}} [size] 页面尺寸\n * @property {'portrait'|'landscape'|'auto'} [orientation] 页面方向\n * @property {string|[string, string?, string?, string?]} [margin] 页边距\n * @property {Print.MarginBox} [topLeft] \n * @property {Print.MarginBox} [topCenter] \n * @property {Print.MarginBox} [topRight] \n * @property {Print.MarginBox} [bottomLeft] \n * @property {Print.MarginBox} [bottomCenter] \n * @property {Print.MarginBox} [bottomRight] \n * \n * @property {Print.MarginBox} [leftTop] \n * @property {Print.MarginBox} [leftMiddle] \n * @property {Print.MarginBox} [leftBottom] \n * @property {Print.MarginBox} [rightTop] \n * @property {Print.MarginBox} [rightMiddle] \n * @property {Print.MarginBox} [rightBottom] \n * \n * @property {Print.MarginBox} [topLeftCorner] \n * @property {Print.MarginBox} [topRightCorner] \n * @property {Print.MarginBox} [bottomLeftCorner] \n * @property {Print.MarginBox} [bottomRightCorner] \n * \n * @property {Print.Border} [topBorder] \n * @property {Print.Border} [bottomBorder] \n * @property {Print.Border} [leftBorder] \n * @property {Print.Border} [rightBorder] \n * \n * \n */\n\n/**\n * @typedef {Object} Print.Pages\n * @property {Print.Page} [left] 左侧页面/节点\n * @property {Print.Page} [right] 右侧页面/节点\n * @property {Print.Page} [first] 首页页面/节点\n * @property {Print.Page} [blank] 空白页面/节点\n */\n\n\n/**\n * @typedef {Print.Page & Print.Pages} Print\n */\n\n\n/**\n * 将字符串转换为 Base64\n * @param {string} str \n */\nfunction toSvgURI(str) {\n\treturn `data:image/svg+xml;charset=utf-8,${encodeURIComponent(str)}`;;\n}\n/**\n * \n * @param {string} val \n * @returns \n */\nfunction stringifyContentText(val) {\n\tconst text = typeof val === 'bigint' || typeof val === 'number' ? String(val) : val;\n\tif (!text || typeof text !== 'string') { return ''; }\n\n\treturn `\"${text\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/'/g, \"\\\\'\")\n\t\t.replace(/\\n/g, '\\\\A').replace(/\\r/g, '\\\\D')}\"`;\n}\n/**\n * \n * @param {string} url \n * @returns \n */\nfunction toUrlContent(url) {\n\tif (!url) { return ''; }\n\treturn `url(${stringifyContentText(url)})`;\n}\n\n/**\n * 解析尺寸,统一转换为带单位的字符串 (默认为 em)\n * @param {string | number} [val] \n */\nfunction parseDimension(val, defaultUnit = 'em') {\n\tif (!val) return null;\n\tif (typeof val === 'number') return `${val}${defaultUnit}`;\n\tif (typeof val !== 'string') { return null; }\n\tconst t = val.replace(/^\\s+|\\s+$/gs, '');\n\tif (/^\\d+(\\.\\d*)?|\\.\\d+$/.test(t)) { return `${t}${defaultUnit}`; }\n\treturn t; // 其他情况原样返回\n}\n\n/**\n * 生成图片的 SVG Data URL\n * @param {Print.Image} item \n */\nfunction imageToContent(item) {\n\tconst { url } = item;\n\tif (!url) { return ''; }\n\tconst width = parseDimension(item.width) || '';\n\tconst height = parseDimension(item.height) || '';\n\tif (!width && !height) { toUrlContent(url); }\n\tconst svgContent = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n\t\t\t\t\t<image href=\"${item.url}\" width=\"100%\" height=\"100%\" />\n\t\t\t</svg>\n\t\t`.trim();\n\treturn toUrlContent(toSvgURI(svgContent.replace(/\\s+/g, ' ')));\n}\n\n/**\n * 生成条码的 SVG Data URL\n * @param {Print.Barcode} item \n * @param {boolean} [rotation] \n */\nfunction barcodeToContent(item, rotation) {\n\tconst bits = Code128.encode(item.text);\n\tif (!bits?.length) { return ''; }\n\n\n\n\tconst paths = [];\n\tfor (let i = 0; i < bits.length; i++) {\n\t\tif (!bits[i]) { continue; }\n\t\tconst start = i - bits.length / 2;\n\t\tlet len = 1;\n\n\t\twhile (bits[i + 1]) {\n\t\t\tlen++;\n\t\t\ti++;\n\t\t}\n\n\t\tpaths.push(rotation ? `M-0.5 ${start}v${len}h1v-${len}Z` : `M${start} -0.5h${len}v1h-${len}Z`);\n\t}\n\tif (!paths.length) { return ''; }\n\n\n\tlet height = parseDimension(item.height) || '1em';\n\tlet width = parseDimension(item.width) || `${(bits.length + 20) * 0.06}em`;\n\tlet vbWidth = bits.length + 20;\n\tlet vbHeight = 1;\n\tif (rotation) {\n\t\t[vbWidth, vbHeight] = [vbHeight, vbWidth];\n\t\t[width, height] = [height, width]\n\t}\n\n\tconst svgContent = `\n\t<svg xmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"${width}\" height=\"${height}\"\n viewBox=\"${-vbWidth / 2} ${-vbHeight / 2} ${vbWidth} ${vbHeight}\"\n\t\t\tpreserveAspectRatio=\"none\">\n\t\t<path d=\"${paths.join(\" \")}\" fill=\"black\"\n\t\t />\n\t</svg>\n\t`.trim();\n\n\tconst minifiedSvg = svgContent.replace(/\\s+/g, ' ');\n\treturn `url(${toSvgURI(minifiedSvg)})`;\n}\n/**\n * 主函数:将 Print.Context | Print.Context[] 转换为 CSS content 属性值\n * @param {Print.Context | Print.Context[]} [input] \n * @param {boolean} [rotation] \n * @returns {string} CSS content 属性的值部分 (不含分号)\n */\nfunction toContent(input, rotation) {\n\tif (input === '') { return '\"\"'; }\n\tif (!input) { return ''; }\n\n\tconst items = Array.isArray(input) ? input : [input];\n\treturn items.map(item => {\n\t\tif (!item) { return ''; }\n\t\tif (typeof item === 'string') { return stringifyContentText(item); }\n\t\tconst type = item.type;\n\t\tif (type === 'newline') { return '\"\\\\A\"'; }\n\t\tif (type === 'image') { return imageToContent(item); }\n\t\tif (type === 'barcode' || type === 'code128') { return barcodeToContent(item, rotation); }\n\t\tif (type === 'page') { return `counter(page)`; }\n\t\tif (type === 'pages') { return `counter(pages)`; }\n\t\treturn ''; // 未知类型\n\t}).filter(Boolean).join(' ');\n\n}\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {\"top\" | \"left\" | \"right\" | \"bottom\" | ''} borderArea\n * @param {CSSStyleDeclaration?} [style] \n * @param {Print.MarginBox} [config] \n * @param {boolean} [base] \n * @param {boolean} [rotation] \n * @returns \n */\nfunction applyMarginRule(borderArea, style, config, base, rotation) {\n\tif (!style) { return; }\n\tconst {\n\t\tcontent, fontFamily, fontSize, bold, italic, color, direction, lineHeight,\n\t\tzIndex, textAlign, verticalAlign, padding, border,\n\t} = config || {};\n\n\tstyle.content = toContent(content, rotation) || (base ? '\"\"' : '');\n\tstyle.fontFamily = fontFamily || '';\n\tstyle.fontSize = parseDimension(fontSize, 'px') || '';\n\tstyle.fontWeight = typeof bold === 'boolean' ? bold ? 'bold' : 'normal' : '';\n\tstyle.fontStyle = typeof italic === 'boolean' ? italic ? 'italic' : 'normal' : '';\n\tstyle.color = color || '';\n\tstyle.direction = direction || '';\n\tstyle.lineHeight = parseDimension(lineHeight, 'em') || '';\n\tstyle.zIndex = zIndex ? String(zIndex) : '';\n\tstyle.textAlign = textAlign || '';\n\tstyle.verticalAlign = parseDimension(verticalAlign, '%') || '';\n\tstyle.direction = direction || 'inherit';\n\tstyle.whiteSpace = 'pre-wrap';\n\tconst { top, right, bottom, left } = padding || {};\n\tstyle.paddingTop = parseDimension(top, 'px') || '';\n\tstyle.paddingRight = parseDimension(right, 'px') || '';\n\tstyle.paddingBottom = parseDimension(bottom, 'px') || '';\n\tstyle.paddingLeft = parseDimension(left, 'px') || '';\n\tif (borderArea) {\n\t\tapplyBorderRule(borderArea, style, border, base);\n\t}\n}\n\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {CSSStyleDeclaration?} [styleDeclaration] \n * @param {Print.Border} [border] \n * @param {'top' | 'left' | 'right' | 'bottom'} [area] \n * @param {boolean} [base] \n * @returns \n */\nfunction applyBorderRule(area, styleDeclaration, border, base) {\n\tif (!styleDeclaration) { return; }\n\tconst { width, color, style } = border || {};\n\tif (width || width === 0 || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-width`, typeof width === 'number' ? `${width || 0}px` : width || '1px');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-width`);\n\t}\n\tif (color || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-color`, color || 'currentColor');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-color`);\n\t}\n\tif (style || base) {\n\t\tstyleDeclaration.setProperty(`border-${area}-style`, style || 'none');\n\t} else {\n\t\tstyleDeclaration.removeProperty(`border-${area}-style`);\n\t}\n}\n/**\n * 辅助函数:将配置对象应用到具体的 CSSPageRule 上\n * 完全不拼接字符串,直接操作 style 对象\n * @param {ReturnType<createPageRule>} rule \n * @param {Print.Page} [config] \n * @param {boolean} [base] \n * @returns \n */\nfunction applyPageRule(rule, config, base) {\n\tif (!rule) { return; }\n\tconst style = rule.page;\n\n\tapplyMarginRule('bottom', rule.topLeft, config?.topLeft, base);\n\tapplyMarginRule('bottom', rule.topCenter, config?.topCenter, base);\n\tapplyMarginRule('bottom', rule.topRight, config?.topRight, base);\n\tapplyMarginRule('top', rule.bottomLeft, config?.bottomLeft, base);\n\tapplyMarginRule('top', rule.bottomCenter, config?.bottomCenter, base);\n\tapplyMarginRule('top', rule.bottomRight, config?.bottomRight, base);\n\n\tapplyMarginRule('right', rule.leftTop, config?.leftTop, base, true);\n\tapplyMarginRule('right', rule.leftMiddle, config?.leftMiddle, base, true);\n\tapplyMarginRule('right', rule.leftBottom, config?.leftBottom, base, true);\n\tapplyMarginRule('left', rule.rightTop, config?.rightTop, base, true);\n\tapplyMarginRule('left', rule.rightMiddle, config?.rightMiddle, base, true);\n\tapplyMarginRule('left', rule.rightBottom, config?.rightBottom, base, true);\n\n\tapplyMarginRule('', rule.topLeftCorner, config?.topLeftCorner, base);\n\tapplyMarginRule('', rule.topRightCorner, config?.topRightCorner, base);\n\tapplyMarginRule('', rule.bottomLeftCorner, config?.bottomLeftCorner, base);\n\tapplyMarginRule('', rule.bottomRightCorner, config?.bottomRightCorner, base);\n\n\n\tapplyBorderRule('top', style, config?.topBorder, base);\n\tapplyBorderRule('bottom', style, config?.bottomBorder, base);\n\tapplyBorderRule('left', style, config?.leftBorder, base);\n\tapplyBorderRule('right', style, config?.rightBorder, base);\n\n\n\n\n\tconst { size, orientation, margin } = config || {};\n\n\tlet sizeValue = '';\n\tif (typeof size === 'object' && size !== null) {\n\t\tsizeValue = `${size.width} ${size.height}`;\n\t} else if (typeof size === 'string') {\n\t\tsizeValue = size;\n\t}\n\tif (orientation) {\n\t\tsizeValue = `${sizeValue} ${orientation}`;\n\t}\n\tif (sizeValue) {\n\t\tstyle.setProperty('size', sizeValue);\n\t} else {\n\t\tstyle.removeProperty('size');\n\t}\n\n\n\tlet marginValue = '';\n\tif (typeof margin === 'string') {\n\t\tmarginValue = margin;\n\t} else if (Array.isArray(margin)) {\n\t\tmarginValue = margin.filter(v => v !== undefined).join(' ');\n\t}\n\tif (marginValue) {\n\t\tstyle.setProperty('margin', marginValue);\n\t} else {\n\t\tstyle.removeProperty('margin');\n\n\t}\n}\n\nconst sheet = new CSSStyleSheet();\ndocument.adoptedStyleSheets.push(sheet);\n\n\n/**\n * \n * @param {CSSPageRule} page \n * @param {string} selector \n * @param {boolean} [fitWidth] \n * @param {boolean} [fitHeight] \n * @returns {CSSStyleDeclaration | null}\n */\nfunction createMarginRule(page, selector, fitWidth, fitHeight) {\n\ttry {\n\t\tconst ruleIndex = page.insertRule(`${selector} {}`, page.cssRules.length);\n\n\t\tconst rule = page.cssRules[ruleIndex];\n\t\t// @ts-ignore\n\t\tif (!(rule instanceof CSSMarginRule)) { return null; }\n\t\t/** @type {CSSStyleDeclaration} */\n\t\t// @ts-ignore\n\t\tconst style = rule.style;\n\t\tif (fitWidth) {\n\t\t\tstyle.width = 'fit-content';\n\t\t}\n\t\tif (fitHeight) {\n\t\t\tstyle.height = 'fit-content';\n\t\t}\n\t\treturn style;\n\t} catch (e) {\n\t}\n\treturn null;\n\n}\n/**\n * \n * @param {CSSStyleSheet} sheet\n * @param {string} [selector] \n */\nfunction createPageRule(sheet, selector) {\n\ttry {\n\t\tconst ruleIndex = sheet.insertRule(`@page ${selector || ''} {}`, sheet.cssRules.length);\n\n\t\tconst rule = sheet.cssRules[ruleIndex];\n\t\tif (!(rule instanceof CSSPageRule)) { return null; }\n\t\treturn {\n\t\t\tpage: rule.style,\n\t\t\ttopLeft: createMarginRule(rule, '@top-left', true),\n\t\t\ttopCenter: createMarginRule(rule, '@top-center'),\n\t\t\ttopRight: createMarginRule(rule, '@top-right', true),\n\t\t\tbottomLeft: createMarginRule(rule, '@bottom-left', true),\n\t\t\tbottomCenter: createMarginRule(rule, '@bottom-center'),\n\t\t\tbottomRight: createMarginRule(rule, '@bottom-right', true),\n\n\t\t\tleftTop: createMarginRule(rule, '@left-top', false, true),\n\t\t\tleftMiddle: createMarginRule(rule, '@left-middle'),\n\t\t\tleftBottom: createMarginRule(rule, '@left-bottom', false, true),\n\t\t\trightTop: createMarginRule(rule, '@right-top', false, true),\n\t\t\trightMiddle: createMarginRule(rule, '@right-middle'),\n\t\t\trightBottom: createMarginRule(rule, '@right-bottom', false, true),\n\n\t\t\ttopLeftCorner: createMarginRule(rule, '@top-left-corner'),\n\t\t\ttopRightCorner: createMarginRule(rule, '@top-right-corner'),\n\t\t\tbottomLeftCorner: createMarginRule(rule, '@bottom-left-corner'),\n\t\t\tbottomRightCorner: createMarginRule(rule, '@bottom-right-corner'),\n\t\t};\n\t} catch (e) {\n\t}\n\treturn null;\n}\nconst commonPage = createPageRule(sheet);\nconst firstPage = createPageRule(sheet, ':first');\nconst leftPage = createPageRule(sheet, ':left');\nconst rightPage = createPageRule(sheet, ':right');\nconst blankPage = createPageRule(sheet, ':blank');\n/**\n * 核心函数:使用 CSSOM 操作,无字符串拼接\n * @param {Print} print \n */\nexport function updatePrintStyle(print) {\n\tapplyPageRule(commonPage, print, true);\n\tapplyPageRule(firstPage, print.first);\n\tapplyPageRule(leftPage, print.left);\n\tapplyPageRule(rightPage, print.right);\n\tapplyPageRule(blankPage, print.blank);\n}\n\n/**\n * @type {Print.Border}\n */\nconst BorderDefine = {\n\twidth: '2px',\n\tcolor: '#0066cc',\n\tstyle: 'solid'\n};\n/**\n * @type {Print.MarginBox}\n */\nconst MarginBoxDefine = {\n\tcontent: [],\n\tfontFamily: 'Arial, sans-serif',\n\tfontSize: '18px',\n\titalic: false,\n\tbold: true,\n\tcolor: '#333333',\n\ttextAlign: 'center',\n\tlineHeight: '1.5',\n\tdirection: 'ltr',\n\tverticalAlign: 'baseline',\n\tpadding: { top: '10px', right: '5px', bottom: '10px', left: '5px' },\n\tzIndex: 1,\n\tborder: BorderDefine,\n};\n/**\n * @type {Print.Page}\n */\nconst PrintPageDefine = {\n\tsize: 'A4',\n\torientation: 'auto',\n\tmargin: ['20px', '30px', '25px', '30px'],\n\n\ttopLeft: MarginBoxDefine,\n\ttopCenter: MarginBoxDefine,\n\ttopRight: MarginBoxDefine,\n\n\tbottomLeft: MarginBoxDefine,\n\tbottomCenter: MarginBoxDefine,\n\tbottomRight: MarginBoxDefine,\n\n\tleftTop: MarginBoxDefine,\n\tleftMiddle: MarginBoxDefine,\n\tleftBottom: MarginBoxDefine,\n\n\trightTop: MarginBoxDefine,\n\trightMiddle: MarginBoxDefine,\n\trightBottom: MarginBoxDefine,\n\n\n\ttopLeftCorner: MarginBoxDefine,\n\ttopRightCorner: MarginBoxDefine,\n\tbottomLeftCorner: MarginBoxDefine,\n\tbottomRightCorner: MarginBoxDefine,\n\n\ttopBorder: BorderDefine,\n\tbottomBorder: BorderDefine,\n\tleftBorder: BorderDefine,\n\trightBorder: BorderDefine,\n};\n\n\n/**\n * @type {Print}\n */\nexport const PrintDefine = {\n\t...PrintPageDefine,\n\tleft: PrintPageDefine,\n\tright: PrintPageDefine,\n\tfirst: PrintPageDefine,\n\tblank: PrintPageDefine,\n\n};\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { Print } from '../print.mjs' */\n/** @import { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.mjs' */\nimport { PrintDefine } from '../print.mjs';\nimport { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { createButton, remove } from './pageManager.mjs';\nimport { setLoading, switchPage, currentDomPage, currentPage } from './home.mjs';\nimport * as routerParser from './route.mjs';\nimport { createComputed, createDeeply, createState } from '../signal.mjs';\n\n\n\n/**\n * @typedef {object} RootPageExt\n * @property {() => { path: string; search: string; hash: string; }} get\n * @property {(path: string,search: string, hash: string) => void} update\n */\n\nexport class PageHandle extends GeneralContext {\n\t/** @readonly */\n\t#title = createState('');\n\t/** @readonly */\n\t#icon = createState('');\n\t/** @readonly */\n\t#print = createState(/** @type {Print} */({}));\n\t/** @readonly */\n\t#printDeeply = createDeeply(this.#print, PrintDefine);\n\t/** @readonly */\n\t#loading = createState(true);\n\t/** @readonly */\n\t#unsaved = createState(false);\n\t/** @readonly */\n\t#destroyDelayed = createState(false);\n\t/** @readonly */\n\t#bootLoading = createState(true);\n\n\t#onHide = () => { };\n\t/** @readonly @type {string} */\n\t#pageId;\n\n\n\t/** @readonly @type {string} */\n\t#root;\n\t/** @readonly */\n\t#path = createState('');\n\t/** @readonly */\n\t#search = createState('');\n\t/** @readonly */\n\t#hash = createState('');\n\n\t/** @readonly */\n\t#href = createComputed(() => {\n\t\treturn toUrl(this.#root, `${this.#path.get()}${this.#search.get()}${this.#hash.get()}`);\n\t});\n\t/** @readonly */\n\t#rootPath = createComputed(() => `${this.#pageId}/${this.#path.get()}${this.#search.get()}${this.#hash.get()}`);\n\t/** @readonly @type {PageConfiguration?} */\n\t#define;\n\t/** @readonly @type {PageIdent} */\n\t#ident;\n\n\t/** @readonly @type {PageInfo & RootPageExt} */\n\t#pageHandler;\n\t/** @readonly @type {(url: string, replace?: boolean) => void} */\n\t#open;\n\t/** @readonly @type {(p: string, replace?: boolean) => void} */\n\t#setRootPath;\n\t#abortController;\n\t/**\n\t * \n\t * @param {Object} options \n\t * @param {string} options.pageId\n\t * @param {PageConfiguration?} options.define\n\t * @param {PageIdent} options.ident\n\t * @param {string} options.root\n\t * @param {string} options.path\n\t * @param {string} options.search\n\t * @param {string} options.hash\n\t * @param {PageInfo & RootPageExt} options.pageHandler\n\t * @param {(url: string, replace?: boolean) => void} options.open\n\t * @param {(p: string, replace?: boolean) => void} options.setRootPath\n\t */\n\tconstructor({\n\t\tpageId, define, ident, root, path, search, hash, pageHandler, open, setRootPath,\n\t}) {\n\n\t\tconst ac = new AbortController();\n\t\tsuper(ac.signal);\n\t\tthis.#abortController = ac;\n\t\tthis.#root = root;\n\t\tthis.#path.set(path);\n\t\tthis.#search.set(search);\n\t\tthis.#hash.set(hash);\n\n\t\tthis.#define = define;\n\t\tthis.#ident = ident;\n\n\t\tthis.#pageId = pageId;\n\n\t\tthis.#pageHandler = pageHandler;\n\t\tthis.#open = open;\n\t\tthis.#setRootPath = setRootPath;\n\n\t\tconst list = this.#onToggle;\n\t\tpageHandler.toggle = (show) => { \n\t\t\tfor (const fn of [...list]) { fn(show); }\n\t\t };\n\t\tpageHandler.hide = () => { this.#onHide(); };\n\t\tpageHandler.get = () => ({\n\t\t\tpath: this.#path.get(),\n\t\t\tsearch: this.#search.get(),\n\t\t\thash: this.#hash.get(),\n\t\t});\n\t\tpageHandler.update = (p, s, h) => {\n\t\t\tthis.#path.set(p);\n\t\t\tthis.#search.set(s);\n\t\t\tthis.#hash.set(h);\n\t\t\tswitchPage(pageHandler, this.#bootLoading.get());\n\t\t};\n\t\tconst title = define?.title;\n\t\tif (title) { this.title = title; }\n\t\tcreateButton(pageHandler, this);\n\t}\n\n\t/** @type {Set<(show: boolean) => void>} */\n\t#onToggle = new Set();\n\t/**\n\t * \n\t * @param {(show: boolean) => void} fn \n\t * @param {AbortSignal} signal \n\t */\n\tonToggle(fn, signal) {\n\t\tif (signal?.aborted) { return }\n\t\tconst list = this.#onToggle;\n\t\tlist.add(fn);\n\t\tsignal.addEventListener('abort', () => {list.delete(fn)}, {once: true});\n\t}\n\tget bootLoading() { return this.#bootLoading.get(); }\n\tget define() { return this.#define; }\n\tget ident() { return this.#ident; }\n\tget root() { return this.#root; }\n\tget path() { return this.#path.get(); }\n\tget search() { return this.#search.get(); }\n\tget hash() { return this.#hash.get(); }\n\tget href() { return this.#href.get(); }\n\tget current() { return this.#pageHandler === currentPage.get(); }\n\tget shown() { return this.#pageHandler === currentDomPage.get(); }\n\tget title() { return this.#title.get(); }\n\tset title(title) { this.#title.set(title); }\n\tget icon() { return this.#icon.get(); }\n\tset icon(icon) { this.#icon.set(icon); }\n\tget print() { return this.#printDeeply; }\n\tset print(print) { this.#print.set(structuredClone(print)); }\n\tget unsaved() { return this.#unsaved.get(); }\n\tset unsaved(unsaved) { this.#unsaved.set(unsaved); }\n\tget loading() { return this.#loading.get(); }\n\tset loading(loading) {\n\t\tthis.#loading.set(loading);\n\t\tif (!loading) { this.#bootLoading.set(false); }\n\t\tif (this.#pageHandler !== currentPage.get()) { return; }\n\t\tif (this.#bootLoading.get()) { return; }\n\t\tsetLoading(false);\n\t}\n\n\t/**\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @returns {string}\n\t */\n\ttoUrl(url, page) {\n\t\tif (page) {\n\t\t\tif (typeof page === 'string') {\n\t\t\t\treturn toUrl(application.path, page, url);\n\t\t\t} else if (typeof page === 'object') {\n\t\t\t\treturn toUrl(application.path, routerParser.stringify(page), url);\n\t\t\t}\n\t\t}\n\t\treturn url[0] === '/' ? url : toUrl(this.#root, url);\n\t}\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\topen(url, page, replace) {\n\t\tthis.#open(\n\t\t\tthis.toUrl(url, typeof page === 'boolean' ? '' : page),\n\t\t\ttypeof page === 'boolean' ? page : replace,\n\t\t);\n\t}\n\t/**\n\t * \n\t * @param {string} p \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tsetPath(p, replace) {\n\t\tconst hashIndex = p.indexOf('#');\n\t\tthis.#hash.set(hashIndex >= 0 ? p.slice(hashIndex) : '');\n\t\tif (hashIndex >= 0) { p = p.slice(0, hashIndex); }\n\t\tif (p) {\n\t\t\tconst searchIndex = p.indexOf('?');\n\t\t\tthis.#search.set(searchIndex >= 0 ? p.slice(searchIndex) : '');\n\t\t\tif (searchIndex >= 0) { p = p.slice(0, searchIndex); }\n\t\t}\n\t\tif (p) { this.#path.set(p); }\n\t\tif (this.#pageHandler !== currentPage.get()) { return; }\n\t\tthis.#setRootPath(this.#rootPath.get(), replace);\n\t}\n\t/**\n\t * \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tshow(replace) {\n\t\tif (this.#pageHandler === currentPage.get()) { return; }\n\t\tthis.#setRootPath(this.#rootPath.get(), replace);\n\t}\n\tget destroyDeferred() { return !this.destroyed && this.#destroyDelayed.get(); }\n\t/**\n\t * @param {boolean} [defer]\n\t * @returns {boolean}\n\t */\n\tdestroy(defer) {\n\t\tconst destroyPage = () => {\n\t\t\tthis.#onHide = () => { };\n\t\t\tconst abortController = this.#abortController;\n\t\t\tif (abortController.signal.aborted) { return false; }\n\t\t\tabortController.abort();\n\t\t\tremove(this.#pageHandler);\n\t\t\treturn true;\n\t\t};\n\t\tif (!defer) {\n\t\t\treturn destroyPage();\n\t\t}\n\t\tif (this.#destroyDelayed.get() || this.destroyed) { return false; }\n\t\tthis.#destroyDelayed.set(true);\n\t\tif (currentDomPage.get() !== this.#pageHandler) {\n\t\t\treturn destroyPage();\n\t\t}\n\t\tthis.#onHide = destroyPage;\n\t\treturn true;\n\t}\n}\n","/** @import { PageContext } from './PageContext.mjs' */\n\n/**\n * @typedef {object} PageError\n * @property {string} title\n * @property {string} [description]\n */\n\n/** @type {Record<string, PageError>} */\nexport const errors = {\n\t404: {\n\t\ttitle: '您所请求的页面无法找到',\n\t\tdescription: '服务器无法正常提供信息。\\n目标页面可能已经被更改、删除或移到其他位置,或您所输入页面地址错误。',\n\t}\n};\n/**\n * @param {PageContext} ctx\n * @param {unknown} error\n * @returns {void}\n */\nexport let renderError = function renderError(ctx, error) {\n\tconst e = (typeof error === 'number' || typeof error === 'string')\n\t\t&& Object.hasOwn(errors, error) && errors[error]\n\t\t|| errors['404'];\n\tconst title = e?.title || 'Error';\n\tconst info = e?.description;\n\tconst errorContainer = document.createElement('div');\n\tconst main = errorContainer.appendChild(document.createElement('div'));\n\tconst titleDiv = main.appendChild(document.createElement('div'));\n\tconst infoDiv = main.appendChild(document.createElement('div'));\n\terrorContainer.style.marginBlock = '8%';\n\terrorContainer.style.marginInline = 'auto';\n\terrorContainer.style.inlineSize = '600px';\n\terrorContainer.style.maxInlineSize = '100%';\n\terrorContainer.style.padding = '20px';\n\ttitleDiv.style.paddingBlock = '20px';\n\ttitleDiv.style.fontSize = '20px';\n\ttitleDiv.style.color = '#8e8e8e';\n\ttitleDiv.style.textAlign = 'center';\n\tinfoDiv.style.fontSize = '13px';\n\tinfoDiv.style.lineHeight = '1.3em';\n\tinfoDiv.style.color = '#b5b5b5';\n\ttitleDiv.appendChild(document.createTextNode(title));\n\tctx.title = title || 'Error'\n\tif (info && typeof info === 'string') {\n\t\tfor (const p of info.split('\\n')) {\n\t\t\tinfoDiv.appendChild(document.createTextNode(p));\n\t\t\tinfoDiv.appendChild(document.createElement('br'));\n\t\t}\n\t}\n\tctx.container.appendChild(errorContainer);\n\tctx.loading = false;\n}\n\n/**\n * @param {typeof renderError} [renderer]\n */\nexport function switchRenderError(renderer) {\n\tif (typeof renderer !== 'function') { return false; }\n\trenderError = renderer;\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\n\n\n\nexport class PageFooter extends GeneralContext {\n\t#root;\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\tget sticky() { return this.#root.classList.contains('Page-sticky'); }\n\tset sticky(sticky) {\n\t\tif (sticky) {\n\t\t\tthis.#root.classList.add('Page-sticky');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-sticky');\n\t\t}\n\t}\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t#container = document.createElement('div');\n\tget container() { return this.#container; }\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\troot.className = 'Page-footer';\n\t\tcontainer.className = 'Page-footer-main';\n\t}\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\n\n\n\nexport class PageHeader extends GeneralContext {\n\t#root;\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\tget sticky() { return this.#root.classList.contains('Page-sticky'); }\n\tset sticky(sticky) {\n\t\tif (sticky) {\n\t\t\tthis.#root.classList.add('Page-sticky');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-sticky');\n\t\t}\n\t}\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t#container = document.createElement('div');\n\t#menu = document.createElement('div');\n\tget container() { return this.#container; }\n\t#destroyMenu = () => { };\n\t/**\n\t * \n\t * @param {*} menus \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, create = Menu.createItem) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#destroyMenu();\n\t\tconst menuContainer = this.#menu;\n\t\tconst ac = new AbortController();\n\t\tconst menu = Menu.createButtons(menus, create, AbortSignal.any([ac.signal, this.signal]));\n\t\tif (menu) { menuContainer.appendChild(menu); }\n\t\tthis.#destroyMenu = () => { ac.abort(); menu?.remove(); this.#destroyMenu = () => { }; };\n\t}\n\t/**\n\t * \n\t * @param {HTMLElement} root \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tconstructor(root, signal) {\n\t\tsuper(signal);\n\t\tthis.#root = root;\n\t\tconst container = root.appendChild(this.#container);\n\t\tconst menu = root.appendChild(this.#menu);\n\t\troot.className = 'Page-header';\n\t\tcontainer.className = 'Page-header-main';\n\t\tmenu.className = 'Page-header-menu';\n\t}\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { createState } from '../signal.mjs';\n\nexport class PageSection extends GeneralContext {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#container = this.#root.appendChild(document.createElement('div'));\n\tget container() { return this.#container; }\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t}\n\n\tget panel() { return this.#root.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#root.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('Page-panel');\n\t\t}\n\t}\n\t/** @readonly @type {ParentNode} */\n\t#parent;\n\t/** @readonly @type {Node} */\n\t#placeholder;\n\t#inserted = createState(false);\n\tget inserted() { return this.#inserted.get(); }\n\tinsert() {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#inserted.set(true);\n\t\tif (this.#root.nextSibling === this.#placeholder) { return; }\n\t\tthis.#parent.insertBefore(this.#root, this.#placeholder);\n\t}\n\tremove() { this.#root.remove(); this.#inserted.set(false); }\n\t/**\n\t * \n\t * @param {ParentNode} parent \n\t * @param {Node?} next \n\t * @param {boolean} inserted \n\t * @param {AbortSignal} signal \n\t * @returns \n\t */\n\tconstructor(parent, next, inserted, signal) {\n\t\tsuper(signal);\n\t\tconst placeholder = parent.insertBefore(document.createComment(''), next);\n\t\tthis.#parent = parent;\n\t\tthis.#placeholder = placeholder;\n\n\n\t\tconst root = this.#root;\n\t\tconst container = this.#container;\n\n\t\troot.className = 'Page-section';\n\t\tcontainer.className = 'Page-section-main';\n\n\t\tif (inserted) {\n\t\t\tparent.insertBefore(root, placeholder);\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\troot.remove();\n\t\t\tplaceholder.remove();\n\t\t\tthis.#inserted.set(false);\n\t\t}, { once: true });\n\t}\n}\n","import { createDialog, createModal, Modal } from '../dom/index.mjs';\nimport GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\nimport { createState } from '../signal.mjs';\n\nexport class PageSider extends GeneralContext {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.signal]) : this.signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#header = this.#root.appendChild(document.createElement('div'));\n\t#body = this.#root.appendChild(document.createElement('div'));\n\t#title = this.#header.appendChild(document.createElement('div'));\n\t#buttons = this.#header.appendChild(document.createElement('div'));\n\t#container = this.#body.appendChild(document.createElement('div'));\n\tget container() { return this.#container; }\n\tget unprintable() { return this.#root.classList.contains('unprintable'); }\n\tset unprintable(unprintable) {\n\t\tif (unprintable) {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t}\n\t\tif (!this.#inserted.get()) { return; }\n\t\tthis.#updateParentUnprintable();\n\t}\n\t#updateParentUnprintable() {\n\t\tconst parent = this.#parent;\n\t\tif ([...parent.children].find(v => !v.classList.contains('unprintable'))) {\n\t\t\tthis.#root.classList.remove('unprintable');\n\t\t} else {\n\t\t\tthis.#root.classList.add('unprintable');\n\t\t}\n\n\t}\n\tget panel() { return this.#body.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#body.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#body.classList.remove('Page-panel');\n\t\t}\n\t}\n\tget title() { return this.#title.textContent || ''; }\n\tset title(t) { this.#title.textContent = t; }\n\t/** @type {AbortController?} */\n\t#menuAbortController = null;\n\t/** @readonly @type {ParentNode} */\n\t#parent;\n\t/** @readonly @type {Node} */\n\t#placeholder;\n\t/**\n\t * \n\t * @param {(Menu | null)[]} menus \n\t * @param {Menu?} button \n\t * @param {Menu.Renderer} [create] \n\t * @returns \n\t */\n\tsetMenu(menus, button, create = Menu.createItem) {\n\t\tif (this.signal.aborted) { return; }\n\t\tthis.#menuAbortController?.abort();\n\t\tconst menuAbortController = new AbortController();\n\t\tthis.#menuAbortController = menuAbortController;\n\t\tconst menuSignal = AbortSignal.any([menuAbortController.signal, this.signal]);\n\t\tconst menu = Menu.createButton(menus, button, create, menuSignal);\n\t\tif (!menu) { return; }\n\t\tthis.#header.appendChild(menu);\n\t\tmenuSignal.addEventListener('abort', () => {\n\t\t\tmenu.remove();\n\t\t}, { once: true });\n\t}\n\t#inserted = createState(false);\n\tget inserted() { return this.#inserted.get(); }\n\tinsert() {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#inserted.set(true);\n\t\tif (this.#root.nextSibling === this.#placeholder) { return; }\n\t\tthis.#parent.insertBefore(this.#root, this.#placeholder);\n\t\tthis.#updateParentUnprintable();\n\t}\n\tremove() {\n\t\tthis.#root.remove();\n\t\tthis.#inserted.set(false);\n\t\tthis.#updateParentUnprintable();\n\t}\n\t/**\n\t * \n\t * @param {ParentNode} parent \n\t * @param {Node?} next \n\t * @param {boolean} inserted \n\t * @param {AbortSignal} signal \n\t * @returns \n\t */\n\tconstructor(parent, next, inserted, signal) {\n\t\tsuper(signal);\n\t\tconst placeholder = parent.insertBefore(document.createComment(''), next);\n\t\tthis.#parent = parent;\n\t\tthis.#placeholder = placeholder;\n\t\tconst root = this.#root;\n\t\tconst header = this.#header;\n\t\tconst body = this.#body;\n\t\tconst title = this.#title;\n\t\tconst buttons = this.#buttons;\n\t\tconst container = this.#container;\n\t\troot.className = 'Page-sider';\n\t\theader.className = 'Page-sider-header';\n\t\tbody.className = 'Page-sider-body';\n\t\tcontainer.className = 'Page-sider-body-main';\n\t\ttitle.className = 'Page-sider-title';\n\t\tbuttons.className = 'Page-sider-buttons';\n\t\tif (inserted) {\n\t\t\tparent.insertBefore(root, placeholder);\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\troot.remove();\n\t\t\tplaceholder.remove();\n\t\t\tthis.#inserted.set(false);\n\t\t\tthis.#updateParentUnprintable();\n\n\t\t}, { once: true });\n\t}\n}\n","import { createDialog, createModal, Modal, root as rootContainer } from '../dom/index.mjs';\nimport { PageFooter } from './PageFooter.mjs';\nimport { PageHeader } from './PageHeader.mjs';\nimport { PageSection } from './PageSection.mjs';\nimport { PageSider } from './PageSider.mjs';\n\n\n\n/**\n * \n * @param {ParentNode} parent \n * @param {Node?} next \n * @param {boolean} inserted \n * @param {AbortSignal} signal \n * @returns \n */\nexport function createSider(parent, next, inserted, signal) {\n\treturn new PageSider(parent, next, inserted, signal);\n}\nexport class Page {\n\t#root = document.createElement('div');\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.#signal]) : this.#signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createDialog(p1, options) : createDialog(options);\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) {\n\t\tconst signal = [p1, p2].find(v => v instanceof AbortSignal);\n\t\tconst options = {\n\t\t\tsignal: signal ? AbortSignal.any([signal, this.#signal]) : this.#signal,\n\t\t\tparent: this.#root,\n\t\t};\n\t\treturn typeof p1 === 'function' ? createModal(p1, options) : createModal(options);\n\t}\n\t#sides = this.#root.appendChild(document.createElement('div'));\n\t#main = this.#root.appendChild(document.createElement('div'));\n\t#body = this.#main.appendChild(document.createElement('div'));\n\t#container = this.#body.appendChild(document.createElement('div'));\n\t#destroyed = false;\n\t/** @type {PageHeader?} */\n\t#header = null;\n\t/** @type {PageFooter?} */\n\t#footer = null;\n\t/** @type {'scroll' | 'flex'} */\n\t#mode = 'scroll';\n\tget destroyed() { return this.#destroyed; }\n\tget container() { return this.#container; }\n\tget mode() { return this.#mode; }\n\tset mode(mode) {\n\t\tconst root = this.#root;\n\t\troot.classList.remove(`Page-mode-${this.#mode}`);\n\t\tthis.#mode = mode;\n\t\troot.classList.add(`Page-mode-${mode}`);\n\t}\n\tget panel() { return this.#body.classList.contains('Page-panel'); }\n\tset panel(panel) {\n\t\tif (panel) {\n\t\t\tthis.#body.classList.add('Page-panel');\n\t\t} else {\n\t\t\tthis.#body.classList.remove('Page-panel');\n\t\t}\n\t}\n\tget show() { return !this.#root.hidden; }\n\t/**\n\t * \n\t * @param {boolean} show \n\t */\n\ttoggle(show) {\n\t\tthis.#root.hidden = !show;\n\t}\n\tdestroy() {\n\t\tif (this.#destroyed) { return false; }\n\t\tthis.#destroyed = true;\n\t\tthis.#root.remove();\n\t\tthis.#abortController.abort();\n\t\treturn true;\n\t}\n\t/** @type {HTMLElement?} */\n\t#headerRoot = null;\n\t/** @type {AbortController?} */\n\t#headerAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateHeader(signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tif (signal?.aborted) {\n\t\t\tconst headerAbortController = this.#headerAbortController;\n\t\t\tif (headerAbortController) {\n\t\t\t\theaderAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#header) { return this.#header; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#main.insertBefore(root, this.#main.firstChild);\n\t\tthis.#headerRoot = root;\n\t\tthis.#headerAbortController = abortController;\n\t\tconst header = new PageHeader(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#header = header;\n\t\theader.signal.addEventListener('abort', () => {\n\t\t\tthis.#headerAbortController = null;\n\t\t\tthis.#header = null;\n\t\t\tthis.#headerRoot = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#header;\n\t}\n\t/** @type {HTMLDivElement?} */\n\t#footerRoot = null;\n\t/** @type {AbortController?} */\n\t#footAbortController = null;\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateFooter(signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tif (signal?.aborted) {\n\t\t\tconst footAbortController = this.#footAbortController;\n\t\t\tif (footAbortController) {\n\t\t\t\tfootAbortController.abort(signal.reason);\n\t\t\t}\n\t\t\tsignal.throwIfAborted();\n\t\t}\n\t\tif (this.#footer) { return this.#footer; }\n\t\tconst root = document.createElement('div');\n\t\tconst abortController = new AbortController();\n\t\tthis.#main.appendChild(root);\n\t\tthis.#footerRoot = root;\n\t\tthis.#footAbortController = abortController;\n\t\tconst footer = new PageFooter(root, AbortSignal.any([\n\t\t\tthis.signal,\n\t\t\tabortController.signal,\n\t\t\t...signal ? [signal] : [],\n\t\t]));\n\t\tthis.#footer = footer;\n\n\t\tfooter.signal.addEventListener('abort', () => {\n\t\t\tthis.#footAbortController = null;\n\t\t\tthis.#footer = null;\n\t\t\tthis.#footerRoot = null;\n\t\t\troot.remove();\n\t\t}, { once: true });\n\t\treturn this.#footer;\n\t}\n\t/**\n\t * \n\t * @param {'start' | 'end' | 'before' | 'after'} position \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSection}\n\t */\n\tcreateSection(position, inserted, signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tsignal?.throwIfAborted();\n\t\tconst parent = this.#main;\n\t\tlet next = null;\n\t\tswitch (position) {\n\t\t\tcase 'start': next = this.#headerRoot || parent.firstChild; break;\n\t\t\tcase 'before': next = this.#container; break;\n\t\t\tdefault:\n\t\t\tcase 'after': next = this.#container.nextSibling; break;\n\t\t\tcase 'end': next = this.#footerRoot; break;\n\t\t}\n\t\treturn new PageSection(\n\t\t\tparent,\n\t\t\tnext,\n\t\t\tinserted !== false,\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, this.#signal])\n\t\t\t\t: this.#signal\n\t\t);\n\t}\n\t#abortController = new AbortController();\n\t#signal = this.#abortController.signal;\n\tget signal() { return this.#signal; }\n\tget siderOpen() { return !this.#sides.hidden; }\n\tset siderOpen(open) { this.#sides.hidden = !open; }\n\t/**\n\t * \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSider}\n\t */\n\tcreateSider(inserted, signal) {\n\t\tif (this.#destroyed) { throw new Error('页面组件已被销毁'); }\n\t\tsignal?.throwIfAborted();\n\t\tconst parent = this.#sides;\n\t\treturn createSider(\n\t\t\tparent,\n\t\t\tnull,\n\t\t\tinserted !== false,\n\t\t\tsignal instanceof AbortSignal\n\t\t\t\t? AbortSignal.any([signal, this.#signal])\n\t\t\t\t: this.#signal\n\t\t);\n\t}\n\t/**\n\t * \n\t * @param {boolean} show \n\t */\n\tconstructor(show) {\n\t\tthis.#main.className = 'Page-main';\n\t\tthis.#body.className = 'Page-body';\n\t\tthis.#container.className = 'Page-body-main';\n\t\tthis.#sides.className = 'Page-sides';\n\t\tconst root = this.#root;\n\t\troot.className = 'Page';\n\t\troot.hidden = !show;\n\t\trootContainer.appendChild(root);\n\t}\n}\n","/** @import { PageFrame } from '../typesDefine.mjs' */\nimport { root } from '../dom/index.mjs';\nimport { Page } from './Page.mjs';\n\n/**\n * @param {boolean} show\n */\nexport let createPage = (show) => new Page(show);\n\n/**\n * @param {PageFrame.Context} ctx\n * @returns {PageFrame}\n */\nexport let createFrame = (ctx) => {\n\tconst iframe = document.createElement('iframe')\n\tiframe.classList.add('Page-frame');\n\tctx.loading = false;\n\tiframe.hidden = !ctx.show;\n\tiframe.src = ctx.url;\n\troot.appendChild(iframe);\n\treturn {\n\t\t/**\n\t\t * \n\t\t * @param {boolean} show \n\t\t */\n\t\ttoggle(show) {\n\t\t\tiframe.hidden = !show;\n\t\t},\n\t\tdestroy() {\n\t\t\tiframe.remove();\n\t\t}\n\t};\n};\n\n/**\n * @param {(show: boolean) => Page} [renderer]\n * @param {(ctx: PageFrame.Context) => PageFrame} [frame]\n */\nexport function switchCreatePage(renderer, frame) {\n\tif (typeof renderer === 'function') {\n\t\tcreatePage = renderer;\n\t}\n\tif (typeof frame === 'function') {\n\t\tcreateFrame = frame;\n\t}\n}\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { PageSectionParam } from '../typesDefine.mjs' */\n/** @import { Page } from './Page.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n/** @import { PageHandle } from './PageHandle.mjs' */\n/** @import { PageSection } from './PageSection.mjs' */\n/** @import { PageHeader } from './PageHeader.mjs' */\n/** @import { PageFooter } from './PageFooter.mjs' */\nimport GeneralContext from '../GeneralContext.mjs';\nimport { importWidget } from '../import.mjs';\nimport { renderError } from './renderError.mjs';\nimport { createPage } from './createPage.mjs';\nimport { createState } from '../signal.mjs';\n/** @import { Modal } from '../dom/index.mjs' */\n\n\n\n\nexport class PageContext extends GeneralContext {\n\t/** @readonly */\n\t#destroyDelayed = createState(false);\n\t/** @readonly @type {Page} */\n\t#pageUI;\n\t/** @readonly @type {HTMLElement} */\n\t#container;\n\t/** @readonly @type {AbortController} */\n\t#abortController;\n\t/** @readonly @type {PageHandle} */\n\t#state;\n\t/**\n\t * \n\t * @param {PageHandle} state \n\t */\n\tconstructor(state) {\n\n\t\tconst ac = new AbortController();\n\t\tsuper(AbortSignal.any([ac.signal, state.signal]));\n\t\tthis.#state = state;\n\t\tthis.#abortController = ac;\n\n\t\tconst pageUI = createPage(state.current && !state.bootLoading);\n\t\tthis.#pageUI = pageUI;\n\t\tthis.#container = pageUI.container;\n\t\tif (this.signal.aborted) {\n\t\t\tpageUI.destroy?.();\n\t\t\treturn;\n\t\t}\n\t\tthis.signal.addEventListener('abort', () => {\n\t\t\tpageUI.destroy?.();\n\t\t}, { once: true });\n\t\tstate.onToggle((show) => { pageUI.toggle(show && !state.bootLoading); }, this.signal);\n\n\t}\n\t/**\n\t * \n\t * @param {unknown} [err] \n\t * @returns \n\t */\n\tsetError(err) {\n\t\tif (this.destroyed) { return; }\n\t\tthis.#abortController.abort();\n\t\tconst ctx = new PageContext(this.#state);\n\t\trenderError(ctx, err);\n\t}\n\n\tget bootLoading() { return this.#state.bootLoading; }\n\tget define() { return this.#state.define; }\n\tget ident() { return this.#state.ident; }\n\tget root() { return this.#state.root; }\n\tget path() { return this.#state.path; }\n\tget search() { return this.#state.search; }\n\tget hash() { return this.#state.hash; }\n\tget href() { return this.#state.href; }\n\tget current() { return this.#state.current; }\n\tget shown() { return this.#state.shown; }\n\tget title() { return this.#state.title; }\n\tset title(title) { this.#state.title = title; }\n\tget icon() { return this.#state.icon; }\n\tset icon(icon) { this.#state.icon = icon; }\n\tget print() { return this.#state.print; }\n\tset print(print) { this.#state.print = print; }\n\tget unsaved() { return this.#state.unsaved; }\n\tset unsaved(unsaved) { this.#state.unsaved = unsaved; }\n\tget loading() { return this.#state.loading; }\n\tset loading(loading) { this.#state.loading = loading; }\n\n\tget container() { return this.#container; }\n\tget panel() { return this.#pageUI.panel; }\n\tset panel(panel) { this.#pageUI.panel = Boolean(panel); }\n\tget mode() { return this.#pageUI.mode; }\n\tset mode(mode) {\n\t\tif (!['scroll', 'flex'].includes(mode)) { return; }\n\t\tthis.#pageUI.mode = mode;\n\t}\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(dialog: HTMLDialogElement, signal: AbortSignal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {HTMLDialogElement}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateDialog(p1, p2) { return this.#pageUI.createDialog(p1, p2); }\n\t/**\n\t * @template T\n\t * @overload\n\t * @param {(modal: Modal) => PromiseLike<T> | T} exec\n\t * @param {AbortSignal} [signal] \n\t * @returns {Promise<T>}\n\t */\n\t/**\n\t * @overload\n\t * @param {AbortSignal} [signal] \n\t * @returns {Modal}\n\t */\n\t/**\n\t * \n\t * @template T\n\t * @param {any} [p1]\n\t * @param {any} [p2] \n\t * @returns {any}\n\t */\n\tcreateModal(p1, p2) { return this.#pageUI.createModal(p1, p2); }\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageHeader}\n\t */\n\tcreateHeader(signal) { return this.#pageUI.createHeader(signal); }\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageFooter}\n\t */\n\tcreateFooter(signal) { return this.#pageUI.createFooter(signal); }\n\t/**\n\t * \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns \n\t */\n\tcreateSider(inserted, signal) {\n\t\treturn this.#pageUI.createSider(inserted, signal);\n\t}\n\t/**\n\t * \n\t * @param {'start' | 'end' | 'before' | 'after'} position \n\t * @param {boolean} [inserted] \n\t * @param {AbortSignal} [signal] \n\t * @returns {PageSection}\n\t */\n\tcreateSection(position, inserted, signal) {\n\t\treturn this.#pageUI.createSection(position, inserted, signal);\n\t}\n\t/**\n\t * \n\t * @param {{widget: string; options: string}[]} sides \n\t * @param {PageSectionParam} param \n\t */\n\trenderSides(sides, param) {\n\t\tfor (const def of sides) {\n\t\t\tconst { widget } = def;\n\t\t\tif (!widget) { continue; }\n\t\t\tconst ac = new AbortController();\n\t\t\tconst sider = this.#pageUI.createSider(false, ac.signal);\n\t\t\tif (!sider) { continue; }\n\t\t\timportWidget(widget).then(fn => {\n\t\t\t\tif (typeof fn !== 'function') {\n\t\t\t\t\tac.abort();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsider.insert();\n\t\t\t\tfn(sider, def, param);\n\t\t\t});\n\t\t}\n\n\t}\n\t/**\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @returns {string}\n\t */\n\ttoUrl(url, page) { return this.#state.toUrl(url, page); }\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @overload\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\t/**\n\t * @param {string} url\n\t * @param {boolean | string | PageIdent} [page] \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\topen(url, page, replace) { return this.#state.open(url, page, replace); }\n\t/**\n\t * \n\t * @param {string} p \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tsetPath(p, replace) { return this.#state.setPath(p, replace); }\n\t/**\n\t * \n\t * @param {boolean} [replace] \n\t * @returns {void}\n\t */\n\tshow(replace) { return this.#state.show(replace); }\n\tget destroyDeferred() { return !this.destroyed && this.#destroyDelayed.get(); }\n\t/**\n\t * @param {boolean} [defer]\n\t * @returns {boolean}\n\t */\n\tdestroy(defer) { return this.#state.destroy(defer); }\n}\n","/** @import { PageHandle } from './PageHandle.mjs' */\nimport { createFrame } from './createPage.mjs';\n\n\n/**\n * \n * @param {PageHandle} state \n * @param {string} url \n * @param {string} [title] \n */\nexport function createPageFrame(state, url, title = '') {\n\tif (title) { state.title = title; }\n\tconst signal = state.signal;\n\n\tif (signal.aborted) { return; }\n\tconst pageUI = createFrame({\n\t\tget url() { return url;},\n\t\tget show() { return state.current && !state.bootLoading;},\n\t\tget title() { return state.title; },\n\t\tset title(title) { if (signal.aborted) { return; } state.title = title; },\n\t\tget icon() { return state.icon; },\n\t\tset icon(icon) { if (signal.aborted) { return; } state.icon = icon; },\n\t\tget loading() { return state.loading; },\n\t\tset loading(loading) { if (signal.aborted) { return; } state.loading = loading; },\n\t});\n\tsignal.addEventListener('abort', () => {\n\t\tpageUI.destroy?.();\n\t}, { once: true });\n\tstate.onToggle((show) => { pageUI.toggle(show && !state.bootLoading); }, signal);\n\n}\n","/** @import { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.mjs' */\n/** @import { RootPageExt } from './PageHandle.mjs' */\nimport load from './load.mjs';\nimport { switchPage, currentPage } from './home.mjs';\nimport * as routerParser from './route.mjs';\nimport { PageHandle } from './PageHandle.mjs';\nimport { PageContext } from './PageContext.mjs';\nimport { createPageFrame } from './createPageFrame.mjs';\n\n/** @type {Map<string, PageInfo & RootPageExt>} */\nconst pages = new Map();\n\n/**\n * \n * @param {string} pageRoot \n * @returns \n */\nexport function find(pageRoot) {\n\treturn pages.get(pageRoot)?.get();\n}\n/**\n * \n * @param {(url: string, replace?: boolean) => void} open \n * @param {PageIdent} pageIdent \n * @param {string} parentRoot \n * @param {string} pageRoot \n * @param {string} path \n * @param {string} search \n * @param {string} hash \n * @param {(p: string, replace?: boolean) => void} setRootPath \n * @returns \n */\nexport default async function showPage(\n\topen,\n\tpageIdent,\n\tparentRoot,\n\tpageRoot,\n\tpath,\n\tsearch,\n\thash,\n\tsetRootPath,\n) {\n\tlet pageId = pageRoot;\n\tlet old = pages.get(pageId);\n\tif (old) {\n\t\told.update(path, search, hash);\n\t\treturn;\n\t}\n\t/** @type {PageInfo & RootPageExt} */\n\tconst pageHandler = {\n\t\ttoggle() { },\n\t\thide() { },\n\t\tget() { return { path, search, hash }; },\n\t\tupdate(p, s, h) {\n\t\t\tpath = p;\n\t\t\tsearch = s;\n\t\t\thash = h;\n\t\t\tswitchPage(pageHandler, true);\n\t\t},\n\t};\n\tpages.set(pageId, pageHandler);\n\tswitchPage(pageHandler, true);\n\tconst data = await load(pageIdent).catch(() => null);\n\tif (pageHandler !== currentPage.get()) {\n\t\t// 请求完数据前已经切换了,那就移除\n\t\tpages.delete(pageId);\n\t\treturn;\n\t}\n\tif (!data) {\n\t\tconst state = new PageHandle({\n\t\t\troot: `${parentRoot}${pageId}`,\n\t\t\tdefine: null,\n\t\t\tident: pageIdent,\n\t\t\tpageId: pageId,\n\t\t\tpath, search, hash,\n\t\t\tpageHandler,\n\t\t\topen,\n\t\t\tsetRootPath,\n\t\t});\n\t\tstate.signal.addEventListener('abort', () => {\n\t\t\tpages.delete(pageId);\n\t\t}, { once: true });\n\t\t// 出现错误,显示错误\n\t\tnew PageContext(state).setError(404);\n\t\treturn;\n\t}\n\tconst newPage = data.ident;\n\t// TODO: 获取新页面的 pageRoot\n\tconst newPageRoot = routerParser.stringify(newPage);\n\tif (pageId !== newPageRoot) {\n\t\tpageIdent = newPage;\n\t\t// 原始页面不存在,需要跳转为其他页面\n\t\tif (pages.get(pageId) !== pageHandler) { return; }\n\t\tpages.delete(pageId);\n\t\tconst targetPage = pages.get(newPageRoot);\n\t\tif (targetPage) {\n\t\t\t// 目标页面已存在,则单纯切换\n\t\t\tsetRootPath(`${newPageRoot}/${path}${search}${hash}`, true);\n\t\t\treturn;\n\t\t}\n\t\tpageId = newPageRoot;\n\t\tpages.set(pageId, pageHandler);\n\t\tsetRootPath(`${newPageRoot}/${path}${search}${hash}`, true);\n\t}\n\tconst widget = data.widget;\n\tif (typeof widget === 'string') {\n\t\tconst state = new PageHandle({\n\t\t\troot: `${parentRoot}${pageId}`,\n\t\t\tdefine: data.page || null,\n\t\t\tident: pageIdent,\n\t\t\tpageId: pageId,\n\t\t\tpath, search, hash,\n\t\t\tpageHandler,\n\t\t\topen,\n\t\t\tsetRootPath,\n\t\t});\n\t\tstate.signal.addEventListener('abort', () => {\n\t\t\tpages.delete(pageId);\n\t\t}, { once: true });\n\t\tcreatePageFrame(state, widget);\n\t\treturn;\n\t}\n\n\n\tconst renderer = await widget();\n\tif (pageHandler !== currentPage.get()) {\n\t\t// 页面已切换\n\t\tpages.delete(pageId);\n\t\treturn;\n\t}\n\tconst state = new PageHandle({\n\t\troot: `${parentRoot}${pageId}`,\n\t\tdefine: data.page || null,\n\t\tident: pageIdent,\n\t\tpageId: pageId,\n\t\tpath, search, hash,\n\t\tpageHandler,\n\t\topen,\n\t\tsetRootPath,\n\t});\n\tstate.signal.addEventListener('abort', () => {\n\t\tpages.delete(pageId);\n\t}, { once: true });\n\tconst pc = new PageContext(state);\n\tif (typeof renderer !== 'function') {\n\t\tpc.setError();\n\t\treturn;\n\t}\n\ttry {\n\t\tawait renderer(pc);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpc.setError(e);\n\t}\n}\n","/**\n *\n * @param {string} url\n * @param {boolean} [replace]\n * @returns\n */\nexport default function setHistoryUrl(url, replace) {\n\tconst {href} = location;\n\tconst u = new URL(url, href);\n\tif (u.href === href) { return; }\n\tif (replace) {\n\t\thistory.replaceState({}, '', url);\n\t} else {\n\t\thistory.pushState({}, '', url);\n\t}\n}\n","import { application } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport showPage, { find } from './showPage.mjs';\nimport { showHome } from './home.mjs';\nimport { openUrl } from './setUrl.mjs';\nimport setHistoryUrl from './setHistoryUrl.mjs';\nimport { PageIdent } from './route.mjs';\n\n\n/**\n * 页面管理器\n * @callback PathListener\n * @param {string} path\n * @param {string} search\n * @param {string} hash\n * @param {(PageIdent & {path: string})?} page \n * @returns {void}\n */\n/** @type {Map<symbol, PathListener>} */\nconst listeners = new Map();\n\n/**\n * \n * @param {PathListener} listener \n * @returns \n */\nexport function listenPath(listener) {\n\tconst symbol = Symbol();\n\tlisteners.set(symbol, listener);\n\treturn () => { listeners.delete(symbol); };\n}\n/**\n * \n * @param {(PageIdent & {path: string})?} page \n */\nexport function updatePath(page) {\n\tconst {\n\t\tpathname, search, hash,\n\t} = new URL(location.href);\n\tfor (const updatePath of [...listeners.values()]) {\n\t\tupdatePath(pathname, search, hash, page ? { ...page } : null);\n\t}\n}\n\n/**\n * \n * @param {string} path \n * @param {boolean} [replace] \n * @returns \n */\nfunction setRoot(path, replace) {\n\tsetHistoryUrl(toUrl(application.path, path), replace);\n\tparse();\n}\n/**\n * \n * @param {URL | Location} u \n * @param {boolean} [replace] \n * @param {boolean} [inLink] \n * @returns \n */\nexport function parseFormUrl({ pathname, search, hash }, replace = true, inLink) {\n\tconst root = application.path;\n\tlet subPath = pathname.replace(/(^|[\\\\\\/])[\\\\\\/]*/, '/');\n\tif (!subPath || subPath === '/' || subPath === root || subPath + '/' === root) {\n\t\tsetHistoryUrl(`${root}${search}${hash}`, replace);\n\t\tupdatePath(null);\n\t\tshowHome(search, hash);\n\t\treturn;\n\t}\n\tsubPath = subPath.slice(subPath.startsWith(`${root}`) ? root.length : 1);\n\tlet { path, page, pageRoot } = PageIdent.parse(subPath);\n\tif (inLink && (path || '/') === '/' && (search || '?') === '?' && (hash || '#') === '#') {\n\t\tconst page = find(pageRoot);\n\t\tif (page) { ({ path, search, search } = page); }\n\t}\n\tsetHistoryUrl(`${root}${pageRoot}${path}${search}${hash}`, replace);\n\tupdatePath({ ...page, path });\n\tshowPage(openUrl, page, root, pageRoot, path, search, hash, setRoot);\n}\n\nexport default function parse() {\n\tparseFormUrl(location)\n}\n","import { application } from '../configuration.mjs';\nimport { parseFormUrl } from './parse.mjs';\n\n/**\n * \n * @param {string} url \n * @param {boolean} [replace] \n * @returns \n */\nexport function openUrl(url, replace) {\n\tif (setUrl(url, replace)) { return; }\n\tlocation.href = url;\n}\n\n/** @type {Set<(url: URL) => boolean>} */\nconst urlGuard = new Set();\n/**\n * \n * @param {(url: URL) => boolean} fn \n */\nexport function addUrlGuard(fn) {\n\tconst f = fn.bind(null);\n\turlGuard.add(f);\n\treturn () => { urlGuard.delete(f); };\n\n}\n/**\n * \n * @param {string} url \n * @param {boolean} [replace] \n * @param {boolean} [skipGuard] \n * @param {boolean} [inLink] \n * @returns \n */\nexport default function setUrl(url, replace, skipGuard, inLink) {\n\tconst u = new URL(url, location.href);\n\tif (u.origin !== location.origin) { return false; }\n\tif (!skipGuard) {\n\t\tfor (const fn of [...urlGuard]) {\n\t\t\tif (fn(u) === false) { return false; }\n\t\t}\n\t}\n\tif (u.origin !== location.origin) { return false; }\n\tconst path = u.pathname;\n\tif (!path.startsWith(application.path)) { return false; }\n\tparseFormUrl(u, Boolean(replace), inLink);\n\treturn true;\n}\n","/** @import { MaybePromise } from '@yongdall/types' */\n/** @import { PageContext } from './PageContext.mjs' */\nimport setUrl from './setUrl.mjs';\nimport parse from './parse.mjs';\nimport { closeAll } from './pageManager.mjs';\nimport { isMac } from '../dom/index.mjs';\n\n/**\n * @callback PageRenderer\n * @param {PageContext} ctx\n * @returns {MaybePromise<void>}\n */\n\n/**\n * \n * @param {PointerEvent} e \n * @returns \n */\nfunction clickEventListener(e) {\n\tif (e.shiftKey) { return; }\n\tif (isMac ? e.metaKey : e.ctrlKey) { return; }\n\tif (e.defaultPrevented) { return; }\n\tfor (const a of e.composedPath()) {\n\t\tif (!(a instanceof HTMLAnchorElement)) { continue; }\n\t\tconst url = a.href;\n\t\tif (!url) { continue; }\n\t\tif ((a.target || '_self') !== '_self') { return; }\n\t\tif (setUrl(url, Boolean(a.getAttribute('replace')), false, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\t\treturn;\n\t}\n}\nexport function initRouter() {\n\twindow.addEventListener('click', clickEventListener);\n\twindow.addEventListener('popstate', parse);\n\tparse();\n}\nexport function stopRouter() {\n\twindow.removeEventListener('click', clickEventListener);\n\twindow.removeEventListener('popstate', parse);\n\tcloseAll();\n}\n\nexport { addUrlGuard } from './setUrl.mjs';\nexport { switchHome } from './home.mjs';\nexport { switchCreatePage } from './createPage.mjs';\nexport { switchRenderError } from './renderError.mjs';\nexport { PageIdent, setRouter } from './route.mjs';\n\nexport { addManager, getPages, currentPage } from './pageManager.mjs';\nexport { Page } from './Page.mjs';\nexport { PageSider } from './PageSider.mjs';\nexport { PageSection } from './PageSection.mjs';\nexport { PageHeader } from './PageHeader.mjs';\nexport { PageFooter } from './PageFooter.mjs';\nexport { listenPath } from './parse.mjs';\nexport { createFrame } from './createPage.mjs';\n","/** @import { ModelConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\n\n/**\n * \n * @param {ModelScriptConfiguration | ModelConfiguration} model \n * @param {Record<string, any> | [key: string, value: any][]} params \n * @param {Record<string, any>} [defaultValue] \n * @returns \n */\nexport const createModelDefault = (model, params, defaultValue) => {\n\tconst fields = model.fields;\n\treturn (Array.isArray(params) ? params : Object.entries(params)).reduceRight((r, [k, v]) => {\n\t\tconst field = Object.hasOwn(fields, k) && fields[k];\n\t\tif (!field) { return r; }\n\t\tconst type = field?.type;\n\t\tif (!type || typeof type !== 'string') { return r; }\n\t\tif (!v && field.array) { return r; }\n\t\tif (!v && field.nullable) {\n\t\t\tr[k] = null;\n\t\t\treturn r;\n\t\t}\n\t\tif (typeof v !== 'string') {\n\t\t\tr[k] = v;\n\t\t\treturn r;\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'i16':\n\t\t\tcase 'i32':\n\t\t\t\tif (/^[+-]?\\d+$/.test(v)) { r[k] = Number.parseInt(v); }\n\t\t\t\treturn r;\n\t\t\tcase 'i64':\n\t\t\t\tif (/^[+-]?\\d+$/.test(v)) { r[k] = v; }\n\t\t\t\treturn r;\n\t\t\tcase 'f32':\n\t\t\tcase 'f64':\n\t\t\t\tif (/^[+-]?\\d+(\\.\\d*)?([eE][+-]?\\d*)$/.test(v)) { r[k] = Number.parseFloat(v); }\n\t\t\t\treturn r;\n\t\t\tcase 'decimal':\n\t\t\tcase 'numeric':\n\t\t\tcase 'money':\n\t\t\t\tif (/^[+-]?\\d+(\\.\\d*)?([eE][+-]?\\d*)$/.test(v)) { r[k] = v; }\n\t\t\t\treturn r;\n\t\t\tcase 'bool':\n\t\t\t\tswitch (v.toLowerCase()) {\n\t\t\t\t\tcase '0': case 'n': case 'no': case 'f': case 'false':\n\t\t\t\t\t\tr[k] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '1': case 'y': case 'yes': case 't': case 'true':\n\t\t\t\t\t\tr[k] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn r;\n\t\t\tdefault:\n\t\t\t\tr[k] = v;\n\t\t\t\treturn r;\n\t\t}\n\t}, defaultValue || {});\n};\n","/** @import { FormLayout } from '@yongdall/types' */\n\nimport { createStore, renderForm } from '../form/index.mjs';\nimport { createModelDefault } from './createModelDefault.mjs';\n\n/** @import { Modal } from '../dom/index.mjs' */\n/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\nimport { modelService } from '../services/model.mjs';\n\n/**\n * \n * @param {Modal} modal \n * @param {ModelScriptConfiguration} model \n * @param {ReturnType<typeof modelService> | string} currentModel \n * @param {FormLayout?} [layout] \n * @param {Record<string, any> | [key: string, value: any][] | null} [newParams] \n */\nexport async function createDocumentInModal(modal, model, currentModel, layout, newParams) {\n\tconst header = modal.createHeader();\n\tconst body = modal.container;\n\tconst store = createStore(model);\n\tstore.new = true;\n\trenderForm(store, body, {\n\t\tmodel, editable: true,\n\t\tsignal: modal.signal,\n\t\tenableLink: Boolean(layout?.enableLinkEditable ?? layout?.enableLink),\n\t\tlayout: layout?.layout,\n\t\ttype: layout?.type\n\t});\n\tstore.reset(createModelDefault(model, newParams || [], store.createDefault()));\n\n\n\tconst label = model?.label || model.id || '';\n\tconst titleArea = header.container;\n\ttitleArea.classList.add('Modal-title');\n\ttitleArea.innerText = label ? `新建:${label}` : '新建';\n\n\tconst { promise, resolve } = Promise.withResolvers();\n\n\tconst buttons = header.buttons;\n\tbuttons.classList.add('MenuButtons');\n\n\tlet creating = false;\n\tconst createButton = buttons.appendChild(document.createElement('button'));\n\tcreateButton.innerText = '创建';\n\tbuttons.appendChild(document.createElement('hr'));\n\tconst closeButton = buttons.appendChild(document.createElement('button'));\n\tcloseButton.innerText = '取消';\n\tcreateButton.addEventListener('click', async () => {\n\t\tif (creating) { return; }\n\t\tcreating = true;\n\t\tcloseButton.disabled = true;\n\t\tcreateButton.disabled = true;\n\t\ttry {\n\t\t\tconst created = await (typeof currentModel === 'string' ? modelService(currentModel) : currentModel).create(store.value);\n\t\t\talert('创建完成');\n\t\t\tresolve(created);\n\t\t} finally {\n\t\t\tcloseButton.disabled = false;\n\t\t\tcreateButton.disabled = false;\n\t\t\tcreating = false;\n\t\t}\n\t});\n\tcloseButton.addEventListener('click', () => {\n\t\tif (creating) { return; }\n\t\tresolve(null);\n\t});\n\treturn promise;\n}\n","/** @import { FormLayout } from '@yongdall/types' */\n\nimport { runPattern } from '@yongdall/common';\nimport { isMac } from '../dom/index.mjs';\nimport { createStore, renderForm } from '../form/index.mjs';\nimport { createComputed, createState, effect } from '../signal.mjs';\nimport { testPermissions } from '../permission.mjs';\n/** @import { ModelScriptConfiguration } from '../services/model.mjs' */\nimport { modelService } from '../services/model.mjs';\n\n/** @import { Modal } from '../dom/index.mjs' */\n\n/**\n * \n * @param {Modal} modal \n * @param {ModelScriptConfiguration} model \n * @param {ReturnType<typeof modelService>} currentModel \n * @param {string} id \n * @param {FormLayout?} [layout] \n * @param {object} [options] \n * @param {string} [options.href] \n * @param {boolean} [options.editable] \n * @param {boolean} [options.destroyable] \n */\nexport async function showDocumentInModal(modal, model, currentModel, id, layout, options) {\n\tconst header = modal.createHeader();\n\tconst body = modal.container;\n\tconst currentDocument = (typeof currentModel === 'string' ? modelService(currentModel) : currentModel).document(id);\n\n\tconst label = model?.label || model.id || '';\n\tconst titleArea = header.container;\n\ttitleArea.classList.add('Modal-title');\n\tconst title = label ? `详情:${label}` : '详情';\n\ttitleArea.innerText = label ? `详情:${label}` : '详情';\n\n\tconst doc = await currentDocument.get();\n\tif (modal.destroyed) { return; }\n\ttitleArea.innerText = runPattern(model?.labelPattern, doc) || title;\n\tconst store = createStore(model);\n\tconst { editable, destroyable } = options || {};\n\tstore.readonly = !editable;\n\trenderForm(store, body, {\n\t\tmodel, editable,\n\t\tsignal: modal.signal,\n\t\tenableLink: Boolean(editable ? layout?.enableLinkEditable ?? layout?.enableLink : layout?.enableLink),\n\t\tlayout: layout?.layout,\n\t\ttype: layout?.type\n\t});\n\tstore.reset(doc);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t/** @type {PromiseWithResolvers<void>} */\n\tconst { promise, resolve } = Promise.withResolvers();\n\n\tconst buttons = header.buttons;\n\tbuttons.classList.add('MenuButtons');\n\n\n\tconst running = createState(false);\n\tif (destroyable) {\n\t\tconst destroyable = createComputed(() => {\n\t\t\treturn testPermissions('destroy', model.permissions || [], store.value);\n\t\t});\n\t\tconst destroyButton = buttons.appendChild(document.createElement('button'));\n\t\tdestroyButton.innerText = '删除';\n\t\tbuttons.appendChild(document.createElement('hr'));\n\t\teffect(() => destroyButton.disabled = running.get() || !destroyable.get(), modal.signal);\n\t\tdestroyButton.addEventListener('click', async () => {\n\t\t\tif (!destroyable?.get()) { return; }\n\t\t\tif (modal.destroyed) { return; }\n\t\t\tif (running.get()) { return; }\n\t\t\tif (!confirm('确定要删除此文档吗?')) { return; }\n\t\t\trunning.set(true);\n\t\t\ttry {\n\t\t\t\tawait currentDocument.delete();\n\t\t\t\tresolve();\n\t\t\t} finally {\n\t\t\t\trunning.set(false);\n\t\t\t}\n\t\t});\n\t}\n\tif (editable) {\n\t\tconst createButton = buttons.appendChild(document.createElement('button'));\n\t\tcreateButton.innerText = '保存';\n\t\tbuttons.appendChild(document.createElement('hr'));\n\t\teffect(() => createButton.disabled = running.get(), modal.signal);\n\t\tcreateButton.addEventListener('click', async () => {\n\t\t\tif (modal.destroyed) { return; }\n\t\t\tif (running.get()) { return; }\n\t\t\trunning.set(true);\n\t\t\ttry {\n\t\t\t\tconst data = await currentDocument.update(store.value);\n\t\t\t\tresolve();\n\t\t\t} finally {\n\t\t\t\trunning.set(false);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconst { href } = options || {};\n\t\tif (href) {\n\t\t\tconst openButton = buttons.appendChild(document.createElement('button'));\n\t\t\tconst a = openButton.appendChild(document.createElement('a'));\n\t\t\ta.innerText = '打开';\n\t\t\ta.href = href;\n\t\t\tbuttons.appendChild(document.createElement('hr'));\n\t\t\teffect(() => openButton.disabled = running.get(), modal.signal);\n\t\t\ta.addEventListener('click', event => {\n\t\t\t\tif (event.shiftKey) { return; }\n\t\t\t\tif (isMac ? event.metaKey : event.ctrlKey) { return; }\n\t\t\t\tif (event.altKey) { return; }\n\t\t\t\tif (modal.destroyed) { return; }\n\t\t\t\tif (running.get()) { return; }\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\t}\n\tconst closeButton = buttons.appendChild(document.createElement('button'));\n\tcloseButton.innerText = '关闭';\n\teffect(() => closeButton.disabled = running.get(), modal.signal);\n\tcloseButton.addEventListener('click', () => {\n\t\tif (running.get()) { return; }\n\t\tresolve();\n\t});\n\treturn promise;\n}\n","/** @import { ModelConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\nconst regex = /\\{([^}{}]+)\\}/g\n\n/**\n *\n * @param {ModelConfiguration | ModelScriptConfiguration} model\n * @returns\n */\nexport function getPrimaryFields(model) {\n\treturn Object.entries(model.fields)\n\t\t.filter(v => v[1].primary)\n\t\t.sort(([,{primary: a}],[,{primary: b}]) => (a || 0) - (b || 0))\n\t\t.map(([v]) => v);\n}\n/**\n *\n * @param {ModelConfiguration | ModelScriptConfiguration | string[]} model\n * @param {Record<string, any>} document\n * @returns\n */\nexport function toId(document, model) {\n\treturn (Array.isArray(model) ? model :getPrimaryFields(model)).map(v => document[v]).join('$');\n}\nexport { createModelDefault } from './createModelDefault.mjs'\nexport { createDocumentInModal } from './createDocumentInModal.mjs'\nexport { showDocumentInModal } from './showDocumentInModal.mjs'\n","/** @import { Menu } from './Menu.mjs' */\n/** @import { ModelScriptConfiguration } from './services/model.mjs' */\n/** @import { PageIdent } from './route/route.mjs' */\n/** @import { Store } from '@neeloong/form' */\n\nimport { allHooks } from './allHooks.mjs';\nimport { createComputed } from './signal.mjs';\n\n/**\n * 命令选项\n * @typedef {Object} Command.Options\n * @property {'documents' | 'document' | 'createDocument' | 'editDocument'} type \n * @property {ModelScriptConfiguration} [model]\n * @property {PageIdent} [pageIdent]\n * @property {Record<string, any>} [document]\n * @property {Array<Record<string, any>>} [documents]\n * @property {Array<Record<string, any>>} [checkedDocuments]\n * @property {Store} [store]\n */\n\n/**\n * 命令接口\n * @typedef {Object} Command\n * @property {(options: Command.Options, menu: Menu, command: string) => boolean} disabled\n * @property {(options: Command.Options, menu: Menu, command: string) => string} toHref\n * @property {(options: Command.Options, menu: Menu, command: string) => void} exec\n */\n/**\n * @type {Partial<Command>}\n */\nconst scriptCommand = {\n\texec(options, menu, command) {\n\t\tconst { model } = options;\n\t\tif (!model) { return; }\n\t\tconst index = command.indexOf(':');\n\t\tif (index < 0) { return; }\n\t\tconst name = command.slice(index + 1);\n\t\tswitch (options.type) {\n\t\t\tcase 'documents': {\n\t\t\t\tconst scripts = model.script?.listScripts || {};\n\t\t\t\tconst script = scripts[name];\n\t\t\t\tif (typeof script !== 'function') { return; }\n\t\t\t\treturn script({\n\t\t\t\t\tmodel,\n\t\t\t\t\tget checkedDocuments() { return options.checkedDocuments; },\n\t\t\t\t\tget documents() { return options.documents; },\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'document':\n\t\t\tcase 'editDocument': {\n\t\t\t\tconst { store } = options;\n\t\t\t\tif (!store) { return; }\n\t\t\t\tconst scripts = model.script?.documentScripts || {};\n\t\t\t\tconst script = scripts[name];\n\t\t\t\tif (typeof script !== 'function') { return; }\n\t\t\t\treturn script({\n\t\t\t\t\tmodel,\n\t\t\t\t\tget document() { return options.document; },\n\t\t\t\t\tget store() { return store; },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n};\nconst commandStore = createComputed(() => {\n\t/** @type {Record<string, Partial<Command>>} */\n\tconst commands = {\n\t\tscript: scriptCommand,\n\t\t...allHooks.get('commands').named(),\n\t};\n\treturn commands;\n});\n\n/**\n * @template {keyof Command} K\n * @param {K} name \n * @param {Command.Options} options \n * @param {Menu} menu \n * @returns {ReturnType<Command[K]> | void}\n */\nfunction runCommand(name, options, menu) {\n\tconst command = menu.command;\n\tif (!command) { return; }\n\tconst index = command.indexOf(':');\n\tif (index < 0) { return; }\n\tconst type = command.slice(0, index);\n\tif (!type) { return; }\n\tconst commands = commandStore.get();\n\tconst cmd = Object.hasOwn(commands, type) && commands[type];\n\tif (!cmd) { return; }\n\tconst fn = Object.hasOwn(cmd, name) && cmd[name];\n\tif (typeof fn !== 'function') { return; }\n\tconst result = fn(options, menu, command);\n\t// @ts-ignore\n\treturn result;\n}\nexport const Command = {\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {boolean}\n\t */\n\tdisabled(options, menu) {\n\t\treturn runCommand('disabled', options, menu) || false;\n\t},\n\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {string}\n\t */\n\ttoHref(options, menu) {\n\t\treturn runCommand('toHref', options, menu) || '';\n\n\t},\n\t/**\n\t * \n\t * @param {Command.Options} options \n\t * @param {Menu} menu \n\t * @returns {void}\n\t */\n\texec(options, menu) {\n\t\treturn runCommand('exec', options, menu);\n\n\t}\n\n};\n","/** @import { IconDefine } from '../typesDefine.mjs' */\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed, watch } from '../signal.mjs';\nimport { neverAbortedSignal } from '../constants.mjs';\nconst logoPath = `\nM 0.29739625333333336 0.04334391666666666 M 0.06325983999999997 0.34186114333333334 H 0.08357982999999995 V 0.27435362333333335 L 0.1393469133333333 0.18517144333333335 H 0.1169949233333333 L 0.07500027666666663 0.25606563000000004 H 0.07364560999999996 L 0.03142518666666665 0.18517144333333332 H 0.007944309999999984 L 0.06325983999999997 0.2745794 Z M 0.29739625333333336 0.04334391666666666 M 0.21046684333333332 0.34411892 C 0.24659127 0.34411892 0.26668548233333333 0.32944337333333334 0.26668548233333333 0.28090117333333336 C 0.26668548233333333 0.2323589766666667 0.24659127 0.21768343000000004 0.21046684333333332 0.21768343000000004 C 0.17434241666666667 0.21768343000000004 0.15402242666666668 0.2323589766666667 0.15402242666666668 0.28090117333333336 C 0.15402242666666668 0.32944337333333334 0.17434241666666667 0.34411892 0.21046684333333332 0.34411892 Z M 0.21046684333333332 0.32763715000000004 C 0.18405085666666665 0.32763715000000004 0.17479397333333332 0.31657404666666666 0.17479397333333332 0.28090117333333336 C 0.17479397333333332 0.24545408000000002 0.18314774666666667 0.23393942 0.21046684333333332 0.23393942 C 0.23710860666666667 0.23393942 0.24613971333333332 0.24545408000000002 0.24613971333333332 0.28090117333333336 C 0.24613971333333332 0.3165740466666667 0.2382374966666667 0.32763715000000004 0.21046684333333332 0.32763715000000004 Z M 0.29739625333333336 0.04334391666666666 M 0.3592538966666667 0.21768342999999998 C 0.34435257 0.21768342999999998 0.3274192466666667 0.22152165 0.32019436133333334 0.23732608666666666 V 0.21994120666666667 H 0.30077748233333335 V 0.34186114333333334 H 0.3201943613333333 V 0.2594522966666667 C 0.32674191366666666 0.2380034166666667 0.3418690166666667 0.23506831000000003 0.35722189666666665 0.23506831000000003 C 0.37641300000000005 0.23506831000000003 0.3804769966666667 0.2459056366666667 0.3804769966666667 0.26464518333333337 V 0.34186114333333334 H 0.4001196533333333 V 0.2574202966666667 C 0.4001196533333333 0.2341651966666667 0.39108854666666665 0.21768343000000004 0.3592538966666667 0.21768343000000004 Z M 0.5233938433333333 0.21994120666666667 V 0.24274475 C 0.5186525133333334 0.22829498000000004 0.50849252 0.21768342999999998 0.48388275333333336 0.21768342999999998 C 0.4432427733333333 0.21768342999999998 0.43330855666666673 0.24613141333333333 0.43330855666666673 0.2797722866666667 C 0.43330855666666673 0.31679982333333334 0.4432427733333333 0.3418611433333334 0.48388275333333336 0.3418611433333334 C 0.5073636300000001 0.3418611433333334 0.5182009566666667 0.3335073700000001 0.5233938433333333 0.31905760000000005 V 0.3312495933333333 C 0.5233938433333333 0.35924602333333333 0.5105245166666667 0.37030913 0.4834311966666667 0.37030913 C 0.47281964666666665 0.37030913 0.46288543 0.36940602 0.4536285466666667 0.3675997966666667 V 0.38408158333333337 C 0.4615307633333333 0.3856620166666667 0.47259386999999997 0.38701668333333333 0.48320541999999994 0.38701668333333333 C 0.5245227333333333 0.38701668333333333 0.5428107233333334 0.36692246333333334 0.5428107233333334 0.33328159333333335 V 0.21994120666666667 Z M 0.48659208666666665 0.32560515333333334 C 0.45769254333333337 0.32560515333333334 0.45408010000000004 0.3050593833333333 0.45408010000000004 0.2797722866666667 C 0.45408010000000004 0.25606563 0.45701521 0.23393942 0.48659208666666665 0.23393942 C 0.51616896 0.23393942 0.5240711766666667 0.2517758566666667 0.5240711766666667 0.2797722866666667 C 0.5240711766666667 0.3088976033333333 0.51616896 0.32560515333333334 0.48659208666666665 0.32560515333333334 Z M 0.29739625333333336 0.04334391666666666 M 0.5841279533333333 0.18517144333333332 V 0.34186114333333334 H 0.6292834866666667 C 0.6742132533333334 0.34186114333333334 0.7049190200000001 0.32402471 0.7049190200000001 0.2635162933333333 C 0.7049190200000001 0.19826654999999999 0.6742132533333334 0.1851714433333333 0.6292834866666667 0.1851714433333333 Z M 0.6044479433333334 0.32402471000000005 V 0.20278210333333335 H 0.6288319333333333 C 0.6604408199999999 0.20278210333333335 0.6839216866666666 0.21361943000000003 0.6839216866666666 0.2635162933333334 C 0.6839216866666666 0.31070382666666674 0.6615696866666667 0.32402471000000005 0.6288319333333333 0.32402471000000005 Z M 0.7900370533333333 0.21768342999999998 C 0.78123172 0.21768342999999998 0.7712974866666666 0.21836076000000001 0.7622663866666667 0.21948964999999998 V 0.23664875333333335 C 0.77107172 0.23484252999999997 0.7810059533333333 0.23393942 0.7891339533333334 0.23393942 C 0.8137436866666667 0.23393942 0.8191623533333334 0.24409941666666665 0.8191623533333334 0.25877496333333333 V 0.26893495666666667 H 0.7819090533333334 C 0.75300952 0.26893495666666667 0.7335926199999999 0.27886917666666666 0.7335926199999999 0.30776871666666666 C 0.7335926199999999 0.33102381666666664 0.7464619533333333 0.34411892 0.7755872866666667 0.34411892 C 0.7941010533333333 0.34411892 0.8119374866666667 0.33644248000000004 0.8191623533333333 0.3233473766666667 L 0.8220974866666666 0.34186114333333334 H 0.8385792533333333 V 0.2553883 C 0.8385792533333333 0.23348786666666665 0.8286450200000001 0.21768342999999998 0.7900370533333333 0.21768342999999998 Z M 0.7773934866666666 0.32786293000000005 C 0.7602343866666667 0.32786293000000005 0.7536868533333334 0.32108960000000003 0.7536868533333334 0.30754294000000004 C 0.7536868533333334 0.2885776166666667 0.76316952 0.2845136166666667 0.7832637200000001 0.2845136166666667 H 0.8191623533333334 V 0.30460783 C 0.8128405866666667 0.31905760000000005 0.7979392533333334 0.32786293000000005 0.7773934866666666 0.32786293000000005 Z M 0.9069897533333334 0.34321581 C 0.9124084200000001 0.34321581 0.9162466533333335 0.3427642533333333 0.9198590866666666 0.34186114333333334 V 0.32583092999999996 C 0.9164724200000001 0.32673404 0.9133115200000002 0.3269598166666667 0.9106021866666667 0.3269598166666667 C 0.9026999866666667 0.3269598166666667 0.8993133200000001 0.32470203999999997 0.8993133200000001 0.31228427 V 0.17027012 H 0.8798964533333333 V 0.31725137999999997 C 0.8798964533333333 0.33553936999999995 0.8889275533333334 0.34321580999999995 0.9069897533333334 0.34321580999999995 Z M 0.9715620200000001 0.34321581 C 0.9769806533333334 0.34321581 0.9808188866666668 0.3427642533333333 0.98443132 0.34186114333333334 V 0.32583092999999996 C 0.9810446533333335 0.32673404 0.9778837866666668 0.3269598166666667 0.9751744533333333 0.3269598166666667 C 0.9672722200000001 0.3269598166666667 0.9638855533333334 0.32470203999999997 0.9638855533333334 0.31228427 V 0.17027012 H 0.9444686866666666 V 0.31725137999999997 C 0.9444686866666666 0.33553936999999995 0.9534997866666667 0.34321580999999995 0.9715620200000001 0.34321580999999995 Z M 0.29739625333333336 0.04334391666666666 M 0.20087005 0.5902171833333334 L 0.1977091533333333 0.5730580500000001 C 0.18867801999999997 0.57802515 0.17513132 0.5838954166666667 0.1575206133333333 0.5911203166666668 V 0.5143556833333334 H 0.20087004999999997 V 0.4827467166666667 H 0.1575206133333333 V 0.4005634166666667 L 0.1263632033333333 0.39920871666666674 V 0.4827467166666667 H 0.07940130999999999 V 0.5143556833333334 H 0.12636320333333334 V 0.6037638833333334 C 0.10514004 0.6118919166666668 0.08572310333333333 0.6186652499999999 0.06811239666666666 0.62408395 L 0.07578885666666665 0.6574991500000001 C 0.09249645333333331 0.6516288833333335 0.10965560666666664 0.6453071166666667 0.1263632033333333 0.6385337500000001 V 0.7432948833333335 C 0.1263632033333333 0.7581962833333334 0.12004140999999997 0.7636149500000001 0.10152758666666664 0.7654211833333334 L 0.08211064999999997 0.7676789500000002 L 0.09294800999999996 0.8001910500000001 L 0.11010716333333329 0.7979332500000001 C 0.1466832533333333 0.7934176833333335 0.15752061333333328 0.7875474500000001 0.15752061333333328 0.7541322500000002 V 0.6258901833333335 L 0.20357938999999997 0.6060216833333334 Z M 0.21757764666666665 0.60105455 C 0.21667453333333334 0.7058156833333333 0.21125585333333333 0.7306513166666667 0.17603443333333332 0.7929661166666667 L 0.20538561666666666 0.8069643833333334 C 0.21848075999999997 0.7848381166666667 0.22796344999999998 0.7631633833333334 0.2347368 0.7423917833333333 C 0.24151014999999998 0.7216201833333333 0.24557416 0.6976876833333334 0.24783194333333333 0.6705942833333334 H 0.3173716663333333 V 0.7934176833333334 H 0.3485290766666667 V 0.6705942833333335 H 0.4185203566666667 V 0.7383277833333335 C 0.4185203566666667 0.7590993833333335 0.4149079033333333 0.7604540500000001 0.39323318333333335 0.7631633833333334 L 0.37336469 0.7649696166666667 L 0.3846536066666667 0.7974816833333335 L 0.4036189866666667 0.7952239166666668 C 0.43929196333333337 0.7907083500000002 0.45058088 0.7830318833333334 0.45058088 0.7482620166666668 V 0.42404435000000007 H 0.21757764666666665 Z M 0.24963817 0.53241795 V 0.4565564166666667 H 0.3173716663333333 V 0.5324179500000001 Z M 0.34852907666666666 0.4565564166666667 H 0.4185203566666667 V 0.53241795 H 0.3485290766666667 Z M 0.24918661333333333 0.63853375 C 0.24963817 0.6331150833333334 0.24963817 0.6249870500000001 0.24963817 0.61369815 V 0.5640269166666667 H 0.3173716663333333 V 0.63853375 Z M 0.4185203566666667 0.5640269166666667 V 0.63853375 H 0.3485290766666667 V 0.5640269166666667 Z M 0.6610059533333333 0.5107432166666667 V 0.7184592833333333 H 0.8745922533333332 V 0.5107432166666667 H 0.7720888866666666 C 0.7761528866666666 0.49900274999999994 0.7797653533333333 0.4868107166666666 0.7829262533333332 0.4737155833333333 H 0.9116198866666666 V 0.4448159499999999 H 0.8262756866666666 C 0.8384677199999999 0.4299145833333333 0.8493050533333332 0.41501321666666663 0.8587877533333332 0.40011184999999994 L 0.8294365866666666 0.38430734999999994 C 0.8253725533333333 0.39198381666666665 0.81859922 0.4019180833333333 0.8100196533333334 0.41365854999999996 C 0.8014400533333333 0.4253990166666666 0.7937635866666666 0.4357848166666666 0.78608712 0.4448159499999999 H 0.7305456533333333 L 0.74047992 0.43804261666666666 C 0.7373190199999999 0.43126924999999994 0.7319003533333334 0.4222381166666666 0.7251269866666666 0.4114007499999999 C 0.7183536533333332 0.40011184999999994 0.7129349533333332 0.3919838166666666 0.7084193866666666 0.38611358333333323 L 0.6826806533333333 0.4014665166666666 C 0.6899055533333333 0.41049764999999994 0.7011944866666665 0.42901148333333333 0.7088709533333333 0.4448159499999999 H 0.6307516533333333 V 0.4737155833333333 H 0.7481563866666666 C 0.7440923533333332 0.4886169499999999 0.7404799199999998 0.5012605499999999 0.7368674533333333 0.5107432166666667 Z M 0.6199142900000001 0.48861695 C 0.6140440533333333 0.47732801666666663 0.6045613633333333 0.46242665 0.59146622 0.44436438333333333 C 0.5788226333333334 0.42585058333333337 0.5679852733333334 0.4118523166666667 0.5594056966666667 0.40236961666666665 L 0.5318607433333333 0.42178655 C 0.5413434300000001 0.43262391666666666 0.5517292333333335 0.44707375 0.5639212633333334 0.46558755 C 0.5761132933333333 0.48410138333333336 0.5851444266666667 0.4994543166666666 0.5910146633333333 0.51254945 Z M 0.6939695866666667 0.53648195 H 0.84162862 V 0.5712518166666667 H 0.6939695866666667 Z M 0.8027947200000001 0.7586478166666666 C 0.77073422 0.7586478166666666 0.7418345866666667 0.7581962833333333 0.7169989533333333 0.7568415833333333 C 0.6573934866666666 0.75322915 0.63617032 0.74781045 0.6045613633333333 0.7008485833333333 V 0.5473193166666667 H 0.5205718266666667 V 0.58118605 H 0.5729523966666666 V 0.7017516833333334 L 0.5169593733333333 0.7609056166666668 L 0.5354731966666667 0.7911599166666667 C 0.5571479133333334 0.7708398500000001 0.57521018 0.7518744833333335 0.5896599933333334 0.7347153166666668 C 0.6262360833333334 0.7803225500000001 0.6483623533333335 0.7857412166666669 0.7120318533333334 0.7884505500000001 C 0.7368674533333334 0.78980525 0.7657670866666667 0.7902567833333334 0.7978276200000001 0.7902567833333334 C 0.8253725533333334 0.7902567833333334 0.8651095533333334 0.7893536833333334 0.9170385533333335 0.78754745 L 0.9224572533333333 0.7559384833333334 C 0.87052822 0.7577447166666667 0.8307912533333335 0.7586478166666667 0.8027947200000001 0.7586478166666667 Z M 0.84162862 0.6317604166666667 H 0.6939695866666667 V 0.59699055 H 0.84162862 Z M 0.84162862 0.6570475833333334 V 0.69272055 H 0.6939695866666667 V 0.6570475833333334 Z\n`;\nconst defaultIcons = {\n\tuser: `\nM 0.4 0.65\nA 0.3 0.3 0 1 1 0.6 0.65\nA 0.3 0.3 0 0 1 0.4 0.65\n\nM 0.1 0.8\nA 0.4 0.18 0 0 1 0.9 0.8\nA 0.4 0.10 0 0 1 0.1 0.8\n`,\n\n\tsingleUser: `\nM 0.05 0.25\nL 0.40 0.25\n\nL 0.5 0.35\n\nL 0.6 0.25\nL 0.95 0.25\n\nL 0.80 0.4\nL 0.55 0.4\n\nL 0.5 0.35\n\nL 0.45 0.4\nL0.20 0.4\n\n\nZ\n\nM 0.12530012009609615 0.36\nA 0.4 0.4 0 1 0 0.8746998799039039 0.36\nL 0.8588523373199624 0.375\nA 0.38 0.38 0 1 1 0.14114766268003764 0.375\nZ\n\n\nM 0.20487290873252584 0.23\nA 0.4 0.4 0 0 1 0.7951270912674742 0.23\nL 0.7673948391424188 0.23\nA 0.38 0.38 0 0 0 0.2326051608575812 0.23\nZ\n`\n};\nconst iconsState = createComputed(() => {\n\t/** @type {Record<string, IconDefine>} */\n\tconst icons = {\n\t\t...defaultIcons,\n\t\t...allHooks.get('icons').named(),\n\t\tlogo: logoPath,\n\t};\n\treturn icons;\n});\n/**\n * \n * @param {string | string[]} key \n * @param {AbortSignal | boolean} [signal] \n */\nexport function createIcon(key, signal) {\n\tconst root = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\troot.setAttribute('fill', `currentColor`);\n\troot.classList.add('icon');\n\tconst keys = [key].flat().filter(Boolean);\n\tconst iconState = createComputed(keys.length ? () => {\n\t\tconst icons = iconsState.get();\n\t\tfor (const key of keys) {\n\t\t\tconst icon = Object.hasOwn(icons, key) && icons[key];\n\t\t\tif (icon) { return icon; }\n\t\t}\n\t\treturn null;\n\t} : () => null);\n\tif (signal instanceof AbortSignal && signal.aborted) { return root; }\n\tconst abortSignal = signal instanceof AbortSignal ? signal : neverAbortedSignal;\n\t/**\n\t * \n\t * @param {IconDefine?} icon \n\t * @returns \n\t */\n\tfunction run(icon) {\n\t\tif (Array.isArray(icon) && icon.length <= 2) {\n\t\t\tconst [iconPath, viewBox] = icon;\n\t\t\troot.setAttribute('viewBox', viewBox || '0 0 1 1');\n\t\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\t\troot.appendChild(path);\n\t\t\tpath.setAttribute('d', iconPath);\n\t\t\treturn;\n\t\t}\n\t\troot.setAttribute('viewBox', '0 0 1 1');\n\t\tif (!icon) { return; }\n\t\tif (typeof icon === 'string') {\n\t\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\t\troot.appendChild(path);\n\t\t\tpath.setAttribute('d', icon);\n\t\t\treturn;\n\t\t}\n\t\tif (typeof icon !== 'function') { return; }\n\t\ticon({ root }, abortSignal);\n\t}\n\tif (!signal) {\n\t\trun(iconState.get());\n\t} else {\n\t\twatch(() => iconState.get(), run, {\n\t\t\tsignal: abortSignal,\n\t\t\timmediate: true,\n\t\t});\n\t}\n\n\treturn root;\n\n}\n","import { pathRoots } from './paths.mjs';\n\n/**\n * @param {object} [options]\n * @param {FileSystemHandleQueryOptions['types']} [options.types]\n * @param {boolean} [options.excludeAcceptAllOption]\n * @returns {Promise<File?>}\n */\nexport async function selectFile({ types, excludeAcceptAllOption } = {}) {\n\tif ('showOpenFilePicker' in window && typeof showOpenFilePicker === 'function') {\n\t\tconst [file] = await showOpenFilePicker({\n\t\t\ttypes,\n\t\t\texcludeAcceptAllOption: Boolean(excludeAcceptAllOption && Array.isArray(types) && types.length),\n\t\t});\n\t\tif (!file) { return null; }\n\t\treturn file.getFile();\n\t}\n\tconst input = document.createElement('input');\n\tinput.type = 'file';\n\tconst accepted = Array.isArray(types) && types.map(v => Object.entries(v.accept)).flat(3) || '';\n\tif (accepted) {\n\t\tinput.accept = accepted.join(',');\n\t}\n\n\t// 如果 excludeAcceptAllOption 为 true,且没有设置 accept,则禁用所有文件选项(通过 accept 强制限制)\n\t// 但实际上 input 无法完全移除 \"All Files\",只能尽量限制\n\tif (excludeAcceptAllOption && accepted) {\n\t\t// 没有指定类型时,可以设为 '*' 来允许所有?但逻辑上 exclude 应该表示只允许明确类型\n\t\t// 所以这里我们不做特殊处理,由调用者传入 types 控制\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tinput.addEventListener('change', () => { resolve(input.files?.[0] || null); });\n\t\tinput.addEventListener('error', (e) => { reject(e.error); });\n\t\tinput.click();\n\t});\n}\n\nconst filePrefix = `+file://`\n/**\n * \n * @param {object} file \n * @param {string} file.domain \n * @param {string} file.path\n * @param {string} [name]\n */\nexport function toFileURL(file, name) {\n\tlet path = file.path;\n\tif (path[0] === '/') { path = path.slice(1); }\n\tconst d = `${filePrefix}${file.domain}/${path}`;\n\treturn name ? `${d}#${name}` : d;\n}\n\n/**\n * \n * @param {string} [uri] \n * @returns \n */\nexport function toFileLink(uri) {\n\tif (!uri || typeof uri !== 'string') { return null; }\n\tconst index = uri.indexOf('#');\n\tconst name = decodeURIComponent(\n\t\t(index >= 0 ? uri.slice(index + 1) : '')\n\t\t|| uri.replace(/[#?].*/, '').split('/').filter(Boolean).pop()\n\t\t|| '',\n\t);\n\tif (uri.slice(0, filePrefix.length).toLowerCase() === filePrefix) {\n\t\tconst [hostname, ...pathname] = uri.slice(filePrefix.length).replace(/[?#].*$/, '').split('/');\n\t\tconst filePath = pathname.filter(Boolean).join('/');\n\t\tif (!filePath) { return null; }\n\t\treturn { name, href: `${pathRoots.file}/${hostname || '_'}/files/${filePath}` };\n\t}\n\treturn { name, href: uri };\n}\n","import { importStyle, importWidget } from './import.mjs';\nimport pathRoots from './paths.mjs';\nimport request from './request.mjs';\nimport { User } from './user.mjs';\nimport isPluginId from './utils/isPluginId.mjs';\n\n\n/**\n * \n * @param {string} pluginId \n */\nexport default function buildPlugin(pluginId) {\n\tif (!isPluginId(pluginId)) {\n\t\tthrow new Error(`无效的 plugin: ${pluginId}`);\n\t}\n\treturn {\n\t\t/**\n\t\t * \n\t\t * @param {string} url \n\t\t * @returns \n\t\t */\n\t\timportStyle(url) { return importStyle(url, pluginId, true); },\n\t\t/**\n\t\t * \n\t\t * @param {string} url \n\t\t * @returns \n\t\t */\n\t\timport(url) { return importWidget(url, pluginId); },\n\t\trequest: request.clone().prefix(`${pathRoots.api}/plugins/${pluginId}`),\n\t\tuser: User.plugin(pluginId),\n\t};\n}\n","/** @import { MaybePromise } from '@yongdall/types' */\n/** @import { Authenticator, Theme } from './typesDefine.mjs' */\n/** @import { PageIdent } from './route/route.mjs' */\nimport { addManager, initRouter, stopRouter, switchCreatePage, switchRenderError, switchHome, setRouter, listenPath, currentPage } from './route/index.mjs';\nimport { importStyle, importWidget } from './import.mjs';\nimport { root } from './dom/index.mjs';\nimport setComponents from './components.mjs';\nimport { application, plugins } from './configuration.mjs';\nimport { allHooks, updateHooks } from './allHooks.mjs';\nimport { User } from './user.mjs';\nimport { watch } from './signal.mjs';\nimport { updatePrintStyle } from './print.mjs';\nimport { setErrorAlerter } from './request.mjs';\n\n/**\n * @template T\n * @param {() => MaybePromise<T>} fn \n * @returns {() => Promise<T>}\n */\nfunction onceFn(fn) {\n\t/** @type {Promise<T>} */\n\tlet result;\n\treturn () => result ||= Promise.resolve().then(() => fn());\n\n}\nasync function initHooks() {\n\t/** @type {[string, any][]} */\n\tconst promises = Object.entries(plugins).map(([plugin, { hooks: hookPath }]) => {\n\t\tif (typeof hookPath !== 'string') { return ['', '']; }\n\t\tif (!hookPath) {\n\t\t\treturn [plugin, importWidget(`${plugin}`)];\n\t\t}\n\t\tif ('/#?'.includes(hookPath[0])) {\n\t\t\treturn [plugin, importWidget(`${plugin}${hookPath}`)];\n\t\t}\n\t\treturn [plugin, importWidget(`${plugin}/${hookPath}`)];\n\t});\n\tconst stylesPromises =\n\t\tObject.entries(plugins).flatMap(([plugin, { styles }]) => [styles].flat().map(path => {\n\t\t\tif (!path || typeof path !== 'string') { return; }\n\t\t\treturn importStyle(path, plugin, true);\n\t\t}));\n\tconst loaded = await Promise.all(\n\t\tpromises.filter(([plugin]) => plugin).map(v => Promise.all(v)),\n\t).then(l => l.filter(([, hook]) => hook && typeof hook === 'object'));\n\tawait Promise.all(stylesPromises);\n\tupdateHooks(Object.fromEntries(loaded));\n}\n/** @typedef {[file: string, plugin: string]} uiStyle */\n/**\n * \n * @param {uiStyle[]} [uiStyles] \n */\nasync function addStyles(uiStyles) {\n\tconst promises = [];\n\tfor (const [file, plugin] of uiStyles || []) {\n\t\tpromises.push(importStyle(file, plugin, true));\n\t}\n\tfor (const [plugin, style] of allHooks.get('styles')) {\n\t\tif (typeof style === 'string') {\n\t\t\tpromises.push(importStyle(style, plugin, true));\n\t\t}\n\t}\n\tawait Promise.all(promises);\n}\n\n/** @type {() => MaybePromise<Partial<Omit<Authenticator, \"styleFiles\"> & Record<\"styleFiles\", uiStyle[]>>>} */\nlet loadAuthenticator = () => ({});\n/** @typedef {Omit<Theme, \"styleFiles\"> & Record<\"styleFiles\", uiStyle[]>} WorkbenchTheme */\n/** @type {(() => MaybePromise<Partial<WorkbenchTheme>>)?} */\nlet loadTheme = null;\n\nlet clearPage = () => { };\nlet isWorkbench = false;\nasync function toWorkbench() {\n\tif (isWorkbench || !loadTheme) { return; }\n\tisWorkbench = true;\n\tclearPage();\n\tlet stopped = false;\n\tclearPage = () => { stopped = true; isWorkbench = false; };\n\tconst { classNames, elements, rootClassName, setup, pageManager, updatePath, title, icon } = await loadTheme();\n\tif (stopped) { return; }\n\t/** @type {(() => void)[]} */\n\tconst destroyList = [];\n\tfor (const cn of [classNames, allHooks.get('className').values()].flat()) {\n\t\tif (cn && typeof cn === 'string') {\n\t\t\tdocument.body.classList.add(cn);\n\t\t}\n\t}\n\tif (rootClassName && typeof rootClassName === 'string') {\n\t\troot.classList.add(rootClassName);\n\t}\n\tfor (const el of [elements, allHooks.get('elements').values()].flat()) {\n\t\tif (el instanceof Element) {\n\t\t\tdocument.body.appendChild(el);\n\t\t}\n\t}\n\tif (typeof pageManager === 'function') {\n\t\tdestroyList.push(addManager(pageManager));\n\t}\n\tif (typeof updatePath === 'function') {\n\t\tdestroyList.push(listenPath(updatePath));\n\t}\n\tfor (const pageManager of allHooks.get('pageManager').values()) {\n\t\tif (!pageManager) { continue; }\n\t\tdestroyList.push(addManager(pageManager));\n\t}\n\n\tinitRouter();\n\tconst ac = new AbortController();\n\tconst signal = ac.signal;\n\n\twatch(() => title?.(currentPage) || currentPage.title || application.title || '拥道YongDall', title => {\n\t\tdocument.title = title;\n\t}, { signal, immediate: true });\n\twatch(() => currentPage.print, print => { updatePrintStyle(print); }, { signal, immediate: true });\n\n\tclearPage = () => {\n\t\tclearPage = () => { };\n\t\tac.abort();\n\t\tisWorkbench = false;\n\t\tstopRouter();\n\t\tfor (const destroy of destroyList) { destroy(); }\n\t\tfor (const el of [elements, allHooks.get('elements').values()].flat()) {\n\t\t\tif (el instanceof Element) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t}\n\t\tif (rootClassName && typeof rootClassName === 'string') {\n\t\t\troot.classList.remove(rootClassName);\n\t\t}\n\t\tfor (const cn of [classNames, allHooks.get('className').values()].flat()) {\n\t\t\tif (cn && typeof cn === 'string') {\n\t\t\t\tdocument.body.classList.remove(cn);\n\t\t\t}\n\t\t}\n\t};\n\tsetup?.(signal);\n}\n/**\n * \n * @param {boolean} onlyAuthenticator \n * @returns \n */\nasync function toLogin(onlyAuthenticator) {\n\tclearPage();\n\tlet stopped = false;\n\tclearPage = () => { stopped = true; };\n\tconst authenticator = await loadAuthenticator();\n\tif (stopped) { return; }\n\tconst { classNames, elements, rootClassName } = authenticator;\n\n\tfor (const cn of [classNames].flat()) {\n\t\tif (cn && typeof cn === 'string') {\n\t\t\tdocument.body.classList.add(cn);\n\t\t}\n\t}\n\tif (rootClassName && typeof rootClassName === 'string') {\n\t\troot.classList.add(rootClassName);\n\t}\n\tfor (const el of [elements].flat()) {\n\t\tif (el instanceof Element) {\n\t\t\tdocument.body.appendChild(el);\n\t\t}\n\t}\n\tconst ac = new AbortController();\n\tclearPage = () => {\n\t\tclearPage = () => { };\n\t\tac.abort();\n\t\tfor (const el of [elements].flat()) {\n\t\t\tif (el instanceof Element) {\n\t\t\t\tel.remove();\n\t\t\t}\n\t\t}\n\t\tif (rootClassName && typeof rootClassName === 'string') {\n\t\t\troot.classList.remove(rootClassName);\n\t\t}\n\t\tfor (const cn of [classNames].flat()) {\n\t\t\tif (cn && typeof cn === 'string') {\n\t\t\t\tdocument.body.classList.remove(cn);\n\t\t\t}\n\t\t}\n\t};\n\tawait authenticator.login?.(ac.signal, onlyAuthenticator);\n\tif (ac.signal.aborted) { return; }\n\tawait User.load();\n}\nlet started = false;\n/**\n * \n * @param {typeof loadAuthenticator} _loadAuthenticator \n * @param {() => MaybePromise<Partial<WorkbenchTheme>>} [_loadTheme] \n * @param {() => MaybePromise<PageIdent.Router?>} [_loadRoute] \n * @returns \n */\nexport default async function start(_loadAuthenticator, _loadTheme, _loadRoute) {\n\tif (started) { return; }\n\tstarted = true;\n\tloadAuthenticator = onceFn(async () => {\n\t\tconst authenticator = await _loadAuthenticator();\n\t\tconst { styleFiles } = authenticator;\n\t\tawait addStyles(styleFiles);\n\t\treturn authenticator;\n\t});\n\tif (typeof _loadTheme === 'function') {\n\t\tloadTheme = onceFn(async () => {\n\t\t\tconst [theme, router] = await Promise.all([\n\t\t\t\t_loadTheme(),\n\t\t\t\t_loadRoute?.(),\n\t\t\t]);\n\t\t\tif (router) { setRouter(router); }\n\n\t\t\tconst {\n\t\t\t\thome, components, styleFiles,\n\t\t\t\tcreatePage, createFrame, renderError,\n\t\t\t\talertError,\n\t\t\t} = theme;\n\t\t\tawait addStyles(styleFiles);\n\t\t\tswitchHome(home);\n\t\t\tsetComponents(components);\n\t\t\tsetErrorAlerter(alertError);\n\t\t\tswitchCreatePage(createPage, createFrame);\n\t\t\tswitchRenderError(renderError);\n\t\t\treturn theme;\n\t\t});\n\n\t}\n\tawait initHooks();\n\tawait User.load();\n\tif (loadTheme) {\n\t\twatch(() => User.waitLogin, waitLogin => {\n\t\t\tif (waitLogin) {\n\t\t\t\ttoLogin(false);\n\t\t\t} else {\n\t\t\t\ttoWorkbench();\n\t\t\t}\n\t\t}, {\n\t\t\timmediate: true\n\t\t});\n\n\t} else {\n\t\ttoLogin(true);\n\t}\n}\n"],"mappings":"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EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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"}