gherkin-ai 2.2.0 → 2.4.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/README.md +7 -3
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +5 -0
- package/dist/commands/autopilot.js.map +1 -1
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +50 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +23 -2
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/evaluate.d.ts +6 -0
- package/dist/commands/evaluate.d.ts.map +1 -0
- package/dist/commands/evaluate.js +80 -0
- package/dist/commands/evaluate.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +7 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +20 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +1 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +20 -9
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/context-extractor.d.ts +9 -0
- package/dist/core/context-extractor.d.ts.map +1 -0
- package/dist/core/context-extractor.js +60 -0
- package/dist/core/context-extractor.js.map +1 -0
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +4 -2
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/step-indexer.d.ts +19 -0
- package/dist/core/step-indexer.d.ts.map +1 -0
- package/dist/core/step-indexer.js +86 -0
- package/dist/core/step-indexer.js.map +1 -0
- package/dist/core/syntax-validator.d.ts +6 -0
- package/dist/core/syntax-validator.d.ts.map +1 -0
- package/dist/core/syntax-validator.js +37 -0
- package/dist/core/syntax-validator.js.map +1 -0
- package/dist/generators/preset-csharp-dotnet.d.ts +6 -0
- package/dist/generators/preset-csharp-dotnet.d.ts.map +1 -0
- package/dist/generators/preset-csharp-dotnet.js +38 -0
- package/dist/generators/preset-csharp-dotnet.js.map +1 -0
- package/dist/generators/preset-flutter.d.ts +6 -0
- package/dist/generators/preset-flutter.d.ts.map +1 -0
- package/dist/generators/preset-flutter.js +33 -0
- package/dist/generators/preset-flutter.js.map +1 -0
- package/dist/generators/preset-go.d.ts +6 -0
- package/dist/generators/preset-go.d.ts.map +1 -0
- package/dist/generators/preset-go.js +57 -0
- package/dist/generators/preset-go.js.map +1 -0
- package/dist/generators/preset-node-nestjs.d.ts +6 -0
- package/dist/generators/preset-node-nestjs.d.ts.map +1 -0
- package/dist/generators/preset-node-nestjs.js +52 -0
- package/dist/generators/preset-node-nestjs.js.map +1 -0
- package/dist/generators/preset-php-laravel.d.ts +6 -0
- package/dist/generators/preset-php-laravel.d.ts.map +1 -0
- package/dist/generators/preset-php-laravel.js +49 -0
- package/dist/generators/preset-php-laravel.js.map +1 -0
- package/dist/generators/preset-python-fastapi.d.ts +6 -0
- package/dist/generators/preset-python-fastapi.d.ts.map +1 -0
- package/dist/generators/preset-python-fastapi.js +38 -0
- package/dist/generators/preset-python-fastapi.js.map +1 -0
- package/dist/generators/preset-ruby-rails.d.ts +6 -0
- package/dist/generators/preset-ruby-rails.d.ts.map +1 -0
- package/dist/generators/preset-ruby-rails.js +28 -0
- package/dist/generators/preset-ruby-rails.js.map +1 -0
- package/dist/generators/preset-rust-axum.d.ts +6 -0
- package/dist/generators/preset-rust-axum.d.ts.map +1 -0
- package/dist/generators/preset-rust-axum.js +40 -0
- package/dist/generators/preset-rust-axum.js.map +1 -0
- package/dist/generators/presets.d.ts +7 -0
- package/dist/generators/presets.d.ts.map +1 -0
- package/dist/generators/presets.js +52 -0
- package/dist/generators/presets.js.map +1 -0
- package/dist/generators/prompt-templates/base.d.ts +4 -0
- package/dist/generators/prompt-templates/base.d.ts.map +1 -1
- package/dist/generators/prompt-templates/base.js.map +1 -1
- package/dist/generators/prompts.d.ts.map +1 -1
- package/dist/generators/prompts.js +42 -1
- package/dist/generators/prompts.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/ui/public/assets/favicon.svg +8 -0
- package/dist/ui/public/assets/logo.svg +1 -0
- package/dist/ui/public/index.html +501 -0
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/ui/server.js +107 -0
- package/dist/ui/server.js.map +1 -1
- package/docs/COMMANDS.md +73 -0
- package/docs/ai-skills.md +42 -0
- package/docs/ast-step-indexer.md +47 -0
- package/docs/headless-mode.md +74 -0
- package/package.json +5 -3
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ContextExtractor = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
class ContextExtractor {
|
|
11
|
+
extract(workspaceRoot) {
|
|
12
|
+
const context = {
|
|
13
|
+
dataModels: [],
|
|
14
|
+
domSelectors: []
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
// 1. Prisma Schema (Data Models)
|
|
18
|
+
const prismaPath = path_1.default.join(workspaceRoot, 'prisma', 'schema.prisma');
|
|
19
|
+
if (fs_1.default.existsSync(prismaPath)) {
|
|
20
|
+
const prismaContent = fs_1.default.readFileSync(prismaPath, 'utf8');
|
|
21
|
+
const models = prismaContent.match(/model\s+(\w+)\s+{([^}]+)}/g) || [];
|
|
22
|
+
// Keep it concise for prompt injection (limit 5 models)
|
|
23
|
+
context.dataModels = models.slice(0, 5).map(m => m.substring(0, 300) + (m.length > 300 ? '...' : ''));
|
|
24
|
+
}
|
|
25
|
+
// 2. DOM Selectors (Playwright/Cypress Page Objects)
|
|
26
|
+
const e2eDir = path_1.default.join(workspaceRoot, 'e2e');
|
|
27
|
+
if (fs_1.default.existsSync(e2eDir)) {
|
|
28
|
+
this.findSelectors(e2eDir, context.domSelectors);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
logger_1.logger.error(`Context extraction error: ${e.message}`);
|
|
33
|
+
}
|
|
34
|
+
return context;
|
|
35
|
+
}
|
|
36
|
+
findSelectors(dir, selectors) {
|
|
37
|
+
if (selectors.length > 20)
|
|
38
|
+
return; // limit
|
|
39
|
+
const files = fs_1.default.readdirSync(dir);
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const fullPath = path_1.default.join(dir, file);
|
|
42
|
+
const stat = fs_1.default.statSync(fullPath);
|
|
43
|
+
if (stat.isDirectory()) {
|
|
44
|
+
this.findSelectors(fullPath, selectors);
|
|
45
|
+
}
|
|
46
|
+
else if (fullPath.endsWith('.ts') || fullPath.endsWith('.js')) {
|
|
47
|
+
const content = fs_1.default.readFileSync(fullPath, 'utf8');
|
|
48
|
+
// Look for common selector patterns: data-testid, data-test
|
|
49
|
+
const matches = [...content.matchAll(/data-test(?:id)?=['"]([^'"]+)['"]/g)];
|
|
50
|
+
matches.forEach(m => {
|
|
51
|
+
const val = m[1];
|
|
52
|
+
if (!selectors.includes(val))
|
|
53
|
+
selectors.push(val);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.ContextExtractor = ContextExtractor;
|
|
60
|
+
//# sourceMappingURL=context-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-extractor.js","sourceRoot":"","sources":["../../src/core/context-extractor.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAyC;AAOzC,MAAa,gBAAgB;IACpB,OAAO,CAAC,aAAqB;QAClC,MAAM,OAAO,GAAe;YAC1B,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,EAAE;SACjB,CAAC;QAEF,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;YACvE,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC;gBACvE,wDAAwD;gBACxD,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxG,CAAC;YAED,qDAAqD;YACrD,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,aAAa,CAAC,GAAW,EAAE,SAAmB;QACpD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,QAAQ;QAC3C,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAClD,4DAA4D;gBAC5D,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC5E,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAClB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAhDD,4CAgDC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkin-parser.d.ts","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"gherkin-parser.d.ts","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAmJnE"}
|
|
@@ -119,8 +119,10 @@ function parseGherkinText(gherkinText) {
|
|
|
119
119
|
fieldsMap.set(fieldName, { name: fieldName, type, validations: [] });
|
|
120
120
|
}
|
|
121
121
|
const existing = fieldsMap.get(fieldName);
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
// Extract inline tags from step text
|
|
123
|
+
const inlineTags = st.text.match(/@[\w:(),]+/g) || [];
|
|
124
|
+
inlineTags.forEach(tag => {
|
|
125
|
+
if (!existing.validations.includes(tag)) {
|
|
124
126
|
existing.validations.push(tag);
|
|
125
127
|
}
|
|
126
128
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":";AAAA;;;gFAGgF;;AAsChF,
|
|
1
|
+
{"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ExtractedStep {
|
|
2
|
+
keyword: string;
|
|
3
|
+
pattern: string;
|
|
4
|
+
filePath: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IStepParser {
|
|
7
|
+
parse(workspaceRoot: string): ExtractedStep[];
|
|
8
|
+
}
|
|
9
|
+
export declare class TypeScriptStepParser implements IStepParser {
|
|
10
|
+
parse(workspaceRoot: string): ExtractedStep[];
|
|
11
|
+
}
|
|
12
|
+
export declare class RegexStepParser implements IStepParser {
|
|
13
|
+
parse(workspaceRoot: string): ExtractedStep[];
|
|
14
|
+
}
|
|
15
|
+
export declare class StepIndexer {
|
|
16
|
+
private parsers;
|
|
17
|
+
getAvailableSteps(workspaceRoot: string): ExtractedStep[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=step-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-indexer.d.ts","sourceRoot":"","sources":["../../src/core/step-indexer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;CAC/C;AAED,qBAAa,oBAAqB,YAAW,WAAW;IAC/C,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;CAqDrD;AAED,qBAAa,eAAgB,YAAW,WAAW;IAC1C,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;CAKrD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAGb;IAEK,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;CAYjE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StepIndexer = exports.RegexStepParser = exports.TypeScriptStepParser = void 0;
|
|
7
|
+
const ts_morph_1 = require("ts-morph");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
class TypeScriptStepParser {
|
|
11
|
+
parse(workspaceRoot) {
|
|
12
|
+
const steps = [];
|
|
13
|
+
const project = new ts_morph_1.Project();
|
|
14
|
+
// Look in common TS/JS E2E directories
|
|
15
|
+
const searchGlobs = [
|
|
16
|
+
path_1.default.join(workspaceRoot, 'cypress/support/**/*.ts'),
|
|
17
|
+
path_1.default.join(workspaceRoot, 'cypress/support/**/*.js'),
|
|
18
|
+
path_1.default.join(workspaceRoot, 'e2e/steps/**/*.ts'),
|
|
19
|
+
path_1.default.join(workspaceRoot, 'tests/steps/**/*.ts'),
|
|
20
|
+
path_1.default.join(workspaceRoot, 'features/step_definitions/**/*.ts')
|
|
21
|
+
];
|
|
22
|
+
project.addSourceFilesAtPaths(searchGlobs);
|
|
23
|
+
const sourceFiles = project.getSourceFiles();
|
|
24
|
+
for (const sf of sourceFiles) {
|
|
25
|
+
// Find all call expressions like Given('...', () => {})
|
|
26
|
+
const callExpressions = sf.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression);
|
|
27
|
+
for (const callExpr of callExpressions) {
|
|
28
|
+
const expression = callExpr.getExpression();
|
|
29
|
+
const funcName = expression.getText();
|
|
30
|
+
if (['Given', 'When', 'Then', 'step', 'dado', 'cuando', 'entonces'].includes(funcName)) {
|
|
31
|
+
const args = callExpr.getArguments();
|
|
32
|
+
if (args.length > 0) {
|
|
33
|
+
const firstArg = args[0];
|
|
34
|
+
let pattern = '';
|
|
35
|
+
// If it's a string literal: Given("I login", ...)
|
|
36
|
+
if (firstArg.getKindName() === 'StringLiteral' || firstArg.getKindName() === 'NoSubstitutionTemplateLiteral') {
|
|
37
|
+
pattern = firstArg.getText().replace(/^['"`]/, '').replace(/['"`]$/, '');
|
|
38
|
+
}
|
|
39
|
+
// If it's a regex: Given(/^I login$/, ...)
|
|
40
|
+
else if (firstArg.getKindName() === 'RegularExpressionLiteral') {
|
|
41
|
+
pattern = firstArg.getText();
|
|
42
|
+
}
|
|
43
|
+
if (pattern) {
|
|
44
|
+
steps.push({
|
|
45
|
+
keyword: funcName,
|
|
46
|
+
pattern,
|
|
47
|
+
filePath: sf.getFilePath()
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return steps;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.TypeScriptStepParser = TypeScriptStepParser;
|
|
58
|
+
class RegexStepParser {
|
|
59
|
+
parse(workspaceRoot) {
|
|
60
|
+
// A fallback parser for languages without AST support yet (Python, Java, etc.)
|
|
61
|
+
// Searches text for @given('...') or @When("...")
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.RegexStepParser = RegexStepParser;
|
|
66
|
+
class StepIndexer {
|
|
67
|
+
parsers = [
|
|
68
|
+
new TypeScriptStepParser(),
|
|
69
|
+
new RegexStepParser() // Fallback
|
|
70
|
+
];
|
|
71
|
+
getAvailableSteps(workspaceRoot) {
|
|
72
|
+
const allSteps = [];
|
|
73
|
+
for (const parser of this.parsers) {
|
|
74
|
+
try {
|
|
75
|
+
const parsed = parser.parse(workspaceRoot);
|
|
76
|
+
allSteps.push(...parsed);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
logger_1.logger.error(`Error parsing steps: ${e.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return allSteps;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.StepIndexer = StepIndexer;
|
|
86
|
+
//# sourceMappingURL=step-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-indexer.js","sourceRoot":"","sources":["../../src/core/step-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates TypeScript syntax in-memory before writing to disk.
|
|
3
|
+
* Returns true if valid, false if syntax errors exist.
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateTypeScriptSyntax(filename: string, content: string): boolean;
|
|
6
|
+
//# sourceMappingURL=syntax-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax-validator.d.ts","sourceRoot":"","sources":["../../src/core/syntax-validator.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAyBnF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateTypeScriptSyntax = validateTypeScriptSyntax;
|
|
7
|
+
const ts_morph_1 = require("ts-morph");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
/**
|
|
10
|
+
* Validates TypeScript syntax in-memory before writing to disk.
|
|
11
|
+
* Returns true if valid, false if syntax errors exist.
|
|
12
|
+
*/
|
|
13
|
+
function validateTypeScriptSyntax(filename, content) {
|
|
14
|
+
if (!filename.endsWith('.ts') && !filename.endsWith('.tsx')) {
|
|
15
|
+
return true; // We only validate TS files for now
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const project = new ts_morph_1.Project({ useInMemoryFileSystem: true });
|
|
19
|
+
const sourceFile = project.createSourceFile(filename, content);
|
|
20
|
+
// Check syntactic diagnostics (fast) rather than semantic (slow, requires full project)
|
|
21
|
+
const diagnostics = sourceFile.getPreEmitDiagnostics();
|
|
22
|
+
const errors = diagnostics.filter(d => d.getCategory() === 1); // Error category
|
|
23
|
+
if (errors.length > 0) {
|
|
24
|
+
console.log(chalk_1.default.yellow(` ⚠️ Pre-validation failed for ${filename}:`));
|
|
25
|
+
for (const diag of errors.slice(0, 3)) {
|
|
26
|
+
console.log(chalk_1.default.yellow(` - ${diag.getMessageText()}`));
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.log(chalk_1.default.yellow(` ⚠️ Pre-validation exception for ${filename}: ${err.message}`));
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=syntax-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax-validator.js","sourceRoot":"","sources":["../../src/core/syntax-validator.ts"],"names":[],"mappings":";;;;;AAOA,4DAyBC;AAhCD,uCAAmC;AACnC,kDAA0B;AAE1B;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,QAAgB,EAAE,OAAe;IACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,CAAC,oCAAoC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,kBAAO,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE/D,wFAAwF;QACxF,MAAM,WAAW,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAEhF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,mCAAmC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,sCAAsC,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-csharp-dotnet.d.ts","sourceRoot":"","sources":["../../src/generators/preset-csharp-dotnet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAgCzG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - C# .NET & SpecFlow Preset Generator
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateCsharpDotnetPreset = generateCsharpDotnetPreset;
|
|
7
|
+
function generateCsharpDotnetPreset(parsed) {
|
|
8
|
+
const className = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '') + 'StepDefinitions';
|
|
9
|
+
const stepDefCode = `// SpecFlow Step Definitions for ${parsed.featureName}
|
|
10
|
+
using System;
|
|
11
|
+
using TechTalk.SpecFlow;
|
|
12
|
+
|
|
13
|
+
namespace Tests.Steps
|
|
14
|
+
{
|
|
15
|
+
[Binding]
|
|
16
|
+
public class ${className}
|
|
17
|
+
{
|
|
18
|
+
${parsed.scenarios.map(sc => `
|
|
19
|
+
// Scenario: ${sc.name}
|
|
20
|
+
${sc.steps.map(st => `
|
|
21
|
+
[${st.keyword.trim()}("${st.text.replace(/"/g, '""')}")]
|
|
22
|
+
public void ${st.keyword.trim()}${st.text.replace(/[^a-zA-Z0-9]/g, '')}()
|
|
23
|
+
{
|
|
24
|
+
// TODO: Implement step
|
|
25
|
+
}
|
|
26
|
+
`).join('')}
|
|
27
|
+
`).join('')}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
filename: `${className}.cs`,
|
|
34
|
+
content: stepDefCode
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=preset-csharp-dotnet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-csharp-dotnet.js","sourceRoot":"","sources":["../../src/generators/preset-csharp-dotnet.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,gEAgCC;AAhCD,SAAgB,0BAA0B,CAAC,MAAqB;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC;IAEtF,MAAM,WAAW,GAAG,oCAAoC,MAAM,CAAC,WAAW;;;;;;;mBAOzD,SAAS;;EAE1B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;uBACN,EAAE,CAAC,IAAI;EAC5B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;WACV,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;sBACtC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;;;;CAI7E,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;CAGV,CAAC;IAEA,OAAO;QACL;YACE,QAAQ,EAAE,GAAG,SAAS,KAAK;YAC3B,OAAO,EAAE,WAAW;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-flutter.d.ts","sourceRoot":"","sources":["../../src/generators/preset-flutter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CA2BpG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - Flutter (Dart) Preset Generator
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateFlutterPreset = generateFlutterPreset;
|
|
7
|
+
function generateFlutterPreset(parsed) {
|
|
8
|
+
const moduleName = parsed.featureName.toLowerCase().replace(/[^a-z0-9]/g, '_');
|
|
9
|
+
const stepDefCode = `// flutter_test Step Definitions for ${parsed.featureName}
|
|
10
|
+
import 'package:flutter_test/flutter_test.dart';
|
|
11
|
+
|
|
12
|
+
void main() {
|
|
13
|
+
group('${parsed.featureName.replace(/'/g, "\\'")}', () {
|
|
14
|
+
|
|
15
|
+
${parsed.scenarios.map(sc => `
|
|
16
|
+
testWidgets('${sc.name.replace(/'/g, "\\'")}', (WidgetTester tester) async {
|
|
17
|
+
${sc.steps.map(st => `
|
|
18
|
+
// ${st.keyword.trim()} ${st.text}
|
|
19
|
+
// TODO: Implement step
|
|
20
|
+
`).join('')}
|
|
21
|
+
});
|
|
22
|
+
`).join('')}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
filename: `test/${moduleName}_test.dart`,
|
|
29
|
+
content: stepDefCode
|
|
30
|
+
}
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=preset-flutter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-flutter.js","sourceRoot":"","sources":["../../src/generators/preset-flutter.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,sDA2BC;AA3BD,SAAgB,qBAAqB,CAAC,MAAqB;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,wCAAwC,MAAM,CAAC,WAAW;;;;WAIrE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;EAEhD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;mBACV,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;EAC7C,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;WACV,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI;;CAEtC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;CAEV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;CAGV,CAAC;IAEA,OAAO;QACL;YACE,QAAQ,EAAE,QAAQ,UAAU,YAAY;YACxC,OAAO,EAAE,WAAW;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-go.d.ts","sourceRoot":"","sources":["../../src/generators/preset-go.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAmD/F"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - Go & Godog Preset Generator
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateGoPreset = generateGoPreset;
|
|
7
|
+
function generateGoPreset(parsed) {
|
|
8
|
+
const packageName = parsed.featureName.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
9
|
+
const stepDefCode = `// Godog Step Definitions for ${parsed.featureName}
|
|
10
|
+
package ${packageName || 'bddtests'}
|
|
11
|
+
|
|
12
|
+
import (
|
|
13
|
+
"context"
|
|
14
|
+
"testing"
|
|
15
|
+
"github.com/cucumber/godog"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
${parsed.scenarios.map(sc => `
|
|
19
|
+
// Scenario: ${sc.name}
|
|
20
|
+
${sc.steps.map(st => `
|
|
21
|
+
func ${st.text.toLowerCase().replace(/[^a-z0-9]/g, '')}(ctx context.Context) (context.Context, error) {
|
|
22
|
+
// TODO: Implement step
|
|
23
|
+
return ctx, godog.ErrPending
|
|
24
|
+
}
|
|
25
|
+
`).join('')}
|
|
26
|
+
`).join('')}
|
|
27
|
+
|
|
28
|
+
func InitializeScenario(ctx *godog.ScenarioContext) {
|
|
29
|
+
${parsed.scenarios.map(sc => `
|
|
30
|
+
// ${sc.name}
|
|
31
|
+
${sc.steps.map(st => ` ctx.Step(\`^${st.text.replace(/"/g, '\\"')}$\`, ${st.text.toLowerCase().replace(/[^a-z0-9]/g, '')})`).join('\n')}
|
|
32
|
+
`).join('\n')}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func TestFeatures(t *testing.T) {
|
|
36
|
+
suite := godog.TestSuite{
|
|
37
|
+
ScenarioInitializer: InitializeScenario,
|
|
38
|
+
Options: &godog.Options{
|
|
39
|
+
Format: "pretty",
|
|
40
|
+
Paths: []string{"features"},
|
|
41
|
+
TestingT: t,
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if suite.Run() != 0 {
|
|
46
|
+
t.Fatal("non-zero status returned, failed to run feature tests")
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
filename: `${packageName}_test.go`,
|
|
53
|
+
content: stepDefCode
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=preset-go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-go.js","sourceRoot":"","sources":["../../src/generators/preset-go.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,4CAmDC;AAnDD,SAAgB,gBAAgB,CAAC,MAAqB;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,iCAAiC,MAAM,CAAC,WAAW;UAC/D,WAAW,IAAI,UAAU;;;;;;;;EAQjC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;eACd,EAAE,CAAC,IAAI;EACpB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;OACd,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;;;;CAIrD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;EAGT,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;SACpB,EAAE,CAAC,IAAI;EACd,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACzI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;CAiBZ,CAAC;IAEA,OAAO;QACL;YACE,QAAQ,EAAE,GAAG,WAAW,UAAU;YAClC,OAAO,EAAE,WAAW;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-node-nestjs.d.ts","sourceRoot":"","sources":["../../src/generators/preset-node-nestjs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CA8CvG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - NestJS (cucumber-js) Preset Generator
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateNodeNestJsPreset = generateNodeNestJsPreset;
|
|
7
|
+
function generateNodeNestJsPreset(parsed) {
|
|
8
|
+
const className = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '');
|
|
9
|
+
const moduleName = parsed.featureName.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
10
|
+
const stepDefCode = `// cucumber-js Step Definitions for NestJS - ${parsed.featureName}
|
|
11
|
+
import { Given, When, Then, Before, After } from '@cucumber/cucumber';
|
|
12
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
13
|
+
import { INestApplication } from '@nestjs/common';
|
|
14
|
+
import * as request from 'supertest';
|
|
15
|
+
// import { AppModule } from '../../src/app.module';
|
|
16
|
+
|
|
17
|
+
let app: INestApplication;
|
|
18
|
+
let res: request.Response;
|
|
19
|
+
|
|
20
|
+
Before(async () => {
|
|
21
|
+
/*
|
|
22
|
+
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
23
|
+
imports: [AppModule],
|
|
24
|
+
}).compile();
|
|
25
|
+
|
|
26
|
+
app = moduleFixture.createNestApplication();
|
|
27
|
+
await app.init();
|
|
28
|
+
*/
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
After(async () => {
|
|
32
|
+
// await app.close();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
${parsed.scenarios.map(sc => `
|
|
36
|
+
// Scenario: ${sc.name}
|
|
37
|
+
${sc.steps.map(st => `
|
|
38
|
+
${st.keyword.trim()}('${st.text.replace(/'/g, "\\'")}', async function () {
|
|
39
|
+
// TODO: Implement step
|
|
40
|
+
return 'pending';
|
|
41
|
+
});
|
|
42
|
+
`).join('')}
|
|
43
|
+
`).join('')}
|
|
44
|
+
`;
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
filename: `test/steps/${moduleName}.steps.ts`,
|
|
48
|
+
content: stepDefCode
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=preset-node-nestjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-node-nestjs.js","sourceRoot":"","sources":["../../src/generators/preset-node-nestjs.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,4DA8CC;AA9CD,SAAgB,wBAAwB,CAAC,MAAqB;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,gDAAgD,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;EAyBtF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;eACd,EAAE,CAAC,IAAI;EACpB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;EACnB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;CAInD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACV,CAAC;IAEA,OAAO;QACL;YACE,QAAQ,EAAE,cAAc,UAAU,WAAW;YAC7C,OAAO,EAAE,WAAW;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-php-laravel.d.ts","sourceRoot":"","sources":["../../src/generators/preset-php-laravel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CA2CvG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - PHP Laravel & Behat Preset Generator
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generatePhpLaravelPreset = generatePhpLaravelPreset;
|
|
7
|
+
function generatePhpLaravelPreset(parsed) {
|
|
8
|
+
const className = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '') + 'Context';
|
|
9
|
+
const stepDefCode = `<?php
|
|
10
|
+
// Behat Context for ${parsed.featureName}
|
|
11
|
+
|
|
12
|
+
namespace Tests\\Behat;
|
|
13
|
+
|
|
14
|
+
use Behat\\Behat\\Context\\Context;
|
|
15
|
+
use Tests\\TestCase;
|
|
16
|
+
|
|
17
|
+
class ${className} extends TestCase implements Context
|
|
18
|
+
{
|
|
19
|
+
/**
|
|
20
|
+
* Initializes context.
|
|
21
|
+
* Every scenario gets its own context instance.
|
|
22
|
+
*/
|
|
23
|
+
public function __construct()
|
|
24
|
+
{
|
|
25
|
+
parent::setUp();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
${parsed.scenarios.map(sc => `
|
|
29
|
+
// Scenario: ${sc.name}
|
|
30
|
+
${sc.steps.map(st => `
|
|
31
|
+
/**
|
|
32
|
+
* @${st.keyword.trim()} ${st.text.replace(/'/g, "\\'")}
|
|
33
|
+
*/
|
|
34
|
+
public function step${st.text.replace(/[^a-zA-Z0-9]/g, '')}()
|
|
35
|
+
{
|
|
36
|
+
// TODO: Implement step
|
|
37
|
+
}
|
|
38
|
+
`).join('')}
|
|
39
|
+
`).join('')}
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
filename: `${className}.php`,
|
|
45
|
+
content: stepDefCode
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=preset-php-laravel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-php-laravel.js","sourceRoot":"","sources":["../../src/generators/preset-php-laravel.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,4DA2CC;AA3CD,SAAgB,wBAAwB,CAAC,MAAqB;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;IAE9E,MAAM,WAAW,GAAG;uBACC,MAAM,CAAC,WAAW;;;;;;;QAOjC,SAAS;;;;;;;;;;;EAWf,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;mBACV,EAAE,CAAC,IAAI;EACxB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;UAEX,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;0BAEjC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;;;;CAI7D,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;CAEV,CAAC;IAEA,OAAO;QACL;YACE,QAAQ,EAAE,GAAG,SAAS,MAAM;YAC5B,OAAO,EAAE,WAAW;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-python-fastapi.d.ts","sourceRoot":"","sources":["../../src/generators/preset-python-fastapi.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAgC1G"}
|