@sun-asterisk/sungen 3.2.6 → 3.2.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/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +7 -46
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
- package/dist/dashboard/snapshot-builder.js +28 -6
- package/dist/dashboard/snapshot-builder.js.map +1 -1
- package/dist/dashboard/templates/index.html +20 -20
- package/dist/dashboard/types.d.ts +18 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/exporters/api-catalog-loader.d.ts +18 -0
- package/dist/exporters/api-catalog-loader.d.ts.map +1 -0
- package/dist/exporters/api-catalog-loader.js +77 -0
- package/dist/exporters/api-catalog-loader.js.map +1 -0
- package/dist/exporters/json-exporter.d.ts +10 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +34 -2
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts +14 -0
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +30 -0
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/xlsx-exporter.d.ts +18 -17
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.js +25 -595
- package/dist/exporters/xlsx-exporter.js.map +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts +196 -0
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -0
- package/dist/exporters/xlsx-report-builder.js +653 -0
- package/dist/exporters/xlsx-report-builder.js.map +1 -0
- package/package.json +3 -3
- package/src/cli/commands/delivery.ts +8 -42
- package/src/dashboard/snapshot-builder.ts +31 -7
- package/src/dashboard/templates/index.html +20 -20
- package/src/dashboard/types.ts +19 -0
- package/src/exporters/api-catalog-loader.ts +44 -0
- package/src/exporters/json-exporter.ts +46 -4
- package/src/exporters/playwright-report-parser.ts +27 -0
- package/src/exporters/xlsx-exporter.ts +34 -658
- package/src/exporters/xlsx-report-builder.ts +806 -0
- package/dist/cli/types.d.ts +0 -9
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/cli/types.js +0 -7
- package/dist/cli/types.js.map +0 -1
- package/dist/generators/gherkin-parser/selector-extractor.d.ts +0 -37
- package/dist/generators/gherkin-parser/selector-extractor.d.ts.map +0 -1
- package/dist/generators/gherkin-parser/selector-extractor.js +0 -108
- package/dist/generators/gherkin-parser/selector-extractor.js.map +0 -1
- package/dist/generators/test-generator/types.d.ts +0 -25
- package/dist/generators/test-generator/types.d.ts.map +0 -1
- package/dist/generators/test-generator/types.js +0 -7
- package/dist/generators/test-generator/types.js.map +0 -1
- package/dist/generators/types.d.ts +0 -119
- package/dist/generators/types.d.ts.map +0 -1
- package/dist/generators/types.js +0 -48
- package/dist/generators/types.js.map +0 -1
- package/dist/orchestrator/figma/node-path-collapser.d.ts +0 -16
- package/dist/orchestrator/figma/node-path-collapser.d.ts.map +0 -1
- package/dist/orchestrator/figma/node-path-collapser.js +0 -37
- package/dist/orchestrator/figma/node-path-collapser.js.map +0 -1
- package/src/cli/types.ts +0 -9
- package/src/generators/gherkin-parser/selector-extractor.ts +0 -142
- package/src/generators/test-generator/types.ts +0 -26
- package/src/generators/types.ts +0 -227
- package/src/orchestrator/figma/node-path-collapser.ts +0 -38
package/dist/cli/types.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Types
|
|
3
|
-
* Future adapter interface for programmatic command execution (e.g., VSCode extension)
|
|
4
|
-
*/
|
|
5
|
-
export interface CommandAdapter {
|
|
6
|
-
name: string;
|
|
7
|
-
execute(command: string, options: Record<string, any>): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/cli/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE"}
|
package/dist/cli/types.js
DELETED
package/dist/cli/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gherkin Selector Extractor
|
|
3
|
-
* Scans Gherkin feature files and extracts all [screen.element] references
|
|
4
|
-
*/
|
|
5
|
-
export interface ExtractedSelector {
|
|
6
|
-
screenId: string;
|
|
7
|
-
elementId: string;
|
|
8
|
-
fullRef: string;
|
|
9
|
-
occurrences: number;
|
|
10
|
-
}
|
|
11
|
-
export interface SelectorsByScreen {
|
|
12
|
-
[screenId: string]: {
|
|
13
|
-
[elementId: string]: {
|
|
14
|
-
fullRef: string;
|
|
15
|
-
occurrences: number;
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export declare class GherkinSelectorExtractor {
|
|
20
|
-
/**
|
|
21
|
-
* Extract all selector references from Gherkin feature files
|
|
22
|
-
*/
|
|
23
|
-
extractSelectors(featuresDir: string): SelectorsByScreen;
|
|
24
|
-
/**
|
|
25
|
-
* Extract selectors from feature file content
|
|
26
|
-
*/
|
|
27
|
-
private extractSelectorsFromContent;
|
|
28
|
-
/**
|
|
29
|
-
* Generate base skeleton YAML structure
|
|
30
|
-
*/
|
|
31
|
-
generateSkeletonYaml(screenId: string, selectors: SelectorsByScreen): string;
|
|
32
|
-
/**
|
|
33
|
-
* Write skeleton files for all screens
|
|
34
|
-
*/
|
|
35
|
-
writeSkeletonFiles(selectors: SelectorsByScreen, outputDir: string): void;
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=selector-extractor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selector-extractor.d.ts","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/selector-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,qBAAa,wBAAwB;IACnC;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB;IAgCxD;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA0BnC;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM;IA+B5E;;OAEG;IACH,kBAAkB,CAChB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,GAChB,IAAI;CAWR"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Gherkin Selector Extractor
|
|
4
|
-
* Scans Gherkin feature files and extracts all [screen.element] references
|
|
5
|
-
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.GherkinSelectorExtractor = void 0;
|
|
11
|
-
const fs_1 = __importDefault(require("fs"));
|
|
12
|
-
const path_1 = __importDefault(require("path"));
|
|
13
|
-
const glob_1 = require("glob");
|
|
14
|
-
class GherkinSelectorExtractor {
|
|
15
|
-
/**
|
|
16
|
-
* Extract all selector references from Gherkin feature files
|
|
17
|
-
*/
|
|
18
|
-
extractSelectors(featuresDir) {
|
|
19
|
-
const featureFiles = glob_1.glob.sync('**/*.feature', {
|
|
20
|
-
cwd: featuresDir,
|
|
21
|
-
absolute: true,
|
|
22
|
-
});
|
|
23
|
-
const selectorsByScreen = {};
|
|
24
|
-
for (const filePath of featureFiles) {
|
|
25
|
-
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
26
|
-
const selectors = this.extractSelectorsFromContent(content);
|
|
27
|
-
// Merge into selectorsByScreen
|
|
28
|
-
for (const selector of selectors) {
|
|
29
|
-
if (!selectorsByScreen[selector.screenId]) {
|
|
30
|
-
selectorsByScreen[selector.screenId] = {};
|
|
31
|
-
}
|
|
32
|
-
if (!selectorsByScreen[selector.screenId][selector.elementId]) {
|
|
33
|
-
selectorsByScreen[selector.screenId][selector.elementId] = {
|
|
34
|
-
fullRef: selector.fullRef,
|
|
35
|
-
occurrences: 0,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
selectorsByScreen[selector.screenId][selector.elementId].occurrences++;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return selectorsByScreen;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Extract selectors from feature file content
|
|
45
|
-
*/
|
|
46
|
-
extractSelectorsFromContent(content) {
|
|
47
|
-
const selectors = [];
|
|
48
|
-
// Regex to match [screen.element] or [screen]
|
|
49
|
-
const selectorRegex = /\[([a-zA-Z0-9_-]+)(?:\.([a-zA-Z0-9_-]+))?\]/g;
|
|
50
|
-
let match;
|
|
51
|
-
while ((match = selectorRegex.exec(content)) !== null) {
|
|
52
|
-
const fullRef = match[0]; // e.g., "[auth-login.email]"
|
|
53
|
-
const screenId = match[1]; // e.g., "auth-login"
|
|
54
|
-
const elementId = match[2]; // e.g., "email" (undefined for route-only refs)
|
|
55
|
-
// Only include selectors with both screen and element (skip route-only refs)
|
|
56
|
-
if (elementId) {
|
|
57
|
-
selectors.push({
|
|
58
|
-
screenId,
|
|
59
|
-
elementId,
|
|
60
|
-
fullRef,
|
|
61
|
-
occurrences: 1,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return selectors;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Generate base skeleton YAML structure
|
|
69
|
-
*/
|
|
70
|
-
generateSkeletonYaml(screenId, selectors) {
|
|
71
|
-
const screenSelectors = selectors[screenId];
|
|
72
|
-
if (!screenSelectors) {
|
|
73
|
-
return `# No selectors found for screen: ${screenId}\n`;
|
|
74
|
-
}
|
|
75
|
-
const lines = [
|
|
76
|
-
`# Selector skeleton for screen: ${screenId}`,
|
|
77
|
-
`# AI will fill in the selector values based on UI model`,
|
|
78
|
-
`# This file is generated by scanning Gherkin feature files`,
|
|
79
|
-
'',
|
|
80
|
-
];
|
|
81
|
-
// Sort by element ID for consistency
|
|
82
|
-
const sortedElementIds = Object.keys(screenSelectors).sort();
|
|
83
|
-
for (const elementId of sortedElementIds) {
|
|
84
|
-
const { fullRef, occurrences } = screenSelectors[elementId];
|
|
85
|
-
lines.push(`"${fullRef}":`);
|
|
86
|
-
lines.push(` selector: ""`);
|
|
87
|
-
lines.push(` type: ""`);
|
|
88
|
-
lines.push(` description: ""`);
|
|
89
|
-
lines.push(` # Referenced ${occurrences} time(s) in Gherkin`);
|
|
90
|
-
lines.push('');
|
|
91
|
-
}
|
|
92
|
-
return lines.join('\n');
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Write skeleton files for all screens
|
|
96
|
-
*/
|
|
97
|
-
writeSkeletonFiles(selectors, outputDir) {
|
|
98
|
-
// Ensure output directory exists
|
|
99
|
-
fs_1.default.mkdirSync(outputDir, { recursive: true });
|
|
100
|
-
for (const screenId of Object.keys(selectors)) {
|
|
101
|
-
const skeletonContent = this.generateSkeletonYaml(screenId, selectors);
|
|
102
|
-
const outputPath = path_1.default.join(outputDir, `${screenId}.skeleton.yaml`);
|
|
103
|
-
fs_1.default.writeFileSync(outputPath, skeletonContent, 'utf-8');
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
exports.GherkinSelectorExtractor = GherkinSelectorExtractor;
|
|
108
|
-
//# sourceMappingURL=selector-extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selector-extractor.js","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/selector-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Generator Types
|
|
3
|
-
* Core type definitions for the test generation compiler
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Generated Test Result
|
|
7
|
-
*/
|
|
8
|
-
export interface GeneratedTest {
|
|
9
|
-
featureName: string;
|
|
10
|
-
filePath: string;
|
|
11
|
-
code: string;
|
|
12
|
-
sourceFile?: string;
|
|
13
|
-
stepCount?: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Generation Statistics
|
|
17
|
-
*/
|
|
18
|
-
export interface GenerationStats {
|
|
19
|
-
totalScenarios: number;
|
|
20
|
-
totalSteps: number;
|
|
21
|
-
dictionaryMatched: number;
|
|
22
|
-
todoCount: number;
|
|
23
|
-
generationTime: number;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generators/test-generator/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core types for Selector DSL Framework
|
|
3
|
-
* Framework-agnostic types for multi-platform support
|
|
4
|
-
*/
|
|
5
|
-
export interface UIElement {
|
|
6
|
-
key: string;
|
|
7
|
-
tag: string;
|
|
8
|
-
role?: string;
|
|
9
|
-
name?: string;
|
|
10
|
-
id?: string;
|
|
11
|
-
placeholder?: string;
|
|
12
|
-
label?: string;
|
|
13
|
-
text?: string;
|
|
14
|
-
ariaLabel?: string;
|
|
15
|
-
testId?: string;
|
|
16
|
-
source: string;
|
|
17
|
-
framework?: string;
|
|
18
|
-
props?: Record<string, any>;
|
|
19
|
-
}
|
|
20
|
-
export interface UIModel {
|
|
21
|
-
screenId: string;
|
|
22
|
-
routeId: string;
|
|
23
|
-
framework: FrameworkType;
|
|
24
|
-
sourceFiles: string[];
|
|
25
|
-
elements: UIElement[];
|
|
26
|
-
metadata?: {
|
|
27
|
-
scannedAt: string;
|
|
28
|
-
version: string;
|
|
29
|
-
hash: string;
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
export type DiscoveryMethod = 'ai-static-analysis' | 'manual' | 'runtime';
|
|
33
|
-
export type LocatorType = 'css' | 'xpath' | 'resource-id' | 'accessibility-id' | 'test-id' | 'key' | 'text' | 'role';
|
|
34
|
-
export interface SelectorEntry {
|
|
35
|
-
selector: string;
|
|
36
|
-
type: string;
|
|
37
|
-
description: string;
|
|
38
|
-
discoveryMethod: DiscoveryMethod;
|
|
39
|
-
locatorType?: LocatorType;
|
|
40
|
-
confidence?: 'high' | 'medium' | 'low';
|
|
41
|
-
alternatives?: string[];
|
|
42
|
-
metadata?: {
|
|
43
|
-
lastValidated?: string;
|
|
44
|
-
validationStatus?: 'valid' | 'invalid' | 'unknown';
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
export interface SelectorDSL {
|
|
48
|
-
[elementId: string]: SelectorEntry;
|
|
49
|
-
}
|
|
50
|
-
export type FrameworkType = 'react' | 'react-nextjs' | 'vue' | 'angular' | 'html' | 'flutter' | 'jetpack-compose' | 'swiftui';
|
|
51
|
-
export type TargetPlatform = 'web' | 'android' | 'ios' | 'desktop';
|
|
52
|
-
export type ExecutorType = 'playwright' | 'puppeteer' | 'selenium' | 'appium-android' | 'appium-ios' | 'flutter-driver' | 'espresso' | 'xcuitest';
|
|
53
|
-
export interface ExecutorConfig {
|
|
54
|
-
type: ExecutorType;
|
|
55
|
-
platform: TargetPlatform;
|
|
56
|
-
selectorPath: string;
|
|
57
|
-
overridePath?: string;
|
|
58
|
-
}
|
|
59
|
-
export interface CacheEntry {
|
|
60
|
-
screenId: string;
|
|
61
|
-
hash: string;
|
|
62
|
-
selectors: SelectorDSL;
|
|
63
|
-
metadata: {
|
|
64
|
-
createdAt: string;
|
|
65
|
-
aiModel?: string;
|
|
66
|
-
tokenCost?: number;
|
|
67
|
-
framework: FrameworkType;
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
export interface GeneratorConfig {
|
|
71
|
-
aiProvider: 'anthropic' | 'google' | 'openai';
|
|
72
|
-
aiModel?: string;
|
|
73
|
-
sourceRoot: string;
|
|
74
|
-
uiModelPath: string;
|
|
75
|
-
selectorPath: string;
|
|
76
|
-
cachePath: string;
|
|
77
|
-
framework: FrameworkType;
|
|
78
|
-
enableCache: boolean;
|
|
79
|
-
cacheExpiry?: number;
|
|
80
|
-
parallelScans?: number;
|
|
81
|
-
verbose?: boolean;
|
|
82
|
-
}
|
|
83
|
-
export interface DiscoverOptions {
|
|
84
|
-
screenId?: string;
|
|
85
|
-
all?: boolean;
|
|
86
|
-
force?: boolean;
|
|
87
|
-
}
|
|
88
|
-
export interface GenerateOptions {
|
|
89
|
-
screenId?: string;
|
|
90
|
-
all?: boolean;
|
|
91
|
-
force?: boolean;
|
|
92
|
-
skipCache?: boolean;
|
|
93
|
-
runtimeData?: boolean;
|
|
94
|
-
}
|
|
95
|
-
export interface ValidateOptions {
|
|
96
|
-
screenId?: string;
|
|
97
|
-
all?: boolean;
|
|
98
|
-
executor?: ExecutorType;
|
|
99
|
-
}
|
|
100
|
-
export interface GherkinElementReference {
|
|
101
|
-
elementId: string;
|
|
102
|
-
screenId: string;
|
|
103
|
-
elementName: string;
|
|
104
|
-
}
|
|
105
|
-
export declare function parseElementReference(ref: string): GherkinElementReference | null;
|
|
106
|
-
export declare class SelectorNotFoundError extends Error {
|
|
107
|
-
elementId: string;
|
|
108
|
-
screenId: string;
|
|
109
|
-
constructor(elementId: string, screenId: string);
|
|
110
|
-
}
|
|
111
|
-
export declare class UIModelNotFoundError extends Error {
|
|
112
|
-
screenId: string;
|
|
113
|
-
constructor(screenId: string);
|
|
114
|
-
}
|
|
115
|
-
export declare class GeneratorError extends Error {
|
|
116
|
-
cause?: Error;
|
|
117
|
-
constructor(message: string, cause?: Error);
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"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"}
|
package/dist/generators/types.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Core types for Selector DSL Framework
|
|
4
|
-
* Framework-agnostic types for multi-platform support
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.GeneratorError = exports.UIModelNotFoundError = exports.SelectorNotFoundError = void 0;
|
|
8
|
-
exports.parseElementReference = parseElementReference;
|
|
9
|
-
function parseElementReference(ref) {
|
|
10
|
-
// Parse "[screen.element]" format
|
|
11
|
-
const match = ref.match(/^\[([^.]+)\.([^\]]+)\]$/);
|
|
12
|
-
if (!match)
|
|
13
|
-
return null;
|
|
14
|
-
return {
|
|
15
|
-
elementId: ref,
|
|
16
|
-
screenId: match[1],
|
|
17
|
-
elementName: match[2]
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
// ============================================================================
|
|
21
|
-
// Error Types
|
|
22
|
-
// ============================================================================
|
|
23
|
-
class SelectorNotFoundError extends Error {
|
|
24
|
-
constructor(elementId, screenId) {
|
|
25
|
-
super(`Selector not found: ${elementId} on screen ${screenId}`);
|
|
26
|
-
this.elementId = elementId;
|
|
27
|
-
this.screenId = screenId;
|
|
28
|
-
this.name = 'SelectorNotFoundError';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
exports.SelectorNotFoundError = SelectorNotFoundError;
|
|
32
|
-
class UIModelNotFoundError extends Error {
|
|
33
|
-
constructor(screenId) {
|
|
34
|
-
super(`UI Model not found for screen: ${screenId}`);
|
|
35
|
-
this.screenId = screenId;
|
|
36
|
-
this.name = 'UIModelNotFoundError';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.UIModelNotFoundError = UIModelNotFoundError;
|
|
40
|
-
class GeneratorError extends Error {
|
|
41
|
-
constructor(message, cause) {
|
|
42
|
-
super(message);
|
|
43
|
-
this.cause = cause;
|
|
44
|
-
this.name = 'GeneratorError';
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
exports.GeneratorError = GeneratorError;
|
|
48
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA4LH,sDAUC;AAVD,SAAgB,qBAAqB,CAAC,GAAW;IAC/C,kCAAkC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO;QACL,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAmB,SAAiB,EAAS,QAAgB;QAC3D,KAAK,CAAC,uBAAuB,SAAS,cAAc,QAAQ,EAAE,CAAC,CAAC;QAD/C,cAAS,GAAT,SAAS,CAAQ;QAAS,aAAQ,GAAR,QAAQ,CAAQ;QAE3D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAmB,QAAgB;QACjC,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QADnC,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAS,KAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,UAAK,GAAL,KAAK,CAAQ;QAE/C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure helper: collapse consecutive repeated segments in a Figma node path.
|
|
3
|
-
*
|
|
4
|
-
* Delimiter: " > " (space-angle-space).
|
|
5
|
-
* Collapsed runs use the multiplication sign × (U+00D7).
|
|
6
|
-
*
|
|
7
|
-
* Examples:
|
|
8
|
-
* "A > B > C" → "A > B > C" (unchanged)
|
|
9
|
-
* "A > B > B > C" → "A > B×2 > C"
|
|
10
|
-
* "Container > Container > Container > X" → "Container×3 > X"
|
|
11
|
-
* "A > A > A > A > A > B > C" → "A×5 > B > C"
|
|
12
|
-
* "A" → "A" (single)
|
|
13
|
-
* "" → "" (empty)
|
|
14
|
-
*/
|
|
15
|
-
export declare function collapseNodePath(path: string): string;
|
|
16
|
-
//# sourceMappingURL=node-path-collapser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-path-collapser.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/figma/node-path-collapser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBrD"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.collapseNodePath = collapseNodePath;
|
|
4
|
-
/**
|
|
5
|
-
* Pure helper: collapse consecutive repeated segments in a Figma node path.
|
|
6
|
-
*
|
|
7
|
-
* Delimiter: " > " (space-angle-space).
|
|
8
|
-
* Collapsed runs use the multiplication sign × (U+00D7).
|
|
9
|
-
*
|
|
10
|
-
* Examples:
|
|
11
|
-
* "A > B > C" → "A > B > C" (unchanged)
|
|
12
|
-
* "A > B > B > C" → "A > B×2 > C"
|
|
13
|
-
* "Container > Container > Container > X" → "Container×3 > X"
|
|
14
|
-
* "A > A > A > A > A > B > C" → "A×5 > B > C"
|
|
15
|
-
* "A" → "A" (single)
|
|
16
|
-
* "" → "" (empty)
|
|
17
|
-
*/
|
|
18
|
-
function collapseNodePath(path) {
|
|
19
|
-
if (!path)
|
|
20
|
-
return path;
|
|
21
|
-
const DELIMITER = ' > ';
|
|
22
|
-
const segments = path.split(DELIMITER);
|
|
23
|
-
const collapsed = [];
|
|
24
|
-
let i = 0;
|
|
25
|
-
while (i < segments.length) {
|
|
26
|
-
const current = segments[i];
|
|
27
|
-
let count = 1;
|
|
28
|
-
// Count consecutive identical segments
|
|
29
|
-
while (i + count < segments.length && segments[i + count] === current) {
|
|
30
|
-
count++;
|
|
31
|
-
}
|
|
32
|
-
collapsed.push(count > 1 ? `${current}×${count}` : current);
|
|
33
|
-
i += count;
|
|
34
|
-
}
|
|
35
|
-
return collapsed.join(DELIMITER);
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=node-path-collapser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-path-collapser.js","sourceRoot":"","sources":["../../../src/orchestrator/figma/node-path-collapser.ts"],"names":[],"mappings":";;AAcA,4CAuBC;AArCD;;;;;;;;;;;;;GAaG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,uCAAuC;QACvC,OAAO,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;YACtE,KAAK,EAAE,CAAC;QACV,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,IAAI,KAAK,CAAC;IACb,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
package/src/cli/types.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gherkin Selector Extractor
|
|
3
|
-
* Scans Gherkin feature files and extracts all [screen.element] references
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import fs from 'fs';
|
|
7
|
-
import path from 'path';
|
|
8
|
-
import { glob } from 'glob';
|
|
9
|
-
|
|
10
|
-
export interface ExtractedSelector {
|
|
11
|
-
screenId: string;
|
|
12
|
-
elementId: string;
|
|
13
|
-
fullRef: string; // e.g., "[auth-login.email]"
|
|
14
|
-
occurrences: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface SelectorsByScreen {
|
|
18
|
-
[screenId: string]: {
|
|
19
|
-
[elementId: string]: {
|
|
20
|
-
fullRef: string;
|
|
21
|
-
occurrences: number;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class GherkinSelectorExtractor {
|
|
27
|
-
/**
|
|
28
|
-
* Extract all selector references from Gherkin feature files
|
|
29
|
-
*/
|
|
30
|
-
extractSelectors(featuresDir: string): SelectorsByScreen {
|
|
31
|
-
const featureFiles = glob.sync('**/*.feature', {
|
|
32
|
-
cwd: featuresDir,
|
|
33
|
-
absolute: true,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const selectorsByScreen: SelectorsByScreen = {};
|
|
37
|
-
|
|
38
|
-
for (const filePath of featureFiles) {
|
|
39
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
40
|
-
const selectors = this.extractSelectorsFromContent(content);
|
|
41
|
-
|
|
42
|
-
// Merge into selectorsByScreen
|
|
43
|
-
for (const selector of selectors) {
|
|
44
|
-
if (!selectorsByScreen[selector.screenId]) {
|
|
45
|
-
selectorsByScreen[selector.screenId] = {};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (!selectorsByScreen[selector.screenId][selector.elementId]) {
|
|
49
|
-
selectorsByScreen[selector.screenId][selector.elementId] = {
|
|
50
|
-
fullRef: selector.fullRef,
|
|
51
|
-
occurrences: 0,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
selectorsByScreen[selector.screenId][selector.elementId].occurrences++;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return selectorsByScreen;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Extract selectors from feature file content
|
|
64
|
-
*/
|
|
65
|
-
private extractSelectorsFromContent(content: string): ExtractedSelector[] {
|
|
66
|
-
const selectors: ExtractedSelector[] = [];
|
|
67
|
-
|
|
68
|
-
// Regex to match [screen.element] or [screen]
|
|
69
|
-
const selectorRegex = /\[([a-zA-Z0-9_-]+)(?:\.([a-zA-Z0-9_-]+))?\]/g;
|
|
70
|
-
|
|
71
|
-
let match;
|
|
72
|
-
while ((match = selectorRegex.exec(content)) !== null) {
|
|
73
|
-
const fullRef = match[0]; // e.g., "[auth-login.email]"
|
|
74
|
-
const screenId = match[1]; // e.g., "auth-login"
|
|
75
|
-
const elementId = match[2]; // e.g., "email" (undefined for route-only refs)
|
|
76
|
-
|
|
77
|
-
// Only include selectors with both screen and element (skip route-only refs)
|
|
78
|
-
if (elementId) {
|
|
79
|
-
selectors.push({
|
|
80
|
-
screenId,
|
|
81
|
-
elementId,
|
|
82
|
-
fullRef,
|
|
83
|
-
occurrences: 1,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return selectors;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Generate base skeleton YAML structure
|
|
93
|
-
*/
|
|
94
|
-
generateSkeletonYaml(screenId: string, selectors: SelectorsByScreen): string {
|
|
95
|
-
const screenSelectors = selectors[screenId];
|
|
96
|
-
|
|
97
|
-
if (!screenSelectors) {
|
|
98
|
-
return `# No selectors found for screen: ${screenId}\n`;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const lines: string[] = [
|
|
102
|
-
`# Selector skeleton for screen: ${screenId}`,
|
|
103
|
-
`# AI will fill in the selector values based on UI model`,
|
|
104
|
-
`# This file is generated by scanning Gherkin feature files`,
|
|
105
|
-
'',
|
|
106
|
-
];
|
|
107
|
-
|
|
108
|
-
// Sort by element ID for consistency
|
|
109
|
-
const sortedElementIds = Object.keys(screenSelectors).sort();
|
|
110
|
-
|
|
111
|
-
for (const elementId of sortedElementIds) {
|
|
112
|
-
const { fullRef, occurrences } = screenSelectors[elementId];
|
|
113
|
-
|
|
114
|
-
lines.push(`"${fullRef}":`);
|
|
115
|
-
lines.push(` selector: ""`);
|
|
116
|
-
lines.push(` type: ""`);
|
|
117
|
-
lines.push(` description: ""`);
|
|
118
|
-
lines.push(` # Referenced ${occurrences} time(s) in Gherkin`);
|
|
119
|
-
lines.push('');
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return lines.join('\n');
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Write skeleton files for all screens
|
|
127
|
-
*/
|
|
128
|
-
writeSkeletonFiles(
|
|
129
|
-
selectors: SelectorsByScreen,
|
|
130
|
-
outputDir: string
|
|
131
|
-
): void {
|
|
132
|
-
// Ensure output directory exists
|
|
133
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
134
|
-
|
|
135
|
-
for (const screenId of Object.keys(selectors)) {
|
|
136
|
-
const skeletonContent = this.generateSkeletonYaml(screenId, selectors);
|
|
137
|
-
const outputPath = path.join(outputDir, `${screenId}.skeleton.yaml`);
|
|
138
|
-
|
|
139
|
-
fs.writeFileSync(outputPath, skeletonContent, 'utf-8');
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Generator Types
|
|
3
|
-
* Core type definitions for the test generation compiler
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Generated Test Result
|
|
8
|
-
*/
|
|
9
|
-
export interface GeneratedTest {
|
|
10
|
-
featureName: string;
|
|
11
|
-
filePath: string;
|
|
12
|
-
code: string;
|
|
13
|
-
sourceFile?: string;
|
|
14
|
-
stepCount?: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Generation Statistics
|
|
19
|
-
*/
|
|
20
|
-
export interface GenerationStats {
|
|
21
|
-
totalScenarios: number;
|
|
22
|
-
totalSteps: number;
|
|
23
|
-
dictionaryMatched: number;
|
|
24
|
-
todoCount: number;
|
|
25
|
-
generationTime: number;
|
|
26
|
-
}
|