@sun-asterisk/sungen 2.4.5 ā 2.5.0
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 +7 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -0
- package/dist/cli/commands/delivery.js +348 -0
- package/dist/cli/commands/delivery.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +2 -0
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +64 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts +32 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -0
- package/dist/exporters/csv-exporter.js +311 -0
- package/dist/exporters/csv-exporter.js.map +1 -0
- package/dist/exporters/feature-parser.d.ts +48 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -0
- package/dist/exporters/feature-parser.js +178 -0
- package/dist/exporters/feature-parser.js.map +1 -0
- package/dist/exporters/package-info.d.ts +9 -0
- package/dist/exporters/package-info.d.ts.map +1 -0
- package/dist/exporters/package-info.js +73 -0
- package/dist/exporters/package-info.js.map +1 -0
- package/dist/exporters/playwright-report-parser.d.ts +21 -0
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -0
- package/dist/exporters/playwright-report-parser.js +184 -0
- package/dist/exporters/playwright-report-parser.js.map +1 -0
- package/dist/exporters/scenario-merger.d.ts +21 -0
- package/dist/exporters/scenario-merger.d.ts.map +1 -0
- package/dist/exporters/scenario-merger.js +51 -0
- package/dist/exporters/scenario-merger.js.map +1 -0
- package/dist/exporters/spec-parser.d.ts +20 -0
- package/dist/exporters/spec-parser.d.ts.map +1 -0
- package/dist/exporters/spec-parser.js +259 -0
- package/dist/exporters/spec-parser.js.map +1 -0
- package/dist/exporters/step-formatter.d.ts +32 -0
- package/dist/exporters/step-formatter.d.ts.map +1 -0
- package/dist/exporters/step-formatter.js +76 -0
- package/dist/exporters/step-formatter.js.map +1 -0
- package/dist/exporters/test-data-resolver.d.ts +20 -0
- package/dist/exporters/test-data-resolver.d.ts.map +1 -0
- package/dist/exporters/test-data-resolver.js +96 -0
- package/dist/exporters/test-data-resolver.js.map +1 -0
- package/dist/exporters/types.d.ts +104 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +6 -0
- package/dist/exporters/types.js.map +1 -0
- package/dist/exporters/xlsx-exporter.d.ts +19 -0
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -0
- package/dist/exporters/xlsx-exporter.js +309 -0
- package/dist/exporters/xlsx-exporter.js.map +1 -0
- 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/test-generator/adapters/adapter-interface.d.ts +29 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +21 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js +11 -2
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/after-all.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/after-each.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/before-all.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +24 -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 +109 -12
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +1 -1
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +29 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +11 -2
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.d.ts +11 -2
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +36 -25
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts +7 -0
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/runtime-data-transformer.js +42 -0
- package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +26 -0
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/generators/types.d.ts +1 -0
- package/dist/generators/types.d.ts.map +1 -1
- package/dist/generators/types.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +12 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +21 -1
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +158 -74
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +2 -0
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +15 -17
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +7 -5
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-delivery.md +71 -0
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +28 -1
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +23 -4
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +142 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +100 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +73 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +103 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +68 -13
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +22 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +54 -3
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -15
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +6 -4
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +71 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +38 -14
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +23 -4
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +142 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +100 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +73 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +103 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +88 -13
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +22 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +54 -3
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
- package/dist/orchestrator/templates/playwright.config.js +6 -1
- package/dist/orchestrator/templates/playwright.config.js.map +1 -1
- package/dist/orchestrator/templates/playwright.config.ts +6 -1
- package/dist/orchestrator/templates/specs-base.d.ts +12 -1
- package/dist/orchestrator/templates/specs-base.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-base.js +47 -5
- package/dist/orchestrator/templates/specs-base.js.map +1 -1
- package/dist/orchestrator/templates/specs-base.ts +65 -7
- package/dist/orchestrator/templates/specs-test-data.d.ts +14 -0
- package/dist/orchestrator/templates/specs-test-data.d.ts.map +1 -0
- package/dist/orchestrator/templates/specs-test-data.js +100 -0
- package/dist/orchestrator/templates/specs-test-data.js.map +1 -0
- package/dist/orchestrator/templates/specs-test-data.ts +66 -0
- package/package.json +2 -1
- package/src/cli/commands/delivery.ts +348 -0
- package/src/cli/commands/generate.ts +2 -0
- package/src/cli/commands/update.ts +84 -2
- package/src/cli/index.ts +4 -2
- package/src/exporters/csv-exporter.ts +304 -0
- package/src/exporters/feature-parser.ts +168 -0
- package/src/exporters/package-info.ts +35 -0
- package/src/exporters/playwright-report-parser.ts +168 -0
- package/src/exporters/scenario-merger.ts +63 -0
- package/src/exporters/spec-parser.ts +247 -0
- package/src/exporters/step-formatter.ts +80 -0
- package/src/exporters/test-data-resolver.ts +59 -0
- package/src/exporters/types.ts +112 -0
- package/src/exporters/xlsx-exporter.ts +301 -0
- package/src/generators/gherkin-parser/index.ts +4 -0
- package/src/generators/test-generator/adapters/adapter-interface.ts +12 -1
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +14 -2
- package/src/generators/test-generator/adapters/playwright/templates/after-all.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/after-each.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/before-all.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +24 -0
- package/src/generators/test-generator/code-generator.ts +122 -13
- package/src/generators/test-generator/step-mapper.ts +2 -2
- package/src/generators/test-generator/template-engine.ts +28 -2
- package/src/generators/test-generator/utils/data-resolver.ts +45 -27
- package/src/generators/test-generator/utils/runtime-data-transformer.ts +51 -0
- package/src/generators/test-generator/utils/selector-resolver.ts +26 -0
- package/src/generators/types.ts +1 -0
- package/src/orchestrator/ai-rules-updater.ts +12 -0
- package/src/orchestrator/project-initializer.ts +187 -80
- package/src/orchestrator/screen-manager.ts +2 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +15 -17
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +7 -5
- package/src/orchestrator/templates/ai-instructions/claude-cmd-delivery.md +71 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +28 -1
- package/src/orchestrator/templates/ai-instructions/claude-config.md +23 -4
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +142 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +100 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +73 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +103 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +68 -13
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +22 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +54 -3
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -15
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +6 -4
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +71 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +38 -14
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +23 -4
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +142 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +100 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +73 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +103 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +88 -13
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +22 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +54 -3
- package/src/orchestrator/templates/playwright.config.ts +6 -1
- package/src/orchestrator/templates/specs-base.ts +65 -7
- package/src/orchestrator/templates/specs-test-data.ts +66 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sungen delivery` CLI command.
|
|
3
|
+
* Exports Gherkin scenarios + Playwright results ā CSV test case file.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function registerDeliveryCommand(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqRpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE9D"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sungen delivery` CLI command.
|
|
4
|
+
* Exports Gherkin scenarios + Playwright results ā CSV test case file.
|
|
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.registerDeliveryCommand = registerDeliveryCommand;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const child_process_1 = require("child_process");
|
|
44
|
+
const feature_parser_1 = require("../../exporters/feature-parser");
|
|
45
|
+
const spec_parser_1 = require("../../exporters/spec-parser");
|
|
46
|
+
const test_data_resolver_1 = require("../../exporters/test-data-resolver");
|
|
47
|
+
const playwright_report_parser_1 = require("../../exporters/playwright-report-parser");
|
|
48
|
+
const scenario_merger_1 = require("../../exporters/scenario-merger");
|
|
49
|
+
const csv_exporter_1 = require("../../exporters/csv-exporter");
|
|
50
|
+
const xlsx_exporter_1 = require("../../exporters/xlsx-exporter");
|
|
51
|
+
const COLOR = {
|
|
52
|
+
reset: '\x1b[0m',
|
|
53
|
+
gray: '\x1b[90m',
|
|
54
|
+
green: '\x1b[32m',
|
|
55
|
+
red: '\x1b[31m',
|
|
56
|
+
yellow: '\x1b[33m',
|
|
57
|
+
cyan: '\x1b[36m',
|
|
58
|
+
bold: '\x1b[1m',
|
|
59
|
+
};
|
|
60
|
+
function log(msg) {
|
|
61
|
+
console.log(msg);
|
|
62
|
+
}
|
|
63
|
+
// ----------------------------------------------------------------------------
|
|
64
|
+
// Discovery
|
|
65
|
+
// ----------------------------------------------------------------------------
|
|
66
|
+
function listAllScreens(cwd) {
|
|
67
|
+
const screensDir = path.join(cwd, 'qa', 'screens');
|
|
68
|
+
if (!fs.existsSync(screensDir))
|
|
69
|
+
return [];
|
|
70
|
+
return fs
|
|
71
|
+
.readdirSync(screensDir, { withFileTypes: true })
|
|
72
|
+
.filter((d) => d.isDirectory())
|
|
73
|
+
.map((d) => d.name)
|
|
74
|
+
.sort();
|
|
75
|
+
}
|
|
76
|
+
// ----------------------------------------------------------------------------
|
|
77
|
+
// Pre-flight checks
|
|
78
|
+
// ----------------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the results file path for a screen.
|
|
81
|
+
* Prefer the per-screen co-located file, fall back to the global `test-results/results.json`.
|
|
82
|
+
*/
|
|
83
|
+
function resolveResultsPath(cwd, screen) {
|
|
84
|
+
const perScreen = path.join(cwd, 'specs', 'generated', screen, `${screen}-test-result.json`);
|
|
85
|
+
if (fs.existsSync(perScreen))
|
|
86
|
+
return perScreen;
|
|
87
|
+
const global = path.join(cwd, 'test-results', 'results.json');
|
|
88
|
+
if (fs.existsSync(global))
|
|
89
|
+
return global;
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function runPreflight(cwd, screen) {
|
|
93
|
+
const featureFile = path.join(cwd, 'qa', 'screens', screen, 'features', `${screen}.feature`);
|
|
94
|
+
const testDataFile = (0, test_data_resolver_1.resolveTestDataPath)(cwd, screen);
|
|
95
|
+
const selectorsFile = path.join(cwd, 'qa', 'screens', screen, 'selectors', `${screen}.yaml`);
|
|
96
|
+
const specFile = path.join(cwd, 'specs', 'generated', screen, `${screen}.spec.ts`);
|
|
97
|
+
const resultsFile = resolveResultsPath(cwd, screen);
|
|
98
|
+
const featureOk = checkFeatureReal(featureFile);
|
|
99
|
+
const testDataOk = checkTestDataHasVars(testDataFile);
|
|
100
|
+
const selectorsOk = checkSelectorsHasEntries(selectorsFile, screen);
|
|
101
|
+
const specOk = fs.existsSync(specFile);
|
|
102
|
+
const resultsOk = resultsFile !== null;
|
|
103
|
+
const missing = [];
|
|
104
|
+
const suggestions = [];
|
|
105
|
+
if (!featureOk) {
|
|
106
|
+
missing.push(`feature file missing/empty: ${path.relative(cwd, featureFile)}`);
|
|
107
|
+
suggestions.push(`/sungen:create-test ${screen}`);
|
|
108
|
+
}
|
|
109
|
+
if (!testDataOk) {
|
|
110
|
+
missing.push(`test-data.yaml has no variables: ${path.relative(cwd, testDataFile)}`);
|
|
111
|
+
suggestions.push(`/sungen:create-test ${screen}`);
|
|
112
|
+
}
|
|
113
|
+
if (!selectorsOk) {
|
|
114
|
+
missing.push(`selectors.yaml missing entries: ${path.relative(cwd, selectorsFile)}`);
|
|
115
|
+
suggestions.push(`/sungen:run-test ${screen}`);
|
|
116
|
+
}
|
|
117
|
+
if (!specOk) {
|
|
118
|
+
missing.push(`compiled .spec.ts missing: ${path.relative(cwd, specFile)}`);
|
|
119
|
+
suggestions.push(`sungen generate --screen ${screen}`);
|
|
120
|
+
}
|
|
121
|
+
if (!resultsOk) {
|
|
122
|
+
missing.push(`test-result.json missing (optional)`);
|
|
123
|
+
suggestions.push(`PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/${screen}/${screen}-test-result.json npx playwright test specs/generated/${screen}/${screen}.spec.ts`);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
screen,
|
|
127
|
+
featureOk,
|
|
128
|
+
testDataOk,
|
|
129
|
+
selectorsOk,
|
|
130
|
+
specOk,
|
|
131
|
+
resultsOk,
|
|
132
|
+
missing,
|
|
133
|
+
suggestions: Array.from(new Set(suggestions)),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function checkFeatureReal(featureFile) {
|
|
137
|
+
if (!fs.existsSync(featureFile))
|
|
138
|
+
return false;
|
|
139
|
+
const content = fs.readFileSync(featureFile, 'utf-8');
|
|
140
|
+
if (!/Feature:/i.test(content))
|
|
141
|
+
return false;
|
|
142
|
+
// Treat as empty if only the sample scaffold scenario is present
|
|
143
|
+
const sample = /Scenario:\s*Sample scenario for /.test(content);
|
|
144
|
+
const realScenarios = (content.match(/\n\s*Scenario:/g) || []).length;
|
|
145
|
+
// If sample present and only 1 scenario ā it's the scaffold only
|
|
146
|
+
if (sample && realScenarios <= 1)
|
|
147
|
+
return false;
|
|
148
|
+
return realScenarios >= 1;
|
|
149
|
+
}
|
|
150
|
+
function checkTestDataHasVars(testDataFile) {
|
|
151
|
+
if (!fs.existsSync(testDataFile))
|
|
152
|
+
return false;
|
|
153
|
+
const content = fs.readFileSync(testDataFile, 'utf-8');
|
|
154
|
+
// Any non-comment line with `key: value`
|
|
155
|
+
const lines = content.split('\n').filter((l) => !l.trim().startsWith('#') && l.includes(':'));
|
|
156
|
+
return lines.length > 0;
|
|
157
|
+
}
|
|
158
|
+
function checkSelectorsHasEntries(selectorsFile, screen) {
|
|
159
|
+
if (!fs.existsSync(selectorsFile))
|
|
160
|
+
return false;
|
|
161
|
+
const content = fs.readFileSync(selectorsFile, 'utf-8');
|
|
162
|
+
// Very small check: YAML has more than just a single `<screen>: page` entry
|
|
163
|
+
const topLevelKeys = (content.match(/^[a-zA-Z_][^\s:]*:\s*$/gm) || []).length +
|
|
164
|
+
(content.match(/^[a-zA-Z_][^\s:]*:\s/gm) || []).length;
|
|
165
|
+
return topLevelKeys > 1;
|
|
166
|
+
}
|
|
167
|
+
function hasBlockingMissing(p) {
|
|
168
|
+
return !p.featureOk || !p.testDataOk || !p.selectorsOk || !p.specOk;
|
|
169
|
+
}
|
|
170
|
+
// ----------------------------------------------------------------------------
|
|
171
|
+
// Environment
|
|
172
|
+
// ----------------------------------------------------------------------------
|
|
173
|
+
function getEnvironment(cwd) {
|
|
174
|
+
let baseURL = '';
|
|
175
|
+
let projectName = 'chromium';
|
|
176
|
+
const configPath = path.join(cwd, 'playwright.config.ts');
|
|
177
|
+
if (fs.existsSync(configPath)) {
|
|
178
|
+
const c = fs.readFileSync(configPath, 'utf-8');
|
|
179
|
+
const baseMatch = c.match(/baseURL:\s*['"]([^'"]+)['"]/);
|
|
180
|
+
if (baseMatch)
|
|
181
|
+
baseURL = baseMatch[1];
|
|
182
|
+
const projMatch = c.match(/name:\s*['"]([^'"]+)['"]/);
|
|
183
|
+
if (projMatch)
|
|
184
|
+
projectName = projMatch[1];
|
|
185
|
+
}
|
|
186
|
+
let executor = process.env.CI_USER || process.env.USER || '';
|
|
187
|
+
try {
|
|
188
|
+
const gitUser = (0, child_process_1.execSync)('git config user.name', { cwd, encoding: 'utf-8' }).trim();
|
|
189
|
+
if (gitUser)
|
|
190
|
+
executor = gitUser;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// ignore
|
|
194
|
+
}
|
|
195
|
+
return { baseURL, projectName, executor };
|
|
196
|
+
}
|
|
197
|
+
// ----------------------------------------------------------------------------
|
|
198
|
+
// Per-screen export
|
|
199
|
+
// ----------------------------------------------------------------------------
|
|
200
|
+
async function exportScreen(cwd, screen, env) {
|
|
201
|
+
const featureFile = path.join(cwd, 'qa', 'screens', screen, 'features', `${screen}.feature`);
|
|
202
|
+
const testDataFile = (0, test_data_resolver_1.resolveTestDataPath)(cwd, screen);
|
|
203
|
+
const specFile = path.join(cwd, 'specs', 'generated', screen, `${screen}.spec.ts`);
|
|
204
|
+
const resultsFile = resolveResultsPath(cwd, screen);
|
|
205
|
+
const specMdFile = path.join(cwd, 'qa', 'screens', screen, 'requirements', 'spec.md');
|
|
206
|
+
try {
|
|
207
|
+
const feature = (0, feature_parser_1.parseFeatureMetadata)(featureFile);
|
|
208
|
+
const spec = (0, spec_parser_1.parseSpecFile)(specFile);
|
|
209
|
+
const testData = (0, test_data_resolver_1.loadTestData)(testDataFile);
|
|
210
|
+
const results = resultsFile ? (0, playwright_report_parser_1.loadPlaywrightReport)(resultsFile) : null;
|
|
211
|
+
const merged = (0, scenario_merger_1.mergeFeatureAndSpec)(feature, spec);
|
|
212
|
+
const rows = (0, csv_exporter_1.buildTestCaseRows)({
|
|
213
|
+
screen,
|
|
214
|
+
featureName: feature.featureName,
|
|
215
|
+
merged,
|
|
216
|
+
testData,
|
|
217
|
+
results,
|
|
218
|
+
env,
|
|
219
|
+
});
|
|
220
|
+
const specLink = fs.existsSync(specMdFile) ? path.relative(cwd, specMdFile) : '';
|
|
221
|
+
const tempSummary = (0, csv_exporter_1.buildSummary)(screen, rows, '');
|
|
222
|
+
const csv = (0, csv_exporter_1.renderCsv)(tempSummary, rows, specLink);
|
|
223
|
+
const csvPath = (0, csv_exporter_1.writeCsv)(cwd, screen, csv);
|
|
224
|
+
const wb = (0, xlsx_exporter_1.renderXlsx)(tempSummary, rows, specLink);
|
|
225
|
+
await (0, xlsx_exporter_1.writeXlsx)(cwd, screen, wb);
|
|
226
|
+
return (0, csv_exporter_1.buildSummary)(screen, rows, path.relative(cwd, csvPath));
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
console.error(`${COLOR.red}Error exporting ${screen}:${COLOR.reset} ${err instanceof Error ? err.message : err}`);
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ----------------------------------------------------------------------------
|
|
234
|
+
// Reporter
|
|
235
|
+
// ----------------------------------------------------------------------------
|
|
236
|
+
function printPreflightTable(checks) {
|
|
237
|
+
log(`\n${COLOR.bold}Pre-flight source check${COLOR.reset}`);
|
|
238
|
+
log(`${COLOR.gray}Columns: feature | test-data | selectors | .spec.ts | test-result.json${COLOR.reset}\n`);
|
|
239
|
+
const ok = (b) => (b ? `${COLOR.green}ā${COLOR.reset}` : `${COLOR.red}ā${COLOR.reset}`);
|
|
240
|
+
for (const c of checks) {
|
|
241
|
+
log(` ${c.screen.padEnd(20)} ${ok(c.featureOk)} ${ok(c.testDataOk)} ${ok(c.selectorsOk)} ${ok(c.specOk)} ${ok(c.resultsOk)}`);
|
|
242
|
+
}
|
|
243
|
+
log('');
|
|
244
|
+
// Show suggestions for any blocking misses
|
|
245
|
+
const blockers = checks.filter(hasBlockingMissing);
|
|
246
|
+
if (blockers.length > 0) {
|
|
247
|
+
log(`${COLOR.yellow}Blocking issues:${COLOR.reset}`);
|
|
248
|
+
for (const b of blockers) {
|
|
249
|
+
log(` ${COLOR.bold}${b.screen}${COLOR.reset}`);
|
|
250
|
+
for (const m of b.missing)
|
|
251
|
+
log(` - ${COLOR.red}ā${COLOR.reset} ${m}`);
|
|
252
|
+
for (const s of b.suggestions)
|
|
253
|
+
log(` ${COLOR.cyan}ā ${s}${COLOR.reset}`);
|
|
254
|
+
}
|
|
255
|
+
log('');
|
|
256
|
+
}
|
|
257
|
+
// Warn about optional misses (results.json)
|
|
258
|
+
const warnings = checks.filter((c) => !hasBlockingMissing(c) && !c.resultsOk);
|
|
259
|
+
if (warnings.length > 0) {
|
|
260
|
+
log(`${COLOR.yellow}Warnings (optional missing):${COLOR.reset}`);
|
|
261
|
+
for (const w of warnings) {
|
|
262
|
+
log(` ${w.screen}: test-result.json missing ā execution columns will be empty`);
|
|
263
|
+
}
|
|
264
|
+
log('');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function printSummaryTable(summaries) {
|
|
268
|
+
log(`\n${COLOR.bold}Delivery export complete${COLOR.reset}`);
|
|
269
|
+
log('');
|
|
270
|
+
log(' Screen TCs Passed Failed Pending N/A File');
|
|
271
|
+
log(' ' + '-'.repeat(80));
|
|
272
|
+
for (const s of summaries) {
|
|
273
|
+
log(` ${s.screen.padEnd(20)} ${String(s.total).padStart(3)} ${String(s.passed).padStart(6)} ${String(s.failed).padStart(6)} ${String(s.pending).padStart(7)} ${String(s.na).padStart(3)} ${s.outputFile}`);
|
|
274
|
+
}
|
|
275
|
+
log('');
|
|
276
|
+
const totalNotCompiled = summaries.reduce((a, s) => a + s.notCompiled, 0);
|
|
277
|
+
if (totalNotCompiled > 0) {
|
|
278
|
+
log(`${COLOR.yellow}Note: ${totalNotCompiled} scenario(s) flagged "Not compiled" in CSV. Re-run \`sungen generate\` to compile them.${COLOR.reset}\n`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ----------------------------------------------------------------------------
|
|
282
|
+
// Command registration
|
|
283
|
+
// ----------------------------------------------------------------------------
|
|
284
|
+
function registerDeliveryCommand(program) {
|
|
285
|
+
program
|
|
286
|
+
.command('delivery')
|
|
287
|
+
.description('Export Gherkin + Playwright results ā CSV test case deliverable')
|
|
288
|
+
.argument('[screens...]', 'Specific screen names. Omit to process all screens.')
|
|
289
|
+
.option('--skip-preflight', 'Skip pre-flight checks (not recommended)')
|
|
290
|
+
.option('--continue-on-missing', 'Skip screens with blocking misses instead of aborting')
|
|
291
|
+
.action(async (screens, options) => {
|
|
292
|
+
try {
|
|
293
|
+
const cwd = process.cwd();
|
|
294
|
+
// 1. Scope detection
|
|
295
|
+
let targetScreens;
|
|
296
|
+
if (screens && screens.length > 0) {
|
|
297
|
+
targetScreens = screens;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
targetScreens = listAllScreens(cwd);
|
|
301
|
+
if (targetScreens.length === 0) {
|
|
302
|
+
console.error(`${COLOR.red}No screens found in qa/screens/${COLOR.reset}`);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
log(`${COLOR.bold}sungen delivery${COLOR.reset} ā exporting ${targetScreens.length} screen(s): ${targetScreens.join(', ')}\n`);
|
|
307
|
+
// 2. Pre-flight
|
|
308
|
+
let toExport;
|
|
309
|
+
if (options.skipPreflight) {
|
|
310
|
+
toExport = targetScreens;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
const checks = targetScreens.map((s) => runPreflight(cwd, s));
|
|
314
|
+
printPreflightTable(checks);
|
|
315
|
+
const blockers = checks.filter(hasBlockingMissing);
|
|
316
|
+
if (blockers.length > 0) {
|
|
317
|
+
if (options.continueOnMissing) {
|
|
318
|
+
toExport = checks.filter((c) => !hasBlockingMissing(c)).map((c) => c.screen);
|
|
319
|
+
log(`${COLOR.yellow}Continuing with ${toExport.length} ready screen(s).${COLOR.reset}\n`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
console.error(`${COLOR.red}Aborted:${COLOR.reset} ${blockers.length} screen(s) have blocking issues.\n` +
|
|
323
|
+
`Run the suggested commands above, or use ${COLOR.cyan}--continue-on-missing${COLOR.reset} to skip them.`);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
toExport = checks.map((c) => c.screen);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// 3. Export
|
|
332
|
+
const env = getEnvironment(cwd);
|
|
333
|
+
const summaries = [];
|
|
334
|
+
for (const screen of toExport) {
|
|
335
|
+
const s = await exportScreen(cwd, screen, env);
|
|
336
|
+
if (s)
|
|
337
|
+
summaries.push(s);
|
|
338
|
+
}
|
|
339
|
+
// 4. Summary
|
|
340
|
+
printSummaryTable(summaries);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
console.error(`${COLOR.red}Fatal:${COLOR.reset} ${err instanceof Error ? err.message : err}`);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD9D"}
|
|
@@ -87,6 +87,7 @@ function registerGenerateCommand(program) {
|
|
|
87
87
|
.option('-s, --screen <name>', 'Generate tests for a specific screen')
|
|
88
88
|
.option('--all', 'Generate tests for all screens')
|
|
89
89
|
.option('--framework <name>', 'Test framework (default: playwright)', 'playwright')
|
|
90
|
+
.option('--inline-data', 'Hardcode test data at compile time instead of runtime loading')
|
|
90
91
|
.action(async (options) => {
|
|
91
92
|
try {
|
|
92
93
|
const screenName = options.screen;
|
|
@@ -114,6 +115,7 @@ function registerGenerateCommand(program) {
|
|
|
114
115
|
framework: options.framework || 'playwright',
|
|
115
116
|
screenName,
|
|
116
117
|
verbose: program.opts().verbose,
|
|
118
|
+
runtimeData: !options.inlineData,
|
|
117
119
|
});
|
|
118
120
|
const results = await generator.generateAllTests(path.join(process.cwd(), 'qa', 'screens'), outputDir, featureFiles);
|
|
119
121
|
console.log(`\n${results.length} test file(s) generated.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC5D"}
|
|
@@ -1,13 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerUpdateCommand = registerUpdateCommand;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
/**
|
|
6
|
+
* `sungen update` does two jobs in sequence:
|
|
7
|
+
*
|
|
8
|
+
* 1. Reinstall `@sun-asterisk/sungen@latest` globally via npm so the bundled
|
|
9
|
+
* AI templates are refreshed.
|
|
10
|
+
* 2. Re-execute `sungen update` with the env var `SUNGEN_UPDATE_SKIP_NPM=1`
|
|
11
|
+
* so the AI rules / commands / skills inside the project get overwritten
|
|
12
|
+
* from the *new* templates.
|
|
13
|
+
*
|
|
14
|
+
* We use an environment variable (not a CLI flag) for the internal hand-off
|
|
15
|
+
* because Commander throws "unknown option" if the currently-installed
|
|
16
|
+
* published version doesn't recognise the flag yet. Env vars are silently
|
|
17
|
+
* ignored by older versions ā the worst case is one extra (idempotent) npm
|
|
18
|
+
* install, never a crash.
|
|
19
|
+
*
|
|
20
|
+
* The public `--skip-npm-install` flag is still available for users who
|
|
21
|
+
* already installed the binary by other means (CI pipelines, corporate
|
|
22
|
+
* mirror, manual download) and only want to refresh the project AI assets.
|
|
23
|
+
*/
|
|
24
|
+
const SKIP_NPM_ENV = 'SUNGEN_UPDATE_SKIP_NPM';
|
|
4
25
|
function registerUpdateCommand(program) {
|
|
5
26
|
program
|
|
6
27
|
.command('update')
|
|
7
|
-
.description('
|
|
28
|
+
.description('Reinstall @sun-asterisk/sungen@latest + refresh AI rules, commands, and skills')
|
|
8
29
|
.option('--dry-run', 'Show what would be updated without making changes')
|
|
30
|
+
.option('--skip-npm-install', 'Skip the `npm install -g @sun-asterisk/sungen@latest` step (refresh project AI assets only)', false)
|
|
9
31
|
.action(async (options) => {
|
|
10
32
|
try {
|
|
33
|
+
const skipNpm = Boolean(options.skipNpmInstall) || process.env[SKIP_NPM_ENV] === '1';
|
|
34
|
+
if (!skipNpm) {
|
|
35
|
+
reinstallLatestSungen();
|
|
36
|
+
printCurrentVersion();
|
|
37
|
+
reExecUpdateForAIAssets(options.dryRun ?? false);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
11
40
|
const { AIRulesUpdater } = require('../../orchestrator/ai-rules-updater');
|
|
12
41
|
const updater = new AIRulesUpdater(process.cwd());
|
|
13
42
|
await updater.update(options.dryRun ?? false);
|
|
@@ -18,4 +47,38 @@ function registerUpdateCommand(program) {
|
|
|
18
47
|
}
|
|
19
48
|
});
|
|
20
49
|
}
|
|
50
|
+
function reinstallLatestSungen() {
|
|
51
|
+
console.log('š¦ Installing @sun-asterisk/sungen@latest...');
|
|
52
|
+
const result = (0, child_process_1.spawnSync)('npm', ['install', '-g', '@sun-asterisk/sungen@latest'], {
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
shell: true,
|
|
55
|
+
});
|
|
56
|
+
if (result.status !== 0) {
|
|
57
|
+
throw new Error('npm install -g @sun-asterisk/sungen@latest failed. Run it manually or check your npm setup.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function printCurrentVersion() {
|
|
61
|
+
console.log('\nš Installed version:');
|
|
62
|
+
(0, child_process_1.spawnSync)('sungen', ['--version'], { stdio: 'inherit', shell: true });
|
|
63
|
+
console.log('');
|
|
64
|
+
}
|
|
65
|
+
function reExecUpdateForAIAssets(dryRun) {
|
|
66
|
+
const args = ['update'];
|
|
67
|
+
if (dryRun)
|
|
68
|
+
args.push('--dry-run');
|
|
69
|
+
const result = (0, child_process_1.spawnSync)('sungen', args, {
|
|
70
|
+
stdio: 'inherit',
|
|
71
|
+
shell: true,
|
|
72
|
+
env: { ...process.env, [SKIP_NPM_ENV]: '1' },
|
|
73
|
+
});
|
|
74
|
+
if (result.status !== 0) {
|
|
75
|
+
console.error('\nā ļø AI-rules refresh step returned a non-zero exit code.\n' +
|
|
76
|
+
` If the newly installed version is older and didn't recognise this flow,\n` +
|
|
77
|
+
' run the refresh manually:\n\n' +
|
|
78
|
+
' sungen update --skip-npm-install' +
|
|
79
|
+
(dryRun ? ' --dry-run' : '') +
|
|
80
|
+
'\n');
|
|
81
|
+
}
|
|
82
|
+
process.exit(result.status ?? 0);
|
|
83
|
+
}
|
|
21
84
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -11,21 +11,23 @@ const add_1 = require("./commands/add");
|
|
|
11
11
|
const generate_1 = require("./commands/generate");
|
|
12
12
|
const makeauth_1 = require("./commands/makeauth");
|
|
13
13
|
const update_1 = require("./commands/update");
|
|
14
|
+
const delivery_1 = require("./commands/delivery");
|
|
14
15
|
async function main() {
|
|
15
16
|
const program = new commander_1.Command();
|
|
16
17
|
program
|
|
17
18
|
.name('sungen')
|
|
18
19
|
.description('Deterministic E2E Test Compiler ā Gherkin + Selectors ā Playwright')
|
|
19
|
-
.version('2.
|
|
20
|
+
.version('2.5.0');
|
|
20
21
|
// Global options
|
|
21
22
|
program
|
|
22
23
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
23
|
-
// Register commands (
|
|
24
|
+
// Register commands (6)
|
|
24
25
|
(0, init_1.registerInitCommand)(program);
|
|
25
26
|
(0, add_1.registerAddCommand)(program);
|
|
26
27
|
(0, generate_1.registerGenerateCommand)(program);
|
|
27
28
|
(0, makeauth_1.registerMakeauthCommand)(program);
|
|
28
29
|
(0, update_1.registerUpdateCommand)(program);
|
|
30
|
+
(0, delivery_1.registerDeliveryCommand)(program);
|
|
29
31
|
await program.parseAsync(process.argv);
|
|
30
32
|
}
|
|
31
33
|
main().catch((error) => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAE9D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,wBAAwB;IACxB,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IAEjC,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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble CSV rows from merged scenarios + test data + playwright results.
|
|
3
|
+
* Outputs a CSV file matching the BM-2-901-13 test case template format.
|
|
4
|
+
*/
|
|
5
|
+
import { MergedScenario } from './scenario-merger';
|
|
6
|
+
import { EnvironmentInfo, PlaywrightResult, ScreenSummary, TestCaseRow } from './types';
|
|
7
|
+
export interface BuildCsvInput {
|
|
8
|
+
screen: string;
|
|
9
|
+
featureName: string;
|
|
10
|
+
merged: MergedScenario[];
|
|
11
|
+
testData: Record<string, string>;
|
|
12
|
+
results: Map<string, PlaywrightResult> | null;
|
|
13
|
+
env: EnvironmentInfo;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build CSV test case rows from merged scenarios.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildTestCaseRows(input: BuildCsvInput): TestCaseRow[];
|
|
19
|
+
/**
|
|
20
|
+
* Calculate summary statistics from rows.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildSummary(screen: string, rows: TestCaseRow[], outputFile: string): ScreenSummary;
|
|
23
|
+
/**
|
|
24
|
+
* Compose the full CSV file content matching the BM-2-901-13 template.
|
|
25
|
+
*/
|
|
26
|
+
export declare function renderCsv(summary: ScreenSummary, rows: TestCaseRow[], specLink: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Write the CSV to disk at qa/deliverables/<screen>-testcases.csv.
|
|
29
|
+
* Creates directory if needed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function writeCsv(cwd: string, screen: string, csvContent: string): string;
|
|
32
|
+
//# sourceMappingURL=csv-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/csv-exporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBnD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAC9C,GAAG,EAAE,eAAe,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,EAAE,CAyFrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAmBnG;AAuBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6G/F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQhF"}
|