@steedos/validate 3.0.14-beta.9
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/LICENSE.txt +661 -0
- package/bin/cli.js +2 -0
- package/lib/constants.d.ts +9 -0
- package/lib/constants.js +102 -0
- package/lib/constants.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +199 -0
- package/lib/index.js.map +1 -0
- package/lib/rules/app.d.ts +2 -0
- package/lib/rules/app.js +22 -0
- package/lib/rules/app.js.map +1 -0
- package/lib/rules/button.d.ts +2 -0
- package/lib/rules/button.js +57 -0
- package/lib/rules/button.js.map +1 -0
- package/lib/rules/field.d.ts +2 -0
- package/lib/rules/field.js +56 -0
- package/lib/rules/field.js.map +1 -0
- package/lib/rules/function.d.ts +2 -0
- package/lib/rules/function.js +30 -0
- package/lib/rules/function.js.map +1 -0
- package/lib/rules/listview.d.ts +2 -0
- package/lib/rules/listview.js +29 -0
- package/lib/rules/listview.js.map +1 -0
- package/lib/rules/object.d.ts +6 -0
- package/lib/rules/object.js +55 -0
- package/lib/rules/object.js.map +1 -0
- package/lib/rules/page.d.ts +2 -0
- package/lib/rules/page.js +23 -0
- package/lib/rules/page.js.map +1 -0
- package/lib/rules/permission.d.ts +2 -0
- package/lib/rules/permission.js +12 -0
- package/lib/rules/permission.js.map +1 -0
- package/lib/rules/structure.d.ts +3 -0
- package/lib/rules/structure.js +43 -0
- package/lib/rules/structure.js.map +1 -0
- package/lib/rules/tab.d.ts +2 -0
- package/lib/rules/tab.js +15 -0
- package/lib/rules/tab.js.map +1 -0
- package/lib/rules/trigger.d.ts +2 -0
- package/lib/rules/trigger.js +41 -0
- package/lib/rules/trigger.js.map +1 -0
- package/lib/scanner.d.ts +2 -0
- package/lib/scanner.js +104 -0
- package/lib/scanner.js.map +1 -0
- package/lib/types.d.ts +51 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
}
|
|
20
|
+
if (!data.label) {
|
|
21
|
+
issues.push({ file, level: 'error', rule: 'object.required.label', message: '缺少必填字段: label' });
|
|
22
|
+
}
|
|
23
|
+
if (!data.icon) {
|
|
24
|
+
issues.push({ file, level: 'warning', rule: 'object.required.icon', message: '缺少字段: icon' });
|
|
25
|
+
}
|
|
26
|
+
else if (!constants_1.VALID_SLDS_ICONS.has(data.icon)) {
|
|
27
|
+
issues.push({ file, level: 'warning', rule: 'object.icon-invalid', message: `icon "${data.icon}" 不在有效的 SLDS 图标列表中` });
|
|
28
|
+
}
|
|
29
|
+
if (data.label_zh !== undefined) {
|
|
30
|
+
issues.push({ file, level: 'error', rule: 'object.no-label_zh', message: '不应使用 label_zh 属性,请使用 .objectTranslation.yml 做国际化' });
|
|
31
|
+
}
|
|
32
|
+
return issues;
|
|
33
|
+
}
|
|
34
|
+
function validateObjectHasNameField(objectName, fieldDataList, inlineFields, rel) {
|
|
35
|
+
let hasName = false;
|
|
36
|
+
for (const f of fieldDataList) {
|
|
37
|
+
if (f.name === 'name' || f.is_name === true) {
|
|
38
|
+
hasName = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!hasName && inlineFields && typeof inlineFields === 'object') {
|
|
43
|
+
for (const [key, field] of Object.entries(inlineFields)) {
|
|
44
|
+
if (key === 'name' || field?.is_name === true) {
|
|
45
|
+
hasName = true;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (!hasName) {
|
|
51
|
+
return [{ file: rel, level: 'warning', rule: 'object.no-name-field', message: `对象 "${objectName}" 没有 name 字段或 is_name: true 的字段` }];
|
|
52
|
+
}
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
//# 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,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,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,43 @@
|
|
|
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
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
issues.push({ file: rel(filePath), level: 'error', rule: 'structure.package-json.parse', message: 'package.json 解析失败' });
|
|
22
|
+
}
|
|
23
|
+
return issues;
|
|
24
|
+
}
|
|
25
|
+
function validatePackageService(filePath, rel) {
|
|
26
|
+
if (!filePath) {
|
|
27
|
+
return [{ file: 'package.service.js', level: 'warning', rule: 'structure.package-service', message: '缺少 package.service.js' }];
|
|
28
|
+
}
|
|
29
|
+
const issues = [];
|
|
30
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
31
|
+
const file = rel(filePath);
|
|
32
|
+
if (!content.includes('packageLoader')) {
|
|
33
|
+
issues.push({ file, level: 'warning', rule: 'structure.service.mixin', message: 'package.service.js 未使用 packageLoader mixin' });
|
|
34
|
+
}
|
|
35
|
+
if (!content.includes('namespace')) {
|
|
36
|
+
issues.push({ file, level: 'warning', rule: 'structure.service.namespace', message: 'package.service.js 未设置 namespace' });
|
|
37
|
+
}
|
|
38
|
+
if (!content.includes('packageInfo')) {
|
|
39
|
+
issues.push({ file, level: 'warning', rule: 'structure.service.packageInfo', message: 'package.service.js 未配置 settings.packageInfo' });
|
|
40
|
+
}
|
|
41
|
+
return issues;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/rules/structure.ts"],"names":[],"mappings":";;AAGA,kDAiBC;AAED,wDAkBC;AAxCD,yBAAyB;AAGzB,SAAgB,mBAAmB,CAAC,QAAuB,EAAE,GAA0B;IACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAChI,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,0BAA0B,IAAI,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;QACzK,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAAuB,EAAE,GAA0B;IACxF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC;IAClI,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,+BAA+B,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAC;IACzI,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/lib/rules/tab.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateTabFile = validateTabFile;
|
|
4
|
+
function validateTabFile(data, filePath, rel) {
|
|
5
|
+
const issues = [];
|
|
6
|
+
const file = rel(filePath);
|
|
7
|
+
if (!data.name) {
|
|
8
|
+
issues.push({ file, level: 'error', rule: 'tab.required.name', message: '缺少必填字段: name' });
|
|
9
|
+
}
|
|
10
|
+
if (!data.label) {
|
|
11
|
+
issues.push({ file, level: 'error', rule: 'tab.required.label', message: '缺少必填字段: label' });
|
|
12
|
+
}
|
|
13
|
+
return issues;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab.js","sourceRoot":"","sources":["../../src/rules/tab.ts"],"names":[],"mappings":";;AAEA,0CAaC;AAbD,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,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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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"}
|
package/lib/scanner.d.ts
ADDED
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
package/lib/types.js.map
ADDED
|
@@ -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.9",
|
|
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": "87f62a32df2ab475171cd9be1c664acd15448f85"
|
|
30
|
+
}
|