@testspectra/cli 1.0.70 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +48 -0
- package/README.md +36 -270
- package/bin/.testspectra-runner.hash +1 -0
- package/bin/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-DPfv5_EF.js +116 -0
- package/demo-app/assets/index-gIwu2EMV.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/__tests__/cloud-run.test.d.ts +1 -0
- package/dist/commands/__tests__/cloud-run.test.js +93 -0
- package/dist/commands/__tests__/doctor.test.d.ts +1 -0
- package/dist/commands/__tests__/doctor.test.js +39 -0
- package/dist/commands/__tests__/init.test.d.ts +1 -0
- package/dist/commands/__tests__/init.test.js +148 -0
- package/dist/commands/__tests__/license.test.d.ts +1 -0
- package/dist/commands/__tests__/license.test.js +13 -0
- package/dist/commands/__tests__/refactor.test.d.ts +1 -0
- package/dist/commands/__tests__/refactor.test.js +64 -0
- package/dist/commands/__tests__/run-e2e.test.d.ts +1 -0
- package/dist/commands/__tests__/run-e2e.test.js +181 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +197 -0
- package/dist/commands/__tests__/watch.test.d.ts +1 -0
- package/dist/commands/__tests__/watch.test.js +155 -0
- package/dist/commands/add.js +86 -85
- package/dist/commands/cloud-run.d.ts +11 -0
- package/dist/commands/cloud-run.js +118 -0
- package/dist/commands/demo.js +7 -7
- package/dist/commands/devices.d.ts +14 -2
- package/dist/commands/devices.js +44 -34
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.js +43 -264
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +206 -196
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.js +59 -0
- package/dist/commands/license.d.ts +4 -0
- package/dist/commands/license.js +30 -0
- package/dist/commands/refactor.d.ts +8 -0
- package/dist/commands/refactor.js +78 -0
- package/dist/commands/run.d.ts +22 -1
- package/dist/commands/run.js +252 -109
- package/dist/commands/sync-types.d.ts +4 -0
- package/dist/commands/sync-types.js +14 -0
- package/dist/commands/update.js +39 -43
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +47 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -49
- package/dist/config/schema.js +41 -34
- package/dist/generator/__tests__/tsconfig-isolation.test.d.ts +1 -0
- package/dist/generator/__tests__/tsconfig-isolation.test.js +278 -0
- package/dist/generator/__tests__/type-generator.test.d.ts +1 -0
- package/dist/generator/__tests__/type-generator.test.js +386 -0
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.js +2 -0
- package/dist/generator/tsconfig-generator.d.ts +27 -0
- package/dist/generator/tsconfig-generator.js +391 -0
- package/dist/generator/type-generator.d.ts +36 -0
- package/dist/generator/type-generator.js +644 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +124 -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/mobile/__tests__/android-device-e2e.test.d.ts +1 -0
- package/dist/mobile/__tests__/android-device-e2e.test.js +53 -0
- package/dist/mobile/__tests__/device-pool.test.d.ts +1 -0
- package/dist/mobile/__tests__/device-pool.test.js +97 -0
- package/dist/mobile/device-pool.d.ts +23 -0
- package/dist/mobile/device-pool.js +1 -0
- package/dist/mobile/index.d.ts +1 -0
- package/dist/mobile/index.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.d.ts +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +175 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +25 -0
- package/dist/refactor/refactor-engine.js +255 -0
- package/dist/reporter/__tests__/semantic-formatter.test.d.ts +1 -0
- package/dist/reporter/__tests__/semantic-formatter.test.js +73 -0
- package/dist/reporter/semantic-formatter.d.ts +6 -0
- package/dist/reporter/semantic-formatter.js +191 -0
- package/dist/reporter/summary-view.d.ts +12 -0
- package/dist/reporter/summary-view.js +19 -0
- package/dist/reporter/terminal-stream.d.ts +32 -0
- package/dist/reporter/terminal-stream.js +82 -0
- package/dist/reporter/types.d.ts +2 -0
- package/dist/reporter/types.js +1 -0
- package/dist/runner/bridge.d.ts +10 -5
- package/dist/runner/bridge.js +69 -44
- package/dist/runner/reporter.d.ts +30 -2
- package/dist/runner/reporter.js +419 -13
- package/dist/server/demo.js +43 -44
- package/dist/types/generator.d.ts +1 -17
- package/dist/types/generator.js +1 -443
- package/dist/utils/demo-server.js +38 -35
- package/package.json +20 -12
- package/templates/default/CLAUDE.md +7 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +13 -4
- package/templates/default/page-objects/MatchersPage/mobile.ts +41 -16
- package/templates/default/page-objects/MatchersPage/web.ts +14 -0
- package/templates/default/page-objects/NavigationPage/mobile.ts +10 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +27 -17
- package/templates/default/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +11 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +16 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/default/specs/ApiInterception/suite.md +9 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +7 -1
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +15 -1
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +9 -1
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +9 -1
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +27 -1
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/default/spectra.config.ts +21 -14
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +2 -2
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +2 -0
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +3 -1
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/default/tsconfig.json +3 -1
- package/templates/nx/.nx/workspace-data/d/daemon.log +168 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +7 -5
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/suite.md +9 -0
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/nx/pnpm-lock.yaml +6663 -0
- package/templates/nx/pnpm-workspace.yaml +2 -1
- package/templates/nx/shared/testing/fixtures/apiData.json +24 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +12 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +14 -0
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/nx/shared/testing/project.json +19 -0
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/nx/spectra.config.ts +19 -12
- package/templates/nx/tsconfig.json +3 -1
- package/demo-app/assets/index-DAUlrHTr.css +0 -1
- package/demo-app/assets/index-DN2Kb0A8.js +0 -100
- package/dist/index.cjs +0 -101
- package/dist/plugin.cjs +0 -575
- package/dist/plugin.d.ts +0 -16
- package/dist/plugin.js +0 -184
- package/dist/step/index.d.ts +0 -6
- package/dist/step/index.js +0 -6
- package/dist/step/matchers.d.ts +0 -14
- package/dist/step/matchers.js +0 -114
- package/dist/step/proto.d.ts +0 -46
- package/dist/step/proto.js +0 -114
- package/dist/step/runner/collection.d.ts +0 -13
- package/dist/step/runner/collection.js +0 -51
- package/dist/step/runner/single.d.ts +0 -21
- package/dist/step/runner/single.js +0 -138
- package/dist/step/spectra.d.ts +0 -34
- package/dist/step/spectra.js +0 -156
- package/dist/step/types.d.ts +0 -32
- package/dist/step/types.js +0 -5
- package/templates/default/tsconfig.spectra.android.json +0 -46
- package/templates/default/tsconfig.spectra.ios.json +0 -46
- package/templates/default/tsconfig.spectra.json +0 -22
- package/templates/default/tsconfig.spectra.web.json +0 -53
- package/templates/nx/fixtures/playgroundData.json +0 -7
- package/templates/nx/global-hooks/after/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/after/web.hook.ts +0 -3
- package/templates/nx/global-hooks/before/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/before/web.hook.ts +0 -3
- package/templates/nx/page-objects/MatchersPage/mobile.ts +0 -21
- package/templates/nx/page-objects/MatchersPage/web.ts +0 -23
- package/templates/nx/page-objects/NavigationPage/mobile.ts +0 -5
- package/templates/nx/page-objects/NavigationPage/web.ts +0 -8
- package/templates/nx/page-objects/PlaygroundPage/mobile.ts +0 -26
- package/templates/nx/page-objects/PlaygroundPage/web.ts +0 -29
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +0 -3
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +0 -12
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +0 -5
- package/templates/nx/specs/BrowserContext/suite.md +0 -9
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +0 -6
- package/templates/nx/specs/ContentMatchers/suite.md +0 -9
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +0 -5
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +0 -8
- package/templates/nx/specs/ElementMatchers/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/suite.md +0 -9
- package/templates/nx/specs/Playground/TC-0001-form-controls/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0001-form-controls/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0001-form-controls/web.test.ts +0 -6
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/web.test.ts +0 -6
- package/templates/nx/specs/Playground/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/suite.md +0 -9
- package/templates/nx/support/actions/fillCredentials/mobile.action.ts +0 -4
- package/templates/nx/support/actions/fillCredentials/web.action.ts +0 -4
- package/templates/nx/support/steps/togglePlaygroundStates/mobile.step.ts +0 -3
- package/templates/nx/support/steps/togglePlaygroundStates/step.md +0 -7
- package/templates/nx/support/steps/togglePlaygroundStates/web.step.ts +0 -5
- package/templates/nx/support/steps/verifyPlaygroundState/mobile.step.ts +0 -4
- package/templates/nx/support/steps/verifyPlaygroundState/step.md +0 -7
- package/templates/nx/support/steps/verifyPlaygroundState/web.step.ts +0 -6
- package/templates/nx/tsconfig.spectra.android.json +0 -39
- package/templates/nx/tsconfig.spectra.ios.json +0 -39
- package/templates/nx/tsconfig.spectra.json +0 -25
- package/templates/nx/tsconfig.spectra.shared.json +0 -25
- package/templates/nx/tsconfig.spectra.web.json +0 -45
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
package/dist/config/schema.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* export default defineConfig({
|
|
9
9
|
* webConfig: {
|
|
10
10
|
* baseUrl: "https://example.com",
|
|
11
|
-
*
|
|
11
|
+
* headless: false,
|
|
12
12
|
* },
|
|
13
13
|
* });
|
|
14
14
|
* ```
|
|
@@ -21,59 +21,66 @@ export function defineConfig(config) {
|
|
|
21
21
|
*/
|
|
22
22
|
export const DEFAULT_CONFIG_DATA = {
|
|
23
23
|
webConfig: {
|
|
24
|
-
baseUrl:
|
|
25
|
-
maxConcurrentSessions:
|
|
26
|
-
|
|
27
|
-
implicitWait:
|
|
28
|
-
pageLoadTimeout:
|
|
29
|
-
scriptTimeout:
|
|
30
|
-
parallelizationMode:
|
|
24
|
+
baseUrl: 'http://localhost:3000',
|
|
25
|
+
maxConcurrentSessions: '1',
|
|
26
|
+
headless: true,
|
|
27
|
+
implicitWait: '5000',
|
|
28
|
+
pageLoadTimeout: '30000',
|
|
29
|
+
scriptTimeout: '30000',
|
|
30
|
+
parallelizationMode: 'testcase',
|
|
31
31
|
},
|
|
32
32
|
browsers: [
|
|
33
33
|
{
|
|
34
|
-
id:
|
|
35
|
-
type:
|
|
34
|
+
id: 'chrome-desktop',
|
|
35
|
+
type: 'chrome',
|
|
36
36
|
mobileEmulation: false,
|
|
37
37
|
},
|
|
38
38
|
],
|
|
39
39
|
androidConfig: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
deviceName: "emulator-5554",
|
|
44
|
-
automationName: "UiAutomator2",
|
|
45
|
-
appPackage: "",
|
|
46
|
-
appActivity: "",
|
|
40
|
+
driverServer: 'http://127.0.0.1:4800',
|
|
41
|
+
appPackage: '',
|
|
42
|
+
appActivity: '',
|
|
47
43
|
autoGrantPermissions: true,
|
|
48
44
|
noReset: false,
|
|
49
|
-
implicitWait:
|
|
50
|
-
parallelizationMode:
|
|
45
|
+
implicitWait: 10000,
|
|
46
|
+
parallelizationMode: 'suite',
|
|
47
|
+
devices: [
|
|
48
|
+
{
|
|
49
|
+
id: 'emulator-5554',
|
|
50
|
+
name: 'Pixel 7 Pro Emulator',
|
|
51
|
+
version: '14.0',
|
|
52
|
+
systemPort: 8200,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
51
55
|
},
|
|
52
56
|
iosConfig: {
|
|
53
|
-
appiumServer:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
deviceName: "iPhone 14",
|
|
57
|
-
automationName: "XCUITest",
|
|
58
|
-
bundleId: "",
|
|
59
|
-
udid: "auto",
|
|
60
|
-
xcodeOrgId: "",
|
|
61
|
-
xcodeSigningId: "iPhone Developer",
|
|
57
|
+
appiumServer: 'http://127.0.0.1:4723',
|
|
58
|
+
automationName: 'XCUITest',
|
|
59
|
+
bundleId: '',
|
|
62
60
|
autoAcceptAlerts: true,
|
|
63
61
|
noReset: false,
|
|
64
|
-
implicitWait:
|
|
65
|
-
parallelizationMode:
|
|
62
|
+
implicitWait: 10000,
|
|
63
|
+
parallelizationMode: 'suite',
|
|
64
|
+
devices: [
|
|
65
|
+
{
|
|
66
|
+
id: 'iphone-15-pro',
|
|
67
|
+
name: 'iPhone 15 Pro Simulator',
|
|
68
|
+
version: '17.0',
|
|
69
|
+
udid: 'auto',
|
|
70
|
+
wdaLocalPort: 8100,
|
|
71
|
+
},
|
|
72
|
+
],
|
|
66
73
|
},
|
|
67
74
|
loadConfig: {
|
|
68
|
-
virtualUsers:
|
|
69
|
-
duration:
|
|
75
|
+
virtualUsers: '10',
|
|
76
|
+
duration: '1m',
|
|
70
77
|
},
|
|
71
78
|
loadStages: [],
|
|
72
79
|
thresholds: [],
|
|
73
80
|
executionConfig: {
|
|
74
81
|
networkMonitoringEnabled: true,
|
|
75
|
-
fastResponseTime:
|
|
76
|
-
normalResponseTime:
|
|
82
|
+
fastResponseTime: '200',
|
|
83
|
+
normalResponseTime: '1000',
|
|
77
84
|
monitoredDomains: [],
|
|
78
85
|
environmentVariables: [],
|
|
79
86
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import { TsConfigGenerator } from '../tsconfig-generator.js';
|
|
7
|
+
import { TypeGenerator } from '../type-generator.js';
|
|
8
|
+
function linkNodeModules(targetDir) {
|
|
9
|
+
let root = process.cwd();
|
|
10
|
+
while (root && root !== path.dirname(root)) {
|
|
11
|
+
if (fs.existsSync(path.join(root, 'pnpm-workspace.yaml'))) {
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
root = path.dirname(root);
|
|
15
|
+
}
|
|
16
|
+
const pnpmNodeModules = path.join(root, 'node_modules', '.pnpm', 'node_modules');
|
|
17
|
+
fs.symlinkSync(pnpmNodeModules, path.join(targetDir, 'node_modules'), 'junction');
|
|
18
|
+
}
|
|
19
|
+
describe('Platform TSConfigs & Type Isolation (docs/v2/cli/tsconfig-platform-isolation.md)', () => {
|
|
20
|
+
let tmpDir;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
tmpDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'testspectra-tsconfig-test-')));
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
try {
|
|
26
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
catch { }
|
|
29
|
+
});
|
|
30
|
+
it('scaffolds all 5 solution configurations in .testspectra/tsconfig/ and dynamic master solution orchestrator', () => {
|
|
31
|
+
const written = TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
32
|
+
expect(written['tsconfig.json']).toBeDefined();
|
|
33
|
+
expect(written['.testspectra/tsconfig.json']).toBeDefined();
|
|
34
|
+
expect(written['web.json']).toBeDefined();
|
|
35
|
+
expect(written['mobile.json']).toBeDefined();
|
|
36
|
+
expect(written['android.json']).toBeDefined();
|
|
37
|
+
expect(written['ios.json']).toBeDefined();
|
|
38
|
+
expect(written['common.json']).toBeDefined();
|
|
39
|
+
// Verify root references .testspectra/tsconfig.json
|
|
40
|
+
const rootConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, 'tsconfig.json'), 'utf-8'));
|
|
41
|
+
expect(rootConfig.references).toEqual([{ path: './.testspectra/tsconfig.json' }]);
|
|
42
|
+
// Verify dynamic master solution references all 5 platform solution tsconfigs in .testspectra/tsconfig/
|
|
43
|
+
const solutionConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig.json'), 'utf-8'));
|
|
44
|
+
expect(solutionConfig.compilerOptions.noEmit).toBe(true);
|
|
45
|
+
expect(solutionConfig.references).toEqual([
|
|
46
|
+
{ path: './tsconfig/web.json' },
|
|
47
|
+
{ path: './tsconfig/mobile.json' },
|
|
48
|
+
{ path: './tsconfig/android.json' },
|
|
49
|
+
{ path: './tsconfig/ios.json' },
|
|
50
|
+
{ path: './tsconfig/common.json' },
|
|
51
|
+
]);
|
|
52
|
+
});
|
|
53
|
+
it('verifies common tsconfig enforces strict isolation (excludes web, mobile, android, ios)', () => {
|
|
54
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
55
|
+
const commonConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig', 'common.json'), 'utf-8'));
|
|
56
|
+
expect(commonConfig.compilerOptions.composite).toBe(true);
|
|
57
|
+
expect(commonConfig.compilerOptions.noEmit).toBe(true);
|
|
58
|
+
// Includes only common.d.ts and fixtures.d.ts
|
|
59
|
+
expect(commonConfig.include).toContain('../types/common.d.ts');
|
|
60
|
+
expect(commonConfig.include).toContain('../types/fixtures.d.ts');
|
|
61
|
+
expect(commonConfig.include).not.toContain('../types/web.d.ts');
|
|
62
|
+
expect(commonConfig.include).not.toContain('../types/mobile.d.ts');
|
|
63
|
+
// Excludes platform-specific tests and page objects
|
|
64
|
+
expect(commonConfig.exclude).toContain('../../**/page-objects/**/web.ts');
|
|
65
|
+
expect(commonConfig.exclude).toContain('../../**/page-objects/**/android.ts');
|
|
66
|
+
expect(commonConfig.exclude).toContain('../../**/page-objects/**/ios.ts');
|
|
67
|
+
expect(commonConfig.exclude).toContain('../../**/page-objects/**/mobile.ts');
|
|
68
|
+
expect(commonConfig.exclude).toContain('../../**/specs/**/web.test.ts');
|
|
69
|
+
expect(commonConfig.exclude).toContain('../../**/specs/**/android.test.ts');
|
|
70
|
+
expect(commonConfig.exclude).toContain('../../**/specs/**/ios.test.ts');
|
|
71
|
+
expect(commonConfig.exclude).toContain('../../**/specs/**/mobile.test.ts');
|
|
72
|
+
});
|
|
73
|
+
it('verifies mobile tsconfig enforces strict mobile isolation (excludes web, android, ios)', () => {
|
|
74
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
75
|
+
const mobileConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig', 'mobile.json'), 'utf-8'));
|
|
76
|
+
expect(mobileConfig.compilerOptions.composite).toBe(true);
|
|
77
|
+
expect(mobileConfig.compilerOptions.noEmit).toBe(true);
|
|
78
|
+
expect(mobileConfig.include).toContain('../types/mobile.d.ts');
|
|
79
|
+
expect(mobileConfig.include).toContain('../types/fixtures.d.ts');
|
|
80
|
+
expect(mobileConfig.include).not.toContain('../types/web.d.ts');
|
|
81
|
+
expect(mobileConfig.exclude).toContain('../../**/page-objects/**/web.ts');
|
|
82
|
+
expect(mobileConfig.exclude).toContain('../../**/page-objects/**/android.ts');
|
|
83
|
+
expect(mobileConfig.exclude).toContain('../../**/page-objects/**/ios.ts');
|
|
84
|
+
expect(mobileConfig.exclude).toContain('../../**/specs/**/web.test.ts');
|
|
85
|
+
expect(mobileConfig.exclude).toContain('../../**/specs/**/android.test.ts');
|
|
86
|
+
expect(mobileConfig.exclude).toContain('../../**/specs/**/ios.test.ts');
|
|
87
|
+
});
|
|
88
|
+
it('verifies web tsconfig includes web and common, excluding android, ios, and mobile', () => {
|
|
89
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
90
|
+
const webConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig', 'web.json'), 'utf-8'));
|
|
91
|
+
expect(webConfig.compilerOptions.composite).toBe(true);
|
|
92
|
+
expect(webConfig.compilerOptions.noEmit).toBe(true);
|
|
93
|
+
expect(webConfig.include).toContain('../types/web.d.ts');
|
|
94
|
+
expect(webConfig.include).toContain('../types/fixtures.d.ts');
|
|
95
|
+
expect(webConfig.exclude).toContain('../../**/page-objects/**/android.ts');
|
|
96
|
+
expect(webConfig.exclude).toContain('../../**/page-objects/**/ios.ts');
|
|
97
|
+
expect(webConfig.exclude).toContain('../../**/page-objects/**/mobile.ts');
|
|
98
|
+
expect(webConfig.exclude).toContain('../../**/specs/**/android.test.ts');
|
|
99
|
+
expect(webConfig.exclude).toContain('../../**/specs/**/ios.test.ts');
|
|
100
|
+
expect(webConfig.exclude).toContain('../../**/specs/**/mobile.test.ts');
|
|
101
|
+
});
|
|
102
|
+
it('verifies android and ios tsconfigs isolate their respective native platforms', () => {
|
|
103
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
104
|
+
const androidConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig', 'android.json'), 'utf-8'));
|
|
105
|
+
const iosConfig = JSON.parse(fs.readFileSync(path.join(tmpDir, '.testspectra', 'tsconfig', 'ios.json'), 'utf-8'));
|
|
106
|
+
// Android excludes web and ios
|
|
107
|
+
expect(androidConfig.include).toContain('../types/android.d.ts');
|
|
108
|
+
expect(androidConfig.exclude).toContain('../../**/page-objects/**/web.ts');
|
|
109
|
+
expect(androidConfig.exclude).toContain('../../**/page-objects/**/ios.ts');
|
|
110
|
+
expect(androidConfig.exclude).toContain('../../**/specs/**/web.test.ts');
|
|
111
|
+
expect(androidConfig.exclude).toContain('../../**/specs/**/ios.test.ts');
|
|
112
|
+
// iOS excludes web and android
|
|
113
|
+
expect(iosConfig.include).toContain('../types/ios.d.ts');
|
|
114
|
+
expect(iosConfig.exclude).toContain('../../**/page-objects/**/web.ts');
|
|
115
|
+
expect(iosConfig.exclude).toContain('../../**/page-objects/**/android.ts');
|
|
116
|
+
expect(iosConfig.exclude).toContain('../../**/specs/**/web.test.ts');
|
|
117
|
+
expect(iosConfig.exclude).toContain('../../**/specs/**/android.test.ts');
|
|
118
|
+
});
|
|
119
|
+
it('E2E: compiles all 5 platform solution projects via tsc -b with 0 errors', () => {
|
|
120
|
+
// 1. Link node_modules for @wdio and @types resolution
|
|
121
|
+
linkNodeModules(tmpDir);
|
|
122
|
+
// 2. Scaffold all 7 solution configurations
|
|
123
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
124
|
+
// 3. Create Page Objects for web, android, ios, mobile, common
|
|
125
|
+
const poDir = path.join(tmpDir, 'page-objects');
|
|
126
|
+
fs.mkdirSync(path.join(poDir, 'WebPO'), { recursive: true });
|
|
127
|
+
fs.writeFileSync(path.join(poDir, 'WebPO', 'web.ts'), 'export default class WebPO { static title = "web"; }');
|
|
128
|
+
fs.mkdirSync(path.join(poDir, 'MobilePO'), { recursive: true });
|
|
129
|
+
fs.writeFileSync(path.join(poDir, 'MobilePO', 'mobile.ts'), 'export default class MobilePO { static title = "mobile"; }');
|
|
130
|
+
fs.mkdirSync(path.join(poDir, 'AndroidPO'), { recursive: true });
|
|
131
|
+
fs.writeFileSync(path.join(poDir, 'AndroidPO', 'android.ts'), 'export default class AndroidPO { static title = "android"; }');
|
|
132
|
+
fs.mkdirSync(path.join(poDir, 'IosPO'), { recursive: true });
|
|
133
|
+
fs.writeFileSync(path.join(poDir, 'IosPO', 'ios.ts'), 'export default class IosPO { static title = "ios"; }');
|
|
134
|
+
fs.mkdirSync(path.join(poDir, 'CommonPO'), { recursive: true });
|
|
135
|
+
fs.writeFileSync(path.join(poDir, 'CommonPO', 'common.ts'), 'export default class CommonPO { static title = "common"; }');
|
|
136
|
+
// 4. Generate ambient types
|
|
137
|
+
TypeGenerator.generateAll(tmpDir);
|
|
138
|
+
// 5. Create valid test files respecting each platform hierarchy
|
|
139
|
+
const specsDir = path.join(tmpDir, 'specs');
|
|
140
|
+
fs.mkdirSync(specsDir, { recursive: true });
|
|
141
|
+
fs.writeFileSync(path.join(specsDir, 'web.test.ts'), 'const a: string = WebPO.title;\nconst b: string = CommonPO.title;\n');
|
|
142
|
+
fs.writeFileSync(path.join(specsDir, 'mobile.test.ts'), 'const a: string = MobilePO.title;\nconst b: string = CommonPO.title;\n');
|
|
143
|
+
fs.writeFileSync(path.join(specsDir, 'android.test.ts'), 'const a: string = AndroidPO.title;\nconst b: string = MobilePO.title;\nconst c: string = CommonPO.title;\n');
|
|
144
|
+
fs.writeFileSync(path.join(specsDir, 'ios.test.ts'), 'const a: string = IosPO.title;\nconst b: string = MobilePO.title;\nconst c: string = CommonPO.title;\n');
|
|
145
|
+
fs.writeFileSync(path.join(specsDir, 'common.test.ts'), 'const a: string = CommonPO.title;\n');
|
|
146
|
+
// 6. Execute tsc -b: MUST compile cleanly with exit code 0
|
|
147
|
+
expect(() => {
|
|
148
|
+
execSync(`npx tsc -b ${tmpDir}`, { stdio: 'pipe' });
|
|
149
|
+
}).not.toThrow();
|
|
150
|
+
});
|
|
151
|
+
it('E2E: strictly blocks type leakage from Web into common.test.ts via tsc -b', () => {
|
|
152
|
+
linkNodeModules(tmpDir);
|
|
153
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
154
|
+
fs.mkdirSync(path.join(tmpDir, 'page-objects', 'WebPO'), { recursive: true });
|
|
155
|
+
fs.writeFileSync(path.join(tmpDir, 'page-objects', 'WebPO', 'web.ts'), 'export default class WebPO { static title = "web"; }');
|
|
156
|
+
fs.mkdirSync(path.join(tmpDir, 'page-objects', 'CommonPO'), { recursive: true });
|
|
157
|
+
fs.writeFileSync(path.join(tmpDir, 'page-objects', 'CommonPO', 'common.ts'), 'export default class CommonPO { static title = "common"; }');
|
|
158
|
+
TypeGenerator.generateAll(tmpDir);
|
|
159
|
+
const specsDir = path.join(tmpDir, 'specs');
|
|
160
|
+
fs.mkdirSync(specsDir, { recursive: true });
|
|
161
|
+
fs.writeFileSync(path.join(specsDir, 'web.test.ts'), 'const a: string = WebPO.title;\n');
|
|
162
|
+
// Deliberate type leak: common.test.ts references WebPO!
|
|
163
|
+
fs.writeFileSync(path.join(specsDir, 'common.test.ts'), 'const leak = WebPO.title;\n');
|
|
164
|
+
// tsc -b MUST fail with TS2304: Cannot find name 'WebPO'
|
|
165
|
+
let threw = false;
|
|
166
|
+
let errorMessage = '';
|
|
167
|
+
try {
|
|
168
|
+
execSync(`npx tsc -b ${tmpDir}`, { stdio: 'pipe' });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
threw = true;
|
|
172
|
+
errorMessage = (err.stdout?.toString() || '') + (err.stderr?.toString() || '');
|
|
173
|
+
}
|
|
174
|
+
expect(threw).toBe(true);
|
|
175
|
+
expect(errorMessage).toContain("Cannot find name 'WebPO'");
|
|
176
|
+
});
|
|
177
|
+
it('E2E: strictly blocks type leakage from Android into mobile.test.ts via tsc -b', () => {
|
|
178
|
+
linkNodeModules(tmpDir);
|
|
179
|
+
TsConfigGenerator.scaffoldConfigs(tmpDir);
|
|
180
|
+
fs.mkdirSync(path.join(tmpDir, 'page-objects', 'AndroidPO'), { recursive: true });
|
|
181
|
+
fs.writeFileSync(path.join(tmpDir, 'page-objects', 'AndroidPO', 'android.ts'), 'export default class AndroidPO { static title = "android"; }');
|
|
182
|
+
fs.mkdirSync(path.join(tmpDir, 'page-objects', 'MobilePO'), { recursive: true });
|
|
183
|
+
fs.writeFileSync(path.join(tmpDir, 'page-objects', 'MobilePO', 'mobile.ts'), 'export default class MobilePO { static title = "mobile"; }');
|
|
184
|
+
TypeGenerator.generateAll(tmpDir);
|
|
185
|
+
const specsDir = path.join(tmpDir, 'specs');
|
|
186
|
+
fs.mkdirSync(specsDir, { recursive: true });
|
|
187
|
+
fs.writeFileSync(path.join(specsDir, 'android.test.ts'), 'const a: string = AndroidPO.title;\n');
|
|
188
|
+
// Deliberate type leak: mobile.test.ts references AndroidPO!
|
|
189
|
+
fs.writeFileSync(path.join(specsDir, 'mobile.test.ts'), 'const leak = AndroidPO.title;\n');
|
|
190
|
+
// tsc -b MUST fail with TS2304: Cannot find name 'AndroidPO'
|
|
191
|
+
let threw = false;
|
|
192
|
+
let errorMessage = '';
|
|
193
|
+
try {
|
|
194
|
+
execSync(`npx tsc -b ${tmpDir}`, { stdio: 'pipe' });
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
threw = true;
|
|
198
|
+
errorMessage = (err.stdout?.toString() || '') + (err.stderr?.toString() || '');
|
|
199
|
+
}
|
|
200
|
+
expect(threw).toBe(true);
|
|
201
|
+
expect(errorMessage).toContain("Cannot find name 'AndroidPO'");
|
|
202
|
+
});
|
|
203
|
+
it('verifies nx monorepo template contains single root entry and .testspectra/tsconfig.json dynamic orchestrator', () => {
|
|
204
|
+
let root = process.cwd();
|
|
205
|
+
while (root && root !== path.dirname(root)) {
|
|
206
|
+
if (fs.existsSync(path.join(root, 'pnpm-workspace.yaml')))
|
|
207
|
+
break;
|
|
208
|
+
root = path.dirname(root);
|
|
209
|
+
}
|
|
210
|
+
const nxTemplateDir = path.join(root, 'cli', 'templates', 'nx');
|
|
211
|
+
// Generate latest ambient types and tsconfigs
|
|
212
|
+
TypeGenerator.generateAll(nxTemplateDir);
|
|
213
|
+
expect(fs.existsSync(path.join(nxTemplateDir, 'tsconfig.json'))).toBe(true);
|
|
214
|
+
expect(fs.existsSync(path.join(nxTemplateDir, '.testspectra', 'tsconfig.json'))).toBe(true);
|
|
215
|
+
const rootConfig = JSON.parse(fs.readFileSync(path.join(nxTemplateDir, 'tsconfig.json'), 'utf-8'));
|
|
216
|
+
expect(rootConfig.references).toEqual([{ path: './.testspectra/tsconfig.json' }]);
|
|
217
|
+
const expectedSubConfigs = ['web.json', 'mobile.json', 'android.json', 'ios.json', 'common.json'];
|
|
218
|
+
for (const sub of expectedSubConfigs) {
|
|
219
|
+
const configPath = path.join(nxTemplateDir, '.testspectra', 'tsconfig', sub);
|
|
220
|
+
expect(fs.existsSync(configPath)).toBe(true);
|
|
221
|
+
const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
222
|
+
expect(parsed.compilerOptions?.composite).toBe(true);
|
|
223
|
+
expect(parsed.compilerOptions?.noEmit).toBe(true);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
it('E2E: strictly enforces Directional Boundary between Shared library and Feature modules in monorepo via tsc -b', () => {
|
|
227
|
+
linkNodeModules(tmpDir);
|
|
228
|
+
// 1. Create Shared library
|
|
229
|
+
const sharedDir = path.join(tmpDir, 'shared', 'testing');
|
|
230
|
+
fs.mkdirSync(path.join(sharedDir, 'page-objects', 'SharedNavbar'), { recursive: true });
|
|
231
|
+
fs.writeFileSync(path.join(sharedDir, 'page-objects', 'SharedNavbar', 'web.ts'), 'export default class SharedNavbar { static navTitle = "shared-nav"; }');
|
|
232
|
+
// 2. Create Feature module: packages/auth/e2e
|
|
233
|
+
const featureDir = path.join(tmpDir, 'packages', 'auth', 'e2e');
|
|
234
|
+
fs.mkdirSync(path.join(featureDir, 'page-objects', 'AuthLoginPage'), { recursive: true });
|
|
235
|
+
fs.writeFileSync(path.join(featureDir, 'page-objects', 'AuthLoginPage', 'web.ts'), 'export default class AuthLoginPage { static loginTitle = "auth-login"; }');
|
|
236
|
+
// 3. Feature uses Shared -> Allowed!
|
|
237
|
+
fs.mkdirSync(path.join(featureDir, 'specs'), { recursive: true });
|
|
238
|
+
fs.writeFileSync(path.join(featureDir, 'specs', 'login.web.test.ts'), 'const a: string = SharedNavbar.navTitle;\nconst b: string = AuthLoginPage.loginTitle;\n');
|
|
239
|
+
// 4. Generate Scoped TSConfigs & Ambient Types
|
|
240
|
+
TypeGenerator.generateAll(tmpDir);
|
|
241
|
+
try {
|
|
242
|
+
execSync(`npx tsc -b ${tmpDir}`, { stdio: 'pipe' });
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.log('STEP 4 ERROR:', err.stdout?.toString(), err.stderr?.toString());
|
|
246
|
+
throw err;
|
|
247
|
+
}
|
|
248
|
+
// 5. Shared illegally attempts to access Feature's AuthLoginPage -> MUST FAIL with TS2304
|
|
249
|
+
fs.mkdirSync(path.join(sharedDir, 'support', 'steps'), { recursive: true });
|
|
250
|
+
fs.writeFileSync(path.join(sharedDir, 'support', 'steps', 'illegalLeak.web.ts'), 'const leak = AuthLoginPage.loginTitle;\n');
|
|
251
|
+
TypeGenerator.generateAll(tmpDir);
|
|
252
|
+
let threw = false;
|
|
253
|
+
let errorMessage = '';
|
|
254
|
+
try {
|
|
255
|
+
execSync(`npx tsc -b ${tmpDir}`, { stdio: 'pipe' });
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
threw = true;
|
|
259
|
+
errorMessage = (err.stdout?.toString() || '') + (err.stderr?.toString() || '');
|
|
260
|
+
}
|
|
261
|
+
expect(threw).toBe(true);
|
|
262
|
+
expect(errorMessage).toContain("Cannot find name 'AuthLoginPage'");
|
|
263
|
+
});
|
|
264
|
+
it('E2E: compiles the full Nx monorepo template via tsc -b with 0 errors', () => {
|
|
265
|
+
let root = process.cwd();
|
|
266
|
+
while (root && root !== path.dirname(root)) {
|
|
267
|
+
if (fs.existsSync(path.join(root, 'pnpm-workspace.yaml')))
|
|
268
|
+
break;
|
|
269
|
+
root = path.dirname(root);
|
|
270
|
+
}
|
|
271
|
+
const nxTemplateDir = path.join(root, 'cli', 'templates', 'nx');
|
|
272
|
+
// Generate latest ambient types for the nx template
|
|
273
|
+
TypeGenerator.generateAll(nxTemplateDir);
|
|
274
|
+
expect(() => {
|
|
275
|
+
execSync(`npx tsc -b ${nxTemplateDir}`, { stdio: 'pipe' });
|
|
276
|
+
}).not.toThrow();
|
|
277
|
+
});
|
|
278
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|