@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.
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 +22 -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 +55 -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 +43 -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 +15 -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,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SNAKE_CASE_REGEX = exports.VALID_SLDS_ICONS = exports.VALID_FORMULA_BLANK_VALUES = exports.VALID_SUMMARY_TYPES = exports.VALID_SORT_ORDERS = exports.VALID_FILTER_SCOPES = exports.VALID_BUTTON_ON = exports.VALID_TRIGGER_WHEN = exports.VALID_FIELD_TYPES = void 0;
4
+ exports.VALID_FIELD_TYPES = new Set([
5
+ 'text', 'textarea', 'html', 'select', 'color', 'boolean', 'toggle',
6
+ 'date', 'datetime', 'time', 'number', 'currency', 'percent', 'password',
7
+ 'lookup', 'master_detail', 'grid', 'table', 'url', 'email', 'avatar',
8
+ 'location', 'image', 'object', '[object]', '[Object]', '[grid]', '[text]',
9
+ 'selectCity', 'audio', 'filesize', 'file', 'code', 'autonumber',
10
+ 'markdown', 'formula', 'summary',
11
+ ]);
12
+ exports.VALID_TRIGGER_WHEN = new Set([
13
+ 'beforeInsert', 'afterInsert', 'beforeUpdate', 'afterUpdate',
14
+ 'beforeDelete', 'afterDelete', 'beforeFind', 'afterFind',
15
+ 'afterFindOne', 'afterCount', 'beforeAggregate', 'afterAggregate',
16
+ ]);
17
+ exports.VALID_BUTTON_ON = new Set([
18
+ 'list', 'record', 'record_more', 'list_item',
19
+ 'record_only', 'record_only_more', 'list_record',
20
+ ]);
21
+ exports.VALID_FILTER_SCOPES = new Set(['space', 'mine', 'all']);
22
+ exports.VALID_SORT_ORDERS = new Set(['asc', 'desc']);
23
+ exports.VALID_SUMMARY_TYPES = new Set(['count', 'sum', 'min', 'max', 'avg']);
24
+ exports.VALID_FORMULA_BLANK_VALUES = new Set(['zeroes', 'blanks']);
25
+ exports.VALID_SLDS_ICONS = new Set([
26
+ 'account', 'action_list_component', 'actions_and_buttons', 'activation_target',
27
+ 'address', 'all', 'announcement', 'answer_best', 'answer_private', 'answer_public',
28
+ 'apex', 'app', 'approval', 'apps', 'article', 'asset_action', 'asset_relationship',
29
+ 'assigned_resource', 'assignment', 'avatar', 'bot', 'branch_merge',
30
+ 'brand', 'budget', 'bundle_config', 'bundle_policy', 'business_hours',
31
+ 'calibration', 'call', 'call_history', 'campaign', 'campaign_members',
32
+ 'canvas', 'capacity_plan', 'care_request', 'carousel', 'case',
33
+ 'case_change_status', 'case_comment', 'case_milestone', 'category',
34
+ 'change_request', 'channel_programs', 'chart', 'chat', 'choice',
35
+ 'client', 'cms', 'coaching', 'code_playground', 'collection',
36
+ 'connected_apps', 'contact', 'contact_request', 'contract',
37
+ 'contract_line_item', 'custom', 'customer', 'customers',
38
+ 'dashboard', 'data_streams', 'datashare_target', 'default',
39
+ 'delegated_account', 'device', 'document', 'drafts',
40
+ 'email', 'employee', 'employee_contact', 'employee_job',
41
+ 'employee_organization', 'empty', 'endorsement', 'entitlement',
42
+ 'entitlement_process', 'entity', 'entity_milestone', 'environment_hub',
43
+ 'event', 'expense', 'expense_report',
44
+ 'feed', 'feedback', 'file', 'filter', 'first_non_empty',
45
+ 'flow', 'folder', 'form', 'formula', 'fulfillment_order',
46
+ 'generic_loading', 'goals', 'group_loading', 'groups', 'guidance_center',
47
+ 'hierarchy', 'home', 'household',
48
+ 'immunization', 'incident', 'individual', 'insights',
49
+ 'investment_account', 'invocable_action', 'iot_context', 'iot_orchestrations',
50
+ 'job_family', 'job_position', 'job_profile',
51
+ 'kanban', 'key_dates', 'knowledge',
52
+ 'lead', 'letterhead', 'lightning_component', 'link', 'list_email',
53
+ 'live_chat', 'location', 'log_a_call', 'loop',
54
+ 'macros', 'maintenance_asset', 'maintenance_plan',
55
+ 'marketing_actions', 'merge', 'messaging_conversation',
56
+ 'messaging_session', 'messaging_user', 'metrics', 'multi_picklist',
57
+ 'news', 'note', 'number_input',
58
+ 'observation_component', 'office365', 'omni_supervisor',
59
+ 'operating_hours', 'opportunity', 'opportunity_contact_role',
60
+ 'opportunity_splits', 'orchestrator', 'order_item', 'orders',
61
+ 'outcome', 'output',
62
+ 'partner_fund_allocation', 'partner_fund_claim',
63
+ 'partner_fund_request', 'partner_marketing_budget', 'partners',
64
+ 'password', 'past_chat', 'people', 'performance', 'permission_set',
65
+ 'person_account', 'photo', 'picklist_type', 'planogram',
66
+ 'poll', 'portal', 'post', 'price_book_entries', 'price_books',
67
+ 'pricebook', 'procedure', 'process', 'product',
68
+ 'product_consumed', 'product_item', 'product_required',
69
+ 'product_service_campaign', 'product_transfer', 'product_warranty_term',
70
+ 'products', 'profile', 'prompt', 'propagation_policy',
71
+ 'proposition', 'qualification', 'queue', 'question_best', 'question_feed',
72
+ 'quick_text', 'quip', 'quotation_line_item', 'quotes',
73
+ 'recent', 'record', 'record_create', 'record_delete', 'record_update',
74
+ 'recycle_bin', 'related_list', 'relationship', 'report', 'resource_absence',
75
+ 'resource_capacity', 'resource_preference', 'resource_skill',
76
+ 'return_order', 'return_order_line_item', 'reward', 'rtc_presence',
77
+ 'sales_path', 'scan_card', 'schedule_objective', 'screen',
78
+ 'search', 'section', 'segments', 'service_appointment',
79
+ 'service_contract', 'service_crew', 'service_crew_member',
80
+ 'service_report', 'service_resource', 'service_territory',
81
+ 'settings', 'setup_modal', 'shift', 'shift_pattern',
82
+ 'shift_pattern_entry', 'shift_preference', 'shift_scheduling_operation',
83
+ 'shift_template', 'skill', 'skill_entity', 'skill_requirement',
84
+ 'snippet', 'snippets', 'social', 'solution', 'sort', 'sort_policy',
85
+ 'sossession', 'stage', 'stage_collection', 'steps',
86
+ 'store', 'story', 'strategy', 'survey', 'swarm_request', 'swarm_session',
87
+ 'system_and_global_variable',
88
+ 'tab_definition', 'task', 'task2', 'team_member', 'template',
89
+ 'text', 'text_template', 'textarea', 'thanks', 'timesheet',
90
+ 'timesheet_entry', 'timeslot', 'today', 'toll_free_number', 'topic',
91
+ 'topic2', 'trailhead', 'travel_mode', 'type_tool',
92
+ 'unmatched', 'user', 'user_role',
93
+ 'variable', 'variation_attribute_setup', 'variation_products', 'video',
94
+ 'visit_templates', 'visits', 'visualforce_page', 'voice_call',
95
+ 'waits', 'warranty_term', 'water', 'web_cart', 'work_capacity_limit',
96
+ 'work_capacity_usage', 'work_contract', 'work_forecast',
97
+ 'work_order', 'work_order_item', 'work_plan', 'work_plan_rule',
98
+ 'work_plan_template', 'work_plan_template_entry', 'work_queue',
99
+ 'work_step', 'work_step_template', 'work_type', 'work_type_group',
100
+ ]);
101
+ exports.SNAKE_CASE_REGEX = /^[a-z_][a-z0-9_]*$/;
102
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { ValidationResult } from './types';
2
+ export declare function validatePackage(packagePath: string): ValidationResult;
3
+ export declare function cli(args?: string[]): void;
package/lib/index.js ADDED
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePackage = validatePackage;
4
+ exports.cli = cli;
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const yaml = require("js-yaml");
8
+ const scanner_1 = require("./scanner");
9
+ const structure_1 = require("./rules/structure");
10
+ const object_1 = require("./rules/object");
11
+ const field_1 = require("./rules/field");
12
+ const trigger_1 = require("./rules/trigger");
13
+ const function_1 = require("./rules/function");
14
+ const button_1 = require("./rules/button");
15
+ const listview_1 = require("./rules/listview");
16
+ const permission_1 = require("./rules/permission");
17
+ const app_1 = require("./rules/app");
18
+ const tab_1 = require("./rules/tab");
19
+ const page_1 = require("./rules/page");
20
+ const customYamlSchema = yaml.Schema.create(yaml.DEFAULT_SAFE_SCHEMA, [
21
+ new yaml.Type('tag:yaml.org,2002:js/function', { kind: 'scalar', construct: (data) => data }),
22
+ new yaml.Type('tag:yaml.org,2002:js/regexp', { kind: 'scalar', construct: (data) => data }),
23
+ new yaml.Type('tag:yaml.org,2002:js/undefined', { kind: 'scalar', construct: () => undefined }),
24
+ ]);
25
+ function parseYaml(filePath) {
26
+ try {
27
+ const content = fs.readFileSync(filePath, 'utf8');
28
+ const data = yaml.load(content, { schema: customYamlSchema });
29
+ return { data, error: null };
30
+ }
31
+ catch (e) {
32
+ return { data: null, error: e.message };
33
+ }
34
+ }
35
+ function validatePackage(packagePath) {
36
+ const absPath = path.resolve(packagePath);
37
+ const rel = (p) => path.relative(absPath, p);
38
+ const issues = [];
39
+ let fileCount = 0;
40
+ const scan = (0, scanner_1.scanPackage)(absPath);
41
+ issues.push(...(0, structure_1.validatePackageJson)(scan.packageJsonPath, rel));
42
+ issues.push(...(0, structure_1.validatePackageService)(scan.packageServicePath, rel));
43
+ const objectFieldData = new Map();
44
+ for (const { path: fp, objectName } of scan.objectFiles) {
45
+ fileCount++;
46
+ const { data, error } = parseYaml(fp);
47
+ if (error) {
48
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
49
+ continue;
50
+ }
51
+ if (data) {
52
+ issues.push(...(0, object_1.validateObjectFile)(data, fp, objectName, rel));
53
+ }
54
+ }
55
+ for (const { path: fp, objectName } of scan.fieldFiles) {
56
+ fileCount++;
57
+ const { data, error } = parseYaml(fp);
58
+ if (error) {
59
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
60
+ continue;
61
+ }
62
+ if (data) {
63
+ issues.push(...(0, field_1.validateFieldFile)(data, fp, rel));
64
+ if (!objectFieldData.has(objectName))
65
+ objectFieldData.set(objectName, []);
66
+ objectFieldData.get(objectName).push(data);
67
+ }
68
+ }
69
+ for (const { path: fp, objectName } of scan.objectFiles) {
70
+ const { data } = parseYaml(fp);
71
+ const fieldList = objectFieldData.get(objectName) || [];
72
+ issues.push(...(0, object_1.validateObjectHasNameField)(objectName, fieldList, data?.fields, rel(fp)));
73
+ }
74
+ for (const { path: fp, location } of scan.triggerFiles) {
75
+ fileCount++;
76
+ const { data, error } = parseYaml(fp);
77
+ if (error) {
78
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
79
+ continue;
80
+ }
81
+ if (data)
82
+ issues.push(...(0, trigger_1.validateTriggerFile)(data, fp, location, rel));
83
+ }
84
+ for (const { path: fp, location } of scan.functionFiles) {
85
+ fileCount++;
86
+ const { data, error } = parseYaml(fp);
87
+ if (error) {
88
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
89
+ continue;
90
+ }
91
+ if (data)
92
+ issues.push(...(0, function_1.validateFunctionFile)(data, fp, location, rel));
93
+ }
94
+ for (const { path: fp } of scan.buttonFiles) {
95
+ fileCount++;
96
+ const { data, error } = parseYaml(fp);
97
+ if (error) {
98
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
99
+ continue;
100
+ }
101
+ if (data)
102
+ issues.push(...(0, button_1.validateButtonFile)(data, fp, rel));
103
+ }
104
+ for (const { path: fp } of scan.listviewFiles) {
105
+ fileCount++;
106
+ const { data, error } = parseYaml(fp);
107
+ if (error) {
108
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
109
+ continue;
110
+ }
111
+ if (data)
112
+ issues.push(...(0, listview_1.validateListviewFile)(data, fp, rel));
113
+ }
114
+ for (const { path: fp } of scan.permissionFiles) {
115
+ fileCount++;
116
+ const { data, error } = parseYaml(fp);
117
+ if (error) {
118
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
119
+ continue;
120
+ }
121
+ if (data)
122
+ issues.push(...(0, permission_1.validatePermissionFile)(data, fp, rel));
123
+ }
124
+ for (const fp of scan.appFiles) {
125
+ fileCount++;
126
+ const { data, error } = parseYaml(fp);
127
+ if (error) {
128
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
129
+ continue;
130
+ }
131
+ if (data)
132
+ issues.push(...(0, app_1.validateAppFile)(data, fp, rel));
133
+ }
134
+ for (const fp of scan.tabFiles) {
135
+ fileCount++;
136
+ const { data, error } = parseYaml(fp);
137
+ if (error) {
138
+ issues.push({ file: rel(fp), level: 'error', rule: 'yaml.parse', message: `YAML 解析失败: ${error}` });
139
+ continue;
140
+ }
141
+ if (data)
142
+ issues.push(...(0, tab_1.validateTabFile)(data, fp, rel));
143
+ }
144
+ fileCount += scan.pageYmlFiles.length + scan.pageAmisFiles.length;
145
+ issues.push(...(0, page_1.validatePagePairs)(scan.pageYmlFiles, scan.pageAmisFiles, rel));
146
+ const errors = issues.filter(i => i.level === 'error').length;
147
+ const warnings = issues.filter(i => i.level === 'warning').length;
148
+ return {
149
+ packagePath: absPath,
150
+ summary: { files: fileCount, errors, warnings },
151
+ issues,
152
+ };
153
+ }
154
+ function formatText(result) {
155
+ const lines = [];
156
+ lines.push(`Validating: ${result.packagePath}\n`);
157
+ const grouped = new Map();
158
+ for (const issue of result.issues) {
159
+ if (!grouped.has(issue.file))
160
+ grouped.set(issue.file, []);
161
+ grouped.get(issue.file).push(issue);
162
+ }
163
+ for (const [file, fileIssues] of grouped) {
164
+ lines.push(file);
165
+ for (const issue of fileIssues) {
166
+ const icon = issue.level === 'error' ? '✗' : '⚠';
167
+ const tag = issue.level.toUpperCase();
168
+ lines.push(` ${icon} [${tag}] ${issue.message}`);
169
+ }
170
+ lines.push('');
171
+ }
172
+ lines.push('── Summary ──────────────────────────────');
173
+ lines.push(`${result.summary.files} files scanned, ${result.summary.errors} errors, ${result.summary.warnings} warnings`);
174
+ return lines.join('\n');
175
+ }
176
+ function cli(args = process.argv.slice(2)) {
177
+ const jsonMode = args.includes('--json');
178
+ const packagePath = args.find(a => !a.startsWith('--'));
179
+ if (!packagePath) {
180
+ console.error('Usage: steedos-validate <packagePath> [--json]');
181
+ process.exit(1);
182
+ }
183
+ if (!fs.existsSync(path.resolve(packagePath))) {
184
+ console.error(`Package path not found: ${path.resolve(packagePath)}`);
185
+ process.exit(1);
186
+ }
187
+ const result = validatePackage(packagePath);
188
+ if (jsonMode) {
189
+ console.log(JSON.stringify(result, null, 2));
190
+ }
191
+ else {
192
+ console.log(formatText(result));
193
+ }
194
+ process.exit(result.summary.errors > 0 ? 1 : 0);
195
+ }
196
+ if (require.main === module) {
197
+ cli();
198
+ }
199
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateAppFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAppFile = validateAppFile;
4
+ const constants_1 = require("../constants");
5
+ function validateAppFile(data, filePath, rel) {
6
+ const issues = [];
7
+ const file = rel(filePath);
8
+ if (!data.name) {
9
+ issues.push({ file, level: 'error', rule: 'app.required.name', message: '缺少必填字段: name' });
10
+ }
11
+ if (!data.code) {
12
+ issues.push({ file, level: 'error', rule: 'app.required.code', message: '缺少必填字段: code' });
13
+ }
14
+ if (!data.tabs || (Array.isArray(data.tabs) && data.tabs.length === 0)) {
15
+ issues.push({ file, level: 'warning', rule: 'app.required.tabs', message: '缺少 tabs 字段或为空,应用菜单将不会显示' });
16
+ }
17
+ if (data.icon_slds && !constants_1.VALID_SLDS_ICONS.has(data.icon_slds)) {
18
+ issues.push({ file, level: 'warning', rule: 'app.icon-invalid', message: `icon_slds "${data.icon_slds}" 不在有效的 SLDS 图标列表中` });
19
+ }
20
+ return issues;
21
+ }
22
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/rules/app.ts"],"names":[],"mappings":";;AAGA,0CAqBC;AAvBD,4CAAgD;AAEhD,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,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,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,4BAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateButtonFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateButtonFile = validateButtonFile;
4
+ const constants_1 = require("../constants");
5
+ function getAmisSchemaRoot(amis_schema) {
6
+ if (typeof amis_schema === 'object' && amis_schema !== null)
7
+ return amis_schema;
8
+ if (typeof amis_schema === 'string') {
9
+ try {
10
+ return JSON.parse(amis_schema);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ return null;
17
+ }
18
+ function validateButtonFile(data, filePath, rel) {
19
+ const issues = [];
20
+ const file = rel(filePath);
21
+ if (!data.name) {
22
+ issues.push({ file, level: 'error', rule: 'button.required.name', message: '缺少必填字段: name' });
23
+ }
24
+ const isStandardOverride = data.name && (data.name.startsWith('standard_') ||
25
+ data.name.startsWith('record_detail') ||
26
+ data.name.startsWith('record_listview'));
27
+ const isHiddenOnly = data.visible === false && !data.amis_schema && !data.type;
28
+ if (isStandardOverride && isHiddenOnly) {
29
+ return issues;
30
+ }
31
+ if (!data.label) {
32
+ issues.push({ file, level: 'error', rule: 'button.required.label', message: '缺少必填字段: label' });
33
+ }
34
+ if (data.type && data.type !== 'amis_button') {
35
+ issues.push({ file, level: 'error', rule: 'button.type-invalid', message: `type 应为 "amis_button",当前值: "${data.type}"` });
36
+ }
37
+ if (!data.on) {
38
+ issues.push({ file, level: 'error', rule: 'button.required.on', message: '缺少必填字段: on(显示位置)' });
39
+ }
40
+ else if (!constants_1.VALID_BUTTON_ON.has(data.on)) {
41
+ issues.push({ file, level: 'error', rule: 'button.on-invalid', message: `on 值 "${data.on}" 无效,有效值: ${[...constants_1.VALID_BUTTON_ON].join(', ')}` });
42
+ }
43
+ if (!data.amis_schema) {
44
+ issues.push({ file, level: 'error', rule: 'button.required.amis_schema', message: '缺少必填字段: amis_schema' });
45
+ }
46
+ else {
47
+ const root = getAmisSchemaRoot(data.amis_schema);
48
+ if (root && root.type !== 'service') {
49
+ issues.push({ file, level: 'error', rule: 'button.amis-root-service', message: `amis_schema 根节点 type 必须为 "service",当前为 "${root.type}"。请用 {"type":"service","body":{...}} 包装` });
50
+ }
51
+ }
52
+ if (data.label_zh !== undefined) {
53
+ issues.push({ file, level: 'error', rule: 'button.no-label_zh', message: '不应使用 label_zh 属性' });
54
+ }
55
+ return issues;
56
+ }
57
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/rules/button.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateFieldFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateFieldFile = validateFieldFile;
4
+ const path = require("path");
5
+ const constants_1 = require("../constants");
6
+ function isNestedFieldName(name) {
7
+ return name && (name.includes('.') || name.includes('$'));
8
+ }
9
+ function validateFieldFile(data, filePath, rel) {
10
+ const issues = [];
11
+ const file = rel(filePath);
12
+ const fileBaseName = path.basename(filePath, '.field.yml');
13
+ if (!data.name) {
14
+ issues.push({ file, level: 'error', rule: 'field.required.name', message: '缺少必填字段: name' });
15
+ }
16
+ else {
17
+ if (!isNestedFieldName(data.name) && data.name !== fileBaseName) {
18
+ issues.push({ file, level: 'error', rule: 'field.name-mismatch', message: `name "${data.name}" 与文件名 "${fileBaseName}" 不匹配` });
19
+ }
20
+ if (!isNestedFieldName(data.name) && !constants_1.SNAKE_CASE_REGEX.test(data.name)) {
21
+ issues.push({ file, level: 'warning', rule: 'field.name-case', message: `字段名 "${data.name}" 不符合 snake_case 规范` });
22
+ }
23
+ }
24
+ if (!data.type) {
25
+ issues.push({ file, level: 'error', rule: 'field.required.type', message: '缺少必填字段: type' });
26
+ }
27
+ else {
28
+ if (!constants_1.VALID_FIELD_TYPES.has(data.type)) {
29
+ issues.push({ file, level: 'error', rule: 'field.type-invalid', message: `字段类型 "${data.type}" 无效,有效类型: ${[...constants_1.VALID_FIELD_TYPES].join(', ')}` });
30
+ }
31
+ if (data.type === 'select' && !data.options && !data.optionsFunction) {
32
+ issues.push({ file, level: 'error', rule: 'field.select-no-options', message: 'select 类型字段必须配置 options 或 optionsFunction' });
33
+ }
34
+ if ((data.type === 'lookup' || data.type === 'master_detail') && !data.reference_to) {
35
+ issues.push({ file, level: 'error', rule: 'field.lookup-no-reference', message: `${data.type} 类型字段必须配置 reference_to` });
36
+ }
37
+ if (data.type === 'summary') {
38
+ if (data.summary_type && !constants_1.VALID_SUMMARY_TYPES.has(data.summary_type)) {
39
+ issues.push({ file, level: 'error', rule: 'field.summary-type-invalid', message: `summary_type "${data.summary_type}" 无效,有效值: count, sum, min, max, avg` });
40
+ }
41
+ }
42
+ if (data.type === 'formula') {
43
+ if (data.formula_blank_value && !constants_1.VALID_FORMULA_BLANK_VALUES.has(data.formula_blank_value)) {
44
+ issues.push({ file, level: 'error', rule: 'field.formula-blank-invalid', message: `formula_blank_value "${data.formula_blank_value}" 无效,有效值: zeroes, blanks` });
45
+ }
46
+ }
47
+ }
48
+ if (!data.label) {
49
+ issues.push({ file, level: 'error', rule: 'field.required.label', message: '缺少必填字段: label' });
50
+ }
51
+ if (data.label_zh !== undefined) {
52
+ issues.push({ file, level: 'error', rule: 'field.no-label_zh', message: '不应使用 label_zh 属性,请使用 .objectTranslation.yml 做国际化' });
53
+ }
54
+ return issues;
55
+ }
56
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../../src/rules/field.ts"],"names":[],"mappings":";;AAQA,8CAqDC;AA7DD,6BAA6B;AAE7B,4CAAoH;AAEpH,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAS,EAAE,QAAgB,EAAE,GAA0B;IACvF,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,WAAW,YAAY,OAAO,EAAE,CAAC,CAAC;QAChI,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4BAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,6BAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,cAAc,CAAC,GAAG,6BAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAClJ,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;QAC/H,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;QAC1H,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,+BAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,YAAY,qCAAqC,EAAE,CAAC,CAAC;YAC9J,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,sCAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1F,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,wBAAwB,IAAI,CAAC,mBAAmB,0BAA0B,EAAE,CAAC,CAAC;YAClK,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateFunctionFile(data: any, filePath: string, location: 'functions' | 'objects', rel: (p: string) => string): Issue[];
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateFunctionFile = validateFunctionFile;
4
+ function validateFunctionFile(data, filePath, location, rel) {
5
+ const issues = [];
6
+ const file = rel(filePath);
7
+ if (location === 'objects') {
8
+ issues.push({ file, level: 'error', rule: 'function.wrong-location', message: '函数文件应放在 functions/ 目录下,不应在 objects/ 内' });
9
+ }
10
+ if (!data.name) {
11
+ issues.push({ file, level: 'error', rule: 'function.required.name', message: '缺少必填字段: name' });
12
+ }
13
+ if (!data.objectApiName) {
14
+ issues.push({ file, level: 'error', rule: 'function.required.objectApiName', message: '缺少必填字段: objectApiName' });
15
+ }
16
+ if (data.name && data.objectApiName && !data.name.startsWith(`${data.objectApiName}_`)) {
17
+ issues.push({ file, level: 'warning', rule: 'function.name-convention', message: `函数名 "${data.name}" 建议以 "${data.objectApiName}_" 开头` });
18
+ }
19
+ if (data.isEnabled === undefined) {
20
+ issues.push({ file, level: 'warning', rule: 'function.required.isEnabled', message: '建议设置 isEnabled 字段' });
21
+ }
22
+ if (data.is_rest === undefined) {
23
+ issues.push({ file, level: 'warning', rule: 'function.required.is_rest', message: '建议设置 is_rest 字段' });
24
+ }
25
+ if (!data.script) {
26
+ issues.push({ file, level: 'error', rule: 'function.required.script', message: '缺少必填字段: script(内联 JavaScript 代码)' });
27
+ }
28
+ return issues;
29
+ }
30
+ //# sourceMappingURL=function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/rules/function.ts"],"names":[],"mappings":";;AAEA,oDAiCC;AAjCD,SAAgB,oBAAoB,CAAC,IAAS,EAAE,QAAgB,EAAE,QAAiC,EAAE,GAA0B;IAC7H,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAC3H,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IAC3I,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,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,2 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateListviewFile(data: any, filePath: string, rel: (p: string) => string): Issue[];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateListviewFile = validateListviewFile;
4
+ const constants_1 = require("../constants");
5
+ function validateListviewFile(data, filePath, rel) {
6
+ const issues = [];
7
+ const file = rel(filePath);
8
+ if (!data.name) {
9
+ issues.push({ file, level: 'error', rule: 'listview.required.name', message: '缺少必填字段: name' });
10
+ }
11
+ if (!data.label) {
12
+ issues.push({ file, level: 'error', rule: 'listview.required.label', message: '缺少必填字段: label' });
13
+ }
14
+ if (data.filter_scope && !constants_1.VALID_FILTER_SCOPES.has(data.filter_scope)) {
15
+ issues.push({ file, level: 'warning', rule: 'listview.filter_scope-invalid', message: `filter_scope "${data.filter_scope}" 无效,有效值: space, mine, all` });
16
+ }
17
+ if (Array.isArray(data.sort)) {
18
+ for (const s of data.sort) {
19
+ if (s.order && !constants_1.VALID_SORT_ORDERS.has(s.order)) {
20
+ issues.push({ file, level: 'warning', rule: 'listview.sort-order-invalid', message: `sort order "${s.order}" 无效,有效值: asc, desc` });
21
+ }
22
+ }
23
+ }
24
+ if (data.label_zh !== undefined) {
25
+ issues.push({ file, level: 'error', rule: 'listview.no-label_zh', message: '不应使用 label_zh 属性' });
26
+ }
27
+ return issues;
28
+ }
29
+ //# sourceMappingURL=listview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listview.js","sourceRoot":"","sources":["../../src/rules/listview.ts"],"names":[],"mappings":";;AAGA,oDA6BC;AA/BD,4CAAsE;AAEtE,SAAgB,oBAAoB,CAAC,IAAS,EAAE,QAAgB,EAAE,GAA0B;IAC1F,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,wBAAwB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,+BAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,+BAA+B,EAAE,OAAO,EAAE,iBAAiB,IAAI,CAAC,YAAY,4BAA4B,EAAE,CAAC,CAAC;IAC1J,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,6BAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC,CAAC;YACrI,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Issue } from '../types';
2
+ export declare function validateObjectFile(data: any, filePath: string, objectName: string, rel: (p: string) => string): Issue[];
3
+ export declare function validateObjectHasNameField(objectName: string, fieldDataList: Array<{
4
+ name?: string;
5
+ is_name?: boolean;
6
+ }>, inlineFields: any, rel: string): Issue[];