@testspectra/cli 1.0.70 → 1.1.0-rc.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/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-BGllUp7o.js +140 -0
- package/demo-app/assets/index-BhlW-eXG.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -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 +422 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +277 -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/demo.js +21 -11
- 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/lint.d.ts +5 -0
- package/dist/commands/lint.js +55 -0
- package/dist/commands/refactor.d.ts +9 -0
- package/dist/commands/refactor.js +172 -0
- package/dist/commands/run.d.ts +23 -2
- package/dist/commands/run.js +321 -111
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.js +28 -0
- package/dist/commands/sync-types.d.ts +4 -0
- package/dist/commands/sync-types.js +14 -0
- package/dist/commands/update.js +39 -43
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +46 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -54
- package/dist/config/schema.js +41 -35
- 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 +384 -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 +151 -51
- 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/linter/__tests__/anonymous-export.test.d.ts +1 -0
- package/dist/linter/__tests__/anonymous-export.test.js +184 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.d.ts +1 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.js +270 -0
- package/dist/linter/__tests__/spec-schema.test.d.ts +1 -0
- package/dist/linter/__tests__/spec-schema.test.js +369 -0
- package/dist/linter/__tests__/step-parity.test.d.ts +1 -0
- package/dist/linter/__tests__/step-parity.test.js +372 -0
- package/dist/linter/discovery.d.ts +30 -0
- package/dist/linter/discovery.js +249 -0
- package/dist/linter/extractor.d.ts +66 -0
- package/dist/linter/extractor.js +235 -0
- package/dist/linter/index.d.ts +7 -0
- package/dist/linter/index.js +7 -0
- package/dist/linter/parser.d.ts +24 -0
- package/dist/linter/parser.js +219 -0
- package/dist/linter/schemas/spec.schema.d.ts +83 -0
- package/dist/linter/schemas/spec.schema.js +150 -0
- package/dist/linter/schemas/suite.schema.d.ts +59 -0
- package/dist/linter/schemas/suite.schema.js +83 -0
- package/dist/linter/spec-linter.d.ts +23 -0
- package/dist/linter/spec-linter.js +595 -0
- package/dist/linter/types.d.ts +28 -0
- package/dist/linter/types.js +1 -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 +873 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +50 -0
- package/dist/refactor/refactor-engine.js +587 -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 +101 -45
- package/dist/runner/reporter.d.ts +32 -2
- package/dist/runner/reporter.js +423 -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/__tests__/api-server.test.d.ts +1 -0
- package/dist/utils/__tests__/api-server.test.js +62 -0
- package/dist/utils/__tests__/demo-server.test.d.ts +1 -0
- package/dist/utils/__tests__/demo-server.test.js +35 -0
- package/dist/utils/api-server.d.ts +19 -0
- package/dist/utils/api-server.js +134 -0
- package/dist/utils/demo-server.d.ts +5 -0
- package/dist/utils/demo-server.js +46 -36
- package/package.json +24 -13
- package/templates/default/CLAUDE.md +12 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +12 -3
- package/templates/default/page-objects/MatchersPage/mobile.ts +53 -17
- package/templates/default/page-objects/MatchersPage/web.ts +17 -2
- package/templates/default/page-objects/NavigationPage/mobile.ts +11 -2
- package/templates/default/page-objects/NavigationPage/web.ts +1 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +28 -18
- package/templates/default/page-objects/PlaygroundPage/web.ts +4 -2
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +33 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -0
- package/templates/default/specs/ApiInterception/suite.md +10 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -0
- package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -0
- package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -0
- package/templates/default/specs/ApiSeeding/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/spec.md +5 -0
- 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/common.test.ts +26 -0
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +7 -0
- 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/spec.md +5 -0
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -0
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -0
- package/templates/default/specs/DeepLink/suite.md +9 -0
- 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/spec.md +5 -0
- 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/spec.md +7 -0
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/default/specs/ElementMatchers/suite.md +2 -1
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -0
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -0
- package/templates/default/specs/PermissionRationale/suite.md +9 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
- package/templates/default/spectra.config.ts +21 -15
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +3 -3
- package/templates/default/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +3 -1
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +3 -3
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +4 -2
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/default/tsconfig.json +3 -1
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-shm +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-wal +0 -0
- package/templates/nx/.nx/workspace-data/d/daemon.log +4306 -0
- package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
- package/templates/nx/.nx/workspace-data/file-map.json +452 -0
- package/templates/nx/.nx/workspace-data/lockfile.hash +1 -0
- package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
- package/templates/nx/.nx/workspace-data/parsed-lock-file.json +13485 -0
- package/templates/nx/.nx/workspace-data/project-graph.json +14389 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +6 -4
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -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 +24 -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/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +15 -5
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
- 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 +13 -1
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +85 -17
- package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +4 -2
- package/templates/nx/shared/testing/project.json +19 -0
- package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +1 -1
- package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +3 -3
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/nx/spectra.config.ts +19 -13
- 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/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- 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
package/dist/commands/update.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { execSync, execFileSync } from
|
|
2
|
-
import fs from
|
|
3
|
-
import path from
|
|
4
|
-
import { fileURLToPath } from
|
|
1
|
+
import { execSync, execFileSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = path.dirname(__filename);
|
|
7
|
-
const PACKAGES = [
|
|
7
|
+
const PACKAGES = ['@testspectra/cli', '@testspectra/matchers'];
|
|
8
8
|
function getLatestVersion(pkg) {
|
|
9
9
|
try {
|
|
10
|
-
const out = execFileSync(
|
|
11
|
-
stdio: [
|
|
10
|
+
const out = execFileSync('npm', ['view', pkg, 'version', '--json'], {
|
|
11
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
12
12
|
timeout: 10000,
|
|
13
13
|
})
|
|
14
14
|
.toString()
|
|
15
15
|
.trim()
|
|
16
|
-
.replace(/"/g,
|
|
16
|
+
.replace(/"/g, '');
|
|
17
17
|
return out || null;
|
|
18
18
|
}
|
|
19
19
|
catch {
|
|
@@ -24,10 +24,10 @@ function getCurrentVersion(pkg, cwd) {
|
|
|
24
24
|
// Walk up to find the installed version
|
|
25
25
|
let cur = path.resolve(cwd);
|
|
26
26
|
while (cur && cur !== path.dirname(cur)) {
|
|
27
|
-
const pkgJson = path.join(cur,
|
|
27
|
+
const pkgJson = path.join(cur, 'node_modules', pkg, 'package.json');
|
|
28
28
|
if (fs.existsSync(pkgJson)) {
|
|
29
29
|
try {
|
|
30
|
-
const p = JSON.parse(fs.readFileSync(pkgJson,
|
|
30
|
+
const p = JSON.parse(fs.readFileSync(pkgJson, 'utf-8'));
|
|
31
31
|
return p.version ?? null;
|
|
32
32
|
}
|
|
33
33
|
catch { }
|
|
@@ -37,20 +37,20 @@ function getCurrentVersion(pkg, cwd) {
|
|
|
37
37
|
return null;
|
|
38
38
|
}
|
|
39
39
|
function detectPackageManager(cwd) {
|
|
40
|
-
if (fs.existsSync(path.join(cwd,
|
|
41
|
-
return
|
|
42
|
-
if (fs.existsSync(path.join(cwd,
|
|
43
|
-
return
|
|
44
|
-
return
|
|
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
45
|
}
|
|
46
46
|
function buildInstallCmd(pm, pkgSpecs) {
|
|
47
|
-
const list = pkgSpecs.join(
|
|
47
|
+
const list = pkgSpecs.join(' ');
|
|
48
48
|
switch (pm) {
|
|
49
|
-
case
|
|
49
|
+
case 'pnpm':
|
|
50
50
|
return `pnpm add -D ${list}`;
|
|
51
|
-
case
|
|
51
|
+
case 'bun':
|
|
52
52
|
return `bun add -d ${list}`;
|
|
53
|
-
case
|
|
53
|
+
case 'npm':
|
|
54
54
|
default:
|
|
55
55
|
return `npm install -D ${list}`;
|
|
56
56
|
}
|
|
@@ -58,55 +58,51 @@ function buildInstallCmd(pm, pkgSpecs) {
|
|
|
58
58
|
export async function updateCommand(options = {}) {
|
|
59
59
|
const cwd = process.cwd();
|
|
60
60
|
const pm = detectPackageManager(cwd);
|
|
61
|
-
console.log(
|
|
62
|
-
console.log(
|
|
61
|
+
console.log('\x1b[36m┌ 🔄 TestSpectra Self-Update\x1b[0m');
|
|
62
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
63
63
|
console.log(`\x1b[36m│\x1b[0m Package Manager: \x1b[33m${pm}\x1b[0m`);
|
|
64
|
-
console.log(
|
|
65
|
-
console.log(
|
|
64
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
65
|
+
console.log('\x1b[36m│\x1b[0m Fetching latest versions from npm registry...');
|
|
66
66
|
const updates = [];
|
|
67
67
|
for (const pkg of PACKAGES) {
|
|
68
68
|
const current = getCurrentVersion(pkg, cwd);
|
|
69
69
|
const latest = getLatestVersion(pkg);
|
|
70
70
|
const needsUpdate = !!latest && latest !== current;
|
|
71
71
|
updates.push({ pkg, current, latest, needsUpdate });
|
|
72
|
-
const currentStr = current ? `\x1b[33mv${current}\x1b[0m` :
|
|
73
|
-
const latestStr = latest ? `\x1b[32mv${latest}\x1b[0m` :
|
|
74
|
-
const arrow = needsUpdate ? ` → ${latestStr}` :
|
|
75
|
-
const status = !latest
|
|
76
|
-
? "\x1b[31m✗\x1b[0m"
|
|
77
|
-
: needsUpdate
|
|
78
|
-
? "\x1b[33m↑\x1b[0m"
|
|
79
|
-
: "\x1b[32m✓\x1b[0m";
|
|
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';
|
|
80
76
|
console.log(`\x1b[36m│\x1b[0m ${status} ${pkg.padEnd(28)} ${currentStr}${arrow}`);
|
|
81
77
|
}
|
|
82
78
|
const toUpdate = updates.filter((u) => u.needsUpdate && u.latest);
|
|
83
|
-
console.log(
|
|
79
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
84
80
|
if (toUpdate.length === 0) {
|
|
85
|
-
console.log(
|
|
86
|
-
console.log(
|
|
81
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m');
|
|
82
|
+
console.log('\x1b[32m✓ All TestSpectra packages are already up-to-date!\x1b[0m\n');
|
|
87
83
|
return;
|
|
88
84
|
}
|
|
89
85
|
if (options.check) {
|
|
90
86
|
console.log(`\x1b[36m│\x1b[0m \x1b[33m${toUpdate.length} update(s) available. Run \x1b[36mspectra update\x1b[33m to install.\x1b[0m`);
|
|
91
|
-
console.log(
|
|
87
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m\n');
|
|
92
88
|
return;
|
|
93
89
|
}
|
|
94
90
|
const pkgSpecs = toUpdate.map((u) => `${u.pkg}@${u.latest}`);
|
|
95
91
|
const installCmd = buildInstallCmd(pm, pkgSpecs);
|
|
96
92
|
console.log(`\x1b[36m│\x1b[0m Running: \x1b[90m${installCmd}\x1b[0m`);
|
|
97
|
-
console.log(
|
|
93
|
+
console.log('\x1b[36m│\x1b[0m');
|
|
98
94
|
try {
|
|
99
|
-
execSync(installCmd, { cwd, stdio:
|
|
100
|
-
console.log(
|
|
101
|
-
console.log(
|
|
102
|
-
console.log(
|
|
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');
|
|
103
99
|
for (const u of toUpdate) {
|
|
104
|
-
console.log(` \x1b[32m✓\x1b[0m ${u.pkg}: v${u.current ??
|
|
100
|
+
console.log(` \x1b[32m✓\x1b[0m ${u.pkg}: v${u.current ?? '?'} → v${u.latest}`);
|
|
105
101
|
}
|
|
106
|
-
console.log(
|
|
102
|
+
console.log('');
|
|
107
103
|
}
|
|
108
104
|
catch (err) {
|
|
109
|
-
console.log(
|
|
105
|
+
console.log('\x1b[36m└──────────────────────────────────────────────────────────\x1b[0m');
|
|
110
106
|
console.error(`\x1b[31m✗ Update failed: ${err.message}\x1b[0m\n`);
|
|
111
107
|
process.exit(1);
|
|
112
108
|
}
|
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,66 @@
|
|
|
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('actions') ||
|
|
38
|
+
fn.includes('steps') ||
|
|
39
|
+
fn.includes('hooks') ||
|
|
40
|
+
fn.includes('spectra.config')) {
|
|
41
|
+
triggerRegen(path.join(cwd, fn), eventType);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
watcher,
|
|
46
|
+
close: () => {
|
|
47
|
+
if (debounceTimer)
|
|
48
|
+
clearTimeout(debounceTimer);
|
|
49
|
+
watcher.close();
|
|
50
|
+
},
|
|
34
51
|
};
|
|
52
|
+
}
|
|
53
|
+
export async function watchCommand(options = {}) {
|
|
54
|
+
const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
|
|
55
|
+
console.log(chalk.bold.cyan('\n🔭 TestSpectra Ambient Types Watcher'));
|
|
56
|
+
console.log(chalk.gray(`Watching workspace: ${cwd}\n`));
|
|
35
57
|
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) => {
|
|
58
|
+
const handle = startWatcher(cwd, options.debounceMs ?? 60);
|
|
59
|
+
console.log(chalk.green('✔ Initialized ambient declarations in .testspectra/types/'));
|
|
60
|
+
console.log(chalk.gray('Press Ctrl+C to stop watching.\n'));
|
|
61
|
+
handle.watcher.on('error', (err) => {
|
|
58
62
|
console.error(chalk.red(`Watcher error: ${err?.message}`));
|
|
59
63
|
});
|
|
60
|
-
console.log(chalk.gray("Press Ctrl+C to stop watching.\n"));
|
|
61
64
|
}
|
|
62
65
|
catch (err) {
|
|
63
66
|
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
|
*/
|
|
@@ -108,11 +156,6 @@ export interface AndroidConfig {
|
|
|
108
156
|
* Main activity name launched when starting the app.
|
|
109
157
|
*/
|
|
110
158
|
appActivity: string;
|
|
111
|
-
/**
|
|
112
|
-
* Whether to automatically grant Android runtime permissions upon installation.
|
|
113
|
-
* @default true
|
|
114
|
-
*/
|
|
115
|
-
autoGrantPermissions: boolean;
|
|
116
159
|
/**
|
|
117
160
|
* Whether to preserve app state and prevent clearing app data/cache between sessions.
|
|
118
161
|
* @default false
|
|
@@ -120,39 +163,47 @@ export interface AndroidConfig {
|
|
|
120
163
|
noReset: boolean;
|
|
121
164
|
/**
|
|
122
165
|
* Implicit wait timeout (in milliseconds) for locating mobile elements.
|
|
123
|
-
* @default
|
|
166
|
+
* @default 10000
|
|
124
167
|
*/
|
|
125
|
-
implicitWait: string;
|
|
168
|
+
implicitWait: string | number;
|
|
126
169
|
/**
|
|
127
170
|
* Parallelization execution mode for Android mobile tests.
|
|
128
171
|
* @default "suite"
|
|
129
172
|
*/
|
|
130
|
-
parallelizationMode:
|
|
173
|
+
parallelizationMode: 'testcase' | 'suite';
|
|
174
|
+
/**
|
|
175
|
+
* Array of explicit target devices or configurations for multi-device parallel execution.
|
|
176
|
+
* Each entry can specify its own `id`, `name`, `version`, `avd`, `systemPort`, etc.
|
|
177
|
+
*/
|
|
178
|
+
devices: (string | AndroidDeviceTarget)[] | 'auto';
|
|
179
|
+
/**
|
|
180
|
+
* Raw custom WebdriverIO / Appium capabilities array override.
|
|
181
|
+
*/
|
|
182
|
+
capabilities?: Record<string, any>[];
|
|
183
|
+
/**
|
|
184
|
+
* Maximum concurrent mobile sessions/devices cap.
|
|
185
|
+
*/
|
|
186
|
+
maxConcurrentSessions?: number | string;
|
|
187
|
+
/**
|
|
188
|
+
* Delay between consecutive actions and commands in milliseconds (slow motion).
|
|
189
|
+
* @default 0
|
|
190
|
+
*/
|
|
191
|
+
stepDelay?: number;
|
|
131
192
|
}
|
|
132
193
|
/**
|
|
133
194
|
* Configuration for iOS mobile test automation with Appium & XCUITest.
|
|
134
195
|
*/
|
|
135
196
|
export interface IosConfig {
|
|
197
|
+
/**
|
|
198
|
+
* Delay between consecutive actions and commands in milliseconds (slow motion).
|
|
199
|
+
* @default 0
|
|
200
|
+
*/
|
|
201
|
+
stepDelay?: number;
|
|
136
202
|
/**
|
|
137
203
|
* Appium server endpoint URL.
|
|
138
204
|
* @default "http://127.0.0.1:4723"
|
|
139
205
|
*/
|
|
140
206
|
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
207
|
/**
|
|
157
208
|
* Appium mobile automation driver engine for iOS.
|
|
158
209
|
* @default "XCUITest"
|
|
@@ -166,16 +217,28 @@ export interface IosConfig {
|
|
|
166
217
|
* Target device Unique Device Identifier (UDID) or `"auto"`.
|
|
167
218
|
* @default "auto"
|
|
168
219
|
*/
|
|
169
|
-
udid
|
|
220
|
+
udid?: string;
|
|
221
|
+
/**
|
|
222
|
+
* Array of explicit target devices or configurations for multi-device execution.
|
|
223
|
+
*/
|
|
224
|
+
devices: (string | IosDeviceTarget)[] | 'auto';
|
|
225
|
+
/**
|
|
226
|
+
* Raw custom WebdriverIO / Appium capabilities array override.
|
|
227
|
+
*/
|
|
228
|
+
capabilities?: Record<string, any>[];
|
|
229
|
+
/**
|
|
230
|
+
* Maximum concurrent mobile sessions/devices cap.
|
|
231
|
+
*/
|
|
232
|
+
maxConcurrentSessions?: number | string;
|
|
170
233
|
/**
|
|
171
234
|
* Apple Developer Team 10-character Organization ID for code signing.
|
|
172
235
|
*/
|
|
173
|
-
xcodeOrgId
|
|
236
|
+
xcodeOrgId?: string;
|
|
174
237
|
/**
|
|
175
238
|
* Xcode code signing identity string (e.g. `"iPhone Developer"`).
|
|
176
239
|
* @default "iPhone Developer"
|
|
177
240
|
*/
|
|
178
|
-
xcodeSigningId
|
|
241
|
+
xcodeSigningId?: string;
|
|
179
242
|
/**
|
|
180
243
|
* Whether to automatically accept iOS system permission alerts.
|
|
181
244
|
* @default true
|
|
@@ -188,14 +251,14 @@ export interface IosConfig {
|
|
|
188
251
|
noReset: boolean;
|
|
189
252
|
/**
|
|
190
253
|
* Implicit wait timeout (in milliseconds) for locating iOS UI elements.
|
|
191
|
-
* @default
|
|
254
|
+
* @default 10000
|
|
192
255
|
*/
|
|
193
|
-
implicitWait: string;
|
|
256
|
+
implicitWait: string | number;
|
|
194
257
|
/**
|
|
195
258
|
* Parallelization execution mode for iOS mobile tests.
|
|
196
259
|
* @default "suite"
|
|
197
260
|
*/
|
|
198
|
-
parallelizationMode:
|
|
261
|
+
parallelizationMode: 'testcase' | 'suite';
|
|
199
262
|
}
|
|
200
263
|
/**
|
|
201
264
|
* Load testing stage ramp-up profile.
|
|
@@ -328,9 +391,9 @@ export interface ConfigData {
|
|
|
328
391
|
/**
|
|
329
392
|
* Deep recursive partial type for user-friendly configuration objects.
|
|
330
393
|
*/
|
|
331
|
-
export type DeepPartial<T> = {
|
|
332
|
-
[
|
|
333
|
-
};
|
|
394
|
+
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 ? {
|
|
395
|
+
[K in keyof T]?: DeepPartial<T[K]>;
|
|
396
|
+
} : T;
|
|
334
397
|
/**
|
|
335
398
|
* User-provided configuration options with optional deep partial properties.
|
|
336
399
|
*/
|
|
@@ -345,7 +408,7 @@ export type UserConfig = DeepPartial<ConfigData>;
|
|
|
345
408
|
* export default defineConfig({
|
|
346
409
|
* webConfig: {
|
|
347
410
|
* baseUrl: "https://example.com",
|
|
348
|
-
*
|
|
411
|
+
* headless: false,
|
|
349
412
|
* },
|
|
350
413
|
* });
|
|
351
414
|
* ```
|