@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.
- package/README.md +173 -1
- package/dist/cli/index.js +155 -4
- 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/generators/gherkin-parser/index.d.ts +1 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +3 -0
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/scaffold-generator/index.d.ts +25 -2
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
- package/dist/generators/scaffold-generator/index.js +157 -14
- package/dist/generators/scaffold-generator/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +2 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
- package/dist/generators/test-generator/auth-setup-generator.d.ts +18 -0
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +1 -0
- package/dist/generators/test-generator/auth-setup-generator.js +82 -0
- package/dist/generators/test-generator/auth-setup-generator.js.map +1 -0
- package/dist/generators/test-generator/code-generator.d.ts +2 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +130 -5
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +30 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +25 -5
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
- package/dist/input/cli-adapter.d.ts +8 -0
- package/dist/input/cli-adapter.d.ts.map +1 -1
- package/dist/input/cli-adapter.js +31 -1
- package/dist/input/cli-adapter.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +31 -22
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/tools/auth-maker.d.ts +74 -0
- package/dist/tools/auth-maker.d.ts.map +1 -0
- package/dist/tools/auth-maker.js +420 -0
- package/dist/tools/auth-maker.js.map +1 -0
- package/package.json +2 -2
- package/src/cli/index.ts +166 -4
- 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/generators/gherkin-parser/index.ts +5 -0
- package/src/generators/scaffold-generator/index.ts +179 -19
- package/src/generators/test-generator/adapters/adapter-interface.ts +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
- package/src/generators/test-generator/auth-setup-generator.ts +59 -0
- package/src/generators/test-generator/code-generator.ts +173 -6
- package/src/generators/test-generator/patterns/assertion-patterns.ts +34 -1
- package/src/generators/test-generator/patterns/form-patterns.ts +27 -8
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
- package/src/input/cli-adapter.ts +33 -1
- package/src/orchestrator/pipeline.ts +39 -24
- 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"}
|