@ynight/model-runtime 0.0.0-stage → 0.0.1

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.
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateModels = validateModels;
4
+ const tslib_1 = require("tslib");
5
+ const contracts_1 = require("@ynight/contracts");
6
+ const ajv_1 = tslib_1.__importDefault(require("ajv"));
7
+ /**
8
+ * 模型结构的 JSON Schema(Draft-07 兼容)。
9
+ *
10
+ * 通过 oneOf 描述菜单项判别联合(group / pathModule / siderModule / schemaModule),
11
+ * 并通过 additionalProperties: false 严格拒绝未知字段。
12
+ */
13
+ const modelSchema = {
14
+ $id: 'https://elpis.dev/schema/model.json',
15
+ type: 'object',
16
+ required: ['name', 'menu'],
17
+ properties: {
18
+ mode: { const: 'dashboard' },
19
+ name: { type: 'string', minLength: 1 },
20
+ desc: { type: 'string' },
21
+ icon: { type: 'string' },
22
+ homePage: { type: 'string' },
23
+ menu: { type: 'array', items: { $ref: '#/$defs/menuItem' } },
24
+ },
25
+ additionalProperties: false,
26
+ $defs: {
27
+ /** 命名项(任何菜单项都至少包含 key/name)。 */
28
+ namedItem: {
29
+ type: 'object',
30
+ required: ['key', 'name'],
31
+ properties: {
32
+ key: { type: 'string', minLength: 1 },
33
+ name: { type: 'string', minLength: 1 },
34
+ },
35
+ },
36
+ /** 分组菜单:承载 subMenu。 */
37
+ group: {
38
+ allOf: [
39
+ { $ref: '#/$defs/namedItem' },
40
+ {
41
+ type: 'object',
42
+ required: ['menuType', 'subMenu'],
43
+ properties: {
44
+ key: true,
45
+ name: true,
46
+ menuType: { const: 'group' },
47
+ subMenu: { type: 'array', items: { $ref: '#/$defs/menuItem' } },
48
+ },
49
+ additionalProperties: false,
50
+ },
51
+ ],
52
+ },
53
+ /** 路径模块:iframe / custom,按 path 渲染。 */
54
+ pathModule: {
55
+ allOf: [
56
+ { $ref: '#/$defs/namedItem' },
57
+ {
58
+ type: 'object',
59
+ required: ['menuType', 'moduleType', 'moduleConfig'],
60
+ properties: {
61
+ key: true,
62
+ name: true,
63
+ menuType: { const: 'module' },
64
+ moduleType: { enum: ['iframe', 'custom'] },
65
+ moduleConfig: {
66
+ type: 'object',
67
+ required: ['path'],
68
+ properties: { path: { type: 'string', minLength: 1 } },
69
+ additionalProperties: false,
70
+ },
71
+ },
72
+ additionalProperties: false,
73
+ },
74
+ ],
75
+ },
76
+ /** 侧边栏模块:内嵌另一棵菜单树。 */
77
+ siderModule: {
78
+ allOf: [
79
+ { $ref: '#/$defs/namedItem' },
80
+ {
81
+ type: 'object',
82
+ required: ['menuType', 'moduleType', 'moduleConfig'],
83
+ properties: {
84
+ key: true,
85
+ name: true,
86
+ menuType: { const: 'module' },
87
+ moduleType: { const: 'sider' },
88
+ moduleConfig: {
89
+ type: 'object',
90
+ required: ['menu'],
91
+ properties: {
92
+ menu: { type: 'array', items: { $ref: '#/$defs/menuItem' } },
93
+ },
94
+ additionalProperties: false,
95
+ },
96
+ },
97
+ additionalProperties: false,
98
+ },
99
+ ],
100
+ },
101
+ /** schema 模块:JSON Schema 驱动的列表/表单。 */
102
+ schemaModule: {
103
+ allOf: [
104
+ { $ref: '#/$defs/namedItem' },
105
+ {
106
+ type: 'object',
107
+ required: ['menuType', 'moduleType', 'moduleConfig'],
108
+ properties: {
109
+ key: true,
110
+ name: true,
111
+ menuType: { const: 'module' },
112
+ moduleType: { const: 'schema' },
113
+ moduleConfig: {
114
+ type: 'object',
115
+ required: ['api', 'schema', 'tableConfig', 'searchConfig', 'components'],
116
+ properties: {
117
+ api: { type: 'string', minLength: 1 },
118
+ schema: {
119
+ type: 'object',
120
+ required: ['type', 'properties'],
121
+ properties: {
122
+ type: { const: 'object' },
123
+ properties: { type: 'object' },
124
+ },
125
+ },
126
+ tableConfig: {
127
+ type: 'object',
128
+ required: ['headerButtons', 'rowButtons'],
129
+ properties: {
130
+ headerButtons: { type: 'array' },
131
+ rowButtons: { type: 'array' },
132
+ },
133
+ additionalProperties: false,
134
+ },
135
+ searchConfig: { type: 'object' },
136
+ components: { type: 'object' },
137
+ },
138
+ additionalProperties: false,
139
+ },
140
+ },
141
+ additionalProperties: false,
142
+ },
143
+ ],
144
+ },
145
+ /** 菜单项的判别联合:以上四种之一。 */
146
+ menuItem: {
147
+ oneOf: [
148
+ { $ref: '#/$defs/group' },
149
+ { $ref: '#/$defs/pathModule' },
150
+ { $ref: '#/$defs/siderModule' },
151
+ { $ref: '#/$defs/schemaModule' },
152
+ ],
153
+ },
154
+ },
155
+ };
156
+ /** 模型结构校验函数(编译一次,重复使用)。 */
157
+ const validateModelStructure = new ajv_1.default({ allErrors: true, strict: true }).compile(modelSchema);
158
+ /**
159
+ * 递归校验模型配置是 JSON 可序列化的纯数据。
160
+ *
161
+ * 拒绝:undefined / 函数 / Symbol / BigInt / Date / NaN/Infinity / 类实例 /
162
+ * 循环引用 / 稀疏数组空位 / 非 enumerable 的属性等。
163
+ * 目的:模型配置最终要落地到 JSON / 跨进程传递,不能混进运行时对象。
164
+ */
165
+ function assertJson(value, configPath, seen = new WeakSet()) {
166
+ if (value === undefined ||
167
+ typeof value === 'function' ||
168
+ typeof value === 'symbol' ||
169
+ typeof value === 'bigint' ||
170
+ value instanceof Date ||
171
+ (typeof value === 'number' && !Number.isFinite(value))) {
172
+ throw new Error(`模型配置 ${configPath} 必须是 JSON 可序列化值`);
173
+ }
174
+ if (!value || typeof value !== 'object') {
175
+ return;
176
+ }
177
+ // 仅允许原型为 Object.prototype 或 null 的对象(普通对象 / 字面量)。
178
+ if (!Array.isArray(value) && ![Object.prototype, null].includes(Object.getPrototypeOf(value))) {
179
+ throw new Error(`模型配置 ${configPath} 必须是纯 JSON 对象,不能包含类实例`);
180
+ }
181
+ if (seen.has(value)) {
182
+ throw new Error(`模型配置 ${configPath} 不能包含循环引用`);
183
+ }
184
+ seen.add(value);
185
+ if (Array.isArray(value)) {
186
+ for (let index = 0; index < value.length; index++) {
187
+ if (!Object.hasOwn(value, index)) {
188
+ throw new Error(`模型配置 ${configPath}[${index}] 不能是稀疏数组空位`);
189
+ }
190
+ }
191
+ }
192
+ Reflect.ownKeys(value).forEach(key => {
193
+ if (Array.isArray(value) && key === 'length') {
194
+ return;
195
+ }
196
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
197
+ // 要求 key 为字符串、属性可枚举、且为值属性(不可是 getter/setter)。
198
+ if (typeof key !== 'string' || !descriptor.enumerable || !('value' in descriptor)) {
199
+ throw new Error(`模型配置 ${configPath}.${String(key)} 必须是普通 JSON 数据属性`);
200
+ }
201
+ if (Array.isArray(value) && !/^(0|[1-9]\d*)$/.test(key)) {
202
+ throw new Error(`模型配置 ${configPath}.${key} 不是 JSON 数组索引`);
203
+ }
204
+ assertJson(descriptor.value, Array.isArray(value) ? `${configPath}[${key}]` : `${configPath}.${key}`, seen);
205
+ });
206
+ // 子树遍历完释放引用,避免误判祖先-兄弟之间的"伪环"。
207
+ seen.delete(value);
208
+ }
209
+ /**
210
+ * 校验菜单树:键名非空且唯一、menuType 合法、moduleType 合法、Sider 内嵌菜单递归校验。
211
+ *
212
+ * `seenKeys` 在递归时共享,用于检测整棵菜单树中的 key 重复。
213
+ */
214
+ function validateMenu(menu, configPath, seenKeys = new Set()) {
215
+ if (!Array.isArray(menu)) {
216
+ throw new Error(`模型配置 ${configPath} 必须是菜单数组`);
217
+ }
218
+ menu.forEach((item, index) => {
219
+ if (!item || typeof item !== 'object') {
220
+ throw new Error(`模型配置 ${configPath}[${index}] 必须是菜单对象`);
221
+ }
222
+ const candidate = item;
223
+ const key = typeof candidate.key === 'string' ? candidate.key : '';
224
+ if (!key.trim() || seenKeys.has(key)) {
225
+ throw new Error(`模型配置 ${configPath}[${index}] 存在重复或为空的菜单 key: ${key}`);
226
+ }
227
+ seenKeys.add(key);
228
+ if (candidate.menuType !== contracts_1.MenuType.GROUP && candidate.menuType !== contracts_1.MenuType.MODULE) {
229
+ throw new Error(`模型配置 ${configPath}[${index}].menuType 未知: ${String(candidate.menuType)}`);
230
+ }
231
+ if (candidate.menuType === contracts_1.MenuType.GROUP) {
232
+ if (!Array.isArray(candidate.subMenu)) {
233
+ throw new Error(`模型配置 ${configPath}[${index}].subMenu 必须是菜单数组`);
234
+ }
235
+ validateMenu(candidate.subMenu, `${configPath}[${index}].subMenu`, seenKeys);
236
+ return;
237
+ }
238
+ if (!Object.values(contracts_1.ModuleType).includes(candidate.moduleType)) {
239
+ throw new Error(`模型配置 ${configPath}[${index}].moduleType 未知: ${String(candidate.moduleType)}`);
240
+ }
241
+ if (!isRecord(candidate.moduleConfig)) {
242
+ throw new Error(`模型配置 ${configPath}[${index}].moduleConfig 必须是对象`);
243
+ }
244
+ if (candidate.moduleType === contracts_1.ModuleType.SIDER) {
245
+ if (!Array.isArray(candidate.moduleConfig.menu)) {
246
+ throw new Error(`模型配置 ${configPath}[${index}].moduleConfig.menu 必须是菜单数组`);
247
+ }
248
+ validateMenu(candidate.moduleConfig.menu, `${configPath}[${index}].moduleConfig.menu`, seenKeys);
249
+ }
250
+ });
251
+ }
252
+ /** 判定值是否为非数组的普通对象。 */
253
+ function isRecord(value) {
254
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
255
+ }
256
+ /**
257
+ * 把 ajv 的 `instancePath`(JSON Pointer 风格)转成更易读的字符串。
258
+ *
259
+ * 示例:`/menu/0/subMenu` -> `.menu[0].subMenu`,并对 `~` 与 `/` 做转义还原。
260
+ */
261
+ function formatSchemaInstancePath(instancePath) {
262
+ if (!instancePath) {
263
+ return '';
264
+ }
265
+ return instancePath
266
+ .split('/')
267
+ .slice(1)
268
+ .map(part => part.replaceAll('~1', '/').replaceAll('~0', '~'))
269
+ .map(part => (/^\d+$/.test(part) ? `[${part}]` : `.${part}`))
270
+ .join('');
271
+ }
272
+ /**
273
+ * 把单个 ajv 错误格式化为人类可读字符串。
274
+ * - `required` 错误:附加缺失的属性名
275
+ * - `additionalProperties` 错误:附加多出来的属性名
276
+ * - 其它错误:仅展示 instancePath
277
+ */
278
+ function formatAjvError(error, configPath) {
279
+ const property = error.keyword === 'required'
280
+ ? error.params.missingProperty
281
+ : error.keyword === 'additionalProperties'
282
+ ? error.params.additionalProperty
283
+ : undefined;
284
+ const suffix = typeof property === 'string' ? `.${property}` : '';
285
+ return `${configPath}${formatSchemaInstancePath(error.instancePath)}${suffix} [${error.keyword}] ${error.message ?? '校验失败'}`;
286
+ }
287
+ /**
288
+ * 把控件契约编译为 ajv ValidateFunction 集合。
289
+ *
290
+ * 同时校验契约定义本身的形状(必须包含 propsSchema,且必须是 JSON)。
291
+ * 异步 Schema 在此处被拒绝——validateModels 是同步流程,不接受异步校验。
292
+ */
293
+ function compileControlContracts(controlContracts) {
294
+ const validators = new Map();
295
+ const ajv = new ajv_1.default({ allErrors: true, strict: true });
296
+ Object.entries(controlContracts ?? {}).forEach(([key, contract]) => {
297
+ const configPath = `controlContracts.${key}.propsSchema`;
298
+ if (!key || !isRecord(contract) || !('propsSchema' in contract)) {
299
+ throw new Error(`控件契约 ${key || '<empty>'} 缺少 propsSchema`);
300
+ }
301
+ assertJson(contract, `controlContracts.${key}`);
302
+ const schema = contract.propsSchema;
303
+ try {
304
+ const validate = ajv.compile(schema);
305
+ if (validate.$async) {
306
+ throw new Error('控件契约不支持异步 Schema');
307
+ }
308
+ validators.set(key, validate);
309
+ }
310
+ catch (error) {
311
+ const message = error instanceof Error ? error.message : String(error);
312
+ throw new Error(`控件契约 ${configPath} 无效: ${message}`, { cause: error });
313
+ }
314
+ });
315
+ return validators;
316
+ }
317
+ /** 内置控件 comType 集合,用于识别哪些 comType 走"自定义控件契约"分支。 */
318
+ const builtInControls = new Set(Object.values(contracts_1.SchemaFormControlType));
319
+ /**
320
+ * 校验单个字段配置中的自定义控件 props 是否符合契约。
321
+ *
322
+ * 内置控件直接跳过(由 schema-form 渲染器自行负责)。
323
+ * 未声明 props 时,组件接收到空属性,仍须检查 oneOf/$ref 等组合约束。
324
+ */
325
+ function validateControlField(field, configPath, validators) {
326
+ if (!isRecord(field) || typeof field.comType !== 'string' || builtInControls.has(field.comType)) {
327
+ return;
328
+ }
329
+ const compiled = validators.get(field.comType);
330
+ if (!compiled) {
331
+ throw new Error(`模型配置 ${configPath}.comType 引用了未知控件: ${field.comType}`);
332
+ }
333
+ // 未声明 props 时,组件接收到空属性;仍须检查 oneOf/$ref 等组合约束。
334
+ const props = field.props === undefined ? {} : field.props;
335
+ if (compiled(props)) {
336
+ return;
337
+ }
338
+ const details = (compiled.errors ?? [])
339
+ .map(error => formatAjvError(error, `${configPath}.props`))
340
+ .join('; ');
341
+ throw new Error(`控件属性校验失败: ${details}`);
342
+ }
343
+ /**
344
+ * 遍历模型菜单树,校验所有 schema 模块字段上的控件契约(searchOption / 各组件 Option)。
345
+ */
346
+ function validateSchemaFields(model, modelPath, validators) {
347
+ const visit = (menu, menuPath) => {
348
+ menu.forEach((item, index) => {
349
+ const itemPath = `${menuPath}[${index}]`;
350
+ if (item.menuType === 'group') {
351
+ visit(item.subMenu, `${itemPath}.subMenu`);
352
+ }
353
+ else if (item.moduleType === 'sider') {
354
+ visit(item.moduleConfig.menu, `${itemPath}.moduleConfig.menu`);
355
+ }
356
+ else if (item.moduleType === 'schema') {
357
+ // 仅 schema 模块有字段级别的控件配置需要校验。
358
+ Object.entries(item.moduleConfig.schema.properties).forEach(([fieldKey, field]) => {
359
+ const fieldPath = `${itemPath}.moduleConfig.schema.properties.${fieldKey}`;
360
+ validateControlField(field.searchOption, `${fieldPath}.searchOption`, validators);
361
+ ['CreateFormOption', 'UpdateFormOption', 'DetailViewOption'].forEach(option => validateControlField(field[option], `${fieldPath}.${option}`, validators));
362
+ });
363
+ }
364
+ });
365
+ };
366
+ visit(model.menu, `${modelPath}.menu`);
367
+ }
368
+ /**
369
+ * 对单个模型做完整校验:JSON 边界、菜单键、模型结构、控件契约。
370
+ * 任何一步失败都会抛错,由调用方决定如何呈现。
371
+ */
372
+ function validateModel(model, modelPath, validators) {
373
+ assertJson(model, modelPath);
374
+ if (isRecord(model) && Array.isArray(model.menu)) {
375
+ validateMenu(model.menu, `${modelPath}.menu`);
376
+ }
377
+ if (!validateModelStructure(model)) {
378
+ const details = (validateModelStructure.errors ?? [])
379
+ .map(error => formatAjvError(error, modelPath))
380
+ .join('; ');
381
+ throw new Error(`模型结构校验失败: ${details}`);
382
+ }
383
+ validateSchemaFields(model, modelPath, validators);
384
+ }
385
+ /**
386
+ * 校验已加载模型的 JSON 边界、菜单键、控件契约和跨模型项目键。
387
+ *
388
+ * 校验步骤:
389
+ * 1. 编译控件契约(若提供)
390
+ * 2. 逐模型校验:JSON 边界 + 菜单键 + 模型结构 + 字段控件契约
391
+ * 3. 跨模型唯一性:同名 projectKey 不能同时归属多个模型
392
+ *
393
+ * @throws 任何校验失败均抛出 Error,message 含定位路径与失败原因。
394
+ */
395
+ function validateModels(models, options = {}) {
396
+ // 记录每个 projectKey 当前归属的 modelKey,便于跨模型冲突检测。
397
+ const projectOwners = new Map();
398
+ const validators = compileControlContracts(options.controlContracts);
399
+ models.forEach(loaded => {
400
+ validateModel(loaded.model, `model.${loaded.key}`, validators);
401
+ Object.entries(loaded.project).forEach(([projectKey, project]) => {
402
+ const owner = projectOwners.get(projectKey);
403
+ if (owner && owner !== loaded.key) {
404
+ throw new Error(`项目 key 冲突: ${projectKey} 同时出现在模型 ${owner} 和 ${loaded.key}`);
405
+ }
406
+ projectOwners.set(projectKey, loaded.key);
407
+ validateModel(project, `model.${loaded.key}.project.${projectKey}`, validators);
408
+ });
409
+ });
410
+ }
411
+ //# sourceMappingURL=validate-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-models.js","sourceRoot":"","sources":["../src/validate-models.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,54 @@
1
1
  {
2
2
  "name": "@ynight/model-runtime",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.0.1",
4
+ "description": "Elpis 模型文件加载、合并与校验运行时",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+ssh://git@git.code.tencent.com/YNight/elpis.git"
8
+ },
9
+ "license": "MIT",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "require": "./dist/index.js",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "engines": {
25
+ "node": ">=22.0.0"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "ajv": "^8.17.1",
32
+ "glob": "^11.0.0",
33
+ "lodash": "^4.18.1",
34
+ "tslib": "^2.8.1",
35
+ "@ynight/contracts": "0.0.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/lodash": "^4.17.25",
39
+ "@types/mocha": "^10.0.10",
40
+ "@types/node": "^22.0.0",
41
+ "mocha": "^11.8.0",
42
+ "rimraf": "^5.0.10",
43
+ "ts-node": "^10.9.2",
44
+ "typescript": "^5.9.3"
45
+ },
46
+ "scripts": {
47
+ "clean": "rimraf dist",
48
+ "build": "rimraf dist && tsc -p tsconfig.json",
49
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
50
+ "type-check": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
51
+ "test": "TS_NODE_PROJECT=tsconfig.test.json mocha --require ts-node/register \"test/**/*.test.ts\"",
52
+ "lint": "eslint src test"
53
+ }
6
54
  }