@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
package/README.md CHANGED
@@ -15,7 +15,8 @@ Sungen is a **deterministic-first** E2E test automation framework that generates
15
15
  - **2️⃣ Accessibility Match** - Semantic `role` + `aria-label` matching
16
16
  - **3️⃣ AI Fallback** - Claude Sonnet as last resort (not primary solution)
17
17
  3. **Auto-Tagging Tool** - Inject stable `data-testid` into source code proactively
18
- 4. **Test Generation** - Create production-ready Playwright test code
18
+ 4. **Authentication Support** - Built-in Playwright storage states via `@auth:{role}` tags
19
+ 5. **Test Generation** - Create production-ready Playwright test code
19
20
 
20
21
  **Key Achievement**: **90%+ Direct ID match rate** with minimal AI dependency!
21
22
 
@@ -104,6 +105,11 @@ your-project/
104
105
  │ └── logout.yaml
105
106
 
106
107
  ├── specs/ # Output artifacts (sibling to qa/)
108
+ │ ├── .auth/ # Authentication storage states (gitignored)
109
+ │ │ ├── .gitignore
110
+ │ │ ├── admin.json
111
+ │ │ └── user.json
112
+ │ ├── auth.setup.ts # Playwright auth setup (auto-generated)
107
113
  │ └── generated/ # Generated Playwright tests
108
114
  │ └── auth
109
115
  │ ├── login.spec.ts
@@ -183,6 +189,123 @@ success:
183
189
  message: "Welcome back!"
184
190
  ```
185
191
 
192
+ ### Authentication with Storage States ⭐ NEW
193
+
194
+ Sungen supports Playwright's authentication storage states via `@auth:{role}` tags, allowing you to reuse authenticated browser contexts across tests.
195
+
196
+ #### Basic Usage
197
+
198
+ **Tag your features or scenarios:**
199
+
200
+ ```gherkin
201
+ @auth:admin
202
+ Feature: User Management
203
+
204
+ Scenario: Delete user
205
+ Given User navigate to "/users"
206
+ When User click [delete-button]
207
+ Then User see [success-message]
208
+
209
+ @auth:user
210
+ Feature: Profile Settings
211
+
212
+ Scenario: Update email
213
+ Given User navigate to "/profile"
214
+ When User fill [email] field with {{new_email}}
215
+ ```
216
+
217
+ **Generated Playwright code automatically includes storage state:**
218
+
219
+ ```typescript
220
+ // user-management.spec.ts
221
+ test.use({ storageState: 'specs/.auth/admin.json' });
222
+
223
+ test('Delete user', async ({ page }) => {
224
+ // Already authenticated as admin!
225
+ await page.goto('/users');
226
+ // ...
227
+ });
228
+ ```
229
+
230
+ #### Tag Inheritance
231
+
232
+ Tags can be applied at **feature level** (inherited by all scenarios) or **scenario level** (overrides feature):
233
+
234
+ ```gherkin
235
+ @auth:admin
236
+ Feature: Admin Dashboard
237
+
238
+ Scenario: View analytics
239
+ # Inherits @auth:admin from feature
240
+
241
+ @auth:moderator
242
+ Scenario: Review flagged content
243
+ # Overrides with @auth:moderator
244
+
245
+ @no-auth
246
+ Scenario: View public help page
247
+ # Explicitly disables authentication
248
+ ```
249
+
250
+ **Precedence:** Scenario > Feature > None
251
+
252
+ #### Setting Up Authentication
253
+
254
+ On first `sungen generate` with `@auth` tags, an `auth.setup.ts` scaffold is auto-generated:
255
+
256
+ ```bash
257
+ sungen generate --screen admin
258
+
259
+ # Output:
260
+ ✓ Generated specs/auth.setup.ts - Update TODOs before running tests
261
+ ✓ Created specs/.auth/ directory for storage states
262
+ Detected roles: admin, user, moderator
263
+ ```
264
+
265
+ **Customize the generated setup file:**
266
+
267
+ ```typescript
268
+ // specs/auth.setup.ts
269
+ import { test as setup } from '@playwright/test';
270
+
271
+ const authFile = (role: string) => `specs/.auth/${role}.json`;
272
+
273
+ setup('authenticate as admin', async ({ page }) => {
274
+ // TODO: Navigate to your login page
275
+ await page.goto('/login');
276
+
277
+ // TODO: Fill in credentials for admin role
278
+ await page.getByLabel('Email').fill('admin@example.com');
279
+ await page.getByLabel('Password').fill('admin123');
280
+
281
+ // TODO: Click login button
282
+ await page.getByRole('button', { name: 'Sign in' }).click();
283
+
284
+ // TODO: Wait for authentication to complete
285
+ await page.waitForURL('/dashboard');
286
+
287
+ // Save authentication state
288
+ await page.context().storageState({ path: authFile('admin') });
289
+ });
290
+
291
+ // Additional setup functions for other roles...
292
+ ```
293
+
294
+ #### Features
295
+
296
+ - ✅ **Feature-level tags** - All scenarios inherit authentication
297
+ - ✅ **Scenario-level tags** - Override feature authentication
298
+ - ✅ **@no-auth tag** - Explicitly disable inherited authentication
299
+ - ✅ **Auto-generation** - Setup scaffold created on first use
300
+ - ✅ **Multiple roles** - Support unlimited authentication roles
301
+ - ✅ **Storage reuse** - Fast tests by reusing authenticated contexts
302
+
303
+ #### Notes
304
+
305
+ - Storage state files (`specs/.auth/*.json`) are gitignored by default
306
+ - Setup runs before tests via Playwright's global setup
307
+ - New roles detected after initial setup trigger a warning with manual update instructions
308
+
186
309
  ### Element Selectors
187
310
 
188
311
  Map elements in `selectors/<screen>.yaml`:
@@ -383,6 +506,55 @@ Clear all cached data
383
506
  sungen cache-clear
384
507
  ```
385
508
 
509
+ ### `sungen makeauth` ⭐ NEW
510
+ Generate authentication state for login sessions (supports SSO and manual login)
511
+
512
+ ```bash
513
+ sungen makeauth <name> [options]
514
+
515
+ Options:
516
+ -u, --url <url> Base URL of the application (auto-detected from playwright.config.ts)
517
+ -p, --path <path> Login page path (default: /login)
518
+ -o, --output <dir> Output directory (default: specs/.auth)
519
+ -t, --timeout <ms> Overall timeout in milliseconds (default: 180000)
520
+ --nav-timeout <ms> Navigation timeout in milliseconds (default: 180000)
521
+ --stability-wait <ms> URL stability wait in milliseconds (default: 5000)
522
+ --headless Run browser in headless mode
523
+ --verify Verify existing auth state is still valid
524
+ --list List all existing auth states
525
+ --export Export auth state as base64 for CI
526
+
527
+ Examples:
528
+ sungen makeauth user # Create auth state for 'user' role
529
+ sungen makeauth admin --url http://localhost:3000
530
+ sungen makeauth admin --path /auth/signin
531
+ sungen makeauth admin --list # List all auth states
532
+ sungen makeauth admin --verify # Check if auth is still valid
533
+ ```
534
+
535
+ **What it does:**
536
+ - Opens a browser window for manual login (including SSO providers like Google, GitHub, etc.)
537
+ - Saves authentication state (cookies, localStorage, sessionStorage) to `specs/.auth/<name>.json`
538
+ - Can be used in Playwright tests to skip login process and maintain sessions
539
+ - Supports multiple auth roles (admin, user, guest, etc.)
540
+
541
+ **Using auth state in tests:**
542
+ ```typescript
543
+ // playwright.config.ts
544
+ export default defineConfig({
545
+ projects: [
546
+ {
547
+ name: 'authenticated',
548
+ use: {
549
+ storageState: 'specs/.auth/user.json',
550
+ },
551
+ },
552
+ ],
553
+ });
554
+ ```
555
+
556
+ See [docs/makeauth.md](docs/makeauth.md) for complete documentation.
557
+
386
558
  ### `sungen auto-tag` ⭐ NEW
387
559
  Auto-inject stable `data-testid` attributes into source code
388
560
 
package/dist/cli/index.js CHANGED
@@ -9,6 +9,52 @@ const cli_adapter_1 = require("../input/cli-adapter");
9
9
  const config_loader_1 = require("../config/config-loader");
10
10
  const pipeline_1 = require("../orchestrator/pipeline");
11
11
  const cache_manager_1 = require("../orchestrator/cache-manager");
12
+ /**
13
+ * Print validation result to console
14
+ */
15
+ function printValidationResult(result, verbose = false) {
16
+ for (const fileResult of result.results) {
17
+ if (fileResult.valid) {
18
+ if (verbose) {
19
+ console.log(`✓ ${fileResult.file}`);
20
+ console.log(` ✓ Gherkin syntax valid`);
21
+ if (fileResult.warnings.length === 0) {
22
+ console.log(` ✓ All checks passed`);
23
+ }
24
+ }
25
+ else {
26
+ console.log(`✓ ${fileResult.file}`);
27
+ }
28
+ }
29
+ else {
30
+ console.log(`✗ ${fileResult.file}`);
31
+ }
32
+ // Print warnings
33
+ for (const warning of fileResult.warnings) {
34
+ const lineInfo = warning.line ? `:${warning.line}` : '';
35
+ console.log(` ⊘ ${warning.message}${lineInfo}`);
36
+ }
37
+ // Print errors
38
+ for (const error of fileResult.errors) {
39
+ const lineInfo = error.line ? `:${error.line}` : '';
40
+ console.log(` ✗ ${error.message}${lineInfo}`);
41
+ }
42
+ if (!fileResult.valid || (verbose && fileResult.warnings.length > 0)) {
43
+ console.log('');
44
+ }
45
+ }
46
+ // Print summary
47
+ console.log('\nSummary:');
48
+ console.log(` Files: ${result.summary.totalFiles} total, ${result.summary.passedFiles} passed, ${result.summary.failedFiles} failed`);
49
+ console.log(` Errors: ${result.summary.totalErrors}`);
50
+ console.log(` Warnings: ${result.summary.totalWarnings}`);
51
+ if (result.valid) {
52
+ console.log('\n✅ Validation passed');
53
+ }
54
+ else {
55
+ console.log('\n❌ Validation failed');
56
+ }
57
+ }
12
58
  async function main() {
13
59
  const adapter = new cli_adapter_1.CLIAdapter();
14
60
  const program = adapter.createProgram();
@@ -78,12 +124,20 @@ async function main() {
78
124
  console.log(' This will create the test specs based on the mapped selectors and test data.');
79
125
  }
80
126
  else if (options.file) {
81
- // Process single feature file (legacy mode)
82
- const outputDir = options.output || path.join(config.paths.selectorsDir, 'screens');
127
+ // Process single feature file
128
+ // Derive output from feature file location: features/ -> selectors/screens/
129
+ const deriveOutputDir = (featureFilePath) => {
130
+ const featureDir = path.dirname(featureFilePath);
131
+ if (featureDir.includes('features')) {
132
+ return featureDir.replace(/features\/?$/, 'selectors/screens');
133
+ }
134
+ return path.join(featureDir, '..', 'selectors', 'screens');
135
+ };
136
+ const outputDir = options.output || deriveOutputDir(options.file);
83
137
  const forceOverwrite = cliOptions.force || false;
84
- console.log(`🗺️ Mapping from file: ${options.file}`);
138
+ console.log(`Mapping from file: ${options.file}\n`);
85
139
  const result = generator.processFeatureFile(options.file, outputDir, forceOverwrite);
86
- console.log(`✅ Generated: ${result.outputPath} (${result.elementCount} elements)`);
140
+ console.log(`✓ Generated: ${result.outputPath} (${result.elementCount} elements)`);
87
141
  }
88
142
  else {
89
143
  console.error('❌ Error: Please specify --screen <name> or --file <path>');
@@ -186,6 +240,103 @@ async function main() {
186
240
  process.exit(1);
187
241
  }
188
242
  });
243
+ const validateCmd = adapter.addValidateCommand(program);
244
+ validateCmd.action(async (options) => {
245
+ try {
246
+ const { ScreenValidator } = require('../core/validator');
247
+ const validator = new ScreenValidator({
248
+ verbose: options.verbose,
249
+ });
250
+ let result;
251
+ if (options.screen) {
252
+ console.log(`Validating screen: ${options.screen}\n`);
253
+ result = validator.validateScreen(options.screen);
254
+ }
255
+ else {
256
+ console.log('Validating all screens...\n');
257
+ result = validator.validateAll();
258
+ }
259
+ // Output results
260
+ if (options.json) {
261
+ console.log(JSON.stringify(result, null, 2));
262
+ }
263
+ else {
264
+ printValidationResult(result, options.verbose);
265
+ }
266
+ // Exit with error code if validation failed
267
+ if (!result.valid) {
268
+ process.exit(1);
269
+ }
270
+ }
271
+ catch (error) {
272
+ console.error('❌ Validation failed:', error);
273
+ process.exit(1);
274
+ }
275
+ });
276
+ const makeAuthCmd = adapter.addMakeAuthCommand(program);
277
+ makeAuthCmd.action(async (name, options) => {
278
+ try {
279
+ const { AuthMaker } = require('../tools/auth-maker');
280
+ // Only pass baseURL if explicitly provided via --url
281
+ // Otherwise let AuthMaker detect from playwright.config.ts
282
+ const authMaker = new AuthMaker({
283
+ baseURL: options.url,
284
+ loginPath: options.path || '/login',
285
+ outputDir: options.output || 'specs/.auth',
286
+ timeout: options.timeout ? parseInt(options.timeout, 300) : undefined,
287
+ navigationTimeout: options.navTimeout ? parseInt(options.navTimeout, 300) : undefined,
288
+ stabilityWait: options.stabilityWait ? parseInt(options.stabilityWait, 300) : undefined,
289
+ });
290
+ // Handle --list flag
291
+ if (options.list) {
292
+ const authStates = authMaker.listAuth();
293
+ if (authStates.length === 0) {
294
+ console.log('No auth states found.');
295
+ }
296
+ else {
297
+ console.log('Available auth states:');
298
+ for (const state of authStates) {
299
+ console.log(` - ${state}`);
300
+ }
301
+ }
302
+ return;
303
+ }
304
+ // Handle --verify flag
305
+ if (options.verify) {
306
+ const isValid = await authMaker.verifyAuth(name);
307
+ process.exit(isValid ? 0 : 1);
308
+ }
309
+ // Handle --export flag
310
+ if (options.export) {
311
+ const base64 = authMaker.exportAuth(name);
312
+ if (base64) {
313
+ console.log('');
314
+ console.log('Base64 Auth State (for CI):');
315
+ console.log('========================================');
316
+ console.log(base64);
317
+ console.log('========================================');
318
+ console.log('');
319
+ console.log('Save this to CI secret: AUTH_STATE_' + name.toUpperCase());
320
+ }
321
+ return;
322
+ }
323
+ // Default: create new auth state
324
+ await authMaker.makeAuth({
325
+ name,
326
+ baseURL: options.url,
327
+ loginPath: options.path,
328
+ outputDir: options.output,
329
+ timeout: options.timeout ? parseInt(options.timeout, 10) : undefined,
330
+ navigationTimeout: options.navTimeout ? parseInt(options.navTimeout, 10) : undefined,
331
+ stabilityWait: options.stabilityWait ? parseInt(options.stabilityWait, 10) : undefined,
332
+ headless: options.headless,
333
+ });
334
+ }
335
+ catch (error) {
336
+ console.error('❌ Auth generation failed:', error);
337
+ process.exit(1);
338
+ }
339
+ });
189
340
  // Parse arguments
190
341
  await program.parseAsync(process.argv);
191
342
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,sDAAkD;AAClD,2DAAuD;AACvD,uDAAoD;AACpD,iEAA6D;AAG7D;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAwB,EAAE,UAAmB,KAAK;IAC/E,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,iBAAiB;QACjB,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,eAAe;QACf,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,UAAU,WAAW,MAAM,CAAC,OAAO,CAAC,WAAW,YAAY,MAAM,CAAC,OAAO,CAAC,WAAW,SAAS,CAAC,CAAC;IACvI,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,wBAAU,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAExC,eAAe;IACf,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7B,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAE1C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,uDAAuD;gBACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC;gBAClD,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC;gBAEjD,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBAEpF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,WAAW,UAAU,CAAC,CAAC;oBAEtD,uBAAuB;oBACvB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC;oBACxF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,MAAM,CAAC,YAAY,YAAY,CAAC,CAAC;oBAC/F,CAAC;oBAED,wBAAwB;oBACxB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;oBACzF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC,YAAY,eAAe,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;YACnG,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACxB,8BAA8B;gBAC9B,4EAA4E;gBAC5E,MAAM,eAAe,GAAG,CAAC,eAAuB,EAAU,EAAE;oBAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBACjD,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBACpC,OAAO,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;oBACjE,CAAC;oBACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBAC7D,CAAC,CAAC;gBAEF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClE,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,YAAY,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;YAC9E,MAAM,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAC7C,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,4BAAY,CAAC,MAAM,CAAC,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACtD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG;gBACjB,GAAG,OAAO,CAAC,IAAI,EAAE;gBACjB,GAAG,OAAO;aACX,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAExE,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1D,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;YAEpC,MAAM,OAAO,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEzD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;gBACpC,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YAEH,IAAI,MAAwB,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;gBACtD,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACnC,CAAC;YAED,iBAAiB;YACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YAED,4CAA4C;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAY,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAErD,qDAAqD;YACrD,2DAA2D;YAC3D,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;gBAC9B,OAAO,EAAE,OAAO,CAAC,GAAG;gBACpB,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ;gBACnC,SAAS,EAAE,OAAO,CAAC,MAAM,IAAI,aAAa;gBAC1C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrF,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aACxF,CAAC,CAAC;YAEH,qBAAqB;YACrB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;oBACtC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;wBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;YAED,uBAAuB;YACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;YAED,uBAAuB;YACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBACD,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,MAAM,SAAS,CAAC,QAAQ,CAAC;gBACvB,IAAI;gBACJ,OAAO,EAAE,OAAO,CAAC,GAAG;gBACpB,SAAS,EAAE,OAAO,CAAC,IAAI;gBACvB,SAAS,EAAE,OAAO,CAAC,MAAM;gBACzB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpF,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtF,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Data Validator
3
+ * Validates test-data YAML files and checks referenced data paths exist
4
+ */
5
+ import { ValidationIssue } from './index';
6
+ export declare class DataValidator {
7
+ private screenName;
8
+ private baseDir;
9
+ private dataCache;
10
+ constructor(screenName: string, baseDir?: string);
11
+ /**
12
+ * Validate test-data file for a feature
13
+ */
14
+ validateFile(featureName: string): {
15
+ errors: ValidationIssue[];
16
+ warnings: ValidationIssue[];
17
+ };
18
+ /**
19
+ * Check if data references exist and resolve to primitives
20
+ */
21
+ validateRefs(featureName: string, refs: Array<{
22
+ ref: string;
23
+ line: number;
24
+ }>, featureFile: string): ValidationIssue[];
25
+ /**
26
+ * Resolve dotted path in data object
27
+ */
28
+ private resolvePath;
29
+ /**
30
+ * Check if value is a primitive (string, number, boolean)
31
+ */
32
+ private isPrimitive;
33
+ /**
34
+ * Find test-data file path
35
+ */
36
+ private findDataPath;
37
+ }
38
+ //# sourceMappingURL=data-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/data-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA+B;gBAEpC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKhD;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE;IAuD7F;;OAEG;IACH,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAC1C,WAAW,EAAE,MAAM,GAClB,eAAe,EAAE;IAoEpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * Data Validator
4
+ * Validates test-data YAML files and checks referenced data paths exist
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.DataValidator = void 0;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const yaml_1 = __importDefault(require("yaml"));
47
+ class DataValidator {
48
+ constructor(screenName, baseDir) {
49
+ this.dataCache = new Map();
50
+ this.screenName = screenName;
51
+ this.baseDir = baseDir || process.cwd();
52
+ }
53
+ /**
54
+ * Validate test-data file for a feature
55
+ */
56
+ validateFile(featureName) {
57
+ const errors = [];
58
+ const warnings = [];
59
+ const filePath = this.findDataPath(featureName);
60
+ if (!filePath) {
61
+ // Data file is optional - only warn if there are data refs
62
+ return { errors, warnings };
63
+ }
64
+ // Load and parse YAML
65
+ let content;
66
+ let data;
67
+ try {
68
+ content = fs.readFileSync(filePath, 'utf-8');
69
+ }
70
+ catch (error) {
71
+ errors.push({
72
+ type: 'error',
73
+ code: 'INVALID_YAML_SYNTAX',
74
+ message: `Cannot read file: ${error.message}`,
75
+ file: filePath,
76
+ });
77
+ return { errors, warnings };
78
+ }
79
+ try {
80
+ data = yaml_1.default.parse(content);
81
+ }
82
+ catch (error) {
83
+ errors.push({
84
+ type: 'error',
85
+ code: 'INVALID_YAML_SYNTAX',
86
+ message: `YAML parse error: ${error.message}`,
87
+ file: filePath,
88
+ });
89
+ return { errors, warnings };
90
+ }
91
+ if (data && typeof data !== 'object') {
92
+ errors.push({
93
+ type: 'error',
94
+ code: 'INVALID_YAML_SYNTAX',
95
+ message: 'Test data file must be a valid YAML object',
96
+ file: filePath,
97
+ });
98
+ return { errors, warnings };
99
+ }
100
+ // Cache for later ref validation
101
+ this.dataCache.set(featureName, data || {});
102
+ return { errors, warnings };
103
+ }
104
+ /**
105
+ * Check if data references exist and resolve to primitives
106
+ */
107
+ validateRefs(featureName, refs, featureFile) {
108
+ const errors = [];
109
+ if (refs.length === 0) {
110
+ return errors;
111
+ }
112
+ // Load data if not cached
113
+ if (!this.dataCache.has(featureName)) {
114
+ const filePath = this.findDataPath(featureName);
115
+ if (!filePath) {
116
+ // Data file doesn't exist but we have refs - error
117
+ for (const { ref, line } of refs) {
118
+ errors.push({
119
+ type: 'error',
120
+ code: 'MISSING_DATA_FILE',
121
+ message: `Test data file not found for feature "${featureName}" (needed for {{${ref}}})`,
122
+ file: featureFile,
123
+ line,
124
+ element: ref,
125
+ });
126
+ }
127
+ return errors;
128
+ }
129
+ try {
130
+ const content = fs.readFileSync(filePath, 'utf-8');
131
+ const data = yaml_1.default.parse(content);
132
+ this.dataCache.set(featureName, data || {});
133
+ }
134
+ catch {
135
+ // Error already reported in validateFile
136
+ return errors;
137
+ }
138
+ }
139
+ const data = this.dataCache.get(featureName);
140
+ if (!data) {
141
+ return errors;
142
+ }
143
+ // Check each ref
144
+ for (const { ref, line } of refs) {
145
+ const result = this.resolvePath(data, ref);
146
+ if (!result.found) {
147
+ errors.push({
148
+ type: 'error',
149
+ code: 'MISSING_DATA_REF',
150
+ message: `Data {{${ref}}} not found in test-data/${featureName}.yaml (failed at: ${result.failedAt})`,
151
+ file: featureFile,
152
+ line,
153
+ element: ref,
154
+ });
155
+ }
156
+ else if (!this.isPrimitive(result.value)) {
157
+ errors.push({
158
+ type: 'error',
159
+ code: 'INVALID_DATA_VALUE',
160
+ message: `Data {{${ref}}} must resolve to a primitive value, got: ${typeof result.value}`,
161
+ file: featureFile,
162
+ line,
163
+ element: ref,
164
+ });
165
+ }
166
+ }
167
+ return errors;
168
+ }
169
+ /**
170
+ * Resolve dotted path in data object
171
+ */
172
+ resolvePath(data, ref) {
173
+ const parts = ref.split('.');
174
+ let current = data;
175
+ for (const key of parts) {
176
+ if (current && typeof current === 'object' && key in current) {
177
+ current = current[key];
178
+ }
179
+ else {
180
+ return { found: false, failedAt: key };
181
+ }
182
+ }
183
+ return { found: true, value: current };
184
+ }
185
+ /**
186
+ * Check if value is a primitive (string, number, boolean)
187
+ */
188
+ isPrimitive(value) {
189
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
190
+ }
191
+ /**
192
+ * Find test-data file path
193
+ */
194
+ findDataPath(featureName) {
195
+ const possiblePaths = [
196
+ // New structure
197
+ path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yaml`),
198
+ path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yml`),
199
+ // Legacy structure
200
+ path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yaml`),
201
+ path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yml`),
202
+ ];
203
+ for (const p of possiblePaths) {
204
+ if (fs.existsSync(p)) {
205
+ return p;
206
+ }
207
+ }
208
+ return null;
209
+ }
210
+ }
211
+ exports.DataValidator = DataValidator;
212
+ //# sourceMappingURL=data-validator.js.map