@sun-asterisk/sungen 1.0.5 → 1.0.7

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 (85) hide show
  1. package/README.md +173 -1
  2. package/dist/cli/index.js +155 -4
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/core/validator/data-validator.d.ts +38 -0
  5. package/dist/core/validator/data-validator.d.ts.map +1 -0
  6. package/dist/core/validator/data-validator.js +212 -0
  7. package/dist/core/validator/data-validator.js.map +1 -0
  8. package/dist/core/validator/feature-validator.d.ts +27 -0
  9. package/dist/core/validator/feature-validator.d.ts.map +1 -0
  10. package/dist/core/validator/feature-validator.js +182 -0
  11. package/dist/core/validator/feature-validator.js.map +1 -0
  12. package/dist/core/validator/index.d.ts +46 -0
  13. package/dist/core/validator/index.d.ts.map +1 -0
  14. package/dist/core/validator/index.js +17 -0
  15. package/dist/core/validator/index.js.map +1 -0
  16. package/dist/core/validator/screen-validator.d.ts +35 -0
  17. package/dist/core/validator/screen-validator.d.ts.map +1 -0
  18. package/dist/core/validator/screen-validator.js +195 -0
  19. package/dist/core/validator/screen-validator.js.map +1 -0
  20. package/dist/core/validator/selector-validator.d.ts +35 -0
  21. package/dist/core/validator/selector-validator.d.ts.map +1 -0
  22. package/dist/core/validator/selector-validator.js +210 -0
  23. package/dist/core/validator/selector-validator.js.map +1 -0
  24. package/dist/generators/cli.js +1 -1
  25. package/dist/generators/gherkin-parser/index.d.ts +1 -0
  26. package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
  27. package/dist/generators/gherkin-parser/index.js +3 -0
  28. package/dist/generators/gherkin-parser/index.js.map +1 -1
  29. package/dist/generators/scaffold-generator/index.d.ts +25 -2
  30. package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
  31. package/dist/generators/scaffold-generator/index.js +157 -14
  32. package/dist/generators/scaffold-generator/index.js.map +1 -1
  33. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +2 -0
  34. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
  35. package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
  36. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
  37. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
  38. package/dist/generators/test-generator/auth-setup-generator.d.ts +18 -0
  39. package/dist/generators/test-generator/auth-setup-generator.d.ts.map +1 -0
  40. package/dist/generators/test-generator/auth-setup-generator.js +82 -0
  41. package/dist/generators/test-generator/auth-setup-generator.js.map +1 -0
  42. package/dist/generators/test-generator/code-generator.d.ts +2 -0
  43. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  44. package/dist/generators/test-generator/code-generator.js +130 -5
  45. package/dist/generators/test-generator/code-generator.js.map +1 -1
  46. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
  47. package/dist/generators/test-generator/patterns/assertion-patterns.js +30 -0
  48. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
  49. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
  50. package/dist/generators/test-generator/patterns/form-patterns.js +25 -5
  51. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
  52. package/dist/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
  53. package/dist/input/cli-adapter.d.ts +8 -0
  54. package/dist/input/cli-adapter.d.ts.map +1 -1
  55. package/dist/input/cli-adapter.js +31 -1
  56. package/dist/input/cli-adapter.js.map +1 -1
  57. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  58. package/dist/orchestrator/pipeline.js +31 -22
  59. package/dist/orchestrator/pipeline.js.map +1 -1
  60. package/dist/tools/auth-maker.d.ts +74 -0
  61. package/dist/tools/auth-maker.d.ts.map +1 -0
  62. package/dist/tools/auth-maker.js +420 -0
  63. package/dist/tools/auth-maker.js.map +1 -0
  64. package/package.json +2 -2
  65. package/src/cli/index.ts +166 -4
  66. package/src/core/validator/data-validator.ts +202 -0
  67. package/src/core/validator/feature-validator.ts +176 -0
  68. package/src/core/validator/index.ts +57 -0
  69. package/src/core/validator/screen-validator.ts +209 -0
  70. package/src/core/validator/selector-validator.ts +208 -0
  71. package/src/generators/cli.ts +1 -1
  72. package/src/generators/gherkin-parser/index.ts +5 -0
  73. package/src/generators/scaffold-generator/index.ts +179 -19
  74. package/src/generators/test-generator/adapters/adapter-interface.ts +2 -0
  75. package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
  76. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
  77. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
  78. package/src/generators/test-generator/auth-setup-generator.ts +59 -0
  79. package/src/generators/test-generator/code-generator.ts +173 -6
  80. package/src/generators/test-generator/patterns/assertion-patterns.ts +34 -1
  81. package/src/generators/test-generator/patterns/form-patterns.ts +27 -8
  82. package/src/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
  83. package/src/input/cli-adapter.ts +33 -1
  84. package/src/orchestrator/pipeline.ts +39 -24
  85. package/src/tools/auth-maker.ts +467 -0
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,cAAc,GACtB,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAGD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * Validator Core - Types and Exports
4
+ * Validates Gherkin features and selector/test-data mappings
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ScreenValidator = exports.DataValidator = exports.SelectorValidator = exports.FeatureValidator = void 0;
8
+ // Re-exports
9
+ var feature_validator_1 = require("./feature-validator");
10
+ Object.defineProperty(exports, "FeatureValidator", { enumerable: true, get: function () { return feature_validator_1.FeatureValidator; } });
11
+ var selector_validator_1 = require("./selector-validator");
12
+ Object.defineProperty(exports, "SelectorValidator", { enumerable: true, get: function () { return selector_validator_1.SelectorValidator; } });
13
+ var data_validator_1 = require("./data-validator");
14
+ Object.defineProperty(exports, "DataValidator", { enumerable: true, get: function () { return data_validator_1.DataValidator; } });
15
+ var screen_validator_1 = require("./screen-validator");
16
+ Object.defineProperty(exports, "ScreenValidator", { enumerable: true, get: function () { return screen_validator_1.ScreenValidator; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validator/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiDH,aAAa;AACb,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Screen Validator
3
+ * Orchestrates validation for a screen (all features in qa/screens/<name>/)
4
+ */
5
+ import { ValidationResult } from './index';
6
+ export interface ScreenValidatorOptions {
7
+ verbose?: boolean;
8
+ baseDir?: string;
9
+ }
10
+ export declare class ScreenValidator {
11
+ private baseDir;
12
+ private verbose;
13
+ constructor(options?: ScreenValidatorOptions);
14
+ /**
15
+ * Validate a specific screen
16
+ */
17
+ validateScreen(screenName: string): ValidationResult;
18
+ /**
19
+ * Validate all screens
20
+ */
21
+ validateAll(): ValidationResult;
22
+ /**
23
+ * Discover .feature files in a directory
24
+ */
25
+ private discoverFeatureFiles;
26
+ /**
27
+ * Build final validation result
28
+ */
29
+ private buildResult;
30
+ /**
31
+ * Create error result for invalid setup
32
+ */
33
+ private createErrorResult;
34
+ }
35
+ //# sourceMappingURL=screen-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/screen-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,gBAAgB,EAIjB,MAAM,SAAS,CAAC;AAKjB,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,sBAA2B;IAKhD;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB;IAkFpD;;OAEG;IACH,WAAW,IAAI,gBAAgB;IAyB/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAuB1B"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * Screen Validator
4
+ * Orchestrates validation for a screen (all features in qa/screens/<name>/)
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.ScreenValidator = void 0;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const feature_validator_1 = require("./feature-validator");
44
+ const selector_validator_1 = require("./selector-validator");
45
+ const data_validator_1 = require("./data-validator");
46
+ class ScreenValidator {
47
+ constructor(options = {}) {
48
+ this.baseDir = options.baseDir || process.cwd();
49
+ this.verbose = options.verbose || false;
50
+ }
51
+ /**
52
+ * Validate a specific screen
53
+ */
54
+ validateScreen(screenName) {
55
+ const results = [];
56
+ const screenDir = path.join(this.baseDir, 'qa', 'screens', screenName);
57
+ const featuresDir = path.join(screenDir, 'features');
58
+ // Check if screen exists
59
+ if (!fs.existsSync(screenDir)) {
60
+ return this.createErrorResult(`Screen "${screenName}" not found at ${screenDir}`);
61
+ }
62
+ if (!fs.existsSync(featuresDir)) {
63
+ return this.createErrorResult(`Features directory not found at ${featuresDir}`);
64
+ }
65
+ // Find all feature files
66
+ const featureFiles = this.discoverFeatureFiles(featuresDir);
67
+ if (featureFiles.length === 0) {
68
+ return this.createErrorResult(`No .feature files found in ${featuresDir}`);
69
+ }
70
+ // Initialize validators
71
+ const featureValidator = new feature_validator_1.FeatureValidator();
72
+ const selectorValidator = new selector_validator_1.SelectorValidator(screenName, this.baseDir);
73
+ const dataValidator = new data_validator_1.DataValidator(screenName, this.baseDir);
74
+ // Validate each feature file
75
+ for (const featureFile of featureFiles) {
76
+ const featureName = path.basename(featureFile, '.feature');
77
+ const relativeFile = path.relative(this.baseDir, featureFile);
78
+ const fileResult = {
79
+ file: relativeFile,
80
+ valid: true,
81
+ errors: [],
82
+ warnings: [],
83
+ };
84
+ // 1. Validate Gherkin syntax and extract refs
85
+ const featureResult = featureValidator.validate(featureFile);
86
+ fileResult.errors.push(...featureResult.errors);
87
+ fileResult.warnings.push(...featureResult.warnings);
88
+ // 2. Validate selector file
89
+ const selectorFileResult = selectorValidator.validateFile(featureName);
90
+ fileResult.errors.push(...selectorFileResult.errors);
91
+ fileResult.warnings.push(...selectorFileResult.warnings);
92
+ // 3. Validate selector refs exist
93
+ if (featureResult.refs.selectors.length > 0) {
94
+ const selectorRefErrors = selectorValidator.validateRefs(featureName, featureResult.refs.selectors, relativeFile);
95
+ fileResult.errors.push(...selectorRefErrors);
96
+ }
97
+ // 4. Validate data file
98
+ const dataFileResult = dataValidator.validateFile(featureName);
99
+ fileResult.errors.push(...dataFileResult.errors);
100
+ fileResult.warnings.push(...dataFileResult.warnings);
101
+ // 5. Validate data refs exist
102
+ if (featureResult.refs.dataRefs.length > 0) {
103
+ const dataRefErrors = dataValidator.validateRefs(featureName, featureResult.refs.dataRefs, relativeFile);
104
+ fileResult.errors.push(...dataRefErrors);
105
+ }
106
+ // Update validity
107
+ fileResult.valid = fileResult.errors.length === 0;
108
+ results.push(fileResult);
109
+ }
110
+ return this.buildResult(results);
111
+ }
112
+ /**
113
+ * Validate all screens
114
+ */
115
+ validateAll() {
116
+ const screensDir = path.join(this.baseDir, 'qa', 'screens');
117
+ if (!fs.existsSync(screensDir)) {
118
+ return this.createErrorResult(`Screens directory not found at ${screensDir}`);
119
+ }
120
+ const screens = fs.readdirSync(screensDir, { withFileTypes: true })
121
+ .filter(entry => entry.isDirectory())
122
+ .map(entry => entry.name);
123
+ if (screens.length === 0) {
124
+ return this.createErrorResult(`No screens found in ${screensDir}`);
125
+ }
126
+ const allResults = [];
127
+ for (const screenName of screens) {
128
+ const screenResult = this.validateScreen(screenName);
129
+ allResults.push(...screenResult.results);
130
+ }
131
+ return this.buildResult(allResults);
132
+ }
133
+ /**
134
+ * Discover .feature files in a directory
135
+ */
136
+ discoverFeatureFiles(dir) {
137
+ const files = [];
138
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
139
+ for (const entry of entries) {
140
+ const fullPath = path.join(dir, entry.name);
141
+ if (entry.isDirectory()) {
142
+ files.push(...this.discoverFeatureFiles(fullPath));
143
+ }
144
+ else if (entry.isFile() && entry.name.endsWith('.feature')) {
145
+ files.push(fullPath);
146
+ }
147
+ }
148
+ return files;
149
+ }
150
+ /**
151
+ * Build final validation result
152
+ */
153
+ buildResult(results) {
154
+ const summary = {
155
+ totalFiles: results.length,
156
+ passedFiles: results.filter(r => r.valid).length,
157
+ failedFiles: results.filter(r => !r.valid).length,
158
+ totalErrors: results.reduce((sum, r) => sum + r.errors.length, 0),
159
+ totalWarnings: results.reduce((sum, r) => sum + r.warnings.length, 0),
160
+ };
161
+ return {
162
+ valid: summary.failedFiles === 0,
163
+ summary,
164
+ results,
165
+ };
166
+ }
167
+ /**
168
+ * Create error result for invalid setup
169
+ */
170
+ createErrorResult(message) {
171
+ return {
172
+ valid: false,
173
+ summary: {
174
+ totalFiles: 0,
175
+ passedFiles: 0,
176
+ failedFiles: 0,
177
+ totalErrors: 1,
178
+ totalWarnings: 0,
179
+ },
180
+ results: [{
181
+ file: '',
182
+ valid: false,
183
+ errors: [{
184
+ type: 'error',
185
+ code: 'GHERKIN_SYNTAX_ERROR',
186
+ message,
187
+ file: '',
188
+ }],
189
+ warnings: [],
190
+ }],
191
+ };
192
+ }
193
+ }
194
+ exports.ScreenValidator = ScreenValidator;
195
+ //# sourceMappingURL=screen-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-validator.js","sourceRoot":"","sources":["../../../src/core/validator/screen-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Selector Validator
3
+ * Validates selector YAML files and checks referenced selectors exist
4
+ */
5
+ import { ValidationIssue } from './index';
6
+ export declare class SelectorValidator {
7
+ private screenName;
8
+ private baseDir;
9
+ private selectorCache;
10
+ constructor(screenName: string, baseDir?: string);
11
+ /**
12
+ * Validate selector file for a feature
13
+ */
14
+ validateFile(featureName: string): {
15
+ errors: ValidationIssue[];
16
+ warnings: ValidationIssue[];
17
+ };
18
+ /**
19
+ * Check if selector references exist
20
+ */
21
+ validateRefs(featureName: string, refs: Array<{
22
+ ref: string;
23
+ line: number;
24
+ }>, featureFile: string): ValidationIssue[];
25
+ /**
26
+ * Generate selector key from natural language label
27
+ * Matches logic in SelectorResolver.generateKey()
28
+ */
29
+ private generateKey;
30
+ /**
31
+ * Find selector file path (checks override first)
32
+ */
33
+ private findSelectorPath;
34
+ }
35
+ //# sourceMappingURL=selector-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/selector-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc1C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAmC;gBAE5C,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;IAqF7F;;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;IA4CpB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAmBzB"}