@steedos/validate 3.0.14-beta.10

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.
Files changed (48) hide show
  1. package/LICENSE.txt +661 -0
  2. package/bin/cli.js +2 -0
  3. package/lib/constants.d.ts +9 -0
  4. package/lib/constants.js +102 -0
  5. package/lib/constants.js.map +1 -0
  6. package/lib/index.d.ts +3 -0
  7. package/lib/index.js +199 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/rules/app.d.ts +2 -0
  10. package/lib/rules/app.js +37 -0
  11. package/lib/rules/app.js.map +1 -0
  12. package/lib/rules/button.d.ts +2 -0
  13. package/lib/rules/button.js +57 -0
  14. package/lib/rules/button.js.map +1 -0
  15. package/lib/rules/field.d.ts +2 -0
  16. package/lib/rules/field.js +56 -0
  17. package/lib/rules/field.js.map +1 -0
  18. package/lib/rules/function.d.ts +2 -0
  19. package/lib/rules/function.js +30 -0
  20. package/lib/rules/function.js.map +1 -0
  21. package/lib/rules/listview.d.ts +2 -0
  22. package/lib/rules/listview.js +29 -0
  23. package/lib/rules/listview.js.map +1 -0
  24. package/lib/rules/object.d.ts +6 -0
  25. package/lib/rules/object.js +59 -0
  26. package/lib/rules/object.js.map +1 -0
  27. package/lib/rules/page.d.ts +2 -0
  28. package/lib/rules/page.js +23 -0
  29. package/lib/rules/page.js.map +1 -0
  30. package/lib/rules/permission.d.ts +2 -0
  31. package/lib/rules/permission.js +12 -0
  32. package/lib/rules/permission.js.map +1 -0
  33. package/lib/rules/structure.d.ts +3 -0
  34. package/lib/rules/structure.js +47 -0
  35. package/lib/rules/structure.js.map +1 -0
  36. package/lib/rules/tab.d.ts +2 -0
  37. package/lib/rules/tab.js +37 -0
  38. package/lib/rules/tab.js.map +1 -0
  39. package/lib/rules/trigger.d.ts +2 -0
  40. package/lib/rules/trigger.js +41 -0
  41. package/lib/rules/trigger.js.map +1 -0
  42. package/lib/scanner.d.ts +2 -0
  43. package/lib/scanner.js +104 -0
  44. package/lib/scanner.js.map +1 -0
  45. package/lib/types.d.ts +51 -0
  46. package/lib/types.js +3 -0
  47. package/lib/types.js.map +1 -0
  48. package/package.json +30 -0
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateObjectFile = validateObjectFile;
4
+ exports.validateObjectHasNameField = validateObjectHasNameField;
5
+ const constants_1 = require("../constants");
6
+ function validateObjectFile(data, filePath, objectName, rel) {
7
+ const issues = [];
8
+ const file = rel(filePath);
9
+ if (!data.name) {
10
+ issues.push({ file, level: 'error', rule: 'object.required.name', message: '缺少必填字段: name' });
11
+ }
12
+ else {
13
+ if (data.name !== objectName) {
14
+ issues.push({ file, level: 'error', rule: 'object.name-mismatch', message: `name "${data.name}" 与文件夹名 "${objectName}" 不匹配` });
15
+ }
16
+ if (!constants_1.SNAKE_CASE_REGEX.test(data.name)) {
17
+ issues.push({ file, level: 'warning', rule: 'object.name-case', message: `对象名 "${data.name}" 不符合 snake_case 规范` });
18
+ }
19
+ const parts = data.name.split('_');
20
+ if (parts.length < 3) {
21
+ issues.push({ file, level: 'warning', rule: 'object.name-prefix', message: `对象名 "${data.name}" 缺少命名前缀,应以 {org_code}_{project_code}_ 开头,例如: steedos_crm_${data.name}` });
22
+ }
23
+ }
24
+ if (!data.label) {
25
+ issues.push({ file, level: 'error', rule: 'object.required.label', message: '缺少必填字段: label' });
26
+ }
27
+ if (!data.icon) {
28
+ issues.push({ file, level: 'warning', rule: 'object.required.icon', message: '缺少字段: icon' });
29
+ }
30
+ else if (!constants_1.VALID_SLDS_ICONS.has(data.icon)) {
31
+ issues.push({ file, level: 'warning', rule: 'object.icon-invalid', message: `icon "${data.icon}" 不在有效的 SLDS 图标列表中` });
32
+ }
33
+ if (data.label_zh !== undefined) {
34
+ issues.push({ file, level: 'error', rule: 'object.no-label_zh', message: '不应使用 label_zh 属性,请使用 .objectTranslation.yml 做国际化' });
35
+ }
36
+ return issues;
37
+ }
38
+ function validateObjectHasNameField(objectName, fieldDataList, inlineFields, rel) {
39
+ let hasName = false;
40
+ for (const f of fieldDataList) {
41
+ if (f.name === 'name' || f.is_name === true) {
42
+ hasName = true;
43
+ break;
44
+ }
45
+ }
46
+ if (!hasName && inlineFields && typeof inlineFields === 'object') {
47
+ for (const [key, field] of Object.entries(inlineFields)) {
48
+ if (key === 'name' || field?.is_name === true) {
49
+ hasName = true;
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ if (!hasName) {
55
+ return [{ file: rel, level: 'warning', rule: 'object.no-name-field', message: `对象 "${objectName}" 没有 name 字段或 is_name: true 的字段` }];
56
+ }
57
+ return [];
58
+ }
59
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/rules/object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validatePagePairs(pageYmlFiles: string[], pageAmisFiles: string[], rel: (p: string) => string): Issue[];
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePagePairs = validatePagePairs;
4
+ const path = require("path");
5
+ function validatePagePairs(pageYmlFiles, pageAmisFiles, rel) {
6
+ const issues = [];
7
+ const ymlBases = new Set(pageYmlFiles.map(f => path.basename(f, '.page.yml')));
8
+ const amisBases = new Set(pageAmisFiles.map(f => path.basename(f, '.page.amis.json')));
9
+ for (const f of pageYmlFiles) {
10
+ const base = path.basename(f, '.page.yml');
11
+ if (!amisBases.has(base)) {
12
+ issues.push({ file: rel(f), level: 'warning', rule: 'page.missing-amis', message: `缺少配对的 ${base}.page.amis.json 文件` });
13
+ }
14
+ }
15
+ for (const f of pageAmisFiles) {
16
+ const base = path.basename(f, '.page.amis.json');
17
+ if (!ymlBases.has(base)) {
18
+ issues.push({ file: rel(f), level: 'warning', rule: 'page.missing-yml', message: `缺少配对的 ${base}.page.yml 文件` });
19
+ }
20
+ }
21
+ return issues;
22
+ }
23
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/rules/page.ts"],"names":[],"mappings":";;AAGA,8CAqBC;AAxBD,6BAA6B;AAG7B,SAAgB,iBAAiB,CAAC,YAAsB,EAAE,aAAuB,EAAE,GAA0B;IAC3G,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAEvF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,IAAI,oBAAoB,EAAE,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validatePermissionFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePermissionFile = validatePermissionFile;
4
+ function validatePermissionFile(data, filePath, rel) {
5
+ const issues = [];
6
+ const file = rel(filePath);
7
+ if (!data.name && !data.permission_set_id) {
8
+ issues.push({ file, level: 'error', rule: 'permission.required.name', message: '缺少必填字段: name 或 permission_set_id' });
9
+ }
10
+ return issues;
11
+ }
12
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/rules/permission.ts"],"names":[],"mappings":";;AAEA,wDASC;AATD,SAAgB,sBAAsB,CAAC,IAAS,EAAE,QAAgB,EAAE,GAA0B;IAC5F,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function validatePackageJson(filePath: string | null, rel: (p: string) => string): Issue[];
3
+ export declare function validatePackageService(filePath: string | null, rel: (p: string) => string): Issue[];
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePackageJson = validatePackageJson;
4
+ exports.validatePackageService = validatePackageService;
5
+ const fs = require("fs");
6
+ function validatePackageJson(filePath, rel) {
7
+ if (!filePath) {
8
+ return [{ file: 'package.json', level: 'error', rule: 'structure.package-json', message: '缺少 package.json' }];
9
+ }
10
+ const issues = [];
11
+ try {
12
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
13
+ if (!data.name) {
14
+ issues.push({ file: rel(filePath), level: 'error', rule: 'structure.package-json.name', message: 'package.json 缺少 name 字段' });
15
+ }
16
+ if (data.main && data.main !== 'package.service.js') {
17
+ issues.push({ file: rel(filePath), level: 'warning', rule: 'structure.package-json.main', message: `package.json main 字段为 "${data.main}",通常应为 "package.service.js"` });
18
+ }
19
+ const allDeps = { ...data.dependencies, ...data.devDependencies, ...data.peerDependencies };
20
+ if (allDeps['@steedos/service-package-loader'] !== undefined) {
21
+ issues.push({ file: rel(filePath), level: 'error', rule: 'structure.package-json.no-package-loader', message: 'package.json 不能依赖 @steedos/service-package-loader,请将其从 dependencies/devDependencies/peerDependencies 中删除' });
22
+ }
23
+ }
24
+ catch (e) {
25
+ issues.push({ file: rel(filePath), level: 'error', rule: 'structure.package-json.parse', message: 'package.json 解析失败' });
26
+ }
27
+ return issues;
28
+ }
29
+ function validatePackageService(filePath, rel) {
30
+ if (!filePath) {
31
+ return [{ file: 'package.service.js', level: 'warning', rule: 'structure.package-service', message: '缺少 package.service.js' }];
32
+ }
33
+ const issues = [];
34
+ const content = fs.readFileSync(filePath, 'utf8');
35
+ const file = rel(filePath);
36
+ if (!content.includes('packageLoader')) {
37
+ issues.push({ file, level: 'warning', rule: 'structure.service.mixin', message: 'package.service.js 未使用 packageLoader mixin' });
38
+ }
39
+ if (!content.includes('namespace')) {
40
+ issues.push({ file, level: 'warning', rule: 'structure.service.namespace', message: 'package.service.js 未设置 namespace' });
41
+ }
42
+ if (!content.includes('packageInfo')) {
43
+ issues.push({ file, level: 'warning', rule: 'structure.service.packageInfo', message: 'package.service.js 未配置 settings.packageInfo' });
44
+ }
45
+ return issues;
46
+ }
47
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/rules/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateTabFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTabFile = validateTabFile;
4
+ const VALID_TAB_TYPES = ['object', 'page', 'url', 'analytics_dashboard'];
5
+ function validateTabFile(data, filePath, rel) {
6
+ const issues = [];
7
+ const file = rel(filePath);
8
+ if (!data.name) {
9
+ issues.push({ file, level: 'error', rule: 'tab.required.name', message: '缺少必填字段: name' });
10
+ }
11
+ if (!data.label) {
12
+ issues.push({ file, level: 'error', rule: 'tab.required.label', message: '缺少必填字段: label' });
13
+ }
14
+ if (!data.type) {
15
+ issues.push({ file, level: 'error', rule: 'tab.required.type', message: '缺少必填字段: type' });
16
+ }
17
+ else if (!VALID_TAB_TYPES.includes(data.type)) {
18
+ issues.push({ file, level: 'error', rule: 'tab.invalid-type', message: `type "${data.type}" 无效,必须为: ${VALID_TAB_TYPES.join(', ')}` });
19
+ }
20
+ if (data.object_name !== undefined) {
21
+ issues.push({ file, level: 'error', rule: 'tab.wrong-field.object_name', message: '错误字段 object_name,应使用 object(不带 _name 后缀)' });
22
+ }
23
+ if (data.type === 'object' && !data.object) {
24
+ issues.push({ file, level: 'error', rule: 'tab.object.required', message: 'type 为 object 时必须设置 object 字段(对象 API 名称)' });
25
+ }
26
+ if (data.type === 'page' && !data.page) {
27
+ issues.push({ file, level: 'error', rule: 'tab.page.required', message: 'type 为 page 时必须设置 page 字段(微页面名称)' });
28
+ }
29
+ if (data.type === 'url' && !data.url) {
30
+ issues.push({ file, level: 'error', rule: 'tab.url.required', message: 'type 为 url 时必须设置 url 字段' });
31
+ }
32
+ if (data.type === 'analytics_dashboard' && !data.analytics_dashboard) {
33
+ issues.push({ file, level: 'error', rule: 'tab.dashboard.required', message: 'type 为 analytics_dashboard 时必须设置 analytics_dashboard 字段' });
34
+ }
35
+ return issues;
36
+ }
37
+ //# sourceMappingURL=tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab.js","sourceRoot":"","sources":["../../src/rules/tab.ts"],"names":[],"mappings":";;AAIA,0CAyCC;AA3CD,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;AAEzE,SAAgB,eAAe,CAAC,IAAS,EAAE,QAAgB,EAAE,GAA0B;IACrF,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACxI,CAAC;IAGD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,CAAC;IAClI,CAAC;IAGD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,CAAC;IAC1H,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC,CAAC;IAC5I,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateTriggerFile(data: any, filePath: string, location: 'triggers' | 'objects', rel: (p: string) => string): Issue[];
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTriggerFile = validateTriggerFile;
4
+ const constants_1 = require("../constants");
5
+ function validateTriggerFile(data, filePath, location, rel) {
6
+ const issues = [];
7
+ const file = rel(filePath);
8
+ if (location === 'objects') {
9
+ issues.push({ file, level: 'error', rule: 'trigger.wrong-location', message: '触发器文件应放在 triggers/ 目录下,不应在 objects/ 内' });
10
+ }
11
+ if (!data.name) {
12
+ issues.push({ file, level: 'error', rule: 'trigger.required.name', message: '缺少必填字段: name' });
13
+ }
14
+ if (!data.listenTo) {
15
+ issues.push({ file, level: 'error', rule: 'trigger.required.listenTo', message: '缺少必填字段: listenTo' });
16
+ }
17
+ if (data.name && data.listenTo && !data.name.startsWith(`${data.listenTo}_`)) {
18
+ issues.push({ file, level: 'warning', rule: 'trigger.name-convention', message: `触发器名 "${data.name}" 建议以 "${data.listenTo}_" 开头` });
19
+ }
20
+ if (!data.when || (Array.isArray(data.when) && data.when.length === 0)) {
21
+ issues.push({ file, level: 'error', rule: 'trigger.required.when', message: '缺少必填字段: when(事件钩子数组)' });
22
+ }
23
+ else if (Array.isArray(data.when)) {
24
+ for (const w of data.when) {
25
+ if (!constants_1.VALID_TRIGGER_WHEN.has(w)) {
26
+ issues.push({ file, level: 'error', rule: 'trigger.when-invalid', message: `when 值 "${w}" 无效,有效值: ${[...constants_1.VALID_TRIGGER_WHEN].join(', ')}` });
27
+ }
28
+ }
29
+ }
30
+ if (data.type !== undefined && data.type !== 'code') {
31
+ issues.push({ file, level: 'error', rule: 'trigger.type-invalid', message: `type 必须为 "code",当前值: "${data.type}"` });
32
+ }
33
+ if (data.isEnabled === undefined) {
34
+ issues.push({ file, level: 'warning', rule: 'trigger.required.isEnabled', message: '建议设置 isEnabled 字段' });
35
+ }
36
+ if (!data.handler) {
37
+ issues.push({ file, level: 'error', rule: 'trigger.required.handler', message: '缺少必填字段: handler(内联 JavaScript 代码)' });
38
+ }
39
+ return issues;
40
+ }
41
+ //# sourceMappingURL=trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/rules/trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ScanResult } from './types';
2
+ export declare function scanPackage(packagePath: string): ScanResult;
package/lib/scanner.js ADDED
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanPackage = scanPackage;
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ function walkDir(dir) {
7
+ if (!fs.existsSync(dir))
8
+ return [];
9
+ const results = [];
10
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
11
+ const full = path.join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ results.push(...walkDir(full));
14
+ }
15
+ else {
16
+ results.push(full);
17
+ }
18
+ }
19
+ return results;
20
+ }
21
+ function scanPackage(packagePath) {
22
+ const result = {
23
+ packageJsonPath: null,
24
+ packageServicePath: null,
25
+ objectFiles: [],
26
+ fieldFiles: [],
27
+ buttonFiles: [],
28
+ listviewFiles: [],
29
+ permissionFiles: [],
30
+ triggerFiles: [],
31
+ functionFiles: [],
32
+ appFiles: [],
33
+ tabFiles: [],
34
+ pageYmlFiles: [],
35
+ pageAmisFiles: [],
36
+ };
37
+ const pkgJson = path.join(packagePath, 'package.json');
38
+ if (fs.existsSync(pkgJson))
39
+ result.packageJsonPath = pkgJson;
40
+ const pkgService = path.join(packagePath, 'package.service.js');
41
+ if (fs.existsSync(pkgService))
42
+ result.packageServicePath = pkgService;
43
+ const defaultDir = path.join(packagePath, 'main', 'default');
44
+ if (!fs.existsSync(defaultDir))
45
+ return result;
46
+ const allFiles = walkDir(defaultDir);
47
+ for (const filePath of allFiles) {
48
+ const rel = path.relative(defaultDir, filePath);
49
+ const parts = rel.split(path.sep);
50
+ const fileName = path.basename(filePath);
51
+ if (fileName.endsWith('.object.yml')) {
52
+ const objectName = parts[0] === 'objects' && parts.length >= 3 ? parts[1] : null;
53
+ if (objectName) {
54
+ result.objectFiles.push({ path: filePath, objectName });
55
+ }
56
+ }
57
+ else if (fileName.endsWith('.field.yml')) {
58
+ const objectName = parts[0] === 'objects' && parts.length >= 4 ? parts[1] : null;
59
+ if (objectName) {
60
+ result.fieldFiles.push({ path: filePath, objectName });
61
+ }
62
+ }
63
+ else if (fileName.endsWith('.button.yml')) {
64
+ const objectName = parts[0] === 'objects' && parts.length >= 4 ? parts[1] : null;
65
+ if (objectName) {
66
+ result.buttonFiles.push({ path: filePath, objectName });
67
+ }
68
+ }
69
+ else if (fileName.endsWith('.listview.yml')) {
70
+ const objectName = parts[0] === 'objects' && parts.length >= 4 ? parts[1] : null;
71
+ if (objectName) {
72
+ result.listviewFiles.push({ path: filePath, objectName });
73
+ }
74
+ }
75
+ else if (fileName.endsWith('.permission.yml')) {
76
+ const objectName = parts[0] === 'objects' && parts.length >= 4 ? parts[1] : null;
77
+ if (objectName) {
78
+ result.permissionFiles.push({ path: filePath, objectName });
79
+ }
80
+ }
81
+ else if (fileName.endsWith('.trigger.yml')) {
82
+ const location = parts[0] === 'triggers' ? 'triggers' : 'objects';
83
+ result.triggerFiles.push({ path: filePath, location });
84
+ }
85
+ else if (fileName.endsWith('.function.yml')) {
86
+ const location = parts[0] === 'functions' ? 'functions' : 'objects';
87
+ result.functionFiles.push({ path: filePath, location });
88
+ }
89
+ else if (fileName.endsWith('.app.yml')) {
90
+ result.appFiles.push(filePath);
91
+ }
92
+ else if (fileName.endsWith('.tab.yml')) {
93
+ result.tabFiles.push(filePath);
94
+ }
95
+ else if (fileName.endsWith('.page.yml')) {
96
+ result.pageYmlFiles.push(filePath);
97
+ }
98
+ else if (fileName.endsWith('.page.amis.json')) {
99
+ result.pageAmisFiles.push(filePath);
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ export interface Issue {
2
+ file: string;
3
+ level: 'error' | 'warning';
4
+ rule: string;
5
+ message: string;
6
+ }
7
+ export interface ScanResult {
8
+ packageJsonPath: string | null;
9
+ packageServicePath: string | null;
10
+ objectFiles: Array<{
11
+ path: string;
12
+ objectName: string;
13
+ }>;
14
+ fieldFiles: Array<{
15
+ path: string;
16
+ objectName: string;
17
+ }>;
18
+ buttonFiles: Array<{
19
+ path: string;
20
+ objectName: string;
21
+ }>;
22
+ listviewFiles: Array<{
23
+ path: string;
24
+ objectName: string;
25
+ }>;
26
+ permissionFiles: Array<{
27
+ path: string;
28
+ objectName: string;
29
+ }>;
30
+ triggerFiles: Array<{
31
+ path: string;
32
+ location: 'triggers' | 'objects';
33
+ }>;
34
+ functionFiles: Array<{
35
+ path: string;
36
+ location: 'functions' | 'objects';
37
+ }>;
38
+ appFiles: string[];
39
+ tabFiles: string[];
40
+ pageYmlFiles: string[];
41
+ pageAmisFiles: string[];
42
+ }
43
+ export interface ValidationResult {
44
+ packagePath: string;
45
+ summary: {
46
+ files: number;
47
+ errors: number;
48
+ warnings: number;
49
+ };
50
+ issues: Issue[];
51
+ }
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@steedos/validate",
3
+ "version": "3.0.14-beta.10",
4
+ "description": "Steedos package validation tool",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "bin": {
8
+ "steedos-validate": "./bin/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "rm -rf ./lib && tsc",
12
+ "watch": "tsc --watch"
13
+ },
14
+ "dependencies": {
15
+ "js-yaml": "^3.14.1"
16
+ },
17
+ "devDependencies": {
18
+ "@types/js-yaml": "^3.12.7",
19
+ "@types/node": "^18.0.3",
20
+ "typescript": "5.7.3"
21
+ },
22
+ "files": [
23
+ "lib",
24
+ "bin"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "gitHead": "f508d51da8f6f0436fba72aab808563dbadcb6ba"
30
+ }