@sun-asterisk/sungen 1.0.5 → 1.0.6
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/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/validator/data-validator.d.ts +38 -0
- package/dist/core/validator/data-validator.d.ts.map +1 -0
- package/dist/core/validator/data-validator.js +212 -0
- package/dist/core/validator/data-validator.js.map +1 -0
- package/dist/core/validator/feature-validator.d.ts +27 -0
- package/dist/core/validator/feature-validator.d.ts.map +1 -0
- package/dist/core/validator/feature-validator.js +182 -0
- package/dist/core/validator/feature-validator.js.map +1 -0
- package/dist/core/validator/index.d.ts +46 -0
- package/dist/core/validator/index.d.ts.map +1 -0
- package/dist/core/validator/index.js +17 -0
- package/dist/core/validator/index.js.map +1 -0
- package/dist/core/validator/screen-validator.d.ts +35 -0
- package/dist/core/validator/screen-validator.d.ts.map +1 -0
- package/dist/core/validator/screen-validator.js +195 -0
- package/dist/core/validator/screen-validator.js.map +1 -0
- package/dist/core/validator/selector-validator.d.ts +35 -0
- package/dist/core/validator/selector-validator.d.ts.map +1 -0
- package/dist/core/validator/selector-validator.js +210 -0
- package/dist/core/validator/selector-validator.js.map +1 -0
- package/dist/generators/cli.js +1 -1
- package/dist/input/cli-adapter.d.ts +4 -0
- package/dist/input/cli-adapter.d.ts.map +1 -1
- package/dist/input/cli-adapter.js +12 -1
- package/dist/input/cli-adapter.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +85 -0
- package/src/core/validator/data-validator.ts +202 -0
- package/src/core/validator/feature-validator.ts +176 -0
- package/src/core/validator/index.ts +57 -0
- package/src/core/validator/screen-validator.ts +209 -0
- package/src/core/validator/selector-validator.ts +208 -0
- package/src/generators/cli.ts +1 -1
- package/src/input/cli-adapter.ts +13 -1
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,52 @@ const cli_adapter_1 = require("../input/cli-adapter");
|
|
|
9
9
|
const config_loader_1 = require("../config/config-loader");
|
|
10
10
|
const pipeline_1 = require("../orchestrator/pipeline");
|
|
11
11
|
const cache_manager_1 = require("../orchestrator/cache-manager");
|
|
12
|
+
/**
|
|
13
|
+
* Print validation result to console
|
|
14
|
+
*/
|
|
15
|
+
function printValidationResult(result, verbose = false) {
|
|
16
|
+
for (const fileResult of result.results) {
|
|
17
|
+
if (fileResult.valid) {
|
|
18
|
+
if (verbose) {
|
|
19
|
+
console.log(`✓ ${fileResult.file}`);
|
|
20
|
+
console.log(` ✓ Gherkin syntax valid`);
|
|
21
|
+
if (fileResult.warnings.length === 0) {
|
|
22
|
+
console.log(` ✓ All checks passed`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(`✓ ${fileResult.file}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(`✗ ${fileResult.file}`);
|
|
31
|
+
}
|
|
32
|
+
// Print warnings
|
|
33
|
+
for (const warning of fileResult.warnings) {
|
|
34
|
+
const lineInfo = warning.line ? `:${warning.line}` : '';
|
|
35
|
+
console.log(` ⊘ ${warning.message}${lineInfo}`);
|
|
36
|
+
}
|
|
37
|
+
// Print errors
|
|
38
|
+
for (const error of fileResult.errors) {
|
|
39
|
+
const lineInfo = error.line ? `:${error.line}` : '';
|
|
40
|
+
console.log(` ✗ ${error.message}${lineInfo}`);
|
|
41
|
+
}
|
|
42
|
+
if (!fileResult.valid || (verbose && fileResult.warnings.length > 0)) {
|
|
43
|
+
console.log('');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Print summary
|
|
47
|
+
console.log('\nSummary:');
|
|
48
|
+
console.log(` Files: ${result.summary.totalFiles} total, ${result.summary.passedFiles} passed, ${result.summary.failedFiles} failed`);
|
|
49
|
+
console.log(` Errors: ${result.summary.totalErrors}`);
|
|
50
|
+
console.log(` Warnings: ${result.summary.totalWarnings}`);
|
|
51
|
+
if (result.valid) {
|
|
52
|
+
console.log('\n✅ Validation passed');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log('\n❌ Validation failed');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
12
58
|
async function main() {
|
|
13
59
|
const adapter = new cli_adapter_1.CLIAdapter();
|
|
14
60
|
const program = adapter.createProgram();
|
|
@@ -186,6 +232,39 @@ async function main() {
|
|
|
186
232
|
process.exit(1);
|
|
187
233
|
}
|
|
188
234
|
});
|
|
235
|
+
const validateCmd = adapter.addValidateCommand(program);
|
|
236
|
+
validateCmd.action(async (options) => {
|
|
237
|
+
try {
|
|
238
|
+
const { ScreenValidator } = require('../core/validator');
|
|
239
|
+
const validator = new ScreenValidator({
|
|
240
|
+
verbose: options.verbose,
|
|
241
|
+
});
|
|
242
|
+
let result;
|
|
243
|
+
if (options.screen) {
|
|
244
|
+
console.log(`Validating screen: ${options.screen}\n`);
|
|
245
|
+
result = validator.validateScreen(options.screen);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log('Validating all screens...\n');
|
|
249
|
+
result = validator.validateAll();
|
|
250
|
+
}
|
|
251
|
+
// Output results
|
|
252
|
+
if (options.json) {
|
|
253
|
+
console.log(JSON.stringify(result, null, 2));
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
printValidationResult(result, options.verbose);
|
|
257
|
+
}
|
|
258
|
+
// Exit with error code if validation failed
|
|
259
|
+
if (!result.valid) {
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
console.error('❌ Validation failed:', error);
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
189
268
|
// Parse arguments
|
|
190
269
|
await program.parseAsync(process.argv);
|
|
191
270
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,sDAAkD;AAClD,2DAAuD;AACvD,uDAAoD;AACpD,iEAA6D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,sDAAkD;AAClD,2DAAuD;AACvD,uDAAoD;AACpD,iEAA6D;AAG7D;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAwB,EAAE,UAAmB,KAAK;IAC/E,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,iBAAiB;QACjB,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,eAAe;QACf,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,UAAU,WAAW,MAAM,CAAC,OAAO,CAAC,WAAW,YAAY,MAAM,CAAC,OAAO,CAAC,WAAW,SAAS,CAAC,CAAC;IACvI,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,wBAAU,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAExC,eAAe;IACf,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7B,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAE1C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,uDAAuD;gBACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC;gBAClD,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC;gBAEjD,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBAEpF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,WAAW,UAAU,CAAC,CAAC;oBAEtD,uBAAuB;oBACvB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC;oBACxF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,MAAM,CAAC,YAAY,YAAY,CAAC,CAAC;oBAC/F,CAAC;oBAED,wBAAwB;oBACxB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;oBACzF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC,YAAY,eAAe,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;YACnG,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACxB,4CAA4C;gBAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBACpF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,YAAY,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAC7C,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,4BAAY,CAAC,MAAM,CAAC,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACtD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAExE,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1D,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;YAEpC,MAAM,OAAO,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEzD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;gBACpC,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YAEH,IAAI,MAAwB,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;gBACtD,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACnC,CAAC;YAED,iBAAiB;YACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YAED,4CAA4C;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Validator
|
|
3
|
+
* Validates test-data YAML files and checks referenced data paths exist
|
|
4
|
+
*/
|
|
5
|
+
import { ValidationIssue } from './index';
|
|
6
|
+
export declare class DataValidator {
|
|
7
|
+
private screenName;
|
|
8
|
+
private baseDir;
|
|
9
|
+
private dataCache;
|
|
10
|
+
constructor(screenName: string, baseDir?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Validate test-data file for a feature
|
|
13
|
+
*/
|
|
14
|
+
validateFile(featureName: string): {
|
|
15
|
+
errors: ValidationIssue[];
|
|
16
|
+
warnings: ValidationIssue[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check if data references exist and resolve to primitives
|
|
20
|
+
*/
|
|
21
|
+
validateRefs(featureName: string, refs: Array<{
|
|
22
|
+
ref: string;
|
|
23
|
+
line: number;
|
|
24
|
+
}>, featureFile: string): ValidationIssue[];
|
|
25
|
+
/**
|
|
26
|
+
* Resolve dotted path in data object
|
|
27
|
+
*/
|
|
28
|
+
private resolvePath;
|
|
29
|
+
/**
|
|
30
|
+
* Check if value is a primitive (string, number, boolean)
|
|
31
|
+
*/
|
|
32
|
+
private isPrimitive;
|
|
33
|
+
/**
|
|
34
|
+
* Find test-data file path
|
|
35
|
+
*/
|
|
36
|
+
private findDataPath;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/data-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA+B;gBAEpC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKhD;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE;IAuD7F;;OAEG;IACH,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAC1C,WAAW,EAAE,MAAM,GAClB,eAAe,EAAE;IAoEpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Data Validator
|
|
4
|
+
* Validates test-data YAML files and checks referenced data paths exist
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.DataValidator = void 0;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
47
|
+
class DataValidator {
|
|
48
|
+
constructor(screenName, baseDir) {
|
|
49
|
+
this.dataCache = new Map();
|
|
50
|
+
this.screenName = screenName;
|
|
51
|
+
this.baseDir = baseDir || process.cwd();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate test-data file for a feature
|
|
55
|
+
*/
|
|
56
|
+
validateFile(featureName) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
const warnings = [];
|
|
59
|
+
const filePath = this.findDataPath(featureName);
|
|
60
|
+
if (!filePath) {
|
|
61
|
+
// Data file is optional - only warn if there are data refs
|
|
62
|
+
return { errors, warnings };
|
|
63
|
+
}
|
|
64
|
+
// Load and parse YAML
|
|
65
|
+
let content;
|
|
66
|
+
let data;
|
|
67
|
+
try {
|
|
68
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
errors.push({
|
|
72
|
+
type: 'error',
|
|
73
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
74
|
+
message: `Cannot read file: ${error.message}`,
|
|
75
|
+
file: filePath,
|
|
76
|
+
});
|
|
77
|
+
return { errors, warnings };
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
data = yaml_1.default.parse(content);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
errors.push({
|
|
84
|
+
type: 'error',
|
|
85
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
86
|
+
message: `YAML parse error: ${error.message}`,
|
|
87
|
+
file: filePath,
|
|
88
|
+
});
|
|
89
|
+
return { errors, warnings };
|
|
90
|
+
}
|
|
91
|
+
if (data && typeof data !== 'object') {
|
|
92
|
+
errors.push({
|
|
93
|
+
type: 'error',
|
|
94
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
95
|
+
message: 'Test data file must be a valid YAML object',
|
|
96
|
+
file: filePath,
|
|
97
|
+
});
|
|
98
|
+
return { errors, warnings };
|
|
99
|
+
}
|
|
100
|
+
// Cache for later ref validation
|
|
101
|
+
this.dataCache.set(featureName, data || {});
|
|
102
|
+
return { errors, warnings };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if data references exist and resolve to primitives
|
|
106
|
+
*/
|
|
107
|
+
validateRefs(featureName, refs, featureFile) {
|
|
108
|
+
const errors = [];
|
|
109
|
+
if (refs.length === 0) {
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
// Load data if not cached
|
|
113
|
+
if (!this.dataCache.has(featureName)) {
|
|
114
|
+
const filePath = this.findDataPath(featureName);
|
|
115
|
+
if (!filePath) {
|
|
116
|
+
// Data file doesn't exist but we have refs - error
|
|
117
|
+
for (const { ref, line } of refs) {
|
|
118
|
+
errors.push({
|
|
119
|
+
type: 'error',
|
|
120
|
+
code: 'MISSING_DATA_FILE',
|
|
121
|
+
message: `Test data file not found for feature "${featureName}" (needed for {{${ref}}})`,
|
|
122
|
+
file: featureFile,
|
|
123
|
+
line,
|
|
124
|
+
element: ref,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return errors;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
131
|
+
const data = yaml_1.default.parse(content);
|
|
132
|
+
this.dataCache.set(featureName, data || {});
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Error already reported in validateFile
|
|
136
|
+
return errors;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const data = this.dataCache.get(featureName);
|
|
140
|
+
if (!data) {
|
|
141
|
+
return errors;
|
|
142
|
+
}
|
|
143
|
+
// Check each ref
|
|
144
|
+
for (const { ref, line } of refs) {
|
|
145
|
+
const result = this.resolvePath(data, ref);
|
|
146
|
+
if (!result.found) {
|
|
147
|
+
errors.push({
|
|
148
|
+
type: 'error',
|
|
149
|
+
code: 'MISSING_DATA_REF',
|
|
150
|
+
message: `Data {{${ref}}} not found in test-data/${featureName}.yaml (failed at: ${result.failedAt})`,
|
|
151
|
+
file: featureFile,
|
|
152
|
+
line,
|
|
153
|
+
element: ref,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else if (!this.isPrimitive(result.value)) {
|
|
157
|
+
errors.push({
|
|
158
|
+
type: 'error',
|
|
159
|
+
code: 'INVALID_DATA_VALUE',
|
|
160
|
+
message: `Data {{${ref}}} must resolve to a primitive value, got: ${typeof result.value}`,
|
|
161
|
+
file: featureFile,
|
|
162
|
+
line,
|
|
163
|
+
element: ref,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return errors;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Resolve dotted path in data object
|
|
171
|
+
*/
|
|
172
|
+
resolvePath(data, ref) {
|
|
173
|
+
const parts = ref.split('.');
|
|
174
|
+
let current = data;
|
|
175
|
+
for (const key of parts) {
|
|
176
|
+
if (current && typeof current === 'object' && key in current) {
|
|
177
|
+
current = current[key];
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return { found: false, failedAt: key };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return { found: true, value: current };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Check if value is a primitive (string, number, boolean)
|
|
187
|
+
*/
|
|
188
|
+
isPrimitive(value) {
|
|
189
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Find test-data file path
|
|
193
|
+
*/
|
|
194
|
+
findDataPath(featureName) {
|
|
195
|
+
const possiblePaths = [
|
|
196
|
+
// New structure
|
|
197
|
+
path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yaml`),
|
|
198
|
+
path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yml`),
|
|
199
|
+
// Legacy structure
|
|
200
|
+
path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yaml`),
|
|
201
|
+
path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yml`),
|
|
202
|
+
];
|
|
203
|
+
for (const p of possiblePaths) {
|
|
204
|
+
if (fs.existsSync(p)) {
|
|
205
|
+
return p;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.DataValidator = DataValidator;
|
|
212
|
+
//# sourceMappingURL=data-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-validator.js","sourceRoot":"","sources":["../../../src/core/validator/data-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Validator
|
|
3
|
+
* Validates Gherkin feature files and extracts selector/data references
|
|
4
|
+
*/
|
|
5
|
+
import { ValidationIssue, ExtractedRefs } from './index';
|
|
6
|
+
export interface FeatureValidationResult {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: ValidationIssue[];
|
|
9
|
+
warnings: ValidationIssue[];
|
|
10
|
+
path?: string;
|
|
11
|
+
refs: ExtractedRefs;
|
|
12
|
+
}
|
|
13
|
+
export declare class FeatureValidator {
|
|
14
|
+
private builder;
|
|
15
|
+
private matcher;
|
|
16
|
+
private parser;
|
|
17
|
+
constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Validate a feature file
|
|
20
|
+
*/
|
|
21
|
+
validate(filePath: string): FeatureValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Extract selector and data references from steps
|
|
24
|
+
*/
|
|
25
|
+
private extractRefsFromSteps;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=feature-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/feature-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO,CAAC,MAAM,CAAiB;;IAU/B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB;IAoGnD;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAqC7B"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Feature Validator
|
|
4
|
+
* Validates Gherkin feature files and extracts selector/data references
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.FeatureValidator = void 0;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const Gherkin = __importStar(require("@cucumber/gherkin"));
|
|
43
|
+
const Messages = __importStar(require("@cucumber/messages"));
|
|
44
|
+
class FeatureValidator {
|
|
45
|
+
constructor() {
|
|
46
|
+
const uuidFn = Messages.IdGenerator.uuid();
|
|
47
|
+
this.builder = new Gherkin.AstBuilder(uuidFn);
|
|
48
|
+
this.matcher = new Gherkin.GherkinClassicTokenMatcher();
|
|
49
|
+
// @ts-ignore - Parser typing issue with @cucumber/gherkin
|
|
50
|
+
this.parser = new Gherkin.Parser(this.builder, this.matcher);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validate a feature file
|
|
54
|
+
*/
|
|
55
|
+
validate(filePath) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
const warnings = [];
|
|
58
|
+
const refs = { selectors: [], dataRefs: [] };
|
|
59
|
+
let path;
|
|
60
|
+
// Check file exists
|
|
61
|
+
if (!fs.existsSync(filePath)) {
|
|
62
|
+
errors.push({
|
|
63
|
+
type: 'error',
|
|
64
|
+
code: 'GHERKIN_SYNTAX_ERROR',
|
|
65
|
+
message: `Feature file not found: ${filePath}`,
|
|
66
|
+
file: filePath,
|
|
67
|
+
});
|
|
68
|
+
return { valid: false, errors, warnings, refs };
|
|
69
|
+
}
|
|
70
|
+
// Read and parse content
|
|
71
|
+
let content;
|
|
72
|
+
try {
|
|
73
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
errors.push({
|
|
77
|
+
type: 'error',
|
|
78
|
+
code: 'GHERKIN_SYNTAX_ERROR',
|
|
79
|
+
message: `Cannot read file: ${error.message}`,
|
|
80
|
+
file: filePath,
|
|
81
|
+
});
|
|
82
|
+
return { valid: false, errors, warnings, refs };
|
|
83
|
+
}
|
|
84
|
+
// Parse Gherkin
|
|
85
|
+
let gherkinDocument;
|
|
86
|
+
try {
|
|
87
|
+
gherkinDocument = this.parser.parse(content);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const errMsg = error.message;
|
|
91
|
+
// Try to extract line number from error message
|
|
92
|
+
const lineMatch = errMsg.match(/\((\d+):\d+\)/);
|
|
93
|
+
const line = lineMatch ? parseInt(lineMatch[1], 10) : undefined;
|
|
94
|
+
errors.push({
|
|
95
|
+
type: 'error',
|
|
96
|
+
code: 'GHERKIN_SYNTAX_ERROR',
|
|
97
|
+
message: `Gherkin parse error: ${errMsg}`,
|
|
98
|
+
file: filePath,
|
|
99
|
+
line,
|
|
100
|
+
});
|
|
101
|
+
return { valid: false, errors, warnings, refs };
|
|
102
|
+
}
|
|
103
|
+
// Check feature exists
|
|
104
|
+
if (!gherkinDocument.feature) {
|
|
105
|
+
errors.push({
|
|
106
|
+
type: 'error',
|
|
107
|
+
code: 'EMPTY_FEATURE',
|
|
108
|
+
message: 'No feature found in file',
|
|
109
|
+
file: filePath,
|
|
110
|
+
});
|
|
111
|
+
return { valid: false, errors, warnings, refs };
|
|
112
|
+
}
|
|
113
|
+
const feature = gherkinDocument.feature;
|
|
114
|
+
// Extract Path metadata
|
|
115
|
+
const description = feature.description || '';
|
|
116
|
+
const pathMatch = description.match(/^\s*Path:\s*(.+)$/m);
|
|
117
|
+
if (pathMatch) {
|
|
118
|
+
path = pathMatch[1].trim();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
warnings.push({
|
|
122
|
+
type: 'warning',
|
|
123
|
+
code: 'MISSING_PATH_METADATA',
|
|
124
|
+
message: 'Missing Path: metadata in feature description',
|
|
125
|
+
file: filePath,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Extract refs from background
|
|
129
|
+
const background = feature.children.find(child => child.background)?.background;
|
|
130
|
+
if (background) {
|
|
131
|
+
this.extractRefsFromSteps(background.steps, filePath, refs);
|
|
132
|
+
}
|
|
133
|
+
// Extract refs from scenarios
|
|
134
|
+
for (const child of feature.children) {
|
|
135
|
+
if (child.scenario) {
|
|
136
|
+
this.extractRefsFromSteps(child.scenario.steps, filePath, refs);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
valid: errors.length === 0,
|
|
141
|
+
errors,
|
|
142
|
+
warnings,
|
|
143
|
+
path,
|
|
144
|
+
refs,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract selector and data references from steps
|
|
149
|
+
*/
|
|
150
|
+
extractRefsFromSteps(steps, filePath, refs) {
|
|
151
|
+
for (const step of steps) {
|
|
152
|
+
const text = step.text;
|
|
153
|
+
const line = step.location?.line;
|
|
154
|
+
// Extract selector references: [Element Name]
|
|
155
|
+
const selectorMatches = text.matchAll(/\[([^\]]+)\]/g);
|
|
156
|
+
for (const match of selectorMatches) {
|
|
157
|
+
refs.selectors.push({
|
|
158
|
+
ref: match[1],
|
|
159
|
+
line: line || 0,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Extract data references: {{variable}} or {{path.to.value}}
|
|
163
|
+
const dataMatches = text.matchAll(/\{\{([a-zA-Z0-9\-\.\_]+)\}\}/g);
|
|
164
|
+
for (const match of dataMatches) {
|
|
165
|
+
refs.dataRefs.push({
|
|
166
|
+
ref: match[1],
|
|
167
|
+
line: line || 0,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Legacy format: <variable>
|
|
171
|
+
const legacyDataMatches = text.matchAll(/<([^>]+)>/g);
|
|
172
|
+
for (const match of legacyDataMatches) {
|
|
173
|
+
refs.dataRefs.push({
|
|
174
|
+
ref: match[1],
|
|
175
|
+
line: line || 0,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.FeatureValidator = FeatureValidator;
|
|
182
|
+
//# sourceMappingURL=feature-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-validator.js","sourceRoot":"","sources":["../../../src/core/validator/feature-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator Core - Types and Exports
|
|
3
|
+
* Validates Gherkin features and selector/test-data mappings
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationIssue {
|
|
6
|
+
type: 'error' | 'warning';
|
|
7
|
+
code: ValidationCode;
|
|
8
|
+
message: string;
|
|
9
|
+
file: string;
|
|
10
|
+
line?: number;
|
|
11
|
+
element?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ValidationSummary {
|
|
14
|
+
totalFiles: number;
|
|
15
|
+
passedFiles: number;
|
|
16
|
+
failedFiles: number;
|
|
17
|
+
totalErrors: number;
|
|
18
|
+
totalWarnings: number;
|
|
19
|
+
}
|
|
20
|
+
export interface FileValidationResult {
|
|
21
|
+
file: string;
|
|
22
|
+
valid: boolean;
|
|
23
|
+
errors: ValidationIssue[];
|
|
24
|
+
warnings: ValidationIssue[];
|
|
25
|
+
}
|
|
26
|
+
export interface ValidationResult {
|
|
27
|
+
valid: boolean;
|
|
28
|
+
summary: ValidationSummary;
|
|
29
|
+
results: FileValidationResult[];
|
|
30
|
+
}
|
|
31
|
+
export type ValidationCode = 'GHERKIN_SYNTAX_ERROR' | 'MISSING_PATH_METADATA' | 'MISSING_SELECTOR_FILE' | 'MISSING_SELECTOR' | 'MISSING_DATA_FILE' | 'MISSING_DATA_REF' | 'INVALID_YAML_SYNTAX' | 'INVALID_SELECTOR_TYPE' | 'INVALID_DATA_VALUE' | 'EMPTY_FEATURE';
|
|
32
|
+
export interface ExtractedRefs {
|
|
33
|
+
selectors: Array<{
|
|
34
|
+
ref: string;
|
|
35
|
+
line: number;
|
|
36
|
+
}>;
|
|
37
|
+
dataRefs: Array<{
|
|
38
|
+
ref: string;
|
|
39
|
+
line: number;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
export { FeatureValidator } from './feature-validator';
|
|
43
|
+
export { SelectorValidator } from './selector-validator';
|
|
44
|
+
export { DataValidator } from './data-validator';
|
|
45
|
+
export { ScreenValidator } from './screen-validator';
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|