@zhiweiliu/playwright-generator 1.0.28 → 1.0.30
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 +21 -11
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/config.d.ts +7 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -7
- package/dist/config.js.map +1 -1
- package/dist/llm/azure-openai.d.ts +12 -0
- package/dist/llm/azure-openai.d.ts.map +1 -0
- package/dist/llm/azure-openai.js +65 -0
- package/dist/llm/azure-openai.js.map +1 -0
- package/dist/llm/chatgpt.d.ts +10 -0
- package/dist/llm/chatgpt.d.ts.map +1 -0
- package/dist/llm/chatgpt.js +58 -0
- package/dist/llm/chatgpt.js.map +1 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +17 -12
- package/dist/llm/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -72,9 +72,10 @@ The installed module will have amazing features to facilitate your day-to-day te
|
|
|
72
72
|
- **Node.js**: Version 16.0 or higher
|
|
73
73
|
- **npm**: Version 7.0 or higher
|
|
74
74
|
- **Git**: For version control integration
|
|
75
|
-
- **LLM API Access
|
|
76
|
-
- Copilot: GitHub Copilot API credentials
|
|
75
|
+
- **LLM API Access**: Depending on your AI model choice:
|
|
77
76
|
- Claude: Anthropic API key with Claude access enabled (visit https://console.anthropic.com/)
|
|
77
|
+
- Azure OpenAI: Azure subscription with an OpenAI resource and deployment
|
|
78
|
+
- ChatGPT: OpenAI API key (visit https://platform.openai.com/)
|
|
78
79
|
|
|
79
80
|
## Installation & Quick Start
|
|
80
81
|
|
|
@@ -133,9 +134,14 @@ project-root/
|
|
|
133
134
|
|
|
134
135
|
```env
|
|
135
136
|
# AI Model Configuration
|
|
136
|
-
AI_MODEL=
|
|
137
|
-
COPILOT_API_KEY=your_key_here # Required if using Copilot
|
|
137
|
+
AI_MODEL=claude # Options: claude, azure-openai, chatgpt
|
|
138
138
|
CLAUDE_API_KEY=sk-ant-... # Required if using Claude (starts with sk-ant-)
|
|
139
|
+
AZURE_OPENAI_API_KEY= # Required if using Azure OpenAI
|
|
140
|
+
AZURE_OPENAI_ENDPOINT= # e.g. https://<resource>.openai.azure.com
|
|
141
|
+
AZURE_OPENAI_DEPLOYMENT= # e.g. gpt-4o
|
|
142
|
+
AZURE_OPENAI_API_VERSION=2024-02-01 # Optional, defaults to 2024-02-01
|
|
143
|
+
CHATGPT_API_KEY= # Required if using ChatGPT (starts with sk-)
|
|
144
|
+
CHATGPT_MODEL=gpt-4o # Optional, defaults to gpt-4o
|
|
139
145
|
|
|
140
146
|
# Playwright Configuration
|
|
141
147
|
BROWSER=chromium # Options: chromium, firefox, webkit
|
|
@@ -196,9 +202,10 @@ Playwright test automation code is generated by running a command, with generate
|
|
|
196
202
|
- The test case ID tag must be specified with the generation command, allowing generation of one test case at a time
|
|
197
203
|
- If an output file is specified, the command will either append the generated test case to the file or update it if it already exists
|
|
198
204
|
- If no output file is specified, the command will either append to `generated.test.ts` or update the test case if it exists
|
|
199
|
-
- The following AI models are supported
|
|
200
|
-
- **Copilot**: GitHub Copilot API
|
|
205
|
+
- The following AI models are supported:
|
|
201
206
|
- **Claude**: Anthropic Claude 3 Haiku API (widely available)
|
|
207
|
+
- **Azure OpenAI**: Azure-hosted OpenAI models (e.g. gpt-4o)
|
|
208
|
+
- **ChatGPT**: OpenAI API (e.g. gpt-4o)
|
|
202
209
|
|
|
203
210
|
The generator now strips Markdown and explanation text from model output automatically, keeping only the extracted TypeScript test function before writing to `generated/*.test.ts`.
|
|
204
211
|
|
|
@@ -207,11 +214,14 @@ The generator now strips Markdown and explanation text from model output automat
|
|
|
207
214
|
**Generation Commands**:
|
|
208
215
|
|
|
209
216
|
```bash
|
|
210
|
-
# Generate
|
|
217
|
+
# Generate test code (default: claude)
|
|
211
218
|
npx playwright-generator generate --tc TC-0001
|
|
212
219
|
|
|
213
|
-
# Generate with
|
|
214
|
-
npx playwright-generator generate --tc TC-0001 --model
|
|
220
|
+
# Generate with Azure OpenAI
|
|
221
|
+
npx playwright-generator generate --tc TC-0001 --model azure-openai
|
|
222
|
+
|
|
223
|
+
# Generate with ChatGPT
|
|
224
|
+
npx playwright-generator generate --tc TC-0001 --model chatgpt
|
|
215
225
|
|
|
216
226
|
# Generate to specific output file
|
|
217
227
|
npx playwright-generator generate --tc TC-0001 --output login.test.ts
|
|
@@ -316,8 +326,8 @@ Workflow file location: `.github/workflows/playwright-tests.yml`
|
|
|
316
326
|
|
|
317
327
|
| Issue | Solution |
|
|
318
328
|
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
319
|
-
| `API key not found` | Verify `.env` file exists and `
|
|
320
|
-
| `Claude API connection failed` | Check `CLAUDE_API_KEY` is valid and account has Claude API access; ensure key starts with `sk-ant-`. Visit https://console.anthropic.com/ to enable Claude API. Uses Claude 3 Haiku which is widely available.
|
|
329
|
+
| `API key not found` | Verify `.env` file exists and `CLAUDE_API_KEY` or `AZURE_OPENAI_API_KEY` is set |
|
|
330
|
+
| `Claude API connection failed` | Check `CLAUDE_API_KEY` is valid and account has Claude API access; ensure key starts with `sk-ant-`. Visit https://console.anthropic.com/ to enable Claude API. Uses Claude 3 Haiku which is widely available. |
|
|
321
331
|
| `Tests timing out` | Increase `TIMEOUT` in `.env` or use explicit waits in test cases |
|
|
322
332
|
| `Generated code doesn't compile` | Review the natural language description for clarity; regenerate with a refined prompt |
|
|
323
333
|
| `Tests pass locally but fail in CI` | Check `BASE_URL` environment variable and add debugging with screenshots |
|
package/dist/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ const program = new commander_1.Command();
|
|
|
12
12
|
program
|
|
13
13
|
.name("playwright-generator")
|
|
14
14
|
.description("Generate Playwright test cases from natural language using LLM")
|
|
15
|
-
.version("1.0.
|
|
15
|
+
.version("1.0.30");
|
|
16
16
|
// Init command
|
|
17
17
|
program
|
|
18
18
|
.command("init [projectPath]")
|
|
@@ -31,7 +31,7 @@ program
|
|
|
31
31
|
.command("generate")
|
|
32
32
|
.description("Generate Playwright test code from natural language test cases")
|
|
33
33
|
.option("-tc, --tc <testCaseIds>", "Comma-separated test case IDs (e.g., TC-0001,TC-0002)")
|
|
34
|
-
.option("-m, --model <model>", "LLM model to use (
|
|
34
|
+
.option("-m, --model <model>", "LLM model to use (claude, azure-openai or chatgpt)", "claude")
|
|
35
35
|
.option("-o, --output <outputFile>", "Output file name (relative to generated/ folder)")
|
|
36
36
|
.action(async (options) => {
|
|
37
37
|
try {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,0CAAoD;AACpD,kDAAuD;AACvD,kDAA0B;AAE1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;IAC5B,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAA,wBAAiB,EAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CACL,yBAAyB,EACzB,uDAAuD,CACxD;KACA,MAAM,CACL,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,0CAAoD;AACpD,kDAAuD;AACvD,kDAA0B;AAE1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;IAC5B,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAA,wBAAiB,EAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CACL,yBAAyB,EACzB,uDAAuD,CACxD;KACA,MAAM,CACL,qBAAqB,EACrB,oDAAoD,EACpD,QAAQ,CACT;KACA,MAAM,CACL,2BAA2B,EAC3B,kDAAkD,CACnD;KACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,MAAM,IAAA,2BAAgB,EAAC,WAAW,EAAE;YAClC,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,MAAM;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,4BAA4B;AAC5B,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4CZ,CAAC,CACD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8U1E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -27,9 +27,14 @@ async function initializeProject(projectPath) {
|
|
|
27
27
|
}
|
|
28
28
|
// Copy .env.example to project
|
|
29
29
|
const envExampleContent = `# AI Model Configuration
|
|
30
|
-
AI_MODEL=
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
AI_MODEL=claude # Options: claude, azure-openai
|
|
31
|
+
CLAUDE_API_KEY= # Required if using Claude (starts with sk-ant-)
|
|
32
|
+
AZURE_OPENAI_API_KEY= # Required if using Azure OpenAI
|
|
33
|
+
AZURE_OPENAI_ENDPOINT= # e.g. https://<resource>.openai.azure.com
|
|
34
|
+
AZURE_OPENAI_DEPLOYMENT= # e.g. gpt-4o
|
|
35
|
+
AZURE_OPENAI_API_VERSION=2024-02-01 # Optional, defaults to 2024-02-01
|
|
36
|
+
CHATGPT_API_KEY= # Required if using ChatGPT (starts with sk-)
|
|
37
|
+
CHATGPT_MODEL=gpt-4o # Optional, defaults to gpt-4o
|
|
33
38
|
|
|
34
39
|
# Playwright Configuration
|
|
35
40
|
BROWSER=chromium
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
export interface Config {
|
|
2
|
-
aiModel: "
|
|
3
|
-
copilotApiKey?: string;
|
|
2
|
+
aiModel: "claude" | "azure-openai" | "chatgpt";
|
|
4
3
|
claudeApiKey?: string;
|
|
4
|
+
azureOpenAIApiKey?: string;
|
|
5
|
+
azureOpenAIEndpoint?: string;
|
|
6
|
+
azureOpenAIDeployment?: string;
|
|
7
|
+
azureOpenAIApiVersion?: string;
|
|
8
|
+
chatGPTApiKey?: string;
|
|
9
|
+
chatGPTModel?: string;
|
|
5
10
|
browser: "chromium" | "firefox" | "webkit";
|
|
6
11
|
headless: boolean;
|
|
7
12
|
baseUrl: string;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;IAoBlB,SAAS,IAAI,MAAM;IAInB,cAAc,IAAI,OAAO;IAkBzB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI3C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAG5C;;AAED,wBAA2C"}
|
package/dist/config.js
CHANGED
|
@@ -21,9 +21,14 @@ class ConfigManager {
|
|
|
21
21
|
}
|
|
22
22
|
loadConfig() {
|
|
23
23
|
return {
|
|
24
|
-
aiModel: process.env.AI_MODEL || "
|
|
25
|
-
copilotApiKey: process.env.COPILOT_API_KEY,
|
|
24
|
+
aiModel: process.env.AI_MODEL || "claude",
|
|
26
25
|
claudeApiKey: process.env.CLAUDE_API_KEY,
|
|
26
|
+
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
|
|
27
|
+
azureOpenAIEndpoint: process.env.AZURE_OPENAI_ENDPOINT,
|
|
28
|
+
azureOpenAIDeployment: process.env.AZURE_OPENAI_DEPLOYMENT,
|
|
29
|
+
azureOpenAIApiVersion: process.env.AZURE_OPENAI_API_VERSION || "2024-02-01",
|
|
30
|
+
chatGPTApiKey: process.env.CHATGPT_API_KEY,
|
|
31
|
+
chatGPTModel: process.env.CHATGPT_MODEL || "gpt-4o",
|
|
27
32
|
browser: process.env.BROWSER ||
|
|
28
33
|
"chromium",
|
|
29
34
|
headless: process.env.HEADLESS !== "false",
|
|
@@ -36,12 +41,19 @@ class ConfigManager {
|
|
|
36
41
|
return this.config;
|
|
37
42
|
}
|
|
38
43
|
validateConfig() {
|
|
39
|
-
const { aiModel,
|
|
40
|
-
if (aiModel === "
|
|
41
|
-
|
|
44
|
+
const { aiModel, claudeApiKey, azureOpenAIApiKey, azureOpenAIEndpoint, azureOpenAIDeployment } = this.config;
|
|
45
|
+
if (aiModel === "azure-openai") {
|
|
46
|
+
if (!azureOpenAIApiKey || !azureOpenAIEndpoint || !azureOpenAIDeployment) {
|
|
47
|
+
throw new Error("AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT and AZURE_OPENAI_DEPLOYMENT are required when using Azure OpenAI");
|
|
48
|
+
}
|
|
42
49
|
}
|
|
43
|
-
if (aiModel === "
|
|
44
|
-
|
|
50
|
+
else if (aiModel === "chatgpt") {
|
|
51
|
+
if (!this.config.chatGPTApiKey) {
|
|
52
|
+
throw new Error("CHATGPT_API_KEY is required when using ChatGPT");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (!claudeApiKey) {
|
|
56
|
+
throw new Error("CLAUDE_API_KEY is required when using Claude");
|
|
45
57
|
}
|
|
46
58
|
return true;
|
|
47
59
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,gDAAwB;AACxB,4CAAoB;AAEpB,6BAA6B;AAC7B,gBAAM,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,gDAAwB;AACxB,4CAAoB;AAEpB,6BAA6B;AAC7B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAkBhB,MAAa,aAAa;IAIxB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,OAAO,EAAG,OAAO,CAAC,GAAG,CAAC,QAAkD,IAAI,QAAQ;YACpF,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;YACxC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACnD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACtD,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YAC1D,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,YAAY;YAC3E,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YAC1C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ;YACnD,OAAO,EACJ,OAAO,CAAC,GAAG,CAAC,OAA6C;gBAC1D,UAAU;YACZ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO;YAC1C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB;YACxD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,cAAc;QACZ,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE7G,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,IAAI,CAAC,mBAAmB,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACzE,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,OAAO,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAhED,sCAgEC;AAED,kBAAe,aAAa,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LLMProvider, LLMPrompt, GeneratedCode } from "./provider";
|
|
2
|
+
export declare class AzureOpenAIProvider extends LLMProvider {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private endpoint;
|
|
5
|
+
private deploymentName;
|
|
6
|
+
private apiVersion;
|
|
7
|
+
constructor(apiKey: string, endpoint: string, deploymentName: string, apiVersion?: string);
|
|
8
|
+
private get url();
|
|
9
|
+
validateConnection(): Promise<boolean>;
|
|
10
|
+
generateTestCode(prompt: LLMPrompt): Promise<GeneratedCode>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=azure-openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.d.ts","sourceRoot":"","sources":["../../src/llm/azure-openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,SAAe;IAW/F,OAAO,KAAK,GAAG,GAEd;IAEK,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IActC,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;CA+BlE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
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.AzureOpenAIProvider = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const provider_1 = require("./provider");
|
|
9
|
+
class AzureOpenAIProvider extends provider_1.LLMProvider {
|
|
10
|
+
constructor(apiKey, endpoint, deploymentName, apiVersion = "2024-02-01") {
|
|
11
|
+
super();
|
|
12
|
+
if (!apiKey)
|
|
13
|
+
throw new Error("Azure OpenAI API key is required");
|
|
14
|
+
if (!endpoint)
|
|
15
|
+
throw new Error("Azure OpenAI endpoint is required");
|
|
16
|
+
if (!deploymentName)
|
|
17
|
+
throw new Error("Azure OpenAI deployment name is required");
|
|
18
|
+
this.apiKey = apiKey;
|
|
19
|
+
this.endpoint = endpoint.replace(/\/$/, "");
|
|
20
|
+
this.deploymentName = deploymentName;
|
|
21
|
+
this.apiVersion = apiVersion;
|
|
22
|
+
}
|
|
23
|
+
get url() {
|
|
24
|
+
return `${this.endpoint}/openai/deployments/${this.deploymentName}/chat/completions?api-version=${this.apiVersion}`;
|
|
25
|
+
}
|
|
26
|
+
async validateConnection() {
|
|
27
|
+
try {
|
|
28
|
+
const response = await axios_1.default.post(this.url, { messages: [{ role: "user", content: "test" }], max_tokens: 10 }, { headers: { "api-key": this.apiKey, "Content-Type": "application/json" }, timeout: 5000 });
|
|
29
|
+
return response.status === 200;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error("Azure OpenAI connection validation failed:", error.response?.data || error.message);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async generateTestCode(prompt) {
|
|
37
|
+
try {
|
|
38
|
+
const response = await axios_1.default.post(this.url, {
|
|
39
|
+
messages: [{ role: "user", content: this.buildPrompt(prompt) }],
|
|
40
|
+
max_tokens: 2000,
|
|
41
|
+
temperature: 0.2,
|
|
42
|
+
}, {
|
|
43
|
+
headers: { "api-key": this.apiKey, "Content-Type": "application/json" },
|
|
44
|
+
timeout: 30000,
|
|
45
|
+
});
|
|
46
|
+
const generatedCode = response.data.choices?.[0]?.message?.content || "";
|
|
47
|
+
if (!generatedCode.trim())
|
|
48
|
+
throw new Error("Empty response from Azure OpenAI");
|
|
49
|
+
return {
|
|
50
|
+
code: generatedCode,
|
|
51
|
+
timestamp: new Date(),
|
|
52
|
+
model: "azure-openai",
|
|
53
|
+
testCaseId: prompt.testCaseId,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const errorMessage = error.response
|
|
58
|
+
? `HTTP ${error.response.status}: ${error.response.data?.error?.message || error.response.data}`
|
|
59
|
+
: error.message;
|
|
60
|
+
throw new Error(`Failed to generate code with Azure OpenAI: ${errorMessage}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AzureOpenAIProvider = AzureOpenAIProvider;
|
|
65
|
+
//# sourceMappingURL=azure-openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../src/llm/azure-openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LLMProvider, LLMPrompt, GeneratedCode } from "./provider";
|
|
2
|
+
export declare class ChatGPTProvider extends LLMProvider {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private model;
|
|
5
|
+
private baseUrl;
|
|
6
|
+
constructor(apiKey: string, model?: string);
|
|
7
|
+
validateConnection(): Promise<boolean>;
|
|
8
|
+
generateTestCode(prompt: LLMPrompt): Promise<GeneratedCode>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=chatgpt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.d.ts","sourceRoot":"","sources":["../../src/llm/chatgpt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAgD;gBAEnD,MAAM,EAAE,MAAM,EAAE,KAAK,SAAW;IAOtC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IActC,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;CAgClE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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.ChatGPTProvider = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const provider_1 = require("./provider");
|
|
9
|
+
class ChatGPTProvider extends provider_1.LLMProvider {
|
|
10
|
+
constructor(apiKey, model = "gpt-4o") {
|
|
11
|
+
super();
|
|
12
|
+
this.baseUrl = "https://api.openai.com/v1/chat/completions";
|
|
13
|
+
if (!apiKey)
|
|
14
|
+
throw new Error("ChatGPT API key is required");
|
|
15
|
+
this.apiKey = apiKey;
|
|
16
|
+
this.model = model;
|
|
17
|
+
}
|
|
18
|
+
async validateConnection() {
|
|
19
|
+
try {
|
|
20
|
+
const response = await axios_1.default.post(this.baseUrl, { model: this.model, messages: [{ role: "user", content: "test" }], max_tokens: 10 }, { headers: { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" }, timeout: 5000 });
|
|
21
|
+
return response.status === 200;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error("ChatGPT connection validation failed:", error.response?.data || error.message);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async generateTestCode(prompt) {
|
|
29
|
+
try {
|
|
30
|
+
const response = await axios_1.default.post(this.baseUrl, {
|
|
31
|
+
model: this.model,
|
|
32
|
+
messages: [{ role: "user", content: this.buildPrompt(prompt) }],
|
|
33
|
+
max_tokens: 2000,
|
|
34
|
+
temperature: 0.2,
|
|
35
|
+
}, {
|
|
36
|
+
headers: { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" },
|
|
37
|
+
timeout: 30000,
|
|
38
|
+
});
|
|
39
|
+
const generatedCode = response.data.choices?.[0]?.message?.content || "";
|
|
40
|
+
if (!generatedCode.trim())
|
|
41
|
+
throw new Error("Empty response from ChatGPT");
|
|
42
|
+
return {
|
|
43
|
+
code: generatedCode,
|
|
44
|
+
timestamp: new Date(),
|
|
45
|
+
model: "chatgpt",
|
|
46
|
+
testCaseId: prompt.testCaseId,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const errorMessage = error.response
|
|
51
|
+
? `HTTP ${error.response.status}: ${error.response.data?.error?.message || error.response.data}`
|
|
52
|
+
: error.message;
|
|
53
|
+
throw new Error(`Failed to generate code with ChatGPT: ${errorMessage}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.ChatGPTProvider = ChatGPTProvider;
|
|
58
|
+
//# sourceMappingURL=chatgpt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../src/llm/chatgpt.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,yCAAmE;AAEnE,MAAa,eAAgB,SAAQ,sBAAW;IAK9C,YAAY,MAAc,EAAE,KAAK,GAAG,QAAQ;QAC1C,KAAK,EAAE,CAAC;QAHF,YAAO,GAAG,4CAA4C,CAAC;QAI7D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EACpF,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC3G,CAAC;YACF,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAiB;QACtC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/D,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,GAAG;aACjB,EACD;gBACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBACvF,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAE1E,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ;gBACjC,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAChG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,YAAY,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF;AA1DD,0CA0DC"}
|
package/dist/llm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC,qBAAa,UAAU;IACrB,MAAM,CAAC,cAAc,IAAI,WAAW;CAkBrC;AAED,eAAe,UAAU,CAAC"}
|
package/dist/llm/index.js
CHANGED
|
@@ -4,25 +4,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.LLMFactory = void 0;
|
|
7
|
-
const copilot_1 = require("./copilot");
|
|
8
7
|
const claude_1 = require("./claude");
|
|
8
|
+
const azure_openai_1 = require("./azure-openai");
|
|
9
|
+
const chatgpt_1 = require("./chatgpt");
|
|
9
10
|
const config_1 = __importDefault(require("../config"));
|
|
10
11
|
class LLMFactory {
|
|
11
12
|
static createProvider() {
|
|
12
13
|
const config = config_1.default.getConfig();
|
|
13
|
-
if (config.aiModel === "
|
|
14
|
-
if (!config.
|
|
15
|
-
throw new Error("
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
if (config.aiModel === "azure-openai") {
|
|
15
|
+
if (!config.azureOpenAIApiKey)
|
|
16
|
+
throw new Error("Azure OpenAI API key not configured. Set AZURE_OPENAI_API_KEY in .env");
|
|
17
|
+
if (!config.azureOpenAIEndpoint)
|
|
18
|
+
throw new Error("Azure OpenAI endpoint not configured. Set AZURE_OPENAI_ENDPOINT in .env");
|
|
19
|
+
if (!config.azureOpenAIDeployment)
|
|
20
|
+
throw new Error("Azure OpenAI deployment not configured. Set AZURE_OPENAI_DEPLOYMENT in .env");
|
|
21
|
+
return new azure_openai_1.AzureOpenAIProvider(config.azureOpenAIApiKey, config.azureOpenAIEndpoint, config.azureOpenAIDeployment, config.azureOpenAIApiVersion);
|
|
18
22
|
}
|
|
19
|
-
if (config.aiModel === "
|
|
20
|
-
if (!config.
|
|
21
|
-
throw new Error("
|
|
22
|
-
|
|
23
|
-
return new claude_1.ClaudeProvider(config.claudeApiKey);
|
|
23
|
+
if (config.aiModel === "chatgpt") {
|
|
24
|
+
if (!config.chatGPTApiKey)
|
|
25
|
+
throw new Error("ChatGPT API key not configured. Set CHATGPT_API_KEY in .env");
|
|
26
|
+
return new chatgpt_1.ChatGPTProvider(config.chatGPTApiKey, config.chatGPTModel);
|
|
24
27
|
}
|
|
25
|
-
|
|
28
|
+
if (!config.claudeApiKey)
|
|
29
|
+
throw new Error("Claude API key not configured. Set CLAUDE_API_KEY in .env");
|
|
30
|
+
return new claude_1.ClaudeProvider(config.claudeApiKey);
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
exports.LLMFactory = LLMFactory;
|
package/dist/llm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";;;;;;AACA,uCAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";;;;;;AACA,qCAA0C;AAC1C,iDAAqD;AACrD,uCAA4C;AAC5C,uDAAsC;AAEtC,MAAa,UAAU;IACrB,MAAM,CAAC,cAAc;QACnB,MAAM,MAAM,GAAG,gBAAa,CAAC,SAAS,EAAE,CAAC;QAEzC,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACxH,IAAI,CAAC,MAAM,CAAC,mBAAmB;gBAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;YAC5H,IAAI,CAAC,MAAM,CAAC,qBAAqB;gBAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAClI,OAAO,IAAI,kCAAmB,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnJ,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC1G,OAAO,IAAI,yBAAe,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACvG,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;CACF;AAnBD,gCAmBC;AAED,kBAAe,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhiweiliu/playwright-generator",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.30",
|
|
4
4
|
"description": "Generate Playwright test cases from natural language using LLM",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|
|
36
|
-
"url": "https://github.com/
|
|
36
|
+
"url": "https://github.com/zhiweil/playwright-generator.git"
|
|
37
37
|
},
|
|
38
|
-
"homepage": "https://github.com/
|
|
38
|
+
"homepage": "https://github.com/zhiweil/playwright-generator#readme",
|
|
39
39
|
"bugs": {
|
|
40
|
-
"url": "https://github.com/
|
|
40
|
+
"url": "https://github.com/zhiweil/playwright-generator/issues"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"axios": "^1.6.0",
|