@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/LICENSE.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# TestSpectra Commercial Software License Agreement
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TestSpectra. All rights reserved.
|
|
4
|
+
|
|
5
|
+
IMPORTANT NOTICE: This software is NOT open-source. Although distribution archives,
|
|
6
|
+
npm packages, and editor extensions are publicly downloadable, installation,
|
|
7
|
+
execution, and use of the Software are strictly conditioned upon obtaining a valid
|
|
8
|
+
Commercial License or an authorized Evaluation/Trial License from TestSpectra.
|
|
9
|
+
|
|
10
|
+
1. GRANT OF LICENSE
|
|
11
|
+
Subject to payment of applicable license fees or an active authorized evaluation
|
|
12
|
+
period, TestSpectra grants you a non-exclusive, non-transferable, revocable license
|
|
13
|
+
to install and execute the Software solely for authoring, debugging, and executing
|
|
14
|
+
automated software tests.
|
|
15
|
+
|
|
16
|
+
2. LICENSE ACTIVATION & ENFORCEMENT
|
|
17
|
+
- Use of the Software requires activation via a valid License Key, authorized CI token,
|
|
18
|
+
or active TestSpectra Cloud account.
|
|
19
|
+
- Any attempt to circumvent, disable, modify, reverse engineer, or tamper with the
|
|
20
|
+
license verification mechanisms, cryptographic signatures, or binary checks is
|
|
21
|
+
a material breach of this Agreement and automatically terminates your license.
|
|
22
|
+
|
|
23
|
+
3. RESTRICTIONS
|
|
24
|
+
You shall not, and shall not permit any third party to:
|
|
25
|
+
- Decompile, disassemble, reverse engineer, or derive source code from the binaries,
|
|
26
|
+
compiled scripts, or libraries of the Software.
|
|
27
|
+
- Sublicense, sell, rent, lease, distribute, or host the Software as a service for third parties.
|
|
28
|
+
- Re-brand, white-label, or package the Software or any of its components as part of a
|
|
29
|
+
competing commercial QA, testing, or developer tooling product.
|
|
30
|
+
- Modify, alter, or remove any proprietary notices, copyright labels, or license headers.
|
|
31
|
+
|
|
32
|
+
4. INTELLECTUAL PROPERTY
|
|
33
|
+
The Software, including its source code, architecture, Rust core engine, algorithms,
|
|
34
|
+
matchers, extensions, interfaces, and documentation, represents valuable intellectual
|
|
35
|
+
property and trade secrets of TestSpectra.
|
|
36
|
+
|
|
37
|
+
5. TERMINATION
|
|
38
|
+
This license is effective until terminated. Your rights under this license will terminate
|
|
39
|
+
automatically without notice if you fail to comply with any of its terms, or upon expiration
|
|
40
|
+
of your active subscription or trial term. Upon termination, you must cease all use of
|
|
41
|
+
the Software and delete all copies in your possession.
|
|
42
|
+
|
|
43
|
+
6. DISCLAIMER OF WARRANTY & LIMITATION OF LIABILITY
|
|
44
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
45
|
+
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
46
|
+
PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
|
47
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
48
|
+
ARISING FROM THE USE OF OR INABILITY TO USE THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,295 +1,61 @@
|
|
|
1
|
-
# @testspectra/cli
|
|
1
|
+
# @testspectra/cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Command-line interface and development tooling layer for the TestSpectra testing framework.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 🛠️ Development Guide
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
┌──────────────────────────┐
|
|
11
|
-
│ User Test Project │
|
|
12
|
-
│ (Zero-Import TypeScript) │
|
|
13
|
-
└─────────────┬────────────┘
|
|
14
|
-
│
|
|
15
|
-
┌──────────────────────┴──────────────────────┐
|
|
16
|
-
│ │
|
|
17
|
-
▼ ▼
|
|
18
|
-
┌──────────────────────┐ ┌────────────────────────┐
|
|
19
|
-
│ spectra run / CLI │ │ Solution TSConfigs │
|
|
20
|
-
│ (CLI Orchestration) │ │ (tsconfig.*.json) │
|
|
21
|
-
└───────────┬──────────┘ └────────────┬───────────┘
|
|
22
|
-
│ │
|
|
23
|
-
│ 1. Generates Ambient .d.ts │ 2. Isolated Platform
|
|
24
|
-
│ in .testspectra/types/ │ Type Checking
|
|
25
|
-
▼ ▼
|
|
26
|
-
┌──────────────────────┐ ┌────────────────────────┐
|
|
27
|
-
│ Core Test Runner │ │ Standard IDE & tsc │
|
|
28
|
-
│ (Rust Native Bin) │ │ (VS Code, Cursor, CI) │
|
|
29
|
-
└──────────────────────┘ └────────────────────────┘
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 2. Key Architectural Pillars
|
|
35
|
-
|
|
36
|
-
### A. Zero-Import Multi-Platform Authoring
|
|
37
|
-
TestSpectra allows developers to write clean, boilerplate-free test specs, steps, actions, and page objects without manual `import` statements for globals or framework entities:
|
|
38
|
-
- **Page Objects**: `LoginPage.login(...)` and getters `LoginPage.flashAlert` resolve automatically based on target platform.
|
|
39
|
-
- **Actions (`Spectra.*`)**: Built-in 16 atomic actions (`Spectra.navigate`, `Spectra.click`, `Spectra.type`, `Spectra.select`, `Spectra.scroll`, `Spectra.swipe`, `Spectra.wait`, etc.) matching TestSpectra database schema, merged seamlessly with user-defined custom actions (`Spectra.verifyOtp`).
|
|
40
|
-
- **Direct Callable Assertions**: Instant, auto-completed assertion methods available directly on `WebdriverIO.Element`, `ChainablePromiseElement`, and `browser` (`shouldBeVisible()`, `shouldContainText()`, `shouldHaveValue()`, `shouldHaveUrl()`, etc.).
|
|
41
|
-
- **Steps**: `Step.loginUser(...)` exposes shared business step flows.
|
|
42
|
-
- **Fixtures**: `Fixture.userData` provides typed, platform-agnostic test fixture access.
|
|
43
|
-
- **WebdriverIO Globals**: `$`, `$$`, `browser`, `expect` are available globally across all platforms.
|
|
44
|
-
|
|
45
|
-
### B. Built-in Regular Actions & Direct Callable Assertions
|
|
46
|
-
|
|
47
|
-
TestSpectra provides a bundled, 100% database-schema-compatible library of built-in atomic actions and direct element assertions:
|
|
48
|
-
|
|
49
|
-
#### 1. Direct Callable Element Assertions (`should*`)
|
|
50
|
-
All Page Object elements and locators support direct callable assertions without extra nesting:
|
|
51
|
-
```typescript
|
|
52
|
-
it("should authenticate user using Page Objects and assertions", async () => {
|
|
53
|
-
// Navigation & high-level business flows
|
|
54
|
-
await LoginPage.open();
|
|
55
|
-
await Step.loginUser("tomsmith", "SuperSecretPassword!");
|
|
56
|
-
|
|
57
|
-
// Direct assertions on Page Object elements
|
|
58
|
-
await LoginPage.flashAlert.shouldBeVisible();
|
|
59
|
-
await LoginPage.flashAlert.shouldContainText("You logged into a secure area!");
|
|
60
|
-
await LoginPage.usernameInput.shouldHaveValue("tomsmith");
|
|
61
|
-
});
|
|
62
|
-
```
|
|
9
|
+
### Prerequisites
|
|
63
10
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
| **Visibility** | `await el.shouldBeVisible()` / `await el.shouldNotBeVisible()` |
|
|
68
|
-
| **DOM Existence** | `await el.shouldExist()` / `await el.shouldNotExist()` |
|
|
69
|
-
| **Element State** | `await el.shouldBeEnabled()` / `await el.shouldBeDisabled()` / `await el.shouldBeSelected()` / `await el.shouldBeChecked()` |
|
|
70
|
-
| **Text Matching** | `await el.shouldHaveText(expected)` / `await el.shouldContainText(expected)` |
|
|
71
|
-
| **Input Value** | `await el.shouldHaveValue(expected)` / `await el.shouldContainValue(expected)` |
|
|
72
|
-
| **CSS Class** | `await el.shouldHaveClass(className)` |
|
|
73
|
-
| **Attribute** | `await el.shouldHaveAttribute(name, val?)` |
|
|
74
|
-
| **Browser URL / Title**| `await browser.shouldHaveUrl(url)` / `await browser.shouldHaveTitle(title)` |
|
|
11
|
+
- [Node.js](https://nodejs.org/) (>= 18.0.0)
|
|
12
|
+
- [pnpm](https://pnpm.io/) (>= 8.0.0)
|
|
13
|
+
- [Bun](https://bun.sh/) (>= 1.0.0)
|
|
75
14
|
|
|
76
|
-
|
|
77
|
-
Available inside Page Objects, Actions, and Steps for raw element manipulation:
|
|
78
|
-
```typescript
|
|
79
|
-
// Navigation
|
|
80
|
-
await Spectra.navigate("https://example.com/login");
|
|
81
|
-
await Spectra.back();
|
|
82
|
-
await Spectra.refresh();
|
|
15
|
+
### Getting Started
|
|
83
16
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
await Spectra.select(this.countryDropdown, "ID");
|
|
88
|
-
await Spectra.clear(this.searchField);
|
|
89
|
-
await Spectra.pressKey("Enter");
|
|
17
|
+
```bash
|
|
18
|
+
# Install workspace dependencies
|
|
19
|
+
pnpm install
|
|
90
20
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
await Spectra.swipe({ direction: "up", distance: 500 });
|
|
94
|
-
await Spectra.wait(1000);
|
|
95
|
-
await Spectra.waitForElement(this.flashAlert, 5000);
|
|
96
|
-
```
|
|
21
|
+
# Build @testspectra/cli
|
|
22
|
+
pnpm --filter @testspectra/cli build
|
|
97
23
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
page-objects/
|
|
102
|
-
└── LoginPage/
|
|
103
|
-
├── web.ts # Used for Web
|
|
104
|
-
└── mobile.ts # Fallback for Android and iOS
|
|
24
|
+
# Run type check
|
|
25
|
+
pnpm --filter @testspectra/cli type-check
|
|
105
26
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
├── web.test.ts # Web spec
|
|
109
|
-
├── android.test.ts # Android spec
|
|
110
|
-
└── ios.test.ts # iOS spec
|
|
27
|
+
# Run unit tests
|
|
28
|
+
pnpm --filter @testspectra/cli test
|
|
111
29
|
```
|
|
112
30
|
|
|
113
|
-
|
|
114
|
-
- **`web`**: `web` → `common`
|
|
115
|
-
- **`android`**: `android` → `mobile` → `common`
|
|
116
|
-
- **`ios`**: `ios` → `mobile` → `common`
|
|
117
|
-
- **`mobile`**: `mobile` → `common`
|
|
118
|
-
- **`common`**: `common`
|
|
119
|
-
|
|
120
|
-
### D. Solution-Style TypeScript Configuration & Language Service Plugin
|
|
121
|
-
To avoid ambient type clashes between platforms (such as different method signatures across Web and Mobile Page Objects), TestSpectra uses standard TypeScript **Project References**:
|
|
122
|
-
- **`tsconfig.json`**: Root project reference orchestrator with `@testspectra/cli` plugin registered.
|
|
123
|
-
- **`tsconfig.web.json`**: Scoped exclusively to Web files and `.testspectra/types/web.d.ts`.
|
|
124
|
-
- **`tsconfig.android.json`**: Scoped exclusively to Android files and `.testspectra/types/android.d.ts`.
|
|
125
|
-
- **`tsconfig.ios.json`**: Scoped exclusively to iOS files and `.testspectra/types/ios.d.ts`.
|
|
126
|
-
- **`fixtures.d.ts`**: Single platform-agnostic declaration file referenced by all platform declarations.
|
|
31
|
+
### Development Watch Mode
|
|
127
32
|
|
|
128
|
-
#### Zero-Terminal Background Type Generation (TS Plugin)
|
|
129
|
-
With the built-in TypeScript Server plugin (`@testspectra/cli`), background type generation is completely automatic:
|
|
130
|
-
- When you open the project in **VS Code**, **Cursor**, or **WebStorm**, the IDE's TypeScript Server automatically boots the `@testspectra/cli` Language Service plugin.
|
|
131
|
-
- The plugin generates and updates `.testspectra/types/` ambient declarations in the background in real-time as you author Page Objects, Actions, Steps, and Fixtures.
|
|
132
|
-
|
|
133
|
-
Project verification is executed with standard `tsc`:
|
|
134
33
|
```bash
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
### E. Typed Configuration with `defineConfig`
|
|
139
|
-
Configuration is strongly typed with full JSDoc documentation via `spectra.config.ts`:
|
|
140
|
-
```typescript
|
|
141
|
-
import { defineConfig } from "@testspectra/cli";
|
|
142
|
-
|
|
143
|
-
export default defineConfig({
|
|
144
|
-
webConfig: {
|
|
145
|
-
baseUrl: "https://the-internet.herokuapp.com",
|
|
146
|
-
headlessMode: true,
|
|
147
|
-
},
|
|
148
|
-
browsers: [
|
|
149
|
-
{ id: "chrome-desktop", type: "chrome" },
|
|
150
|
-
],
|
|
151
|
-
androidConfig: {
|
|
152
|
-
platformName: "Android",
|
|
153
|
-
automationName: "UiAutomator2",
|
|
154
|
-
},
|
|
155
|
-
});
|
|
34
|
+
# Watch and rebuild on file changes
|
|
35
|
+
pnpm --filter @testspectra/cli dev
|
|
156
36
|
```
|
|
157
37
|
|
|
158
38
|
---
|
|
159
39
|
|
|
160
|
-
##
|
|
40
|
+
## 💻 CLI Commands Summary
|
|
161
41
|
|
|
162
|
-
| Command | Description
|
|
163
|
-
|
|
|
164
|
-
| `spectra init`
|
|
165
|
-
| `spectra
|
|
166
|
-
| `spectra
|
|
167
|
-
| `spectra doctor` |
|
|
168
|
-
| `spectra
|
|
42
|
+
| Command | Usage | Description |
|
|
43
|
+
| :---------------- | :------------------------------------------ | :---------------------------------------------------------------------- |
|
|
44
|
+
| `spectra init` | `spectra init [-t default\|nx]` | Scaffold a new TestSpectra project or monorepo workspace |
|
|
45
|
+
| `spectra run` | `spectra run [path] [-t web\|android\|ios]` | Execute test specs or suites |
|
|
46
|
+
| `spectra watch` | `spectra watch [-w <dir>]` | Watch workspace and generate `.testspectra/types/` declarations |
|
|
47
|
+
| `spectra doctor` | `spectra doctor [--fix] [--json]` | Diagnose local environment prerequisites (ADB, Java, Chrome, Bun, Node) |
|
|
48
|
+
| `spectra demo` | `spectra demo [-p <port>]` | Launch built-in demo web application |
|
|
49
|
+
| `spectra devices` | `spectra devices [-t <target>]` | List connected Android/iOS devices and browsers |
|
|
50
|
+
| `spectra add` | `spectra add [module]` | Add a new testing module to an existing workspace |
|
|
51
|
+
| `spectra update` | `spectra update [--check]` | Check and update TestSpectra packages |
|
|
169
52
|
|
|
170
53
|
---
|
|
171
54
|
|
|
172
|
-
##
|
|
55
|
+
## 📚 Documentation & Specifications
|
|
173
56
|
|
|
174
|
-
|
|
175
|
-
├── spectra.config.ts # Central typed project configuration
|
|
176
|
-
├── package.json # Scripts & dependencies
|
|
177
|
-
├── tsconfig.json # Root solution references
|
|
178
|
-
├── tsconfig.web.json # Web platform TypeScript scope
|
|
179
|
-
├── tsconfig.android.json # Android platform TypeScript scope
|
|
180
|
-
├── tsconfig.ios.json # iOS platform TypeScript scope
|
|
181
|
-
├── page-objects/ # Page Object Model folders
|
|
182
|
-
│ └── PlaygroundPage/
|
|
183
|
-
│ ├── web.ts
|
|
184
|
-
│ └── mobile.ts
|
|
185
|
-
├── support/
|
|
186
|
-
│ ├── actions/ # Reusable atomic actions
|
|
187
|
-
│ │ └── fillCredentials/
|
|
188
|
-
│ │ ├── web.action.ts
|
|
189
|
-
│ │ └── mobile.action.ts
|
|
190
|
-
│ └── steps/ # High-level business flows
|
|
191
|
-
│ └── verifyPlaygroundState/
|
|
192
|
-
│ ├── web.step.ts
|
|
193
|
-
│ └── mobile.step.ts
|
|
194
|
-
├── global-hooks/ # Global lifecycle hooks
|
|
195
|
-
│ └── before/
|
|
196
|
-
│ └── web.hook.ts
|
|
197
|
-
├── specs/ # Layered zero-import test cases
|
|
198
|
-
│ └── Playground/
|
|
199
|
-
│ └── TC-0001-form-controls/
|
|
200
|
-
│ ├── web.test.ts
|
|
201
|
-
│ └── mobile.test.ts
|
|
202
|
-
├── fixtures/ # Platform-agnostic test data
|
|
203
|
-
│ └── playgroundData.json
|
|
204
|
-
├── .testspectra/ # Auto-generated ambient typings & cache
|
|
205
|
-
│ └── types/
|
|
206
|
-
│ ├── fixtures.d.ts
|
|
207
|
-
│ ├── web.d.ts
|
|
208
|
-
│ ├── android.d.ts
|
|
209
|
-
│ ├── ios.d.ts
|
|
210
|
-
│ ├── mobile.d.ts
|
|
211
|
-
│ └── common.d.ts
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## 5. Enterprise Monorepo Architecture (Nx & PNPM Workspace)
|
|
217
|
-
|
|
218
|
-
TestSpectra features an enterprise-grade architecture for large monorepos: **"Centralized Configuration, Distributed Implementation"**.
|
|
219
|
-
|
|
220
|
-
```
|
|
221
|
-
┌───────────────────────────────────────────────────────────┐
|
|
222
|
-
│ Root Monorepo Directory │
|
|
223
|
-
│ │
|
|
224
|
-
│ ├── spectra.config.ts (Central Execution Config) │
|
|
225
|
-
│ ├── .testspectra/ (Central Cache, AppData, Log)│
|
|
226
|
-
│ ├── pnpm-workspace.yaml (Workspace Definition) │
|
|
227
|
-
│ ├── nx.json (Nx Target & Caching Rules) │
|
|
228
|
-
│ └── tsconfig.json (Solution References) │
|
|
229
|
-
└─────────────────────────────┬─────────────────────────────┘
|
|
230
|
-
│
|
|
231
|
-
┌──────────────────────────────┴──────────────────────────────┐
|
|
232
|
-
▼ ▼
|
|
233
|
-
┌───────────────────────────────┐ ┌───────────────────────────────┐
|
|
234
|
-
│ shared/testing/ (Library) │ │ packages/playground/e2e/ │
|
|
235
|
-
├───────────────────────────────┤ ├───────────────────────────────┤
|
|
236
|
-
│ - Shared Page Objects │ ◄─── Auto-Scanned Globals ──│ - Feature Specs (specs/) │
|
|
237
|
-
│ - Shared Steps (verifyState) │ (100% Zero-Import!) │ - Feature Page Objects (POMs) │
|
|
238
|
-
│ - Shared Actions (fillCreds) │ │ - project.json (Nx Target) │
|
|
239
|
-
│ - Shared Fixtures (playData) │ │ - tsconfig.web/android/ios │
|
|
240
|
-
└───────────────────────────────┘ └───────────────────────────────┘
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### Key Pillars of Monorepo Integration:
|
|
244
|
-
|
|
245
|
-
1. **Interactive Workspace Auto-Discovery (`spectra init`)**:
|
|
246
|
-
- Parses `pnpm-workspace.yaml` (e.g. `packages/*`, `modules/**`).
|
|
247
|
-
- Scans sub-directories for existing `project.json` or `package.json`.
|
|
248
|
-
- Prompts the user with an interactive multi-select checkbox to choose which features will receive E2E testing.
|
|
249
|
-
- Prompts for customizable E2E folder names (e.g. `e2e`, `test/e2e`) and the shared testing library path (`shared/testing`).
|
|
57
|
+
For comprehensive feature guides and technical specifications, refer to:
|
|
250
58
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
- Driver caches, binaries, and logs reside in `<root>/.testspectra/`, preventing repository clutter across individual feature folders.
|
|
255
|
-
|
|
256
|
-
3. **Global Zero-Import Consumption of Shared Library**:
|
|
257
|
-
- Entities placed inside `shared/testing/page-objects/`, `shared/testing/support/steps/`, `shared/testing/support/actions/`, and `shared/testing/fixtures/` are automatically aggregated into ambient declarations.
|
|
258
|
-
- Feature test specs consume shared Page Objects (`PlaygroundPage.open()`), steps (`Step.verifyPlaygroundState()`), actions (`Spectra.fillCredentials()`), and fixtures (`Fixture.playgroundData`) **without a single line of `import` statement**.
|
|
259
|
-
|
|
260
|
-
4. **Nx Target Execution & Affected Caching**:
|
|
261
|
-
- Each feature E2E folder includes an Nx `project.json`:
|
|
262
|
-
```json
|
|
263
|
-
{
|
|
264
|
-
"name": "playground-e2e",
|
|
265
|
-
"targets": {
|
|
266
|
-
"e2e": {
|
|
267
|
-
"executor": "nx:run-commands",
|
|
268
|
-
"options": { "command": "spectra run", "cwd": "packages/playground/e2e" },
|
|
269
|
-
"configurations": {
|
|
270
|
-
"android": { "command": "spectra run --target android" },
|
|
271
|
-
"ios": { "command": "spectra run --target ios" },
|
|
272
|
-
"headless": { "command": "spectra run --headless" }
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
```
|
|
278
|
-
- Running `nx run-many -t e2e` executes all feature test suites in parallel.
|
|
279
|
-
5. **Automatic Architecture Documentation (`ARCHITECTURE.md`)**:
|
|
280
|
-
- Every `spectra init` run produces a comprehensive, project-tailored `ARCHITECTURE.md` file in the root workspace.
|
|
281
|
-
- It documents the generated file map, exact distributed feature paths, shared library resolution, and zero-import mechanics for onboarding engineers.
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
## 6. Development & Verification
|
|
286
|
-
|
|
287
|
-
To verify the CLI and example app:
|
|
288
|
-
```bash
|
|
289
|
-
# Build CLI
|
|
290
|
-
pnpm --filter @testspectra/cli build
|
|
291
|
-
|
|
292
|
-
# Test interactive scaffolding
|
|
293
|
-
npx @testspectra/cli init
|
|
294
|
-
pnpm type-check
|
|
295
|
-
```
|
|
59
|
+
- **Feature Guides**: [`docs/v2/features/`](../docs/v2/features/)
|
|
60
|
+
- **CLI Technical Specifications**: [`docs/v2/cli/`](../docs/v2/cli/)
|
|
61
|
+
- **Master v2 Architecture**: [`docs/v2/README.md`](../docs/v2/README.md)
|
package/bin/spectra.js
CHANGED
package/bin/testspectra-runner
CHANGED
|
Binary file
|