@yongdall/core 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.mts CHANGED
@@ -2,6 +2,8 @@ import { Field, Permission, Permissions, Realm } from "@yongdall/types";
2
2
  import { BootConfiguration, Search } from "@yongdall/common";
3
3
  import { ClassDecorator, FieldDefine, Hooks, ModelTable, Where } from "@yongdall/model";
4
4
 
5
+ //#region \0rolldown/runtime.js
6
+ //#endregion
5
7
  //#region packages/core/config.d.mts
6
8
  /**
7
9
  *
@@ -383,6 +385,17 @@ declare function getEnumerations(name: string): Promise<Record<string, any>[]>;
383
385
  * @returns {Promise<Where?>}
384
386
  */
385
387
  declare function search2where(fields: Record<string, FieldDefine>, and?: Search.AndList, or?: Search.OrList, or2?: Search.OrList): Promise<Where | null>;
388
+ declare namespace IdentityToken_d_exports {
389
+ export { create, parse };
390
+ }
391
+ declare function parse(token: string, ms?: number): Promise<[string, percent: number, ms: number] | null>;
392
+ declare function parse(token: string, device?: string, ms?: number): Promise<[string, percent: number, ms: number] | null>;
393
+ /**
394
+ *
395
+ * @param {string} user
396
+ * @returns {Promise<string>}
397
+ */
398
+ declare function create(user: string, device?: string): Promise<string>;
386
399
  //#endregion
387
400
  //#region packages/core/realm.d.mts
388
401
  /**
@@ -401,4 +414,4 @@ declare function useSalt(): Promise<string | Uint8Array<ArrayBuffer>>;
401
414
  */
402
415
  declare function initSystem(realm: Partial<Omit<Realm, "id">>, boot: object): void;
403
416
  //#endregion
404
- export { ServerError, UserState, VisitorState, bindModelHooks, bootConfiguration, createPermissionMatches, initSystem as default, existUser, existVisitor, filterPermissionDocument, filterPermissionUpdate, filterPermissions, findModel, findUser, findVisitor, getEnumerations, getMenus, getModel, getModelAuthorizationPermissions, getModelPermissions, getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, getVisitor, hasUserOrganizationPermissions, hasUserPermission, hashSHA256, initConfig, isSingleUser, loadPluginUser, loadUser, loadUserOrganizationAllPermissions, loadUserOrganizationPermissions, loadUserPermissions, loadVisitor, mainRealm, modelHook, nestedSetTree, search2where, setUser, setUserVerify, setVisitor, testPermissionConstraints, testPermissions, toDocumentFields, useRealm, useSalt, verifyUser };
417
+ export { IdentityToken_d_exports as IdentityToken, ServerError, UserState, VisitorState, bindModelHooks, bootConfiguration, createPermissionMatches, initSystem as default, existUser, existVisitor, filterPermissionDocument, filterPermissionUpdate, filterPermissions, findModel, findUser, findVisitor, getEnumerations, getMenus, getModel, getModelAuthorizationPermissions, getModelPermissions, getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, getVisitor, hasUserOrganizationPermissions, hasUserPermission, hashSHA256, initConfig, isSingleUser, loadPluginUser, loadUser, loadUserOrganizationAllPermissions, loadUserOrganizationPermissions, loadUserPermissions, loadVisitor, mainRealm, modelHook, nestedSetTree, search2where, setUser, setUserVerify, setVisitor, testPermissionConstraints, testPermissions, toDocumentFields, useRealm, useSalt, verifyUser };
package/index.mjs CHANGED
@@ -3,6 +3,23 @@ import { createKeyStore, createStoreSerializable } from "@yongdall/context";
3
3
  import { LazyPromise, Search, isFunction } from "@yongdall/common";
4
4
  import { loadPluginProfiles } from "@yongdall/plugins";
5
5
 
6
+ //#region \0rolldown/runtime.js
7
+ var __defProp = Object.defineProperty;
8
+ var __exportAll = (all, no_symbols) => {
9
+ let target = {};
10
+ for (var name in all) {
11
+ __defProp(target, name, {
12
+ get: all[name],
13
+ enumerable: true
14
+ });
15
+ }
16
+ if (!no_symbols) {
17
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
18
+ }
19
+ return target;
20
+ };
21
+
22
+ //#endregion
6
23
  //#region packages/core/polyfill.mjs
7
24
  if (!Symbol.metadata) Symbol.metadata = Symbol.for("Symbol.metadata");
8
25
 
@@ -1768,7 +1785,7 @@ const whereList = wheres.lazyThen((wheres) => toWhereList(wheres));
1768
1785
 
1769
1786
  //#endregion
1770
1787
  //#region packages/core/search2where/index.mjs
1771
- /** @import { FieldDefine } from '@yongdall/model' */
1788
+ /** @import { FieldDefine, TableDefine } from '@yongdall/model' */
1772
1789
  /** @import { RecursiveArray } from '@yongdall/common' */
1773
1790
  /**
1774
1791
  * @typedef {object} WhereParam.Value
@@ -1790,7 +1807,14 @@ const whereList = wheres.lazyThen((wheres) => toWhereList(wheres));
1790
1807
  * @property {boolean} not
1791
1808
  */
1792
1809
  /**
1793
- * @typedef {WhereParam.Value | WhereParam.Field} WhereParam
1810
+ * @typedef {object} WhereParam.Sub
1811
+ * @property {'sub'} type
1812
+ * @property {string} model
1813
+ * @property {string} name
1814
+ * @property {(Search.Match | Search.Children)[]} where
1815
+ */
1816
+ /**
1817
+ * @typedef {WhereParam.Value | WhereParam.Field | WhereParam.Sub} WhereParam
1794
1818
  */
1795
1819
  /**
1796
1820
  *
@@ -1809,15 +1833,63 @@ function* buildWhere(toWhere, fields, and) {
1809
1833
  if (!define) return null;
1810
1834
  const type = define.type;
1811
1835
  if (!type) return null;
1836
+ /**
1837
+ *
1838
+ * @param {TableDefine} table
1839
+ * @param {(Search.Match | Search.Children)[]} sub
1840
+ * @returns
1841
+ */
1842
+ const runSub = function* (table, sub) {
1843
+ /** @type {[string, string][]} */
1844
+ const fields = [];
1845
+ /** @type {Record<string, any>} */
1846
+ const values = {};
1847
+ for (const [k, v] of Object.entries(define.constraints || [])) {
1848
+ if (v.noField) continue;
1849
+ if (v.writeOnly) continue;
1850
+ if (v.value) {
1851
+ values[k] = v.value;
1852
+ continue;
1853
+ }
1854
+ if (!v.field) continue;
1855
+ fields.push([k, v.field]);
1856
+ }
1857
+ if (!fields.length) return null;
1858
+ const where = yield* toWhere(table.fields, sub);
1859
+ if (!where) return null;
1860
+ const query = new Query(table).where(where).where(values).select(fields.map((v) => v[0]));
1861
+ return Where.and(fields.map((v) => v[1]), query);
1862
+ };
1812
1863
  if (path.length) {
1813
- if (typeof type !== "object") return null;
1864
+ /** @type {Search.Match | Search.Children} */
1865
+ const sub = [...and];
1866
+ sub[0] = path;
1867
+ if (typeof type !== "object") {
1868
+ const model = define.model;
1869
+ if (!model) return null;
1870
+ return yield {
1871
+ type: "sub",
1872
+ model,
1873
+ name,
1874
+ where: [sub]
1875
+ };
1876
+ }
1814
1877
  if (!type.table) return null;
1815
- return null;
1878
+ return yield* runSub(type, [sub]);
1816
1879
  }
1817
1880
  if (and.length === 2) {
1818
- if (typeof type !== "object") return null;
1881
+ if (typeof type !== "object") {
1882
+ const model = define.model;
1883
+ if (!model) return null;
1884
+ return yield {
1885
+ type: "sub",
1886
+ model,
1887
+ name,
1888
+ where: and[1]
1889
+ };
1890
+ }
1819
1891
  if (!type.table) return null;
1820
- return null;
1892
+ return yield* runSub(type, and[1]);
1821
1893
  }
1822
1894
  if (typeof type !== "string" && (typeof type !== "object" || type.table)) return null;
1823
1895
  const [, value, operator, sign] = and;
@@ -1827,7 +1899,7 @@ function* buildWhere(toWhere, fields, and) {
1827
1899
  name: define.column || name,
1828
1900
  value: null,
1829
1901
  operator,
1830
- not: Boolean(sign)
1902
+ not: !sign
1831
1903
  };
1832
1904
  if (!value || typeof value !== "object" || Array.isArray(value)) return yield {
1833
1905
  type: "value",
@@ -1909,11 +1981,38 @@ function* getKey(field) {
1909
1981
  yield `${type}${array}`;
1910
1982
  yield `${array}`;
1911
1983
  }
1984
+ /** @type {Search.Where<Record<string, FieldDefine>, WhereParam, Where>} */
1985
+ const where = {
1986
+ build: buildWhere,
1987
+ and(list) {
1988
+ if (!list.length) return null;
1989
+ let where = new Where();
1990
+ for (const w of list) where = where.and(w);
1991
+ return where;
1992
+ },
1993
+ or(list) {
1994
+ if (!list.length) return null;
1995
+ let where = new Where();
1996
+ for (const w of list) where = where.or(w);
1997
+ return where;
1998
+ }
1999
+ };
1912
2000
  /**
1913
2001
  *
1914
2002
  * @param {WhereParam} param
1915
2003
  */
1916
2004
  async function execWhere(param) {
2005
+ if (param.type === "sub") {
2006
+ const table = await getModel(param.model);
2007
+ if (!table) return;
2008
+ const fields = table.fields;
2009
+ const primary = Object.entries(fields).filter(([, f]) => f.primary).sort(([, a], [, b]) => (a.primary || 0) - (b.primary || 0)).map(([k]) => k);
2010
+ if (primary.length !== 1) return;
2011
+ const where = await search2where(fields, param.where);
2012
+ if (!where) return;
2013
+ const query = new Query(table).where(where).select(primary);
2014
+ return Where.and(param.name, "in", query);
2015
+ }
1917
2016
  const operator = param.operator;
1918
2017
  if (operator === null) return Where.and(param.name, "=", null, param.not);
1919
2018
  const allWhere = { ...await wheres };
@@ -1958,21 +2057,7 @@ async function execWhere(param) {
1958
2057
  * @returns {Promise<Where?>}
1959
2058
  */
1960
2059
  async function search2where(fields, and, or, or2) {
1961
- return Search.asyncRunGenerator(Search.toWhere({
1962
- build: buildWhere,
1963
- and(list) {
1964
- if (!list.length) return null;
1965
- let where = new Where();
1966
- for (const w of list) where = where.and(w);
1967
- return where;
1968
- },
1969
- or(list) {
1970
- if (!list.length) return null;
1971
- let where = new Where();
1972
- for (const w of list) where = where.or(w);
1973
- return where;
1974
- }
1975
- }, fields, and, or, or2), execWhere, null);
2060
+ return Search.asyncRunGenerator(Search.toWhere(where, fields, and, or, or2), execWhere, null);
1976
2061
  }
1977
2062
 
1978
2063
  //#endregion
@@ -2008,6 +2093,60 @@ async function hashSHA256(salt, value, ...values) {
2008
2093
  return btoa(String.fromCharCode(...new Uint8Array(signature))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
2009
2094
  }
2010
2095
 
2096
+ //#endregion
2097
+ //#region packages/core/token/IdentityToken.mts
2098
+ var IdentityToken_exports = /* @__PURE__ */ __exportAll({
2099
+ create: () => create,
2100
+ parse: () => parse
2101
+ });
2102
+ const defaultProfile = {
2103
+ async parse(token, device, ms) {
2104
+ if (typeof token !== "string") return null;
2105
+ const list = token.split(".");
2106
+ if (list.length !== 3) return null;
2107
+ const timestamp = Number(list[0]);
2108
+ if (!Number.isSafeInteger(timestamp)) return null;
2109
+ const time = Date.now() - timestamp;
2110
+ if (ms && time > ms) return null;
2111
+ if (await hashSHA256(await useSalt(), list[1], list[0]) !== list[2]) return null;
2112
+ return [
2113
+ list[1],
2114
+ ms ? time / ms : -1,
2115
+ time
2116
+ ];
2117
+ },
2118
+ async create(user, device) {
2119
+ const timestamp = Date.now();
2120
+ return [
2121
+ timestamp,
2122
+ user,
2123
+ await hashSHA256(await useSalt(), user, timestamp)
2124
+ ].join(".");
2125
+ }
2126
+ };
2127
+ const profile = LazyPromise.try(async function() {
2128
+ for await (const [, config] of loadPluginProfiles("identityToken", "script")) {
2129
+ if (!config || typeof config !== "object") continue;
2130
+ const { parse, create } = config;
2131
+ if (typeof parse !== "function" || typeof create !== "function") continue;
2132
+ return config;
2133
+ }
2134
+ return defaultProfile;
2135
+ });
2136
+ async function parse(token, device, ms) {
2137
+ const { parse } = await profile;
2138
+ return parse(token, typeof device === "string" && device || null, typeof device === "number" ? device : ms || null);
2139
+ }
2140
+ /**
2141
+ *
2142
+ * @param {string} user
2143
+ * @returns {Promise<string>}
2144
+ */
2145
+ async function create(user, device) {
2146
+ const { create } = await profile;
2147
+ return create(user, device ?? "");
2148
+ }
2149
+
2011
2150
  //#endregion
2012
2151
  //#region packages/core/index.mjs
2013
2152
  /**
@@ -2021,5 +2160,5 @@ function initSystem(realm, boot) {
2021
2160
  }
2022
2161
 
2023
2162
  //#endregion
2024
- export { ServerError, bindModelHooks, bootConfiguration, createPermissionMatches, initSystem as default, existUser, existVisitor, filterPermissionDocument, filterPermissionUpdate, filterPermissions, findModel, findUser, findVisitor, getEnumerations, getMenus, getModel, getModelAuthorizationPermissions, getModelPermissions, getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, getVisitor, hasUserOrganizationPermissions, hasUserPermission, hashSHA256, initConfig, isSingleUser, loadPluginUser, loadUser, loadUserOrganizationAllPermissions, loadUserOrganizationPermissions, loadUserPermissions, loadVisitor, mainRealm, modelHook, nestedSetTree, search2where, setUser, setUserVerify, setVisitor, testPermissionConstraints, testPermissions, toDocumentFields, useRealm, useSalt, verifyUser };
2163
+ export { IdentityToken_exports as IdentityToken, ServerError, bindModelHooks, bootConfiguration, createPermissionMatches, initSystem as default, existUser, existVisitor, filterPermissionDocument, filterPermissionUpdate, filterPermissions, findModel, findUser, findVisitor, getEnumerations, getMenus, getModel, getModelAuthorizationPermissions, getModelPermissions, getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, getVisitor, hasUserOrganizationPermissions, hasUserPermission, hashSHA256, initConfig, isSingleUser, loadPluginUser, loadUser, loadUserOrganizationAllPermissions, loadUserOrganizationPermissions, loadUserPermissions, loadVisitor, mainRealm, modelHook, nestedSetTree, search2where, setUser, setUserVerify, setVisitor, testPermissionConstraints, testPermissions, toDocumentFields, useRealm, useSalt, verifyUser };
2025
2164
  //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["loaders","defaultLogin","finders","existTesters","get"],"sources":["../../packages/core/polyfill.mjs","../../packages/core/config.mjs","../../packages/core/menu.mjs","../../packages/core/models.mjs","../../packages/core/realm.mjs","../../packages/core/user.mjs","../../packages/core/visitor.mjs","../../packages/core/permission/createPermissionMatches.mjs","../../packages/core/permission/testPermissionConstraints.mjs","../../packages/core/permission/filterPermissions.mjs","../../packages/core/permission/filterPermissionDocument.mjs","../../packages/core/permission/filterPermissionUpdate.mjs","../../packages/core/permission/testPermissions.mjs","../../packages/core/decorators/modelHook.mjs","../../packages/core/ServerError.mjs","../../packages/core/decorators/nestedSetTree.mjs","../../packages/core/toDocumentFields.mjs","../../packages/core/enumerations.mjs","../../packages/core/search2where/hook.mjs","../../packages/core/search2where/index.mjs","../../packages/core/safe.mjs","../../packages/core/index.mjs"],"sourcesContent":["if (!Symbol.metadata) {\n\tSymbol.metadata = Symbol.for(\"Symbol.metadata\");\n}\n","/** @import { Realm } from '@yongdall/types' */\n/** @import { BootConfiguration } from '@yongdall/common' */\n\n\n\n/** @type {Realm} */\nexport const mainRealm = {\n\tid: '',\n\tlabel: '拥道YongDall',\n\tsingle: false,\n\tproviders: {},\n\tsalt: 'YongDall',\n}\n/** @type {BootConfiguration} */\nexport const bootConfiguration = {\n\tpages: {},\n\ttheme: '@yongdall/theme#allSider',\n\tauthenticator: '',\n\t// route: '@yongdall/route-symbol',\n\tpath: '/workbench/',\n}\n/**\n * \n * @param {Partial<Omit<Realm, 'id'>>} realm \n * @param {object} boot \n * @returns \n */\nexport function initConfig({label, single, providers, salt}, boot) {\n\tObject.assign(bootConfiguration, boot);\n\n\tmainRealm.label = typeof label === 'string' && label || '拥道YongDall';\n\tmainRealm.single = Boolean(single);\n\tif (salt) { mainRealm.salt = salt; }\n\tmainRealm.providers = Object.fromEntries(\n\t\tObject.entries(typeof providers === 'object' && providers || {})\n\t\t.filter(([k,v]) => typeof v === 'string' && v),\n\t);\n}\n","/**\n * \n * @param {string} type \n * @param {string} [group] \n * @returns \n */\nexport function getMenus(type, group = '') {\n\t/** @type {any} */\n\tconst menus = [];\n\treturn menus\n}\n","/** @import { Permission } from '@yongdall/types' */\n/** @import { FieldDefine, Fields, ModelTable, TableDefine } from '@yongdall/model' */\n/** @import { ModelProfile } from './types.mjs' */\nimport { expandModel, getDefinePermission } from '@yongdall/model';\nimport { createKeyStore } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\nconst ModelProfilePromise = LazyPromise.try(async function () {\n\tconst list = await Array.fromAsync(loadPluginProfiles('model', (/** @type {ModelProfile}*/v) => [v]));\n\treturn list;\n});\nconst modelsPromise = ModelProfilePromise.lazyThen(list => {\n\treturn Object.fromEntries(list.flatMap(v => Object.entries(v.models || {})));\n});\nconst modelLoadersPromise = ModelProfilePromise.lazyThen(list => {\n\treturn Object.fromEntries(list.flatMap(v => Object.entries(v.modelLoaders || {})));\n});\nconst getModelPermissionsHooksPromise = ModelProfilePromise.lazyThen(list => {\n\treturn list.map(v => v.getModelPermissions).filter(v => typeof v === 'function');\n});\nconst modelExpandsPromise = ModelProfilePromise.lazyThen(list => {\n\tconst modelFields = list.flatMap(v => Object.entries(v.modelExpands || {}))\n\t\t.flatMap(([modelId, fields]) => [fields].flatMap(v => {\n\t\t\tif (!v || typeof v !== 'object' || Array.isArray(v)) { return []; }\n\t\t\t/** @type {[modelId:string, fieldName:string, field: FieldDefine<TableDefine>][]} */\n\t\t\tconst data = Object.entries(v).map(([fieldName, field]) => [modelId, fieldName, field]);\n\t\t\treturn data;\n\t\t}));\n\tconst groups = Object.groupBy(modelFields, v => v[0]);\n\t/** @type {Record<string, Fields<TableDefine>>} */\n\tconst expands = {};\n\tfor (const [modelId, fields] of Object.entries(groups)) {\n\t\tif (!fields?.length) { continue; }\n\t\texpands[modelId] = Object.fromEntries(fields.map(([, fieldName, field]) => [fieldName, field]));\n\t}\n\treturn expands;\n});\nconst modelMap = new WeakMap();\n\n\n/**\n * \n * @param {string | string[]} ident \n * @returns {Promise<ModelTable?>}\n */\nexport async function findModel(ident) {\n\tconst [model, ...collection] = (Array.isArray(ident) ? ident : ident.split(':')).filter(Boolean);\n\tif (!collection.length) {\n\t\tconst models = await modelsPromise;\n\t\tconst define = Object.hasOwn(models, model) && models[model];\n\t\treturn (typeof define === 'object' || typeof define === 'function') && define || null;\n\t}\n\tconst modelLoaders = await modelLoadersPromise;\n\tconst loader = Object.hasOwn(modelLoaders, model) && modelLoaders[model];\n\tif (typeof loader !== 'function') { return null; }\n\tconst define = await loader(collection);\n\treturn (typeof define === 'object' || typeof define === 'function') && define || null;\n}\n/**\n * \n * @param {string | string[]} ident \n * @returns {Promise<ModelTable?>}\n */\nexport async function getModel(ident) {\n\tconst model = await findModel(ident);\n\tif (!model) { return model; }\n\tconst define = modelMap.get(model);\n\tif (define) { return define; }\n\tconst modelIdent = Array.isArray(ident) ? ident.join(':') : ident;\n\tconst modelExpands = await modelExpandsPromise;\n\tconst expandedModel = Object.hasOwn(modelExpands, modelIdent) ? modelExpands[modelIdent] : {};\n\tconst newDefine = expandModel(model, expandedModel);\n\t// TODO: 动态扩展不缓存\n\tmodelMap.set(model, newDefine);\n\treturn newDefine;\n}\n\n\n/** @type {(modelId: string, groupId?: string?) => Promise<Permission[]?>} */\nexport const getModelPermissions = createKeyStore(async (modelId, groupId) => {\n\tfor (const fn of await getModelPermissionsHooksPromise) {\n\t\tconst permissions = await fn(modelId, groupId);\n\t\tif (permissions) { return permissions; }\n\t}\n\tif (groupId) { return null; }\n\treturn getDefinePermission(await getModel(modelId));\n}, (modelId, groupId) => [modelId, groupId || ''].join('\\n'));\n\n/**\n * \n * @param {string} modelId \n * @param {string} authorization\n * @param {string?} [groupId] \n * @returns {Promise<Permission[]?>}\n */\nexport async function getModelAuthorizationPermissions(modelId, authorization, groupId) {\n\tconst permissions = await getModelPermissions(modelId, groupId);\n\tif (!permissions?.length) { return permissions; }\n\treturn permissions.filter(({ authorizations }) => {\n\t\tif (!authorizations) { return false; }\n\t\tif (Array.isArray(authorizations)) {\n\t\t\treturn authorizations.includes(authorization);\n\t\t}\n\t\tif (authorizations instanceof Set) {\n\t\t\treturn authorizations.has(authorization);\n\t\t}\n\t\treturn false;\n\t});\n}\n","/** @import { Realm } from '@yongdall/types' */\n/** @import { RealmHook } from './types.mjs' */\nimport { createStoreSerializable } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\nimport { mainRealm } from './config.mjs';\nconst [realmIdGetter, realmIdSetter] = createStoreSerializable('realmStatus', async (/** @type {Promise<string?> | string | null} */realmId) => {\n\treturn { realm: await realmId || null };\n}, (/** @type {{realm?: string?;}?} */val) => {\n\treturn Promise.resolve(val?.realm || null);\n}, /** @type {Promise<string?> | string | null} */(null));\n\n\nconst hooks = LazyPromise.try(async function () {\n\t/** @type {[string, Partial<RealmHook>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('realm'));\n\treturn list.map(v => v[1]);\n});\n\n/**\n * \n * @param {string} realmId \n * @returns {Promise<boolean>}\n */\nexport async function existRealm(realmId) {\n\tfor (const { exist, load } of await hooks) {\n\t\tif (typeof exist === 'function') {\n\t\t\tif (await exist(realmId)) { return true; }\n\t\t} else if (typeof load === 'function') {\n\t\t\tif (await load(realmId)) { return true; }\n\t\t}\n\t}\n\treturn false;\n}\n\nconst getters = hooks.lazyThen(hooks => hooks.map(v => v.get).filter(v => typeof v === 'function'));\n\n/**\n * \n * @returns {Promise<string?>}\n */\nasync function getCurrentRealm() {\n\tfor (const get of await getters) {\n\t\tconst realm = await get();\n\t\tif (!realm || !await existRealm(realm)) { continue; }\n\t\treturn realm;\n\t}\n\treturn null;\n}\n\n/**\n * \n * @returns {Promise<string?>}\n */\nexport async function useRealmId() {\n\tlet state = realmIdGetter();\n\tif (!state) {\n\t\tstate = getCurrentRealm();\n\t\trealmIdSetter(state);\n\t}\n\treturn state;\n}\n\nconst loaders = hooks.lazyThen(hooks => hooks.map(v => v.load).filter(v => typeof v === 'function'));\n/**\n * \n * @param {string} realmId \n * @returns {Promise<Realm?>}\n */\nexport async function loadRealm(realmId) {\n\tfor (const load of await loaders) {\n\t\tconst realm = await load(realmId);\n\t\tif (realm) { return realm; }\n\t}\n\treturn null;\n\n\n}\n\n\n\n\n/**\n * \n * @returns {Promise<Realm>}\n */\nexport default async function useRealm() {\n\treturn useRealmId().then(async id => {\n\t\tif (!id) { return mainRealm; }\n\t\tconst realm = await loadRealm(id);\n\t\tif (realm) { return realm; }\n\t\tthrow new Error('[noRealm] 找不到域');\n\t});\n}\nexport function useSalt() {\n\treturn useRealm().then(r => r.salt);\n}\n","/** @import { Permissions, Realm } from '@yongdall/types' */\n/** @import { UserManager, MaybePromise } from './types.mjs' */\nimport { createKeyStore, createStoreSerializable } from '@yongdall/context';\nimport { isFunction, LazyPromise } from '@yongdall/common';\nimport useRealm from './realm.mjs';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/**\n * @typedef {[result: string | null, UserManager['set'] | null, UserManager['exit'] | null, user: string | null, sUser: string | null]} UserState\n */\nconst [userGetter, userSetter] = createStoreSerializable('userStatus', async (/** @type {Promise<UserState> | UserState | null} */state) => {\n\tif (!state) { return null; }\n\tconst s = await state;\n\treturn { user: s[3], sUser: s[4] };\n}, (/** @type {{user?: string?;userSystem?: string?;sUser?: string?;sUserSystem?: string?;}?} */val) => {\n\tif (!val) { return null; }\n\tconst { user: userId, sUser: sUserId } = val;\n\treturn Promise.resolve(/** @type {UserState} */([null, null, null, userId, sUserId]));\n}, /** @type {Promise<UserState> | UserState | null} */(null));\n\n\nconst userManagerMap = LazyPromise.try(async function () {\n\t/** @type {[string,UserManager, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('user'));\n\treturn list;\n});\n\nconst userManagers = userManagerMap.lazyThen(list => list.map(v => v[1]));\nconst defaultLogin = userManagers.lazyThen(userMangers => {\n\t/**\n\t * @param {string} user\n\t */\n\treturn async function defaultLogin(user) {\n\t\tfor (const {login} of userMangers) {\n\t\t\tif (typeof login !== 'function') { continue; }\n\t\t\tconst r = await login(user);\n\t\t\tif (r) { return r; }\n\t\t}\n\t\treturn false;\n\t}\n});\n\nconst switchableListPromise = userManagers.lazyThen(userMangers => {\n\tconst switchableList = userMangers.map(v => v.switchable).filter(isFunction);\n\t/**\n\t * @param {Realm} realm \n\t * @param {string} user \n\t * @param {string} sUser \n\t * @returns {Promise<boolean>}\n\t */\n\treturn async function switchable(realm, user, sUser) {\n\t\tif (!switchableList.length) { return false; }\n\t\tfor (const s of switchableList) {\n\t\t\tif (await s(user, sUser)) { continue; }\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n});\n\n\n\nconst suGets = userManagers.lazyThen(userMangers => {\n\t/** @type {(() => MaybePromise<string?>)[]} */\n\treturn userMangers.map(v => v.suGet).filter(isFunction);\n});\n\nconst finders = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.find).filter(v => typeof v === 'function');\n});\n\n\nconst loaders = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.load).filter(v => typeof v === 'function');\n});\nconst existTesters = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.exist).filter(v => typeof v === 'function');\n});\n\nconst getPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getPermissions).filter(v => typeof v === 'function');\n});\n\nconst getOrganizationPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getOrganizationPermissions).filter(v => typeof v === 'function');\n});\n\nconst getOrganizationAllPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getOrganizationAllPermissions).filter(v => typeof v === 'function');\n});\n\nconst getLoggedUserFn = userManagers.lazyThen(userMangers => {\n\t/** @type {[UserManager['get'], UserManager['set'] | null, UserManager['exit'] | null][]} */\n\tconst getLoggedUserFn = [];\n\tfor (const { get, set, exit } of userMangers) {\n\t\tif (typeof get === 'function') {\n\t\t\tgetLoggedUserFn.push([get, set || null, exit || null]);\n\t\t}\n\t}\n\n\treturn getLoggedUserFn;\n});\n\nconst verifiersPromise = userManagers.lazyThen(userMangers => {\n\tconst list = userMangers.map(v => v).flatMap(v => Object.entries(v.verify || {}));\n\treturn Object.fromEntries(\n\t\tObject.entries(Object.groupBy(list, v => v[0])).map(([k, v]) => [k, v?.map(v => v[1]) || []])\n\t);\n});\n\n\n\nconst setVerifiersPromise = userManagers.lazyThen(userMangers => {\n\tconst list = userMangers.map(v => v).flatMap(v => Object.entries(v.setVerify || {}));\n\treturn Object.fromEntries(\n\t\tObject.entries(Object.groupBy(list, v => v[0])).map(([k, v]) => [k, v?.map(v => v[1]) || []])\n\t);\n});\n\n\n\n\n\n\n\n\n\n\n\n/**\n * \n * @param {string} userId \n * @param {boolean} [login] \n * @returns {Promise<boolean>}\n */\nexport async function existUser(userId, login) {\n\tfor (const fn of await existTesters) {\n\t\tif (await fn(userId, login)) { return true; }\n\t}\n\treturn false;\n}\n\n/**\n * \n * @returns {Promise<UserState>}\n */\nasync function getLoggedUser() {\n\tconst realm = await useRealm();\n\tif (realm.single) {\n\t\tfor (const suGet of await suGets) {\n\t\t\tconst suUser = await suGet();\n\t\t\tif (!suUser) { continue; }\n\t\t\tif (!await existUser(suUser)) { continue; }\n\t\t\treturn [null, null, null, null, suUser];\n\t\t}\n\t\treturn [null, null, null, null, null];\n\t}\n\n\n\n\t/** @type {UserManager['set']?} */\n\tlet setUser = null;\n\t/** @type {UserManager['exit']?} */\n\tlet exitUser = null;\n\t/** @type {string?} */\n\tlet user = null;\n\n\tfor (const [get, set, exit] of await getLoggedUserFn) {\n\t\tconst u = await get();\n\t\tif (!u || !await existUser(u)) { continue; }\n\t\tuser = u;\n\t\tsetUser = set;\n\t\texitUser = exit;\n\t\tbreak;\n\t}\n\tif (!user) { return [null, await defaultLogin, null, null, null]; }\n\tfor (const suGet of await suGets) {\n\t\tconst suUser = await suGet();\n\t\tif (!suUser) { continue; }\n\t\tif (!await existUser(suUser)) { continue; }\n\t\tconst switchable = await switchableListPromise;\n\t\tif (await switchable(realm, user, suUser)) { continue; }\n\t\treturn [null, setUser, exitUser, user, suUser];\n\t}\n\treturn [null, setUser, exitUser, user, null];\n}\n\n\nasync function get() {\n\tlet state = userGetter();\n\tif (!state) {\n\t\tstate = getLoggedUser();\n\t\tuserSetter(state);\n\t}\n\treturn state;\n}\n/**\n * @param {boolean?} [logged] \n * @returns {Promise<boolean>}\n */\nexport function isSingleUser(logged) {\n\tif (logged) {\n\t\treturn useRealm().then(g => g.single);\n\t}\n\treturn get().then(([, , , su]) => su ? false : useRealm().then(g => g.single));\n}\n\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<string?>}\n */\nexport function getUser(logged) {\n\t// sudo 或自身\n\treturn get().then(([, , , current, su]) => {\n\t\tif (logged === false) { return su; }\n\t\tif (logged) { return current; }\n\t\treturn su || current;\n\t});\n}\n\n/**\n * \n * @param {string?} userId\n * @param {boolean?} [sudo]\n * @returns {Promise<string?>}\n */\nexport function setUser(userId, sudo) {\n\tlet state = Promise.resolve(userGetter() || getLoggedUser());\n\tif (sudo) {\n\t\tstate = state.then(async ([, set, exit, current]) => {\n\t\t\tif (!userId || !await existUser(userId)) { return [null, set, exit, current, null]; }\n\t\t\tif (current || await useRealm().then(t => t.single)) { return [userId, set, exit, current, userId]; }\n\t\t\treturn [null, set, exit, null, null];\n\t\t});\n\t} else {\n\t\tstate = state.then(async ([, set, exit, current, su]) => {\n\t\t\tif (!userId) {\n\t\t\t\tif (current && exit) {\n\t\t\t\t\tawait exit(current);\n\t\t\t\t}\n\t\t\t\treturn [null, set, exit, null, null];\n\t\t\t}\n\t\t\tif (!set) { return [current, set, exit, current, su]; }\n\t\t\tconst realm = await useRealm();\n\t\t\tif (realm.single) { return [null, set, exit, null, su]; }\n\t\t\t// TODO: 判断用户是否存在\n\t\t\tconst res = await set(userId);\n\t\t\tif (!res) {\n\t\t\t\treturn [null, set, exit, current, su];\n\t\t\t}\n\t\t\treturn [userId, set, typeof res === 'function' ? res : exit, userId, null];\n\t\t});\n\t}\n\tuserSetter(state);\n\treturn state.then(v => v[0]);\n}\n\n\n\n/**\n * \n * @param {string | Record<string, unknown>} loginName \n * @param {string | string[]} [loginType] \n * @returns {Promise<string>}\n */\nexport async function findUser(loginName, loginType) {\n\tconst types = new Set([loginType || ''].flat().filter(Boolean));\n\tfor (const fn of await finders) {\n\t\tconst userId = await fn(loginName, types);\n\t\tif (userId) { return userId; }\n\t}\n\treturn '';\n}\n\n/**\n * \n * @param {string} userId \n * @param {string} password \n * @param {string} type \n * @param {boolean} [returnError] \n * @returns {Promise<number>}\n */\nexport async function verifyUser(userId, password, type, returnError) {\n\tconst verifiers = await verifiersPromise;\n\tif (!Object.hasOwn(verifiers, type)) { return 0; }\n\tfor (const fn of verifiers[type] || []) {\n\t\tconst res = await fn(userId, password);\n\t\tif (res < 0) { return returnError ? res : 0; }\n\t\tif (res > 0) { return res; }\n\t}\n\treturn 0;\n}\n\n/**\n * \n * @param {string} userId \n * @param {string} type \n * @param {string?} password \n * @param {Date?} [deadline] \n * @returns {Promise<boolean>}\n */\nexport async function setUserVerify(userId, type, password, deadline) {\n\tconst setVerifiers = await setVerifiersPromise;\n\tif (!Object.hasOwn(setVerifiers, type)) { return false; }\n\tfor (const fn of setVerifiers[type] || []) {\n\t\tif (await fn(userId, password, deadline)) { return true; }\n\t}\n\treturn false;\n}\n\n/** @type {(user?: string?) => Promise<Set<string>>} */\nexport const loadUserPermissions = createKeyStore(async user => {\n\tif (!user) { return new Set(); }\n\tfor (const f of await getPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) { return new Set(r); }\n\t}\n\treturn new Set();\n}, user => user || '');\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Permissions>}\n */\nexport async function getUserPermissions(logged) {\n\tif (await isSingleUser(logged)) {\n\t\treturn { size: -1, has() { return true; } };\n\t}\n\treturn loadUserPermissions(await getUser(logged));\n}\n/**\n * \n * @param {string} permission \n * @param {boolean?} [logged] \n */\nexport async function hasUserPermission(permission, logged) {\n\tif (await isSingleUser(logged)) { return true; }\n\tconst permissions = await loadUserPermissions(await getUser(logged));\n\treturn permissions.has(permission);\n}\n\n/** @type {(user?: string?) => Promise<Set<string>>} */\nexport const loadUserOrganizationAllPermissions = createKeyStore(async user => {\n\tif (!user) { return new Set(); }\n\tfor (const f of await getOrganizationAllPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) { return new Set(r); }\n\t}\n\treturn new Set();\n}, user => user || '');\n\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Permissions>}\n */\nexport async function getUserOrganizationAllPermissions(logged) {\n\tif (await isSingleUser(logged)) {\n\t\treturn { size: -1, has() { return true; } };\n\t}\n\treturn loadUserOrganizationAllPermissions(await getUser(logged));\n}\n\n/** @type {(user?: string?) => Promise<Record<string, Set<string>>>} */\nexport const loadUserOrganizationPermissions = createKeyStore(async user => {\n\tif (!user) { return Object.create(null); }\n\tfor (const f of await getOrganizationPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) {\n\t\t\treturn Object.assign(\n\t\t\t\tObject.create(null),\n\t\t\t\tObject.fromEntries(Object.entries(r).map(([k, v]) => [k, new Set(v)])),\n\t\t\t);\n\t\t}\n\t}\n\treturn Object.create(null);\n}, user => user || '');\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Record<string, Set<string>>?>}\n */\nexport async function getUserOrganizationPermissions(logged) {\n\tif (await isSingleUser(logged)) { return null; }\n\treturn loadUserOrganizationPermissions(await getUser(logged));\n}\n\n/**\n * \n * @overload\n * @param {string} permission \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @overload\n * @param {string} permission \n * @param {string} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @overload\n * @param {string} permission \n * @param {string | boolean | null} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @param {string} permission \n * @param {string | boolean | null} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\nexport async function hasUserOrganizationPermissions(permission, organization, logged) {\n\tif (await isSingleUser(typeof organization === 'string' ? logged : organization)) {\n\t\treturn true;\n\t}\n\tif (typeof organization !== 'string') {\n\t\tconst permissions = await loadUserOrganizationAllPermissions(await getUser(logged));\n\t\treturn permissions.has(permission);\n\t}\n\tconst organizations = await loadUserOrganizationPermissions(await getUser(logged));\n\tif (!Object.hasOwn(organizations, organization)) { return false; }\n\tconst permissions = organizations[organization];\n\tif (!permissions) { return false; }\n\tif (!permission) { return true; }\n\treturn permissions.has(permission);\n}\n\n\nconst userPluginLoaders = userManagerMap.lazyThen(list => {\n\t/** @type {[string, UserManager['load']][]} */\n\tconst userMangers = list.map(([k, v]) => [k, v?.loadPlugin]);\n\t/** @type {[string, UserManager['load']][]} */\n\tconst loaders = userMangers.filter(([, v]) => typeof v === 'function');\n\treturn loaders;\n});\n/**\n * \n * @param {string} userId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadPluginUser(userId) {\n\tconst loaders = await userPluginLoaders;\n\tconst list2 = await Promise.all(loaders.map(([p, f]) => Promise.all([p, f(userId)])));\n\tconst plugins = Object.fromEntries(Object.entries(Object.groupBy(list2, ([k]) => k)).map(([k, l]) => {\n\t\treturn [k, Object.assign({}, ...l?.map(v => v[1]) || [])];\n\t}));\n\treturn plugins;\n}\n/**\n * \n * @param {string} userId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadUser(userId, plugin = false) {\n\tconst [\n\t\tlist,\n\t\tplugins,\n\t\tpermissions,\n\t\torganizationPermissions,\n\t] = await Promise.all([\n\t\tloaders.then(loaders => Promise.all(loaders.map(f => f(userId)))),\n\t\tplugin ? loadPluginUser(userId) : {},\n\t\tloadUserPermissions(userId).then(p => [...p]),\n\t\tloadUserOrganizationPermissions(userId).then(p => Object.fromEntries(\n\t\t\tObject.entries(p).map(([k, v]) => [k, [...v]])\n\t\t)),\n\t]);\n\treturn Object.assign({}, ...list, {\n\t\tid: userId,\n\t\tplugins,\n\t\tpermissions,\n\t\torganizationPermissions,\n\t});\n}\n","/** @import { VisitorManager } from './types.mjs' */\nimport { createStoreSerializable } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/**\n * @typedef {[result: string | null, VisitorManager['set'] | null, VisitorManager['exit'] | null, visitor: string | null]} VisitorState\n */\nconst [visitorGetter, visitorSetter] = createStoreSerializable('visitorStatus', async (/** @type {Promise<VisitorState> | VisitorState | null} */state) => {\n\tif (!state) { return null; }\n\tconst s = await state;\n\treturn { visitor: s[3] };\n}, (/** @type {{visitor?: string?}?} */val) => {\n\tif (!val) { return null; }\n\tconst { visitor: visitorId } = val;\n\treturn Promise.resolve(/** @type {VisitorState} */([null, null, null, visitorId]));\n}, /** @type {Promise<VisitorState> | VisitorState | null} */(null));\n\n\nconst visitors = LazyPromise.try(async function () {\n\t/** @type {[string, Partial<VisitorManager>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('visitor'));\n\treturn list.map(v => v[1]);\n});\n\n\nconst existTesters = visitors.lazyThen(v => v.map(v => v.exist).filter(v => typeof v === 'function'));\n\n\n/**\n * \n * @param {string} visitorId \n * @returns {Promise<boolean>}\n */\nexport async function existVisitor(visitorId) {\n\tfor (const fn of await existTesters) {\n\t\tif (await fn(visitorId)) { return true; }\n\t}\n\treturn false;\n}\n\nconst getLoggedVisitorFn = visitors.lazyThen(list => {\n\t/** @type {[VisitorManager['get'], VisitorManager['set'] | null, VisitorManager['exit'] | null][]} */\n\tconst getLoggedVisitorFn = [];\n\tfor (const { get, set, exit } of list) {\n\t\tif (typeof get !== 'function') { continue; }\n\t\tgetLoggedVisitorFn.push([get, set || null, exit || null]);\n\t}\n\treturn getLoggedVisitorFn;\n});\n\nconst defaultLogin = visitors.lazyThen(visitorManager => {\n\t/**\n\t * @param {string} user\n\t */\n\treturn async function defaultLogin(user) {\n\t\tfor (const {login} of visitorManager) {\n\t\t\tif (typeof login !== 'function') { continue; }\n\t\t\tconst r = await login(user);\n\t\t\tif (r) { return r; }\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n});\n\n/**\n * \n * @returns {Promise<VisitorState>}\n */\nasync function getLoggedVisitor() {\n\t/** @type {VisitorManager['set']?} */\n\tlet setVisitor = null;\n\t/** @type {VisitorManager['exit']?} */\n\tlet exitVisitor = null;\n\t/** @type {string?} */\n\tlet visitor = null;\n\n\tfor (const [get, set, exit] of await getLoggedVisitorFn) {\n\t\tconst u = await get();\n\t\tif (!u || !await existVisitor(u)) { continue; }\n\t\tvisitor = u;\n\t\tsetVisitor = set;\n\t\texitVisitor = exit;\n\t\tbreak;\n\t}\n\tif (!visitor) { return [null, await defaultLogin, null, null]; }\n\treturn [null, setVisitor, exitVisitor, visitor];\n}\n\n\nasync function get() {\n\tlet state = visitorGetter();\n\tif (!state) {\n\t\tstate = getLoggedVisitor();\n\t\tvisitorSetter(state);\n\t}\n\treturn state;\n}\n\n/**\n * \n * @returns {Promise<string?>}\n */\nexport function getVisitor() {\n\treturn get().then(([, , , current]) => current);\n}\n\n/**\n * \n * @param {string?} visitorId\n * @returns {Promise<string?>}\n */\nexport function setVisitor(visitorId) {\n\tlet state = Promise.resolve(visitorGetter() || getLoggedVisitor());\n\n\tstate = state.then(async ([, set, exit, current]) => {\n\t\tif (!visitorId) {\n\t\t\tif (current && exit) {\n\t\t\t\tawait exit(current);\n\t\t\t}\n\t\t\treturn [null, set, exit, null];\n\t\t}\n\t\tif (!set) { return [current, set, exit, current]; }\n\t\tconst res = await set(visitorId);\n\t\tif (!res) {\n\t\t\treturn [null, set, exit, current];\n\t\t}\n\t\treturn [visitorId, set, typeof res === 'function' ? res : exit, visitorId];\n\t});\n\tvisitorSetter(state);\n\treturn state.then(v => v[0]);\n}\n\n\n\nconst finders = visitors.lazyThen(v => v.map(v => v.find).filter(v => typeof v === 'function'));\n/**\n * \n * @param {Record<string, unknown>} loginName \n * @returns {Promise<string>}\n */\nexport async function findVisitor(loginName) {\n\tfor (const fn of await finders) {\n\t\tconst visitorId = await fn(loginName);\n\t\tif (visitorId) { return visitorId; }\n\t}\n\treturn '';\n}\n/**\n * \n * @param {string} visitorId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadVisitor(visitorId) {\n\treturn {\n\t\tid: visitorId,\n\t};\n}\n","/** @import { Permission } from '@yongdall/types' */\n\nimport { Where } from '@yongdall/model';\nimport { getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions } from '../user.mjs';\n\n/**\n *\n * @param {Exclude<Permission['constraints'], void>?} [constraints]\n * @param {string?} [userId]\n * @returns {Iterable<[string, string, any]>}\n */\nfunction* yieldConstraintWheres(constraints, userId) {\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, '=', value];\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tyield [field, 'in', values];\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tyield [field, 'in', [...values]];\n\t\t} else if (user && userId) {\n\t\t\tyield [field, '=', userId];\n\t\t}\n\t}\n}\n\n\n\n\n/**\n * @param {Permission[]} permissions\n */\nexport default async function createPermissionMatches(permissions) {\n\tlet permissionInGlobal = permissions.filter(v => !v.organizationField);\n\tconst orWhere = new Where();\n\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tpermissionInGlobal = permissionInGlobal.filter(v => !v.permission || permissions.has(v.permission));\n\t}\n\tconst userId = await getUser();\n\tfor (const { constraints } of permissionInGlobal) {\n\t\tconst wheres = [...yieldConstraintWheres(constraints, userId)];\n\t\tif (!wheres.length) { return null; }\n\t\tconst where = new Where();\n\t\tfor (const v of wheres) {\n\t\t\twhere.and(...v);\n\t\t}\n\t\torWhere.or(where);\n\t}\n\tlet permissionInOrganization = permissions.filter(v => v.organizationField);\n\tif (permissionInOrganization.length) {\n\t\tconst organizationPermissions = await getUserOrganizationAllPermissions();\n\t\tpermissionInOrganization = permissionInOrganization.filter(v => !v.permission || organizationPermissions.has(v.permission));\n\t}\n\tif (!permissionInOrganization.length) { return orWhere; }\n\tif (permissionInOrganization.length) {\n\t\tconst allOrganizationPermissions = await getUserOrganizationPermissions();\n\t\tif (!allOrganizationPermissions) {\n\t\t\tfor (const { constraints } of permissionInOrganization) {\n\t\t\t\tconst where = new Where\n\t\t\t\tfor (const v of yieldConstraintWheres(constraints, userId)) {\n\t\t\t\t\twhere.and(...v);\n\t\t\t\t}\n\t\t\t\torWhere.or(where);\n\t\t\t}\n\n\t\t} else {\n\t\t\tconst organizationPermissions = Object.entries(allOrganizationPermissions);\n\t\t\tfor (const { constraints, permission, organizationField } of permissionInOrganization) {\n\t\t\t\tconst organizations = permission ? organizationPermissions.filter(v => v[1].has(permission)).map(v => v[0]) : organizationPermissions.map(v => v[0]);\n\t\t\t\tif (!organizations.length) { continue; }\n\t\t\t\tconst where = Where.and(organizationField || '', 'in', organizations);\n\t\t\t\tfor (const v of yieldConstraintWheres(constraints, userId)) {\n\t\t\t\t\twhere.and(...v);\n\t\t\t\t}\n\t\t\t\torWhere.or(where);\n\t\t\t}\n\n\t\t}\n\t}\n\treturn orWhere;\n}\n","/** @import { Permission } from '@yongdall/types' */\n/**\n *\n * @param {Exclude<Permission['constraints'], void>} constraints\n * @param {Record<string, any>} document\n * @param {string | boolean | null} userId\n */\nexport default function testPermissionConstraints(constraints, document, userId) {\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 = document[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 (userId !== true && val !== userId) { return false; }\n\t\t}\n\t}\n\treturn true;\n\n}\n","/** @import { Permission } from '@yongdall/types' */\nimport { getUser, getUserOrganizationPermissions, getUserPermissions, isSingleUser } from '../user.mjs';\nimport testPermissionConstraints from './testPermissionConstraints.mjs';\n\n\n/**\n *\n * @param {Permission[]} allPermissions\n * @param {Record<string, any>} document\n * @returns\n */\nexport default async function filterPermissions(allPermissions, document) {\n\tconst permissionInGlobal = allPermissions.filter(v => !v.organizationField);\n\tconst permissionInOrganization = allPermissions.filter(v => v.organizationField);\n\t/** @type {Permission[]} */\n\tconst filteredPermissions = [];\n\tconst userId = await isSingleUser() || await getUser();\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tfor (const p of permissionInGlobal) {\n\t\t\tconst { permission, constraints } = p;\n\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\tfilteredPermissions.push(p);\n\t\t}\n\t}\n\tif (permissionInOrganization.length) {\n\t\tconst permissions = await getUserOrganizationPermissions();\n\t\tif (!permissions) {\n\t\t\tfor (const p of permissionInOrganization) {\n\t\t\t\tconst { organizationField, constraints } = p;\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tfilteredPermissions.push(p);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const p of permissionInOrganization) {\n\t\t\t\tconst { permission, organizationField, constraints } = p;\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tconst organizationPermissions = permissions[organizationId];\n\t\t\t\tif (!organizationPermissions) { continue; }\n\t\t\t\tif (permission && !organizationPermissions.has(permission)) { continue; }\n\t\t\t\tfilteredPermissions.push(p);\n\t\t\t}\n\t\t}\n\t}\n\treturn filteredPermissions;\n\n}\n","/** @import { Permission } from '@yongdall/types' */\n/** @import { ModelTable, FieldDefine } from '@yongdall/model' */\nimport filterPermissions from './filterPermissions.mjs';\n\n/**\n * @param {ModelTable} model\n * @param {Permission[]} permissions\n * @param {Record<string, any>} document\n */\nexport default async function filterPermissionDocument({ fields }, permissions, document) {\n\tconst userPermissions = await filterPermissions(permissions, document);\n\tif (userPermissions && !userPermissions.length) { return null; }\n\tlet groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tlet fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\tif (!(groups.size + fieldsAuth.size)) { return null; }\n\n\t/**\n\t *\n\t * @param {[string, FieldDefine & {group?: string}][]} fields\n\t * @param {Record<string, any>} document\n\t * @param {string[]} parent\n\t * @returns\n\t */\n\tfunction filter(fields, document, parent) {\n\t\t/** @type {Record<string, any>} */\n\t\tconst value = {};\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif (!field.primary && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object' || !type.table) {\n\t\t\t\tvalue[name] = document[name];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst subDocument = document[name];\n\t\t\tconst list = Object.entries(type.fields);\n\t\t\tif (field.array) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue[name] = (Array.isArray(subDocument) ? subDocument : subDocument ? [subDocument] : []).map(doc => filter(list, doc, key));\n\t\t\t} else if (subDocument && !Array.isArray(subDocument)) {\n\t\t\t\tconst val = filter(list, subDocument, fieldNames);\n\t\t\t\tif (!Object.keys(val)) { continue; }\n\t\t\t\tvalue[name] = val;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\n\t}\n\treturn filter(Object.entries(fields), document, []);\n}\n","/** @import { FieldDefine, ModelTable } from '@yongdall/model' */\n/** @import { Permission } from '@yongdall/types' */\nimport filterPermissions from './filterPermissions.mjs';\n\n/**\n * @param {ModelTable} model\n * @param {Permission[]} permissions\n * @param {Record<string, any>} document\n * @param {Record<string, any>} newDocument\n */\nexport default async function filterPermissionUpdate({ fields }, permissions, document, newDocument) {\n\tconst newData = {...newDocument};\n\t/** @type {any} */\n\tconst setData = {};\n\tconst userPermissions = await filterPermissions(permissions, { ...document, ...setData });\n\tif (userPermissions && !userPermissions.length) { return null; }\n\tlet groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tlet fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\twhile (groups.size + fieldsAuth.size) {\n\t\tlet n = 0;\n\t\tfor (const [key, value] of Object.entries(newData)) {\n\t\t\t/** @type {FieldDefine & {group?: string}?} */\n\t\t\tconst field = fields[key];\n\t\t\tif (!field) { continue; }\n\t\t\tif (!groups.has(field.group || '') && !fieldsAuth.has(key)) { continue; }\n\t\t\tdelete newData[key]\n\t\t\tsetData[key] = value;\n\t\t\tn++;\n\t\t}\n\t\tif (!n) { break; }\n\t\tconst newPermissionGroups = await filterPermissions(permissions, { ...document, ...setData });\n\t\tif (newPermissionGroups && !newPermissionGroups.length) { break; }\n\t\tconst newGroups = new Set([...groups, ...newPermissionGroups.flatMap(v => v.group || '')]);\n\t\tconst newFieldsAuth = new Set([...fieldsAuth, ...newPermissionGroups.flatMap(v => v.fields || '')]);\n\t\tnewGroups.delete('');\n\t\tnewFieldsAuth.delete('');\n\t\tif (newGroups.size === groups.size && newFieldsAuth.size === fieldsAuth.size) { break; }\n\t\tgroups = newGroups;\n\t\tfieldsAuth = newFieldsAuth;\n\t}\n\tif (!(groups.size + fieldsAuth.size)) { return null; }\n\n\t/**\n\t *\n\t * @param {[string, FieldDefine & {group?: string}][]} fields\n\t * @param {Record<string, any>} document\n\t * @param {string[]} parent\n\t * @returns\n\t */\n\tfunction filter(fields, document, parent) {\n\t\t/** @type {Record<string, any>} */\n\t\tconst value = {};\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif ((parent ? !field.primary : true) && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tif (!Object.hasOwn(document, name)) { continue; }\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object' || !type.table) {\n\t\t\t\tvalue[name] = document[name];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst subDocument = document[name];\n\t\t\tconst list = Object.entries(type.fields);\n\t\t\tif (field.array) {\n\t\t\t\tvalue[name] = (Array.isArray(subDocument) ? subDocument : [subDocument]).map(doc => filter(list, doc, fieldNames));\n\t\t\t} else if (subDocument && !Array.isArray(subDocument)) {\n\t\t\t\tconst val = filter(list, subDocument, fieldNames);\n\t\t\t\tif (!Object.keys(val)) { continue; }\n\t\t\t\tvalue[name] = val;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\treturn filter(Object.entries(fields), newDocument, []);\n}\n","import { getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, isSingleUser } from '../user.mjs';\nimport testPermissionConstraints from './testPermissionConstraints.mjs';\n/** @import { Permission } from '@yongdall/types' */\n/**\n *\n * @param {Permission[]?} [allPermissions]\n * @param {Record<string, any>} [document]\n * @returns\n */\nexport default async function testPermissions(allPermissions, document) {\n\tif (!allPermissions?.length) { return false; }\n\tconst permissionInGlobal = allPermissions.filter(v => !v.organizationField);\n\tconst permissionInOrganization = allPermissions.filter(v => v.organizationField);\n\tif (!document) {\n\t\tif (permissionInGlobal.length) {\n\t\t\tconst permissions = await getUserPermissions();\n\t\t\tfor (const { permission } of permissionInGlobal) {\n\t\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (permissionInOrganization.length) {\n\t\t\tconst permissions = await getUserOrganizationAllPermissions();\n\t\t\tfor (const { permission } of permissionInOrganization) {\n\t\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tconst userId = await isSingleUser() || await getUser();\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tfor (const { permission, constraints } of permissionInGlobal) {\n\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (permissionInOrganization.length) {\n\t\tconst permissions = await getUserOrganizationPermissions();\n\t\tif (!permissions) {\n\t\t\tfor (const { organizationField, constraints } of permissionInOrganization) {\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const { permission, organizationField, constraints } of permissionInOrganization) {\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tconst organizationPermissions = permissions[organizationId];\n\t\t\t\tif (!organizationPermissions) { continue; }\n\t\t\t\tif (permission && !organizationPermissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n\n}\n","/** @import { Hooks, ClassDecorator } from '@yongdall/model' */\n/** @import { ModelProfile } from '../types.mjs' */\nimport { afterCreate, afterCreateMany, afterDelete, afterUpdate, beforeCreate, beforeCreateMany, beforeDelete, beforeUpdate } from '@yongdall/model';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\nconst modelHooksPromise = LazyPromise.try(async function () {\n\t/** @returns {{[K in keyof Hooks]: Record<string, Hooks[K][]>}} */\n\tconst modelHooks = Object.create(null);\n\tconst list = await Array.fromAsync(loadPluginProfiles('model', function *(/** @type {ModelProfile} */{modelHook}) {\n\t\tif (!modelHook || typeof modelHook !== 'object' || Array.isArray(modelHook)) { return; }\n\t\tyield *Object.entries(modelHook)\n\t}));\n\tfor (const [model, v] of Object.entries(list)) {\n\t\tfor (const [name, fn] of Object.entries(v)) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tconst list = modelHooks[name] ||= Object.create(null);\n\t\t\t(list[model] ||= []).push(fn);\n\t\t}\n\t}\n\treturn modelHooks;\n});\n/**\n * \n * @param {Partial<Hooks>} hooks \n * @param {...string | string[]} hookNames \n * @returns {Hooks}\n */\nexport function bindModelHooks({\n\twhere, \n\tbeforeCreateMany, afterCreateMany,\n\tbeforeCreate, afterCreate,\n\tbeforeUpdate, afterUpdate,\n\tbeforeDelete, afterDelete,\n}, ...hookNames) {\n\t/** @type {string[]} */\n\tconst names = hookNames.flat(21);\n\treturn {\n\t\twhere: where || (() => {}),\n\t\tasync beforeCreateMany(conn, model, record) {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeCreateMany === 'function') {\n\t\t\t\tdata = await beforeCreateMany(conn, model, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterCreateMany(conn, model, record) {\n\t\t\tif (typeof afterCreateMany === 'function') {\n\t\t\t\tawait afterCreateMany(conn, model, record);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeCreate(conn, model, record) {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeCreate === 'function') {\n\t\t\t\tdata = await beforeCreate(conn, model, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterCreate(conn, model, record) {\n\t\t\tif (typeof afterCreate === 'function') {\n\t\t\t\tawait afterCreate(conn, model, record);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeUpdate(conn, model, record, set) {\n\t\t\tlet data = set;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, record, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeUpdate === 'function') {\n\t\t\t\tdata = await beforeUpdate(conn, model, record, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterUpdate(conn, model, record, oldRecord) {\n\t\t\tif (typeof afterUpdate === 'function') {\n\t\t\t\tawait afterUpdate(conn, model, record, oldRecord);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, oldRecord);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeDelete(conn, model, record, update) {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeDelete === 'function') {\n\t\t\t\tawait beforeDelete(conn, model, record, update);\n\t\t\t}\n\t\t},\n\t\tasync afterDelete(conn, model, record, update) {\n\t\t\tif (typeof afterDelete === 'function') {\n\t\t\t\tawait afterDelete(conn, model, record, update);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n/**\n * \n * @param {...string | string[]} hookNames \n * @returns {ClassDecorator}\n */\nexport default function modelHook(...hookNames) {\n\t/** @type {string[]} */\n\tconst names = hookNames.flat(21);\n\treturn (Model, ctx) => {\n\t\tif (!names.length) { return; }\n\t\tbeforeCreateMany(Model, async (conn, model, record) => {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterCreateMany(Model, async (conn, model, record) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeCreate(Model, async (conn, model, record) => {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterCreate(Model, async (conn, model, record) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeUpdate(Model, async (conn, model, record, set) => {\n\t\t\tlet data = set;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, record, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterUpdate(Model, async (conn, model, record, oldRecord) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, oldRecord);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeDelete(Model, async (conn, model, record, update) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tafterDelete(Model, async (conn, model, record, update) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n}\n","export default class ServerError extends Error {\n\tstatus = 500;\n\tcode = '';\n\t/**\n\t * \n\t * @param {string | {code?: string; message: string; status?: number}} message \n\t * @param {number} [status] \n\t */\n\tconstructor(message, status = 500) {\n\t\tsuper(typeof message === 'string' ? message : message.message);\n\t\tconst s = typeof message === 'object' && message.status || status;\n\t\tthis.status = s;\n\t\tthis.code = typeof message === 'object' && message.code || String(s);\n\t}\n}\n","/** @import { Hooks } from '@yongdall/model' */\nimport { increment, multiply, Query, Where, coefficient, decrement, Connection, actions } from '@yongdall/model';\nimport ServerError from '../ServerError.mjs';\n\n\n\n\n\n\n/**\n * \n * @param {Connection} conn \n * @param {any} Model \n * @param {number} id \n * @param {number} lftValue \n * @param {number} rgtValue \n * @param {string} idField \n * @param {string} lftField \n * @param {string} rgtField \n */\nasync function treeValidateLoop(conn, Model, id, lftValue, rgtValue, idField, lftField, rgtField) {\n\tconst t = await conn.call(actions.select(\n\t\tnew Query(Model).select(idField)\n\t\t\t.where(lftField, '<=', lftValue)\n\t\t\t.where(rgtField, '>=', rgtValue)\n\t\t\t.where({ [idField]: id })\n\t\t\t.limit(1)\n\t));\n\tif (t.length) { throw new ServerError('项目不能被添加到自己的后代'); }\n}\n/**\n * \n * @param {string} parentField \n * @param {string} lftField \n * @param {string} rgtField \n * @param {string} idField \n * @param {...string} groupFields \n * @returns {Partial<Hooks>}\n */\nexport default function nestedSetTree(parentField, lftField = 'lft', rgtField = 'rgt', idField = 'id', ...groupFields) {\n\n\treturn {\n\t\tasync beforeCreate(conn, Model, record) {\n\t\t\t// 树状结构调整 lft、rgt\n\t\t\tlet begin = 1;\n\t\t\tconst parent = record[parentField];\n\t\t\tconst where = new Where();\n\t\t\tfor (const g of groupFields) {\n\t\t\t\twhere.and(g, record[g]);\n\t\t\t}\n\t\t\tif (parent) {\n\t\t\t\tconst [{ [rgtField]: rgtValue }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true).select(rgtField).where(where).where({ [idField]: parent }).limit(1)\n\t\t\t\t));\n\t\t\t\tbegin = rgtValue;\n\t\t\t\tawait conn.call(actions.update(Model, { [rgtField]: increment(2) }, Where.and(where).and(rgtField, '>=', begin)));\n\t\t\t\tawait conn.call(actions.update(Model, { [lftField]: increment(2) }, Where.and(where).and(lftField, '>=', begin)));\n\t\t\t} else {\n\n\t\t\t\t/** @type {{r: number}[]} */\n\t\t\t\tconst [{ r } = { r: 0 }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true)\n\t\t\t\t\t\t.select({ r: rgtField })\n\t\t\t\t\t\t.where(where)\n\t\t\t\t\t\t.limit(1).sort(rgtField, true)\n\t\t\t\t));\n\t\t\t\tbegin = r + 1;\n\t\t\t}\n\t\t\trecord[lftField] = begin;\n\t\t\trecord[rgtField] = begin + 1;\n\t\t},\n\t\tasync beforeUpdate(conn, Model, oldDocument, updatedData) {\n\t\t\tconst parentId = parentField in updatedData ? updatedData[parentField] : oldDocument[parentField];\n\t\t\tif (parentId === oldDocument[parentField]) {\n\t\t\t\tupdatedData[lftField] = oldDocument[lftField];\n\t\t\t\tupdatedData[rgtField] = oldDocument[rgtField];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst where = new Where();\n\t\t\tfor (const g of groupFields) {\n\t\t\t\twhere.and(g, updatedData[g] ?? oldDocument[g]);\n\t\t\t}\n\t\t\tif (parentId) {\n\t\t\t\tconst [parent] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model).select({ lft: lftField, rgt: rgtField }).where(where).where({ [idField]: parentId })\n\t\t\t\t));\n\t\t\t\tconst { lft, rgt } = parent;\n\t\t\t\t// TODO:\n\t\t\t\tawait treeValidateLoop(conn, Model, oldDocument[idField], lft, rgt, idField, lftField, rgtField);\n\t\t\t}\n\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[rgtField]: multiply(-1),\n\t\t\t\t[rgtField]: multiply(-1),\n\t\t\t}, Where.and(where).and(lftField, '>=', oldDocument[rgtField]).and(rgtField, '<=', oldDocument[rgtField])));\n\n\t\t\tconst diff = oldDocument[rgtField] - oldDocument[lftField] + 1;\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[lftField]: decrement(diff)\n\t\t\t}, Where.and(where).and(lftField, '>', oldDocument[rgtField])));\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[rgtField]: decrement(diff)\n\t\t\t}, Where.and(where).and(rgtField, '>', oldDocument[rgtField])));\n\t\t\tlet newLft = 0;\n\t\t\tif (parentId) {\n\t\t\t\tconst [{ [rgtField]: rgtValue }] = await conn.call(actions.select(new Query(Model).select(rgtField).where(where).where({ [idField]: parentId })));\n\t\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t\t[rgtField]: increment(diff)\n\t\t\t\t}, Where.and(where).and(rgtField, '>=', rgtValue)));\n\t\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t\t[lftField]: increment(diff)\n\t\t\t\t}, Where.and(where).and(lftField, '>=', rgtValue)));\n\t\t\t\tnewLft = rgtValue;\n\t\t\t} else {\n\t\t\t\t/** @type {{r: number}[]} */\n\t\t\t\tconst [{ r } = { r: 0 }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true)\n\t\t\t\t\t\t.select({ r: rgtField })\n\t\t\t\t\t\t.where(where).where({ [idField]: parent })\n\t\t\t\t\t\t.limit(1).sort(rgtField, true)\n\t\t\t\t));\n\t\t\t\tnewLft = r + 1;\n\t\t\t}\n\n\t\t\tconst val = newLft - oldDocument[lftField];\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[lftField]: coefficient(val, -1),\n\t\t\t\t[rgtField]: coefficient(val, -1),\n\t\t\t}, Where.and(where).and(lftField, '<', 0)));\n\t\t\tupdatedData[lftField] = oldDocument[lftField] + val;\n\t\t\tupdatedData[rgtField] = oldDocument[rgtField] + val;\n\n\t\t},\n\t};\n}\n","/** @import { Field } from '@yongdall/types' */\n/** @import { FieldDefine } from '@yongdall/model' */\n\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @param {Set<string>} ignore \n * @returns {Record<string, Field>?}\n */\nfunction toSubDocumentFields(fields, ignore) {\n\t/** @type {Record<string, Field>} */\n\tconst res = {};\n\n\tfor (const [name, { type, ...field }] of Object.entries(fields)) {\n\t\tif (ignore.has(name)) { continue; }\n\t\tif (!type) { continue; }\n\t\tif (typeof type !== 'object' && typeof type !== 'function') {\n\t\t\tres[name] = {\n\t\t\t\ttype,\n\t\t\t\tarray: field.array,\n\t\t\t\tnullable: field.nullable,\n\t\t\t\tdefault: field.default,\n\t\t\t\tscale: field.scale,\n\n\n\t\t\t\tprimary: field.primary,\n\n\t\t\t\tuncreatable: Boolean(field.uncreatable || field.updating || field.creating || field.fixedValue),\n\t\t\t\timmutable: Boolean(field.primary || field.immutable || field.updating || field.creating || field.fixedValue),\n\n\t\t\t\tlayoutOrder: field.layoutOrder,\n\t\t\t\tlabel: field.label,\n\t\t\t\tdescription: field.description,\n\t\t\t\tplaceholder: field.placeholder,\n\n\t\t\t\tstep: field.step,\n\t\t\t\tmax: field.max,\n\t\t\t\tmin: field.min,\n\n\t\t\t\treadonly: field.readonly,\n\t\t\t\trequired: field.required,\n\t\t\t\tclearable: field.clearable,\n\t\t\t\tdisabled: field.disabled,\n\n\t\t\t\tgroup: field.group,\n\t\t\t\trenderer: field.renderer,\n\t\t\t\tscripts: field.scripts,\n\t\t\t\tlayout: field.layout,\n\t\t\t\tmodel: field.model,\n\t\t\t\tsort: field.sort,\n\t\t\t\tsource: field.source,\n\t\t\t\tbind: field.bind,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\n\t\tconst fields = type.fields;\n\t\tif (!fields) { continue; }\n\n\t\tconst names = new Set(Object.keys(field.constraints || {}));\n\t\tconst subFields = toSubDocumentFields(fields, names);\n\t\tif (!subFields) { continue; }\n\t\tres[name] = {\n\t\t\ttype: subFields,\n\t\t\tarray: field.array,\n\t\t\tdefault: field.default,\n\n\t\t\tuncreatable: Boolean(field.uncreatable),\n\t\t\timmutable: Boolean(field.immutable),\n\n\t\t\tlayoutOrder: field.layoutOrder,\n\t\t\tlabel: field.label,\n\t\t\tdescription: field.description,\n\t\t\tplaceholder: field.placeholder,\n\t\t\treadonly: field.readonly,\n\t\t\trequired: field.required,\n\t\t\tclearable: field.clearable,\n\t\t\tdisabled: field.disabled,\n\t\t\tgroup: field.group,\n\t\t\trenderer: field.renderer,\n\t\t\tscripts: field.scripts,\n\t\t\tlayout: field.layout,\n\t\t\tsource: field.source,\n\t\t\tbind: field.bind,\n\t\t};\n\t}\n\tif (!Object.keys(res).length) { return null; }\n\treturn res;\n}\n\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @returns {Record<string, Field>}\n */\nexport default function toDocumentFields(fields) {\n\treturn toSubDocumentFields(fields, new Set()) || {};\n}\n","import { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/** @import { MaybePromise } from './types.mjs' */\n\n/** @type {Promise<Record<string, (Record<string, any> | (() => MaybePromise<Record<string, any>[]>))[]>>} */\nconst enumerationsPromise = LazyPromise.try(async function () {\n\tconst list = await Array.fromAsync(loadPluginProfiles('enumeration', function* (c) {\n\t\tyield* c && typeof c === 'object' && !Array.isArray(c) ? Object.entries(c) : [];\n\t}));\n\tconst groups = Object.groupBy(list, ([k]) => k);\n\treturn Object.fromEntries(\n\t\tObject.entries(groups).map(([k, v]) => [k, v?.map(v => v[1]).flat(2) || []])\n\t);\n});\n\n/**\n * \n * @param {string} name \n * @returns {Promise<Record<string, any>[]>}\n */\nexport async function getEnumerations(name) {\n\tconst allEnumerations = await enumerationsPromise;\n\tif (!Object.hasOwn(allEnumerations, name)) { return []; }\n\tconst enumerations = allEnumerations[name].map(v => typeof v === 'function' ? v() : v);\n\treturn await Promise.all(enumerations).then(v => v.flat());\n}\n","/** @import { MaybePromise, WhereHook } from '../types.mjs' */\n\nimport { Where } from '@yongdall/model';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\n/**\n * \n * @param {MaybePromise<Where?>} [where] \n */\nasync function toNot(where) {\n\tconst w = await where;\n\tif (!w) { return null; }\n\treturn Where.not(w);\n\n}\n/**\n * @template T\n * @param {Record<string, T>} map \n * @param {string} key \n * @param {() => T} create \n */\nfunction select(map, key, create) {\n\tif (Object.hasOwn(map, key)) { return map[key]; }\n\treturn map[key] = create();\n}\n/**\n * @typedef WhereDefine\n * @property {string} label\n * @property {string} notLabel\n * @property {WhereHook.Value[]} value\n * @property {WhereHook.Value[]} notValue\n * @property {WhereHook.Named[]} named\n * @property {WhereHook.Named[]} notNamed\n * @property {WhereHook.Field[]} field\n * @property {WhereHook.Field[]} notField\n */\n/**\n * \n * @returns {WhereDefine}\n */\nfunction createWhereDefine() {\n\treturn { label: '', notLabel: '', value: [], notValue: [], named: [], notNamed: [], field: [], notField: [] };\n\n}\n/**\n * \n * @param {Iterable<[key: string, value: Record<string, WhereHook>]>} whereDefines \n * @returns \n */\n\nfunction getWhere(whereDefines) {\n\t/** @type {Record<string, Record<string, WhereDefine>>} */\n\tconst filterMap = {};\n\t/** @type {Record<string, Record<string, WhereDefine>>} */\n\tconst notFilterMap = {};\n\tfor (const [type, fieldWhere] of whereDefines) {\n\t\tif (!fieldWhere || typeof fieldWhere !== 'object') { continue; }\n\t\tconst typeFilters = select(filterMap, type, () => /** @type {Record<string, WhereDefine>} */({}));\n\t\tconst notTypeFilters = select(notFilterMap, type, () => /** @type {Record<string, WhereDefine>} */({}));\n\n\t\tfor (const [op, filters] of Object.entries(fieldWhere)) {\n\n\t\t\tfor (const filter of [filters].flat()) {\n\t\t\t\tif (!filter || typeof filter !== 'object') { continue; }\n\t\t\t\tlet { label, notLabel, not, value, notValue, named, notNamed, field, notField } = filter;\n\t\t\t\tif (not) {\n\t\t\t\t\tif (typeof value === 'function' && typeof typeof notValue !== 'function') {\n\t\t\t\t\t\tnotValue = (...p) => toNot(value(...p));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof field === 'function' && typeof typeof notField !== 'function') {\n\t\t\t\t\t\tnotField = (...p) => toNot(field(...p));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof named === 'function' && typeof typeof notNamed !== 'function') {\n\t\t\t\t\t\tnotNamed = (...p) => toNot(named(...p));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst typeFilter = select(typeFilters, op, createWhereDefine);\n\t\t\t\tif (label && typeof label === 'string') { typeFilter.label = label; }\n\t\t\t\tif (notLabel && typeof notLabel === 'string') { typeFilter.notLabel = notLabel; }\n\t\t\t\tif (typeof value === 'function') { typeFilter.value.push(value); }\n\t\t\t\tif (typeof notValue === 'function') { typeFilter.notValue.push(notValue); }\n\t\t\t\tif (typeof named === 'function') { typeFilter.named.push(named); }\n\t\t\t\tif (typeof notNamed === 'function') { typeFilter.notNamed.push(notNamed); }\n\t\t\t\tif (typeof field === 'function') { typeFilter.field.push(field); }\n\t\t\t\tif (typeof notField === 'function') { typeFilter.notField.push(notField); }\n\t\t\t\tconst notOp = typeof not === 'string' && not || '';\n\t\t\t\tif (!notOp) { continue; }\n\t\t\t\tconst notTypeFilter = select(notTypeFilters, notOp, createWhereDefine);\n\n\n\t\t\t\tif (label && typeof label === 'string') { notTypeFilter.notLabel = label; }\n\t\t\t\tif (notLabel && typeof notLabel === 'string') { notTypeFilter.label = notLabel; }\n\t\t\t\tif (typeof value === 'function') { notTypeFilter.notValue.push(value); }\n\t\t\t\tif (typeof notValue === 'function') { notTypeFilter.value.push(notValue); }\n\t\t\t\tif (typeof named === 'function') { notTypeFilter.notNamed.push(named); }\n\t\t\t\tif (typeof notNamed === 'function') { notTypeFilter.named.push(notNamed); }\n\t\t\t\tif (typeof field === 'function') { notTypeFilter.notField.push(field); }\n\t\t\t\tif (typeof notField === 'function') { notTypeFilter.field.push(notField); }\n\n\t\t\t}\n\t\t}\n\t}\n\tfor (const type of Object.keys({ ...filterMap, ...notFilterMap })) {\n\t\tlet typeFilters = Object.hasOwn(filterMap, type) && filterMap[type] || null;\n\t\tlet notTypeFilters = Object.hasOwn(notFilterMap, type) && notFilterMap[type] || null;\n\t\tif (!typeFilters && notTypeFilters) {\n\t\t\ttypeFilters = notTypeFilters;\n\t\t\tfilterMap[type] = typeFilters;\n\t\t}\n\t\tif (!typeFilters) { continue; }\n\n\t\tfor (const op of Object.keys({ ...typeFilters, ...notTypeFilters })) {\n\t\t\tlet opFilters = Object.hasOwn(typeFilters, op) && typeFilters[op] || null;\n\t\t\tlet notOpFilters = notTypeFilters && Object.hasOwn(notTypeFilters, op) && notTypeFilters[op] || null;\n\t\t\tif (!opFilters && notOpFilters) {\n\t\t\t\topFilters = notOpFilters;\n\t\t\t\ttypeFilters[type] = opFilters;\n\t\t\t}\n\t\t\tif (!opFilters) { continue; }\n\t\t\tif (!opFilters.label) { opFilters.label = notOpFilters?.label || op; }\n\t\t\tif (!opFilters.notLabel) { opFilters.notLabel = notOpFilters?.notLabel || `!${op}`; }\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\tfor (const fn of notOpFilters.value) { opFilters.value.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notValue) { opFilters.notValue.push(fn); }\n\t\t\tfor (const fn of notOpFilters.named) { opFilters.named.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notNamed) { opFilters.notNamed.push(fn); }\n\t\t\tfor (const fn of notOpFilters.field) { opFilters.field.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notField) { opFilters.notField.push(fn); }\n\n\t\t}\n\n\t}\n\treturn filterMap;\n}\n/**\n * \n * @param {ReturnType<typeof getWhere>} filterMap \n */\nfunction toWhereList(filterMap) {\n\t/** @type {{type: string; operator: string; label: string; notLabel: string; value: boolean; notValue: boolean; named: boolean; notNamed: boolean; field: boolean; notField: boolean}[]} */\n\tconst list = [];\n\tfor (const [type, filters] of Object.entries(filterMap)) {\n\n\t\tfor (const [operator, filter] of Object.entries(filters)) {\n\t\t\tlist.push({\n\t\t\t\ttype, operator,\n\t\t\t\tlabel: filter.label,\n\t\t\t\tnotLabel: filter.notLabel,\n\t\t\t\tvalue: Boolean(filter.value.length),\n\t\t\t\tnotValue: Boolean(filter.notValue.length),\n\t\t\t\tnamed: Boolean(filter.named.length),\n\t\t\t\tnotNamed: Boolean(filter.notNamed.length),\n\t\t\t\tfield: Boolean(filter.field.length),\n\t\t\t\tnotField: Boolean(filter.notField.length),\n\n\t\t\t});\n\n\t\t}\n\n\t}\n\treturn list;\n\n}\n\nexport const wheres = LazyPromise.try(async function () {\n\t/** @type {[string, Record<string, Record<string, WhereHook>>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('where'));\n\treturn getWhere(list.flatMap(v => Object.entries(v[1] || {})));\n});\nexport const whereList = wheres.lazyThen(wheres => toWhereList(wheres));\n","/** @import { FieldDefine } from '@yongdall/model' */\n/** @import { RecursiveArray } from '@yongdall/common' */\nimport { Search } from '@yongdall/common';\nimport { Where } from '@yongdall/model';\nimport { wheres } from './hook.mjs';\n\n\n\n\n\n/**\n * @typedef {object} WhereParam.Value\n * @property {'value'} type\n * @property {FieldDefine} define\n * @property {string} name\n * @property {string?} operator\n * @property {boolean} not\n * @property {string | number | boolean | RecursiveArray<string> | null} value\n */\n/**\n * @typedef {object} WhereParam.Field\n * @property {'field'} type\n * @property {FieldDefine} define\n * @property {string} name\n * @property {FieldDefine} fieldDefine\n * @property {string} field\n * @property {string?} operator\n * @property {boolean} not\n */\n/**\n * @typedef {WhereParam.Value | WhereParam.Field} WhereParam\n */\n\n/**\n * \n * @param {Search.ToWhere<Record<string, FieldDefine>, WhereParam, Where>} toWhere \n * @param {Record<string, FieldDefine>} fields \n * @param {Search.Match | Search.Children} and\n * @returns {Generator<WhereParam, Where?, Where?>}\n */\nfunction* buildWhere(toWhere, fields, and) {\n\tconst fieldNames = and[0];\n\tif (fieldNames.find(v => Array.isArray(v) && v.length > 1)) { return null; }\n\tconst path = fieldNames.map(v => typeof v === 'string' ? v : v[0]);\n\n\tconst name = path.shift();\n\tif (!name) { return null; }\n\tconst define = Object.hasOwn(fields, name) && fields[name];\n\tif (!define) { return null; }\n\tconst type = define.type;\n\tif (!type) { return null; }\n\n\tif (path.length) {\n\t\tif (typeof type !== 'object') { return null; }\n\t\tconst table = type.table;\n\t\tif (!table) { return null; }\n\t\t// TODO:\n\t\treturn null;\n\t}\n\n\tif (and.length === 2) {\n\t\tif (typeof type !== 'object') { return null; }\n\t\tconst table = type.table;\n\t\tif (!table) { return null; }\n\t\t// TODO:\n\t\treturn null;\n\t}\n\tif (typeof type !== 'string' && (typeof type !== 'object' || type.table)) {\n\t\treturn null;\n\t}\n\n\tconst [, value, operator, sign] = and;\n\tif (operator === null) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value: null, operator, not: Boolean(sign) };\n\t}\n\tif (!value || typeof value !== 'object' || Array.isArray(value)) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value, operator, not: Boolean(sign) };\n\t}\n\tconst { field, table, value: rValue } = value;\n\tif (rValue) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value: rValue, operator, not: Boolean(sign) };\n\n\t}\n\n\tif (field) {\n\t\tif (table) { return null; }\n\t\tconst fieldDefine = Object.hasOwn(fields, name) && fields[field];\n\t\tif (!fieldDefine) { return null; }\n\t\tconst type = fieldDefine.type;\n\t\tif (!type) { return null; }\n\t\tif (typeof type !== 'string' && (typeof type !== 'object' || type.table)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn yield { type: 'field', define, name: define.column || name, field: fieldDefine.column || field, fieldDefine, operator, not: Boolean(sign) };\n\t}\n\n\n\n\treturn null;\n\n}\n\n/**\n * \n * @param {string} type\n * @param {string} [renderer] \n * @returns \n */\nfunction getSetKey(type, renderer) {\n\tif (!type || type === '.') {\n\t\tif (!renderer) { return; }\n\t\treturn `:${renderer}`;\n\t}\n\tif (type[0] === '#') { return; }\n\tif (!renderer) { return type; }\n\treturn `${type}:${renderer}`;\n}\n\n/**\n * \n * @param {string | {component: string; [k: string]: any} | (string | {component: string; [k: string]: any})[]} [def] \n * @returns {Iterable<string>}\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;\n\t}\n}\n/**\n * \n * @param {FieldDefine} field \n * @returns {Iterable<string>}\n */\nfunction* getKey(field) {\n\tconst type = field.type;\n\tconst renderers = field.renderer;\n\tconst array = field.array ? '[]' : '';\n\tif (typeof type === 'object') { return; }\n\tif (!type) {\n\t\tfor (const renderer of getRenderer(renderers)) {\n\t\t\tyield `:${renderer}${array}`;\n\t\t\tyield `${renderer}${array}`;\n\t\t}\n\t\t\tyield `${array}`;\n\t\treturn;\n\t}\n\tfor (const renderer of getRenderer(renderers)) {\n\t\tyield `${type}:${renderer}${array}`;\n\t\tyield `${renderer}${array}`;\n\t}\n\tyield `${type}${array}`;\n\tyield `${array}`;\n}\n\n/**\n * \n * @param {WhereParam} param \n */\nasync function execWhere(param) {\n\tconst operator = param.operator;\n\tif (operator === null) {\n\t\treturn Where.and(param.name, '=', null, param.not);\n\t}\n\tconst allWhere = {...await wheres};\n\tfor (const k of getKey(param.define)) {\n\t\tconst typeWhere = Object.hasOwn(allWhere, k) && allWhere[k];\n\t\tif (!typeWhere) { continue; }\n\t\tconst op = Object.hasOwn(typeWhere, operator) && typeWhere[operator];\n\t\tif (!op) { continue; }\n\t\tif (param.type === 'value') {\n\t\t\tfor (const fn of param.not ? op.notValue : op.value) {\n\t\t\t\tconst w = await fn(param.name, param.value, param.define);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (param.type === 'field') {\n\t\t\tfor (const fn of param.not ? op.notField : op.field) {\n\t\t\t\tconst w = await fn(param.name, param.field, param.define, param.fieldDefine);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t}\n\tif (param.type === 'field') {\n\t\tfor (const k of getKey(param.fieldDefine)) {\n\t\t\tconst typeWhere = Object.hasOwn(allWhere, k) && allWhere[k];\n\t\t\tif (!typeWhere) { continue; }\n\t\t\tconst op = Object.hasOwn(typeWhere, operator) && typeWhere[operator];\n\t\t\tif (!op) { continue; }\n\t\t\tfor (const fn of param.not ? op.notField : op.field) {\n\t\t\t\tconst w = await fn(param.field, param.name, param.fieldDefine, param.define);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\n\t\t}\n\t}\n\treturn null;\n\n}\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @param {Search.AndList} [and] \n * @param {Search.OrList} [or] \n * @param {Search.OrList} [or2] \n * @returns {Promise<Where?>}\n */\nexport async function search2where(fields, and, or, or2) {\n\treturn Search.asyncRunGenerator(Search.toWhere({\n\t\tbuild: buildWhere,\n\t\tand(list) {\n\t\t\tif (!list.length) { return null} \n\t\t\tlet where = new Where();\n\t\t\tfor (const w of list) {\n\t\t\t\twhere = where.and(w);\n\t\t\t}\n\t\t\treturn where;\n\t\t},\n\t\tor(list) {\n\t\t\tif (!list.length) { return null} \n\t\t\tlet where = new Where();\n\t\t\tfor (const w of list) {\n\t\t\t\twhere = where.or(w);\n\t\t\t}\n\t\t\treturn where;\n\t\t},\n\t}, fields, and, or, or2), execWhere, null);\n}\n","\n\n/**\n * 使用 HMAC-SHA256 对一个或多个值进行哈希,使用 salt 作为密钥。\n * 输出为 base64url 格式。\n *\n * @param {string | ArrayBuffer | ArrayBufferView<ArrayBuffer>} salt\n * @param {string | number} value\n * @param {...(string | number)} values\n * @returns {Promise<string>}\n */\nexport async function hashSHA256(salt, value, ...values) {\n\t// 1. 准备密钥(salt)\n\t/** @type {ArrayBuffer | ArrayBufferView<ArrayBuffer>} */\n\tlet keyBuffer;\n\tif (salt instanceof ArrayBuffer || ArrayBuffer.isView(salt)) {\n\t\tkeyBuffer = salt;\n\t} else if (typeof salt === 'string') {\n\t\tkeyBuffer = new TextEncoder().encode(salt);\n\t} else {\n\t\tthrow new Error('`salt` 参数必须为字符串或 Uint8Array');\n\t}\n\n\t// 2. 导入 HMAC 密钥\n\tconst cryptoKey = await crypto.subtle.importKey(\n\t\t'raw',\n\t\tkeyBuffer,\n\t\t{ name: 'HMAC', hash: 'SHA-256' },\n\t\tfalse,\n\t\t['sign']\n\t);\n\n\t// 3. 构造输入数据\n\t/** @type {string[]} */\n\tlet data = [];\n\n\t// 处理第一个 value\n\tif (typeof value === 'number') {\n\t\tdata.push(String(value));\n\t} else if (typeof value === 'string') {\n\t\t// JSON.stringify(value).slice(1, -1) 相当于去掉引号,等价于直接编码字符串内容\n\t\tdata.push(JSON.stringify(value).slice(1, -1));\n\t} else {\n\t\tthrow new Error('`value` 参数必须为字符串或数字');\n\t}\n\n\t// 处理后续 values\n\tfor (const v of values) {\n\t\tif (typeof v === 'number') {\n\t\t\tdata.push(String(v));\n\t\t} else if (typeof v === 'string') {\n\t\t\tdata.push(JSON.stringify(v).slice(1, -1));\n\t\t}\n\t}\n\n\t// 合并所有数据\n\tconst messageBuffer = new TextEncoder().encode(data.join('\\n'));\n\n\t// 4. 生成 HMAC\n\tconst signature = await crypto.subtle.sign('HMAC', cryptoKey, messageBuffer);\n\n\t// 5. 转为 base64url 格式\n\tconst base64 = btoa(String.fromCharCode(...new Uint8Array(signature)));\n\treturn base64\n\t\t.replace(/\\+/g, '-')\n\t\t.replace(/\\//g, '_')\n\t\t.replace(/=+$/, ''); // 移除填充\n}\n","/** @import { Realm } from '@yongdall/types' */\nimport './polyfill.mjs';\nimport { initConfig } from './config.mjs';\nexport * from './config.mjs';\nexport * from './menu.mjs';\nexport * from './models.mjs';\nexport { default as useRealm, useSalt } from './realm.mjs';\nexport * from './user.mjs';\nexport * from './visitor.mjs';\nexport * from './permission/index.mjs';\nexport * from './decorators/index.mjs';\nexport { default as ServerError } from './ServerError.mjs';\nexport { default as toDocumentFields } from './toDocumentFields.mjs'\nexport { getEnumerations } from './enumerations.mjs'\nexport { search2where } from './search2where/index.mjs'\nexport * from './safe.mjs';\n\n\n/**\n * \n * @param {Partial<Omit<Realm, 'id'>>} realm \n * @param {object} boot \n * @returns \n */\nexport default function initSystem(realm, boot) {\n\tinitConfig(realm, boot);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["loaders","defaultLogin","finders","existTesters","get"],"sources":["../../packages/core/polyfill.mjs","../../packages/core/config.mjs","../../packages/core/menu.mjs","../../packages/core/models.mjs","../../packages/core/realm.mjs","../../packages/core/user.mjs","../../packages/core/visitor.mjs","../../packages/core/permission/createPermissionMatches.mjs","../../packages/core/permission/testPermissionConstraints.mjs","../../packages/core/permission/filterPermissions.mjs","../../packages/core/permission/filterPermissionDocument.mjs","../../packages/core/permission/filterPermissionUpdate.mjs","../../packages/core/permission/testPermissions.mjs","../../packages/core/decorators/modelHook.mjs","../../packages/core/ServerError.mjs","../../packages/core/decorators/nestedSetTree.mjs","../../packages/core/toDocumentFields.mjs","../../packages/core/enumerations.mjs","../../packages/core/search2where/hook.mjs","../../packages/core/search2where/index.mjs","../../packages/core/safe.mjs","../../packages/core/token/IdentityToken.mts","../../packages/core/index.mjs"],"sourcesContent":["if (!Symbol.metadata) {\n\tSymbol.metadata = Symbol.for(\"Symbol.metadata\");\n}\n","/** @import { Realm } from '@yongdall/types' */\n/** @import { BootConfiguration } from '@yongdall/common' */\n\n\n\n/** @type {Realm} */\nexport const mainRealm = {\n\tid: '',\n\tlabel: '拥道YongDall',\n\tsingle: false,\n\tproviders: {},\n\tsalt: 'YongDall',\n}\n/** @type {BootConfiguration} */\nexport const bootConfiguration = {\n\tpages: {},\n\ttheme: '@yongdall/theme#allSider',\n\tauthenticator: '',\n\t// route: '@yongdall/route-symbol',\n\tpath: '/workbench/',\n}\n/**\n * \n * @param {Partial<Omit<Realm, 'id'>>} realm \n * @param {object} boot \n * @returns \n */\nexport function initConfig({label, single, providers, salt}, boot) {\n\tObject.assign(bootConfiguration, boot);\n\n\tmainRealm.label = typeof label === 'string' && label || '拥道YongDall';\n\tmainRealm.single = Boolean(single);\n\tif (salt) { mainRealm.salt = salt; }\n\tmainRealm.providers = Object.fromEntries(\n\t\tObject.entries(typeof providers === 'object' && providers || {})\n\t\t.filter(([k,v]) => typeof v === 'string' && v),\n\t);\n}\n","/**\n * \n * @param {string} type \n * @param {string} [group] \n * @returns \n */\nexport function getMenus(type, group = '') {\n\t/** @type {any} */\n\tconst menus = [];\n\treturn menus\n}\n","/** @import { Permission } from '@yongdall/types' */\n/** @import { FieldDefine, Fields, ModelTable, TableDefine } from '@yongdall/model' */\n/** @import { ModelProfile } from './types.mjs' */\nimport { expandModel, getDefinePermission } from '@yongdall/model';\nimport { createKeyStore } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\nconst ModelProfilePromise = LazyPromise.try(async function () {\n\tconst list = await Array.fromAsync(loadPluginProfiles('model', (/** @type {ModelProfile}*/v) => [v]));\n\treturn list;\n});\nconst modelsPromise = ModelProfilePromise.lazyThen(list => {\n\treturn Object.fromEntries(list.flatMap(v => Object.entries(v.models || {})));\n});\nconst modelLoadersPromise = ModelProfilePromise.lazyThen(list => {\n\treturn Object.fromEntries(list.flatMap(v => Object.entries(v.modelLoaders || {})));\n});\nconst getModelPermissionsHooksPromise = ModelProfilePromise.lazyThen(list => {\n\treturn list.map(v => v.getModelPermissions).filter(v => typeof v === 'function');\n});\nconst modelExpandsPromise = ModelProfilePromise.lazyThen(list => {\n\tconst modelFields = list.flatMap(v => Object.entries(v.modelExpands || {}))\n\t\t.flatMap(([modelId, fields]) => [fields].flatMap(v => {\n\t\t\tif (!v || typeof v !== 'object' || Array.isArray(v)) { return []; }\n\t\t\t/** @type {[modelId:string, fieldName:string, field: FieldDefine<TableDefine>][]} */\n\t\t\tconst data = Object.entries(v).map(([fieldName, field]) => [modelId, fieldName, field]);\n\t\t\treturn data;\n\t\t}));\n\tconst groups = Object.groupBy(modelFields, v => v[0]);\n\t/** @type {Record<string, Fields<TableDefine>>} */\n\tconst expands = {};\n\tfor (const [modelId, fields] of Object.entries(groups)) {\n\t\tif (!fields?.length) { continue; }\n\t\texpands[modelId] = Object.fromEntries(fields.map(([, fieldName, field]) => [fieldName, field]));\n\t}\n\treturn expands;\n});\nconst modelMap = new WeakMap();\n\n\n/**\n * \n * @param {string | string[]} ident \n * @returns {Promise<ModelTable?>}\n */\nexport async function findModel(ident) {\n\tconst [model, ...collection] = (Array.isArray(ident) ? ident : ident.split(':')).filter(Boolean);\n\tif (!collection.length) {\n\t\tconst models = await modelsPromise;\n\t\tconst define = Object.hasOwn(models, model) && models[model];\n\t\treturn (typeof define === 'object' || typeof define === 'function') && define || null;\n\t}\n\tconst modelLoaders = await modelLoadersPromise;\n\tconst loader = Object.hasOwn(modelLoaders, model) && modelLoaders[model];\n\tif (typeof loader !== 'function') { return null; }\n\tconst define = await loader(collection);\n\treturn (typeof define === 'object' || typeof define === 'function') && define || null;\n}\n/**\n * \n * @param {string | string[]} ident \n * @returns {Promise<ModelTable?>}\n */\nexport async function getModel(ident) {\n\tconst model = await findModel(ident);\n\tif (!model) { return model; }\n\tconst define = modelMap.get(model);\n\tif (define) { return define; }\n\tconst modelIdent = Array.isArray(ident) ? ident.join(':') : ident;\n\tconst modelExpands = await modelExpandsPromise;\n\tconst expandedModel = Object.hasOwn(modelExpands, modelIdent) ? modelExpands[modelIdent] : {};\n\tconst newDefine = expandModel(model, expandedModel);\n\t// TODO: 动态扩展不缓存\n\tmodelMap.set(model, newDefine);\n\treturn newDefine;\n}\n\n\n/** @type {(modelId: string, groupId?: string?) => Promise<Permission[]?>} */\nexport const getModelPermissions = createKeyStore(async (modelId, groupId) => {\n\tfor (const fn of await getModelPermissionsHooksPromise) {\n\t\tconst permissions = await fn(modelId, groupId);\n\t\tif (permissions) { return permissions; }\n\t}\n\tif (groupId) { return null; }\n\treturn getDefinePermission(await getModel(modelId));\n}, (modelId, groupId) => [modelId, groupId || ''].join('\\n'));\n\n/**\n * \n * @param {string} modelId \n * @param {string} authorization\n * @param {string?} [groupId] \n * @returns {Promise<Permission[]?>}\n */\nexport async function getModelAuthorizationPermissions(modelId, authorization, groupId) {\n\tconst permissions = await getModelPermissions(modelId, groupId);\n\tif (!permissions?.length) { return permissions; }\n\treturn permissions.filter(({ authorizations }) => {\n\t\tif (!authorizations) { return false; }\n\t\tif (Array.isArray(authorizations)) {\n\t\t\treturn authorizations.includes(authorization);\n\t\t}\n\t\tif (authorizations instanceof Set) {\n\t\t\treturn authorizations.has(authorization);\n\t\t}\n\t\treturn false;\n\t});\n}\n","/** @import { Realm } from '@yongdall/types' */\n/** @import { RealmHook } from './types.mjs' */\nimport { createStoreSerializable } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\nimport { mainRealm } from './config.mjs';\nconst [realmIdGetter, realmIdSetter] = createStoreSerializable('realmStatus', async (/** @type {Promise<string?> | string | null} */realmId) => {\n\treturn { realm: await realmId || null };\n}, (/** @type {{realm?: string?;}?} */val) => {\n\treturn Promise.resolve(val?.realm || null);\n}, /** @type {Promise<string?> | string | null} */(null));\n\n\nconst hooks = LazyPromise.try(async function () {\n\t/** @type {[string, Partial<RealmHook>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('realm'));\n\treturn list.map(v => v[1]);\n});\n\n/**\n * \n * @param {string} realmId \n * @returns {Promise<boolean>}\n */\nexport async function existRealm(realmId) {\n\tfor (const { exist, load } of await hooks) {\n\t\tif (typeof exist === 'function') {\n\t\t\tif (await exist(realmId)) { return true; }\n\t\t} else if (typeof load === 'function') {\n\t\t\tif (await load(realmId)) { return true; }\n\t\t}\n\t}\n\treturn false;\n}\n\nconst getters = hooks.lazyThen(hooks => hooks.map(v => v.get).filter(v => typeof v === 'function'));\n\n/**\n * \n * @returns {Promise<string?>}\n */\nasync function getCurrentRealm() {\n\tfor (const get of await getters) {\n\t\tconst realm = await get();\n\t\tif (!realm || !await existRealm(realm)) { continue; }\n\t\treturn realm;\n\t}\n\treturn null;\n}\n\n/**\n * \n * @returns {Promise<string?>}\n */\nexport async function useRealmId() {\n\tlet state = realmIdGetter();\n\tif (!state) {\n\t\tstate = getCurrentRealm();\n\t\trealmIdSetter(state);\n\t}\n\treturn state;\n}\n\nconst loaders = hooks.lazyThen(hooks => hooks.map(v => v.load).filter(v => typeof v === 'function'));\n/**\n * \n * @param {string} realmId \n * @returns {Promise<Realm?>}\n */\nexport async function loadRealm(realmId) {\n\tfor (const load of await loaders) {\n\t\tconst realm = await load(realmId);\n\t\tif (realm) { return realm; }\n\t}\n\treturn null;\n\n\n}\n\n\n\n\n/**\n * \n * @returns {Promise<Realm>}\n */\nexport default async function useRealm() {\n\treturn useRealmId().then(async id => {\n\t\tif (!id) { return mainRealm; }\n\t\tconst realm = await loadRealm(id);\n\t\tif (realm) { return realm; }\n\t\tthrow new Error('[noRealm] 找不到域');\n\t});\n}\nexport function useSalt() {\n\treturn useRealm().then(r => r.salt);\n}\n","/** @import { Permissions, Realm } from '@yongdall/types' */\n/** @import { UserManager, MaybePromise } from './types.mjs' */\nimport { createKeyStore, createStoreSerializable } from '@yongdall/context';\nimport { isFunction, LazyPromise } from '@yongdall/common';\nimport useRealm from './realm.mjs';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/**\n * @typedef {[result: string | null, UserManager['set'] | null, UserManager['exit'] | null, user: string | null, sUser: string | null]} UserState\n */\nconst [userGetter, userSetter] = createStoreSerializable('userStatus', async (/** @type {Promise<UserState> | UserState | null} */state) => {\n\tif (!state) { return null; }\n\tconst s = await state;\n\treturn { user: s[3], sUser: s[4] };\n}, (/** @type {{user?: string?;userSystem?: string?;sUser?: string?;sUserSystem?: string?;}?} */val) => {\n\tif (!val) { return null; }\n\tconst { user: userId, sUser: sUserId } = val;\n\treturn Promise.resolve(/** @type {UserState} */([null, null, null, userId, sUserId]));\n}, /** @type {Promise<UserState> | UserState | null} */(null));\n\n\nconst userManagerMap = LazyPromise.try(async function () {\n\t/** @type {[string,UserManager, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('user'));\n\treturn list;\n});\n\nconst userManagers = userManagerMap.lazyThen(list => list.map(v => v[1]));\nconst defaultLogin = userManagers.lazyThen(userMangers => {\n\t/**\n\t * @param {string} user\n\t */\n\treturn async function defaultLogin(user) {\n\t\tfor (const {login} of userMangers) {\n\t\t\tif (typeof login !== 'function') { continue; }\n\t\t\tconst r = await login(user);\n\t\t\tif (r) { return r; }\n\t\t}\n\t\treturn false;\n\t}\n});\n\nconst switchableListPromise = userManagers.lazyThen(userMangers => {\n\tconst switchableList = userMangers.map(v => v.switchable).filter(isFunction);\n\t/**\n\t * @param {Realm} realm \n\t * @param {string} user \n\t * @param {string} sUser \n\t * @returns {Promise<boolean>}\n\t */\n\treturn async function switchable(realm, user, sUser) {\n\t\tif (!switchableList.length) { return false; }\n\t\tfor (const s of switchableList) {\n\t\t\tif (await s(user, sUser)) { continue; }\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n});\n\n\n\nconst suGets = userManagers.lazyThen(userMangers => {\n\t/** @type {(() => MaybePromise<string?>)[]} */\n\treturn userMangers.map(v => v.suGet).filter(isFunction);\n});\n\nconst finders = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.find).filter(v => typeof v === 'function');\n});\n\n\nconst loaders = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.load).filter(v => typeof v === 'function');\n});\nconst existTesters = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.exist).filter(v => typeof v === 'function');\n});\n\nconst getPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getPermissions).filter(v => typeof v === 'function');\n});\n\nconst getOrganizationPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getOrganizationPermissions).filter(v => typeof v === 'function');\n});\n\nconst getOrganizationAllPermissions = userManagers.lazyThen(userMangers => {\n\treturn userMangers.map(v => v.getOrganizationAllPermissions).filter(v => typeof v === 'function');\n});\n\nconst getLoggedUserFn = userManagers.lazyThen(userMangers => {\n\t/** @type {[UserManager['get'], UserManager['set'] | null, UserManager['exit'] | null][]} */\n\tconst getLoggedUserFn = [];\n\tfor (const { get, set, exit } of userMangers) {\n\t\tif (typeof get === 'function') {\n\t\t\tgetLoggedUserFn.push([get, set || null, exit || null]);\n\t\t}\n\t}\n\n\treturn getLoggedUserFn;\n});\n\nconst verifiersPromise = userManagers.lazyThen(userMangers => {\n\tconst list = userMangers.map(v => v).flatMap(v => Object.entries(v.verify || {}));\n\treturn Object.fromEntries(\n\t\tObject.entries(Object.groupBy(list, v => v[0])).map(([k, v]) => [k, v?.map(v => v[1]) || []])\n\t);\n});\n\n\n\nconst setVerifiersPromise = userManagers.lazyThen(userMangers => {\n\tconst list = userMangers.map(v => v).flatMap(v => Object.entries(v.setVerify || {}));\n\treturn Object.fromEntries(\n\t\tObject.entries(Object.groupBy(list, v => v[0])).map(([k, v]) => [k, v?.map(v => v[1]) || []])\n\t);\n});\n\n\n\n\n\n\n\n\n\n\n\n/**\n * \n * @param {string} userId \n * @param {boolean} [login] \n * @returns {Promise<boolean>}\n */\nexport async function existUser(userId, login) {\n\tfor (const fn of await existTesters) {\n\t\tif (await fn(userId, login)) { return true; }\n\t}\n\treturn false;\n}\n\n/**\n * \n * @returns {Promise<UserState>}\n */\nasync function getLoggedUser() {\n\tconst realm = await useRealm();\n\tif (realm.single) {\n\t\tfor (const suGet of await suGets) {\n\t\t\tconst suUser = await suGet();\n\t\t\tif (!suUser) { continue; }\n\t\t\tif (!await existUser(suUser)) { continue; }\n\t\t\treturn [null, null, null, null, suUser];\n\t\t}\n\t\treturn [null, null, null, null, null];\n\t}\n\n\n\n\t/** @type {UserManager['set']?} */\n\tlet setUser = null;\n\t/** @type {UserManager['exit']?} */\n\tlet exitUser = null;\n\t/** @type {string?} */\n\tlet user = null;\n\n\tfor (const [get, set, exit] of await getLoggedUserFn) {\n\t\tconst u = await get();\n\t\tif (!u || !await existUser(u)) { continue; }\n\t\tuser = u;\n\t\tsetUser = set;\n\t\texitUser = exit;\n\t\tbreak;\n\t}\n\tif (!user) { return [null, await defaultLogin, null, null, null]; }\n\tfor (const suGet of await suGets) {\n\t\tconst suUser = await suGet();\n\t\tif (!suUser) { continue; }\n\t\tif (!await existUser(suUser)) { continue; }\n\t\tconst switchable = await switchableListPromise;\n\t\tif (await switchable(realm, user, suUser)) { continue; }\n\t\treturn [null, setUser, exitUser, user, suUser];\n\t}\n\treturn [null, setUser, exitUser, user, null];\n}\n\n\nasync function get() {\n\tlet state = userGetter();\n\tif (!state) {\n\t\tstate = getLoggedUser();\n\t\tuserSetter(state);\n\t}\n\treturn state;\n}\n/**\n * @param {boolean?} [logged] \n * @returns {Promise<boolean>}\n */\nexport function isSingleUser(logged) {\n\tif (logged) {\n\t\treturn useRealm().then(g => g.single);\n\t}\n\treturn get().then(([, , , su]) => su ? false : useRealm().then(g => g.single));\n}\n\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<string?>}\n */\nexport function getUser(logged) {\n\t// sudo 或自身\n\treturn get().then(([, , , current, su]) => {\n\t\tif (logged === false) { return su; }\n\t\tif (logged) { return current; }\n\t\treturn su || current;\n\t});\n}\n\n/**\n * \n * @param {string?} userId\n * @param {boolean?} [sudo]\n * @returns {Promise<string?>}\n */\nexport function setUser(userId, sudo) {\n\tlet state = Promise.resolve(userGetter() || getLoggedUser());\n\tif (sudo) {\n\t\tstate = state.then(async ([, set, exit, current]) => {\n\t\t\tif (!userId || !await existUser(userId)) { return [null, set, exit, current, null]; }\n\t\t\tif (current || await useRealm().then(t => t.single)) { return [userId, set, exit, current, userId]; }\n\t\t\treturn [null, set, exit, null, null];\n\t\t});\n\t} else {\n\t\tstate = state.then(async ([, set, exit, current, su]) => {\n\t\t\tif (!userId) {\n\t\t\t\tif (current && exit) {\n\t\t\t\t\tawait exit(current);\n\t\t\t\t}\n\t\t\t\treturn [null, set, exit, null, null];\n\t\t\t}\n\t\t\tif (!set) { return [current, set, exit, current, su]; }\n\t\t\tconst realm = await useRealm();\n\t\t\tif (realm.single) { return [null, set, exit, null, su]; }\n\t\t\t// TODO: 判断用户是否存在\n\t\t\tconst res = await set(userId);\n\t\t\tif (!res) {\n\t\t\t\treturn [null, set, exit, current, su];\n\t\t\t}\n\t\t\treturn [userId, set, typeof res === 'function' ? res : exit, userId, null];\n\t\t});\n\t}\n\tuserSetter(state);\n\treturn state.then(v => v[0]);\n}\n\n\n\n/**\n * \n * @param {string | Record<string, unknown>} loginName \n * @param {string | string[]} [loginType] \n * @returns {Promise<string>}\n */\nexport async function findUser(loginName, loginType) {\n\tconst types = new Set([loginType || ''].flat().filter(Boolean));\n\tfor (const fn of await finders) {\n\t\tconst userId = await fn(loginName, types);\n\t\tif (userId) { return userId; }\n\t}\n\treturn '';\n}\n\n/**\n * \n * @param {string} userId \n * @param {string} password \n * @param {string} type \n * @param {boolean} [returnError] \n * @returns {Promise<number>}\n */\nexport async function verifyUser(userId, password, type, returnError) {\n\tconst verifiers = await verifiersPromise;\n\tif (!Object.hasOwn(verifiers, type)) { return 0; }\n\tfor (const fn of verifiers[type] || []) {\n\t\tconst res = await fn(userId, password);\n\t\tif (res < 0) { return returnError ? res : 0; }\n\t\tif (res > 0) { return res; }\n\t}\n\treturn 0;\n}\n\n/**\n * \n * @param {string} userId \n * @param {string} type \n * @param {string?} password \n * @param {Date?} [deadline] \n * @returns {Promise<boolean>}\n */\nexport async function setUserVerify(userId, type, password, deadline) {\n\tconst setVerifiers = await setVerifiersPromise;\n\tif (!Object.hasOwn(setVerifiers, type)) { return false; }\n\tfor (const fn of setVerifiers[type] || []) {\n\t\tif (await fn(userId, password, deadline)) { return true; }\n\t}\n\treturn false;\n}\n\n/** @type {(user?: string?) => Promise<Set<string>>} */\nexport const loadUserPermissions = createKeyStore(async user => {\n\tif (!user) { return new Set(); }\n\tfor (const f of await getPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) { return new Set(r); }\n\t}\n\treturn new Set();\n}, user => user || '');\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Permissions>}\n */\nexport async function getUserPermissions(logged) {\n\tif (await isSingleUser(logged)) {\n\t\treturn { size: -1, has() { return true; } };\n\t}\n\treturn loadUserPermissions(await getUser(logged));\n}\n/**\n * \n * @param {string} permission \n * @param {boolean?} [logged] \n */\nexport async function hasUserPermission(permission, logged) {\n\tif (await isSingleUser(logged)) { return true; }\n\tconst permissions = await loadUserPermissions(await getUser(logged));\n\treturn permissions.has(permission);\n}\n\n/** @type {(user?: string?) => Promise<Set<string>>} */\nexport const loadUserOrganizationAllPermissions = createKeyStore(async user => {\n\tif (!user) { return new Set(); }\n\tfor (const f of await getOrganizationAllPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) { return new Set(r); }\n\t}\n\treturn new Set();\n}, user => user || '');\n\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Permissions>}\n */\nexport async function getUserOrganizationAllPermissions(logged) {\n\tif (await isSingleUser(logged)) {\n\t\treturn { size: -1, has() { return true; } };\n\t}\n\treturn loadUserOrganizationAllPermissions(await getUser(logged));\n}\n\n/** @type {(user?: string?) => Promise<Record<string, Set<string>>>} */\nexport const loadUserOrganizationPermissions = createKeyStore(async user => {\n\tif (!user) { return Object.create(null); }\n\tfor (const f of await getOrganizationPermissions) {\n\t\tconst r = await f(user);\n\t\tif (r) {\n\t\t\treturn Object.assign(\n\t\t\t\tObject.create(null),\n\t\t\t\tObject.fromEntries(Object.entries(r).map(([k, v]) => [k, new Set(v)])),\n\t\t\t);\n\t\t}\n\t}\n\treturn Object.create(null);\n}, user => user || '');\n\n/**\n * \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<Record<string, Set<string>>?>}\n */\nexport async function getUserOrganizationPermissions(logged) {\n\tif (await isSingleUser(logged)) { return null; }\n\treturn loadUserOrganizationPermissions(await getUser(logged));\n}\n\n/**\n * \n * @overload\n * @param {string} permission \n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @overload\n * @param {string} permission \n * @param {string} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @overload\n * @param {string} permission \n * @param {string | boolean | null} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\n/**\n * \n * @param {string} permission \n * @param {string | boolean | null} [organization]\n * @param {boolean?} [logged] 是否为登陆用户\n * @returns {Promise<boolean>}\n */\nexport async function hasUserOrganizationPermissions(permission, organization, logged) {\n\tif (await isSingleUser(typeof organization === 'string' ? logged : organization)) {\n\t\treturn true;\n\t}\n\tif (typeof organization !== 'string') {\n\t\tconst permissions = await loadUserOrganizationAllPermissions(await getUser(logged));\n\t\treturn permissions.has(permission);\n\t}\n\tconst organizations = await loadUserOrganizationPermissions(await getUser(logged));\n\tif (!Object.hasOwn(organizations, organization)) { return false; }\n\tconst permissions = organizations[organization];\n\tif (!permissions) { return false; }\n\tif (!permission) { return true; }\n\treturn permissions.has(permission);\n}\n\n\nconst userPluginLoaders = userManagerMap.lazyThen(list => {\n\t/** @type {[string, UserManager['load']][]} */\n\tconst userMangers = list.map(([k, v]) => [k, v?.loadPlugin]);\n\t/** @type {[string, UserManager['load']][]} */\n\tconst loaders = userMangers.filter(([, v]) => typeof v === 'function');\n\treturn loaders;\n});\n/**\n * \n * @param {string} userId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadPluginUser(userId) {\n\tconst loaders = await userPluginLoaders;\n\tconst list2 = await Promise.all(loaders.map(([p, f]) => Promise.all([p, f(userId)])));\n\tconst plugins = Object.fromEntries(Object.entries(Object.groupBy(list2, ([k]) => k)).map(([k, l]) => {\n\t\treturn [k, Object.assign({}, ...l?.map(v => v[1]) || [])];\n\t}));\n\treturn plugins;\n}\n/**\n * \n * @param {string} userId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadUser(userId, plugin = false) {\n\tconst [\n\t\tlist,\n\t\tplugins,\n\t\tpermissions,\n\t\torganizationPermissions,\n\t] = await Promise.all([\n\t\tloaders.then(loaders => Promise.all(loaders.map(f => f(userId)))),\n\t\tplugin ? loadPluginUser(userId) : {},\n\t\tloadUserPermissions(userId).then(p => [...p]),\n\t\tloadUserOrganizationPermissions(userId).then(p => Object.fromEntries(\n\t\t\tObject.entries(p).map(([k, v]) => [k, [...v]])\n\t\t)),\n\t]);\n\treturn Object.assign({}, ...list, {\n\t\tid: userId,\n\t\tplugins,\n\t\tpermissions,\n\t\torganizationPermissions,\n\t});\n}\n","/** @import { VisitorManager } from './types.mjs' */\nimport { createStoreSerializable } from '@yongdall/context';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/**\n * @typedef {[result: string | null, VisitorManager['set'] | null, VisitorManager['exit'] | null, visitor: string | null]} VisitorState\n */\nconst [visitorGetter, visitorSetter] = createStoreSerializable('visitorStatus', async (/** @type {Promise<VisitorState> | VisitorState | null} */state) => {\n\tif (!state) { return null; }\n\tconst s = await state;\n\treturn { visitor: s[3] };\n}, (/** @type {{visitor?: string?}?} */val) => {\n\tif (!val) { return null; }\n\tconst { visitor: visitorId } = val;\n\treturn Promise.resolve(/** @type {VisitorState} */([null, null, null, visitorId]));\n}, /** @type {Promise<VisitorState> | VisitorState | null} */(null));\n\n\nconst visitors = LazyPromise.try(async function () {\n\t/** @type {[string, Partial<VisitorManager>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('visitor'));\n\treturn list.map(v => v[1]);\n});\n\n\nconst existTesters = visitors.lazyThen(v => v.map(v => v.exist).filter(v => typeof v === 'function'));\n\n\n/**\n * \n * @param {string} visitorId \n * @returns {Promise<boolean>}\n */\nexport async function existVisitor(visitorId) {\n\tfor (const fn of await existTesters) {\n\t\tif (await fn(visitorId)) { return true; }\n\t}\n\treturn false;\n}\n\nconst getLoggedVisitorFn = visitors.lazyThen(list => {\n\t/** @type {[VisitorManager['get'], VisitorManager['set'] | null, VisitorManager['exit'] | null][]} */\n\tconst getLoggedVisitorFn = [];\n\tfor (const { get, set, exit } of list) {\n\t\tif (typeof get !== 'function') { continue; }\n\t\tgetLoggedVisitorFn.push([get, set || null, exit || null]);\n\t}\n\treturn getLoggedVisitorFn;\n});\n\nconst defaultLogin = visitors.lazyThen(visitorManager => {\n\t/**\n\t * @param {string} user\n\t */\n\treturn async function defaultLogin(user) {\n\t\tfor (const {login} of visitorManager) {\n\t\t\tif (typeof login !== 'function') { continue; }\n\t\t\tconst r = await login(user);\n\t\t\tif (r) { return r; }\n\t\t}\n\t\treturn false;\n\t}\n\n\n\n});\n\n/**\n * \n * @returns {Promise<VisitorState>}\n */\nasync function getLoggedVisitor() {\n\t/** @type {VisitorManager['set']?} */\n\tlet setVisitor = null;\n\t/** @type {VisitorManager['exit']?} */\n\tlet exitVisitor = null;\n\t/** @type {string?} */\n\tlet visitor = null;\n\n\tfor (const [get, set, exit] of await getLoggedVisitorFn) {\n\t\tconst u = await get();\n\t\tif (!u || !await existVisitor(u)) { continue; }\n\t\tvisitor = u;\n\t\tsetVisitor = set;\n\t\texitVisitor = exit;\n\t\tbreak;\n\t}\n\tif (!visitor) { return [null, await defaultLogin, null, null]; }\n\treturn [null, setVisitor, exitVisitor, visitor];\n}\n\n\nasync function get() {\n\tlet state = visitorGetter();\n\tif (!state) {\n\t\tstate = getLoggedVisitor();\n\t\tvisitorSetter(state);\n\t}\n\treturn state;\n}\n\n/**\n * \n * @returns {Promise<string?>}\n */\nexport function getVisitor() {\n\treturn get().then(([, , , current]) => current);\n}\n\n/**\n * \n * @param {string?} visitorId\n * @returns {Promise<string?>}\n */\nexport function setVisitor(visitorId) {\n\tlet state = Promise.resolve(visitorGetter() || getLoggedVisitor());\n\n\tstate = state.then(async ([, set, exit, current]) => {\n\t\tif (!visitorId) {\n\t\t\tif (current && exit) {\n\t\t\t\tawait exit(current);\n\t\t\t}\n\t\t\treturn [null, set, exit, null];\n\t\t}\n\t\tif (!set) { return [current, set, exit, current]; }\n\t\tconst res = await set(visitorId);\n\t\tif (!res) {\n\t\t\treturn [null, set, exit, current];\n\t\t}\n\t\treturn [visitorId, set, typeof res === 'function' ? res : exit, visitorId];\n\t});\n\tvisitorSetter(state);\n\treturn state.then(v => v[0]);\n}\n\n\n\nconst finders = visitors.lazyThen(v => v.map(v => v.find).filter(v => typeof v === 'function'));\n/**\n * \n * @param {Record<string, unknown>} loginName \n * @returns {Promise<string>}\n */\nexport async function findVisitor(loginName) {\n\tfor (const fn of await finders) {\n\t\tconst visitorId = await fn(loginName);\n\t\tif (visitorId) { return visitorId; }\n\t}\n\treturn '';\n}\n/**\n * \n * @param {string} visitorId \n * @returns {Promise<Record<string, any>>}\n */\nexport async function loadVisitor(visitorId) {\n\treturn {\n\t\tid: visitorId,\n\t};\n}\n","/** @import { Permission } from '@yongdall/types' */\n\nimport { Where } from '@yongdall/model';\nimport { getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions } from '../user.mjs';\n\n/**\n *\n * @param {Exclude<Permission['constraints'], void>?} [constraints]\n * @param {string?} [userId]\n * @returns {Iterable<[string, string, any]>}\n */\nfunction* yieldConstraintWheres(constraints, userId) {\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, '=', value];\n\t\t} else if (Array.isArray(values) && values.length) {\n\t\t\tyield [field, 'in', values];\n\t\t} else if (values instanceof Set && values.size) {\n\t\t\tyield [field, 'in', [...values]];\n\t\t} else if (user && userId) {\n\t\t\tyield [field, '=', userId];\n\t\t}\n\t}\n}\n\n\n\n\n/**\n * @param {Permission[]} permissions\n */\nexport default async function createPermissionMatches(permissions) {\n\tlet permissionInGlobal = permissions.filter(v => !v.organizationField);\n\tconst orWhere = new Where();\n\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tpermissionInGlobal = permissionInGlobal.filter(v => !v.permission || permissions.has(v.permission));\n\t}\n\tconst userId = await getUser();\n\tfor (const { constraints } of permissionInGlobal) {\n\t\tconst wheres = [...yieldConstraintWheres(constraints, userId)];\n\t\tif (!wheres.length) { return null; }\n\t\tconst where = new Where();\n\t\tfor (const v of wheres) {\n\t\t\twhere.and(...v);\n\t\t}\n\t\torWhere.or(where);\n\t}\n\tlet permissionInOrganization = permissions.filter(v => v.organizationField);\n\tif (permissionInOrganization.length) {\n\t\tconst organizationPermissions = await getUserOrganizationAllPermissions();\n\t\tpermissionInOrganization = permissionInOrganization.filter(v => !v.permission || organizationPermissions.has(v.permission));\n\t}\n\tif (!permissionInOrganization.length) { return orWhere; }\n\tif (permissionInOrganization.length) {\n\t\tconst allOrganizationPermissions = await getUserOrganizationPermissions();\n\t\tif (!allOrganizationPermissions) {\n\t\t\tfor (const { constraints } of permissionInOrganization) {\n\t\t\t\tconst where = new Where\n\t\t\t\tfor (const v of yieldConstraintWheres(constraints, userId)) {\n\t\t\t\t\twhere.and(...v);\n\t\t\t\t}\n\t\t\t\torWhere.or(where);\n\t\t\t}\n\n\t\t} else {\n\t\t\tconst organizationPermissions = Object.entries(allOrganizationPermissions);\n\t\t\tfor (const { constraints, permission, organizationField } of permissionInOrganization) {\n\t\t\t\tconst organizations = permission ? organizationPermissions.filter(v => v[1].has(permission)).map(v => v[0]) : organizationPermissions.map(v => v[0]);\n\t\t\t\tif (!organizations.length) { continue; }\n\t\t\t\tconst where = Where.and(organizationField || '', 'in', organizations);\n\t\t\t\tfor (const v of yieldConstraintWheres(constraints, userId)) {\n\t\t\t\t\twhere.and(...v);\n\t\t\t\t}\n\t\t\t\torWhere.or(where);\n\t\t\t}\n\n\t\t}\n\t}\n\treturn orWhere;\n}\n","/** @import { Permission } from '@yongdall/types' */\n/**\n *\n * @param {Exclude<Permission['constraints'], void>} constraints\n * @param {Record<string, any>} document\n * @param {string | boolean | null} userId\n */\nexport default function testPermissionConstraints(constraints, document, userId) {\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 = document[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 (userId !== true && val !== userId) { return false; }\n\t\t}\n\t}\n\treturn true;\n\n}\n","/** @import { Permission } from '@yongdall/types' */\nimport { getUser, getUserOrganizationPermissions, getUserPermissions, isSingleUser } from '../user.mjs';\nimport testPermissionConstraints from './testPermissionConstraints.mjs';\n\n\n/**\n *\n * @param {Permission[]} allPermissions\n * @param {Record<string, any>} document\n * @returns\n */\nexport default async function filterPermissions(allPermissions, document) {\n\tconst permissionInGlobal = allPermissions.filter(v => !v.organizationField);\n\tconst permissionInOrganization = allPermissions.filter(v => v.organizationField);\n\t/** @type {Permission[]} */\n\tconst filteredPermissions = [];\n\tconst userId = await isSingleUser() || await getUser();\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tfor (const p of permissionInGlobal) {\n\t\t\tconst { permission, constraints } = p;\n\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\tfilteredPermissions.push(p);\n\t\t}\n\t}\n\tif (permissionInOrganization.length) {\n\t\tconst permissions = await getUserOrganizationPermissions();\n\t\tif (!permissions) {\n\t\t\tfor (const p of permissionInOrganization) {\n\t\t\t\tconst { organizationField, constraints } = p;\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tfilteredPermissions.push(p);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const p of permissionInOrganization) {\n\t\t\t\tconst { permission, organizationField, constraints } = p;\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tconst organizationPermissions = permissions[organizationId];\n\t\t\t\tif (!organizationPermissions) { continue; }\n\t\t\t\tif (permission && !organizationPermissions.has(permission)) { continue; }\n\t\t\t\tfilteredPermissions.push(p);\n\t\t\t}\n\t\t}\n\t}\n\treturn filteredPermissions;\n\n}\n","/** @import { Permission } from '@yongdall/types' */\n/** @import { ModelTable, FieldDefine } from '@yongdall/model' */\nimport filterPermissions from './filterPermissions.mjs';\n\n/**\n * @param {ModelTable} model\n * @param {Permission[]} permissions\n * @param {Record<string, any>} document\n */\nexport default async function filterPermissionDocument({ fields }, permissions, document) {\n\tconst userPermissions = await filterPermissions(permissions, document);\n\tif (userPermissions && !userPermissions.length) { return null; }\n\tlet groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tlet fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\tif (!(groups.size + fieldsAuth.size)) { return null; }\n\n\t/**\n\t *\n\t * @param {[string, FieldDefine & {group?: string}][]} fields\n\t * @param {Record<string, any>} document\n\t * @param {string[]} parent\n\t * @returns\n\t */\n\tfunction filter(fields, document, parent) {\n\t\t/** @type {Record<string, any>} */\n\t\tconst value = {};\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif (!field.primary && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object' || !type.table) {\n\t\t\t\tvalue[name] = document[name];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst subDocument = document[name];\n\t\t\tconst list = Object.entries(type.fields);\n\t\t\tif (field.array) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue[name] = (Array.isArray(subDocument) ? subDocument : subDocument ? [subDocument] : []).map(doc => filter(list, doc, key));\n\t\t\t} else if (subDocument && !Array.isArray(subDocument)) {\n\t\t\t\tconst val = filter(list, subDocument, fieldNames);\n\t\t\t\tif (!Object.keys(val)) { continue; }\n\t\t\t\tvalue[name] = val;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\n\t}\n\treturn filter(Object.entries(fields), document, []);\n}\n","/** @import { FieldDefine, ModelTable } from '@yongdall/model' */\n/** @import { Permission } from '@yongdall/types' */\nimport filterPermissions from './filterPermissions.mjs';\n\n/**\n * @param {ModelTable} model\n * @param {Permission[]} permissions\n * @param {Record<string, any>} document\n * @param {Record<string, any>} newDocument\n */\nexport default async function filterPermissionUpdate({ fields }, permissions, document, newDocument) {\n\tconst newData = {...newDocument};\n\t/** @type {any} */\n\tconst setData = {};\n\tconst userPermissions = await filterPermissions(permissions, { ...document, ...setData });\n\tif (userPermissions && !userPermissions.length) { return null; }\n\tlet groups = new Set(userPermissions.flatMap(v => v.group || ''));\n\tlet fieldsAuth = new Set(userPermissions.flatMap(v => v.fields || ''));\n\tgroups.delete('');\n\tfieldsAuth.delete('');\n\twhile (groups.size + fieldsAuth.size) {\n\t\tlet n = 0;\n\t\tfor (const [key, value] of Object.entries(newData)) {\n\t\t\t/** @type {FieldDefine & {group?: string}?} */\n\t\t\tconst field = fields[key];\n\t\t\tif (!field) { continue; }\n\t\t\tif (!groups.has(field.group || '') && !fieldsAuth.has(key)) { continue; }\n\t\t\tdelete newData[key]\n\t\t\tsetData[key] = value;\n\t\t\tn++;\n\t\t}\n\t\tif (!n) { break; }\n\t\tconst newPermissionGroups = await filterPermissions(permissions, { ...document, ...setData });\n\t\tif (newPermissionGroups && !newPermissionGroups.length) { break; }\n\t\tconst newGroups = new Set([...groups, ...newPermissionGroups.flatMap(v => v.group || '')]);\n\t\tconst newFieldsAuth = new Set([...fieldsAuth, ...newPermissionGroups.flatMap(v => v.fields || '')]);\n\t\tnewGroups.delete('');\n\t\tnewFieldsAuth.delete('');\n\t\tif (newGroups.size === groups.size && newFieldsAuth.size === fieldsAuth.size) { break; }\n\t\tgroups = newGroups;\n\t\tfieldsAuth = newFieldsAuth;\n\t}\n\tif (!(groups.size + fieldsAuth.size)) { return null; }\n\n\t/**\n\t *\n\t * @param {[string, FieldDefine & {group?: string}][]} fields\n\t * @param {Record<string, any>} document\n\t * @param {string[]} parent\n\t * @returns\n\t */\n\tfunction filter(fields, document, parent) {\n\t\t/** @type {Record<string, any>} */\n\t\tconst value = {};\n\t\tfor (const [name, field] of fields) {\n\t\t\tif (!field) { continue; }\n\t\t\tconst fieldNames = [...parent, name];\n\t\t\tconst key = fieldNames.join('.');\n\t\t\tif ((parent ? !field.primary : true) && !groups.has(field.group || '') && !fieldsAuth.has(key) && !fieldsAuth.has('*')) { continue; }\n\t\t\tif (!Object.hasOwn(document, name)) { continue; }\n\t\t\tconst { type } = field;\n\t\t\tif (!type || typeof type !== 'object' || !type.table) {\n\t\t\t\tvalue[name] = document[name];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst subDocument = document[name];\n\t\t\tconst list = Object.entries(type.fields);\n\t\t\tif (field.array) {\n\t\t\t\tvalue[name] = (Array.isArray(subDocument) ? subDocument : [subDocument]).map(doc => filter(list, doc, fieldNames));\n\t\t\t} else if (subDocument && !Array.isArray(subDocument)) {\n\t\t\t\tconst val = filter(list, subDocument, fieldNames);\n\t\t\t\tif (!Object.keys(val)) { continue; }\n\t\t\t\tvalue[name] = val;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\treturn filter(Object.entries(fields), newDocument, []);\n}\n","import { getUser, getUserOrganizationAllPermissions, getUserOrganizationPermissions, getUserPermissions, isSingleUser } from '../user.mjs';\nimport testPermissionConstraints from './testPermissionConstraints.mjs';\n/** @import { Permission } from '@yongdall/types' */\n/**\n *\n * @param {Permission[]?} [allPermissions]\n * @param {Record<string, any>} [document]\n * @returns\n */\nexport default async function testPermissions(allPermissions, document) {\n\tif (!allPermissions?.length) { return false; }\n\tconst permissionInGlobal = allPermissions.filter(v => !v.organizationField);\n\tconst permissionInOrganization = allPermissions.filter(v => v.organizationField);\n\tif (!document) {\n\t\tif (permissionInGlobal.length) {\n\t\t\tconst permissions = await getUserPermissions();\n\t\t\tfor (const { permission } of permissionInGlobal) {\n\t\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (permissionInOrganization.length) {\n\t\t\tconst permissions = await getUserOrganizationAllPermissions();\n\t\t\tfor (const { permission } of permissionInOrganization) {\n\t\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tconst userId = await isSingleUser() || await getUser();\n\tif (permissionInGlobal.length) {\n\t\tconst permissions = await getUserPermissions();\n\t\tfor (const { permission, constraints } of permissionInGlobal) {\n\t\t\tif (permission && !permissions.has(permission)) { continue; }\n\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (permissionInOrganization.length) {\n\t\tconst permissions = await getUserOrganizationPermissions();\n\t\tif (!permissions) {\n\t\t\tfor (const { organizationField, constraints } of permissionInOrganization) {\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const { permission, organizationField, constraints } of permissionInOrganization) {\n\t\t\t\tif (constraints && !testPermissionConstraints(constraints, document, userId)) { continue; }\n\t\t\t\tconst organizationId = document[organizationField || ''];\n\t\t\t\tif (!organizationId) { continue; }\n\t\t\t\tconst organizationPermissions = permissions[organizationId];\n\t\t\t\tif (!organizationPermissions) { continue; }\n\t\t\t\tif (permission && !organizationPermissions.has(permission)) { continue; }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n\n}\n","/** @import { Hooks, ClassDecorator } from '@yongdall/model' */\n/** @import { ModelProfile } from '../types.mjs' */\nimport { afterCreate, afterCreateMany, afterDelete, afterUpdate, beforeCreate, beforeCreateMany, beforeDelete, beforeUpdate } from '@yongdall/model';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\nconst modelHooksPromise = LazyPromise.try(async function () {\n\t/** @returns {{[K in keyof Hooks]: Record<string, Hooks[K][]>}} */\n\tconst modelHooks = Object.create(null);\n\tconst list = await Array.fromAsync(loadPluginProfiles('model', function *(/** @type {ModelProfile} */{modelHook}) {\n\t\tif (!modelHook || typeof modelHook !== 'object' || Array.isArray(modelHook)) { return; }\n\t\tyield *Object.entries(modelHook)\n\t}));\n\tfor (const [model, v] of Object.entries(list)) {\n\t\tfor (const [name, fn] of Object.entries(v)) {\n\t\t\tif (typeof fn !== 'function') { continue; }\n\t\t\tconst list = modelHooks[name] ||= Object.create(null);\n\t\t\t(list[model] ||= []).push(fn);\n\t\t}\n\t}\n\treturn modelHooks;\n});\n/**\n * \n * @param {Partial<Hooks>} hooks \n * @param {...string | string[]} hookNames \n * @returns {Hooks}\n */\nexport function bindModelHooks({\n\twhere, \n\tbeforeCreateMany, afterCreateMany,\n\tbeforeCreate, afterCreate,\n\tbeforeUpdate, afterUpdate,\n\tbeforeDelete, afterDelete,\n}, ...hookNames) {\n\t/** @type {string[]} */\n\tconst names = hookNames.flat(21);\n\treturn {\n\t\twhere: where || (() => {}),\n\t\tasync beforeCreateMany(conn, model, record) {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeCreateMany === 'function') {\n\t\t\t\tdata = await beforeCreateMany(conn, model, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterCreateMany(conn, model, record) {\n\t\t\tif (typeof afterCreateMany === 'function') {\n\t\t\t\tawait afterCreateMany(conn, model, record);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeCreate(conn, model, record) {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeCreate === 'function') {\n\t\t\t\tdata = await beforeCreate(conn, model, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterCreate(conn, model, record) {\n\t\t\tif (typeof afterCreate === 'function') {\n\t\t\t\tawait afterCreate(conn, model, record);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeUpdate(conn, model, record, set) {\n\t\t\tlet data = set;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, record, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeUpdate === 'function') {\n\t\t\t\tdata = await beforeUpdate(conn, model, record, data) || data;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tasync afterUpdate(conn, model, record, oldRecord) {\n\t\t\tif (typeof afterUpdate === 'function') {\n\t\t\t\tawait afterUpdate(conn, model, record, oldRecord);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, oldRecord);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync beforeDelete(conn, model, record, update) {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof beforeDelete === 'function') {\n\t\t\t\tawait beforeDelete(conn, model, record, update);\n\t\t\t}\n\t\t},\n\t\tasync afterDelete(conn, model, record, update) {\n\t\t\tif (typeof afterDelete === 'function') {\n\t\t\t\tawait afterDelete(conn, model, record, update);\n\t\t\t}\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n/**\n * \n * @param {...string | string[]} hookNames \n * @returns {ClassDecorator}\n */\nexport default function modelHook(...hookNames) {\n\t/** @type {string[]} */\n\tconst names = hookNames.flat(21);\n\treturn (Model, ctx) => {\n\t\tif (!names.length) { return; }\n\t\tbeforeCreateMany(Model, async (conn, model, record) => {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterCreateMany(Model, async (conn, model, record) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreateMany[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeCreate(Model, async (conn, model, record) => {\n\t\t\tlet data = record;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterCreate(Model, async (conn, model, record) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterCreate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeUpdate(Model, async (conn, model, record, set) => {\n\t\t\tlet data = set;\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tdata = await hook(conn, model, record, data) || data;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t});\n\t\tafterUpdate(Model, async (conn, model, record, oldRecord) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterUpdate[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, oldRecord);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbeforeDelete(Model, async (conn, model, record, update) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.beforeDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tafterDelete(Model, async (conn, model, record, update) => {\n\t\t\tconst modelHooks = await modelHooksPromise;\n\t\t\tfor (const name of names) {\n\t\t\t\tfor (const hook of modelHooks.afterDelete[name] || []) {\n\t\t\t\t\tif (typeof hook !== 'function') { continue; }\n\t\t\t\t\tawait hook(conn, model, record, update);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n}\n","export default class ServerError extends Error {\n\tstatus = 500;\n\tcode = '';\n\t/**\n\t * \n\t * @param {string | {code?: string; message: string; status?: number}} message \n\t * @param {number} [status] \n\t */\n\tconstructor(message, status = 500) {\n\t\tsuper(typeof message === 'string' ? message : message.message);\n\t\tconst s = typeof message === 'object' && message.status || status;\n\t\tthis.status = s;\n\t\tthis.code = typeof message === 'object' && message.code || String(s);\n\t}\n}\n","/** @import { Hooks } from '@yongdall/model' */\nimport { increment, multiply, Query, Where, coefficient, decrement, Connection, actions } from '@yongdall/model';\nimport ServerError from '../ServerError.mjs';\n\n\n\n\n\n\n/**\n * \n * @param {Connection} conn \n * @param {any} Model \n * @param {number} id \n * @param {number} lftValue \n * @param {number} rgtValue \n * @param {string} idField \n * @param {string} lftField \n * @param {string} rgtField \n */\nasync function treeValidateLoop(conn, Model, id, lftValue, rgtValue, idField, lftField, rgtField) {\n\tconst t = await conn.call(actions.select(\n\t\tnew Query(Model).select(idField)\n\t\t\t.where(lftField, '<=', lftValue)\n\t\t\t.where(rgtField, '>=', rgtValue)\n\t\t\t.where({ [idField]: id })\n\t\t\t.limit(1)\n\t));\n\tif (t.length) { throw new ServerError('项目不能被添加到自己的后代'); }\n}\n/**\n * \n * @param {string} parentField \n * @param {string} lftField \n * @param {string} rgtField \n * @param {string} idField \n * @param {...string} groupFields \n * @returns {Partial<Hooks>}\n */\nexport default function nestedSetTree(parentField, lftField = 'lft', rgtField = 'rgt', idField = 'id', ...groupFields) {\n\n\treturn {\n\t\tasync beforeCreate(conn, Model, record) {\n\t\t\t// 树状结构调整 lft、rgt\n\t\t\tlet begin = 1;\n\t\t\tconst parent = record[parentField];\n\t\t\tconst where = new Where();\n\t\t\tfor (const g of groupFields) {\n\t\t\t\twhere.and(g, record[g]);\n\t\t\t}\n\t\t\tif (parent) {\n\t\t\t\tconst [{ [rgtField]: rgtValue }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true).select(rgtField).where(where).where({ [idField]: parent }).limit(1)\n\t\t\t\t));\n\t\t\t\tbegin = rgtValue;\n\t\t\t\tawait conn.call(actions.update(Model, { [rgtField]: increment(2) }, Where.and(where).and(rgtField, '>=', begin)));\n\t\t\t\tawait conn.call(actions.update(Model, { [lftField]: increment(2) }, Where.and(where).and(lftField, '>=', begin)));\n\t\t\t} else {\n\n\t\t\t\t/** @type {{r: number}[]} */\n\t\t\t\tconst [{ r } = { r: 0 }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true)\n\t\t\t\t\t\t.select({ r: rgtField })\n\t\t\t\t\t\t.where(where)\n\t\t\t\t\t\t.limit(1).sort(rgtField, true)\n\t\t\t\t));\n\t\t\t\tbegin = r + 1;\n\t\t\t}\n\t\t\trecord[lftField] = begin;\n\t\t\trecord[rgtField] = begin + 1;\n\t\t},\n\t\tasync beforeUpdate(conn, Model, oldDocument, updatedData) {\n\t\t\tconst parentId = parentField in updatedData ? updatedData[parentField] : oldDocument[parentField];\n\t\t\tif (parentId === oldDocument[parentField]) {\n\t\t\t\tupdatedData[lftField] = oldDocument[lftField];\n\t\t\t\tupdatedData[rgtField] = oldDocument[rgtField];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst where = new Where();\n\t\t\tfor (const g of groupFields) {\n\t\t\t\twhere.and(g, updatedData[g] ?? oldDocument[g]);\n\t\t\t}\n\t\t\tif (parentId) {\n\t\t\t\tconst [parent] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model).select({ lft: lftField, rgt: rgtField }).where(where).where({ [idField]: parentId })\n\t\t\t\t));\n\t\t\t\tconst { lft, rgt } = parent;\n\t\t\t\t// TODO:\n\t\t\t\tawait treeValidateLoop(conn, Model, oldDocument[idField], lft, rgt, idField, lftField, rgtField);\n\t\t\t}\n\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[rgtField]: multiply(-1),\n\t\t\t\t[rgtField]: multiply(-1),\n\t\t\t}, Where.and(where).and(lftField, '>=', oldDocument[rgtField]).and(rgtField, '<=', oldDocument[rgtField])));\n\n\t\t\tconst diff = oldDocument[rgtField] - oldDocument[lftField] + 1;\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[lftField]: decrement(diff)\n\t\t\t}, Where.and(where).and(lftField, '>', oldDocument[rgtField])));\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[rgtField]: decrement(diff)\n\t\t\t}, Where.and(where).and(rgtField, '>', oldDocument[rgtField])));\n\t\t\tlet newLft = 0;\n\t\t\tif (parentId) {\n\t\t\t\tconst [{ [rgtField]: rgtValue }] = await conn.call(actions.select(new Query(Model).select(rgtField).where(where).where({ [idField]: parentId })));\n\t\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t\t[rgtField]: increment(diff)\n\t\t\t\t}, Where.and(where).and(rgtField, '>=', rgtValue)));\n\t\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t\t[lftField]: increment(diff)\n\t\t\t\t}, Where.and(where).and(lftField, '>=', rgtValue)));\n\t\t\t\tnewLft = rgtValue;\n\t\t\t} else {\n\t\t\t\t/** @type {{r: number}[]} */\n\t\t\t\tconst [{ r } = { r: 0 }] = await conn.call(actions.select(\n\t\t\t\t\tnew Query(Model, true)\n\t\t\t\t\t\t.select({ r: rgtField })\n\t\t\t\t\t\t.where(where).where({ [idField]: parent })\n\t\t\t\t\t\t.limit(1).sort(rgtField, true)\n\t\t\t\t));\n\t\t\t\tnewLft = r + 1;\n\t\t\t}\n\n\t\t\tconst val = newLft - oldDocument[lftField];\n\t\t\tawait conn.call(actions.update(Model, {\n\t\t\t\t[lftField]: coefficient(val, -1),\n\t\t\t\t[rgtField]: coefficient(val, -1),\n\t\t\t}, Where.and(where).and(lftField, '<', 0)));\n\t\t\tupdatedData[lftField] = oldDocument[lftField] + val;\n\t\t\tupdatedData[rgtField] = oldDocument[rgtField] + val;\n\n\t\t},\n\t};\n}\n","/** @import { Field } from '@yongdall/types' */\n/** @import { FieldDefine } from '@yongdall/model' */\n\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @param {Set<string>} ignore \n * @returns {Record<string, Field>?}\n */\nfunction toSubDocumentFields(fields, ignore) {\n\t/** @type {Record<string, Field>} */\n\tconst res = {};\n\n\tfor (const [name, { type, ...field }] of Object.entries(fields)) {\n\t\tif (ignore.has(name)) { continue; }\n\t\tif (!type) { continue; }\n\t\tif (typeof type !== 'object' && typeof type !== 'function') {\n\t\t\tres[name] = {\n\t\t\t\ttype,\n\t\t\t\tarray: field.array,\n\t\t\t\tnullable: field.nullable,\n\t\t\t\tdefault: field.default,\n\t\t\t\tscale: field.scale,\n\n\n\t\t\t\tprimary: field.primary,\n\n\t\t\t\tuncreatable: Boolean(field.uncreatable || field.updating || field.creating || field.fixedValue),\n\t\t\t\timmutable: Boolean(field.primary || field.immutable || field.updating || field.creating || field.fixedValue),\n\n\t\t\t\tlayoutOrder: field.layoutOrder,\n\t\t\t\tlabel: field.label,\n\t\t\t\tdescription: field.description,\n\t\t\t\tplaceholder: field.placeholder,\n\n\t\t\t\tstep: field.step,\n\t\t\t\tmax: field.max,\n\t\t\t\tmin: field.min,\n\n\t\t\t\treadonly: field.readonly,\n\t\t\t\trequired: field.required,\n\t\t\t\tclearable: field.clearable,\n\t\t\t\tdisabled: field.disabled,\n\n\t\t\t\tgroup: field.group,\n\t\t\t\trenderer: field.renderer,\n\t\t\t\tscripts: field.scripts,\n\t\t\t\tlayout: field.layout,\n\t\t\t\tmodel: field.model,\n\t\t\t\tsort: field.sort,\n\t\t\t\tsource: field.source,\n\t\t\t\tbind: field.bind,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\n\t\tconst fields = type.fields;\n\t\tif (!fields) { continue; }\n\n\t\tconst names = new Set(Object.keys(field.constraints || {}));\n\t\tconst subFields = toSubDocumentFields(fields, names);\n\t\tif (!subFields) { continue; }\n\t\tres[name] = {\n\t\t\ttype: subFields,\n\t\t\tarray: field.array,\n\t\t\tdefault: field.default,\n\n\t\t\tuncreatable: Boolean(field.uncreatable),\n\t\t\timmutable: Boolean(field.immutable),\n\n\t\t\tlayoutOrder: field.layoutOrder,\n\t\t\tlabel: field.label,\n\t\t\tdescription: field.description,\n\t\t\tplaceholder: field.placeholder,\n\t\t\treadonly: field.readonly,\n\t\t\trequired: field.required,\n\t\t\tclearable: field.clearable,\n\t\t\tdisabled: field.disabled,\n\t\t\tgroup: field.group,\n\t\t\trenderer: field.renderer,\n\t\t\tscripts: field.scripts,\n\t\t\tlayout: field.layout,\n\t\t\tsource: field.source,\n\t\t\tbind: field.bind,\n\t\t};\n\t}\n\tif (!Object.keys(res).length) { return null; }\n\treturn res;\n}\n\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @returns {Record<string, Field>}\n */\nexport default function toDocumentFields(fields) {\n\treturn toSubDocumentFields(fields, new Set()) || {};\n}\n","import { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n/** @import { MaybePromise } from './types.mjs' */\n\n/** @type {Promise<Record<string, (Record<string, any> | (() => MaybePromise<Record<string, any>[]>))[]>>} */\nconst enumerationsPromise = LazyPromise.try(async function () {\n\tconst list = await Array.fromAsync(loadPluginProfiles('enumeration', function* (c) {\n\t\tyield* c && typeof c === 'object' && !Array.isArray(c) ? Object.entries(c) : [];\n\t}));\n\tconst groups = Object.groupBy(list, ([k]) => k);\n\treturn Object.fromEntries(\n\t\tObject.entries(groups).map(([k, v]) => [k, v?.map(v => v[1]).flat(2) || []])\n\t);\n});\n\n/**\n * \n * @param {string} name \n * @returns {Promise<Record<string, any>[]>}\n */\nexport async function getEnumerations(name) {\n\tconst allEnumerations = await enumerationsPromise;\n\tif (!Object.hasOwn(allEnumerations, name)) { return []; }\n\tconst enumerations = allEnumerations[name].map(v => typeof v === 'function' ? v() : v);\n\treturn await Promise.all(enumerations).then(v => v.flat());\n}\n","/** @import { MaybePromise, WhereHook } from '../types.mjs' */\n\nimport { Where } from '@yongdall/model';\nimport { LazyPromise } from '@yongdall/common';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\n/**\n * \n * @param {MaybePromise<Where?>} [where] \n */\nasync function toNot(where) {\n\tconst w = await where;\n\tif (!w) { return null; }\n\treturn Where.not(w);\n\n}\n/**\n * @template T\n * @param {Record<string, T>} map \n * @param {string} key \n * @param {() => T} create \n */\nfunction select(map, key, create) {\n\tif (Object.hasOwn(map, key)) { return map[key]; }\n\treturn map[key] = create();\n}\n/**\n * @typedef WhereDefine\n * @property {string} label\n * @property {string} notLabel\n * @property {WhereHook.Value[]} value\n * @property {WhereHook.Value[]} notValue\n * @property {WhereHook.Named[]} named\n * @property {WhereHook.Named[]} notNamed\n * @property {WhereHook.Field[]} field\n * @property {WhereHook.Field[]} notField\n */\n/**\n * \n * @returns {WhereDefine}\n */\nfunction createWhereDefine() {\n\treturn { label: '', notLabel: '', value: [], notValue: [], named: [], notNamed: [], field: [], notField: [] };\n\n}\n/**\n * \n * @param {Iterable<[key: string, value: Record<string, WhereHook>]>} whereDefines \n * @returns \n */\n\nfunction getWhere(whereDefines) {\n\t/** @type {Record<string, Record<string, WhereDefine>>} */\n\tconst filterMap = {};\n\t/** @type {Record<string, Record<string, WhereDefine>>} */\n\tconst notFilterMap = {};\n\tfor (const [type, fieldWhere] of whereDefines) {\n\t\tif (!fieldWhere || typeof fieldWhere !== 'object') { continue; }\n\t\tconst typeFilters = select(filterMap, type, () => /** @type {Record<string, WhereDefine>} */({}));\n\t\tconst notTypeFilters = select(notFilterMap, type, () => /** @type {Record<string, WhereDefine>} */({}));\n\n\t\tfor (const [op, filters] of Object.entries(fieldWhere)) {\n\n\t\t\tfor (const filter of [filters].flat()) {\n\t\t\t\tif (!filter || typeof filter !== 'object') { continue; }\n\t\t\t\tlet { label, notLabel, not, value, notValue, named, notNamed, field, notField } = filter;\n\t\t\t\tif (not) {\n\t\t\t\t\tif (typeof value === 'function' && typeof typeof notValue !== 'function') {\n\t\t\t\t\t\tnotValue = (...p) => toNot(value(...p));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof field === 'function' && typeof typeof notField !== 'function') {\n\t\t\t\t\t\tnotField = (...p) => toNot(field(...p));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof named === 'function' && typeof typeof notNamed !== 'function') {\n\t\t\t\t\t\tnotNamed = (...p) => toNot(named(...p));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst typeFilter = select(typeFilters, op, createWhereDefine);\n\t\t\t\tif (label && typeof label === 'string') { typeFilter.label = label; }\n\t\t\t\tif (notLabel && typeof notLabel === 'string') { typeFilter.notLabel = notLabel; }\n\t\t\t\tif (typeof value === 'function') { typeFilter.value.push(value); }\n\t\t\t\tif (typeof notValue === 'function') { typeFilter.notValue.push(notValue); }\n\t\t\t\tif (typeof named === 'function') { typeFilter.named.push(named); }\n\t\t\t\tif (typeof notNamed === 'function') { typeFilter.notNamed.push(notNamed); }\n\t\t\t\tif (typeof field === 'function') { typeFilter.field.push(field); }\n\t\t\t\tif (typeof notField === 'function') { typeFilter.notField.push(notField); }\n\t\t\t\tconst notOp = typeof not === 'string' && not || '';\n\t\t\t\tif (!notOp) { continue; }\n\t\t\t\tconst notTypeFilter = select(notTypeFilters, notOp, createWhereDefine);\n\n\n\t\t\t\tif (label && typeof label === 'string') { notTypeFilter.notLabel = label; }\n\t\t\t\tif (notLabel && typeof notLabel === 'string') { notTypeFilter.label = notLabel; }\n\t\t\t\tif (typeof value === 'function') { notTypeFilter.notValue.push(value); }\n\t\t\t\tif (typeof notValue === 'function') { notTypeFilter.value.push(notValue); }\n\t\t\t\tif (typeof named === 'function') { notTypeFilter.notNamed.push(named); }\n\t\t\t\tif (typeof notNamed === 'function') { notTypeFilter.named.push(notNamed); }\n\t\t\t\tif (typeof field === 'function') { notTypeFilter.notField.push(field); }\n\t\t\t\tif (typeof notField === 'function') { notTypeFilter.field.push(notField); }\n\n\t\t\t}\n\t\t}\n\t}\n\tfor (const type of Object.keys({ ...filterMap, ...notFilterMap })) {\n\t\tlet typeFilters = Object.hasOwn(filterMap, type) && filterMap[type] || null;\n\t\tlet notTypeFilters = Object.hasOwn(notFilterMap, type) && notFilterMap[type] || null;\n\t\tif (!typeFilters && notTypeFilters) {\n\t\t\ttypeFilters = notTypeFilters;\n\t\t\tfilterMap[type] = typeFilters;\n\t\t}\n\t\tif (!typeFilters) { continue; }\n\n\t\tfor (const op of Object.keys({ ...typeFilters, ...notTypeFilters })) {\n\t\t\tlet opFilters = Object.hasOwn(typeFilters, op) && typeFilters[op] || null;\n\t\t\tlet notOpFilters = notTypeFilters && Object.hasOwn(notTypeFilters, op) && notTypeFilters[op] || null;\n\t\t\tif (!opFilters && notOpFilters) {\n\t\t\t\topFilters = notOpFilters;\n\t\t\t\ttypeFilters[type] = opFilters;\n\t\t\t}\n\t\t\tif (!opFilters) { continue; }\n\t\t\tif (!opFilters.label) { opFilters.label = notOpFilters?.label || op; }\n\t\t\tif (!opFilters.notLabel) { opFilters.notLabel = notOpFilters?.notLabel || `!${op}`; }\n\t\t\tif (!notOpFilters) { continue; }\n\t\t\tfor (const fn of notOpFilters.value) { opFilters.value.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notValue) { opFilters.notValue.push(fn); }\n\t\t\tfor (const fn of notOpFilters.named) { opFilters.named.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notNamed) { opFilters.notNamed.push(fn); }\n\t\t\tfor (const fn of notOpFilters.field) { opFilters.field.push(fn); }\n\t\t\tfor (const fn of notOpFilters.notField) { opFilters.notField.push(fn); }\n\n\t\t}\n\n\t}\n\treturn filterMap;\n}\n/**\n * \n * @param {ReturnType<typeof getWhere>} filterMap \n */\nfunction toWhereList(filterMap) {\n\t/** @type {{type: string; operator: string; label: string; notLabel: string; value: boolean; notValue: boolean; named: boolean; notNamed: boolean; field: boolean; notField: boolean}[]} */\n\tconst list = [];\n\tfor (const [type, filters] of Object.entries(filterMap)) {\n\n\t\tfor (const [operator, filter] of Object.entries(filters)) {\n\t\t\tlist.push({\n\t\t\t\ttype, operator,\n\t\t\t\tlabel: filter.label,\n\t\t\t\tnotLabel: filter.notLabel,\n\t\t\t\tvalue: Boolean(filter.value.length),\n\t\t\t\tnotValue: Boolean(filter.notValue.length),\n\t\t\t\tnamed: Boolean(filter.named.length),\n\t\t\t\tnotNamed: Boolean(filter.notNamed.length),\n\t\t\t\tfield: Boolean(filter.field.length),\n\t\t\t\tnotField: Boolean(filter.notField.length),\n\n\t\t\t});\n\n\t\t}\n\n\t}\n\treturn list;\n\n}\n\nexport const wheres = LazyPromise.try(async function () {\n\t/** @type {[string, Record<string, Record<string, WhereHook>>, string][]} */\n\tconst list = await Array.fromAsync(loadPluginProfiles('where'));\n\treturn getWhere(list.flatMap(v => Object.entries(v[1] || {})));\n});\nexport const whereList = wheres.lazyThen(wheres => toWhereList(wheres));\n","/** @import { FieldDefine, TableDefine } from '@yongdall/model' */\n/** @import { RecursiveArray } from '@yongdall/common' */\nimport { Search } from '@yongdall/common';\nimport { Query, Where } from '@yongdall/model';\nimport { wheres } from './hook.mjs';\nimport { getModel } from '../models.mjs';\n\n\n\n\n\n/**\n * @typedef {object} WhereParam.Value\n * @property {'value'} type\n * @property {FieldDefine} define\n * @property {string} name\n * @property {string?} operator\n * @property {boolean} not\n * @property {string | number | boolean | RecursiveArray<string> | null} value\n */\n/**\n * @typedef {object} WhereParam.Field\n * @property {'field'} type\n * @property {FieldDefine} define\n * @property {string} name\n * @property {FieldDefine} fieldDefine\n * @property {string} field\n * @property {string?} operator\n * @property {boolean} not\n */\n/**\n * @typedef {object} WhereParam.Sub\n * @property {'sub'} type\n * @property {string} model\n * @property {string} name\n * @property {(Search.Match | Search.Children)[]} where\n */\n/**\n * @typedef {WhereParam.Value | WhereParam.Field | WhereParam.Sub} WhereParam\n */\n\n/**\n * \n * @param {Search.ToWhere<Record<string, FieldDefine>, WhereParam, Where>} toWhere \n * @param {Record<string, FieldDefine>} fields \n * @param {Search.Match | Search.Children} and\n * @returns {Generator<WhereParam, Where?, Where?>}\n */\nfunction* buildWhere(toWhere, fields, and) {\n\tconst fieldNames = and[0];\n\tif (fieldNames.find(v => Array.isArray(v) && v.length > 1)) { return null; }\n\tconst path = fieldNames.map(v => typeof v === 'string' ? v : v[0]);\n\n\tconst name = path.shift();\n\tif (!name) { return null; }\n\tconst define = Object.hasOwn(fields, name) && fields[name];\n\tif (!define) { return null; }\n\tconst type = define.type;\n\tif (!type) { return null; }\n\n\t/**\n\t * \n\t * @param {TableDefine} table \n\t * @param {(Search.Match | Search.Children)[]} sub \n\t * @returns \n\t */\n\tconst runSub = function*(table, sub) {\n\t\t/** @type {[string, string][]} */\n\t\tconst fields = [];\n\t\t/** @type {Record<string, any>} */\n\t\tconst values = {}\n\t\tfor (const [k, v] of Object.entries(define.constraints || [])) {\n\t\t\tif (v.noField) { continue; }\n\t\t\tif (v.writeOnly) { continue; }\n\t\t\tif (v.value) {\n\t\t\t\tvalues[k] = v.value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!v.field) { continue; }\n\t\t\tfields.push([k, v.field]);\n\t\t}\n\t\tif (!fields.length) { return null; }\n\t\tconst where = yield* toWhere(table.fields, sub);\n\t\tif (!where) { return null; }\n\t\t\n\t\tconst query = new Query(table).where(where).where(values)\n\t\t.select(fields.map(v => v[0]));\n\t\t// @ts-ignore\n\t\treturn Where.and(fields.map(v => v[1]), query);\n\n\t}\n\tif (path.length) {\n\t\t/** @type {Search.Match | Search.Children} */\n\t\tconst sub = [...and];\n\t\tsub[0] = path;\n\t\tif (typeof type !== 'object') {\n\t\t\tconst model = define.model;\n\t\t\tif (!model) { return null; }\n\t\t\treturn yield {type: 'sub', model, name, where: [sub]};\n\t\t}\n\t\tconst table = type.table;\n\t\tif (!table) { return null; }\n\t\treturn yield* runSub(type, [sub]);\n\t}\n\n\tif (and.length === 2) {\n\t\tif (typeof type !== 'object') {\n\t\t\tconst model = define.model;\n\t\t\tif (!model) { return null; }\n\t\t\treturn yield {type: 'sub', model, name, where: and[1]};\n\t\t}\n\t\tconst table = type.table;\n\t\tif (!table) { return null; }\n\t\treturn yield* runSub(type, and[1]);\n\t}\n\tif (typeof type !== 'string' && (typeof type !== 'object' || type.table)) {\n\t\treturn null;\n\t}\n\n\tconst [, value, operator, sign] = and;\n\tif (operator === null) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value: null, operator, not: !sign };\n\t}\n\tif (!value || typeof value !== 'object' || Array.isArray(value)) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value, operator, not: Boolean(sign) };\n\t}\n\tconst { field, table, value: rValue } = value;\n\tif (rValue) {\n\t\treturn yield { type: 'value', define, name: define.column || name, value: rValue, operator, not: Boolean(sign) };\n\n\t}\n\n\tif (field) {\n\t\tif (table) { return null; }\n\t\tconst fieldDefine = Object.hasOwn(fields, name) && fields[field];\n\t\tif (!fieldDefine) { return null; }\n\t\tconst type = fieldDefine.type;\n\t\tif (!type) { return null; }\n\t\tif (typeof type !== 'string' && (typeof type !== 'object' || type.table)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn yield { type: 'field', define, name: define.column || name, field: fieldDefine.column || field, fieldDefine, operator, not: Boolean(sign) };\n\t}\n\n\n\n\treturn null;\n\n}\n\n/**\n * \n * @param {string} type\n * @param {string} [renderer] \n * @returns \n */\nfunction getSetKey(type, renderer) {\n\tif (!type || type === '.') {\n\t\tif (!renderer) { return; }\n\t\treturn `:${renderer}`;\n\t}\n\tif (type[0] === '#') { return; }\n\tif (!renderer) { return type; }\n\treturn `${type}:${renderer}`;\n}\n\n/**\n * \n * @param {string | {component: string; [k: string]: any} | (string | {component: string; [k: string]: any})[]} [def] \n * @returns {Iterable<string>}\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;\n\t}\n}\n/**\n * \n * @param {FieldDefine} field \n * @returns {Iterable<string>}\n */\nfunction* getKey(field) {\n\tconst type = field.type;\n\tconst renderers = field.renderer;\n\tconst array = field.array ? '[]' : '';\n\tif (typeof type === 'object') { return; }\n\tif (!type) {\n\t\tfor (const renderer of getRenderer(renderers)) {\n\t\t\tyield `:${renderer}${array}`;\n\t\t\tyield `${renderer}${array}`;\n\t\t}\n\t\tyield `${array}`;\n\t\treturn;\n\t}\n\tfor (const renderer of getRenderer(renderers)) {\n\t\tyield `${type}:${renderer}${array}`;\n\t\tyield `${renderer}${array}`;\n\t}\n\tyield `${type}${array}`;\n\tyield `${array}`;\n}\n\n/** @type {Search.Where<Record<string, FieldDefine>, WhereParam, Where>} */\nconst where = {\n\tbuild: buildWhere,\n\tand(list) {\n\t\tif (!list.length) { return null; }\n\t\tlet where = new Where();\n\t\tfor (const w of list) {\n\t\t\twhere = where.and(w);\n\t\t}\n\t\treturn where;\n\t},\n\tor(list) {\n\t\tif (!list.length) { return null; }\n\t\tlet where = new Where();\n\t\tfor (const w of list) {\n\t\t\twhere = where.or(w);\n\t\t}\n\t\treturn where;\n\t},\n};\n\n/**\n * \n * @param {WhereParam} param \n */\nasync function execWhere(param) {\n\tif (param.type === 'sub') {\n\t\tconst table = await getModel(param.model);\n\t\tif (!table) { return; }\n\t\tconst fields = table.fields;\n\t\tconst primary = Object.entries(fields).filter(([,f]) => f.primary)\n\t\t.sort(([,a],[,b]) => (a.primary || 0) - (b.primary || 0)).map(([k]) => k);\n\t\tif (primary.length !== 1) { return; }\n\t\tconst where = await search2where(fields, param.where);\n\t\tif (!where) { return; }\n\t\tconst query = new Query(table).where(where).select(primary);\n\t\treturn Where.and(param.name, 'in', query);\n\t}\n\tconst operator = param.operator;\n\tif (operator === null) {\n\t\treturn Where.and(param.name, '=', null, param.not);\n\t}\n\tconst allWhere = { ...await wheres };\n\tfor (const k of getKey(param.define)) {\n\t\tconst typeWhere = Object.hasOwn(allWhere, k) && allWhere[k];\n\t\tif (!typeWhere) { continue; }\n\t\tconst op = Object.hasOwn(typeWhere, operator) && typeWhere[operator];\n\t\tif (!op) { continue; }\n\t\tif (param.type === 'value') {\n\t\t\tfor (const fn of param.not ? op.notValue : op.value) {\n\t\t\t\tconst w = await fn(param.name, param.value, param.define);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (param.type === 'field') {\n\t\t\tfor (const fn of param.not ? op.notField : op.field) {\n\t\t\t\tconst w = await fn(param.name, param.field, param.define, param.fieldDefine);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t}\n\tif (param.type === 'field') {\n\t\tfor (const k of getKey(param.fieldDefine)) {\n\t\t\tconst typeWhere = Object.hasOwn(allWhere, k) && allWhere[k];\n\t\t\tif (!typeWhere) { continue; }\n\t\t\tconst op = Object.hasOwn(typeWhere, operator) && typeWhere[operator];\n\t\t\tif (!op) { continue; }\n\t\t\tfor (const fn of param.not ? op.notField : op.field) {\n\t\t\t\tconst w = await fn(param.field, param.name, param.fieldDefine, param.define);\n\t\t\t\tif (w) { return w; }\n\t\t\t}\n\n\t\t}\n\t}\n\treturn null;\n\n}\n/**\n * \n * @param {Record<string, FieldDefine>} fields \n * @param {Search.AndList} [and] \n * @param {Search.OrList} [or] \n * @param {Search.OrList} [or2] \n * @returns {Promise<Where?>}\n */\nexport async function search2where(fields, and, or, or2) {\n\treturn Search.asyncRunGenerator(\n\t\tSearch.toWhere(where, fields, and, or, or2),\n\t\texecWhere,\n\t\tnull,\n\t);\n}\n","\n\n/**\n * 使用 HMAC-SHA256 对一个或多个值进行哈希,使用 salt 作为密钥。\n * 输出为 base64url 格式。\n *\n * @param {string | ArrayBuffer | ArrayBufferView<ArrayBuffer>} salt\n * @param {string | number} value\n * @param {...(string | number)} values\n * @returns {Promise<string>}\n */\nexport async function hashSHA256(salt, value, ...values) {\n\t// 1. 准备密钥(salt)\n\t/** @type {ArrayBuffer | ArrayBufferView<ArrayBuffer>} */\n\tlet keyBuffer;\n\tif (salt instanceof ArrayBuffer || ArrayBuffer.isView(salt)) {\n\t\tkeyBuffer = salt;\n\t} else if (typeof salt === 'string') {\n\t\tkeyBuffer = new TextEncoder().encode(salt);\n\t} else {\n\t\tthrow new Error('`salt` 参数必须为字符串或 Uint8Array');\n\t}\n\n\t// 2. 导入 HMAC 密钥\n\tconst cryptoKey = await crypto.subtle.importKey(\n\t\t'raw',\n\t\tkeyBuffer,\n\t\t{ name: 'HMAC', hash: 'SHA-256' },\n\t\tfalse,\n\t\t['sign']\n\t);\n\n\t// 3. 构造输入数据\n\t/** @type {string[]} */\n\tlet data = [];\n\n\t// 处理第一个 value\n\tif (typeof value === 'number') {\n\t\tdata.push(String(value));\n\t} else if (typeof value === 'string') {\n\t\t// JSON.stringify(value).slice(1, -1) 相当于去掉引号,等价于直接编码字符串内容\n\t\tdata.push(JSON.stringify(value).slice(1, -1));\n\t} else {\n\t\tthrow new Error('`value` 参数必须为字符串或数字');\n\t}\n\n\t// 处理后续 values\n\tfor (const v of values) {\n\t\tif (typeof v === 'number') {\n\t\t\tdata.push(String(v));\n\t\t} else if (typeof v === 'string') {\n\t\t\tdata.push(JSON.stringify(v).slice(1, -1));\n\t\t}\n\t}\n\n\t// 合并所有数据\n\tconst messageBuffer = new TextEncoder().encode(data.join('\\n'));\n\n\t// 4. 生成 HMAC\n\tconst signature = await crypto.subtle.sign('HMAC', cryptoKey, messageBuffer);\n\n\t// 5. 转为 base64url 格式\n\tconst base64 = btoa(String.fromCharCode(...new Uint8Array(signature)));\n\treturn base64\n\t\t.replace(/\\+/g, '-')\n\t\t.replace(/\\//g, '_')\n\t\t.replace(/=+$/, ''); // 移除填充\n}\n","import { LazyPromise } from '@yongdall/common';\nimport { useSalt } from '../realm.mjs';\nimport { hashSHA256 } from '../safe.mjs';\nimport { loadPluginProfiles } from '@yongdall/plugins';\n\n\ninterface Profile {\n\tparse(\n\t\ttoken: string,\n\t\tdevice: string | null,\n\t\tms: number | null,\n\t): Promise<[user: string, percent: number, ms: number] | null>;\n\tcreate(user: string, device: string): Promise<string>;\n}\n\nconst defaultProfile: Profile = {\n\tasync parse(token, device, ms) {\n\t\tif (typeof token !== 'string') { return null; }\n\t\tconst list = token.split('.');\n\t\tif (list.length !== 3) { return null; }\n\t\tconst timestamp = Number(list[0]);\n\t\tif (!Number.isSafeInteger(timestamp)) { return null; }\n\t\tconst time = Date.now() - timestamp;\n\t\tif (ms && time > ms) { return null; }\n\t\tconst salt = await useSalt();\n\t\tif (await hashSHA256(salt, list[1], list[0]) !== list[2]) { return null; }\n\t\treturn [list[1], ms ? time / ms : -1, time];\n\t},\n\tasync create(user, device) {\n\t\tconst timestamp = Date.now();\n\t\tconst salt = await useSalt();\n\t\treturn [timestamp, user, await hashSHA256(salt, user, timestamp)].join('.');\n\t},\n}\n\nconst profile: LazyPromise<Profile> = LazyPromise.try(async function () {\n\tfor await (const [, config,] of loadPluginProfiles<Profile>('identityToken', 'script')) {\n\t\tif (!config || typeof config !== 'object') { continue; }\n\t\tconst { parse, create } = config;\n\t\tif (typeof parse !== 'function' || typeof create !== 'function') { continue; }\n\t\treturn config\n\t}\n\treturn defaultProfile;\n});\n\n\nexport async function parse(\n\ttoken: string,\n\tms?: number,\n): Promise<[string, percent: number, ms: number] | null>\nexport async function parse(\n\ttoken: string,\n\tdevice?: string,\n\tms?: number,\n): Promise<[string, percent: number, ms: number] | null>\nexport async function parse(\n\ttoken: string,\n\tdevice?: string | number,\n\tms?: number,\n): Promise<[string, percent: number, ms: number] | null> {\n\tconst { parse } = await profile;\n\tconst msTime = typeof device === 'number' ? device : ms || null;\n\tconst deviceId = typeof device === 'string' && device || null;\n\treturn parse(token, deviceId, msTime);\n}\n\n/**\n * \n * @param {string} user \n * @returns {Promise<string>}\n */\nexport async function create(user: string, device?: string): Promise<string> {\n\tconst { create } = await profile;\n\treturn create(user, device ?? '');\n}\n","/** @import { Realm } from '@yongdall/types' */\nimport './polyfill.mjs';\nimport { initConfig } from './config.mjs';\nexport * from './config.mjs';\nexport * from './menu.mjs';\nexport * from './models.mjs';\nexport { default as useRealm, useSalt } from './realm.mjs';\nexport * from './user.mjs';\nexport * from './visitor.mjs';\nexport * from './permission/index.mjs';\nexport * from './decorators/index.mjs';\nexport { default as ServerError } from './ServerError.mjs';\nexport { default as toDocumentFields } from './toDocumentFields.mjs'\nexport { getEnumerations } from './enumerations.mjs'\nexport { search2where } from './search2where/index.mjs'\nexport * from './safe.mjs';\nexport * as IdentityToken from './token/IdentityToken.mts';\n\n\n/**\n * \n * @param {Partial<Omit<Realm, 'id'>>} realm \n * @param {object} boot \n * @returns \n */\nexport default function initSystem(realm, boot) {\n\tinitConfig(realm, boot);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yongdall/core",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "type": "module",
5
5
  "main": "./index.mjs",
6
6
  "exports": {
@@ -11,12 +11,12 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@yongdall/common": "^0.6.2",
15
- "@yongdall/context": "^0.6.2",
16
- "@yongdall/model": "^0.6.2",
17
- "@yongdall/plugins": "^0.6.2"
14
+ "@yongdall/common": "^0.6.4",
15
+ "@yongdall/context": "^0.6.4",
16
+ "@yongdall/model": "^0.6.4",
17
+ "@yongdall/plugins": "^0.6.4"
18
18
  },
19
19
  "devDependencies": {
20
- "@yongdall/types": "^0.6.2"
20
+ "@yongdall/types": "^0.6.4"
21
21
  }
22
22
  }