@testspectra/cli 1.0.69 → 1.1.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/LICENSE.md +48 -0
- package/README.md +36 -270
- package/bin/.testspectra-runner.hash +1 -0
- package/bin/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-DPfv5_EF.js +116 -0
- package/demo-app/assets/index-gIwu2EMV.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/__tests__/cloud-run.test.d.ts +1 -0
- package/dist/commands/__tests__/cloud-run.test.js +93 -0
- package/dist/commands/__tests__/doctor.test.d.ts +1 -0
- package/dist/commands/__tests__/doctor.test.js +39 -0
- package/dist/commands/__tests__/init.test.d.ts +1 -0
- package/dist/commands/__tests__/init.test.js +148 -0
- package/dist/commands/__tests__/license.test.d.ts +1 -0
- package/dist/commands/__tests__/license.test.js +13 -0
- package/dist/commands/__tests__/refactor.test.d.ts +1 -0
- package/dist/commands/__tests__/refactor.test.js +64 -0
- package/dist/commands/__tests__/run-e2e.test.d.ts +1 -0
- package/dist/commands/__tests__/run-e2e.test.js +181 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +197 -0
- package/dist/commands/__tests__/watch.test.d.ts +1 -0
- package/dist/commands/__tests__/watch.test.js +155 -0
- package/dist/commands/add.js +86 -85
- package/dist/commands/cloud-run.d.ts +11 -0
- package/dist/commands/cloud-run.js +118 -0
- package/dist/commands/demo.js +7 -7
- package/dist/commands/devices.d.ts +14 -2
- package/dist/commands/devices.js +44 -34
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.js +43 -264
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +206 -196
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.js +59 -0
- package/dist/commands/license.d.ts +4 -0
- package/dist/commands/license.js +30 -0
- package/dist/commands/refactor.d.ts +8 -0
- package/dist/commands/refactor.js +78 -0
- package/dist/commands/run.d.ts +22 -1
- package/dist/commands/run.js +252 -109
- package/dist/commands/sync-types.d.ts +4 -0
- package/dist/commands/sync-types.js +14 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.js +109 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +47 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -49
- package/dist/config/schema.js +41 -34
- package/dist/generator/__tests__/tsconfig-isolation.test.d.ts +1 -0
- package/dist/generator/__tests__/tsconfig-isolation.test.js +278 -0
- package/dist/generator/__tests__/type-generator.test.d.ts +1 -0
- package/dist/generator/__tests__/type-generator.test.js +386 -0
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.js +2 -0
- package/dist/generator/tsconfig-generator.d.ts +27 -0
- package/dist/generator/tsconfig-generator.js +391 -0
- package/dist/generator/type-generator.d.ts +36 -0
- package/dist/generator/type-generator.js +644 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +126 -47
- package/dist/lifecycle/__tests__/lifecycle-engine.test.d.ts +1 -0
- package/dist/lifecycle/__tests__/lifecycle-engine.test.js +290 -0
- package/dist/lifecycle/hook-discovery.d.ts +24 -0
- package/dist/lifecycle/hook-discovery.js +60 -0
- package/dist/lifecycle/hook-dispatcher.d.ts +34 -0
- package/dist/lifecycle/hook-dispatcher.js +190 -0
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.js +3 -0
- package/dist/lifecycle/parallel-grouping.d.ts +27 -0
- package/dist/lifecycle/parallel-grouping.js +151 -0
- package/dist/mobile/__tests__/android-device-e2e.test.d.ts +1 -0
- package/dist/mobile/__tests__/android-device-e2e.test.js +53 -0
- package/dist/mobile/__tests__/device-pool.test.d.ts +1 -0
- package/dist/mobile/__tests__/device-pool.test.js +97 -0
- package/dist/mobile/device-pool.d.ts +23 -0
- package/dist/mobile/device-pool.js +1 -0
- package/dist/mobile/index.d.ts +1 -0
- package/dist/mobile/index.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.d.ts +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +175 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +25 -0
- package/dist/refactor/refactor-engine.js +255 -0
- package/dist/reporter/__tests__/semantic-formatter.test.d.ts +1 -0
- package/dist/reporter/__tests__/semantic-formatter.test.js +73 -0
- package/dist/reporter/semantic-formatter.d.ts +6 -0
- package/dist/reporter/semantic-formatter.js +191 -0
- package/dist/reporter/summary-view.d.ts +12 -0
- package/dist/reporter/summary-view.js +19 -0
- package/dist/reporter/terminal-stream.d.ts +32 -0
- package/dist/reporter/terminal-stream.js +82 -0
- package/dist/reporter/types.d.ts +2 -0
- package/dist/reporter/types.js +1 -0
- package/dist/runner/bridge.d.ts +10 -5
- package/dist/runner/bridge.js +69 -44
- package/dist/runner/reporter.d.ts +30 -2
- package/dist/runner/reporter.js +419 -13
- package/dist/server/demo.js +43 -44
- package/dist/types/generator.d.ts +1 -17
- package/dist/types/generator.js +1 -443
- package/dist/utils/demo-server.js +38 -35
- package/package.json +20 -12
- package/templates/default/CLAUDE.md +7 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +13 -4
- package/templates/default/page-objects/MatchersPage/mobile.ts +41 -16
- package/templates/default/page-objects/MatchersPage/web.ts +14 -0
- package/templates/default/page-objects/NavigationPage/mobile.ts +10 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +27 -17
- package/templates/default/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +11 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +16 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/default/specs/ApiInterception/suite.md +9 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +7 -1
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +15 -1
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +9 -1
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +9 -1
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +27 -1
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/default/spectra.config.ts +21 -14
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +2 -2
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +2 -0
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +3 -1
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/default/tsconfig.json +3 -1
- package/templates/nx/.nx/workspace-data/d/daemon.log +168 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +7 -5
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/suite.md +9 -0
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/nx/pnpm-lock.yaml +6663 -0
- package/templates/nx/pnpm-workspace.yaml +2 -1
- package/templates/nx/shared/testing/fixtures/apiData.json +24 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +12 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +14 -0
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/nx/shared/testing/project.json +19 -0
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/nx/spectra.config.ts +19 -12
- package/templates/nx/tsconfig.json +3 -1
- package/demo-app/assets/index-DAUlrHTr.css +0 -1
- package/demo-app/assets/index-DN2Kb0A8.js +0 -100
- package/dist/index.cjs +0 -101
- package/dist/plugin.cjs +0 -575
- package/dist/plugin.d.ts +0 -16
- package/dist/plugin.js +0 -184
- package/dist/step/index.d.ts +0 -6
- package/dist/step/index.js +0 -6
- package/dist/step/matchers.d.ts +0 -14
- package/dist/step/matchers.js +0 -114
- package/dist/step/proto.d.ts +0 -46
- package/dist/step/proto.js +0 -114
- package/dist/step/runner/collection.d.ts +0 -13
- package/dist/step/runner/collection.js +0 -51
- package/dist/step/runner/single.d.ts +0 -21
- package/dist/step/runner/single.js +0 -138
- package/dist/step/spectra.d.ts +0 -34
- package/dist/step/spectra.js +0 -156
- package/dist/step/types.d.ts +0 -32
- package/dist/step/types.js +0 -5
- package/templates/default/tsconfig.spectra.android.json +0 -46
- package/templates/default/tsconfig.spectra.ios.json +0 -46
- package/templates/default/tsconfig.spectra.json +0 -22
- package/templates/default/tsconfig.spectra.web.json +0 -53
- package/templates/nx/fixtures/playgroundData.json +0 -7
- package/templates/nx/global-hooks/after/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/after/web.hook.ts +0 -3
- package/templates/nx/global-hooks/before/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/before/web.hook.ts +0 -3
- package/templates/nx/page-objects/MatchersPage/mobile.ts +0 -21
- package/templates/nx/page-objects/MatchersPage/web.ts +0 -23
- package/templates/nx/page-objects/NavigationPage/mobile.ts +0 -5
- package/templates/nx/page-objects/NavigationPage/web.ts +0 -8
- package/templates/nx/page-objects/PlaygroundPage/mobile.ts +0 -26
- package/templates/nx/page-objects/PlaygroundPage/web.ts +0 -29
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +0 -3
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +0 -12
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +0 -5
- package/templates/nx/specs/BrowserContext/suite.md +0 -9
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +0 -6
- package/templates/nx/specs/ContentMatchers/suite.md +0 -9
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +0 -5
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +0 -8
- package/templates/nx/specs/ElementMatchers/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/suite.md +0 -9
- package/templates/nx/specs/Playground/TC-0001-form-controls/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0001-form-controls/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0001-form-controls/web.test.ts +0 -6
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/web.test.ts +0 -6
- package/templates/nx/specs/Playground/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/suite.md +0 -9
- package/templates/nx/support/actions/fillCredentials/mobile.action.ts +0 -4
- package/templates/nx/support/actions/fillCredentials/web.action.ts +0 -4
- package/templates/nx/support/steps/togglePlaygroundStates/mobile.step.ts +0 -3
- package/templates/nx/support/steps/togglePlaygroundStates/step.md +0 -7
- package/templates/nx/support/steps/togglePlaygroundStates/web.step.ts +0 -5
- package/templates/nx/support/steps/verifyPlaygroundState/mobile.step.ts +0 -4
- package/templates/nx/support/steps/verifyPlaygroundState/step.md +0 -7
- package/templates/nx/support/steps/verifyPlaygroundState/web.step.ts +0 -6
- package/templates/nx/tsconfig.spectra.android.json +0 -39
- package/templates/nx/tsconfig.spectra.ios.json +0 -39
- package/templates/nx/tsconfig.spectra.json +0 -25
- package/templates/nx/tsconfig.spectra.shared.json +0 -25
- package/templates/nx/tsconfig.spectra.web.json +0 -45
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { execSync, execFileSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
const PACKAGES = ['@testspectra/cli', '@testspectra/matchers'];
|
|
8
|
+
function getLatestVersion(pkg) {
|
|
9
|
+
try {
|
|
10
|
+
const out = execFileSync('npm', ['view', pkg, 'version', '--json'], {
|
|
11
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
12
|
+
timeout: 10000,
|
|
13
|
+
})
|
|
14
|
+
.toString()
|
|
15
|
+
.trim()
|
|
16
|
+
.replace(/"/g, '');
|
|
17
|
+
return out || null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getCurrentVersion(pkg, cwd) {
|
|
24
|
+
// Walk up to find the installed version
|
|
25
|
+
let cur = path.resolve(cwd);
|
|
26
|
+
while (cur && cur !== path.dirname(cur)) {
|
|
27
|
+
const pkgJson = path.join(cur, 'node_modules', pkg, 'package.json');
|
|
28
|
+
if (fs.existsSync(pkgJson)) {
|
|
29
|
+
try {
|
|
30
|
+
const p = JSON.parse(fs.readFileSync(pkgJson, 'utf-8'));
|
|
31
|
+
return p.version ?? null;
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
}
|
|
35
|
+
cur = path.dirname(cur);
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function detectPackageManager(cwd) {
|
|
40
|
+
if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml')))
|
|
41
|
+
return 'pnpm';
|
|
42
|
+
if (fs.existsSync(path.join(cwd, 'bun.lockb')) || fs.existsSync(path.join(cwd, 'bun.lock')))
|
|
43
|
+
return 'bun';
|
|
44
|
+
return 'npm';
|
|
45
|
+
}
|
|
46
|
+
function buildInstallCmd(pm, pkgSpecs) {
|
|
47
|
+
const list = pkgSpecs.join(' ');
|
|
48
|
+
switch (pm) {
|
|
49
|
+
case 'pnpm':
|
|
50
|
+
return `pnpm add -D ${list}`;
|
|
51
|
+
case 'bun':
|
|
52
|
+
return `bun add -d ${list}`;
|
|
53
|
+
case 'npm':
|
|
54
|
+
default:
|
|
55
|
+
return `npm install -D ${list}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function updateCommand(options = {}) {
|
|
59
|
+
const cwd = process.cwd();
|
|
60
|
+
const pm = detectPackageManager(cwd);
|
|
61
|
+
console.log('\x1b[36m┌ 🔄 TestSpectra Self-Update\x1b[0m');
|
|
62
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
63
|
+
console.log(`\x1b[36m│\x1b[0m Package Manager: \x1b[33m${pm}\x1b[0m`);
|
|
64
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
65
|
+
console.log('\x1b[36m│\x1b[0m Fetching latest versions from npm registry...');
|
|
66
|
+
const updates = [];
|
|
67
|
+
for (const pkg of PACKAGES) {
|
|
68
|
+
const current = getCurrentVersion(pkg, cwd);
|
|
69
|
+
const latest = getLatestVersion(pkg);
|
|
70
|
+
const needsUpdate = !!latest && latest !== current;
|
|
71
|
+
updates.push({ pkg, current, latest, needsUpdate });
|
|
72
|
+
const currentStr = current ? `\x1b[33mv${current}\x1b[0m` : '\x1b[90m(not installed)\x1b[0m';
|
|
73
|
+
const latestStr = latest ? `\x1b[32mv${latest}\x1b[0m` : '\x1b[31m(unavailable)\x1b[0m';
|
|
74
|
+
const arrow = needsUpdate ? ` → ${latestStr}` : '';
|
|
75
|
+
const status = !latest ? '\x1b[31m✗\x1b[0m' : needsUpdate ? '\x1b[33m↑\x1b[0m' : '\x1b[32m✓\x1b[0m';
|
|
76
|
+
console.log(`\x1b[36m│\x1b[0m ${status} ${pkg.padEnd(28)} ${currentStr}${arrow}`);
|
|
77
|
+
}
|
|
78
|
+
const toUpdate = updates.filter((u) => u.needsUpdate && u.latest);
|
|
79
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
80
|
+
if (toUpdate.length === 0) {
|
|
81
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m');
|
|
82
|
+
console.log('\x1b[32m✓ All TestSpectra packages are already up-to-date!\x1b[0m\n');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (options.check) {
|
|
86
|
+
console.log(`\x1b[36m│\x1b[0m \x1b[33m${toUpdate.length} update(s) available. Run \x1b[36mspectra update\x1b[33m to install.\x1b[0m`);
|
|
87
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m\n');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const pkgSpecs = toUpdate.map((u) => `${u.pkg}@${u.latest}`);
|
|
91
|
+
const installCmd = buildInstallCmd(pm, pkgSpecs);
|
|
92
|
+
console.log(`\x1b[36m│\x1b[0m Running: \x1b[90m${installCmd}\x1b[0m`);
|
|
93
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
94
|
+
try {
|
|
95
|
+
execSync(installCmd, { cwd, stdio: 'inherit' });
|
|
96
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
97
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m');
|
|
98
|
+
console.log('\x1b[32m🎉 TestSpectra updated successfully!\x1b[0m');
|
|
99
|
+
for (const u of toUpdate) {
|
|
100
|
+
console.log(` \x1b[32m✓\x1b[0m ${u.pkg}: v${u.current ?? '?'} → v${u.latest}`);
|
|
101
|
+
}
|
|
102
|
+
console.log('');
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m');
|
|
106
|
+
console.error(`\x1b[31m✗ Update failed: ${err.message}\x1b[0m\n`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}
|
package/dist/commands/watch.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
1
2
|
export interface WatchCommandOptions {
|
|
2
3
|
cwd?: string;
|
|
4
|
+
debounceMs?: number;
|
|
3
5
|
}
|
|
6
|
+
export declare function startWatcher(cwd: string, debounceMs?: number): {
|
|
7
|
+
watcher: fs.FSWatcher;
|
|
8
|
+
close: () => void;
|
|
9
|
+
};
|
|
4
10
|
export declare function watchCommand(options?: WatchCommandOptions): Promise<void>;
|
package/dist/commands/watch.js
CHANGED
|
@@ -1,63 +1,67 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import path from
|
|
3
|
-
import chalk from
|
|
4
|
-
import { TypeGenerator } from
|
|
5
|
-
export
|
|
6
|
-
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
|
|
7
|
-
console.log(chalk.bold.cyan("\n🔭 TestSpectra Ambient Types Watcher"));
|
|
8
|
-
console.log(chalk.gray(`Watching workspace: ${cwd}\n`));
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { TypeGenerator } from '../types/generator.js';
|
|
5
|
+
export function startWatcher(cwd, debounceMs = 60) {
|
|
9
6
|
// Initial generation
|
|
10
|
-
|
|
11
|
-
TypeGenerator.writeDeclarationFiles(cwd);
|
|
12
|
-
console.log(chalk.green("✔ Initialized ambient declarations in .testspectra/types/"));
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
console.error(chalk.red(`✖ Failed initial type generation: ${err?.message}`));
|
|
16
|
-
}
|
|
7
|
+
TypeGenerator.generateAll(cwd);
|
|
17
8
|
let debounceTimer = null;
|
|
18
9
|
const triggerRegen = (filePath, eventType) => {
|
|
19
10
|
if (debounceTimer)
|
|
20
11
|
clearTimeout(debounceTimer);
|
|
21
12
|
debounceTimer = setTimeout(() => {
|
|
22
13
|
try {
|
|
23
|
-
TypeGenerator.
|
|
14
|
+
TypeGenerator.generateAll(cwd);
|
|
24
15
|
const time = new Date().toLocaleTimeString();
|
|
25
16
|
const rel = path.relative(cwd, filePath) || filePath;
|
|
26
|
-
console.log(chalk.gray(`[${time}] `) +
|
|
27
|
-
chalk.cyan(`✨ Updated ambient types `) +
|
|
28
|
-
chalk.gray(`(${eventType}: ${rel})`));
|
|
17
|
+
console.log(chalk.gray(`[${time}] `) + chalk.cyan(`✨ Updated ambient types `) + chalk.gray(`(${eventType}: ${rel})`));
|
|
29
18
|
}
|
|
30
19
|
catch (err) {
|
|
31
20
|
console.error(chalk.red(`✖ Error regenerating declarations: ${err?.message}`));
|
|
32
21
|
}
|
|
33
|
-
},
|
|
22
|
+
}, debounceMs);
|
|
23
|
+
};
|
|
24
|
+
const watcher = fs.watch(cwd, { recursive: true }, (eventType, filename) => {
|
|
25
|
+
if (!filename)
|
|
26
|
+
return;
|
|
27
|
+
const fn = filename.toString();
|
|
28
|
+
if (fn.includes('.testspectra') ||
|
|
29
|
+
fn.includes('node_modules') ||
|
|
30
|
+
fn.includes('.git') ||
|
|
31
|
+
fn.includes('dist') ||
|
|
32
|
+
fn.includes('.nx')) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (fn.includes('fixtures') ||
|
|
36
|
+
fn.includes('page-objects') ||
|
|
37
|
+
fn.includes('pageobjects') ||
|
|
38
|
+
fn.includes('actions') ||
|
|
39
|
+
fn.includes('steps') ||
|
|
40
|
+
fn.includes('hooks') ||
|
|
41
|
+
fn.includes('spectra.config')) {
|
|
42
|
+
triggerRegen(path.join(cwd, fn), eventType);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
watcher,
|
|
47
|
+
close: () => {
|
|
48
|
+
if (debounceTimer)
|
|
49
|
+
clearTimeout(debounceTimer);
|
|
50
|
+
watcher.close();
|
|
51
|
+
},
|
|
34
52
|
};
|
|
53
|
+
}
|
|
54
|
+
export async function watchCommand(options = {}) {
|
|
55
|
+
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
|
|
56
|
+
console.log(chalk.bold.cyan('\n🔭 TestSpectra Ambient Types Watcher'));
|
|
57
|
+
console.log(chalk.gray(`Watching workspace: ${cwd}\n`));
|
|
35
58
|
try {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (fn.includes(".testspectra") ||
|
|
41
|
-
fn.includes("node_modules") ||
|
|
42
|
-
fn.includes(".git") ||
|
|
43
|
-
fn.includes("dist") ||
|
|
44
|
-
fn.includes(".nx")) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
if (fn.includes("fixtures") ||
|
|
48
|
-
fn.includes("page-objects") ||
|
|
49
|
-
fn.includes("pageobjects") ||
|
|
50
|
-
fn.includes("actions") ||
|
|
51
|
-
fn.includes("steps") ||
|
|
52
|
-
fn.includes("hooks") ||
|
|
53
|
-
fn.includes("spectra.config")) {
|
|
54
|
-
triggerRegen(path.join(cwd, fn), eventType);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
watcher.on("error", (err) => {
|
|
59
|
+
const handle = startWatcher(cwd, options.debounceMs ?? 60);
|
|
60
|
+
console.log(chalk.green('✔ Initialized ambient declarations in .testspectra/types/'));
|
|
61
|
+
console.log(chalk.gray('Press Ctrl+C to stop watching.\n'));
|
|
62
|
+
handle.watcher.on('error', (err) => {
|
|
58
63
|
console.error(chalk.red(`Watcher error: ${err?.message}`));
|
|
59
64
|
});
|
|
60
|
-
console.log(chalk.gray("Press Ctrl+C to stop watching.\n"));
|
|
61
65
|
}
|
|
62
66
|
catch (err) {
|
|
63
67
|
console.error(chalk.red(`Failed to start workspace watcher: ${err?.message}`));
|
package/dist/config/loader.d.ts
CHANGED
package/dist/config/loader.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import path from
|
|
3
|
-
import { DEFAULT_CONFIG_DATA } from
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { DEFAULT_CONFIG_DATA } from './schema.js';
|
|
4
4
|
export class ConfigLoader {
|
|
5
5
|
static CONFIG_FILE_NAMES = [
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
'testspectra.config.ts',
|
|
7
|
+
'spectra.config.ts',
|
|
8
|
+
'testspectra.config.js',
|
|
9
|
+
'spectra.config.js',
|
|
10
|
+
'testspectra.config.json',
|
|
11
|
+
'.testspectrarc.json',
|
|
12
12
|
];
|
|
13
13
|
static findConfigFile(cwd = process.cwd()) {
|
|
14
14
|
let cur = path.resolve(cwd);
|
|
@@ -30,16 +30,16 @@ export class ConfigLoader {
|
|
|
30
30
|
const configPath = this.findConfigFile(cwd);
|
|
31
31
|
let loaded = {};
|
|
32
32
|
if (configPath) {
|
|
33
|
-
if (configPath.endsWith(
|
|
33
|
+
if (configPath.endsWith('.json')) {
|
|
34
34
|
try {
|
|
35
|
-
const raw = fs.readFileSync(configPath,
|
|
35
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
36
36
|
loaded = JSON.parse(raw);
|
|
37
37
|
}
|
|
38
38
|
catch (e) {
|
|
39
39
|
console.warn(`[TestSpectra] Warning: Failed to parse ${configPath}:`, e);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
else if (configPath.endsWith(
|
|
42
|
+
else if (configPath.endsWith('.ts') || configPath.endsWith('.js')) {
|
|
43
43
|
try {
|
|
44
44
|
const fileUrl = new URL(`file://${path.resolve(configPath)}`).href;
|
|
45
45
|
const mod = await import(fileUrl);
|
|
@@ -56,31 +56,46 @@ export class ConfigLoader {
|
|
|
56
56
|
...overrides,
|
|
57
57
|
webConfig: {
|
|
58
58
|
...DEFAULT_CONFIG_DATA.webConfig,
|
|
59
|
-
...
|
|
60
|
-
...
|
|
59
|
+
...loaded.webConfig,
|
|
60
|
+
...overrides?.webConfig,
|
|
61
61
|
},
|
|
62
62
|
androidConfig: {
|
|
63
63
|
...DEFAULT_CONFIG_DATA.androidConfig,
|
|
64
|
-
...
|
|
65
|
-
...
|
|
64
|
+
...loaded.androidConfig,
|
|
65
|
+
...overrides?.androidConfig,
|
|
66
66
|
},
|
|
67
67
|
iosConfig: {
|
|
68
68
|
...DEFAULT_CONFIG_DATA.iosConfig,
|
|
69
|
-
...
|
|
70
|
-
...
|
|
69
|
+
...loaded.iosConfig,
|
|
70
|
+
...overrides?.iosConfig,
|
|
71
71
|
},
|
|
72
72
|
executionConfig: {
|
|
73
|
-
networkMonitoringEnabled: overrides?.executionConfig?.networkMonitoringEnabled ??
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
networkMonitoringEnabled: overrides?.executionConfig?.networkMonitoringEnabled ??
|
|
74
|
+
loaded.executionConfig?.networkMonitoringEnabled ??
|
|
75
|
+
DEFAULT_CONFIG_DATA.executionConfig?.networkMonitoringEnabled ??
|
|
76
|
+
true,
|
|
77
|
+
fastResponseTime: overrides?.executionConfig?.fastResponseTime ??
|
|
78
|
+
loaded.executionConfig?.fastResponseTime ??
|
|
79
|
+
DEFAULT_CONFIG_DATA.executionConfig?.fastResponseTime ??
|
|
80
|
+
'200',
|
|
81
|
+
normalResponseTime: overrides?.executionConfig?.normalResponseTime ??
|
|
82
|
+
loaded.executionConfig?.normalResponseTime ??
|
|
83
|
+
DEFAULT_CONFIG_DATA.executionConfig?.normalResponseTime ??
|
|
84
|
+
'1000',
|
|
85
|
+
monitoredDomains: overrides?.executionConfig?.monitoredDomains ??
|
|
86
|
+
loaded.executionConfig?.monitoredDomains ??
|
|
87
|
+
DEFAULT_CONFIG_DATA.executionConfig?.monitoredDomains ??
|
|
88
|
+
[],
|
|
89
|
+
environmentVariables: overrides?.executionConfig?.environmentVariables ??
|
|
90
|
+
loaded.executionConfig?.environmentVariables ??
|
|
91
|
+
DEFAULT_CONFIG_DATA.executionConfig?.environmentVariables ??
|
|
92
|
+
[],
|
|
78
93
|
},
|
|
79
94
|
};
|
|
80
95
|
}
|
|
81
|
-
static saveConfig(cwd, config, filename =
|
|
96
|
+
static saveConfig(cwd, config, filename = 'testspectra.config.json') {
|
|
82
97
|
const target = path.join(cwd, filename);
|
|
83
|
-
fs.writeFileSync(target, JSON.stringify(config, null, 2),
|
|
98
|
+
fs.writeFileSync(target, JSON.stringify(config, null, 2), 'utf-8');
|
|
84
99
|
return target;
|
|
85
100
|
}
|
|
86
101
|
}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -9,14 +9,15 @@ export interface WebConfig {
|
|
|
9
9
|
baseUrl: string;
|
|
10
10
|
/**
|
|
11
11
|
* Maximum number of parallel browser sessions/workers spawned during test execution.
|
|
12
|
-
*
|
|
12
|
+
* Can be an explicit number, numeric string, or `"auto"`.
|
|
13
|
+
* @default "auto"
|
|
13
14
|
*/
|
|
14
|
-
maxConcurrentSessions: string;
|
|
15
|
+
maxConcurrentSessions: number | string | 'auto';
|
|
15
16
|
/**
|
|
16
17
|
* Whether to run browsers in headless mode without a visible GUI window.
|
|
17
18
|
* @default true
|
|
18
19
|
*/
|
|
19
|
-
|
|
20
|
+
headless: boolean | 'new';
|
|
20
21
|
/**
|
|
21
22
|
* Implicit wait timeout (in milliseconds) for finding elements before throwing an error.
|
|
22
23
|
* @default "5000"
|
|
@@ -32,13 +33,18 @@ export interface WebConfig {
|
|
|
32
33
|
* @default "30000"
|
|
33
34
|
*/
|
|
34
35
|
scriptTimeout: string;
|
|
36
|
+
/**
|
|
37
|
+
* Delay between consecutive actions and commands in milliseconds (slow motion).
|
|
38
|
+
* @default 0
|
|
39
|
+
*/
|
|
40
|
+
stepDelay?: number;
|
|
35
41
|
/**
|
|
36
42
|
* Parallelization granularity:
|
|
37
43
|
* - `"testcase"`: Each test case executes in parallel across available workers.
|
|
38
44
|
* - `"suite"`: Test cases within a suite run serially, while different suites run in parallel.
|
|
39
45
|
* @default "testcase"
|
|
40
46
|
*/
|
|
41
|
-
parallelizationMode:
|
|
47
|
+
parallelizationMode: 'testcase' | 'suite';
|
|
42
48
|
}
|
|
43
49
|
/**
|
|
44
50
|
* Browser target definition for web test execution.
|
|
@@ -72,34 +78,76 @@ export interface Browser {
|
|
|
72
78
|
height?: string;
|
|
73
79
|
}
|
|
74
80
|
/**
|
|
75
|
-
*
|
|
81
|
+
* Target Android device specification for multi-device parallel execution.
|
|
76
82
|
*/
|
|
77
|
-
export interface
|
|
83
|
+
export interface AndroidDeviceTarget {
|
|
78
84
|
/**
|
|
79
|
-
*
|
|
80
|
-
* @default "http://127.0.0.1:4723"
|
|
85
|
+
* ADB serial or device ID (e.g. "emulator-5554", "192.168.1.50:5555").
|
|
81
86
|
*/
|
|
82
|
-
|
|
87
|
+
id: string;
|
|
83
88
|
/**
|
|
84
|
-
*
|
|
85
|
-
* @default "Android"
|
|
89
|
+
* Emulator AVD name (e.g. "Pixel_7_Pro_API_34").
|
|
86
90
|
*/
|
|
87
|
-
|
|
91
|
+
avd?: string;
|
|
88
92
|
/**
|
|
89
|
-
*
|
|
90
|
-
* @default "13"
|
|
93
|
+
* Friendly display/model name (e.g. "Pixel 7 Pro").
|
|
91
94
|
*/
|
|
92
|
-
|
|
95
|
+
name?: string;
|
|
93
96
|
/**
|
|
94
|
-
*
|
|
95
|
-
* @default "emulator-5554"
|
|
97
|
+
* Android OS version (e.g. "14.0").
|
|
96
98
|
*/
|
|
97
|
-
|
|
99
|
+
version?: string;
|
|
98
100
|
/**
|
|
99
|
-
*
|
|
100
|
-
* @default "UiAutomator2"
|
|
101
|
+
* UiAutomator2 port (e.g. 8200).
|
|
101
102
|
*/
|
|
102
|
-
|
|
103
|
+
systemPort?: number;
|
|
104
|
+
/**
|
|
105
|
+
* Custom Appium capabilities overrides for this specific device.
|
|
106
|
+
*/
|
|
107
|
+
capabilities?: Record<string, any>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Target iOS device specification for multi-device parallel execution.
|
|
111
|
+
*/
|
|
112
|
+
export interface IosDeviceTarget {
|
|
113
|
+
/**
|
|
114
|
+
* Device ID or simulator slug (e.g. "iphone-15-pro").
|
|
115
|
+
*/
|
|
116
|
+
id: string;
|
|
117
|
+
/**
|
|
118
|
+
* Friendly name (e.g. "iPhone 15 Pro Simulator").
|
|
119
|
+
*/
|
|
120
|
+
name?: string;
|
|
121
|
+
/**
|
|
122
|
+
* iOS version (e.g. "17.0").
|
|
123
|
+
*/
|
|
124
|
+
version?: string;
|
|
125
|
+
/**
|
|
126
|
+
* Physical device UDID or "auto".
|
|
127
|
+
*/
|
|
128
|
+
udid?: string;
|
|
129
|
+
/**
|
|
130
|
+
* WebDriverAgent local port (e.g. 8100).
|
|
131
|
+
*/
|
|
132
|
+
wdaLocalPort?: number;
|
|
133
|
+
/**
|
|
134
|
+
* Custom Appium capabilities overrides for this specific device.
|
|
135
|
+
*/
|
|
136
|
+
capabilities?: Record<string, any>;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Configuration for Android mobile test automation with Spectra Android Native Driver.
|
|
140
|
+
*/
|
|
141
|
+
export interface AndroidConfig {
|
|
142
|
+
/**
|
|
143
|
+
* Spectra Android Driver server endpoint URL.
|
|
144
|
+
* @default "tcp://127.0.0.1:8200"
|
|
145
|
+
*/
|
|
146
|
+
driverServer?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Legacy Appium server endpoint URL (fallback, deprecated — use `driverServer`).
|
|
149
|
+
*/
|
|
150
|
+
appiumServer?: string;
|
|
103
151
|
/**
|
|
104
152
|
* Android application package name (e.g. `"com.example.app"`).
|
|
105
153
|
*/
|
|
@@ -120,39 +168,47 @@ export interface AndroidConfig {
|
|
|
120
168
|
noReset: boolean;
|
|
121
169
|
/**
|
|
122
170
|
* Implicit wait timeout (in milliseconds) for locating mobile elements.
|
|
123
|
-
* @default
|
|
171
|
+
* @default 10000
|
|
124
172
|
*/
|
|
125
|
-
implicitWait: string;
|
|
173
|
+
implicitWait: string | number;
|
|
126
174
|
/**
|
|
127
175
|
* Parallelization execution mode for Android mobile tests.
|
|
128
176
|
* @default "suite"
|
|
129
177
|
*/
|
|
130
|
-
parallelizationMode:
|
|
178
|
+
parallelizationMode: 'testcase' | 'suite';
|
|
179
|
+
/**
|
|
180
|
+
* Array of explicit target devices or configurations for multi-device parallel execution.
|
|
181
|
+
* Each entry can specify its own `id`, `name`, `version`, `avd`, `systemPort`, etc.
|
|
182
|
+
*/
|
|
183
|
+
devices: (string | AndroidDeviceTarget)[] | 'auto';
|
|
184
|
+
/**
|
|
185
|
+
* Raw custom WebdriverIO / Appium capabilities array override.
|
|
186
|
+
*/
|
|
187
|
+
capabilities?: Record<string, any>[];
|
|
188
|
+
/**
|
|
189
|
+
* Maximum concurrent mobile sessions/devices cap.
|
|
190
|
+
*/
|
|
191
|
+
maxConcurrentSessions?: number | string;
|
|
192
|
+
/**
|
|
193
|
+
* Delay between consecutive actions and commands in milliseconds (slow motion).
|
|
194
|
+
* @default 0
|
|
195
|
+
*/
|
|
196
|
+
stepDelay?: number;
|
|
131
197
|
}
|
|
132
198
|
/**
|
|
133
199
|
* Configuration for iOS mobile test automation with Appium & XCUITest.
|
|
134
200
|
*/
|
|
135
201
|
export interface IosConfig {
|
|
202
|
+
/**
|
|
203
|
+
* Delay between consecutive actions and commands in milliseconds (slow motion).
|
|
204
|
+
* @default 0
|
|
205
|
+
*/
|
|
206
|
+
stepDelay?: number;
|
|
136
207
|
/**
|
|
137
208
|
* Appium server endpoint URL.
|
|
138
209
|
* @default "http://127.0.0.1:4723"
|
|
139
210
|
*/
|
|
140
211
|
appiumServer: string;
|
|
141
|
-
/**
|
|
142
|
-
* Mobile platform name.
|
|
143
|
-
* @default "iOS"
|
|
144
|
-
*/
|
|
145
|
-
platformName: string;
|
|
146
|
-
/**
|
|
147
|
-
* iOS version (e.g. `"16.0"`, `"17.0"`).
|
|
148
|
-
* @default "16.0"
|
|
149
|
-
*/
|
|
150
|
-
platformVersion: string;
|
|
151
|
-
/**
|
|
152
|
-
* iOS simulator or connected physical device name (e.g. `"iPhone 14"`).
|
|
153
|
-
* @default "iPhone 14"
|
|
154
|
-
*/
|
|
155
|
-
deviceName: string;
|
|
156
212
|
/**
|
|
157
213
|
* Appium mobile automation driver engine for iOS.
|
|
158
214
|
* @default "XCUITest"
|
|
@@ -166,16 +222,28 @@ export interface IosConfig {
|
|
|
166
222
|
* Target device Unique Device Identifier (UDID) or `"auto"`.
|
|
167
223
|
* @default "auto"
|
|
168
224
|
*/
|
|
169
|
-
udid
|
|
225
|
+
udid?: string;
|
|
226
|
+
/**
|
|
227
|
+
* Array of explicit target devices or configurations for multi-device execution.
|
|
228
|
+
*/
|
|
229
|
+
devices: (string | IosDeviceTarget)[] | 'auto';
|
|
230
|
+
/**
|
|
231
|
+
* Raw custom WebdriverIO / Appium capabilities array override.
|
|
232
|
+
*/
|
|
233
|
+
capabilities?: Record<string, any>[];
|
|
234
|
+
/**
|
|
235
|
+
* Maximum concurrent mobile sessions/devices cap.
|
|
236
|
+
*/
|
|
237
|
+
maxConcurrentSessions?: number | string;
|
|
170
238
|
/**
|
|
171
239
|
* Apple Developer Team 10-character Organization ID for code signing.
|
|
172
240
|
*/
|
|
173
|
-
xcodeOrgId
|
|
241
|
+
xcodeOrgId?: string;
|
|
174
242
|
/**
|
|
175
243
|
* Xcode code signing identity string (e.g. `"iPhone Developer"`).
|
|
176
244
|
* @default "iPhone Developer"
|
|
177
245
|
*/
|
|
178
|
-
xcodeSigningId
|
|
246
|
+
xcodeSigningId?: string;
|
|
179
247
|
/**
|
|
180
248
|
* Whether to automatically accept iOS system permission alerts.
|
|
181
249
|
* @default true
|
|
@@ -188,14 +256,14 @@ export interface IosConfig {
|
|
|
188
256
|
noReset: boolean;
|
|
189
257
|
/**
|
|
190
258
|
* Implicit wait timeout (in milliseconds) for locating iOS UI elements.
|
|
191
|
-
* @default
|
|
259
|
+
* @default 10000
|
|
192
260
|
*/
|
|
193
|
-
implicitWait: string;
|
|
261
|
+
implicitWait: string | number;
|
|
194
262
|
/**
|
|
195
263
|
* Parallelization execution mode for iOS mobile tests.
|
|
196
264
|
* @default "suite"
|
|
197
265
|
*/
|
|
198
|
-
parallelizationMode:
|
|
266
|
+
parallelizationMode: 'testcase' | 'suite';
|
|
199
267
|
}
|
|
200
268
|
/**
|
|
201
269
|
* Load testing stage ramp-up profile.
|
|
@@ -328,9 +396,9 @@ export interface ConfigData {
|
|
|
328
396
|
/**
|
|
329
397
|
* Deep recursive partial type for user-friendly configuration objects.
|
|
330
398
|
*/
|
|
331
|
-
export type DeepPartial<T> = {
|
|
332
|
-
[
|
|
333
|
-
};
|
|
399
|
+
export type DeepPartial<T> = T extends Function | boolean | number | string | symbol | null | undefined ? T : T extends Array<infer U> ? DeepPartial<U>[] : T extends ReadonlyArray<infer U> ? readonly DeepPartial<U>[] : T extends object ? {
|
|
400
|
+
[K in keyof T]?: DeepPartial<T[K]>;
|
|
401
|
+
} : T;
|
|
334
402
|
/**
|
|
335
403
|
* User-provided configuration options with optional deep partial properties.
|
|
336
404
|
*/
|
|
@@ -345,7 +413,7 @@ export type UserConfig = DeepPartial<ConfigData>;
|
|
|
345
413
|
* export default defineConfig({
|
|
346
414
|
* webConfig: {
|
|
347
415
|
* baseUrl: "https://example.com",
|
|
348
|
-
*
|
|
416
|
+
* headless: false,
|
|
349
417
|
* },
|
|
350
418
|
* });
|
|
351
419
|
* ```
|