testeranto 0.177.0 → 0.197.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/ALL_LICENSES.txt +11246 -0
- package/LICENSE +21 -0
- package/README.md +24 -4
- package/default-project.json +44 -0
- package/design-editor/DesignEditor.tsx +247 -0
- package/design-editor/index.ts +2 -0
- package/design-editor/server.ts +121 -0
- package/design-editor/types.ts +16 -0
- package/designs/default-project.json +210 -0
- package/dist/common/design-editor/DesignEditor.js +239 -0
- package/dist/common/design-editor/index.js +18 -0
- package/dist/common/design-editor/server.js +98 -0
- package/dist/common/design-editor/types.js +2 -0
- package/dist/common/src/App.js +53 -0
- package/dist/common/src/Node.js +4 -8
- package/dist/common/src/PM/PM_WithEslintAndTsc.js +10 -34
- package/dist/common/src/PM/base.js +1 -1
- package/dist/common/src/PM/main.js +581 -113
- package/dist/common/src/PM/node.js +4 -2
- package/dist/common/src/PM/nodeSidecar.js +1 -0
- package/dist/common/src/PM/pure.js +20 -57
- package/dist/common/src/PM/pureSidecar.js +1 -1
- package/dist/common/src/PM/types.js +1 -0
- package/dist/common/src/PM/web.js +7 -4
- package/dist/common/src/Pure.js +1 -1
- package/dist/common/src/Pure.test.js +49 -79
- package/dist/common/src/ReportServer.js +8 -2
- package/dist/common/src/build.js +31 -40
- package/dist/common/src/components/DesignEditorPage.js +169 -0
- package/dist/common/src/components/SunriseAnimation.js +291 -0
- package/dist/common/src/components/SunriseAnimation.test/interface.js +67 -0
- package/dist/common/src/components/SunriseAnimation.test/types.js +2 -0
- package/dist/common/src/components/TestStatusBadge.js +1 -21
- package/dist/common/src/components/pure/AppFrame.js +69 -0
- package/dist/common/src/components/pure/AppFrame.test/implementation.js +63 -0
- package/dist/common/src/components/pure/AppFrame.test/index.js +14 -0
- package/dist/common/src/components/pure/AppFrame.test/specification.js +25 -0
- package/dist/common/src/components/pure/AppFrame.test/types.js +3 -0
- package/dist/common/src/components/pure/FeaturesReporterView.js +23 -0
- package/dist/common/src/components/pure/FeaturesReporterView.test/implementation.js +84 -0
- package/dist/common/src/components/pure/FeaturesReporterView.test/index.js +14 -0
- package/dist/common/src/components/pure/FeaturesReporterView.test/specification.js +27 -0
- package/dist/common/src/components/pure/FeaturesReporterView.test/types.js +2 -0
- package/dist/common/src/components/pure/ModalContent.js +86 -0
- package/dist/common/src/components/pure/ModalContent.test/implementation.js +35 -0
- package/dist/common/src/components/pure/ModalContent.test/index.js +58 -0
- package/dist/common/src/components/pure/ModalContent.test/specification.js +19 -0
- package/dist/common/src/components/pure/ModalContent.test/types.js +4 -0
- package/dist/common/src/{NavBar.js → components/pure/NavBar.js} +9 -10
- package/dist/common/src/components/pure/ProcessManager.js +112 -0
- package/dist/common/src/components/pure/ProcessManagerView.js +237 -0
- package/dist/common/src/components/pure/ProjectPageView.js +53 -76
- package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +167 -54
- package/dist/common/src/components/pure/ProjectPageView.test/index.js +5 -1
- package/dist/common/src/components/pure/ProjectPageView.test/specification.js +15 -2
- package/dist/common/src/components/pure/ProjectPageView.test/types.js +2 -0
- package/dist/common/src/components/pure/ProjectsPageView.js +72 -0
- package/dist/common/src/components/pure/SettingsButton.js +13 -0
- package/dist/common/src/components/pure/SingleProcessView.js +214 -0
- package/dist/common/src/components/pure/TestPageView.js +513 -0
- package/dist/common/src/components/pure/TestPageView.test/implementation.js +157 -0
- package/dist/common/src/components/pure/TestPageView.test/index.js +15 -0
- package/dist/common/src/components/pure/TestPageView.test/specification.js +26 -0
- package/dist/common/src/components/pure/TestPageView.test/types.js +4 -0
- package/dist/common/src/components/pure/ThemeCard.js +15 -0
- package/dist/common/src/components/stateful/FeaturesReporter.js +59 -0
- package/dist/common/src/components/stateful/FileTree.js +40 -0
- package/dist/common/src/components/stateful/ProcessManagerPage.js +112 -0
- package/dist/common/src/components/stateful/ProjectPage.js +101 -0
- package/dist/common/src/components/stateful/ProjectsPage.js +118 -0
- package/dist/common/src/components/stateful/SettingsPage.js +72 -0
- package/dist/common/src/components/stateful/SingleProcessPage.js +147 -0
- package/dist/common/src/components/stateful/TestPage.js +229 -0
- package/dist/common/src/components/stateful/TextEditorPage.js +154 -0
- package/dist/common/src/defaultConfig.js +1 -0
- package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +3 -4
- package/dist/common/src/esbuildConfigs/web.js +1 -1
- package/dist/common/src/lib/BaseSuite.js +7 -3
- package/dist/common/src/lib/BaseSuite.test/mock.js +17 -41
- package/dist/common/src/lib/BaseSuite.test/test.js +33 -42
- package/dist/common/src/lib/Sidecar.js +1 -0
- package/dist/common/src/lib/abstractBase.js +40 -13
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +12 -12
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +15 -13
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.mock.js +28 -17
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.pure.js +2 -2
- package/dist/common/src/lib/basebuilder.js +29 -35
- package/dist/common/src/lib/classBuilder.js +5 -3
- package/dist/common/src/lib/core.js +3 -6
- package/dist/common/src/lib/core.test/MockCore.js +0 -14
- package/dist/common/src/lib/core.test/core.test.adapter.js +2 -9
- package/dist/common/src/lib/core.test/core.test.implementation.js +3 -7
- package/dist/common/src/lib/index.js +13 -14
- package/dist/common/src/lib/pmProxy.js +37 -16
- package/dist/common/src/lib/pmProxy.test/adapter.js +20 -4
- package/dist/common/src/lib/pmProxy.test/implementation.js +93 -34
- package/dist/common/src/lib/pmProxy.test/mockPMBase.js +9 -0
- package/dist/common/src/lib/pmProxy.test/specification.js +3 -0
- package/dist/common/src/mothership/index.js +5 -0
- package/dist/common/src/mothership/test.js +44 -25
- package/dist/common/src/types/features.js +34 -0
- package/dist/common/src/utils/api.js +57 -27
- package/dist/common/src/utils/featureUtils.js +29 -0
- package/dist/common/src/utils/logFiles.js +51 -0
- package/dist/common/src/utils/makePrompt.js +116 -0
- package/dist/common/src/web.html.js +2 -6
- package/dist/common/testeranto.config.js +54 -24
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/design-editor/DesignEditor.js +203 -0
- package/dist/module/design-editor/index.js +2 -0
- package/dist/module/design-editor/server.js +92 -0
- package/dist/module/design-editor/types.js +1 -0
- package/dist/module/src/App.js +19 -17
- package/dist/module/src/Node.js +4 -8
- package/dist/module/src/PM/PM_WithEslintAndTsc.js +11 -35
- package/dist/module/src/PM/base.js +1 -1
- package/dist/module/src/PM/main.js +577 -109
- package/dist/module/src/PM/node.js +4 -2
- package/dist/module/src/PM/nodeSidecar.js +1 -0
- package/dist/module/src/PM/pure.js +20 -57
- package/dist/module/src/PM/pureSidecar.js +1 -1
- package/dist/module/src/PM/types.js +1 -0
- package/dist/module/src/PM/web.js +7 -4
- package/dist/module/src/Pure.js +1 -1
- package/dist/module/src/Pure.test.js +49 -79
- package/dist/module/src/ReportServer.js +8 -2
- package/dist/module/src/build.js +26 -38
- package/dist/module/src/components/DesignEditorPage.js +132 -0
- package/dist/module/src/components/SunriseAnimation.test/interface.js +32 -1
- package/dist/module/src/components/SunriseAnimation.test/types.js +1 -0
- package/dist/module/src/components/TestStatusBadge.js +1 -21
- package/dist/module/src/components/pure/AppFrame.js +32 -0
- package/dist/module/src/components/pure/AppFrame.test/implementation.js +57 -0
- package/dist/module/src/components/pure/AppFrame.test/index.js +9 -0
- package/dist/module/src/components/pure/AppFrame.test/specification.js +21 -0
- package/dist/module/src/components/pure/AppFrame.test/types.js +2 -0
- package/dist/module/src/components/pure/FeaturesReporterView.js +16 -0
- package/dist/module/src/components/pure/FeaturesReporterView.test/implementation.js +81 -0
- package/dist/module/src/components/pure/FeaturesReporterView.test/index.js +9 -0
- package/dist/module/src/components/pure/FeaturesReporterView.test/specification.js +23 -0
- package/dist/module/src/components/pure/FeaturesReporterView.test/types.js +1 -0
- package/dist/module/src/components/pure/ModalContent.js +79 -0
- package/dist/module/src/components/pure/ModalContent.test/implementation.js +32 -0
- package/dist/module/src/components/pure/ModalContent.test/index.js +53 -0
- package/dist/module/src/components/pure/ModalContent.test/specification.js +15 -0
- package/dist/module/src/components/pure/ModalContent.test/types.js +3 -0
- package/dist/module/src/{NavBar.js → components/pure/NavBar.js} +10 -11
- package/dist/module/src/components/pure/ProcessManager.js +75 -0
- package/dist/module/src/components/pure/ProcessManagerView.js +200 -0
- package/dist/module/src/components/pure/ProjectPageView.js +54 -77
- package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +167 -54
- package/dist/module/src/components/pure/ProjectPageView.test/index.js +5 -1
- package/dist/module/src/components/pure/ProjectPageView.test/specification.js +15 -2
- package/dist/module/src/components/pure/ProjectPageView.test/types.js +2 -0
- package/dist/module/src/components/pure/ProjectsPageView.js +21 -14
- package/dist/module/src/components/pure/SettingsButton.js +6 -0
- package/dist/module/src/components/pure/SingleProcessView.js +214 -0
- package/dist/module/src/components/pure/TestPageView.js +470 -142
- package/dist/module/src/components/pure/TestPageView.test/implementation.js +121 -0
- package/dist/module/src/components/pure/TestPageView.test/index.js +10 -0
- package/dist/module/src/components/pure/TestPageView.test/specification.js +22 -0
- package/dist/module/src/components/pure/TestPageView.test/types.js +3 -0
- package/dist/module/src/components/pure/ThemeCard.js +8 -0
- package/dist/module/src/components/stateful/FeaturesReporter.js +22 -0
- package/dist/module/src/components/stateful/FileTree.js +33 -0
- package/dist/module/src/components/stateful/ProcessManagerPage.js +75 -0
- package/dist/module/src/components/stateful/ProjectPage.js +7 -6
- package/dist/module/src/components/stateful/ProjectsPage.js +32 -6
- package/dist/module/src/components/stateful/SettingsPage.js +35 -0
- package/dist/module/src/components/stateful/SingleProcessPage.js +110 -0
- package/dist/module/src/components/stateful/TestPage.js +123 -13
- package/dist/module/src/components/stateful/TextEditorPage.js +117 -0
- package/dist/module/src/defaultConfig.js +1 -0
- package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +3 -4
- package/dist/module/src/esbuildConfigs/web.js +1 -1
- package/dist/module/src/lib/BaseSuite.js +7 -3
- package/dist/module/src/lib/BaseSuite.test/mock.js +17 -41
- package/dist/module/src/lib/BaseSuite.test/test.js +33 -42
- package/dist/module/src/lib/Sidecar.js +1 -0
- package/dist/module/src/lib/abstractBase.js +40 -13
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +12 -12
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +15 -13
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.mock.js +28 -17
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.pure.js +1 -1
- package/dist/module/src/lib/basebuilder.js +29 -35
- package/dist/module/src/lib/classBuilder.js +5 -3
- package/dist/module/src/lib/core.js +3 -6
- package/dist/module/src/lib/core.test/MockCore.js +0 -14
- package/dist/module/src/lib/core.test/core.test.adapter.js +2 -9
- package/dist/module/src/lib/core.test/core.test.implementation.js +3 -7
- package/dist/module/src/lib/index.js +13 -14
- package/dist/module/src/lib/pmProxy.js +37 -16
- package/dist/module/src/lib/pmProxy.test/adapter.js +20 -4
- package/dist/module/src/lib/pmProxy.test/implementation.js +93 -34
- package/dist/module/src/lib/pmProxy.test/mockPMBase.js +9 -0
- package/dist/module/src/lib/pmProxy.test/specification.js +3 -0
- package/dist/module/src/mothership/index.js +5 -0
- package/dist/module/src/mothership/test.js +44 -25
- package/dist/module/src/types/features.js +31 -0
- package/dist/module/src/utils/api.js +56 -25
- package/dist/module/src/utils/featureUtils.js +24 -0
- package/dist/module/src/utils/logFiles.js +46 -0
- package/dist/module/src/utils/makePrompt.js +109 -0
- package/dist/module/src/web.html.js +2 -6
- package/dist/module/testeranto.config.js +54 -24
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/App.css +53 -80
- package/dist/prebuild/App.js +15520 -4397
- package/dist/prebuild/ReportServer.mjs +104 -6
- package/dist/prebuild/build.mjs +95 -108
- package/dist/prebuild/mothership/index.mjs +5 -0
- package/dist/prebuild/run.mjs +704 -221
- package/dist/types/design-editor/DesignEditor.d.ts +18 -0
- package/dist/types/design-editor/server.d.ts +1 -0
- package/dist/types/src/App.d.ts +1 -0
- package/dist/types/src/PM/index.d.ts +1 -1
- package/dist/types/src/PM/main.d.ts +37 -3
- package/dist/types/src/PM/pure.d.ts +10 -7
- package/dist/types/src/PM/web.d.ts +1 -1
- package/dist/types/src/Pure.test.d.ts +13 -1
- package/dist/types/src/Types.d.ts +1 -0
- package/dist/types/src/components/DesignEditorPage.d.ts +1 -0
- package/dist/types/src/components/SunriseAnimation.d.ts +5 -0
- package/dist/types/src/components/SunriseAnimation.test/interface.d.ts +11 -0
- package/dist/types/src/components/SunriseAnimation.test/types.d.ts +39 -0
- package/dist/types/src/components/pure/AppFrame.d.ts +11 -0
- package/dist/types/src/components/pure/AppFrame.test/implementation.d.ts +3 -0
- package/dist/types/src/components/pure/AppFrame.test/index.d.ts +5 -0
- package/dist/types/src/components/pure/AppFrame.test/specification.d.ts +3 -0
- package/dist/types/src/components/pure/AppFrame.test/types.d.ts +33 -0
- package/dist/types/src/components/pure/FeaturesReporterView.d.ts +7 -0
- package/dist/types/src/components/pure/FeaturesReporterView.test/implementation.d.ts +3 -0
- package/dist/types/src/components/pure/FeaturesReporterView.test/index.d.ts +2 -0
- package/dist/types/src/components/pure/FeaturesReporterView.test/specification.d.ts +3 -0
- package/dist/types/src/components/pure/FeaturesReporterView.test/types.d.ts +54 -0
- package/dist/types/src/components/pure/ModalContent.d.ts +7 -0
- package/dist/types/src/components/pure/ModalContent.test/implementation.d.ts +3 -0
- package/dist/types/src/components/pure/ModalContent.test/index.d.ts +3 -0
- package/dist/types/src/components/pure/ModalContent.test/specification.d.ts +3 -0
- package/dist/types/src/components/pure/ModalContent.test/types.d.ts +45 -0
- package/dist/types/src/{NavBar.d.ts → components/pure/NavBar.d.ts} +4 -0
- package/dist/types/src/components/pure/ProcessManager.d.ts +8 -0
- package/dist/types/src/components/pure/ProcessManagerView.d.ts +20 -0
- package/dist/types/src/components/pure/ProjectPageView.d.ts +7 -7
- package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +1 -2
- package/dist/types/src/components/pure/ProjectPageView.test/types.d.ts +29 -11
- package/dist/types/src/components/pure/ProjectsPageView.d.ts +29 -0
- package/dist/types/src/components/pure/SettingsButton.d.ts +2 -0
- package/dist/types/src/components/pure/SingleProcessView.d.ts +0 -0
- package/dist/types/src/components/pure/TestPageView.d.ts +15 -0
- package/dist/types/src/components/pure/TestPageView.test/implementation.d.ts +12 -0
- package/dist/types/src/components/pure/TestPageView.test/index.d.ts +3 -0
- package/dist/types/src/components/pure/TestPageView.test/specification.d.ts +11 -0
- package/dist/types/src/components/pure/TestPageView.test/types.d.ts +65 -0
- package/dist/types/src/components/pure/ThemeCard.d.ts +9 -0
- package/dist/types/src/components/stateful/FeaturesReporter.d.ts +2 -0
- package/dist/types/src/components/stateful/FileTree.d.ts +8 -0
- package/dist/types/src/components/stateful/ProcessManagerPage.d.ts +2 -0
- package/dist/types/src/components/stateful/ProjectPage.d.ts +1 -0
- package/dist/types/src/components/stateful/ProjectsPage.d.ts +1 -0
- package/dist/types/src/components/stateful/SettingsPage.d.ts +2 -0
- package/dist/types/src/components/stateful/SingleProcessPage.d.ts +2 -0
- package/dist/types/src/components/stateful/TestPage.d.ts +1 -0
- package/dist/types/src/components/stateful/TextEditorPage.d.ts +1 -0
- package/dist/types/src/lib/BaseSuite.test/mock.d.ts +3 -3
- package/dist/types/src/lib/abstractBase.d.ts +1 -1
- package/dist/types/src/lib/abstractBase.test/MockGiven.d.ts +1 -1
- package/dist/types/src/lib/baseBuilder.test/baseBuilder.test.pure.d.ts +1 -1
- package/dist/types/src/lib/basebuilder.d.ts +1 -1
- package/dist/types/src/lib/index.d.ts +8 -8
- package/dist/types/src/lib/pmProxy.test/mockPMBase.d.ts +1 -1
- package/dist/types/src/types/features.d.ts +7 -0
- package/dist/types/src/utils/api.d.ts +1 -5
- package/dist/types/src/utils/featureUtils.d.ts +6 -0
- package/dist/types/src/utils/logFiles.d.ts +71 -0
- package/dist/types/src/utils/makePrompt.d.ts +2 -0
- package/dist/types/src/web.html.d.ts +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/docs/index.md +17 -0
- package/docs/test-page-components.md +91 -0
- package/docs/testing.prompt.txt +1 -3
- package/index.d.ts +38 -13
- package/marketing.md +166 -0
- package/package.json +38 -11
- package/src/App.tsx +22 -25
- package/src/Node.ts +6 -9
- package/src/PM/PM_WithEslintAndTsc.ts +16 -97
- package/src/PM/__tests__/nodeSidecar.testeranto.ts +2 -0
- package/src/PM/base.ts +1 -3
- package/src/PM/index.ts +1 -1
- package/src/PM/main.ts +673 -128
- package/src/PM/node.ts +5 -2
- package/src/PM/nodeSidecar.ts +1 -0
- package/src/PM/pure.ts +28 -72
- package/src/PM/pureSidecar.ts +1 -1
- package/src/PM/types.ts +0 -0
- package/src/PM/web.ts +9 -4
- package/src/Pure.test.ts +66 -101
- package/src/Pure.ts +1 -1
- package/src/README.md +85 -0
- package/src/ReportServer.ts +10 -3
- package/src/Types.ts +1 -0
- package/src/app.scss +169 -0
- package/src/build.ts +33 -55
- package/src/components/DesignEditorPage.tsx +169 -0
- package/src/components/{pure/ProjectPageView.test/index.ts → SunriseAnimation.test/index.tsx} +7 -4
- package/src/components/SunriseAnimation.test/interface.ts +49 -0
- package/src/components/SunriseAnimation.test/types.ts +53 -0
- package/src/components/TestStatusBadge.tsx +2 -23
- package/src/components/pure/AppFrame.test/implementation.tsx +72 -0
- package/src/components/pure/AppFrame.test/index.tsx +22 -0
- package/src/components/pure/AppFrame.test/specification.ts +35 -0
- package/src/components/pure/AppFrame.test/types.ts +65 -0
- package/src/components/pure/AppFrame.tsx +134 -0
- package/src/components/pure/FeaturesReporterView.test/implementation.tsx +106 -0
- package/src/components/pure/FeaturesReporterView.test/index.tsx +18 -0
- package/src/components/pure/FeaturesReporterView.test/specification.ts +39 -0
- package/src/components/pure/FeaturesReporterView.test/types.ts +77 -0
- package/src/components/pure/FeaturesReporterView.tsx +37 -0
- package/src/components/pure/ModalContent.test/implementation.tsx +45 -0
- package/src/components/pure/ModalContent.test/index.tsx +67 -0
- package/src/components/pure/ModalContent.test/specification.ts +27 -0
- package/src/components/pure/ModalContent.test/types.ts +72 -0
- package/src/components/pure/ModalContent.tsx +182 -0
- package/src/{NavBar.tsx → components/pure/NavBar.tsx} +31 -15
- package/src/components/pure/ProcessManager.tsx +117 -0
- package/src/components/pure/ProcessManagerView.tsx +414 -0
- package/src/components/pure/ProjectPageView.test/implementation.tsx +186 -57
- package/src/components/pure/ProjectPageView.test/index.tsx +18 -0
- package/src/components/pure/ProjectPageView.test/specification.ts +15 -2
- package/src/components/pure/ProjectPageView.test/types.ts +57 -13
- package/src/components/pure/ProjectPageView.tsx +155 -121
- package/src/components/pure/ProjectsPageView.tsx +73 -32
- package/src/components/pure/SettingsButton.md +1 -0
- package/src/components/pure/SettingsButton.tsx +11 -0
- package/src/components/pure/SingleProcessView.tsx +235 -0
- package/src/components/pure/TestPageView.test/implementation.ts +162 -0
- package/src/components/pure/TestPageView.test/index.tsx +20 -0
- package/src/components/pure/TestPageView.test/specification.ts +58 -0
- package/src/components/pure/TestPageView.test/types.ts +92 -0
- package/src/components/pure/TestPageView.tsx +1009 -299
- package/src/components/pure/ThemeCard.tsx +34 -0
- package/src/components/stateful/FeaturesReporter.tsx +24 -0
- package/src/components/stateful/FileTree.tsx +66 -0
- package/src/components/stateful/ProcessManagerPage.tsx +108 -0
- package/src/components/stateful/ProjectPage.tsx +10 -8
- package/src/components/stateful/ProjectsPage.tsx +36 -7
- package/src/components/stateful/SettingsPage.tsx +82 -0
- package/src/components/stateful/SingleProcessPage.tsx +155 -0
- package/src/components/stateful/TestPage.tsx +147 -30
- package/src/components/stateful/TextEditorPage.tsx +170 -0
- package/src/defaultConfig.ts +1 -0
- package/src/esbuildConfigs/inputFilesPlugin.ts +3 -4
- package/src/esbuildConfigs/web.ts +2 -1
- package/src/lib/BaseSuite.test/mock.ts +21 -68
- package/src/lib/BaseSuite.test/test.ts +39 -65
- package/src/lib/BaseSuite.ts +9 -3
- package/src/lib/Sidecar.ts +2 -0
- package/src/lib/abstractBase.test/MockGiven.ts +1 -1
- package/src/lib/abstractBase.ts +47 -20
- package/src/lib/baseBuilder.test/baseBuilder.test.adapter.ts +14 -13
- package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +17 -14
- package/src/lib/baseBuilder.test/baseBuilder.test.mock.ts +27 -17
- package/src/lib/baseBuilder.test/baseBuilder.test.pure.ts +1 -1
- package/src/lib/basebuilder.ts +48 -54
- package/src/lib/classBuilder.ts +11 -10
- package/src/lib/core.test/MockCore.ts +0 -23
- package/src/lib/core.test/core.test.adapter.ts +6 -12
- package/src/lib/core.test/core.test.implementation.ts +7 -10
- package/src/lib/core.ts +5 -20
- package/src/lib/index.ts +28 -27
- package/src/lib/pmProxy.test/adapter.ts +18 -4
- package/src/lib/pmProxy.test/implementation.ts +130 -46
- package/src/lib/pmProxy.test/mockPMBase.ts +12 -1
- package/src/lib/pmProxy.test/specification.ts +11 -0
- package/src/lib/pmProxy.ts +42 -17
- package/src/lib/types.ts +2 -0
- package/src/mothership/index.ts +6 -0
- package/src/mothership/test.ts +53 -26
- package/src/style.md +2 -0
- package/src/style.scss +3 -486
- package/src/templates/frontpage.html +331 -0
- package/src/templates/frontpage.md +79 -0
- package/src/themes.scss +48 -16
- package/src/types/features.ts +38 -0
- package/src/utils/api.ts +66 -33
- package/src/utils/featureUtils.tsx +42 -0
- package/src/utils/logFiles.ts +60 -0
- package/src/utils/makePrompt.ts +149 -0
- package/src/web.html.ts +6 -6
- package/stargazers.txt +15 -0
- package/stargzers.js +68 -0
- package/testeranto/App.css +53 -80
- package/testeranto/App.js +15520 -4397
- package/testeranto/bundles/node/core/chunk-4CSH4UJE.mjs +872 -0
- package/testeranto/bundles/node/core/chunk-4JTDLQVA.mjs +253 -0
- package/testeranto/bundles/node/core/chunk-C3APFDUV.mjs +70 -0
- package/testeranto/bundles/node/core/src/lib/BaseSuite.test/node.test.mjs +295 -0
- package/testeranto/bundles/node/core/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +243 -0
- package/testeranto/bundles/node/core/src/lib/classBuilder.test/classBuilder.test.mjs +411 -0
- package/testeranto/bundles/node/core/src/lib/core.test/core.test.mjs +494 -0
- package/testeranto/bundles/node/core/src/lib/pmProxy.test/index.mjs +4755 -0
- package/testeranto/bundles/pure/core/chunk-62UVCSQC.mjs +1022 -0
- package/testeranto/bundles/pure/core/src/Pure.test.mjs +410 -0
- package/testeranto/bundles/pure/core/src/lib/BaseSuite.test/pure.test.mjs +352 -0
- package/testeranto/bundles/pure/core/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +241 -0
- package/testeranto/bundles/web/core/src/components/pure/FeaturesReporterView.test/index.html +15 -0
- package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.html +1 -5
- package/testeranto/bundles/web/core/src/components/pure/TestPageView.test/index.html +15 -0
- package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.html +15 -0
- package/testeranto/bundles/web/core/src/lib/baseBuilder.test/baseBuilder.test.web.html +15 -0
- package/testeranto/metafiles/node/core.json +2906 -0
- package/testeranto/metafiles/pure/core.json +860 -0
- package/testeranto/metafiles/web/core.json +546 -0
- package/testeranto/reports/core/config.json +103 -2
- package/testeranto/reports/core/src/Pure.test/pure/exit.log +0 -0
- package/testeranto/reports/core/src/Pure.test/pure/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/Pure.test/pure/message.txt +17 -0
- package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +14 -0
- package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +71 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/debug.log +0 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/error.log +3 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +1 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +0 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/warn.log +0 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/debug.log +0 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/error.log +3 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +1 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +0 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/warn.log +0 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/debug.log +0 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/error.log +3 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/exit.log +1 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/info.log +0 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/warn.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/exit.log +1 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/message.txt +17 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +14 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stderr.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stdout.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/tests.json +31 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/type_errors.txt +61 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/exit.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/message.txt +17 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +15 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +61 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/debug.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/error.log +3 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/exit.log +1 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/info.log +0 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/warn.log +0 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/exit.log +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +10 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/message.txt +17 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +17 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/stderr.log +0 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/stdout.log +6 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-1/butThen/artifact_test.txt +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +71 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +42 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/exit.log +0 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +10 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/message.txt +17 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +17 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +42 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/debug.log +0 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/error.log +3 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/exit.log +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/info.log +0 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/warn.log +0 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/exit.log +1 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/message.txt +17 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +17 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/stderr.log +0 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/stdout.log +619 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/tests.json +165 -0
- package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +88 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/exit.log +1 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/lint_errors.txt +21 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/message.txt +17 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/prompt.txt +19 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/stderr.log +0 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/stdout.log +0 -0
- package/testeranto/reports/core/src/lib/core.test/core.test/node/type_errors.txt +45 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +1 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +15 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +17 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +17 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +88 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +10 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/tests.json +152 -0
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +52 -0
- package/testeranto/reports/core/summary.json +74 -5
- package/testeranto/reportsweb_build_errors +546 -0
- package/testeranto.config.ts +58 -25
- package/tsc.log +378 -211
- package/tsconfig.common.json +4 -2
- package/tsconfig.json +9 -6
- package/tsconfig.module.json +3 -2
- package/tsconfig.types.json +3 -1
- package/dist/common/src/components/pure/ProjectPageView.test/adapter.js +0 -20
- package/dist/common/src/lib/dailyAnimation.js +0 -130
- package/dist/module/src/Footer.js +0 -5
- package/dist/module/src/ProjectPage.js +0 -319
- package/dist/module/src/ProjectsPage.js +0 -1
- package/dist/module/src/SettingsButton.js +0 -157
- package/dist/module/src/TestPage.js +0 -271
- package/dist/module/src/TestReport.js +0 -368
- package/dist/module/src/components/pure/ProjectPageView.test/adapter.js +0 -17
- package/dist/module/src/lib/dailyAnimation.js +0 -130
- package/dist/types/src/components/pure/ProjectPageView.test/adapter.d.ts +0 -3
- package/dist/types/testeranto.config.d.ts +0 -3
- package/docs/testing.ai.txt +0 -106
- package/docs.html +0 -572
- package/example.css +0 -351
- package/index.html +0 -284
- package/scripts/compile-docs.js +0 -140
- package/src/App.scss +0 -132
- package/src/Footer.tsx +0 -8
- package/src/Project.scss +0 -1
- package/src/ProjectPage.tsx +0 -459
- package/src/ProjectsPage.tsx +0 -1
- package/src/ReportApp.scss +0 -1
- package/src/SettingsButton.tsx +0 -268
- package/src/TestPage.tsx +0 -476
- package/src/TestReport.scss +0 -24
- package/src/TestReport.tsx +0 -411
- package/src/components/pure/ProjectPageView.test/adapter.ts +0 -21
- package/src/fonts.scss +0 -55
- package/src/lib/dailyAnimation.ts +0 -147
- package/style.css +0 -12156
- package/testeranto/bundles/node/core/metafile.json +0 -8
- package/testeranto/bundles/pure/core/metafile.json +0 -8
- package/testeranto/bundles/web/core/metafile.json +0 -15086
- package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.mjs +0 -39991
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -18
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/logs.txt +0 -59
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -2
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -27
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/suite-0/given-basicRender/then-0/butThen/happyPath.png +0 -0
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -50
- /package/dist/types/src/{lib/dailyAnimation.d.ts → PM/types.d.ts} +0 -0
package/src/PM/main.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
/* eslint-disable no-async-promise-executor */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5
|
+
|
|
5
6
|
import { ChildProcess, spawn } from "node:child_process";
|
|
6
7
|
import ansiColors from "ansi-colors";
|
|
7
8
|
import net from "net";
|
|
@@ -11,6 +12,10 @@ import path from "path";
|
|
|
11
12
|
import puppeteer, { ConsoleMessage } from "puppeteer-core";
|
|
12
13
|
import ansiC from "ansi-colors";
|
|
13
14
|
import crypto from "node:crypto";
|
|
15
|
+
import { WebSocketServer } from "ws";
|
|
16
|
+
import http from "http";
|
|
17
|
+
import url from "url";
|
|
18
|
+
import mime from "mime-types";
|
|
14
19
|
|
|
15
20
|
import {
|
|
16
21
|
IFinalResults,
|
|
@@ -37,6 +42,113 @@ const fileHashes = {};
|
|
|
37
42
|
const files: Record<string, Set<string>> = {};
|
|
38
43
|
const screenshots: Record<string, Promise<Uint8Array>[]> = {};
|
|
39
44
|
|
|
45
|
+
type LogStreams = {
|
|
46
|
+
closeAll: () => void;
|
|
47
|
+
writeExitCode: (code: number, error?: Error) => void;
|
|
48
|
+
stdout?: fs.WriteStream;
|
|
49
|
+
stderr?: fs.WriteStream;
|
|
50
|
+
info?: fs.WriteStream;
|
|
51
|
+
warn?: fs.WriteStream;
|
|
52
|
+
error?: fs.WriteStream;
|
|
53
|
+
debug?: fs.WriteStream;
|
|
54
|
+
exit: fs.WriteStream;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
function runtimeLogs(
|
|
58
|
+
runtime: IRunTime,
|
|
59
|
+
reportDest: string
|
|
60
|
+
): Record<string, fs.WriteStream> {
|
|
61
|
+
const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
if (!fs.existsSync(safeDest)) {
|
|
65
|
+
fs.mkdirSync(safeDest, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (runtime === "node") {
|
|
69
|
+
return {
|
|
70
|
+
stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
|
|
71
|
+
stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
|
|
72
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
73
|
+
};
|
|
74
|
+
} else if (runtime === "web") {
|
|
75
|
+
return {
|
|
76
|
+
info: fs.createWriteStream(`${safeDest}/info.log`),
|
|
77
|
+
warn: fs.createWriteStream(`${safeDest}/warn.log`),
|
|
78
|
+
error: fs.createWriteStream(`${safeDest}/error.log`),
|
|
79
|
+
debug: fs.createWriteStream(`${safeDest}/debug.log`),
|
|
80
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
81
|
+
};
|
|
82
|
+
} else if (runtime === "pure") {
|
|
83
|
+
return {
|
|
84
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
85
|
+
};
|
|
86
|
+
} else {
|
|
87
|
+
throw `unknown runtime: ${runtime}`;
|
|
88
|
+
}
|
|
89
|
+
} catch (e) {
|
|
90
|
+
console.error(`Failed to create log streams in ${safeDest}:`, e);
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function createLogStreams(reportDest: string, runtime: IRunTime): LogStreams {
|
|
96
|
+
// Create directory if it doesn't exist
|
|
97
|
+
if (!fs.existsSync(reportDest)) {
|
|
98
|
+
fs.mkdirSync(reportDest, { recursive: true });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const streams = runtimeLogs(runtime, reportDest);
|
|
102
|
+
|
|
103
|
+
// const streams = {
|
|
104
|
+
// exit: fs.createWriteStream(`${reportDest}/exit.log`),
|
|
105
|
+
const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
if (!fs.existsSync(safeDest)) {
|
|
109
|
+
fs.mkdirSync(safeDest, { recursive: true });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const streams = runtimeLogs(runtime, safeDest);
|
|
113
|
+
// const streams = {
|
|
114
|
+
// exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
115
|
+
// ...(runtime === "node" || runtime === "pure"
|
|
116
|
+
// ? {
|
|
117
|
+
// stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
|
|
118
|
+
// stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
|
|
119
|
+
// }
|
|
120
|
+
// : {
|
|
121
|
+
// info: fs.createWriteStream(`${safeDest}/info.log`),
|
|
122
|
+
// warn: fs.createWriteStream(`${safeDest}/warn.log`),
|
|
123
|
+
// error: fs.createWriteStream(`${safeDest}/error.log`),
|
|
124
|
+
// debug: fs.createWriteStream(`${safeDest}/debug.log`),
|
|
125
|
+
// }),
|
|
126
|
+
// };
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
...streams,
|
|
130
|
+
closeAll: () => {
|
|
131
|
+
Object.values(streams).forEach(
|
|
132
|
+
(stream) => !stream.closed && stream.close()
|
|
133
|
+
);
|
|
134
|
+
},
|
|
135
|
+
writeExitCode: (code: number, error?: Error) => {
|
|
136
|
+
if (error) {
|
|
137
|
+
streams.exit.write(`Error: ${error.message}\n`);
|
|
138
|
+
if (error.stack) {
|
|
139
|
+
streams.exit.write(`Stack Trace:\n${error.stack}\n`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
streams.exit.write(`${code}\n`);
|
|
143
|
+
},
|
|
144
|
+
exit: streams.exit,
|
|
145
|
+
};
|
|
146
|
+
} catch (e) {
|
|
147
|
+
console.error(`Failed to create log streams in ${safeDest}:`, e);
|
|
148
|
+
throw e;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
40
152
|
async function fileHash(filePath, algorithm = "md5") {
|
|
41
153
|
return new Promise<string>((resolve, reject) => {
|
|
42
154
|
const hash = crypto.createHash(algorithm);
|
|
@@ -63,12 +175,18 @@ const statusMessagePretty = (
|
|
|
63
175
|
runtime: IRunTime
|
|
64
176
|
) => {
|
|
65
177
|
if (failures === 0) {
|
|
178
|
+
console.log(ansiC.green(ansiC.inverse(`${runtime} > ${test}`)));
|
|
179
|
+
} else if (failures > 0) {
|
|
66
180
|
console.log(
|
|
67
|
-
ansiC.
|
|
181
|
+
ansiC.red(
|
|
182
|
+
ansiC.inverse(
|
|
183
|
+
`${runtime} > ${test} failed ${failures} times (exit code: ${failures})`
|
|
184
|
+
)
|
|
185
|
+
)
|
|
68
186
|
);
|
|
69
187
|
} else {
|
|
70
188
|
console.log(
|
|
71
|
-
ansiC.red(ansiC.inverse(`${runtime} > ${test}
|
|
189
|
+
ansiC.red(ansiC.inverse(`${runtime} > ${test} crashed (exit code: -1)`))
|
|
72
190
|
);
|
|
73
191
|
}
|
|
74
192
|
};
|
|
@@ -117,14 +235,34 @@ async function pollForFile(path, timeout = 2000) {
|
|
|
117
235
|
export class PM_Main extends PM_WithEslintAndTsc {
|
|
118
236
|
ports: Record<number, string>;
|
|
119
237
|
queue: string[];
|
|
238
|
+
logStreams: Record<string, ReturnType<typeof createLogStreams>> = {};
|
|
120
239
|
webMetafileWatcher: fs.FSWatcher;
|
|
121
240
|
nodeMetafileWatcher: fs.FSWatcher;
|
|
122
241
|
importMetafileWatcher: fs.FSWatcher;
|
|
123
242
|
pureSidecars: Record<number, Sidecar>;
|
|
124
243
|
nodeSidecars: Record<number, ChildProcess>;
|
|
125
244
|
webSidecars: Record<number, Page>;
|
|
245
|
+
sidecars: Record<number, any> = {};
|
|
126
246
|
launchers: Record<string, () => void>;
|
|
127
247
|
|
|
248
|
+
wss: WebSocketServer;
|
|
249
|
+
clients: Set<any> = new Set();
|
|
250
|
+
httpServer: http.Server;
|
|
251
|
+
runningProcesses: Map<string, ChildProcess> = new Map();
|
|
252
|
+
allProcesses: Map<
|
|
253
|
+
string,
|
|
254
|
+
{
|
|
255
|
+
child?: ChildProcess;
|
|
256
|
+
status: "running" | "exited" | "error";
|
|
257
|
+
exitCode?: number;
|
|
258
|
+
error?: string;
|
|
259
|
+
command: string;
|
|
260
|
+
pid?: number;
|
|
261
|
+
timestamp: string;
|
|
262
|
+
}
|
|
263
|
+
> = new Map();
|
|
264
|
+
processLogs: Map<string, string[]> = new Map();
|
|
265
|
+
|
|
128
266
|
constructor(configs: IBuiltConfig, name: string, mode: "once" | "dev") {
|
|
129
267
|
super(configs, name, mode);
|
|
130
268
|
|
|
@@ -139,6 +277,222 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
139
277
|
this.configs.ports.forEach((element) => {
|
|
140
278
|
this.ports[element] = ""; // set ports as open
|
|
141
279
|
});
|
|
280
|
+
|
|
281
|
+
// Create HTTP server
|
|
282
|
+
this.httpServer = http.createServer(this.requestHandler.bind(this));
|
|
283
|
+
|
|
284
|
+
// Start WebSocket server attached to the HTTP server
|
|
285
|
+
this.wss = new WebSocketServer({ server: this.httpServer });
|
|
286
|
+
|
|
287
|
+
this.wss.on("connection", (ws) => {
|
|
288
|
+
this.clients.add(ws);
|
|
289
|
+
console.log("Client connected");
|
|
290
|
+
|
|
291
|
+
ws.on("message", (data) => {
|
|
292
|
+
try {
|
|
293
|
+
const message = JSON.parse(data.toString());
|
|
294
|
+
if (message.type === "executeCommand") {
|
|
295
|
+
// Validate the command starts with 'aider'
|
|
296
|
+
if (message.command && message.command.trim().startsWith("aider")) {
|
|
297
|
+
console.log(`Executing command: ${message.command}`);
|
|
298
|
+
// Execute the command
|
|
299
|
+
const processId = Date.now().toString();
|
|
300
|
+
const child = spawn(message.command, {
|
|
301
|
+
shell: true,
|
|
302
|
+
cwd: process.cwd(),
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Track the process in both maps
|
|
306
|
+
this.runningProcesses.set(processId, child);
|
|
307
|
+
this.allProcesses.set(processId, {
|
|
308
|
+
child,
|
|
309
|
+
status: "running",
|
|
310
|
+
command: message.command,
|
|
311
|
+
pid: child.pid,
|
|
312
|
+
timestamp: new Date().toISOString(),
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Initialize logs for this process
|
|
316
|
+
this.processLogs.set(processId, []);
|
|
317
|
+
|
|
318
|
+
// Broadcast process started
|
|
319
|
+
this.broadcast({
|
|
320
|
+
type: "processStarted",
|
|
321
|
+
processId,
|
|
322
|
+
command: message.command,
|
|
323
|
+
timestamp: new Date().toISOString(),
|
|
324
|
+
logs: [],
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// Capture stdout and stderr
|
|
328
|
+
child.stdout?.on("data", (data) => {
|
|
329
|
+
const logData = data.toString();
|
|
330
|
+
// Add to stored logs
|
|
331
|
+
const logs = this.processLogs.get(processId) || [];
|
|
332
|
+
logs.push(logData);
|
|
333
|
+
this.processLogs.set(processId, logs);
|
|
334
|
+
|
|
335
|
+
this.broadcast({
|
|
336
|
+
type: "processStdout",
|
|
337
|
+
processId,
|
|
338
|
+
data: logData,
|
|
339
|
+
timestamp: new Date().toISOString(),
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
child.stderr?.on("data", (data) => {
|
|
344
|
+
const logData = data.toString();
|
|
345
|
+
// Add to stored logs
|
|
346
|
+
const logs = this.processLogs.get(processId) || [];
|
|
347
|
+
logs.push(logData);
|
|
348
|
+
this.processLogs.set(processId, logs);
|
|
349
|
+
|
|
350
|
+
this.broadcast({
|
|
351
|
+
type: "processStderr",
|
|
352
|
+
processId,
|
|
353
|
+
data: logData,
|
|
354
|
+
timestamp: new Date().toISOString(),
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
child.on("error", (error) => {
|
|
359
|
+
console.error(`Failed to execute command: ${error}`);
|
|
360
|
+
this.runningProcesses.delete(processId);
|
|
361
|
+
// Update the process status to error
|
|
362
|
+
const processInfo = this.allProcesses.get(processId);
|
|
363
|
+
if (processInfo) {
|
|
364
|
+
this.allProcesses.set(processId, {
|
|
365
|
+
...processInfo,
|
|
366
|
+
status: "error",
|
|
367
|
+
error: error.message,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
this.broadcast({
|
|
371
|
+
type: "processError",
|
|
372
|
+
processId,
|
|
373
|
+
error: error.message,
|
|
374
|
+
timestamp: new Date().toISOString(),
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
child.on("exit", (code) => {
|
|
379
|
+
console.log(`Command exited with code ${code}`);
|
|
380
|
+
// Remove from running processes but keep in allProcesses
|
|
381
|
+
this.runningProcesses.delete(processId);
|
|
382
|
+
// Update the process status to exited
|
|
383
|
+
const processInfo = this.allProcesses.get(processId);
|
|
384
|
+
if (processInfo) {
|
|
385
|
+
this.allProcesses.set(processId, {
|
|
386
|
+
...processInfo,
|
|
387
|
+
status: "exited",
|
|
388
|
+
exitCode: code,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
this.broadcast({
|
|
392
|
+
type: "processExited",
|
|
393
|
+
processId,
|
|
394
|
+
exitCode: code,
|
|
395
|
+
timestamp: new Date().toISOString(),
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
} else {
|
|
399
|
+
console.error('Invalid command: must start with "aider"');
|
|
400
|
+
}
|
|
401
|
+
} else if (message.type === "getRunningProcesses") {
|
|
402
|
+
// Send list of all processes (both running and completed) with their full logs
|
|
403
|
+
const processes = Array.from(this.allProcesses.entries()).map(
|
|
404
|
+
([id, procInfo]) => ({
|
|
405
|
+
processId: id,
|
|
406
|
+
command: procInfo.command,
|
|
407
|
+
pid: procInfo.pid,
|
|
408
|
+
status: procInfo.status,
|
|
409
|
+
exitCode: procInfo.exitCode,
|
|
410
|
+
error: procInfo.error,
|
|
411
|
+
timestamp: procInfo.timestamp,
|
|
412
|
+
logs: this.processLogs.get(id) || [],
|
|
413
|
+
})
|
|
414
|
+
);
|
|
415
|
+
ws.send(
|
|
416
|
+
JSON.stringify({
|
|
417
|
+
type: "runningProcesses",
|
|
418
|
+
processes,
|
|
419
|
+
})
|
|
420
|
+
);
|
|
421
|
+
} else if (message.type === "getProcess") {
|
|
422
|
+
// Send specific process with full logs
|
|
423
|
+
const processId = message.processId;
|
|
424
|
+
const procInfo = this.allProcesses.get(processId);
|
|
425
|
+
if (procInfo) {
|
|
426
|
+
ws.send(
|
|
427
|
+
JSON.stringify({
|
|
428
|
+
type: "processData",
|
|
429
|
+
processId,
|
|
430
|
+
command: procInfo.command,
|
|
431
|
+
pid: procInfo.pid,
|
|
432
|
+
status: procInfo.status,
|
|
433
|
+
exitCode: procInfo.exitCode,
|
|
434
|
+
error: procInfo.error,
|
|
435
|
+
timestamp: procInfo.timestamp,
|
|
436
|
+
logs: this.processLogs.get(processId) || [],
|
|
437
|
+
})
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
} else if (message.type === "stdin") {
|
|
441
|
+
// Handle stdin input for a process
|
|
442
|
+
const processId = message.processId;
|
|
443
|
+
const data = message.data;
|
|
444
|
+
console.log("Received stdin for process", processId, ":", data);
|
|
445
|
+
const childProcess = this.runningProcesses.get(processId);
|
|
446
|
+
|
|
447
|
+
if (childProcess && childProcess.stdin) {
|
|
448
|
+
console.log("Writing to process stdin");
|
|
449
|
+
childProcess.stdin.write(data);
|
|
450
|
+
} else {
|
|
451
|
+
console.log(
|
|
452
|
+
"Cannot write to stdin - process not found or no stdin:",
|
|
453
|
+
{
|
|
454
|
+
processExists: !!childProcess,
|
|
455
|
+
stdinExists: childProcess?.stdin ? true : false,
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
} else if (message.type === "killProcess") {
|
|
460
|
+
// Handle killing a process
|
|
461
|
+
const processId = message.processId;
|
|
462
|
+
console.log("Received killProcess for process", processId);
|
|
463
|
+
const childProcess = this.runningProcesses.get(processId);
|
|
464
|
+
|
|
465
|
+
if (childProcess) {
|
|
466
|
+
console.log("Killing process");
|
|
467
|
+
childProcess.kill("SIGTERM");
|
|
468
|
+
// The process exit handler will update the status and broadcast the change
|
|
469
|
+
} else {
|
|
470
|
+
console.log("Cannot kill process - process not found:", {
|
|
471
|
+
processExists: !!childProcess,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
} catch (error) {
|
|
476
|
+
console.error("Error handling WebSocket message:", error);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
ws.on("close", () => {
|
|
481
|
+
this.clients.delete(ws);
|
|
482
|
+
console.log("Client disconnected");
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
ws.on("error", (error) => {
|
|
486
|
+
console.error("WebSocket error:", error);
|
|
487
|
+
this.clients.delete(ws);
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
// Start HTTP server
|
|
492
|
+
const httpPort = Number(process.env.HTTP_PORT) || 3000;
|
|
493
|
+
this.httpServer.listen(httpPort, () => {
|
|
494
|
+
console.log(`HTTP server running on http://localhost:${httpPort}`);
|
|
495
|
+
});
|
|
142
496
|
}
|
|
143
497
|
|
|
144
498
|
async stopSideCar(uid: number): Promise<any> {
|
|
@@ -243,17 +597,18 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
243
597
|
waitForInitialPage: false,
|
|
244
598
|
executablePath,
|
|
245
599
|
headless: true,
|
|
600
|
+
defaultViewport: null, // Disable default 800x600 viewport
|
|
246
601
|
dumpio: false,
|
|
247
602
|
devtools: false,
|
|
248
603
|
|
|
249
604
|
args: [
|
|
250
|
-
"--disable-features=site-per-process",
|
|
251
605
|
"--allow-file-access-from-files",
|
|
252
606
|
"--allow-insecure-localhost",
|
|
253
607
|
"--allow-running-insecure-content",
|
|
254
608
|
"--auto-open-devtools-for-tabs",
|
|
255
609
|
"--disable-dev-shm-usage",
|
|
256
610
|
"--disable-extensions",
|
|
611
|
+
"--disable-features=site-per-process",
|
|
257
612
|
"--disable-gpu",
|
|
258
613
|
"--disable-setuid-sandbox",
|
|
259
614
|
"--disable-site-isolation-trials",
|
|
@@ -263,6 +618,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
263
618
|
"--no-startup-window",
|
|
264
619
|
"--reduce-security-for-testing",
|
|
265
620
|
"--remote-allow-origins=*",
|
|
621
|
+
"--start-maximized",
|
|
266
622
|
"--unsafely-treat-insecure-origin-as-secure=*",
|
|
267
623
|
`--remote-debugging-port=3234`,
|
|
268
624
|
// "--disable-features=IsolateOrigins,site-per-process",
|
|
@@ -320,7 +676,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
320
676
|
IRunTime,
|
|
321
677
|
(f: fs.FSWatcher) => void
|
|
322
678
|
]) => {
|
|
323
|
-
const metafile = `./testeranto/
|
|
679
|
+
const metafile = `./testeranto/metafiles/${runtime}/${this.name}.json`;
|
|
324
680
|
|
|
325
681
|
await pollForFile(metafile);
|
|
326
682
|
|
|
@@ -404,6 +760,26 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
404
760
|
this.nodeMetafileWatcher.close();
|
|
405
761
|
this.webMetafileWatcher.close();
|
|
406
762
|
this.importMetafileWatcher.close();
|
|
763
|
+
|
|
764
|
+
// Close any remaining log streams
|
|
765
|
+
Object.values(this.logStreams || {}).forEach((logs) => logs.closeAll());
|
|
766
|
+
|
|
767
|
+
// Close WebSocket server
|
|
768
|
+
this.wss.close(() => {
|
|
769
|
+
console.log("WebSocket server closed");
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
// Close all client connections
|
|
773
|
+
this.clients.forEach((client) => {
|
|
774
|
+
client.terminate();
|
|
775
|
+
});
|
|
776
|
+
this.clients.clear();
|
|
777
|
+
|
|
778
|
+
// Close HTTP server
|
|
779
|
+
this.httpServer.close(() => {
|
|
780
|
+
console.log("HTTP server closed");
|
|
781
|
+
});
|
|
782
|
+
|
|
407
783
|
this.checkForShutdown();
|
|
408
784
|
}
|
|
409
785
|
|
|
@@ -425,9 +801,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
425
801
|
async metafileOutputs(platform: IRunTime) {
|
|
426
802
|
const metafile = JSON.parse(
|
|
427
803
|
fs
|
|
428
|
-
.readFileSync(
|
|
429
|
-
`./testeranto/bundles/${platform}/${this.name}/metafile.json`
|
|
430
|
-
)
|
|
804
|
+
.readFileSync(`./testeranto/metafiles/${platform}/${this.name}.json`)
|
|
431
805
|
.toString()
|
|
432
806
|
).metafile;
|
|
433
807
|
|
|
@@ -533,7 +907,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
533
907
|
});
|
|
534
908
|
} else {
|
|
535
909
|
this.queue.push(src);
|
|
536
|
-
return;
|
|
910
|
+
return [Math.random(), argz];
|
|
537
911
|
}
|
|
538
912
|
} else {
|
|
539
913
|
console.error("negative port makes no sense", src);
|
|
@@ -571,8 +945,24 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
571
945
|
// })
|
|
572
946
|
// );
|
|
573
947
|
|
|
948
|
+
const logs = createLogStreams(reportDest, "pure");
|
|
949
|
+
|
|
574
950
|
try {
|
|
575
951
|
await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
952
|
+
// Override console methods to redirect logs
|
|
953
|
+
// Only override stdout/stderr methods for pure runtime
|
|
954
|
+
const originalConsole = { ...console };
|
|
955
|
+
|
|
956
|
+
// console.log = (...args) => {
|
|
957
|
+
// logs.stdout.write(args.join(" ") + "\n");
|
|
958
|
+
// originalConsole.log(...args);
|
|
959
|
+
// };
|
|
960
|
+
|
|
961
|
+
// console.error = (...args) => {
|
|
962
|
+
// logs.stderr.write(args.join(" ") + "\n");
|
|
963
|
+
// originalConsole.error(...args);
|
|
964
|
+
// };
|
|
965
|
+
|
|
576
966
|
return module.default
|
|
577
967
|
.then((defaultModule) => {
|
|
578
968
|
defaultModule
|
|
@@ -586,7 +976,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
586
976
|
})
|
|
587
977
|
.catch((e1) => {
|
|
588
978
|
console.log(
|
|
589
|
-
ansiC.red(`launchPure - ${src} errored with: ${e1}`)
|
|
979
|
+
ansiC.red(`launchPure - ${src} errored with: ${e1.stack}`)
|
|
590
980
|
);
|
|
591
981
|
this.bddTestIsNowDone(src, -1);
|
|
592
982
|
statusMessagePretty(-1, src, "pure");
|
|
@@ -598,11 +988,12 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
598
988
|
.catch((e2) => {
|
|
599
989
|
console.log(
|
|
600
990
|
ansiColors.red(
|
|
601
|
-
`pure ! ${src} failed to execute. No "tests.json" file was generated. Check
|
|
991
|
+
`pure ! ${src} failed to execute. No "tests.json" file was generated. Check the logs for more info`
|
|
602
992
|
)
|
|
603
993
|
);
|
|
604
994
|
|
|
605
|
-
|
|
995
|
+
logs.exit.write(e2.stack);
|
|
996
|
+
logs.exit.write(-1);
|
|
606
997
|
this.bddTestIsNowDone(src, -1);
|
|
607
998
|
statusMessagePretty(-1, src, "pure");
|
|
608
999
|
// console.error(e);
|
|
@@ -616,17 +1007,19 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
616
1007
|
});
|
|
617
1008
|
});
|
|
618
1009
|
} catch (e3) {
|
|
1010
|
+
logs.writeExitCode(-1, e3);
|
|
619
1011
|
console.log(
|
|
620
1012
|
ansiC.red(
|
|
621
1013
|
ansiC.inverse(
|
|
622
|
-
`${src} 1 errored with: ${e3}. Check
|
|
1014
|
+
`${src} 1 errored with: ${e3}. Check logs for more info`
|
|
623
1015
|
)
|
|
624
1016
|
)
|
|
625
1017
|
);
|
|
626
|
-
|
|
1018
|
+
|
|
1019
|
+
logs.exit.write(e3.stack);
|
|
1020
|
+
logs.exit.write(-1);
|
|
627
1021
|
this.bddTestIsNowDone(src, -1);
|
|
628
1022
|
statusMessagePretty(-1, src, "pure");
|
|
629
|
-
console.log("III) PURE IS EXITING BADLY WITH error", e3);
|
|
630
1023
|
}
|
|
631
1024
|
|
|
632
1025
|
for (let i = 0; i <= portsToUse.length; i++) {
|
|
@@ -644,7 +1037,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
644
1037
|
.split(".")
|
|
645
1038
|
.slice(0, -1)
|
|
646
1039
|
.join(".")}/node`;
|
|
647
|
-
|
|
648
1040
|
if (!fs.existsSync(reportDest)) {
|
|
649
1041
|
fs.mkdirSync(reportDest, { recursive: true });
|
|
650
1042
|
}
|
|
@@ -683,7 +1075,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
683
1075
|
|
|
684
1076
|
if (openPorts.length >= testConfigResource.ports) {
|
|
685
1077
|
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
686
|
-
portsToUse.push(openPorts[i][0]);
|
|
1078
|
+
portsToUse.push(openPorts[i][0]); // Convert string port to number
|
|
687
1079
|
|
|
688
1080
|
this.ports[openPorts[i][0]] = src; // port is now claimed
|
|
689
1081
|
}
|
|
@@ -702,7 +1094,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
702
1094
|
)
|
|
703
1095
|
);
|
|
704
1096
|
this.queue.push(src);
|
|
705
|
-
return;
|
|
1097
|
+
return [Math.random(), argz]; // Add this return
|
|
706
1098
|
}
|
|
707
1099
|
} else {
|
|
708
1100
|
console.error("negative port makes no sense", src);
|
|
@@ -775,52 +1167,50 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
775
1167
|
});
|
|
776
1168
|
});
|
|
777
1169
|
|
|
778
|
-
const
|
|
779
|
-
|
|
780
|
-
const errFile = `${reportDest}/logs.txt`;
|
|
781
|
-
|
|
782
|
-
if (fs.existsSync(errFile)) {
|
|
783
|
-
fs.rmSync(errFile);
|
|
784
|
-
}
|
|
1170
|
+
const logs = createLogStreams(reportDest, "node");
|
|
785
1171
|
|
|
786
1172
|
server.listen(ipcfile, () => {
|
|
787
|
-
|
|
788
|
-
oStream.write(`stderr > ${data}`);
|
|
789
|
-
});
|
|
1173
|
+
// Only handle stdout/stderr for node runtime
|
|
790
1174
|
child.stdout?.on("data", (data) => {
|
|
791
|
-
|
|
1175
|
+
logs.stdout?.write(data); // Add null check
|
|
1176
|
+
});
|
|
1177
|
+
|
|
1178
|
+
child.stderr?.on("data", (data) => {
|
|
1179
|
+
logs.stderr?.write(data); // Add null check
|
|
792
1180
|
});
|
|
793
1181
|
child.on("error", (err) => {});
|
|
794
1182
|
child.on("close", (code) => {
|
|
795
|
-
|
|
1183
|
+
const exitCode = code === null ? -1 : code;
|
|
1184
|
+
if (exitCode < 0) {
|
|
1185
|
+
logs.writeExitCode(
|
|
1186
|
+
exitCode,
|
|
1187
|
+
new Error("Process crashed or was terminated")
|
|
1188
|
+
);
|
|
1189
|
+
} else {
|
|
1190
|
+
logs.writeExitCode(exitCode);
|
|
1191
|
+
}
|
|
1192
|
+
logs.closeAll();
|
|
796
1193
|
server.close();
|
|
797
1194
|
|
|
798
1195
|
if (!files[src]) {
|
|
799
1196
|
files[src] = new Set();
|
|
800
1197
|
}
|
|
801
|
-
// files[src].add(filepath);
|
|
802
|
-
|
|
803
|
-
// fs.writeFileSync(
|
|
804
|
-
// reportDest + "/manifest.json",
|
|
805
|
-
// JSON.stringify(Array.from(files[src]))
|
|
806
|
-
// );
|
|
807
1198
|
|
|
808
|
-
if (
|
|
1199
|
+
if (exitCode === 255) {
|
|
809
1200
|
console.log(
|
|
810
1201
|
ansiColors.red(
|
|
811
|
-
`node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/
|
|
1202
|
+
`node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/stderr.log for more info`
|
|
812
1203
|
)
|
|
813
1204
|
);
|
|
814
1205
|
this.bddTestIsNowDone(src, -1);
|
|
815
1206
|
statusMessagePretty(-1, src, "node");
|
|
816
|
-
oStream.close();
|
|
817
1207
|
return;
|
|
818
|
-
} else if (
|
|
1208
|
+
} else if (exitCode === 0) {
|
|
819
1209
|
this.bddTestIsNowDone(src, 0);
|
|
820
1210
|
statusMessagePretty(0, src, "node");
|
|
821
1211
|
} else {
|
|
822
|
-
this.bddTestIsNowDone(src,
|
|
823
|
-
statusMessagePretty(
|
|
1212
|
+
this.bddTestIsNowDone(src, exitCode);
|
|
1213
|
+
statusMessagePretty(exitCode, src, "node");
|
|
824
1214
|
}
|
|
825
1215
|
|
|
826
1216
|
haltReturns = true;
|
|
@@ -842,11 +1232,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
842
1232
|
console.log(
|
|
843
1233
|
ansiC.red(
|
|
844
1234
|
ansiC.inverse(
|
|
845
|
-
`${src} errored with: ${e.name}. Check
|
|
1235
|
+
`${src} errored with: ${e.name}. Check error logs for more info`
|
|
846
1236
|
)
|
|
847
1237
|
)
|
|
848
1238
|
);
|
|
849
|
-
this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
|
|
850
1239
|
this.bddTestIsNowDone(src, -1);
|
|
851
1240
|
statusMessagePretty(-1, src, "node");
|
|
852
1241
|
});
|
|
@@ -855,7 +1244,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
855
1244
|
|
|
856
1245
|
launchWebSideCar = async (
|
|
857
1246
|
testConfig: ITestTypes
|
|
858
|
-
): Promise<[number,
|
|
1247
|
+
): Promise<[number, Page]> => {
|
|
859
1248
|
const src = testConfig[0];
|
|
860
1249
|
const dest = src.split(".").slice(0, -1).join(".");
|
|
861
1250
|
// const d = dest + ".mjs";
|
|
@@ -864,10 +1253,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
864
1253
|
|
|
865
1254
|
console.log(ansiC.green(ansiC.inverse(`launchWebSideCar ${src}`)));
|
|
866
1255
|
|
|
867
|
-
const fileStreams2: fs.WriteStream[] = [];
|
|
868
|
-
const doneFileStream2: Promise<any>[] = [];
|
|
1256
|
+
// const fileStreams2: fs.WriteStream[] = [];
|
|
1257
|
+
// const doneFileStream2: Promise<any>[] = [];
|
|
869
1258
|
|
|
870
|
-
const
|
|
1259
|
+
const logs = createLogStreams(dest, "web");
|
|
871
1260
|
|
|
872
1261
|
return new Promise((res, rej) => {
|
|
873
1262
|
this.browser
|
|
@@ -893,40 +1282,43 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
893
1282
|
Promise.all(screenshots[src] || []).then(() => {
|
|
894
1283
|
delete screenshots[src];
|
|
895
1284
|
page.close();
|
|
896
|
-
oStream.close();
|
|
897
1285
|
});
|
|
898
1286
|
};
|
|
899
1287
|
|
|
900
1288
|
page.on("pageerror", (err: Error) => {
|
|
901
1289
|
console.debug(`Error from ${src}: [${err.name}] `);
|
|
902
|
-
|
|
903
|
-
oStream.write("\n");
|
|
904
|
-
|
|
1290
|
+
console.debug(`Error from ${src}: [${err.name}] `);
|
|
905
1291
|
if (err.cause) {
|
|
906
1292
|
console.debug(`Error from ${src} cause: [${err.cause}] `);
|
|
907
|
-
oStream.write(err.cause);
|
|
908
|
-
oStream.write("\n");
|
|
909
1293
|
}
|
|
910
|
-
|
|
911
1294
|
if (err.stack) {
|
|
912
1295
|
console.debug(`Error from stack ${src}: [${err.stack}] `);
|
|
913
|
-
oStream.write(err.stack);
|
|
914
|
-
oStream.write("\n");
|
|
915
1296
|
}
|
|
916
|
-
|
|
917
1297
|
console.debug(`Error from message ${src}: [${err.message}] `);
|
|
918
|
-
oStream.write(err.message);
|
|
919
|
-
oStream.write("\n");
|
|
920
|
-
|
|
921
1298
|
this.bddTestIsNowDone(src, -1);
|
|
922
1299
|
close();
|
|
923
1300
|
});
|
|
924
1301
|
|
|
925
1302
|
page.on("console", (log: ConsoleMessage) => {
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
1303
|
+
const msg = `${log.text()}\n${JSON.stringify(
|
|
1304
|
+
log.location()
|
|
1305
|
+
)}\n${JSON.stringify(log.stackTrace())}\n`;
|
|
1306
|
+
switch (log.type()) {
|
|
1307
|
+
case "info":
|
|
1308
|
+
logs.info?.write(msg);
|
|
1309
|
+
break;
|
|
1310
|
+
case "warn":
|
|
1311
|
+
logs.warn?.write(msg);
|
|
1312
|
+
break;
|
|
1313
|
+
case "error":
|
|
1314
|
+
logs.error?.write(msg);
|
|
1315
|
+
break;
|
|
1316
|
+
case "debug":
|
|
1317
|
+
logs.debug?.write(msg);
|
|
1318
|
+
break;
|
|
1319
|
+
default:
|
|
1320
|
+
break;
|
|
1321
|
+
}
|
|
930
1322
|
});
|
|
931
1323
|
|
|
932
1324
|
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
@@ -978,7 +1370,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
978
1370
|
.then(async (page) => {
|
|
979
1371
|
await page.goto(`file://${`${dest}.html`}`, {});
|
|
980
1372
|
|
|
981
|
-
/* @ts-ignore:next-line */
|
|
982
1373
|
res([Math.random(), page]);
|
|
983
1374
|
});
|
|
984
1375
|
});
|
|
@@ -1009,6 +1400,8 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1009
1400
|
|
|
1010
1401
|
const testReq: { ports: number } = sidecar[2];
|
|
1011
1402
|
|
|
1403
|
+
const logs = createLogStreams(dest, "node");
|
|
1404
|
+
|
|
1012
1405
|
const portsToUse: number[] = [];
|
|
1013
1406
|
if (testReq.ports === 0) {
|
|
1014
1407
|
// argz = {
|
|
@@ -1024,7 +1417,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1024
1417
|
|
|
1025
1418
|
if (openPorts.length >= testReq.ports) {
|
|
1026
1419
|
for (let i = 0; i < testReq.ports; i++) {
|
|
1027
|
-
portsToUse.push(openPorts[i][0]);
|
|
1420
|
+
portsToUse.push(Number(openPorts[i][0])); // Convert string port to number
|
|
1028
1421
|
|
|
1029
1422
|
this.ports[openPorts[i][0]] = src; // port is now closed
|
|
1030
1423
|
}
|
|
@@ -1076,8 +1469,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1076
1469
|
});
|
|
1077
1470
|
});
|
|
1078
1471
|
|
|
1079
|
-
const oStream = fs.createWriteStream(`${reportDest}/logs.txt`);
|
|
1080
|
-
|
|
1081
1472
|
const child = spawn("node", [builtfile, JSON.stringify(argz)], {
|
|
1082
1473
|
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
1083
1474
|
// silent: true
|
|
@@ -1085,19 +1476,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1085
1476
|
|
|
1086
1477
|
const p = "/tmp/tpipe" + Math.random();
|
|
1087
1478
|
|
|
1088
|
-
const errFile = `${reportDest}/logs.txt`;
|
|
1089
|
-
|
|
1090
1479
|
server.listen(p, () => {
|
|
1091
|
-
child.stderr?.on("data", (data) => {
|
|
1092
|
-
oStream.write(`stderr > ${data}`);
|
|
1093
|
-
});
|
|
1094
|
-
child.stdout?.on("data", (data) => {
|
|
1095
|
-
oStream.write(`stdout > ${data}`);
|
|
1096
|
-
});
|
|
1097
1480
|
child.on("close", (code) => {
|
|
1098
|
-
oStream.close();
|
|
1099
1481
|
server.close();
|
|
1100
|
-
|
|
1101
1482
|
haltReturns = true;
|
|
1102
1483
|
});
|
|
1103
1484
|
child.on("exit", (code) => {
|
|
@@ -1119,11 +1500,11 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1119
1500
|
console.log(
|
|
1120
1501
|
ansiC.red(
|
|
1121
1502
|
ansiC.inverse(
|
|
1122
|
-
`launchNodeSideCar - ${src} errored with: ${e.name}. Check
|
|
1503
|
+
`launchNodeSideCar - ${src} errored with: ${e.name}. Check logs for more info`
|
|
1123
1504
|
)
|
|
1124
1505
|
)
|
|
1125
1506
|
);
|
|
1126
|
-
|
|
1507
|
+
logs.error?.write(e.toString() + "\n");
|
|
1127
1508
|
// this.bddTestIsNowDone(src, -1);
|
|
1128
1509
|
// statusMessagePretty(-1, src);
|
|
1129
1510
|
});
|
|
@@ -1190,7 +1571,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1190
1571
|
);
|
|
1191
1572
|
if (openPorts.length >= testConfigResource.ports) {
|
|
1192
1573
|
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
1193
|
-
portsToUse.push(openPorts[i][0]);
|
|
1574
|
+
portsToUse.push(Number(openPorts[i][0]));
|
|
1194
1575
|
|
|
1195
1576
|
this.ports[openPorts[i][0]] = src; // port is now claimed
|
|
1196
1577
|
}
|
|
@@ -1205,7 +1586,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1205
1586
|
};
|
|
1206
1587
|
} else {
|
|
1207
1588
|
this.queue.push(src);
|
|
1208
|
-
return;
|
|
1589
|
+
// return;
|
|
1209
1590
|
}
|
|
1210
1591
|
} else {
|
|
1211
1592
|
console.error("negative port makes no sense", src);
|
|
@@ -1215,6 +1596,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1215
1596
|
// const builtfile = dest + ".mjs";
|
|
1216
1597
|
|
|
1217
1598
|
await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
1599
|
+
if (!this.pureSidecars) this.pureSidecars = {};
|
|
1218
1600
|
this.pureSidecars[r] = module.default;
|
|
1219
1601
|
this.pureSidecars[r].start(argz);
|
|
1220
1602
|
});
|
|
@@ -1250,12 +1632,37 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1250
1632
|
|
|
1251
1633
|
const d = `${dest}?cacheBust=${Date.now()}`;
|
|
1252
1634
|
|
|
1253
|
-
const
|
|
1254
|
-
const oStream = fs.createWriteStream(ofile);
|
|
1635
|
+
const logs = createLogStreams(reportDest, "web");
|
|
1255
1636
|
|
|
1256
1637
|
this.browser
|
|
1257
1638
|
.newPage()
|
|
1258
1639
|
.then((page) => {
|
|
1640
|
+
page.on("console", (log: ConsoleMessage) => {
|
|
1641
|
+
const msg = `${log.text()}\n`;
|
|
1642
|
+
|
|
1643
|
+
switch (log.type()) {
|
|
1644
|
+
case "info":
|
|
1645
|
+
logs.info?.write(msg);
|
|
1646
|
+
break;
|
|
1647
|
+
case "warn":
|
|
1648
|
+
logs.warn?.write(msg);
|
|
1649
|
+
break;
|
|
1650
|
+
case "error":
|
|
1651
|
+
logs.error?.write(msg);
|
|
1652
|
+
break;
|
|
1653
|
+
case "debug":
|
|
1654
|
+
logs.debug?.write(msg);
|
|
1655
|
+
break;
|
|
1656
|
+
default:
|
|
1657
|
+
break;
|
|
1658
|
+
}
|
|
1659
|
+
});
|
|
1660
|
+
|
|
1661
|
+
page.on("close", () => {
|
|
1662
|
+
logs.writeExitCode(0); // Web tests exit with 0 unless there's an error
|
|
1663
|
+
logs.closeAll();
|
|
1664
|
+
logs.closeAll();
|
|
1665
|
+
});
|
|
1259
1666
|
this.mapping().forEach(async ([command, func]) => {
|
|
1260
1667
|
if (command === "page") {
|
|
1261
1668
|
page.exposeFunction(command, (x?) => {
|
|
@@ -1288,55 +1695,23 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1288
1695
|
Promise.all(screenshots[src] || []).then(() => {
|
|
1289
1696
|
delete screenshots[src];
|
|
1290
1697
|
page.close();
|
|
1291
|
-
oStream.close();
|
|
1292
1698
|
});
|
|
1293
1699
|
|
|
1294
1700
|
return;
|
|
1295
1701
|
};
|
|
1296
1702
|
|
|
1297
1703
|
page.on("pageerror", (err: Error) => {
|
|
1704
|
+
logs.writeExitCode(-1, err);
|
|
1298
1705
|
console.log(
|
|
1299
1706
|
ansiColors.red(
|
|
1300
|
-
`web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/
|
|
1707
|
+
`web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/error.log for more info`
|
|
1301
1708
|
)
|
|
1302
1709
|
);
|
|
1303
|
-
|
|
1304
|
-
oStream.write(err.name);
|
|
1305
|
-
oStream.write("\n");
|
|
1306
|
-
|
|
1307
|
-
if (err.cause) {
|
|
1308
|
-
oStream.write(err.cause);
|
|
1309
|
-
oStream.write("\n");
|
|
1310
|
-
}
|
|
1311
|
-
|
|
1312
|
-
if (err.stack) {
|
|
1313
|
-
oStream.write(err.stack);
|
|
1314
|
-
oStream.write("\n");
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
if (err.message) {
|
|
1318
|
-
oStream.write(err.message);
|
|
1319
|
-
oStream.write("\n");
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
1710
|
this.bddTestIsNowDone(src, -1);
|
|
1323
1711
|
close();
|
|
1324
1712
|
});
|
|
1325
1713
|
|
|
1326
|
-
page.on("console", (log: ConsoleMessage) => {
|
|
1327
|
-
// console.log("console message: ", log.text());
|
|
1328
|
-
if (oStream.closed) {
|
|
1329
|
-
console.log("missed console message: ", log.text());
|
|
1330
|
-
return;
|
|
1331
|
-
} else {
|
|
1332
|
-
oStream.write(log.text());
|
|
1333
|
-
oStream.write("\n");
|
|
1334
|
-
oStream.write(JSON.stringify(log.location()));
|
|
1335
|
-
oStream.write("\n");
|
|
1336
|
-
oStream.write(JSON.stringify(log.stackTrace()));
|
|
1337
|
-
oStream.write("\n");
|
|
1338
|
-
}
|
|
1339
|
-
});
|
|
1714
|
+
// page.on("console", (log: ConsoleMessage) => {});
|
|
1340
1715
|
|
|
1341
1716
|
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
1342
1717
|
|
|
@@ -1363,7 +1738,7 @@ import('${d}').then(async (x) => {
|
|
|
1363
1738
|
console.log(
|
|
1364
1739
|
ansiC.red(
|
|
1365
1740
|
ansiC.inverse(
|
|
1366
|
-
`web ! ${src} failed to execute. No "tests.json" file was generated. Check
|
|
1741
|
+
`web ! ${src} failed to execute. No "tests.json" file was generated. Check logs for more info`
|
|
1367
1742
|
)
|
|
1368
1743
|
)
|
|
1369
1744
|
);
|
|
@@ -1391,9 +1766,28 @@ import('${d}').then(async (x) => {
|
|
|
1391
1766
|
srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
|
|
1392
1767
|
);
|
|
1393
1768
|
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
)
|
|
1769
|
+
// Read and parse the test report
|
|
1770
|
+
const testReportPath = `${reportDest}/tests.json`;
|
|
1771
|
+
if (!fs.existsSync(testReportPath)) {
|
|
1772
|
+
console.error(`tests.json not found at: ${testReportPath}`);
|
|
1773
|
+
return;
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
const testReport = JSON.parse(fs.readFileSync(testReportPath, "utf8"));
|
|
1777
|
+
|
|
1778
|
+
// Add full path information to each test
|
|
1779
|
+
if (testReport.tests) {
|
|
1780
|
+
testReport.tests.forEach((test) => {
|
|
1781
|
+
// Add the full path to each test
|
|
1782
|
+
test.fullPath = path.resolve(process.cwd(), srcTest);
|
|
1783
|
+
});
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
// Add full path to the report itself
|
|
1787
|
+
testReport.fullPath = path.resolve(process.cwd(), srcTest);
|
|
1788
|
+
|
|
1789
|
+
// Write the modified report back
|
|
1790
|
+
fs.writeFileSync(testReportPath, JSON.stringify(testReport, null, 2));
|
|
1397
1791
|
|
|
1398
1792
|
testReport.features
|
|
1399
1793
|
.reduce(async (mm, featureStringKey) => {
|
|
@@ -1451,7 +1845,7 @@ import('${d}').then(async (x) => {
|
|
|
1451
1845
|
}, Promise.resolve({ files: [] as string[], strings: [] as string[] }))
|
|
1452
1846
|
|
|
1453
1847
|
.then(({ files, strings }: { files: string[]; strings: string[] }) => {
|
|
1454
|
-
// Markdown files must be referenced in the prompt but string style features are already present in the
|
|
1848
|
+
// Markdown files must be referenced in the prompt but string style features are already present in the tests.json file
|
|
1455
1849
|
|
|
1456
1850
|
fs.writeFileSync(
|
|
1457
1851
|
`testeranto/reports/${this.name}/${srcTest
|
|
@@ -1478,6 +1872,151 @@ import('${d}').then(async (x) => {
|
|
|
1478
1872
|
this.writeBigBoard();
|
|
1479
1873
|
};
|
|
1480
1874
|
|
|
1875
|
+
requestHandler(req: http.IncomingMessage, res: http.ServerResponse) {
|
|
1876
|
+
// Parse the URL
|
|
1877
|
+
const parsedUrl = url.parse(req.url || "/");
|
|
1878
|
+
let pathname = parsedUrl.pathname || "/";
|
|
1879
|
+
|
|
1880
|
+
// Handle root path
|
|
1881
|
+
if (pathname === "/") {
|
|
1882
|
+
pathname = "/index.html";
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
// Remove leading slash
|
|
1886
|
+
let filePath = pathname.substring(1);
|
|
1887
|
+
|
|
1888
|
+
// Determine which directory to serve from
|
|
1889
|
+
if (filePath.startsWith("reports/")) {
|
|
1890
|
+
// Serve from reports directory
|
|
1891
|
+
filePath = `testeranto/${filePath}`;
|
|
1892
|
+
} else if (filePath.startsWith("metafiles/")) {
|
|
1893
|
+
// Serve from metafiles directory
|
|
1894
|
+
filePath = `testeranto/${filePath}`;
|
|
1895
|
+
} else if (filePath === "projects.json") {
|
|
1896
|
+
// Serve projects.json
|
|
1897
|
+
filePath = `testeranto/${filePath}`;
|
|
1898
|
+
} else {
|
|
1899
|
+
// For frontend assets, try multiple possible locations
|
|
1900
|
+
// First, try the dist directory
|
|
1901
|
+
const possiblePaths = [
|
|
1902
|
+
`dist/${filePath}`,
|
|
1903
|
+
`testeranto/dist/${filePath}`,
|
|
1904
|
+
`../dist/${filePath}`,
|
|
1905
|
+
`./${filePath}`,
|
|
1906
|
+
];
|
|
1907
|
+
|
|
1908
|
+
// Find the first existing file
|
|
1909
|
+
let foundPath = null;
|
|
1910
|
+
for (const possiblePath of possiblePaths) {
|
|
1911
|
+
if (fs.existsSync(possiblePath)) {
|
|
1912
|
+
foundPath = possiblePath;
|
|
1913
|
+
break;
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1917
|
+
if (foundPath) {
|
|
1918
|
+
filePath = foundPath;
|
|
1919
|
+
} else {
|
|
1920
|
+
// If no file found, serve index.html for SPA routing
|
|
1921
|
+
const indexPath = this.findIndexHtml();
|
|
1922
|
+
if (indexPath) {
|
|
1923
|
+
fs.readFile(indexPath, (err, data) => {
|
|
1924
|
+
if (err) {
|
|
1925
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1926
|
+
res.end("404 Not Found");
|
|
1927
|
+
return;
|
|
1928
|
+
}
|
|
1929
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1930
|
+
res.end(data);
|
|
1931
|
+
});
|
|
1932
|
+
return;
|
|
1933
|
+
} else {
|
|
1934
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1935
|
+
res.end("404 Not Found");
|
|
1936
|
+
return;
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
// Check if file exists
|
|
1942
|
+
fs.exists(filePath, (exists) => {
|
|
1943
|
+
if (!exists) {
|
|
1944
|
+
// For SPA routing, serve index.html if the path looks like a route
|
|
1945
|
+
if (!pathname.includes(".") && pathname !== "/") {
|
|
1946
|
+
const indexPath = this.findIndexHtml();
|
|
1947
|
+
if (indexPath) {
|
|
1948
|
+
fs.readFile(indexPath, (err, data) => {
|
|
1949
|
+
if (err) {
|
|
1950
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1951
|
+
res.end("404 Not Found");
|
|
1952
|
+
return;
|
|
1953
|
+
}
|
|
1954
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1955
|
+
res.end(data);
|
|
1956
|
+
});
|
|
1957
|
+
return;
|
|
1958
|
+
} else {
|
|
1959
|
+
// Serve a simple message if index.html is not found
|
|
1960
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1961
|
+
res.end(`
|
|
1962
|
+
<html>
|
|
1963
|
+
<body>
|
|
1964
|
+
<h1>Testeranto is running</h1>
|
|
1965
|
+
<p>Frontend files are not built yet. Run 'npm run build' to build the frontend.</p>
|
|
1966
|
+
</body>
|
|
1967
|
+
</html>
|
|
1968
|
+
`);
|
|
1969
|
+
return;
|
|
1970
|
+
}
|
|
1971
|
+
}
|
|
1972
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1973
|
+
res.end("404 Not Found");
|
|
1974
|
+
return;
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
// Read and serve the file
|
|
1978
|
+
fs.readFile(filePath, (err, data) => {
|
|
1979
|
+
if (err) {
|
|
1980
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
1981
|
+
res.end("500 Internal Server Error");
|
|
1982
|
+
return;
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
// Get MIME type
|
|
1986
|
+
const mimeType = mime.lookup(filePath) || "application/octet-stream";
|
|
1987
|
+
res.writeHead(200, { "Content-Type": mimeType });
|
|
1988
|
+
res.end(data);
|
|
1989
|
+
});
|
|
1990
|
+
});
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
findIndexHtml(): string | null {
|
|
1994
|
+
const possiblePaths = [
|
|
1995
|
+
"dist/index.html",
|
|
1996
|
+
"testeranto/dist/index.html",
|
|
1997
|
+
"../dist/index.html",
|
|
1998
|
+
"./index.html",
|
|
1999
|
+
];
|
|
2000
|
+
|
|
2001
|
+
for (const path of possiblePaths) {
|
|
2002
|
+
if (fs.existsSync(path)) {
|
|
2003
|
+
return path;
|
|
2004
|
+
}
|
|
2005
|
+
}
|
|
2006
|
+
return null;
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
broadcast(message: any) {
|
|
2010
|
+
const data =
|
|
2011
|
+
typeof message === "string" ? message : JSON.stringify(message);
|
|
2012
|
+
this.clients.forEach((client) => {
|
|
2013
|
+
if (client.readyState === 1) {
|
|
2014
|
+
// WebSocket.OPEN
|
|
2015
|
+
client.send(data);
|
|
2016
|
+
}
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
|
|
1481
2020
|
checkQueue() {
|
|
1482
2021
|
const x = this.queue.pop();
|
|
1483
2022
|
if (!x) {
|
|
@@ -1544,10 +2083,16 @@ import('${d}').then(async (x) => {
|
|
|
1544
2083
|
this.writeBigBoard();
|
|
1545
2084
|
|
|
1546
2085
|
if (!inflight) {
|
|
1547
|
-
this.browser
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
2086
|
+
if (this.browser) {
|
|
2087
|
+
if (this.browser) {
|
|
2088
|
+
this.browser.disconnect().then(() => {
|
|
2089
|
+
console.log(
|
|
2090
|
+
ansiC.inverse(`${this.name} has been tested. Goodbye.`)
|
|
2091
|
+
);
|
|
2092
|
+
process.exit();
|
|
2093
|
+
});
|
|
2094
|
+
}
|
|
2095
|
+
}
|
|
1551
2096
|
}
|
|
1552
2097
|
};
|
|
1553
2098
|
}
|