@sun-asterisk/sungen 2.6.3 → 2.6.5
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 +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +26 -3
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/dist/tools/figma/figma-client-types.d.ts +1 -1
- package/dist/tools/figma/figma-client-types.d.ts.map +1 -1
- package/dist/tools/figma/figma-node-filter.d.ts.map +1 -1
- package/dist/tools/figma/figma-node-filter.js +6 -2
- package/dist/tools/figma/figma-node-filter.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +1 -1
- package/src/generators/test-generator/patterns/navigation-patterns.ts +28 -3
- package/src/tools/figma/figma-client-types.ts +1 -1
- package/src/tools/figma/figma-node-filter.ts +10 -3
package/dist/cli/index.js
CHANGED
|
@@ -20,7 +20,7 @@ async function main() {
|
|
|
20
20
|
program
|
|
21
21
|
.name('sungen')
|
|
22
22
|
.description('Deterministic E2E Test Compiler — Gherkin + Selectors → Playwright')
|
|
23
|
-
.version('2.6.
|
|
23
|
+
.version('2.6.5');
|
|
24
24
|
// Global options
|
|
25
25
|
program
|
|
26
26
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"navigation-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAoI3C,CAAC"}
|
|
@@ -11,18 +11,33 @@ exports.navigationPatterns = [
|
|
|
11
11
|
matcher: (step) => (step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
|
|
12
12
|
step.elementType === 'page',
|
|
13
13
|
resolver: (step, context) => {
|
|
14
|
-
|
|
14
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
15
|
+
// Cross-screen page refs (e.g. Then User is on [dashboard] page) won't be in the
|
|
16
|
+
// current screen's selectors. Fall back to /<ref>/ for assertion paths instead of
|
|
17
|
+
// the current featurePath, which would silently make the assertion always pass.
|
|
18
|
+
const pathFallback = isThen && step.selectorRef
|
|
19
|
+
? `/${step.selectorRef}/`
|
|
20
|
+
: (context.featurePath || '/');
|
|
21
|
+
let path = pathFallback;
|
|
15
22
|
if (step.selectorRef) {
|
|
16
23
|
try {
|
|
17
24
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
|
|
18
|
-
path = resolved.value ||
|
|
25
|
+
path = resolved.value || pathFallback;
|
|
19
26
|
}
|
|
20
27
|
catch (error) {
|
|
21
|
-
path =
|
|
28
|
+
path = pathFallback;
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
31
|
const finalPath = (0, path_inference_1.resolvePathVariables)(path, context.scenarioSteps || []);
|
|
25
32
|
const isAbsoluteUrl = /^https?:\/\//.test(finalPath);
|
|
33
|
+
// Then User is on [X] page — assert URL, don't navigate.
|
|
34
|
+
if (isThen) {
|
|
35
|
+
return {
|
|
36
|
+
templateName: 'route-assertion',
|
|
37
|
+
data: { path: finalPath },
|
|
38
|
+
comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert page route`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
26
41
|
return {
|
|
27
42
|
templateName: 'navigation',
|
|
28
43
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: finalPath },
|
|
@@ -62,6 +77,7 @@ exports.navigationPatterns = [
|
|
|
62
77
|
!!(step.selectorRef || step.dataRef),
|
|
63
78
|
resolver: (step, context) => {
|
|
64
79
|
const route = step.selectorRef || step.dataRef;
|
|
80
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
65
81
|
const inferredPath = (0, path_inference_1.inferPath)(context.featurePath, {
|
|
66
82
|
featureName: context.featureName,
|
|
67
83
|
screenName: context.screenName,
|
|
@@ -70,6 +86,13 @@ exports.navigationPatterns = [
|
|
|
70
86
|
const pathCode = (0, path_inference_1.getPathCode)(resolvedPath);
|
|
71
87
|
const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
|
|
72
88
|
const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
|
|
89
|
+
if (isThen) {
|
|
90
|
+
return {
|
|
91
|
+
templateName: 'route-assertion',
|
|
92
|
+
data: { path: cleanPath },
|
|
93
|
+
comment: `Assert on ${route}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
73
96
|
return {
|
|
74
97
|
templateName: 'navigation',
|
|
75
98
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":";;;AAEA,4DAAuF;AAEvF;;GAEG;AACU,QAAA,kBAAkB,GAAkB;IAC/C;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/H,IAAI,CAAC,WAAW,KAAK,MAAM;QAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ export interface FigmaRawNode {
|
|
|
38
38
|
componentPropertyDefinitions?: Record<string, unknown>;
|
|
39
39
|
/** Variant property values for COMPONENT nodes. */
|
|
40
40
|
componentProperties?: Record<string, {
|
|
41
|
-
value: string;
|
|
41
|
+
value: string | boolean;
|
|
42
42
|
type: string;
|
|
43
43
|
}>;
|
|
44
44
|
/** Bounding box from absoluteBoundingBox. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figma-client-types.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-client-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"figma-client-types.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-client-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figma-node-filter.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-node-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EACd,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"figma-node-filter.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-node-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EACd,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAuI9B;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CASnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,KAAK,SAAK,GACT,cAAc,EAAE,CAalB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,iBAAiB,GAClC,sBAAsB,EAAE,CAU1B"}
|
|
@@ -24,7 +24,11 @@ const RawNodeSchema = zod_1.z
|
|
|
24
24
|
characters: zod_1.z.string().optional(),
|
|
25
25
|
componentPropertyDefinitions: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
|
|
26
26
|
componentProperties: zod_1.z
|
|
27
|
-
.record(zod_1.z.string(), zod_1.z.object({
|
|
27
|
+
.record(zod_1.z.string(), zod_1.z.object({
|
|
28
|
+
// Figma returns boolean for type=BOOLEAN, string for TEXT/INSTANCE_SWAP/VARIANT
|
|
29
|
+
value: zod_1.z.union([zod_1.z.string(), zod_1.z.boolean()]),
|
|
30
|
+
type: zod_1.z.string(),
|
|
31
|
+
}))
|
|
28
32
|
.optional(),
|
|
29
33
|
absoluteBoundingBox: zod_1.z
|
|
30
34
|
.object({ x: zod_1.z.number(), y: zod_1.z.number(), width: zod_1.z.number(), height: zod_1.z.number() })
|
|
@@ -90,7 +94,7 @@ function filterNode(raw, depth = 0, maxDepth = 30) {
|
|
|
90
94
|
componentName = name;
|
|
91
95
|
const props = raw['componentProperties'];
|
|
92
96
|
if (props) {
|
|
93
|
-
variantProps = Object.fromEntries(Object.entries(props).map(([k, v]) => [k, v.value]));
|
|
97
|
+
variantProps = Object.fromEntries(Object.entries(props).map(([k, v]) => [k, String(v.value)]));
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
// Role (only meaningful for component-like nodes)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figma-node-filter.js","sourceRoot":"","sources":["../../../src/tools/figma/figma-node-filter.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"figma-node-filter.js","sourceRoot":"","sources":["../../../src/tools/figma/figma-node-filter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/index.ts
CHANGED
|
@@ -12,22 +12,38 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
12
12
|
(step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
|
|
13
13
|
step.elementType === 'page',
|
|
14
14
|
resolver: (step, context) => {
|
|
15
|
-
|
|
15
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
16
|
+
// Cross-screen page refs (e.g. Then User is on [dashboard] page) won't be in the
|
|
17
|
+
// current screen's selectors. Fall back to /<ref>/ for assertion paths instead of
|
|
18
|
+
// the current featurePath, which would silently make the assertion always pass.
|
|
19
|
+
const pathFallback = isThen && step.selectorRef
|
|
20
|
+
? `/${step.selectorRef}/`
|
|
21
|
+
: (context.featurePath || '/');
|
|
22
|
+
let path = pathFallback;
|
|
16
23
|
|
|
17
24
|
if (step.selectorRef) {
|
|
18
25
|
try {
|
|
19
26
|
const resolved = context.selectorResolver.resolveSelector(
|
|
20
27
|
step.selectorRef, context.featureName, step.elementType, step.nth
|
|
21
28
|
);
|
|
22
|
-
path = resolved.value ||
|
|
29
|
+
path = resolved.value || pathFallback;
|
|
23
30
|
} catch (error) {
|
|
24
|
-
path =
|
|
31
|
+
path = pathFallback;
|
|
25
32
|
}
|
|
26
33
|
}
|
|
27
34
|
|
|
28
35
|
const finalPath = resolvePathVariables(path, context.scenarioSteps || []);
|
|
29
36
|
const isAbsoluteUrl = /^https?:\/\//.test(finalPath);
|
|
30
37
|
|
|
38
|
+
// Then User is on [X] page — assert URL, don't navigate.
|
|
39
|
+
if (isThen) {
|
|
40
|
+
return {
|
|
41
|
+
templateName: 'route-assertion',
|
|
42
|
+
data: { path: finalPath },
|
|
43
|
+
comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert page route`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
31
47
|
return {
|
|
32
48
|
templateName: 'navigation',
|
|
33
49
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: finalPath },
|
|
@@ -71,6 +87,7 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
71
87
|
!!(step.selectorRef || step.dataRef),
|
|
72
88
|
resolver: (step, context) => {
|
|
73
89
|
const route = step.selectorRef || step.dataRef;
|
|
90
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
74
91
|
|
|
75
92
|
const inferredPath = inferPath(context.featurePath, {
|
|
76
93
|
featureName: context.featureName,
|
|
@@ -81,6 +98,14 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
81
98
|
const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
|
|
82
99
|
const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
|
|
83
100
|
|
|
101
|
+
if (isThen) {
|
|
102
|
+
return {
|
|
103
|
+
templateName: 'route-assertion',
|
|
104
|
+
data: { path: cleanPath },
|
|
105
|
+
comment: `Assert on ${route}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
84
109
|
return {
|
|
85
110
|
templateName: 'navigation',
|
|
86
111
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
|
|
@@ -46,7 +46,7 @@ export interface FigmaRawNode {
|
|
|
46
46
|
/** Component set variant properties. */
|
|
47
47
|
componentPropertyDefinitions?: Record<string, unknown>;
|
|
48
48
|
/** Variant property values for COMPONENT nodes. */
|
|
49
|
-
componentProperties?: Record<string, { value: string; type: string }>;
|
|
49
|
+
componentProperties?: Record<string, { value: string | boolean; type: string }>;
|
|
50
50
|
/** Bounding box from absoluteBoundingBox. */
|
|
51
51
|
absoluteBoundingBox?: { x: number; y: number; width: number; height: number };
|
|
52
52
|
/** Child nodes. */
|
|
@@ -28,7 +28,14 @@ const RawNodeSchema: z.ZodType<Record<string, unknown>> = z
|
|
|
28
28
|
characters: z.string().optional(),
|
|
29
29
|
componentPropertyDefinitions: z.record(z.string(), z.unknown()).optional(),
|
|
30
30
|
componentProperties: z
|
|
31
|
-
.record(
|
|
31
|
+
.record(
|
|
32
|
+
z.string(),
|
|
33
|
+
z.object({
|
|
34
|
+
// Figma returns boolean for type=BOOLEAN, string for TEXT/INSTANCE_SWAP/VARIANT
|
|
35
|
+
value: z.union([z.string(), z.boolean()]),
|
|
36
|
+
type: z.string(),
|
|
37
|
+
}),
|
|
38
|
+
)
|
|
32
39
|
.optional(),
|
|
33
40
|
absoluteBoundingBox: z
|
|
34
41
|
.object({ x: z.number(), y: z.number(), width: z.number(), height: z.number() })
|
|
@@ -108,11 +115,11 @@ function filterNode(
|
|
|
108
115
|
if (type === 'COMPONENT' || type === 'COMPONENT_SET' || type === 'INSTANCE') {
|
|
109
116
|
componentName = name;
|
|
110
117
|
const props = raw['componentProperties'] as
|
|
111
|
-
| Record<string, { value: string; type: string }>
|
|
118
|
+
| Record<string, { value: string | boolean; type: string }>
|
|
112
119
|
| undefined;
|
|
113
120
|
if (props) {
|
|
114
121
|
variantProps = Object.fromEntries(
|
|
115
|
-
Object.entries(props).map(([k, v]) => [k, v.value]),
|
|
122
|
+
Object.entries(props).map(([k, v]) => [k, String(v.value)]),
|
|
116
123
|
);
|
|
117
124
|
}
|
|
118
125
|
}
|