lexxit-automation-framework 2.0.20 → 3.0.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 +246 -57
- package/npmignore +8 -0
- package/package.json +32 -1
- package/public/dashboard.html +591 -0
- package/src/actions/baseHandler.ts +351 -0
- package/src/actions/browserManager.ts +432 -0
- package/src/actions/checkboxHandler.ts +276 -0
- package/src/actions/clickHandler.ts +513 -0
- package/src/actions/customcodehandler.ts +251 -0
- package/src/actions/dropdownHandler.ts +501 -0
- package/src/actions/radiobuttonHandler.ts +286 -0
- package/src/actions/textHandler.ts +498 -0
- package/src/api/server.ts +210 -0
- package/src/config.ts +7 -0
- package/src/executor/functionMap.ts +153 -0
- package/src/executor/mapping.ts +70 -0
- package/src/executor/scriptExecutor.ts +162 -0
- package/src/executor/stepExecutor.ts +289 -0
- package/src/runner/testRunner.ts +78 -0
- package/src/sse/sseManager.ts +130 -0
- package/src/store/executionStore.ts +152 -0
- package/src/store/testDataStore.ts +46 -0
- package/src/types/types.ts +159 -0
- package/src/utils/healingService.ts +210 -0
- package/src/utils/locatorService.ts +73 -0
- package/src/utils/logger.ts +27 -0
- package/src/utils/metadataService.ts +137 -0
- package/src/utils/waitConditions.ts +141 -0
- package/src/validator/validator.ts +140 -0
- package/tsconfig.json +16 -0
- package/bin/lexxit-automation-framework.js +0 -224
- package/dist-obf/app.js +0 -1
- package/dist-obf/controllers/controller.js +0 -1
- package/dist-obf/core/BrowserManager.js +0 -1
- package/dist-obf/core/PlaywrightEngine.js +0 -1
- package/dist-obf/core/ScreenshotManager.js +0 -1
- package/dist-obf/core/TestData.js +0 -1
- package/dist-obf/core/TestExecutor.js +0 -1
- package/dist-obf/core/handlers/AllHandlers.js +0 -1
- package/dist-obf/core/handlers/BaseHandler.js +0 -1
- package/dist-obf/core/handlers/ClickHandler.js +0 -1
- package/dist-obf/core/handlers/CustomCodeHandler.js +0 -1
- package/dist-obf/core/handlers/DropdownHandler.js +0 -1
- package/dist-obf/core/handlers/InputHandler.js +0 -1
- package/dist-obf/core/registry/ActionRegistry.js +0 -1
- package/dist-obf/installer/frameworkLauncher.js +0 -1
- package/dist-obf/public/dashboard.html +0 -591
- package/dist-obf/public/execution.html +0 -510
- package/dist-obf/public/queue-monitor.html +0 -408
- package/dist-obf/queue/ExecutionQueue.js +0 -1
- package/dist-obf/routes/api.routes.js +0 -1
- package/dist-obf/server.js +0 -1
- package/dist-obf/types/types.js +0 -1
- package/dist-obf/utils/chromefinder.js +0 -1
- package/dist-obf/utils/elementHighlight.js +0 -1
- package/dist-obf/utils/locatorHelper.js +0 -1
- package/dist-obf/utils/logger.js +0 -1
- package/dist-obf/utils/response.js +0 -1
- package/dist-obf/utils/responseFormatter.js +0 -1
- package/dist-obf/utils/sseManager.js +0 -1
- package/scripts/postinstall.js +0 -52
package/README.md
CHANGED
|
@@ -1,93 +1,282 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Playwright Test Execution Framework
|
|
2
2
|
|
|
3
|
+
A Node.js + TypeScript framework that executes Playwright-based test sets defined entirely in JSON, exposed through a REST API, with a live polling dashboard to monitor execution in real time.
|
|
3
4
|
|
|
5
|
+
## Tech Stack
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
- Node.js 22, TypeScript
|
|
8
|
+
- Express.js (REST API)
|
|
9
|
+
- Playwright (Chromium, Firefox, Edge)
|
|
10
|
+
- In-memory execution store (no database)
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
## Setup
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
```bash
|
|
15
|
+
npm install
|
|
16
|
+
npx playwright install
|
|
17
|
+
npm run dev
|
|
18
|
+
```
|
|
10
19
|
|
|
11
|
-
|
|
20
|
+
The server starts on port `5501`. On startup, the console prints the API URL and a list of available endpoints.
|
|
12
21
|
|
|
13
|
-
|
|
14
|
-
* [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
|
|
22
|
+
## Project Structure
|
|
15
23
|
|
|
16
24
|
```
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
new_Framework/
|
|
26
|
+
├── src/
|
|
27
|
+
│ ├── api/
|
|
28
|
+
│ │ └── server.ts # Express server, all routes
|
|
29
|
+
│ ├── runner/
|
|
30
|
+
│ │ └── testRunner.ts # Orchestrates a full test set (sequential/parallel)
|
|
31
|
+
│ ├── executor/
|
|
32
|
+
│ │ ├── scriptExecutor.ts # Runs one test script (all its steps)
|
|
33
|
+
│ │ ├── stepExecutor.ts # Runs one step, routes to the correct handler
|
|
34
|
+
│ │ ├── mapping.ts # Parses step_script strings into function + args
|
|
35
|
+
│ │ └── functionMap.ts # Maps step_script function names to handler methods
|
|
36
|
+
│ ├── actions/
|
|
37
|
+
│ │ ├── browserManager.ts # openBrowser, closeBrowser, navigation, video
|
|
38
|
+
│ │ ├── textHandler.ts # enterText, getText, verifyText, etc.
|
|
39
|
+
│ │ ├── clickHandler.ts # click, doubleClick, rightClick, hover, etc.
|
|
40
|
+
│ │ ├── checkboxHandler.ts # check, uncheck, toggle, verifyChecked, etc.
|
|
41
|
+
│ │ ├── radiobuttonHandler.ts# select, selectByValue, selectByLabel, etc.
|
|
42
|
+
│ │ └── dropdownHandler.ts # native/combobox/multiselect dropdown actions
|
|
43
|
+
│ ├── utils/
|
|
44
|
+
│ │ ├── locatorService.ts # Resolves an element from a list of xpath locators
|
|
45
|
+
│ │ └── waitConditions.ts # waitForVisible, waitForTextChange, etc.
|
|
46
|
+
│ ├── validator/
|
|
47
|
+
│ │ └── validator.ts # Validates testset/testscript/step payload shapes
|
|
48
|
+
│ ├── store/
|
|
49
|
+
│ │ └── executionStore.ts # In-memory live execution state, keyed by execution_id
|
|
50
|
+
│ └── types/
|
|
51
|
+
│ └── types.ts # All shared TypeScript interfaces
|
|
52
|
+
├── public/
|
|
53
|
+
│ └── dashboard.html # Live polling dashboard UI
|
|
54
|
+
├── videos/ # Saved test recordings (when video_enabled)
|
|
55
|
+
├── tsconfig.json
|
|
56
|
+
└── package.json
|
|
21
57
|
```
|
|
22
58
|
|
|
23
|
-
##
|
|
59
|
+
## How a Request Flows
|
|
60
|
+
|
|
61
|
+
1. `POST /execute` receives the full test set JSON.
|
|
62
|
+
2. The payload is validated in three layers: testset, testscript, and step.
|
|
63
|
+
3. If valid, an `execution_id` (UUID) is generated and the response is returned **immediately** — the test set runs in the background.
|
|
64
|
+
4. If `open_dashboard: true`, the dashboard auto-opens in your default browser (only once per server session).
|
|
65
|
+
5. The dashboard polls the server and shows live step-by-step progress.
|
|
66
|
+
6. Once finished, the full result (same shape as a traditional synchronous response) becomes available under `final_result`.
|
|
67
|
+
|
|
68
|
+
## API Endpoints
|
|
69
|
+
|
|
70
|
+
| Method | Path | Description |
|
|
71
|
+
|--------|------|-------------|
|
|
72
|
+
| GET | `/` | Lists all available endpoints |
|
|
73
|
+
| POST | `/execute` | Submit a test set for execution |
|
|
74
|
+
| GET | `/status/:execution_id` | Live status + final result of one execution |
|
|
75
|
+
| GET | `/executions` | List all executions, latest first |
|
|
76
|
+
| GET | `/dashboard` | Live dashboard UI |
|
|
77
|
+
|
|
78
|
+
### POST /execute
|
|
24
79
|
|
|
25
|
-
|
|
80
|
+
Request body is the full test set JSON (see Request Format below).
|
|
26
81
|
|
|
27
|
-
|
|
82
|
+
Response (returned immediately, before execution finishes):
|
|
28
83
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"status": "started",
|
|
87
|
+
"execution_id": "a1b2c3d4-...",
|
|
88
|
+
"dashboard_url": "http://localhost:5501/dashboard?execution_id=a1b2c3d4-...",
|
|
89
|
+
"result_url": "http://localhost:5501/status/a1b2c3d4-..."
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
If validation fails, responds with `400` and an `errors` array describing every problem found, tagged by level (`testset`, `testscript`, or `step`).
|
|
94
|
+
|
|
95
|
+
### GET /status/:execution_id
|
|
96
|
+
|
|
97
|
+
Returns the live execution state. While running, `scripts[].steps[]` update in real time (`pending` → `running` → `pass`/`fail`/`skip`). Once finished, `final_result` is populated with the complete original-style response (status, full step results, summary).
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"execution_id": "a1b2c3d4-...",
|
|
102
|
+
"test_set_name": "E2E Smoke Suite",
|
|
103
|
+
"status": "pass",
|
|
104
|
+
"start_time": "2026-06-17 10:00:00",
|
|
105
|
+
"end_time": "2026-06-17 10:00:42",
|
|
106
|
+
"scripts": [
|
|
107
|
+
{
|
|
108
|
+
"test_script_uid": "d42bbbd5-...",
|
|
109
|
+
"test_case_name": "asdfasdf444",
|
|
110
|
+
"status": "pass",
|
|
111
|
+
"steps": [
|
|
112
|
+
{
|
|
113
|
+
"step_name": "Enter 'sdf' into 'First name'",
|
|
114
|
+
"status": "pass",
|
|
115
|
+
"expected_result": "'sdf' entered into 'First name' successfully",
|
|
116
|
+
"comments": "'sdf' entered into 'First name' successfully",
|
|
117
|
+
"duration": "0 seconds"
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"final_result": {
|
|
123
|
+
"status": "pass",
|
|
124
|
+
"results": [ /* ... full TestScriptResult objects ... */ ],
|
|
125
|
+
"summary": {
|
|
126
|
+
"test_set_name": "E2E Smoke Suite",
|
|
127
|
+
"total_scripts": 1,
|
|
128
|
+
"passed": 1,
|
|
129
|
+
"failed": 0,
|
|
130
|
+
"duration": "12 seconds",
|
|
131
|
+
"start_time": "2026-06-17 10:00:00",
|
|
132
|
+
"end_time": "2026-06-17 10:00:12"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Request Format
|
|
139
|
+
|
|
140
|
+
A test set request has three nested levels: testset, testscript, and step.
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"test_set_name": "E2E Smoke Suite",
|
|
145
|
+
"open_dashboard": true,
|
|
146
|
+
"parallel": false,
|
|
147
|
+
"stop_on_failure": true,
|
|
148
|
+
"video_enabled": true,
|
|
149
|
+
"exec_mode": { "mode": "medium", "delay_ms": 1000 },
|
|
150
|
+
"scripts": [
|
|
151
|
+
{
|
|
152
|
+
"test_script_uid": "d42bbbd5-f50f-4b71-a119-ef7294eab861",
|
|
153
|
+
"test_case_name": "asdfasdf444",
|
|
154
|
+
"voice_enabled": false,
|
|
155
|
+
"app_id": "1b040097-495d-4428-84d1-bd31ecc97e93",
|
|
156
|
+
"browser": "edge",
|
|
157
|
+
"headless": false,
|
|
158
|
+
"screenshot_mode": "on_failure",
|
|
159
|
+
"stop_on_failure": true,
|
|
160
|
+
"steps": [
|
|
161
|
+
{
|
|
162
|
+
"step_name": "Open edge",
|
|
163
|
+
"step_script": "tSetup.openBrowser('edge')",
|
|
164
|
+
"label": ""
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"step_name": "Navigate to URL",
|
|
168
|
+
"step_script": "tSetup.navigateToURL('https://example.com')",
|
|
169
|
+
"label": ""
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"label": "First name",
|
|
173
|
+
"locators": [
|
|
174
|
+
"//input[@id='fname']",
|
|
175
|
+
"//input[@id='fname' and @name='fname']"
|
|
176
|
+
],
|
|
177
|
+
"obj_uid": "066d39cd-b378-40c0-aa7f-e80e6c55a530",
|
|
178
|
+
"page_uid": null,
|
|
179
|
+
"step_name": "Enter 'sdf' into 'First name'",
|
|
180
|
+
"step_script": "tSetup.enterText('xpath', '//input[@id=\"fname\"]', 'sdf')",
|
|
181
|
+
"value": "sdf"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"step_name": "Close Browser",
|
|
185
|
+
"step_script": "tSetup.closeBrowser()",
|
|
186
|
+
"label": ""
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
```
|
|
34
193
|
|
|
35
|
-
|
|
194
|
+
### Testset-level fields
|
|
36
195
|
|
|
37
|
-
|
|
196
|
+
| Field | Type | Description |
|
|
197
|
+
|-------|------|--------------|
|
|
198
|
+
| `test_set_name` | string | Display name for the test set |
|
|
199
|
+
| `open_dashboard` | boolean | Auto-opens the dashboard in your browser when execution starts |
|
|
200
|
+
| `parallel` | boolean | Run scripts in parallel (max 10 concurrent) instead of sequentially |
|
|
201
|
+
| `stop_on_failure` | boolean | Reserved for testset-level stop behavior |
|
|
202
|
+
| `video_enabled` | boolean | Records a `.webm` video per script (forced `false` in `fast` exec mode) |
|
|
203
|
+
| `exec_mode` | object, optional | `{ mode: 'fast' \| 'medium' \| 'slow', delay_ms?: number }`. Defaults to `fast` if omitted |
|
|
204
|
+
| `scripts` | array | One or more test scripts |
|
|
38
205
|
|
|
39
|
-
|
|
40
|
-
* [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/user/application_security/sast/)
|
|
41
|
-
* [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/topics/autodevops/requirements/)
|
|
42
|
-
* [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/user/clusters/agent/)
|
|
43
|
-
* [Set up protected environments](https://docs.gitlab.com/ci/environments/protected_environments/)
|
|
206
|
+
### Testscript-level fields
|
|
44
207
|
|
|
45
|
-
|
|
208
|
+
| Field | Type | Description |
|
|
209
|
+
|-------|------|--------------|
|
|
210
|
+
| `test_script_uid` | string | Unique ID for this script |
|
|
211
|
+
| `test_case_name` | string | Display name |
|
|
212
|
+
| `app_id` | string | Application identifier |
|
|
213
|
+
| `browser` | `chromium` \| `firefox` \| `edge` | Browser to launch |
|
|
214
|
+
| `headless` | boolean | Run headless or headed |
|
|
215
|
+
| `screenshot_mode` | `on_failure` \| `always` \| `never` | Reserved for screenshot behavior |
|
|
216
|
+
| `stop_on_failure` | boolean | Skip remaining steps in this script once one fails |
|
|
217
|
+
| `steps` | array | Ordered list of steps to execute |
|
|
46
218
|
|
|
47
|
-
|
|
219
|
+
### Step-level fields
|
|
48
220
|
|
|
49
|
-
|
|
221
|
+
| Field | Type | Description |
|
|
222
|
+
|-------|------|--------------|
|
|
223
|
+
| `step_name` | string | Display name for the step |
|
|
224
|
+
| `step_script` | string | The action to run, e.g. `tSetup.enterText('id','fname','mahesh')` |
|
|
225
|
+
| `label` | string | Human-readable name of the target element, used in result messages |
|
|
226
|
+
| `locators` | string[] | List of xpath locators tried together (first visible match wins) |
|
|
227
|
+
| `obj_uid`, `page_uid` | string \| null | Optional metadata passed through to results |
|
|
50
228
|
|
|
51
|
-
##
|
|
229
|
+
## Execution Modes
|
|
52
230
|
|
|
53
|
-
|
|
231
|
+
| Mode | Behavior |
|
|
232
|
+
|------|----------|
|
|
233
|
+
| `fast` (default) | No delay between steps. `video_enabled` is forced to `false` regardless of the request value |
|
|
234
|
+
| `medium` | Waits `delay_ms` (default 1000ms if not provided) between steps. Respects `video_enabled` |
|
|
235
|
+
| `slow` | Waits `delay_ms` (default 3000ms if not provided) between steps. Respects `video_enabled` |
|
|
54
236
|
|
|
55
|
-
|
|
56
|
-
Choose a self-explaining name for your project.
|
|
237
|
+
`delay_ms` can be passed explicitly inside `exec_mode` to override the defaults for `medium`/`slow`.
|
|
57
238
|
|
|
58
|
-
##
|
|
59
|
-
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
|
|
239
|
+
## Step Script Reference
|
|
60
240
|
|
|
61
|
-
|
|
62
|
-
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
|
|
241
|
+
Steps are written as `tSetup.<functionName>(args...)`. The framework parses this string and routes it to the matching handler. Currently mapped functions:
|
|
63
242
|
|
|
64
|
-
|
|
65
|
-
|
|
243
|
+
| Function | Handler |
|
|
244
|
+
|----------|---------|
|
|
245
|
+
| `openBrowser`, `closeBrowser`, `navigateToURL`, `navigateBack`, `navigateForward`, `refreshPage`, `getTitle`, `getCurrentURL` | Browser Manager |
|
|
246
|
+
| `enterText`, `typeText`, `clearText`, `getInputValue`, `appendText`, `setInputValue`, `verifyText`, `verifyValue`, `getText` | Text Handler |
|
|
247
|
+
| `clickElement`, `doubleClick`, `rightClick`, `hover` | Click Handler |
|
|
248
|
+
| `check_checkbox`, `uncheck_checkbox`, `verifyChecked`, `verifyUnchecked`, `verifyEnabled`, `verifyDisabled`, `verifyVisible`, `verifyHidden` | Checkbox Handler |
|
|
249
|
+
| `selectRadioButton` | Radiobutton Handler |
|
|
250
|
+
| `selectDropdown` | Dropdown Handler |
|
|
66
251
|
|
|
67
|
-
|
|
68
|
-
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
|
|
252
|
+
Functions not yet mapped (e.g. `dragAndDrop`, `file_upload`, `enterTextInFrame`, `verifyElementCount`, `verifyAttribute`, `acceptAlert`, `dismissAlert`, `getAlertText`, `verifyTitle`, `verifyURL`, `clickByJS`) are documented as comments in `functionMap.ts` for future implementation.
|
|
69
253
|
|
|
70
|
-
##
|
|
71
|
-
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
|
|
254
|
+
## Locator Resolution
|
|
72
255
|
|
|
73
|
-
|
|
74
|
-
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
|
|
256
|
+
Each step can provide multiple xpath locators as fallbacks. They're combined into a single OR-expression and the first visible, attached match is used. If the first locator in the list wasn't the one that matched, the step's `comments` field notes which position and xpath actually resolved — useful for cleaning up brittle locators over time.
|
|
75
257
|
|
|
76
|
-
##
|
|
77
|
-
If you have ideas for releases in the future, it is a good idea to list them in the README.
|
|
258
|
+
## Live Dashboard
|
|
78
259
|
|
|
79
|
-
|
|
80
|
-
State if you are open to contributions and what your requirements are for accepting them.
|
|
260
|
+
Visit `http://localhost:5501/dashboard` (or let it auto-open via `open_dashboard: true`).
|
|
81
261
|
|
|
82
|
-
|
|
262
|
+
- Left navigation lists all executions, most recent at the top.
|
|
263
|
+
- Selecting an execution shows each script and its steps.
|
|
264
|
+
- Steps show a spinner while running, then a pass/fail/skip badge.
|
|
265
|
+
- Click any step row to expand and see its expected result and comments.
|
|
266
|
+
- The dashboard polls `/executions` every 3 seconds and `/status/:execution_id` every 2 seconds — no manual refresh needed.
|
|
83
267
|
|
|
84
|
-
|
|
268
|
+
## Step Statuses
|
|
85
269
|
|
|
86
|
-
|
|
87
|
-
|
|
270
|
+
| Status | Meaning |
|
|
271
|
+
|--------|---------|
|
|
272
|
+
| `pending` | Not yet started (dashboard-only state) |
|
|
273
|
+
| `running` | Currently executing (dashboard-only state) |
|
|
274
|
+
| `pass` | Completed successfully |
|
|
275
|
+
| `fail` | Failed |
|
|
276
|
+
| `skip` | Skipped because an earlier step in the same script failed (when `stop_on_failure: true`) |
|
|
88
277
|
|
|
89
|
-
##
|
|
90
|
-
For open source projects, say how it is licensed.
|
|
278
|
+
## Notes
|
|
91
279
|
|
|
92
|
-
|
|
93
|
-
|
|
280
|
+
- Videos are saved to the `videos/` folder, named `<test_script_uid>_<timestamp>.webm`.
|
|
281
|
+
- Parallel execution runs scripts in batches of up to 10 concurrently; batches are processed one after another.
|
|
282
|
+
- The execution store is in-memory only — restarting the server clears all execution history.
|
package/npmignore
ADDED
package/package.json
CHANGED
|
@@ -1 +1,32 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"name": "lexxit-automation-framework",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Playwright test execution framework with Express API",
|
|
5
|
+
"main": "dist-obf/api/server.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"obfuscate": "javascript-obfuscator dist --output dist-obf --compact true --control-flow-flattening true --dead-code-injection true --string-array true --string-array-encoding base64 --rename-globals true",
|
|
9
|
+
"build:prod": "npm run build && npm run obfuscate",
|
|
10
|
+
"start": "node dist-obf/api/server.js",
|
|
11
|
+
"dev": "ts-node src/api/server.ts"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@playwright/test": "^1.44.0",
|
|
15
|
+
"cors": "^2.8.6",
|
|
16
|
+
"express": "^4.19.2",
|
|
17
|
+
"playwright": "^1.44.0",
|
|
18
|
+
"uuid": "^14.0.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/cors": "^2.8.19",
|
|
22
|
+
"@types/express": "^4.17.21",
|
|
23
|
+
"@types/node": "^22.0.0",
|
|
24
|
+
"@types/uuid": "^10.0.0",
|
|
25
|
+
"javascript-obfuscator": "^4.1.1",
|
|
26
|
+
"ts-node": "^10.9.2",
|
|
27
|
+
"typescript": "^5.4.5"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22.0.0"
|
|
31
|
+
}
|
|
32
|
+
}
|