@yongdall/web 0.1.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/assets.yongdall.mjs +4 -0
- package/boot.d.mts +4 -0
- package/boot.mjs +2 -0
- package/boot.mjs.map +1 -0
- package/index.d.mts +2154 -0
- package/index.mjs +80 -0
- package/index.mjs.map +1 -0
- package/package.json +26 -0
- package/plugin.d.mts +188 -0
- package/plugin.mjs +2 -0
- package/plugin.mjs.map +1 -0
package/index.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["Signal","parse","stringify","#config","#hooks","#stringTag","#keys","DotRequest","pathRoots","pages","configuration","testPermissionConstraints","testPermission","ObjectStore","ArrayStore","renderStore","renderGridForm","Store","modelPages","enumerations","load","request","List","#table","#thead","#createUrl","#renderList","#labelPattern","#fieldsShow","#idFields","#tr","#tbody","#documents","FormList","#pagination","pages","Search.parse","pages","configuration","pages","pages","rootContainer","loadingContainer","triggerLoading","stringify","parse","parse","Ident.decode","Ident.parse","Ident.stringify","Ident.encode","#signal","#destroyed","#root","#path","#search","#hash","#pageId","#abortController","#define","#ident","#pageHandler","#open","#setRootPath","#onToggle","#onHide","#bootLoading","#href","#title","#unsaved","#loading","routerParser.stringify","#rootPath","#destroyDelayed","#container","#container","#destroyMenu","#menu","#root","#container","#inserted","#placeholder","#parent","#root","#header","#body","#container","#title","#menuAbortController","#inserted","#placeholder","#parent","#buttons","#root","#main","#body","#destroyed","#container","#mode","#abortController","#headerAbortController","#header","#headerRoot","#footAbortController","#footer","#footerRoot","#signal","#sides","root","#state","#abortController","#pageUI","#container","#destroyDelayed","routerParser.stringify","routerParser.parse","exec","Search.exec","Search.parse","Search.fill","request","pathRoots"],"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/index.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/form/toSchema.mjs","../../packages/web/form/createStoreField.mjs","../../packages/web/form/renderGridForm.mjs","../../packages/web/form/renderForm.mjs","../../packages/web/form/createStore.mjs","../../packages/web/form/createShowField.mjs","../../packages/web/constants.mjs","../../packages/web/form/createQuickFilters.mjs","../../packages/web/form/createFilter.mjs","../../packages/web/form/createFieldFilter.mjs","../../packages/web/form/createFilters.mjs","../../packages/web/form/showFilterDialog.mjs","../../packages/web/utils/toUrl.mjs","../../packages/web/utils/isPluginId.mjs","../../packages/web/utils/waitAbortSignal.mjs","../../packages/web/script/index.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/form/List.mjs","../../packages/web/components.mjs","../../packages/web/Menu.mjs","../../packages/web/services/page.mjs","../../packages/web/route/pages.mjs","../../packages/web/route/load.mjs","../../packages/web/dom.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/GeneralContext.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/showPage.mjs","../../packages/web/route/setHistoryUrl.mjs","../../packages/web/route/parse.mjs","../../packages/web/route/setUrl.mjs","../../packages/web/route/index.mjs","../../packages/web/enumerations.mjs","../../packages/web/loadOptions.mjs","../../packages/web/model.mjs","../../packages/web/Command.mjs","../../packages/web/icons/index.mjs","../../packages/web/file.mjs","../../packages/web/buildPlugin.mjs","../../packages/web/start.mjs","../../packages/web/permission.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 {() => 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\tlet run = false;\n\t/** @type {any} */\n\tlet value;\n\teffect(() => {\n\t\tconst val = getters.map(v => v());\n\t\tif (run ? Object.is(val, value) : !immediate) { return; }\n\t\tconst r = run;\n\t\trun = true;\n\t\tconst oldValue = value;\n\t\tvalue = val;\n\t\tif (r) {\n\t\t\tcallback(isArray ? [...val] : val[0], isArray ? [...oldValue] : oldValue[0]);\n\t\t} else {\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/**\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 {string[]} fields\n * @property {string} operator\n * @property {string?} [sign]\n * @property {any} value\n * @property {any[]} values\n */\n/**\n * \n * @param {Record<string, any>[]} data \n * @param {string[]} 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.map(v => typeof v === 'string' ? v : v[0])];\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], 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 {string[]} 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].map(v => typeof v === 'string' ? v : v[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 {string[]} 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 | (() => Value), T[]?, Value | (() => string | null) | 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 | (() => Value), T?, Value | (() => string | null) | 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 | (() => Value), T[]?, Value | (() => string | null) | 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) => string | (() => string | null) | null} getPlaceholder \n * @returns {T[]}\n */\nexport function fill(match, getPlaceholder) {\n\tif (!match) { return []; }\n\t/**\n\t * \n\t * @template {Value | (() => Value)} T \n\t * @param {T} match \n\t * @returns {Value | (() => string | null) | 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 {[field: string, desc?: boolean][]} */\n\tconst sorts = [];\n\tlet limit = 0;\n\tlet offset = 0;\n\tlet page = 0;\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 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 === '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}\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 (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 (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 || 10;\n\tconst page = b.page ?? a.page;\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;\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 (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\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 | 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 !== '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\t\treturn `${encodeValue(field)}${sub.map(() => `[k]`).join('')}`;\n\t\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,\n\tlimit, offset, page,\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 (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\tif (select) {\n\t\tconst val = select.filter(Boolean).map(encodeValue).join(',');\n\t\tif (val) {\n\t\t\tqueries.push(`.select=${val}`);\n\t\t}\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","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 './WhereLike.mjs';\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 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 * \n * @param {string?} [pattern] \n * @param {Record<string, any>?} [document] \n * @returns \n */\nexport function runPattern(pattern, document) {\n\tif (!pattern || typeof pattern !== 'string') { return ''; }\n\tconst doc = typeof document === 'object' && document || {};\n\treturn pattern.replace(regex, (_, v) => {\n\t\tif (Object.hasOwn(doc, v)) { return doc[v] ?? ''; }\n\t\treturn `{${v}}`;\n\t});\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 { 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} [route] 路由管理器\n * @property {string} [theme] 界面主题\n * @property {string} [authenticator] 登陆器\n * @property {boolean} [authRequired] 是否强制登陆\n * @property {string} [skin]\n * @property {boolean} [single] \n * @property {string} [application] \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 */\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 } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { allHooks } from '../allHooks.mjs';\nimport { createComputed } from '../signal.mjs';\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; }\n\treturn `${type}:${rendererName}${arrayKey}`;\n}\n\n\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 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\titem.component = filter;\n\t\t\t}\n\t\t}\n\t\tfor (const [operator, fieldFilter] of Object.entries(filters || {})) {\n\t\t\tconst filter = Array.isArray(fieldFilter) ? fieldFilter[0] : fieldFilter;\n\t\t\tif (typeof filter !== 'function') { continue; }\n\t\t\tconst label = Array.isArray(fieldFilter) ? fieldFilter[1] : '';\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\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","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}\nconst request = 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});\n\nexport default request;\n","import request from './request.mjs';\n/** @import { Plugin, BootConfiguration } from '@yongdall/common' */\n\n/** @type {BootConfiguration} */\n// @ts-ignore\nconst configuration = await request.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\nexport const application = configuration.application;\nexport const single = configuration.single;\nexport const pages = configuration.pages || {};\nexport const userMenus = configuration.userMenus || [];\nexport const webRoot = new URL(configuration.path || '/workbench/', location.origin);\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 { State } from './signal.mjs' */\nimport configuration, { single } from './configuration.mjs';\nimport { createStates } from './utils/state.mjs';\nimport request from './request.mjs';\nimport { allHooks } from './allHooks.mjs';\nimport { createComputed, createState } from './signal.mjs';\n\nconst { authRequired } = configuration;\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 needLogin = createState(false);\nconst waitLogin = createComputed(() => {\n\tif (single) { return false; }\n\tif (needLogin.get()) { return true; }\n\tif (!authRequired) { 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\tif (!user) { return null; }\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\tif (!user) { return null; }\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 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.fromEntries(list.map(([k, v]) => [k, toPermissions(v)]));\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.fromEntries(Object.entries(roles).map(([k, v]) => {\n\t\tconst permissions = v.flatMap(roleId => Object.hasOwn(rolePermissions, roleId) && rolePermissions[roleId] || []);\n\t\treturn [k, toPermissions(permissions)];\n\t}));\n}\n/** @type {State<Set<string>?>} */\nconst permissions = createComputed(() => {\n\treturn getPermissions(currentUserState.get()) || (single ? null : new Set());\n});\n/** @type {State<Record<string, Set<string>>?>} */\nconst organizationPermissions = createComputed(() => {\n\treturn getOrganizationPermissions(currentUserState.get()) || (single ? null : {});\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\nexport const User = {\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\tget permissions() { return permissions.get(); },\n\tget organizationPermissions() { return organizationPermissions.get(); },\n\tget allOrganizationPermissions() { return allOrganizationPermissions.get(); },\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 request.clone().get`user`.json().then(v => v || {}, () => ({}));\n\t\ttargetUserState.set(target || null);\n\t\tif (single) { return true; }\n\t\tsessionUserState.set(session || null);\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\trequest.clone().delete`user`.done();\n\t},\n\tlogin(login = true) {\n\t\tneedLogin.set(Boolean(login));\n\t},\n};\n","/** @import { Schema, Store } from '@neeloong/form' */\n/** @import { Permission } from '@yongdall/types' */\n/** @import { FieldComponents } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration } from '../services/model.mjs' */\n\nimport { getField } from './field.mjs';\nimport { User } from '../user.mjs';\nimport { single } from '../configuration.mjs';\n\n/**\n * \n * @param {Permission['constraints']} constraints \n * @param {{value: *}} root \n */\nfunction testPermissionConstraints(constraints, root) {\n\tif (!constraints) { 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 = root.value?.[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 (!single && val !== User.current?.id) { return false; }\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * \n * @param {Permission} permission \n * @param {{value: *}} root \n * @param {string} fieldName \n * @param {boolean} isNew \n */\nfunction testPermission({ permission, organizationField, constraints }, root, fieldName, isNew) {\n\tif (!testPermissionConstraints(constraints, root)) { return false; }\n\tif (!permission) { return true; }\n\tif (!organizationField) {\n\t\tconst permissions = User.permissions;\n\t\tif (!permissions || permissions.has(permission)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tif (organizationField === '_') {\n\t\tif (isNew) {\n\t\t\tconst allOrganizationPermissions = User.allOrganizationPermissions;\n\t\t\tif (!allOrganizationPermissions || allOrganizationPermissions.has(permission)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tif (isNew) { return true; }\n\tif (organizationField !== fieldName) {\n\t\tconst val = String(root.value?.[organizationField] || '');\n\t\tif ((!isNew || val)) {\n\t\t\tconst organizationPermissions = User.organizationPermissions;\n\t\t\tif (!organizationPermissions) { return true; }\n\t\t\tconst permissions = Object.hasOwn(organizationPermissions, val) ? organizationPermissions[val] : null;\n\t\t\tif (permissions && permissions.has(permission)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * \n * @param {Permission[]} permissions \n * @param {string} authorization \n * @param {{value: *}} root \n * @param {string} fieldName \n * @param {boolean} isNew \n */\nfunction testPermissions(permissions, authorization, root, fieldName, isNew) {\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, root, fieldName, isNew)));\n\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 currentUser = User.current;\n\t\tif (!currentUser) { return false; }\n\t\tconst root = s.root;\n\t\tconst isNew = root.new;\n\t\tconst permission = isNew ? 'create' : 'update';\n\t\treturn !testPermissions(permissions, permission, root, fieldName, isNew);\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 currentUser = User.current;\n\t\t\tif (!currentUser) { return false; }\n\t\t\tconst root = s.root;\n\t\t\tconst isNew = root.new;\n\t\t\treturn !testPermissions(permissions, 'read', root, fieldName, isNew);\n\t\t} : () => !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\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};\n\t\t\tcontinue;\n\n\t\t}\n\t\tschema[name] = {\n\t\t\t...createAttr(field, name, permissions),\n\t\t\ttype: toSchema(type, typeof component !== 'function' && component || {}, permissions),\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 { FieldComponent, FieldStyle, FieldComponentEvent } from '../typesDefine.mjs' */\n/** @import { Store, StoreLayout } from '@neeloong/form' */\nimport { ArrayStore, ObjectStore } from '@neeloong/form';\nimport { createState } from '../signal.mjs';\nimport { getField } from './field.mjs';\n\n/**\n *\n * @param {Store} store\n * @returns {FieldComponent?}\n */\nfunction getFieldComponent(store) {\n\tlet storeComponent = store.component;\n\tif (typeof storeComponent === 'function') { return storeComponent; }\n\tif (store instanceof ObjectStore || store instanceof ArrayStore && typeof store.type === 'object') {\n\t\treturn getField(store.meta, true);\n\t}\n\treturn getField(store.meta, true) || getField({\n\t\ttype: store.type,\n\t\tarray: store instanceof ArrayStore,\n\t\trenderer: store.component,\n\t});\n\n}\n/**\n *\n * @param {Store} store\n * @param {FieldStyle} style \n * @param {StoreLayout.Options?} [options]\n * @returns {[HTMLElement, () => void]?}\n */\nexport default function createStoreField(store, style, options) {\n\tconst component = getFieldComponent(store);\n\tif (!component) { return null; }\n\tconst { relate } = options || {};\n\tconst field = store.meta;\n\tlet destroyedState = createState(false);\n\tlet destroyed = false;\n\t/** @type {Map<string, Set<any>>} */\n\tconst events = new Map();\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\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\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 field.nullable; },\n\t\tget disabled() { return store.disabled; },\n\t\tget clearable() { return store.clearable; },\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\treturn [root, () => {\n\t\tdestroyed = true;\n\t\tdestroyedState.set(true);\n\t\tfor (const stop of stopEffects) { stop(); }\n\t\trelated?.();\n\t}];\n}\n","/** @import { Store, StoreLayout } from '@neeloong/form' */\n/** @import { RendererFieldStyle } from '../typesDefine.mjs' */\n/** @import { FieldScriptConfiguration, ModelConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\nimport { renderStore } from '@neeloong/form';\nimport createStoreField from './createStoreField.mjs';\n/**\n * \n * @param {ModelConfiguration} model\n * @param {Store} store \n * @param {HTMLElement} root \n * @param {RendererFieldStyle} style \n * @param {StoreLayout?} [options] \n */\nexport default function (model, store, root, style, options) {\n\treturn renderStore(\n\t\tstore,\n\t\t(store, options) => createStoreField(store, style, options),\n\t\troot,\n\t\ttypeof options === 'object' && options && (options.fields?.length || options.html) ? options : createGridLayout(model),\n\t\t{ editable: style.editable || false },\n\t);\n}\n/**\n * \n * @param {string} field \n * @param {FieldScriptConfiguration} define \n * @returns {StoreLayout.Item}\n */\nfunction createGridItemLayout(field, define) {\n\tconst { type } = define;\n\tconst layout = define.layout || {};\n\tif (!type || typeof type !== 'object') {\n\t\treturn {\n\t\t\tfield,\n\t\t\tcolStart: layout.colStart,\n\t\t\tcolSpan: layout.colSpan,\n\t\t\tcolEnd: layout.colEnd,\n\t\t\trowStart: layout.rowStart,\n\t\t\trowSpan: layout.rowSpan,\n\t\t\trowEnd: layout.rowEnd,\n\t\t};\n\t}\n\tconst fields = Object.entries(type).filter(\n\t\t/** @type {(v: [string, any]) => v is [string, FieldScriptConfiguration]} */(([, v]) => Boolean(v))\n\t);\n\tconst levelKey = layout.levelKey || '';\n\t/** @type {StoreLayout.Column[]} */\n\tconst columns = [];\n\tif (levelKey) {\n\t\tif (Array.isArray(layout.columns)) {\n\t\t\tfor (const { action, actions, field, placeholder, width } of layout.columns) {\n\t\t\t\tif (field || width || placeholder) {\n\t\t\t\t\tif (field || width) {\n\t\t\t\t\t\tcolumns.push({ field, width });\n\t\t\t\t\t}\n\t\t\t\t\tif (placeholder && !width) {\n\t\t\t\t\t\tcolumns.push({ placeholder });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!columns.length) {\n\t\t\tcolumns.push({ actions: ['collapse', 'move'] });\n\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t.map(([field, define]) => field);\n\t\t\tfor (const c of list) {\n\t\t\t\tcolumns.push({ field: c });\n\t\t\t}\n\t\t\tcolumns.push({ placeholder: 1 });\n\t\t\tcolumns.push({ actions: ['add', 'remove'] });\n\n\t\t}\n\n\t} else {\n\t\tif (Array.isArray(layout.columns)) {\n\t\t\tfor (const { action, actions, field } of layout.columns) {\n\t\t\t\tif (field) {\n\t\t\t\t\tcolumns.push({ field });\n\t\t\t\t} else {\n\t\t\t\t\tconst allActions = [action, actions].flat().filter(Boolean);\n\t\t\t\t\tif (allActions) {\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tcolumns.push({ actions: allActions });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tif (!columns.length) {\n\t\t\tcolumns.push({ actions: ['add', 'trigger', 'move', 'remove', 'serial'] });\n\t\t\tconst list = fields.filter(([, v]) => v.layout?.head)\n\t\t\t\t.sort(([, a], [, b]) => (a.layout?.head || 0) - (b.layout?.head || 0))\n\t\t\t\t.map(([field, define]) => field);\n\t\t\tfor (const c of list) {\n\t\t\t\tcolumns.push({ field: c });\n\t\t\t}\n\t\t}\n\n\t}\n\treturn {\n\t\tfield,\n\t\tfields: fields\n\t\t\t.sort(([, a], [, b]) => (a.layoutOrder || 0) - (b.layoutOrder || 0))\n\t\t\t.map(([field, define]) => createGridItemLayout(field, define)),\n\t\tcolumns,\n\t\tarrayStyle: levelKey ? 'tree' : 'table',\n\t\tlevelKey,\n\t\tcolStart: layout.colStart,\n\t\tcolSpan: layout.colSpan,\n\t\tcolEnd: layout.colEnd,\n\t\trowStart: layout.rowStart,\n\t\trowSpan: layout.rowSpan,\n\t\trowEnd: layout.rowEnd,\n\t};\n\n\n}\n/**\n * \n * @param {ModelScriptConfiguration} model \n * @returns {StoreLayout}\n */\nexport function createGridLayout(model) {\n\treturn {\n\t\tfields: Object.entries(model.fields)\n\t\t\t.sort(([, a], [, b]) => (a.layoutOrder || 0) - (b.layoutOrder || 0))\n\t\t\t.map(([field, define]) => createGridItemLayout(field, define)),\n\t};\n\n}\n","/** @import { Store } from '@neeloong/form' */\n/** @import { RendererFieldStyle, FromRenderer } from '../typesDefine.mjs' */\n/** @import { ModelConfiguration } from '../services/model.mjs' */\nimport { allHooks } from '../allHooks.mjs';\nimport renderGridForm from './renderGridForm.mjs';\nimport { createComputed } from '../signal.mjs';\n\nconst rendererState = createComputed(() => allHooks.get('formRenderers').named());\n\n\n/**\n * \n * @param {string?} [type] \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 {ModelConfiguration} model\n * @param {Store} store \n * @param {HTMLElement} root \n * @param {RendererFieldStyle} style \n * @param {FromRenderer.Options?} [options]\n * @param {string?} [type] \n */\nexport default function (model, store, root, style, options, type) {\n\tconst render = getRender(type) || renderGridForm;\n\treturn render(model, store, root, style, options);\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 { 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\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 parent; },\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\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","export const neverAbortedSignal = new AbortController().signal;\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';\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 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\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';\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\n\tsignal.addEventListener('abort', () => {\n\t\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\tsignal,\n\t\tget destroyed() { return destroyed.get(); },\n\t});}\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","/** @import { Search } from '@yongdall/common' */\n/** @import { FieldScriptConfiguration, ModelScriptConfiguration } from '../services/model.mjs' */\n/** @import { FieldFilterStyle } from '../typesDefine.mjs' */\n\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 = document.createElement('dialog');\n\tdialog.classList.add(`FieldFilter-dialog`);\n\tconst list = dialog.appendChild(document.createElement('div'));\n\tlist.classList.add(`FieldFilter-filters`);\n\tconst form = dialog.appendChild(document.createElement('form'));\n\tform.classList.add(`FieldFilter-form`);\n\tconst addItem = form.appendChild(document.createElement('select'));\n\taddItem.classList.add(`FieldFilter-add`);\n\tconst okButton = form.appendChild(document.createElement('button'));\n\taddItem.classList.add(`FieldFilter-ok`);\n\tconst cancelButton = form.appendChild(document.createElement('button'));\n\taddItem.classList.add(`FieldFilter-cancel`);\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\tdialog.remove();\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\t(root || document.body).appendChild(dialog);\n\tdialog.showModal();\n\n\treturn promise;\n\n}\n","import { webRoot } 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 = webRoot.pathname;\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 * @param {AbortSignal?} [signal] \n */\nexport default function waitAbortSignal(signal) {\n\t/** @type {PromiseWithResolvers<void>} */\n\tconst { promise, resolve } = Promise.withResolvers();\n\tif (!(signal instanceof AbortSignal)) { return promise; }\n\tif (signal.aborted) {\n\t\tresolve();\n\t} else {\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tresolve();\n\t\t}, { once: true });\n\t}\n\treturn promise;\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 { 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) || path;\n}\n\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\treturn new Promise((resolve, reject) => {\n\t\tlink.addEventListener('load', () => resolve(link));\n\t\tlink.addEventListener('error', (e) => reject(e.error));\n\t\tconst s = !(pluginOnly && plugin) && findPluginIdRegex.exec(url)?.groups;\n\t\tif (s) {\n\t\t\tconst { pluginId, path } = s;\n\t\t\tconst pluginDefine = Object.hasOwn(plugins, pluginId) && plugins[pluginId] || {};\n\t\t\tconst VERSION = pluginDefine.version || 'VERSION';\n\t\t\tconst root = `/assets/plugins/${pluginId}/${VERSION}/`;\n\t\t\tconst base = location.origin + root;\n\t\t\tconst u = pluginDefine.assets?.[path] || importMap(path, root);\n\t\t\tif (u) {\n\t\t\t\tlink.href = new URL(u, base).href;\n\t\t\t\tlink.rel = \"stylesheet\";\n\t\t\t\tdocument.head.appendChild(link);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t}\n\n\t\tconst pluginDefine = plugin && plugins[plugin] || {};\n\t\tconst VERSION = pluginDefine.version || 'VERSION';\n\t\tconst root = plugin ? `/assets/plugins/${plugin}/${VERSION}/` : '';\n\t\t// TODO: 路径处理\n\t\tconst base = plugin ? location.origin + root : location.href;\n\t\tif (plugin && url[0] !== '.' && url[0] !== '/') {\n\t\t\t// TODO: 路径转换\n\t\t}\n\t\tconst u = pluginDefine.assets?.[url] || root && importMap(url, root) || url;\n\t\tlink.href = new URL(u, base).href;\n\t\tlink.rel = \"stylesheet\";\n\t\tdocument.head.appendChild(link);\n\t});\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 from '../request.mjs';\nimport { ResponseError } from '../ResponseError.mjs';\nimport createPromisesAndStates from './createPromisesAndStates.mjs';\nimport toPromiseInterface from './toPromiseInterface.mjs';\n/** @import { AsyncValidator, Schema, Store, Validator } 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 * // 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 * \n * @property {((store: Store) => string)?} [step]\n * @property {((store: Store) => string)?} [max]\n * @property {((store: Store) => string)?} [min]\n * @property {Validator | Validator[] | null} [validator]\n * @property {{[k in keyof Schema.Events]?: AsyncValidator | AsyncValidator[] | null}} [validators]\n * @property {((store: Store) => string)?} [min]\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 {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};\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}, []);\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 } = {}) {\n\t\t\treturn documentsReq.clone().body({ values, where, orWhere, sort, limit, page, offset, select }).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 {object} options\n\t\t * @param {any[]} [options.matches]\n\t\t * @param {string} [options.query]\n\t\t * @param {number} [options.page]\n\t\t * @param {number} [options.limit]\n\t\t * @param {number} [options.offset]\n\t\t * @param {string[]} [options.select]\n\t\t * @returns {Promise<Record<string, any>[]>}\n\t\t */\n\t\t/**\n\t\t * @param {Record<string, any> | boolean} [options]\n\t\t * @returns {Promise<Record<string, any>[]>}\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 { matches, limit = 20, page, offset, select } = options;\n\t\t\t// TODO:\n\t\t\treturn optionsReq.clone().body({\n\t\t\t\tmatches, limit, page, offset, select\n\t\t\t}).json().then(v => v.options);\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().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().json();\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.json().then(\n\t\tv => typeof v === 'object' && v || Promise.reject(new ResponseError(100)),\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 => setScript(v));\n}, null, models);\nconst modelPages = createPromisesAndStates((\n\t/** @type {DotRequest} */req\n) => {\n\t/** @type {Promise<PageConfiguration>} */\n\tconst result = req.json().then(\n\t\tv => typeof v === 'object' && v || Promise.reject(new ResponseError(100)),\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\n\treturn result;\n}, null);\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\t/**\n\t * \n\t * @param {string} page \n\t * @param {string?} [workspace] \n\t */\n\tfunction page(page, workspace) {\n\t\tconst pageReq =\n\t\t\tworkspace\n\t\t\t\t? modelReq.clone().append(`/workspaces/${workspace}/pages/${page}`)\n\t\t\t\t: modelReq.clone().append(`/pages/${page}`);\n\t\tconst { load } = modelPages.create([model, workspace || '', page], pageReq);\n\t\treturn {\n\t\t\tload,\n\t\t\t/**\n\t\t\t * @template [TResult1=PageConfiguration]\n\t\t\t * @template [TResult2=never]\n\t\t\t * @param {((value: PageConfiguration) => TResult1 | PromiseLike<TResult1>)?} [onfulfilled]\n\t\t\t * @param {((reason: any) => TResult2 | PromiseLike<TResult2>)?} [onrejected]\n\t\t\t * @returns {Promise<TResult1 | TResult2>};\n\t\t\t */\n\t\t\tthen(onfulfilled, onrejected) { return load().then(onfulfilled, onrejected); },\n\t\t\tconfiguration() {\n\t\t\t\treturn load().then((v) => typeof v === 'object' && v?.config);\n\t\t\t}\n\t\t};\n\n\t}\n\treturn {\n\t\tloadModel,\n\t\tloadScript,\n\t\tgetModel,\n\t\tgetScript,\n\t\tpage,\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() => []\n\t);\n\treturn result;\n}, []);\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' */\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<{layout: any; type?: string;}>} */\n\tconst result = req.json().then(\n\t\tv => typeof v === 'object' && v || Promise.reject(new ResponseError(100)),\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 { 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) => 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\t */\n\tcreateItem(menu, signal) {\n\t\treturn createMenuItem(menu, signal || neverAbortedSignal);\n\t},\n};\n","/** @import DotRequest from 'dot-request' */\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';\n\n\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 * \n * @property {string} widget\n * \n * @property {string} title\n * @property {string} titlePattern\n * @property {Record<string, any>} config\n * @property {{field?: string; label?: string; width?: number; pattern?: string}[]} fields\n * @property {{widget: string; options: string}[]} sides\n * @property {Menu.Button[]} menuButtons\n * @property {(Menu | null)[]} menus\n * @property {Record<string, {layoutId?: string}?>} 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.json().then(\n\t\tv => typeof v === 'object' && v || Promise.reject(new ResponseError(100)),\n\t\te => Promise.reject(new ResponseError(e instanceof Response ? e.status : 100)),\n\t);\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\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<number | { widget: PageRendererLoader; 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 404;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn 404;\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\tconst pageInfo = await pageService({ ...ident, page })\n\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\tif (pageInfo === 404 && !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 info; }\n\t\tconst widget = modelPages[page] || (() => null);\n\t\treturn { widget, ident, page: null };\n\t}\n\tif (!pageInfo || typeof pageInfo !== 'object') { return pageInfo; }\n\n\tconst widget = pageInfo.widget;\n\tif (!widget) { return 404; }\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.Workspace} workspaceIdent \n * @returns {Promise<number | { widget: PageRendererLoader; 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 404;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn 404;\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\t\t.catch(e => e instanceof ResponseError ? e.status : Promise.reject(e));\n\n\tif (!pageInfo || typeof pageInfo !== 'object') { return pageInfo; }\n\n\tconst widget = pageInfo.widget;\n\tif (!widget) { return 404; }\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<number | { widget: PageRendererLoader; 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 404;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn 404;\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 (!pageInfo || typeof pageInfo !== 'object') { return pageInfo; }\n\n\tconst widget = pageInfo.widget;\n\tif (!widget) { return 404; }\n\treturn {\n\t\tident,\n\t\twidget: () => importWidget(widget),\n\t\tpage: typeof pageInfo === 'object' && pageInfo || null\n\t};\n}\n/**\n * \n * @param {PageIdent.User} userIdent \n * @returns {Promise<number | { widget: PageRendererLoader; 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 404;\n\t}\n\tif (setting) {\n\t\t// TODO:\n\t\treturn 404;\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 (!pageInfo || typeof pageInfo !== 'object') { return pageInfo; }\n\n\tconst widget = pageInfo.widget;\n\tif (!widget) { return 404; }\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<number | { widget: PageRendererLoader; 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 404; }\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 404;\n}\n","export const root = document.createElement('div');\n\nconst 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","/** @import { PageInfo } from './home.mjs' */\n/** @import { PageHandle } from './PageHandle.mjs' */\nimport { webRoot } from '../configuration.mjs';\nimport { User } from '../user.mjs';\nimport setUrl from './setUrl.mjs';\nimport { 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 = [];\nlet currentState = createState(/** @type {PageHandle | undefined} */(undefined));\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);\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(undefined);\n\tif (User.waitLogin) { return; }\n\tconst newPage = list[0];\n\tsetUrl(newPage?.href || webRoot.pathname, false, true);\n}\nexport function closeAll() {\n\tfor (const page of [...pages.values()]) {\n\t\tpage.destroy();\n\t}\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.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport { webRoot } 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(webRoot.pathname, 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.replaceAll(/[~~]+/g, '~')\n\t.replaceAll(/[!!]+/g, '!')\n\t.replaceAll(/[@@]+/g, '@')\n\t.replaceAll(/[&&]+/g, '&')\n\t.replaceAll(/[**]/g, '*')\n\t.replaceAll(/[::]+/g, ':')\n\t.replaceAll(/[((]+/g, '(')\n\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\tif (input === '*') {\n\t\t\tident += `*`;\n\t\t} else {\n\t\t\tident += `*${input}`;\n\t\t}\n\t\treturn ident;\n\t}\n\treturn ident;\n}\n","\nimport * as Ident from '../Ident.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} */\nexport let stringify = Ident.stringify;\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\tstringify = options.stringify;\n}\n","import { createState } from './signal.mjs';\nimport { neverAbortedSignal } from './constants.mjs';\n\n\nexport default class GeneralContext {\n\t#destroyed = createState(false);\n\n\t/**\n\t * \n\t * @param {AbortSignal} [signal] \n\t */\n\tconstructor(signal) {\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\tget destroyed() { return this.#destroyed.get(); }\n\t/** @type {AbortSignal} */\n\t#signal;\n\tget signal() { return this.#signal; }\n}\n","/** @import { PageConfiguration } from '../services/page.mjs' */\n/** @import { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.mjs' */\nimport { webRoot } 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, createState } from '../signal.mjs';\n\n\n\n/**\n * @typedef {object} RootPageExt\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#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.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 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(webRoot.pathname, page, url);\n\t\t\t} else if (typeof page === 'object') {\n\t\t\t\treturn toUrl(webRoot.pathname, 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 GeneralContext from '../GeneralContext.mjs';\n\n\n\nexport class PageFooter extends GeneralContext {\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\tconst container = root.appendChild(this.#container);\n\t\troot.className = 'Page-footer';\n\t\tcontainer.className = 'Page-footer-main';\n\t}\n}\n","import GeneralContext from '../GeneralContext.mjs';\nimport { Menu } from '../Menu.mjs';\n\n\n\nexport class PageHeader extends GeneralContext {\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\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}\n","import GeneralContext from '../GeneralContext.mjs';\nimport { createState } from '../signal.mjs';\n\nexport class PageSection extends GeneralContext {\n\t#root = document.createElement('div');\n\t#container = this.#root.appendChild(document.createElement('div'));\n\tget container() { return this.#container; }\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 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#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\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}\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\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}, { once: true });\n\t}\n}\n","import { root as rootContainer } from '../dom.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#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) { return null; }\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\treturn null;\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) { return null; }\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\treturn null;\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) { return null; }\n\t\tif (signal?.aborted) { return null; }\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) { return null; }\n\t\tif (signal?.aborted) { return null; }\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 { Page } from './Page.mjs';\n\n/**\n * @param {boolean} show\n */\nexport let createPage = (show) => new Page(show);\n\n/**\n * @param {(show: boolean) => Page} [renderer]\n */\nexport function switchCreatePage(renderer) {\n\tif (typeof renderer !== 'function') { return false; }\n\tcreatePage = renderer;\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\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 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 * \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 {PageConfiguration['sides']} 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 { PageInfo } from './home.mjs' */\n/** @import { PageIdent } from './route.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';\n\n/**\n * @typedef {object} RootPageExt\n * @property {(path: string,search: string, hash: string) => void} update\n */\n/** @type {Map<string, PageInfo & RootPageExt>} */\nconst pages = new Map();\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\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);\n\tif (pageHandler !== currentPage.get()) {\n\t\t// 请求完数据前已经切换了,那就移除\n\t\tpages.delete(pageId);\n\t\treturn;\n\t}\n\tif (typeof data === 'number' || typeof data === 'string') {\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(data);\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\n\n\tconst renderer = await data.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\tif (replace) {\n\t\thistory.replaceState({}, '', url);\n\t} else {\n\t\thistory.pushState({}, '', url);\n\t}\n}\n","import { webRoot } from '../configuration.mjs';\nimport { toUrl } from '../utils/index.mjs';\nimport showPage from './showPage.mjs';\nimport { showHome } from './home.mjs';\nimport { openUrl } from './setUrl.mjs';\nimport setHistoryUrl from './setHistoryUrl.mjs';\nimport * as routerParser from './route.mjs';\n\n/**\n * \n * @param {string} path \n * @param {boolean} [replace] \n * @returns \n */\nfunction setRoot(path, replace) {\n\tsetHistoryUrl(toUrl(webRoot.pathname, path), replace);\n\tparse();\n}\nexport default function parse() {\n\tconst root = webRoot.pathname;\n\tconst { pathname, search, hash } = location;\n\tlet subPath = pathname.replace(/(^|[\\\\\\/])[\\\\\\/]*/, '/');\n\tif (!subPath || subPath === '/' || subPath === root || subPath + '/' === root) {\n\t\tif (root !== pathname) {\n\t\t\thistory.replaceState({}, '', `${root}${search}${hash}`);\n\t\t}\n\t\tshowHome(search, hash);\n\t\treturn;\n\t}\n\tsubPath = subPath.slice(subPath.startsWith(`${root}`) ? root.length : 1);\n\tconst { path, redirect, page, pageRoot } = routerParser.parse(subPath);\n\t\n\tif (`${root}${subPath}` !== pathname || redirect) {\n\t\thistory.replaceState({}, '', `${root}${pageRoot}${path}${search}${hash}`);\n\t}\n\tshowPage(openUrl, page, root, pageRoot, path, search, hash, setRoot);\n}\n","import { webRoot } from '../configuration.mjs';\nimport parse from './parse.mjs';\nimport setHistoryUrl from './setHistoryUrl.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 * @returns \n */\nexport default function setUrl(url, replace, skipGuard) {\n\tconst u = new URL(url, location.href);\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(webRoot.pathname)) { return false; }\n\tconst href = u.href;\n\tif (href !== location.href) {\n\t\tsetHistoryUrl(href, replace);\n\t}\n\tparse();\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';\n\n/**\n * @callback PageRenderer\n * @param {PageContext} ctx\n * @returns {MaybePromise<void>}\n */\n\n/**\n * \n * @param {Event} e \n * @returns \n */\nfunction clickEventListener(e) {\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 false; }\n\t\tif (setUrl(url, Boolean(a.getAttribute('replace')))) {\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 { setRouter } from './route.mjs';\n\nexport { addManager, getPages } 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';\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 { runPattern, Search } from '@yongdall/common';\nimport { createComputed, createState } from './signal.mjs';\n\n/**\n * \n * @param {*} values \n * @returns \n */\nfunction loadArray(values) {\n\tif (!Array.isArray(values)) {\n\t\treturn createComputed(() => []);\n\t}\n\treturn createComputed(() => values);\n}\n\nconst loadValues = createStates((/** @type {string} */type, /** @type {string} */name) => {\n\tif (!name) { return createComputed(() => []); }\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(() => []);\n}, (type, name) => name ? [type, name].join('\\n') : '');\n\n/**\n * @typedef {object} 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 {Option[]} children\n */\n/**\n * \n * @param {{get(): Record<string, any>[]}} list \n * @param {object} options\n * @param {string?} [options.id] \n * @param {string?} [options.label] \n * @param {string?} [options.value] \n * @param {string?} [options.parent] \n * @param {string?} [options.children] \n * @param {string?} [options.sequence] \n * @param {string?} [options.disabled] \n */\nfunction build(list, {\n\n\tid,\n\tlabel,\n\tvalue,\n\tparent,\n\tchildren,\n\tsequence,\n\tdisabled,\n} = {}) {\n\tconst idKey = id || 'id';\n\tconst valueKey = value || 'value';\n\tconst labelKey = label || 'label';\n\tconst idPattern = idKey.includes('{') ? idKey : `{${idKey}}`;\n\tconst valuePattern = valueKey.includes('{') ? valueKey : `{${valueKey}}`;\n\tconst labelPattern = labelKey.includes('{') ? labelKey : `{${labelKey}}`;\n\tconst disabledKey = disabled;\n\tif (parent) {\n\t\tconst parentPattern = parent.includes('{') ? parent : `{${parent}}`;\n\t\treturn createComputed(() => {\n\t\t\t/** @type {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 {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\n\n\n/**\n * \n * @param {Search.ExecParam} value \n * @returns \n */\nfunction run({ operator, sign, value, values }) {\n\tif (!operator) {\n\t\tfor (const v of values) {\n\t\t\tif (v == value) { return !sign; }\n\t\t}\n\t\treturn Boolean(sign);\n\t}\n\treturn null;\n}\n\n/**\n * \n * @param {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 */\nfunction filterList(list, exec, where, orWhere) {\n\t/** @type {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/**\n * \n * @param {object} options\n * @param {string?} [options.type] \n * @param {string?} [options.name] \n * @param {string?} [options.filter] \n * @param {*} [options.values] \n * @param {string?} [options.id] \n * @param {string?} [options.label] \n * @param {string?} [options.value] \n * @param {string?} [options.parent] \n * @param {string?} [options.children] \n * @param {string?} [options.sequence] \n * @param {string?} [options.disabled] \n * @param {*} [options.values] \n * @param {((placeholder: string) => string | (() => string) | null) | false} [getPlaceholder] \n * @param {(value: Search.ExecParam) => boolean?} [exec]\n * @returns \n */\nexport function loadOptions({type, name, values, ...options}, getPlaceholder, exec = run) {\n\tconst data = type ? loadValues(type, name || '') : loadArray(values)\n\tconst list = build(data, options);\n\tif (getPlaceholder === false) { return list; }\n\tconst filter = options.filter;\n\tif (!filter || typeof filter !== 'string') { return list; }\n\tconst search = Search.parse(filter);\n\tif (!search) { return list; }\n\tif (!search.where?.length && !search.orWhere?.length) { return list; }\n\t/** @typedef {[(Search.Match | Search.Children)[], (Search.Match | Search.Children | Search.Or)[]]} SearchState */\n\tconst searchState = typeof getPlaceholder === 'function'\n\t\t? createComputed(() => /** @type {SearchState} */([\n\t\t\tSearch.fill(search.where, getPlaceholder),\n\t\t\tSearch.fill(search.orWhere, getPlaceholder),\n\t\t])) : createState(/** @type {SearchState} */([search.where, search.orWhere]));\n\treturn createComputed(() => {\n\t\tconst [where, orWhere] = searchState.get();\n\t\treturn filterList(list.get(), exec, where, orWhere);\n\t});\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} model\n * @param {Record<string, any>} document\n * @returns\n */\nexport function toId(model, document) {\n\treturn getPrimaryFields(model).map(v => document[v]).join('$');\n}\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} 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\t\n\tconst iconState = createComputed(() => {\n\t\tconst icons = iconsState.get();\n\t\tconst icon = Object.hasOwn(icons, key) && icons[key];\n\t\treturn icon || null;\n\t});\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('click', () => { resolve(input.files?.[0] || null); });\n\t\tinput.addEventListener('error', (e) => { reject(e.error); });\n\t\tinput.click();\n\t});\n}\n\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 = `+file://${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 (/^\\+file:\\/\\//.test(uri)) {\n\t\tconst { pathname, hostname } = new URL(uri.slice(1));\n\t\tconst filePath = pathname.split('/').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 } from './route/index.mjs';\nimport { importStyle, importWidget } from './import.mjs';\nimport { root } from './dom.mjs';\nimport setComponents from './components.mjs';\nimport { plugins } from './configuration.mjs';\nimport { allHooks, updateHooks } from './allHooks.mjs';\nimport { User } from './user.mjs';\nimport { watch } from './signal.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 } = 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 (pageManager) {\n\t\tdestroyList.push(addManager(pageManager));\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\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?.(ac.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 { home, components, styleFiles, createPage, renderError } = theme;\n\t\tawait addStyles(styleFiles);\n\t\tswitchHome(home);\n\t\tsetComponents(components);\n\t\tswitchCreatePage(createPage);\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","/**\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 list = typeof permission === 'string' ? permission.split('\\n') : permission;\n\tif (!Array.isArray(list)) { return true; }\n\tconst array = list.filter(v => v && typeof v === 'string');\n\tif (!array.length) { return true; }\n\tfor (const p of array) {\n\t\tif (p[0] === '#') {\n\t\t\tif (authorizations?.has(p.slice(1))) { return true; }\n\t\t} else {\n\t\t\tif (permissions.has(p)) { return true; }\n\t\t}\n\t}\n\treturn false;\n}\n/** @import { Permission } from '@yongdall/types' */\n\nimport { User } from './user.mjs';\nimport { single } from './configuration.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 (!single && val !== User.current?.id) { return false; }\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * \n * @param {Permission} permission \n * @param {{has(permission: string): boolean}} permissions \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n */\nexport function testPermission({ permission, organizationField, constraints }, permissions, data, isNew) {\n\tif (!testPermissionConstraints(constraints, data)) { return false; }\n\tif (!permission) { return true; }\n\tif (!organizationField) {\n\t\tif (permissions.has(permission)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tif (organizationField === '_') {\n\t\tif (isNew) {\n\t\t\tconst allOrganizationPermissions = User.allOrganizationPermissions;\n\t\t\tif (!allOrganizationPermissions || allOrganizationPermissions.has(permission)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tif (isNew) { return true; }\n\t\tconst val = String(data?.[organizationField] || '');\n\t\tif ((!isNew || val)) {\n\t\t\tconst organizationPermissions = User.organizationPermissions;\n\t\t\tif (!organizationPermissions) { return true; }\n\t\t\tconst permissions = Object.hasOwn(organizationPermissions, val) ? organizationPermissions[val] : null;\n\t\t\tif (permissions && permissions.has(permission)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\treturn true;\n}\n\n/**\n * \n * @param {Permission[]} permissionList \n * @param {{has(permission: string): boolean}} permissions \n * @param {Record<string, any>?} [data] \n * @param {boolean} [isNew] \n */\nexport function getAuthorizations(permissionList, permissions, 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, permissions, data, isNew))\n\t.flatMap(({authorizations}) => authorizations ? [...authorizations] : [])\n\treturn new Set(list)\n}\n"],"mappings":"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"}
|