testeranto 0.166.0 → 0.171.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/dist/common/src/NavBar.js +45 -0
- package/dist/common/src/PM/main.js +81 -59
- package/dist/common/src/Pure.js +17 -15
- package/dist/common/src/ReportServer.js +48 -5
- package/dist/common/src/Web.js +35 -20
- package/dist/common/src/components/SunriseAnimation.test/implementation.js +1 -0
- package/dist/common/src/components/SunriseAnimation.test/index.js +1 -0
- package/dist/common/src/components/SunriseAnimation.test/interface.js +1 -0
- package/dist/common/src/components/SunriseAnimation.test/specification.js +1 -0
- package/dist/common/src/components/TestStatusBadge.js +55 -0
- package/dist/common/src/components/pure/ProjectPageView.js +204 -0
- package/dist/common/src/components/pure/ProjectPageView.test/adapter.js +20 -0
- package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +71 -0
- package/dist/common/src/components/pure/ProjectPageView.test/index.js +10 -0
- package/dist/common/src/components/pure/ProjectPageView.test/specification.js +19 -0
- package/dist/common/src/components/pure/ProjectPageView.test/types.js +2 -0
- package/dist/common/src/lib/BaseSuite.js +3 -3
- package/dist/common/src/lib/BaseSuite.test/test.js +1 -1
- package/dist/common/src/lib/abstractBase.js +41 -14
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.mock.js +1 -1
- package/dist/common/src/lib/basebuilder.js +9 -7
- package/dist/common/src/lib/core.test/MockCore.js +17 -15
- package/dist/common/src/lib/pmProxy.js +185 -64
- package/dist/common/testeranto.config.js +6 -0
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/App.js +3 -3
- package/dist/module/src/PM/main.js +81 -59
- package/dist/module/src/ProjectsPage.js +1 -110
- package/dist/module/src/Pure.js +17 -15
- package/dist/module/src/ReportServer.js +48 -5
- package/dist/module/src/TestPage.js +45 -16
- package/dist/module/src/Web.js +35 -20
- package/dist/module/src/components/SunriseAnimation.test/implementation.js +1 -0
- package/dist/module/src/components/SunriseAnimation.test/index.js +1 -0
- package/dist/module/src/components/SunriseAnimation.test/interface.js +1 -0
- package/dist/module/src/components/SunriseAnimation.test/specification.js +1 -0
- package/dist/module/src/components/pure/ProjectPageView.js +197 -0
- package/dist/module/src/components/pure/ProjectPageView.test/adapter.js +17 -0
- package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +68 -0
- package/dist/module/src/components/pure/ProjectPageView.test/index.js +5 -0
- package/dist/module/src/components/pure/ProjectPageView.test/specification.js +15 -0
- package/dist/module/src/components/pure/ProjectPageView.test/types.js +1 -0
- package/dist/module/src/components/pure/ProjectsPageView.js +58 -0
- package/dist/module/src/components/pure/TestPageView.js +136 -0
- package/dist/module/src/components/stateful/ProjectPage.js +63 -0
- package/dist/module/src/components/stateful/ProjectsPage.js +55 -0
- package/dist/module/src/components/stateful/TestPage.js +82 -0
- package/dist/module/src/lib/BaseSuite.js +3 -3
- package/dist/module/src/lib/BaseSuite.test/test.js +1 -1
- package/dist/module/src/lib/abstractBase.js +41 -14
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.mock.js +1 -1
- package/dist/module/src/lib/basebuilder.js +9 -7
- package/dist/module/src/lib/core.test/MockCore.js +17 -15
- package/dist/module/src/lib/pmProxy.js +185 -64
- package/dist/module/testeranto.config.js +6 -0
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/App.js +541 -495
- package/dist/prebuild/ReportServer.mjs +44 -4
- package/dist/prebuild/run.mjs +67 -39
- package/dist/types/src/NavBar.d.ts +19 -0
- package/dist/types/src/PM/index.d.ts +3 -1
- package/dist/types/src/PM/main.d.ts +0 -4
- package/dist/types/src/PM/node.d.ts +2 -2
- package/dist/types/src/components/SunriseAnimation.test/interface.d.ts +0 -0
- package/dist/types/src/components/SunriseAnimation.test/specification.d.ts +0 -0
- package/dist/types/src/components/TestStatusBadge.d.ts +15 -0
- package/dist/types/src/components/pure/ProjectPageView.d.ts +14 -0
- package/dist/types/src/components/pure/ProjectPageView.test/adapter.d.ts +3 -0
- package/dist/types/src/components/pure/ProjectPageView.test/implementation.d.ts +3 -0
- package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +3 -0
- package/dist/types/src/components/pure/ProjectPageView.test/specification.d.ts +3 -0
- package/dist/types/src/components/pure/ProjectPageView.test/types.d.ts +39 -0
- package/dist/types/src/lib/BaseSuite.d.ts +2 -0
- package/dist/types/src/lib/abstractBase.d.ts +12 -0
- package/dist/types/src/lib/index.d.ts +0 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/src/App.tsx +5 -9
- package/src/PM/index.ts +1 -1
- package/src/PM/main.ts +87 -82
- package/src/PM/node.ts +2 -2
- package/src/ProjectsPage.tsx +1 -164
- package/src/Pure.ts +17 -17
- package/src/ReportServer.ts +49 -6
- package/src/TestPage.tsx +78 -5
- package/src/Web.ts +35 -35
- package/src/components/SunriseAnimation.test/implementation.ts +0 -0
- package/src/components/SunriseAnimation.test/index.ts +0 -0
- package/src/components/SunriseAnimation.test/interface.ts +0 -0
- package/src/components/SunriseAnimation.test/specification.ts +0 -0
- package/src/components/pure/ProjectPageView.test/adapter.ts +21 -0
- package/src/components/pure/ProjectPageView.test/implementation.tsx +84 -0
- package/src/components/pure/ProjectPageView.test/index.ts +8 -0
- package/src/components/pure/ProjectPageView.test/specification.ts +31 -0
- package/src/components/pure/ProjectPageView.test/types.ts +55 -0
- package/src/components/pure/ProjectPageView.tsx +332 -0
- package/src/components/pure/ProjectsPageView.tsx +99 -0
- package/src/components/pure/TestPageView.tsx +278 -0
- package/src/components/stateful/ProjectPage.tsx +83 -0
- package/src/components/stateful/ProjectsPage.tsx +73 -0
- package/src/components/stateful/TestPage.tsx +107 -0
- package/src/lib/BaseSuite.test/test.ts +1 -1
- package/src/lib/BaseSuite.ts +9 -4
- package/src/lib/abstractBase.ts +45 -14
- package/src/lib/baseBuilder.test/baseBuilder.test.adapter.ts +1 -1
- package/src/lib/baseBuilder.test/baseBuilder.test.mock.ts +1 -1
- package/src/lib/basebuilder.ts +9 -9
- package/src/lib/core.test/MockCore.ts +26 -19
- package/src/lib/index.ts +1 -1
- package/src/lib/pmProxy.ts +184 -87
- package/testeranto/App.js +541 -495
- package/testeranto/bundles/node/allTests/{chunk-4ONUZRZ4.mjs → chunk-3EUGBAOM.mjs} +1 -1
- package/testeranto/bundles/node/allTests/{chunk-FFBRDUBH.mjs → chunk-E75CSRER.mjs} +247 -124
- package/testeranto/bundles/node/allTests/{chunk-NQEP7SN4.mjs → chunk-M6DO7VMB.mjs} +1 -1
- package/testeranto/bundles/node/allTests/metafile.json +41 -41
- package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +4 -4
- package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +4 -4
- package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +3 -3
- package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +11 -23
- package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +2 -2
- package/testeranto/bundles/pure/allTests/{chunk-CSMXYJ65.mjs → chunk-KHDVEHF7.mjs} +3 -18
- package/testeranto/bundles/pure/allTests/{chunk-QK4IXLF6.mjs → chunk-VMUSFSZM.mjs} +247 -124
- package/testeranto/bundles/pure/allTests/metafile.json +77 -47
- package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +2 -2
- package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +3 -3
- package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +3 -30
- package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +2283 -0
- package/testeranto/bundles/web/allTests/{chunk-TU3MJSSI.mjs → chunk-RLDR6LJN.mjs} +302 -127
- package/testeranto/bundles/web/allTests/chunk-U7AW26HL.mjs +997 -0
- package/testeranto/bundles/web/allTests/metafile.json +15065 -46
- package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.html +19 -0
- package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.mjs +37524 -0
- package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +20 -2
- package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +27 -3
- package/testeranto/reports/allTests/config.json +8 -0
- package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +9 -3
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/bdd_errors.txt +1 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +13 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +50 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +2 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +17 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +32 -0
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +68 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +6 -3
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +8 -1
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +6 -3
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +9 -3
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +2 -2
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +6 -3
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +10 -5
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +18 -9
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +8 -1
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +10 -5
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +2 -2
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +18 -9
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +10 -5
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +36 -18
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +8 -1
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.txt +0 -12
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +2 -2
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +11 -8
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +0 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +28 -14
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +8 -1
- package/testeranto/reports/allTests/summary.json +16 -9
- package/testeranto/reportsweb_build_errors +25 -0
- package/testeranto.config.ts +7 -0
- package/tsc.log +313 -237
- package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test/manifest.json +0 -1
- package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/manifest.json +0 -1
- package/testeranto/reports/allTests/src/Pure.test/pure/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/manifest.json +0 -1
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/manifest.json +0 -1
- /package/{testeranto/reports/allTests/src/Pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/implementation.d.ts} +0 -0
- /package/{testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/index.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testeranto",
|
|
3
3
|
"description": "the AI powered BDD test framework for typescript projects",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.171.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": "18.18.0"
|
|
7
7
|
},
|
|
@@ -204,7 +204,8 @@
|
|
|
204
204
|
"react-dom": "18.2.0",
|
|
205
205
|
"react-router-dom": "^7.7.0",
|
|
206
206
|
"sass": "^1.89.2",
|
|
207
|
-
"testeranto": "",
|
|
207
|
+
"testeranto": "latest",
|
|
208
|
+
"testeranto-react": "^0.0.2",
|
|
208
209
|
"tsc-prog": "^2.3.0",
|
|
209
210
|
"tsx": "^4.19.3",
|
|
210
211
|
"type-fest": "^4.41.0",
|
package/src/App.tsx
CHANGED
|
@@ -3,31 +3,27 @@
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import ReactDom from "react-dom/client";
|
|
5
5
|
import { HashRouter as Router, Routes, Route } from 'react-router-dom';
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import { TestPage } from './TestPage';
|
|
6
|
+
|
|
7
|
+
import { TestPage } from './components/stateful/TestPage';
|
|
9
8
|
import { Container } from 'react-bootstrap';
|
|
10
9
|
import { SettingsButton } from './SettingsButton';
|
|
10
|
+
import { ProjectPage } from './components/stateful/ProjectPage';
|
|
11
|
+
import { ProjectsPage } from './components/stateful/ProjectsPage';
|
|
11
12
|
|
|
12
13
|
export const App = () => {
|
|
13
14
|
return (
|
|
14
15
|
<Router>
|
|
15
16
|
<div className="d-flex flex-column min-vh-100" key={window.location.pathname}>
|
|
16
|
-
|
|
17
17
|
<main className="flex-grow-1 p-3">
|
|
18
18
|
<Container fluid>
|
|
19
19
|
<Routes>
|
|
20
20
|
<Route path="/" element={<ProjectsPage />} />
|
|
21
21
|
<Route path="/projects/:projectName" element={<ProjectPage />} />
|
|
22
|
-
<Route
|
|
23
|
-
path="/projects/:projectName/tests/*"
|
|
24
|
-
element={<TestPage />}
|
|
25
|
-
/>
|
|
22
|
+
<Route path="/projects/:projectName/tests/*" element={<TestPage />} />
|
|
26
23
|
<Route path="/projects/:projectName#:tab" element={<ProjectPage />} />
|
|
27
24
|
</Routes>
|
|
28
25
|
</Container>
|
|
29
26
|
</main>
|
|
30
|
-
|
|
31
27
|
<footer className="bg-light py-3 d-flex justify-content-between align-items-center">
|
|
32
28
|
<div className="ms-3">
|
|
33
29
|
<SettingsButton />
|
package/src/PM/index.ts
CHANGED
|
@@ -20,7 +20,7 @@ export abstract class PM {
|
|
|
20
20
|
testName: string
|
|
21
21
|
): Promise<string>;
|
|
22
22
|
abstract customclose();
|
|
23
|
-
abstract customScreenShot(opts:
|
|
23
|
+
abstract customScreenShot(opts: { path: string }, page?: string): any;
|
|
24
24
|
abstract end(uid: number): Promise<boolean>;
|
|
25
25
|
abstract existsSync(fp: string): Promise<boolean>;
|
|
26
26
|
abstract focusOn(selector: string): any;
|
package/src/PM/main.ts
CHANGED
|
@@ -242,11 +242,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
242
242
|
slowMo: 1,
|
|
243
243
|
waitForInitialPage: false,
|
|
244
244
|
executablePath,
|
|
245
|
-
|
|
246
|
-
headless: true,
|
|
247
|
-
|
|
245
|
+
headless: false,
|
|
248
246
|
dumpio: false,
|
|
249
|
-
devtools:
|
|
247
|
+
devtools: true,
|
|
250
248
|
|
|
251
249
|
args: [
|
|
252
250
|
"--disable-features=site-per-process",
|
|
@@ -369,36 +367,36 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
369
367
|
// });
|
|
370
368
|
}
|
|
371
369
|
|
|
372
|
-
async launchExternalTest(
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
) {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
}
|
|
370
|
+
// async launchExternalTest(
|
|
371
|
+
// externalTestName: string,
|
|
372
|
+
// externalTest: {
|
|
373
|
+
// watch: string[];
|
|
374
|
+
// exec: string;
|
|
375
|
+
// }
|
|
376
|
+
// ) {
|
|
377
|
+
// // fs.mkdirSync(`testeranto/externalTests/${externalTestName}`);
|
|
378
|
+
// // exec(externalTest.exec, (error, stdout, stderr) => {
|
|
379
|
+
// // if (error) {
|
|
380
|
+
// // fs.writeFileSync(
|
|
381
|
+
// // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
|
|
382
|
+
// // `${error.name}\n${error.message}\n${error.code}\n`
|
|
383
|
+
// // );
|
|
384
|
+
// // } else {
|
|
385
|
+
// // fs.writeFileSync(
|
|
386
|
+
// // `testeranto/externalTests/${externalTestName}/exitcode.txt`,
|
|
387
|
+
// // `0`
|
|
388
|
+
// // );
|
|
389
|
+
// // }
|
|
390
|
+
// // fs.writeFileSync(
|
|
391
|
+
// // `testeranto/externalTests/${externalTestName}/stdout.txt`,
|
|
392
|
+
// // stdout
|
|
393
|
+
// // );
|
|
394
|
+
// // fs.writeFileSync(
|
|
395
|
+
// // `testeranto/externalTests/${externalTestName}/stderr.txt`,
|
|
396
|
+
// // stderr
|
|
397
|
+
// // );
|
|
398
|
+
// // });
|
|
399
|
+
// }
|
|
402
400
|
|
|
403
401
|
async stop() {
|
|
404
402
|
console.log(ansiC.inverse("Testeranto-Run is shutting down gracefully..."));
|
|
@@ -544,7 +542,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
544
542
|
|
|
545
543
|
const builtfile = dest;
|
|
546
544
|
|
|
547
|
-
const webSideCares: Page[] = [];
|
|
545
|
+
// const webSideCares: Page[] = [];
|
|
548
546
|
|
|
549
547
|
// fs.writeFileSync(
|
|
550
548
|
// `${reportDest}/stdlog.txt`,
|
|
@@ -586,47 +584,49 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
586
584
|
statusMessagePretty(results.fails, src, "pure");
|
|
587
585
|
this.bddTestIsNowDone(src, results.fails);
|
|
588
586
|
})
|
|
589
|
-
.catch((
|
|
587
|
+
.catch((e1) => {
|
|
590
588
|
console.log(
|
|
591
|
-
ansiC.red(`launchPure - ${src} errored with: ${
|
|
589
|
+
ansiC.red(`launchPure - ${src} errored with: ${e1}`)
|
|
592
590
|
);
|
|
593
591
|
this.bddTestIsNowDone(src, -1);
|
|
592
|
+
statusMessagePretty(-1, src, "pure");
|
|
594
593
|
});
|
|
595
594
|
// .finally(() => {
|
|
596
595
|
// // webSideCares.forEach((webSideCar) => webSideCar.close());
|
|
597
596
|
// });
|
|
598
597
|
})
|
|
599
|
-
.catch((
|
|
598
|
+
.catch((e2) => {
|
|
600
599
|
console.log(
|
|
601
600
|
ansiColors.red(
|
|
602
601
|
`pure ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
|
|
603
602
|
)
|
|
604
603
|
);
|
|
605
604
|
|
|
606
|
-
this.writeFileSync(`${reportDest}/logs.txt`,
|
|
605
|
+
this.writeFileSync(`${reportDest}/logs.txt`, e2.stack, src);
|
|
607
606
|
this.bddTestIsNowDone(src, -1);
|
|
608
607
|
statusMessagePretty(-1, src, "pure");
|
|
609
608
|
// console.error(e);
|
|
610
609
|
})
|
|
611
610
|
.finally((x) => {
|
|
612
|
-
const fileSet = files[src] || new Set();
|
|
613
|
-
fs.writeFileSync(
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
);
|
|
611
|
+
// const fileSet = files[src] || new Set();
|
|
612
|
+
// fs.writeFileSync(
|
|
613
|
+
// reportDest + "/manifest.json",
|
|
614
|
+
// JSON.stringify(Array.from(fileSet))
|
|
615
|
+
// );
|
|
617
616
|
});
|
|
618
617
|
});
|
|
619
|
-
} catch (
|
|
618
|
+
} catch (e3) {
|
|
620
619
|
console.log(
|
|
621
620
|
ansiC.red(
|
|
622
621
|
ansiC.inverse(
|
|
623
|
-
`${src} 1 errored with: ${
|
|
622
|
+
`${src} 1 errored with: ${e3}. Check ${reportDest}/logs.txt for more info`
|
|
624
623
|
)
|
|
625
624
|
)
|
|
626
625
|
);
|
|
627
|
-
this.writeFileSync(`${reportDest}/logs.txt`,
|
|
626
|
+
this.writeFileSync(`${reportDest}/logs.txt`, e3.stack, src);
|
|
628
627
|
this.bddTestIsNowDone(src, -1);
|
|
629
628
|
statusMessagePretty(-1, src, "pure");
|
|
629
|
+
console.log("III) PURE IS EXITING BADLY WITH error", e3);
|
|
630
630
|
}
|
|
631
631
|
|
|
632
632
|
for (let i = 0; i <= portsToUse.length; i++) {
|
|
@@ -787,7 +787,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
787
787
|
});
|
|
788
788
|
child.on("error", (err) => {});
|
|
789
789
|
child.on("close", (code) => {
|
|
790
|
-
oStream.close();
|
|
790
|
+
// oStream.close();
|
|
791
791
|
server.close();
|
|
792
792
|
|
|
793
793
|
if (!files[src]) {
|
|
@@ -795,10 +795,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
795
795
|
}
|
|
796
796
|
// files[src].add(filepath);
|
|
797
797
|
|
|
798
|
-
fs.writeFileSync(
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
);
|
|
798
|
+
// fs.writeFileSync(
|
|
799
|
+
// reportDest + "/manifest.json",
|
|
800
|
+
// JSON.stringify(Array.from(files[src]))
|
|
801
|
+
// );
|
|
802
802
|
|
|
803
803
|
if (code === 255) {
|
|
804
804
|
console.log(
|
|
@@ -808,6 +808,8 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
808
808
|
);
|
|
809
809
|
this.bddTestIsNowDone(src, -1);
|
|
810
810
|
statusMessagePretty(-1, src, "node");
|
|
811
|
+
oStream.close();
|
|
812
|
+
return;
|
|
811
813
|
} else if (code === 0) {
|
|
812
814
|
this.bddTestIsNowDone(src, 0);
|
|
813
815
|
statusMessagePretty(0, src, "node");
|
|
@@ -876,10 +878,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
876
878
|
}
|
|
877
879
|
// files[src].add(filepath);
|
|
878
880
|
|
|
879
|
-
fs.writeFileSync(
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
);
|
|
881
|
+
// fs.writeFileSync(
|
|
882
|
+
// destFolder + "/manifest.json",
|
|
883
|
+
// JSON.stringify(Array.from(files[src]))
|
|
884
|
+
// );
|
|
883
885
|
|
|
884
886
|
delete files[src];
|
|
885
887
|
|
|
@@ -1250,7 +1252,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1250
1252
|
try {
|
|
1251
1253
|
return await (await x.default).receiveTestResourceConfig(${webArgz})
|
|
1252
1254
|
} catch (e) {
|
|
1253
|
-
console.log("
|
|
1255
|
+
console.log("web run failure", e.toString())
|
|
1254
1256
|
}
|
|
1255
1257
|
})`;
|
|
1256
1258
|
|
|
@@ -1283,10 +1285,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1283
1285
|
}
|
|
1284
1286
|
// files[t].add(filepath);
|
|
1285
1287
|
|
|
1286
|
-
fs.writeFileSync(
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
);
|
|
1288
|
+
// fs.writeFileSync(
|
|
1289
|
+
// destFolder + "/manifest.json",
|
|
1290
|
+
// JSON.stringify(Array.from(files[src]))
|
|
1291
|
+
// );
|
|
1290
1292
|
delete files[src];
|
|
1291
1293
|
|
|
1292
1294
|
Promise.all(screenshots[src] || []).then(() => {
|
|
@@ -1294,12 +1296,14 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1294
1296
|
page.close();
|
|
1295
1297
|
oStream.close();
|
|
1296
1298
|
});
|
|
1299
|
+
console.log("ostream is closed");
|
|
1300
|
+
return;
|
|
1297
1301
|
};
|
|
1298
1302
|
|
|
1299
1303
|
page.on("pageerror", (err: Error) => {
|
|
1300
1304
|
console.log(
|
|
1301
1305
|
ansiColors.red(
|
|
1302
|
-
`web ! ${src} failed to execute
|
|
1306
|
+
`web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
|
|
1303
1307
|
)
|
|
1304
1308
|
);
|
|
1305
1309
|
|
|
@@ -1326,38 +1330,39 @@ export class PM_Main extends PM_WithEslintAndTsc {
|
|
|
1326
1330
|
});
|
|
1327
1331
|
|
|
1328
1332
|
page.on("console", (log: ConsoleMessage) => {
|
|
1329
|
-
|
|
1330
|
-
oStream.
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1333
|
+
console.log("console message: ", log.text());
|
|
1334
|
+
if (oStream.closed) {
|
|
1335
|
+
console.log("missed console message: ", log.text());
|
|
1336
|
+
return;
|
|
1337
|
+
} else {
|
|
1338
|
+
oStream.write(log.text());
|
|
1339
|
+
oStream.write("\n");
|
|
1340
|
+
oStream.write(JSON.stringify(log.location()));
|
|
1341
|
+
oStream.write("\n");
|
|
1342
|
+
oStream.write(JSON.stringify(log.stackTrace()));
|
|
1343
|
+
oStream.write("\n");
|
|
1344
|
+
}
|
|
1335
1345
|
});
|
|
1336
1346
|
|
|
1337
1347
|
await page.goto(`file://${`${destFolder}.html`}`, {});
|
|
1338
1348
|
|
|
1339
|
-
this.webSidecars[Math.random()] = page.mainFrame()._id;
|
|
1340
|
-
|
|
1341
1349
|
await page
|
|
1342
1350
|
.evaluate(evaluation)
|
|
1343
1351
|
.then(async ({ fails, failed, features }: IFinalResults) => {
|
|
1344
|
-
// this.receiveFeatures(features, destFolder, src, "web");
|
|
1345
|
-
// this.receiveFeaturesV2(reportDest, src, "web");
|
|
1346
|
-
|
|
1347
1352
|
statusMessagePretty(fails, src, "web");
|
|
1348
1353
|
this.bddTestIsNowDone(src, fails);
|
|
1349
1354
|
close();
|
|
1350
1355
|
})
|
|
1351
1356
|
.catch((e) => {
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1357
|
+
console.log(ansiC.red(ansiC.inverse(e)));
|
|
1358
|
+
|
|
1359
|
+
console.log(
|
|
1360
|
+
ansiC.red(
|
|
1361
|
+
ansiC.inverse(
|
|
1362
|
+
`web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
|
|
1363
|
+
)
|
|
1364
|
+
)
|
|
1365
|
+
);
|
|
1361
1366
|
this.bddTestIsNowDone(src, -1);
|
|
1362
1367
|
})
|
|
1363
1368
|
.finally(() => {
|
package/src/PM/node.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import net from "net";
|
|
5
5
|
import fs from "fs";
|
|
6
6
|
import path from "path";
|
|
7
|
-
import { ScreencastOptions } from "puppeteer-core";
|
|
7
|
+
import { ScreencastOptions, ScreenshotOptions } from "puppeteer-core";
|
|
8
8
|
import { PassThrough } from "stream";
|
|
9
9
|
|
|
10
10
|
import { ITLog, ITTestResourceConfiguration } from "../lib";
|
|
@@ -151,7 +151,7 @@ export class PM_Node extends PM {
|
|
|
151
151
|
return this.send("screencastStop", ...arguments);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
customScreenShot(x:
|
|
154
|
+
customScreenShot(x: ScreenshotOptions, y?: string) {
|
|
155
155
|
const opts = x[0];
|
|
156
156
|
const page = x[1];
|
|
157
157
|
|
package/src/ProjectsPage.tsx
CHANGED
|
@@ -1,164 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import React, { useEffect, useState } from 'react';
|
|
3
|
-
import { Table, Alert, Badge, Container, Navbar } from 'react-bootstrap';
|
|
4
|
-
import { ISummary } from './Types';
|
|
5
|
-
import { useNavigate } from 'react-router-dom';
|
|
6
|
-
import { NavBar } from "./NavBar";
|
|
7
|
-
|
|
8
|
-
type ProjectSummary = {
|
|
9
|
-
name: string;
|
|
10
|
-
testCount: number;
|
|
11
|
-
nodeStatus: 'success' | 'failed' | 'unknown';
|
|
12
|
-
webStatus: 'success' | 'failed' | 'unknown';
|
|
13
|
-
pureStatus: 'success' | 'failed' | 'unknown';
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const ProjectsPage = () => {
|
|
17
|
-
const [projects, setProjects] = useState<ProjectSummary[]>([]);
|
|
18
|
-
const [summaries, setSummaries] = useState<Record<string, ISummary>>({});
|
|
19
|
-
const [loading, setLoading] = useState(true);
|
|
20
|
-
const [error, setError] = useState<string | null>(null);
|
|
21
|
-
|
|
22
|
-
const navigate = useNavigate();
|
|
23
|
-
const [configs, setConfigs] = useState<Record<string, object>>({});
|
|
24
|
-
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
const fetchProjects = async () => {
|
|
27
|
-
try {
|
|
28
|
-
const projectsRes = await fetch(`projects.json`);
|
|
29
|
-
const projectNames = await projectsRes.json();
|
|
30
|
-
|
|
31
|
-
// const projectNames = Object.keys(config.projects);
|
|
32
|
-
const projectsData = await Promise.all(
|
|
33
|
-
projectNames.map(async (name) => {
|
|
34
|
-
const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
|
|
35
|
-
fetch(`reports/${name}/summary.json`),
|
|
36
|
-
fetch(`bundles/node/${name}/metafile.json`),
|
|
37
|
-
fetch(`bundles/web/${name}/metafile.json`),
|
|
38
|
-
fetch(`bundles/pure/${name}/metafile.json`),
|
|
39
|
-
fetch(`reports/${name}/config.json`),
|
|
40
|
-
|
|
41
|
-
]);
|
|
42
|
-
|
|
43
|
-
const [summary, nodeData, webData, pureData, configData] = await Promise.all([
|
|
44
|
-
summaryRes.json(),
|
|
45
|
-
nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
|
|
46
|
-
webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
|
|
47
|
-
pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
|
|
48
|
-
configRes.json(),
|
|
49
|
-
]);
|
|
50
|
-
|
|
51
|
-
setSummaries(prev => ({ ...prev, [name]: summary }));
|
|
52
|
-
setConfigs(prev => ({ ...prev, [name]: configData }));
|
|
53
|
-
|
|
54
|
-
return {
|
|
55
|
-
name,
|
|
56
|
-
testCount: Object.keys(summary).length,
|
|
57
|
-
nodeStatus: nodeData.errors?.length ? 'failed' : nodeData.warnings?.length ? 'warning' : 'success',
|
|
58
|
-
webStatus: webData.errors?.length ? 'failed' : webData.warnings?.length ? 'warning' : 'success',
|
|
59
|
-
pureStatus: pureData.errors?.length ? 'failed' : pureData.warnings?.length ? 'warning' : 'success',
|
|
60
|
-
config: Object.keys(configData).length,
|
|
61
|
-
};
|
|
62
|
-
})
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
setProjects(projectsData);
|
|
66
|
-
} catch (err) {
|
|
67
|
-
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
68
|
-
} finally {
|
|
69
|
-
setLoading(false);
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
fetchProjects();
|
|
74
|
-
}, []);
|
|
75
|
-
|
|
76
|
-
const getStatusIcon = (status: string) => {
|
|
77
|
-
switch (status) {
|
|
78
|
-
case 'success': return '✅';
|
|
79
|
-
case 'failed': return '❌';
|
|
80
|
-
case 'warning': return '⚠️';
|
|
81
|
-
default: return '❓';
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
if (loading) return <div>Loading projects...</div>;
|
|
86
|
-
if (error) return <Alert variant="danger">Error: {error}</Alert>;
|
|
87
|
-
|
|
88
|
-
console.log(configs);
|
|
89
|
-
|
|
90
|
-
return (
|
|
91
|
-
<div className="p-3">
|
|
92
|
-
<NavBar title="Testeranto" backLink={null} />
|
|
93
|
-
<Table striped bordered hover responsive>
|
|
94
|
-
<thead>
|
|
95
|
-
<tr>
|
|
96
|
-
<th>Project</th>
|
|
97
|
-
<th>Tests</th>
|
|
98
|
-
<th>Node</th>
|
|
99
|
-
<th>Web</th>
|
|
100
|
-
<th>Pure</th>
|
|
101
|
-
</tr>
|
|
102
|
-
</thead>
|
|
103
|
-
<tbody>
|
|
104
|
-
{projects.map((project) => (
|
|
105
|
-
<tr key={project.name}>
|
|
106
|
-
<td>
|
|
107
|
-
<a href="#" onClick={(e) => {
|
|
108
|
-
e.preventDefault();
|
|
109
|
-
navigate(`/projects/${project.name}`);
|
|
110
|
-
}}>{project.name}</a>
|
|
111
|
-
</td>
|
|
112
|
-
<td>
|
|
113
|
-
<div style={{ maxHeight: '200px', overflowY: 'auto' }}>
|
|
114
|
-
{summaries[project.name] ? (
|
|
115
|
-
Object.keys(summaries[project.name]).map(testName => {
|
|
116
|
-
const testData = summaries[project.name][testName];
|
|
117
|
-
const runTime = configs[project.name].tests.find((t) => t[0] === testName)[1];
|
|
118
|
-
const hasRuntimeErrors = testData.runTimeErrors > 0;
|
|
119
|
-
const hasStaticErrors = testData.typeErrors > 0 || testData.staticErrors > 0;
|
|
120
|
-
|
|
121
|
-
return (
|
|
122
|
-
<div key={testName}>
|
|
123
|
-
<a
|
|
124
|
-
href={`#/projects/${project.name}/tests/${encodeURIComponent(testName)}/${runTime}`}
|
|
125
|
-
>
|
|
126
|
-
{hasRuntimeErrors ? '❌ ' : hasStaticErrors ? '⚠️ ' : ''}
|
|
127
|
-
{testName.split('/').pop()}
|
|
128
|
-
</a>
|
|
129
|
-
</div>
|
|
130
|
-
)
|
|
131
|
-
})
|
|
132
|
-
) : (
|
|
133
|
-
<div>Loading tests...</div>
|
|
134
|
-
)}
|
|
135
|
-
</div>
|
|
136
|
-
</td>
|
|
137
|
-
<td>
|
|
138
|
-
<a
|
|
139
|
-
href={`#/projects/${project.name}#node`}
|
|
140
|
-
>
|
|
141
|
-
{getStatusIcon(project.nodeStatus)} Node build logs
|
|
142
|
-
</a>
|
|
143
|
-
</td>
|
|
144
|
-
<td>
|
|
145
|
-
<a
|
|
146
|
-
href={`#/projects/${project.name}#web`}
|
|
147
|
-
>
|
|
148
|
-
{getStatusIcon(project.webStatus)} Web build logs
|
|
149
|
-
</a>
|
|
150
|
-
</td>
|
|
151
|
-
<td>
|
|
152
|
-
<a
|
|
153
|
-
href={`#/projects/${project.name}#pure`}
|
|
154
|
-
>
|
|
155
|
-
{getStatusIcon(project.pureStatus)} Pure build logs
|
|
156
|
-
</a>
|
|
157
|
-
</td>
|
|
158
|
-
</tr>
|
|
159
|
-
))}
|
|
160
|
-
</tbody>
|
|
161
|
-
</Table>
|
|
162
|
-
</div>
|
|
163
|
-
);
|
|
164
|
-
};
|
|
1
|
+
export { ProjectsPage } from './components/stateful/ProjectsPage';
|
package/src/Pure.ts
CHANGED
|
@@ -46,22 +46,22 @@ export class PureTesteranto<
|
|
|
46
46
|
const t: ITTestResourceConfiguration = JSON.parse(partialTestResource);
|
|
47
47
|
const pm = new PM_Pure(t);
|
|
48
48
|
|
|
49
|
-
console.log("[DEBUG] Current test jobs:", this.testJobs?.length);
|
|
49
|
+
// console.log("[DEBUG] Current test jobs:", this.testJobs?.length);
|
|
50
50
|
|
|
51
|
-
if (!this.testJobs || this.testJobs.length === 0) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
51
|
+
// if (!this.testJobs || this.testJobs.length === 0) {
|
|
52
|
+
// console.error(
|
|
53
|
+
// "[ERROR] No test jobs available - checking specs:",
|
|
54
|
+
// this.specs?.length
|
|
55
|
+
// );
|
|
56
|
+
// console.error("[ERROR] Test implementation:", this.testImplementation);
|
|
57
|
+
// return {
|
|
58
|
+
// failed: true,
|
|
59
|
+
// fails: 1,
|
|
60
|
+
// artifacts: [],
|
|
61
|
+
// // logPromise: Promise.resolve(),
|
|
62
|
+
// features: [],
|
|
63
|
+
// };
|
|
64
|
+
// }
|
|
65
65
|
|
|
66
66
|
try {
|
|
67
67
|
console.log("[DEBUG] Executing test job with PM:", pm);
|
|
@@ -72,9 +72,9 @@ export class PureTesteranto<
|
|
|
72
72
|
console.error("[ERROR] Test job failed:", e);
|
|
73
73
|
return {
|
|
74
74
|
failed: true,
|
|
75
|
-
fails: 1,
|
|
75
|
+
fails: -1,
|
|
76
76
|
artifacts: [],
|
|
77
|
-
logPromise: Promise.resolve(),
|
|
77
|
+
// logPromise: Promise.resolve(),
|
|
78
78
|
features: [],
|
|
79
79
|
};
|
|
80
80
|
}
|
package/src/ReportServer.ts
CHANGED
|
@@ -45,15 +45,58 @@ const server = http.createServer((req, res) => {
|
|
|
45
45
|
req.on('end', () => {
|
|
46
46
|
safeResponse(() => {
|
|
47
47
|
const filePath = path.join(process.cwd(), req.url || '');
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
// First check if file exists
|
|
50
50
|
fs.stat(filePath, (err, stats) => {
|
|
51
51
|
if (err || !stats.isFile()) {
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
// Check if directory exists
|
|
53
|
+
fs.stat(filePath, (dirErr, dirStats) => {
|
|
54
|
+
if (!dirErr && dirStats.isDirectory()) {
|
|
55
|
+
// Serve directory listing
|
|
56
|
+
fs.readdir(filePath, (readErr, files) => {
|
|
57
|
+
if (readErr) {
|
|
58
|
+
res.writeHead(500);
|
|
59
|
+
return res.end('Error reading directory');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
63
|
+
res.write(`
|
|
64
|
+
<html>
|
|
65
|
+
<head>
|
|
66
|
+
<title>Directory Listing: ${req.url}</title>
|
|
67
|
+
<style>
|
|
68
|
+
body { font-family: sans-serif; margin: 2rem; }
|
|
69
|
+
h1 { color: #333; }
|
|
70
|
+
ul { list-style: none; padding: 0; }
|
|
71
|
+
li { padding: 0.5rem; }
|
|
72
|
+
li a { color: #0366d6; text-decoration: none; }
|
|
73
|
+
li a:hover { text-decoration: underline; }
|
|
74
|
+
</style>
|
|
75
|
+
</head>
|
|
76
|
+
<body>
|
|
77
|
+
<h1>Directory: ${req.url}</h1>
|
|
78
|
+
<ul>
|
|
79
|
+
${files.map(file => `
|
|
80
|
+
<li>
|
|
81
|
+
<a href="${path.join(req.url || '', file)}">
|
|
82
|
+
${file}${file.endsWith('/') ? '/' : ''}
|
|
83
|
+
</a>
|
|
84
|
+
</li>
|
|
85
|
+
`).join('')}
|
|
86
|
+
</ul>
|
|
87
|
+
</body>
|
|
88
|
+
</html>
|
|
89
|
+
`);
|
|
90
|
+
res.end();
|
|
91
|
+
});
|
|
92
|
+
} else {
|
|
93
|
+
// Neither file nor directory exists - send 404
|
|
94
|
+
if (!res.headersSent) {
|
|
95
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
96
|
+
res.end('File not found');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
57
100
|
return;
|
|
58
101
|
}
|
|
59
102
|
|