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
|
@@ -10,6 +10,10 @@ import path from "path";
|
|
|
10
10
|
import puppeteer from "puppeteer-core";
|
|
11
11
|
import ansiC from "ansi-colors";
|
|
12
12
|
import crypto from "node:crypto";
|
|
13
|
+
import { WebSocketServer } from "ws";
|
|
14
|
+
import http from "http";
|
|
15
|
+
import url from "url";
|
|
16
|
+
import mime from "mime-types";
|
|
13
17
|
import { getRunnables } from "../utils";
|
|
14
18
|
import { Queue } from "../utils/queue.js";
|
|
15
19
|
import { PM_WithEslintAndTsc } from "./PM_WithEslintAndTsc.js";
|
|
@@ -17,6 +21,87 @@ const changes = {};
|
|
|
17
21
|
const fileHashes = {};
|
|
18
22
|
const files = {};
|
|
19
23
|
const screenshots = {};
|
|
24
|
+
function runtimeLogs(runtime, reportDest) {
|
|
25
|
+
const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
|
|
26
|
+
try {
|
|
27
|
+
if (!fs.existsSync(safeDest)) {
|
|
28
|
+
fs.mkdirSync(safeDest, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
if (runtime === "node") {
|
|
31
|
+
return {
|
|
32
|
+
stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
|
|
33
|
+
stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
|
|
34
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else if (runtime === "web") {
|
|
38
|
+
return {
|
|
39
|
+
info: fs.createWriteStream(`${safeDest}/info.log`),
|
|
40
|
+
warn: fs.createWriteStream(`${safeDest}/warn.log`),
|
|
41
|
+
error: fs.createWriteStream(`${safeDest}/error.log`),
|
|
42
|
+
debug: fs.createWriteStream(`${safeDest}/debug.log`),
|
|
43
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else if (runtime === "pure") {
|
|
47
|
+
return {
|
|
48
|
+
exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw `unknown runtime: ${runtime}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
console.error(`Failed to create log streams in ${safeDest}:`, e);
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function createLogStreams(reportDest, runtime) {
|
|
61
|
+
// Create directory if it doesn't exist
|
|
62
|
+
if (!fs.existsSync(reportDest)) {
|
|
63
|
+
fs.mkdirSync(reportDest, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
const streams = runtimeLogs(runtime, reportDest);
|
|
66
|
+
// const streams = {
|
|
67
|
+
// exit: fs.createWriteStream(`${reportDest}/exit.log`),
|
|
68
|
+
const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
|
|
69
|
+
try {
|
|
70
|
+
if (!fs.existsSync(safeDest)) {
|
|
71
|
+
fs.mkdirSync(safeDest, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
const streams = runtimeLogs(runtime, safeDest);
|
|
74
|
+
// const streams = {
|
|
75
|
+
// exit: fs.createWriteStream(`${safeDest}/exit.log`),
|
|
76
|
+
// ...(runtime === "node" || runtime === "pure"
|
|
77
|
+
// ? {
|
|
78
|
+
// stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
|
|
79
|
+
// stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
|
|
80
|
+
// }
|
|
81
|
+
// : {
|
|
82
|
+
// info: fs.createWriteStream(`${safeDest}/info.log`),
|
|
83
|
+
// warn: fs.createWriteStream(`${safeDest}/warn.log`),
|
|
84
|
+
// error: fs.createWriteStream(`${safeDest}/error.log`),
|
|
85
|
+
// debug: fs.createWriteStream(`${safeDest}/debug.log`),
|
|
86
|
+
// }),
|
|
87
|
+
// };
|
|
88
|
+
return Object.assign(Object.assign({}, streams), { closeAll: () => {
|
|
89
|
+
Object.values(streams).forEach((stream) => !stream.closed && stream.close());
|
|
90
|
+
}, writeExitCode: (code, error) => {
|
|
91
|
+
if (error) {
|
|
92
|
+
streams.exit.write(`Error: ${error.message}\n`);
|
|
93
|
+
if (error.stack) {
|
|
94
|
+
streams.exit.write(`Stack Trace:\n${error.stack}\n`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
streams.exit.write(`${code}\n`);
|
|
98
|
+
}, exit: streams.exit });
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
console.error(`Failed to create log streams in ${safeDest}:`, e);
|
|
102
|
+
throw e;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
20
105
|
async function fileHash(filePath, algorithm = "md5") {
|
|
21
106
|
return new Promise((resolve, reject) => {
|
|
22
107
|
const hash = crypto.createHash(algorithm);
|
|
@@ -35,10 +120,13 @@ async function fileHash(filePath, algorithm = "md5") {
|
|
|
35
120
|
}
|
|
36
121
|
const statusMessagePretty = (failures, test, runtime) => {
|
|
37
122
|
if (failures === 0) {
|
|
38
|
-
console.log(ansiC.green(ansiC.inverse(`${runtime} > ${test}
|
|
123
|
+
console.log(ansiC.green(ansiC.inverse(`${runtime} > ${test}`)));
|
|
124
|
+
}
|
|
125
|
+
else if (failures > 0) {
|
|
126
|
+
console.log(ansiC.red(ansiC.inverse(`${runtime} > ${test} failed ${failures} times (exit code: ${failures})`)));
|
|
39
127
|
}
|
|
40
128
|
else {
|
|
41
|
-
console.log(ansiC.red(ansiC.inverse(`${runtime} > ${test}
|
|
129
|
+
console.log(ansiC.red(ansiC.inverse(`${runtime} > ${test} crashed (exit code: -1)`)));
|
|
42
130
|
}
|
|
43
131
|
};
|
|
44
132
|
async function writeFileAndCreateDir(filePath, data) {
|
|
@@ -80,6 +168,12 @@ async function pollForFile(path, timeout = 2000) {
|
|
|
80
168
|
export class PM_Main extends PM_WithEslintAndTsc {
|
|
81
169
|
constructor(configs, name, mode) {
|
|
82
170
|
super(configs, name, mode);
|
|
171
|
+
this.logStreams = {};
|
|
172
|
+
this.sidecars = {};
|
|
173
|
+
this.clients = new Set();
|
|
174
|
+
this.runningProcesses = new Map();
|
|
175
|
+
this.allProcesses = new Map();
|
|
176
|
+
this.processLogs = new Map();
|
|
83
177
|
this.getRunnables = (tests, testName, payload = {
|
|
84
178
|
nodeEntryPoints: {},
|
|
85
179
|
nodeEntryPointSidecars: {},
|
|
@@ -137,7 +231,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
137
231
|
}
|
|
138
232
|
else {
|
|
139
233
|
this.queue.push(src);
|
|
140
|
-
return;
|
|
234
|
+
return [Math.random(), argz];
|
|
141
235
|
}
|
|
142
236
|
}
|
|
143
237
|
else {
|
|
@@ -170,8 +264,20 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
170
264
|
// }
|
|
171
265
|
// })
|
|
172
266
|
// );
|
|
267
|
+
const logs = createLogStreams(reportDest, "pure");
|
|
173
268
|
try {
|
|
174
269
|
await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
270
|
+
// Override console methods to redirect logs
|
|
271
|
+
// Only override stdout/stderr methods for pure runtime
|
|
272
|
+
const originalConsole = Object.assign({}, console);
|
|
273
|
+
// console.log = (...args) => {
|
|
274
|
+
// logs.stdout.write(args.join(" ") + "\n");
|
|
275
|
+
// originalConsole.log(...args);
|
|
276
|
+
// };
|
|
277
|
+
// console.error = (...args) => {
|
|
278
|
+
// logs.stderr.write(args.join(" ") + "\n");
|
|
279
|
+
// originalConsole.error(...args);
|
|
280
|
+
// };
|
|
175
281
|
return module.default
|
|
176
282
|
.then((defaultModule) => {
|
|
177
283
|
defaultModule
|
|
@@ -183,7 +289,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
183
289
|
this.bddTestIsNowDone(src, results.fails);
|
|
184
290
|
})
|
|
185
291
|
.catch((e1) => {
|
|
186
|
-
console.log(ansiC.red(`launchPure - ${src} errored with: ${e1}`));
|
|
292
|
+
console.log(ansiC.red(`launchPure - ${src} errored with: ${e1.stack}`));
|
|
187
293
|
this.bddTestIsNowDone(src, -1);
|
|
188
294
|
statusMessagePretty(-1, src, "pure");
|
|
189
295
|
});
|
|
@@ -192,8 +298,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
192
298
|
// });
|
|
193
299
|
})
|
|
194
300
|
.catch((e2) => {
|
|
195
|
-
console.log(ansiColors.red(`pure ! ${src} failed to execute. No "tests.json" file was generated. Check
|
|
196
|
-
|
|
301
|
+
console.log(ansiColors.red(`pure ! ${src} failed to execute. No "tests.json" file was generated. Check the logs for more info`));
|
|
302
|
+
logs.exit.write(e2.stack);
|
|
303
|
+
logs.exit.write(-1);
|
|
197
304
|
this.bddTestIsNowDone(src, -1);
|
|
198
305
|
statusMessagePretty(-1, src, "pure");
|
|
199
306
|
// console.error(e);
|
|
@@ -208,11 +315,12 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
208
315
|
});
|
|
209
316
|
}
|
|
210
317
|
catch (e3) {
|
|
211
|
-
|
|
212
|
-
|
|
318
|
+
logs.writeExitCode(-1, e3);
|
|
319
|
+
console.log(ansiC.red(ansiC.inverse(`${src} 1 errored with: ${e3}. Check logs for more info`)));
|
|
320
|
+
logs.exit.write(e3.stack);
|
|
321
|
+
logs.exit.write(-1);
|
|
213
322
|
this.bddTestIsNowDone(src, -1);
|
|
214
323
|
statusMessagePretty(-1, src, "pure");
|
|
215
|
-
console.log("III) PURE IS EXITING BADLY WITH error", e3);
|
|
216
324
|
}
|
|
217
325
|
for (let i = 0; i <= portsToUse.length; i++) {
|
|
218
326
|
if (portsToUse[i]) {
|
|
@@ -255,7 +363,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
255
363
|
const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen === "");
|
|
256
364
|
if (openPorts.length >= testConfigResource.ports) {
|
|
257
365
|
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
258
|
-
portsToUse.push(openPorts[i][0]);
|
|
366
|
+
portsToUse.push(openPorts[i][0]); // Convert string port to number
|
|
259
367
|
this.ports[openPorts[i][0]] = src; // port is now claimed
|
|
260
368
|
}
|
|
261
369
|
testResources = JSON.stringify({
|
|
@@ -269,7 +377,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
269
377
|
else {
|
|
270
378
|
console.log(ansiC.red(`node: cannot run ${src} because there are no open ports ATM. This job will be enqueued and run again run a port is available`));
|
|
271
379
|
this.queue.push(src);
|
|
272
|
-
return;
|
|
380
|
+
return [Math.random(), argz]; // Add this return
|
|
273
381
|
}
|
|
274
382
|
}
|
|
275
383
|
else {
|
|
@@ -327,45 +435,45 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
327
435
|
}
|
|
328
436
|
});
|
|
329
437
|
});
|
|
330
|
-
const
|
|
331
|
-
const errFile = `${reportDest}/logs.txt`;
|
|
332
|
-
if (fs.existsSync(errFile)) {
|
|
333
|
-
fs.rmSync(errFile);
|
|
334
|
-
}
|
|
438
|
+
const logs = createLogStreams(reportDest, "node");
|
|
335
439
|
server.listen(ipcfile, () => {
|
|
336
440
|
var _a, _b;
|
|
337
|
-
|
|
338
|
-
|
|
441
|
+
// Only handle stdout/stderr for node runtime
|
|
442
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", (data) => {
|
|
443
|
+
var _a;
|
|
444
|
+
(_a = logs.stdout) === null || _a === void 0 ? void 0 : _a.write(data); // Add null check
|
|
339
445
|
});
|
|
340
|
-
(_b = child.
|
|
341
|
-
|
|
446
|
+
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on("data", (data) => {
|
|
447
|
+
var _a;
|
|
448
|
+
(_a = logs.stderr) === null || _a === void 0 ? void 0 : _a.write(data); // Add null check
|
|
342
449
|
});
|
|
343
450
|
child.on("error", (err) => { });
|
|
344
451
|
child.on("close", (code) => {
|
|
345
|
-
|
|
452
|
+
const exitCode = code === null ? -1 : code;
|
|
453
|
+
if (exitCode < 0) {
|
|
454
|
+
logs.writeExitCode(exitCode, new Error("Process crashed or was terminated"));
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
logs.writeExitCode(exitCode);
|
|
458
|
+
}
|
|
459
|
+
logs.closeAll();
|
|
346
460
|
server.close();
|
|
347
461
|
if (!files[src]) {
|
|
348
462
|
files[src] = new Set();
|
|
349
463
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
// reportDest + "/manifest.json",
|
|
353
|
-
// JSON.stringify(Array.from(files[src]))
|
|
354
|
-
// );
|
|
355
|
-
if (code === 255) {
|
|
356
|
-
console.log(ansiColors.red(`node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`));
|
|
464
|
+
if (exitCode === 255) {
|
|
465
|
+
console.log(ansiColors.red(`node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/stderr.log for more info`));
|
|
357
466
|
this.bddTestIsNowDone(src, -1);
|
|
358
467
|
statusMessagePretty(-1, src, "node");
|
|
359
|
-
oStream.close();
|
|
360
468
|
return;
|
|
361
469
|
}
|
|
362
|
-
else if (
|
|
470
|
+
else if (exitCode === 0) {
|
|
363
471
|
this.bddTestIsNowDone(src, 0);
|
|
364
472
|
statusMessagePretty(0, src, "node");
|
|
365
473
|
}
|
|
366
474
|
else {
|
|
367
|
-
this.bddTestIsNowDone(src,
|
|
368
|
-
statusMessagePretty(
|
|
475
|
+
this.bddTestIsNowDone(src, exitCode);
|
|
476
|
+
statusMessagePretty(exitCode, src, "node");
|
|
369
477
|
}
|
|
370
478
|
haltReturns = true;
|
|
371
479
|
});
|
|
@@ -380,8 +488,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
380
488
|
child.on("error", (e) => {
|
|
381
489
|
console.log("error");
|
|
382
490
|
haltReturns = true;
|
|
383
|
-
console.log(ansiC.red(ansiC.inverse(`${src} errored with: ${e.name}. Check
|
|
384
|
-
this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
|
|
491
|
+
console.log(ansiC.red(ansiC.inverse(`${src} errored with: ${e.name}. Check error logs for more info`)));
|
|
385
492
|
this.bddTestIsNowDone(src, -1);
|
|
386
493
|
statusMessagePretty(-1, src, "node");
|
|
387
494
|
});
|
|
@@ -393,9 +500,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
393
500
|
// const d = dest + ".mjs";
|
|
394
501
|
const destFolder = dest.replace(".mjs", "");
|
|
395
502
|
console.log(ansiC.green(ansiC.inverse(`launchWebSideCar ${src}`)));
|
|
396
|
-
const fileStreams2 = [];
|
|
397
|
-
const doneFileStream2 = [];
|
|
398
|
-
const
|
|
503
|
+
// const fileStreams2: fs.WriteStream[] = [];
|
|
504
|
+
// const doneFileStream2: Promise<any>[] = [];
|
|
505
|
+
const logs = createLogStreams(dest, "web");
|
|
399
506
|
return new Promise((res, rej) => {
|
|
400
507
|
this.browser
|
|
401
508
|
.newPage()
|
|
@@ -416,34 +523,40 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
416
523
|
Promise.all(screenshots[src] || []).then(() => {
|
|
417
524
|
delete screenshots[src];
|
|
418
525
|
page.close();
|
|
419
|
-
oStream.close();
|
|
420
526
|
});
|
|
421
527
|
};
|
|
422
528
|
page.on("pageerror", (err) => {
|
|
423
529
|
console.debug(`Error from ${src}: [${err.name}] `);
|
|
424
|
-
|
|
425
|
-
oStream.write("\n");
|
|
530
|
+
console.debug(`Error from ${src}: [${err.name}] `);
|
|
426
531
|
if (err.cause) {
|
|
427
532
|
console.debug(`Error from ${src} cause: [${err.cause}] `);
|
|
428
|
-
oStream.write(err.cause);
|
|
429
|
-
oStream.write("\n");
|
|
430
533
|
}
|
|
431
534
|
if (err.stack) {
|
|
432
535
|
console.debug(`Error from stack ${src}: [${err.stack}] `);
|
|
433
|
-
oStream.write(err.stack);
|
|
434
|
-
oStream.write("\n");
|
|
435
536
|
}
|
|
436
537
|
console.debug(`Error from message ${src}: [${err.message}] `);
|
|
437
|
-
oStream.write(err.message);
|
|
438
|
-
oStream.write("\n");
|
|
439
538
|
this.bddTestIsNowDone(src, -1);
|
|
440
539
|
close();
|
|
441
540
|
});
|
|
442
541
|
page.on("console", (log) => {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
542
|
+
var _a, _b, _c, _d;
|
|
543
|
+
const msg = `${log.text()}\n${JSON.stringify(log.location())}\n${JSON.stringify(log.stackTrace())}\n`;
|
|
544
|
+
switch (log.type()) {
|
|
545
|
+
case "info":
|
|
546
|
+
(_a = logs.info) === null || _a === void 0 ? void 0 : _a.write(msg);
|
|
547
|
+
break;
|
|
548
|
+
case "warn":
|
|
549
|
+
(_b = logs.warn) === null || _b === void 0 ? void 0 : _b.write(msg);
|
|
550
|
+
break;
|
|
551
|
+
case "error":
|
|
552
|
+
(_c = logs.error) === null || _c === void 0 ? void 0 : _c.write(msg);
|
|
553
|
+
break;
|
|
554
|
+
case "debug":
|
|
555
|
+
(_d = logs.debug) === null || _d === void 0 ? void 0 : _d.write(msg);
|
|
556
|
+
break;
|
|
557
|
+
default:
|
|
558
|
+
break;
|
|
559
|
+
}
|
|
447
560
|
});
|
|
448
561
|
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
449
562
|
const webArgz = JSON.stringify({
|
|
@@ -482,7 +595,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
482
595
|
})
|
|
483
596
|
.then(async (page) => {
|
|
484
597
|
await page.goto(`file://${`${dest}.html`}`, {});
|
|
485
|
-
/* @ts-ignore:next-line */
|
|
486
598
|
res([Math.random(), page]);
|
|
487
599
|
});
|
|
488
600
|
});
|
|
@@ -504,6 +616,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
504
616
|
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
505
617
|
};
|
|
506
618
|
const testReq = sidecar[2];
|
|
619
|
+
const logs = createLogStreams(dest, "node");
|
|
507
620
|
const portsToUse = [];
|
|
508
621
|
if (testReq.ports === 0) {
|
|
509
622
|
// argz = {
|
|
@@ -517,7 +630,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
517
630
|
const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen === "");
|
|
518
631
|
if (openPorts.length >= testReq.ports) {
|
|
519
632
|
for (let i = 0; i < testReq.ports; i++) {
|
|
520
|
-
portsToUse.push(openPorts[i][0]);
|
|
633
|
+
portsToUse.push(Number(openPorts[i][0])); // Convert string port to number
|
|
521
634
|
this.ports[openPorts[i][0]] = src; // port is now closed
|
|
522
635
|
}
|
|
523
636
|
argz.ports = portsToUse;
|
|
@@ -557,23 +670,13 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
557
670
|
});
|
|
558
671
|
});
|
|
559
672
|
});
|
|
560
|
-
const oStream = fs.createWriteStream(`${reportDest}/logs.txt`);
|
|
561
673
|
const child = spawn("node", [builtfile, JSON.stringify(argz)], {
|
|
562
674
|
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
563
675
|
// silent: true
|
|
564
676
|
});
|
|
565
677
|
const p = "/tmp/tpipe" + Math.random();
|
|
566
|
-
const errFile = `${reportDest}/logs.txt`;
|
|
567
678
|
server.listen(p, () => {
|
|
568
|
-
var _a, _b;
|
|
569
|
-
(_a = child.stderr) === null || _a === void 0 ? void 0 : _a.on("data", (data) => {
|
|
570
|
-
oStream.write(`stderr > ${data}`);
|
|
571
|
-
});
|
|
572
|
-
(_b = child.stdout) === null || _b === void 0 ? void 0 : _b.on("data", (data) => {
|
|
573
|
-
oStream.write(`stdout > ${data}`);
|
|
574
|
-
});
|
|
575
679
|
child.on("close", (code) => {
|
|
576
|
-
oStream.close();
|
|
577
680
|
server.close();
|
|
578
681
|
haltReturns = true;
|
|
579
682
|
});
|
|
@@ -586,12 +689,13 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
586
689
|
}
|
|
587
690
|
});
|
|
588
691
|
child.on("error", (e) => {
|
|
692
|
+
var _a;
|
|
589
693
|
if (fs.existsSync(p)) {
|
|
590
694
|
fs.rmSync(p);
|
|
591
695
|
}
|
|
592
696
|
haltReturns = true;
|
|
593
|
-
console.log(ansiC.red(ansiC.inverse(`launchNodeSideCar - ${src} errored with: ${e.name}. Check
|
|
594
|
-
|
|
697
|
+
console.log(ansiC.red(ansiC.inverse(`launchNodeSideCar - ${src} errored with: ${e.name}. Check logs for more info`)));
|
|
698
|
+
(_a = logs.error) === null || _a === void 0 ? void 0 : _a.write(e.toString() + "\n");
|
|
595
699
|
// this.bddTestIsNowDone(src, -1);
|
|
596
700
|
// statusMessagePretty(-1, src);
|
|
597
701
|
});
|
|
@@ -641,7 +745,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
641
745
|
const openPorts = Object.entries(this.ports).filter(([portnumber, portopen]) => portopen === "");
|
|
642
746
|
if (openPorts.length >= testConfigResource.ports) {
|
|
643
747
|
for (let i = 0; i < testConfigResource.ports; i++) {
|
|
644
|
-
portsToUse.push(openPorts[i][0]);
|
|
748
|
+
portsToUse.push(Number(openPorts[i][0]));
|
|
645
749
|
this.ports[openPorts[i][0]] = src; // port is now claimed
|
|
646
750
|
}
|
|
647
751
|
argz = {
|
|
@@ -655,7 +759,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
655
759
|
}
|
|
656
760
|
else {
|
|
657
761
|
this.queue.push(src);
|
|
658
|
-
return;
|
|
762
|
+
// return;
|
|
659
763
|
}
|
|
660
764
|
}
|
|
661
765
|
else {
|
|
@@ -664,6 +768,8 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
664
768
|
}
|
|
665
769
|
// const builtfile = dest + ".mjs";
|
|
666
770
|
await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
|
|
771
|
+
if (!this.pureSidecars)
|
|
772
|
+
this.pureSidecars = {};
|
|
667
773
|
this.pureSidecars[r] = module.default;
|
|
668
774
|
this.pureSidecars[r].start(argz);
|
|
669
775
|
});
|
|
@@ -692,11 +798,35 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
692
798
|
browserWSEndpoint: this.browser.wsEndpoint(),
|
|
693
799
|
});
|
|
694
800
|
const d = `${dest}?cacheBust=${Date.now()}`;
|
|
695
|
-
const
|
|
696
|
-
const oStream = fs.createWriteStream(ofile);
|
|
801
|
+
const logs = createLogStreams(reportDest, "web");
|
|
697
802
|
this.browser
|
|
698
803
|
.newPage()
|
|
699
804
|
.then((page) => {
|
|
805
|
+
page.on("console", (log) => {
|
|
806
|
+
var _a, _b, _c, _d;
|
|
807
|
+
const msg = `${log.text()}\n`;
|
|
808
|
+
switch (log.type()) {
|
|
809
|
+
case "info":
|
|
810
|
+
(_a = logs.info) === null || _a === void 0 ? void 0 : _a.write(msg);
|
|
811
|
+
break;
|
|
812
|
+
case "warn":
|
|
813
|
+
(_b = logs.warn) === null || _b === void 0 ? void 0 : _b.write(msg);
|
|
814
|
+
break;
|
|
815
|
+
case "error":
|
|
816
|
+
(_c = logs.error) === null || _c === void 0 ? void 0 : _c.write(msg);
|
|
817
|
+
break;
|
|
818
|
+
case "debug":
|
|
819
|
+
(_d = logs.debug) === null || _d === void 0 ? void 0 : _d.write(msg);
|
|
820
|
+
break;
|
|
821
|
+
default:
|
|
822
|
+
break;
|
|
823
|
+
}
|
|
824
|
+
});
|
|
825
|
+
page.on("close", () => {
|
|
826
|
+
logs.writeExitCode(0); // Web tests exit with 0 unless there's an error
|
|
827
|
+
logs.closeAll();
|
|
828
|
+
logs.closeAll();
|
|
829
|
+
});
|
|
700
830
|
this.mapping().forEach(async ([command, func]) => {
|
|
701
831
|
if (command === "page") {
|
|
702
832
|
page.exposeFunction(command, (x) => {
|
|
@@ -728,44 +858,16 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
728
858
|
Promise.all(screenshots[src] || []).then(() => {
|
|
729
859
|
delete screenshots[src];
|
|
730
860
|
page.close();
|
|
731
|
-
oStream.close();
|
|
732
861
|
});
|
|
733
862
|
return;
|
|
734
863
|
};
|
|
735
864
|
page.on("pageerror", (err) => {
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
oStream.write("\n");
|
|
739
|
-
if (err.cause) {
|
|
740
|
-
oStream.write(err.cause);
|
|
741
|
-
oStream.write("\n");
|
|
742
|
-
}
|
|
743
|
-
if (err.stack) {
|
|
744
|
-
oStream.write(err.stack);
|
|
745
|
-
oStream.write("\n");
|
|
746
|
-
}
|
|
747
|
-
if (err.message) {
|
|
748
|
-
oStream.write(err.message);
|
|
749
|
-
oStream.write("\n");
|
|
750
|
-
}
|
|
865
|
+
logs.writeExitCode(-1, err);
|
|
866
|
+
console.log(ansiColors.red(`web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/error.log for more info`));
|
|
751
867
|
this.bddTestIsNowDone(src, -1);
|
|
752
868
|
close();
|
|
753
869
|
});
|
|
754
|
-
page.on("console", (log) => {
|
|
755
|
-
// console.log("console message: ", log.text());
|
|
756
|
-
if (oStream.closed) {
|
|
757
|
-
console.log("missed console message: ", log.text());
|
|
758
|
-
return;
|
|
759
|
-
}
|
|
760
|
-
else {
|
|
761
|
-
oStream.write(log.text());
|
|
762
|
-
oStream.write("\n");
|
|
763
|
-
oStream.write(JSON.stringify(log.location()));
|
|
764
|
-
oStream.write("\n");
|
|
765
|
-
oStream.write(JSON.stringify(log.stackTrace()));
|
|
766
|
-
oStream.write("\n");
|
|
767
|
-
}
|
|
768
|
-
});
|
|
870
|
+
// page.on("console", (log: ConsoleMessage) => {});
|
|
769
871
|
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
770
872
|
await page
|
|
771
873
|
.evaluate(`
|
|
@@ -784,7 +886,7 @@ import('${d}').then(async (x) => {
|
|
|
784
886
|
})
|
|
785
887
|
.catch((e) => {
|
|
786
888
|
console.log(ansiC.red(ansiC.inverse(e.stack)));
|
|
787
|
-
console.log(ansiC.red(ansiC.inverse(`web ! ${src} failed to execute. No "tests.json" file was generated. Check
|
|
889
|
+
console.log(ansiC.red(ansiC.inverse(`web ! ${src} failed to execute. No "tests.json" file was generated. Check logs for more info`)));
|
|
788
890
|
this.bddTestIsNowDone(src, -1);
|
|
789
891
|
})
|
|
790
892
|
.finally(() => {
|
|
@@ -796,7 +898,24 @@ import('${d}').then(async (x) => {
|
|
|
796
898
|
};
|
|
797
899
|
this.receiveFeaturesV2 = (reportDest, srcTest, platform) => {
|
|
798
900
|
const featureDestination = path.resolve(process.cwd(), "reports", "features", "strings", srcTest.split(".").slice(0, -1).join(".") + ".features.txt");
|
|
799
|
-
|
|
901
|
+
// Read and parse the test report
|
|
902
|
+
const testReportPath = `${reportDest}/tests.json`;
|
|
903
|
+
if (!fs.existsSync(testReportPath)) {
|
|
904
|
+
console.error(`tests.json not found at: ${testReportPath}`);
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
const testReport = JSON.parse(fs.readFileSync(testReportPath, "utf8"));
|
|
908
|
+
// Add full path information to each test
|
|
909
|
+
if (testReport.tests) {
|
|
910
|
+
testReport.tests.forEach((test) => {
|
|
911
|
+
// Add the full path to each test
|
|
912
|
+
test.fullPath = path.resolve(process.cwd(), srcTest);
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
// Add full path to the report itself
|
|
916
|
+
testReport.fullPath = path.resolve(process.cwd(), srcTest);
|
|
917
|
+
// Write the modified report back
|
|
918
|
+
fs.writeFileSync(testReportPath, JSON.stringify(testReport, null, 2));
|
|
800
919
|
testReport.features
|
|
801
920
|
.reduce(async (mm, featureStringKey) => {
|
|
802
921
|
const accum = await mm;
|
|
@@ -839,7 +958,7 @@ import('${d}').then(async (x) => {
|
|
|
839
958
|
return accum;
|
|
840
959
|
}, Promise.resolve({ files: [], strings: [] }))
|
|
841
960
|
.then(({ files, strings }) => {
|
|
842
|
-
// Markdown files must be referenced in the prompt but string style features are already present in the
|
|
961
|
+
// Markdown files must be referenced in the prompt but string style features are already present in the tests.json file
|
|
843
962
|
fs.writeFileSync(`testeranto/reports/${this.name}/${srcTest
|
|
844
963
|
.split(".")
|
|
845
964
|
.slice(0, -1)
|
|
@@ -893,10 +1012,14 @@ import('${d}').then(async (x) => {
|
|
|
893
1012
|
});
|
|
894
1013
|
this.writeBigBoard();
|
|
895
1014
|
if (!inflight) {
|
|
896
|
-
this.browser
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
1015
|
+
if (this.browser) {
|
|
1016
|
+
if (this.browser) {
|
|
1017
|
+
this.browser.disconnect().then(() => {
|
|
1018
|
+
console.log(ansiC.inverse(`${this.name} has been tested. Goodbye.`));
|
|
1019
|
+
process.exit();
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
900
1023
|
}
|
|
901
1024
|
};
|
|
902
1025
|
this.launchers = {};
|
|
@@ -908,6 +1031,196 @@ import('${d}').then(async (x) => {
|
|
|
908
1031
|
this.configs.ports.forEach((element) => {
|
|
909
1032
|
this.ports[element] = ""; // set ports as open
|
|
910
1033
|
});
|
|
1034
|
+
// Create HTTP server
|
|
1035
|
+
this.httpServer = http.createServer(this.requestHandler.bind(this));
|
|
1036
|
+
// Start WebSocket server attached to the HTTP server
|
|
1037
|
+
this.wss = new WebSocketServer({ server: this.httpServer });
|
|
1038
|
+
this.wss.on("connection", (ws) => {
|
|
1039
|
+
this.clients.add(ws);
|
|
1040
|
+
console.log("Client connected");
|
|
1041
|
+
ws.on("message", (data) => {
|
|
1042
|
+
var _a, _b;
|
|
1043
|
+
try {
|
|
1044
|
+
const message = JSON.parse(data.toString());
|
|
1045
|
+
if (message.type === "executeCommand") {
|
|
1046
|
+
// Validate the command starts with 'aider'
|
|
1047
|
+
if (message.command && message.command.trim().startsWith("aider")) {
|
|
1048
|
+
console.log(`Executing command: ${message.command}`);
|
|
1049
|
+
// Execute the command
|
|
1050
|
+
const processId = Date.now().toString();
|
|
1051
|
+
const child = spawn(message.command, {
|
|
1052
|
+
shell: true,
|
|
1053
|
+
cwd: process.cwd(),
|
|
1054
|
+
});
|
|
1055
|
+
// Track the process in both maps
|
|
1056
|
+
this.runningProcesses.set(processId, child);
|
|
1057
|
+
this.allProcesses.set(processId, {
|
|
1058
|
+
child,
|
|
1059
|
+
status: "running",
|
|
1060
|
+
command: message.command,
|
|
1061
|
+
pid: child.pid,
|
|
1062
|
+
timestamp: new Date().toISOString(),
|
|
1063
|
+
});
|
|
1064
|
+
// Initialize logs for this process
|
|
1065
|
+
this.processLogs.set(processId, []);
|
|
1066
|
+
// Broadcast process started
|
|
1067
|
+
this.broadcast({
|
|
1068
|
+
type: "processStarted",
|
|
1069
|
+
processId,
|
|
1070
|
+
command: message.command,
|
|
1071
|
+
timestamp: new Date().toISOString(),
|
|
1072
|
+
logs: [],
|
|
1073
|
+
});
|
|
1074
|
+
// Capture stdout and stderr
|
|
1075
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", (data) => {
|
|
1076
|
+
const logData = data.toString();
|
|
1077
|
+
// Add to stored logs
|
|
1078
|
+
const logs = this.processLogs.get(processId) || [];
|
|
1079
|
+
logs.push(logData);
|
|
1080
|
+
this.processLogs.set(processId, logs);
|
|
1081
|
+
this.broadcast({
|
|
1082
|
+
type: "processStdout",
|
|
1083
|
+
processId,
|
|
1084
|
+
data: logData,
|
|
1085
|
+
timestamp: new Date().toISOString(),
|
|
1086
|
+
});
|
|
1087
|
+
});
|
|
1088
|
+
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on("data", (data) => {
|
|
1089
|
+
const logData = data.toString();
|
|
1090
|
+
// Add to stored logs
|
|
1091
|
+
const logs = this.processLogs.get(processId) || [];
|
|
1092
|
+
logs.push(logData);
|
|
1093
|
+
this.processLogs.set(processId, logs);
|
|
1094
|
+
this.broadcast({
|
|
1095
|
+
type: "processStderr",
|
|
1096
|
+
processId,
|
|
1097
|
+
data: logData,
|
|
1098
|
+
timestamp: new Date().toISOString(),
|
|
1099
|
+
});
|
|
1100
|
+
});
|
|
1101
|
+
child.on("error", (error) => {
|
|
1102
|
+
console.error(`Failed to execute command: ${error}`);
|
|
1103
|
+
this.runningProcesses.delete(processId);
|
|
1104
|
+
// Update the process status to error
|
|
1105
|
+
const processInfo = this.allProcesses.get(processId);
|
|
1106
|
+
if (processInfo) {
|
|
1107
|
+
this.allProcesses.set(processId, Object.assign(Object.assign({}, processInfo), { status: "error", error: error.message }));
|
|
1108
|
+
}
|
|
1109
|
+
this.broadcast({
|
|
1110
|
+
type: "processError",
|
|
1111
|
+
processId,
|
|
1112
|
+
error: error.message,
|
|
1113
|
+
timestamp: new Date().toISOString(),
|
|
1114
|
+
});
|
|
1115
|
+
});
|
|
1116
|
+
child.on("exit", (code) => {
|
|
1117
|
+
console.log(`Command exited with code ${code}`);
|
|
1118
|
+
// Remove from running processes but keep in allProcesses
|
|
1119
|
+
this.runningProcesses.delete(processId);
|
|
1120
|
+
// Update the process status to exited
|
|
1121
|
+
const processInfo = this.allProcesses.get(processId);
|
|
1122
|
+
if (processInfo) {
|
|
1123
|
+
this.allProcesses.set(processId, Object.assign(Object.assign({}, processInfo), { status: "exited", exitCode: code }));
|
|
1124
|
+
}
|
|
1125
|
+
this.broadcast({
|
|
1126
|
+
type: "processExited",
|
|
1127
|
+
processId,
|
|
1128
|
+
exitCode: code,
|
|
1129
|
+
timestamp: new Date().toISOString(),
|
|
1130
|
+
});
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1133
|
+
else {
|
|
1134
|
+
console.error('Invalid command: must start with "aider"');
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
else if (message.type === "getRunningProcesses") {
|
|
1138
|
+
// Send list of all processes (both running and completed) with their full logs
|
|
1139
|
+
const processes = Array.from(this.allProcesses.entries()).map(([id, procInfo]) => ({
|
|
1140
|
+
processId: id,
|
|
1141
|
+
command: procInfo.command,
|
|
1142
|
+
pid: procInfo.pid,
|
|
1143
|
+
status: procInfo.status,
|
|
1144
|
+
exitCode: procInfo.exitCode,
|
|
1145
|
+
error: procInfo.error,
|
|
1146
|
+
timestamp: procInfo.timestamp,
|
|
1147
|
+
logs: this.processLogs.get(id) || [],
|
|
1148
|
+
}));
|
|
1149
|
+
ws.send(JSON.stringify({
|
|
1150
|
+
type: "runningProcesses",
|
|
1151
|
+
processes,
|
|
1152
|
+
}));
|
|
1153
|
+
}
|
|
1154
|
+
else if (message.type === "getProcess") {
|
|
1155
|
+
// Send specific process with full logs
|
|
1156
|
+
const processId = message.processId;
|
|
1157
|
+
const procInfo = this.allProcesses.get(processId);
|
|
1158
|
+
if (procInfo) {
|
|
1159
|
+
ws.send(JSON.stringify({
|
|
1160
|
+
type: "processData",
|
|
1161
|
+
processId,
|
|
1162
|
+
command: procInfo.command,
|
|
1163
|
+
pid: procInfo.pid,
|
|
1164
|
+
status: procInfo.status,
|
|
1165
|
+
exitCode: procInfo.exitCode,
|
|
1166
|
+
error: procInfo.error,
|
|
1167
|
+
timestamp: procInfo.timestamp,
|
|
1168
|
+
logs: this.processLogs.get(processId) || [],
|
|
1169
|
+
}));
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
else if (message.type === "stdin") {
|
|
1173
|
+
// Handle stdin input for a process
|
|
1174
|
+
const processId = message.processId;
|
|
1175
|
+
const data = message.data;
|
|
1176
|
+
console.log("Received stdin for process", processId, ":", data);
|
|
1177
|
+
const childProcess = this.runningProcesses.get(processId);
|
|
1178
|
+
if (childProcess && childProcess.stdin) {
|
|
1179
|
+
console.log("Writing to process stdin");
|
|
1180
|
+
childProcess.stdin.write(data);
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
console.log("Cannot write to stdin - process not found or no stdin:", {
|
|
1184
|
+
processExists: !!childProcess,
|
|
1185
|
+
stdinExists: (childProcess === null || childProcess === void 0 ? void 0 : childProcess.stdin) ? true : false,
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
else if (message.type === "killProcess") {
|
|
1190
|
+
// Handle killing a process
|
|
1191
|
+
const processId = message.processId;
|
|
1192
|
+
console.log("Received killProcess for process", processId);
|
|
1193
|
+
const childProcess = this.runningProcesses.get(processId);
|
|
1194
|
+
if (childProcess) {
|
|
1195
|
+
console.log("Killing process");
|
|
1196
|
+
childProcess.kill("SIGTERM");
|
|
1197
|
+
// The process exit handler will update the status and broadcast the change
|
|
1198
|
+
}
|
|
1199
|
+
else {
|
|
1200
|
+
console.log("Cannot kill process - process not found:", {
|
|
1201
|
+
processExists: !!childProcess,
|
|
1202
|
+
});
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
catch (error) {
|
|
1207
|
+
console.error("Error handling WebSocket message:", error);
|
|
1208
|
+
}
|
|
1209
|
+
});
|
|
1210
|
+
ws.on("close", () => {
|
|
1211
|
+
this.clients.delete(ws);
|
|
1212
|
+
console.log("Client disconnected");
|
|
1213
|
+
});
|
|
1214
|
+
ws.on("error", (error) => {
|
|
1215
|
+
console.error("WebSocket error:", error);
|
|
1216
|
+
this.clients.delete(ws);
|
|
1217
|
+
});
|
|
1218
|
+
});
|
|
1219
|
+
// Start HTTP server
|
|
1220
|
+
const httpPort = Number(process.env.HTTP_PORT) || 3000;
|
|
1221
|
+
this.httpServer.listen(httpPort, () => {
|
|
1222
|
+
console.log(`HTTP server running on http://localhost:${httpPort}`);
|
|
1223
|
+
});
|
|
911
1224
|
}
|
|
912
1225
|
async stopSideCar(uid) {
|
|
913
1226
|
console.log(ansiC.green(ansiC.inverse(`stopSideCar ${uid}`)));
|
|
@@ -999,16 +1312,17 @@ import('${d}').then(async (x) => {
|
|
|
999
1312
|
waitForInitialPage: false,
|
|
1000
1313
|
executablePath,
|
|
1001
1314
|
headless: true,
|
|
1315
|
+
defaultViewport: null, // Disable default 800x600 viewport
|
|
1002
1316
|
dumpio: false,
|
|
1003
1317
|
devtools: false,
|
|
1004
1318
|
args: [
|
|
1005
|
-
"--disable-features=site-per-process",
|
|
1006
1319
|
"--allow-file-access-from-files",
|
|
1007
1320
|
"--allow-insecure-localhost",
|
|
1008
1321
|
"--allow-running-insecure-content",
|
|
1009
1322
|
"--auto-open-devtools-for-tabs",
|
|
1010
1323
|
"--disable-dev-shm-usage",
|
|
1011
1324
|
"--disable-extensions",
|
|
1325
|
+
"--disable-features=site-per-process",
|
|
1012
1326
|
"--disable-gpu",
|
|
1013
1327
|
"--disable-setuid-sandbox",
|
|
1014
1328
|
"--disable-site-isolation-trials",
|
|
@@ -1018,6 +1332,7 @@ import('${d}').then(async (x) => {
|
|
|
1018
1332
|
"--no-startup-window",
|
|
1019
1333
|
"--reduce-security-for-testing",
|
|
1020
1334
|
"--remote-allow-origins=*",
|
|
1335
|
+
"--start-maximized",
|
|
1021
1336
|
"--unsafely-treat-insecure-origin-as-secure=*",
|
|
1022
1337
|
`--remote-debugging-port=3234`,
|
|
1023
1338
|
// "--disable-features=IsolateOrigins,site-per-process",
|
|
@@ -1064,7 +1379,7 @@ import('${d}').then(async (x) => {
|
|
|
1064
1379
|
},
|
|
1065
1380
|
],
|
|
1066
1381
|
].forEach(async ([eps, launcher, runtime, watcher]) => {
|
|
1067
|
-
const metafile = `./testeranto/
|
|
1382
|
+
const metafile = `./testeranto/metafiles/${runtime}/${this.name}.json`;
|
|
1068
1383
|
await pollForFile(metafile);
|
|
1069
1384
|
Object.entries(eps).forEach(async ([inputFile, outputFile]) => {
|
|
1070
1385
|
// await pollForFile(outputFile);\
|
|
@@ -1131,11 +1446,26 @@ import('${d}').then(async (x) => {
|
|
|
1131
1446
|
this.nodeMetafileWatcher.close();
|
|
1132
1447
|
this.webMetafileWatcher.close();
|
|
1133
1448
|
this.importMetafileWatcher.close();
|
|
1449
|
+
// Close any remaining log streams
|
|
1450
|
+
Object.values(this.logStreams || {}).forEach((logs) => logs.closeAll());
|
|
1451
|
+
// Close WebSocket server
|
|
1452
|
+
this.wss.close(() => {
|
|
1453
|
+
console.log("WebSocket server closed");
|
|
1454
|
+
});
|
|
1455
|
+
// Close all client connections
|
|
1456
|
+
this.clients.forEach((client) => {
|
|
1457
|
+
client.terminate();
|
|
1458
|
+
});
|
|
1459
|
+
this.clients.clear();
|
|
1460
|
+
// Close HTTP server
|
|
1461
|
+
this.httpServer.close(() => {
|
|
1462
|
+
console.log("HTTP server closed");
|
|
1463
|
+
});
|
|
1134
1464
|
this.checkForShutdown();
|
|
1135
1465
|
}
|
|
1136
1466
|
async metafileOutputs(platform) {
|
|
1137
1467
|
const metafile = JSON.parse(fs
|
|
1138
|
-
.readFileSync(`./testeranto/
|
|
1468
|
+
.readFileSync(`./testeranto/metafiles/${platform}/${this.name}.json`)
|
|
1139
1469
|
.toString()).metafile;
|
|
1140
1470
|
if (!metafile)
|
|
1141
1471
|
return;
|
|
@@ -1177,6 +1507,144 @@ import('${d}').then(async (x) => {
|
|
|
1177
1507
|
}
|
|
1178
1508
|
});
|
|
1179
1509
|
}
|
|
1510
|
+
requestHandler(req, res) {
|
|
1511
|
+
// Parse the URL
|
|
1512
|
+
const parsedUrl = url.parse(req.url || "/");
|
|
1513
|
+
let pathname = parsedUrl.pathname || "/";
|
|
1514
|
+
// Handle root path
|
|
1515
|
+
if (pathname === "/") {
|
|
1516
|
+
pathname = "/index.html";
|
|
1517
|
+
}
|
|
1518
|
+
// Remove leading slash
|
|
1519
|
+
let filePath = pathname.substring(1);
|
|
1520
|
+
// Determine which directory to serve from
|
|
1521
|
+
if (filePath.startsWith("reports/")) {
|
|
1522
|
+
// Serve from reports directory
|
|
1523
|
+
filePath = `testeranto/${filePath}`;
|
|
1524
|
+
}
|
|
1525
|
+
else if (filePath.startsWith("metafiles/")) {
|
|
1526
|
+
// Serve from metafiles directory
|
|
1527
|
+
filePath = `testeranto/${filePath}`;
|
|
1528
|
+
}
|
|
1529
|
+
else if (filePath === "projects.json") {
|
|
1530
|
+
// Serve projects.json
|
|
1531
|
+
filePath = `testeranto/${filePath}`;
|
|
1532
|
+
}
|
|
1533
|
+
else {
|
|
1534
|
+
// For frontend assets, try multiple possible locations
|
|
1535
|
+
// First, try the dist directory
|
|
1536
|
+
const possiblePaths = [
|
|
1537
|
+
`dist/${filePath}`,
|
|
1538
|
+
`testeranto/dist/${filePath}`,
|
|
1539
|
+
`../dist/${filePath}`,
|
|
1540
|
+
`./${filePath}`,
|
|
1541
|
+
];
|
|
1542
|
+
// Find the first existing file
|
|
1543
|
+
let foundPath = null;
|
|
1544
|
+
for (const possiblePath of possiblePaths) {
|
|
1545
|
+
if (fs.existsSync(possiblePath)) {
|
|
1546
|
+
foundPath = possiblePath;
|
|
1547
|
+
break;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
if (foundPath) {
|
|
1551
|
+
filePath = foundPath;
|
|
1552
|
+
}
|
|
1553
|
+
else {
|
|
1554
|
+
// If no file found, serve index.html for SPA routing
|
|
1555
|
+
const indexPath = this.findIndexHtml();
|
|
1556
|
+
if (indexPath) {
|
|
1557
|
+
fs.readFile(indexPath, (err, data) => {
|
|
1558
|
+
if (err) {
|
|
1559
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1560
|
+
res.end("404 Not Found");
|
|
1561
|
+
return;
|
|
1562
|
+
}
|
|
1563
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1564
|
+
res.end(data);
|
|
1565
|
+
});
|
|
1566
|
+
return;
|
|
1567
|
+
}
|
|
1568
|
+
else {
|
|
1569
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1570
|
+
res.end("404 Not Found");
|
|
1571
|
+
return;
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
// Check if file exists
|
|
1576
|
+
fs.exists(filePath, (exists) => {
|
|
1577
|
+
if (!exists) {
|
|
1578
|
+
// For SPA routing, serve index.html if the path looks like a route
|
|
1579
|
+
if (!pathname.includes(".") && pathname !== "/") {
|
|
1580
|
+
const indexPath = this.findIndexHtml();
|
|
1581
|
+
if (indexPath) {
|
|
1582
|
+
fs.readFile(indexPath, (err, data) => {
|
|
1583
|
+
if (err) {
|
|
1584
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1585
|
+
res.end("404 Not Found");
|
|
1586
|
+
return;
|
|
1587
|
+
}
|
|
1588
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1589
|
+
res.end(data);
|
|
1590
|
+
});
|
|
1591
|
+
return;
|
|
1592
|
+
}
|
|
1593
|
+
else {
|
|
1594
|
+
// Serve a simple message if index.html is not found
|
|
1595
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
1596
|
+
res.end(`
|
|
1597
|
+
<html>
|
|
1598
|
+
<body>
|
|
1599
|
+
<h1>Testeranto is running</h1>
|
|
1600
|
+
<p>Frontend files are not built yet. Run 'npm run build' to build the frontend.</p>
|
|
1601
|
+
</body>
|
|
1602
|
+
</html>
|
|
1603
|
+
`);
|
|
1604
|
+
return;
|
|
1605
|
+
}
|
|
1606
|
+
}
|
|
1607
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
1608
|
+
res.end("404 Not Found");
|
|
1609
|
+
return;
|
|
1610
|
+
}
|
|
1611
|
+
// Read and serve the file
|
|
1612
|
+
fs.readFile(filePath, (err, data) => {
|
|
1613
|
+
if (err) {
|
|
1614
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
1615
|
+
res.end("500 Internal Server Error");
|
|
1616
|
+
return;
|
|
1617
|
+
}
|
|
1618
|
+
// Get MIME type
|
|
1619
|
+
const mimeType = mime.lookup(filePath) || "application/octet-stream";
|
|
1620
|
+
res.writeHead(200, { "Content-Type": mimeType });
|
|
1621
|
+
res.end(data);
|
|
1622
|
+
});
|
|
1623
|
+
});
|
|
1624
|
+
}
|
|
1625
|
+
findIndexHtml() {
|
|
1626
|
+
const possiblePaths = [
|
|
1627
|
+
"dist/index.html",
|
|
1628
|
+
"testeranto/dist/index.html",
|
|
1629
|
+
"../dist/index.html",
|
|
1630
|
+
"./index.html",
|
|
1631
|
+
];
|
|
1632
|
+
for (const path of possiblePaths) {
|
|
1633
|
+
if (fs.existsSync(path)) {
|
|
1634
|
+
return path;
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
return null;
|
|
1638
|
+
}
|
|
1639
|
+
broadcast(message) {
|
|
1640
|
+
const data = typeof message === "string" ? message : JSON.stringify(message);
|
|
1641
|
+
this.clients.forEach((client) => {
|
|
1642
|
+
if (client.readyState === 1) {
|
|
1643
|
+
// WebSocket.OPEN
|
|
1644
|
+
client.send(data);
|
|
1645
|
+
}
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1180
1648
|
checkQueue() {
|
|
1181
1649
|
const x = this.queue.pop();
|
|
1182
1650
|
if (!x) {
|