testeranto 0.198.0 → 0.200.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/bin/test_runner +0 -0
- package/bin/testeranto +0 -0
- package/bundle.js +2 -2
- package/cmd/test_runner/main.go +65 -0
- package/cmd/testeranto/main.go +37 -0
- package/dist/common/src/PM/main.js +126 -11
- package/dist/common/src/PM/pitonoRunner.js +54 -0
- package/dist/common/src/components/pure/TestPageView.js +180 -65
- package/dist/common/src/components/stateful/TestPage.js +50 -11
- package/dist/common/src/lib/abstractBase.test/index.js +1 -0
- package/dist/common/src/run.js +48 -82
- package/dist/common/src/{build.js → testeranto.js} +107 -55
- package/dist/common/src/utils/golingvuMetafile.js +116 -0
- package/dist/common/src/utils/logFiles.js +2 -1
- package/dist/common/src/utils/pitonoMetafile.js +67 -0
- package/dist/common/src/utils.js +40 -1
- package/dist/common/testeranto.config.js +23 -21
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/PM/main.js +126 -11
- package/dist/module/src/PM/pitonoRunner.js +47 -0
- package/dist/module/src/components/pure/TestPageView.js +180 -65
- package/dist/module/src/components/stateful/TestPage.js +50 -11
- package/dist/module/src/lib/abstractBase.test/index.js +1 -0
- package/dist/module/src/run.js +49 -45
- package/dist/module/src/{build.js → testeranto.js} +107 -55
- package/dist/module/src/utils/golingvuMetafile.js +109 -0
- package/dist/module/src/utils/logFiles.js +2 -1
- package/dist/module/src/utils/pitonoMetafile.js +60 -0
- package/dist/module/src/utils.js +40 -1
- package/dist/module/testeranto.config.js +23 -21
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/App.js +81 -17
- package/dist/types/src/PM/main.d.ts +2 -0
- package/dist/types/src/PM/pitonoRunner.d.ts +7 -0
- package/dist/types/src/Types.d.ts +1 -1
- package/dist/types/src/run.d.ts +0 -1
- package/dist/types/src/utils/golingvuMetafile.d.ts +19 -0
- package/dist/types/src/utils/logFiles.d.ts +5 -1
- package/dist/types/src/utils/pitonoMetafile.d.ts +7 -0
- package/dist/types/src/utils.d.ts +5 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/docs/index.md +13 -13
- package/example/test_example.py +106 -0
- package/go.mod +3 -0
- package/package.json +14 -14
- package/pitono/__init__.py +54 -0
- package/pitono/base_given.py +131 -0
- package/pitono/base_suite.py +95 -0
- package/pitono/base_then.py +50 -0
- package/pitono/base_when.py +52 -0
- package/pitono/core_generator.py +110 -0
- package/pitono/pitono.egg-info/PKG-INFO +17 -0
- package/pitono/pitono.egg-info/SOURCES.txt +7 -0
- package/pitono/pitono.egg-info/dependency_links.txt +1 -0
- package/pitono/pitono.egg-info/entry_points.txt +2 -0
- package/pitono/pitono.egg-info/top_level.txt +1 -0
- package/pitono/pyproject.toml +26 -0
- package/pitono/setup.py +40 -0
- package/pitono/simple_adapter.py +24 -0
- package/pitono/types.py +78 -0
- package/sampleMetafile.json +56 -0
- package/src/PM/main.ts +146 -17
- package/src/PM/pitonoRunner.ts +49 -0
- package/src/Types.ts +1 -1
- package/src/components/pure/TestPageView.tsx +175 -8
- package/src/components/stateful/TestPage.tsx +57 -16
- package/src/core/types.go +36 -0
- package/src/golingvu/README.md +3 -0
- package/src/golingvu/base_given.go +76 -0
- package/src/golingvu/base_suite.go +39 -0
- package/src/golingvu/base_suite_test.go +197 -0
- package/src/golingvu/base_then.go +21 -0
- package/src/golingvu/base_when.go +21 -0
- package/src/golingvu/golingvu.go +179 -0
- package/src/golingvu/test_adapter.go +33 -0
- package/src/golingvu/types.go +86 -0
- package/src/lib/abstractBase.test/index.ts +1 -0
- package/src/pitono/README.md +3 -0
- package/src/run.ts +48 -48
- package/src/templates/frontpage.html +26 -17
- package/src/{build.ts → testeranto.ts} +128 -58
- package/src/utils/golingvuMetafile.ts +165 -0
- package/src/utils/logFiles.ts +2 -1
- package/src/utils/pitonoMetafile.ts +68 -0
- package/src/utils.ts +38 -1
- package/testeranto/App.js +81 -17
- package/testeranto/metafiles/golang/core.json +72 -0
- package/testeranto/metafiles/node/core.json +21 -459
- package/testeranto/metafiles/pure/core.json +18 -119
- package/testeranto/metafiles/web/core.json +37 -16797
- package/testeranto/reports/core/config.json +8 -40
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +6 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +12 -1
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +2 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +11 -1
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +2 -0
- package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/prompt.txt +13 -3
- package/testeranto/reports/core/summary.json +9 -45
- package/testeranto.config.ts +25 -21
- package/tsc.log +46 -7
- package/dist/common/src/lib/mocks.test.js +0 -11
- package/dist/module/src/lib/mocks.test.js +0 -11
- package/dist/prebuild/build.mjs +0 -578
- package/dist/prebuild/run.mjs +0 -2290
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types/src/lib/mocks.test.d.ts +0 -0
- package/src/lib/mocks.test.ts +0 -11
- 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 +0 -17
- package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +0 -14
- package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +0 -66
- 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 +0 -67
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +0 -1
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +0 -2
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/message.txt +0 -17
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/prompt.txt +0 -16
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/tests.json +0 -68
- package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/type_errors.txt +0 -56
- 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 +0 -22
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +0 -1
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +0 -2
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -13
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -17
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -16
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/tests.json +0 -88
- package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -45
- 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 +0 -0
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/exit.log +0 -1
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/info.log +0 -2
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/lint_errors.txt +0 -47
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/message.txt +0 -17
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/prompt.txt +0 -17
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/tests.json +0 -57
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/type_errors.txt +0 -99
- package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/warn.log +0 -0
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/exit.log +0 -1
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/lint_errors.txt +0 -0
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/message.txt +0 -17
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/prompt.txt +0 -17
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stderr.log +0 -18
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stdout.log +0 -0
- package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/type_errors.txt +0 -32
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +0 -1
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +0 -15
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +0 -17
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +0 -17
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +0 -66
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +0 -10
- package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +0 -47
- /package/dist/types/src/{build.d.ts → testeranto.d.ts} +0 -0
|
@@ -80,9 +80,44 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
80
80
|
const [expandedSections, setExpandedSections] = (0, react_1.useState)({
|
|
81
81
|
standardLogs: true,
|
|
82
82
|
runtimeLogs: true,
|
|
83
|
-
sourceFiles: true
|
|
83
|
+
sourceFiles: true,
|
|
84
|
+
buildErrors: true,
|
|
84
85
|
});
|
|
85
86
|
const [isNavbarCollapsed, setIsNavbarCollapsed] = (0, react_1.useState)(false);
|
|
87
|
+
// Extract build errors and warnings relevant to this test
|
|
88
|
+
const [buildErrors, setBuildErrors] = (0, react_1.useState)({ errors: [], warnings: [] });
|
|
89
|
+
(0, react_1.useEffect)(() => {
|
|
90
|
+
var _a, _b, _c;
|
|
91
|
+
const metafile = (_a = logs.build_logs) === null || _a === void 0 ? void 0 : _a.metafile;
|
|
92
|
+
if (!metafile) {
|
|
93
|
+
setBuildErrors({ errors: [], warnings: [] });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const sourceFilesSet = new Set();
|
|
97
|
+
// Collect all input files from metafile outputs related to this test
|
|
98
|
+
Object.entries(metafile.outputs || {}).forEach(([outputPath, output]) => {
|
|
99
|
+
// Normalize paths for comparison
|
|
100
|
+
const normalizedTestName = testName.replace(/\\/g, '/');
|
|
101
|
+
const normalizedEntryPoint = output.entryPoint ? output.entryPoint.replace(/\\/g, '/') : '';
|
|
102
|
+
if (normalizedEntryPoint.includes(normalizedTestName)) {
|
|
103
|
+
Object.keys(output.inputs || {}).forEach((inputPath) => {
|
|
104
|
+
sourceFilesSet.add(inputPath.replace(/\\/g, '/'));
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Filter errors and warnings to those originating from source files of this test
|
|
109
|
+
const filteredErrors = (((_b = logs.build_logs) === null || _b === void 0 ? void 0 : _b.errors) || []).filter((err) => {
|
|
110
|
+
if (!err.location || !err.location.file)
|
|
111
|
+
return false;
|
|
112
|
+
return sourceFilesSet.has(err.location.file.replace(/\\/g, '/'));
|
|
113
|
+
});
|
|
114
|
+
const filteredWarnings = (((_c = logs.build_logs) === null || _c === void 0 ? void 0 : _c.warnings) || []).filter((warn) => {
|
|
115
|
+
if (!warn.location || !warn.location.file)
|
|
116
|
+
return false;
|
|
117
|
+
return sourceFilesSet.has(warn.location.file.replace(/\\/g, '/'));
|
|
118
|
+
});
|
|
119
|
+
setBuildErrors({ errors: filteredErrors, warnings: filteredWarnings });
|
|
120
|
+
}, [logs, testName]);
|
|
86
121
|
// Update customMessage when logs change
|
|
87
122
|
(0, react_1.useEffect)(() => {
|
|
88
123
|
if (typeof logs['message.txt'] === 'string' && logs['message.txt'].trim()) {
|
|
@@ -123,67 +158,94 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
123
158
|
}
|
|
124
159
|
};
|
|
125
160
|
const renderTestResults = (testData) => {
|
|
126
|
-
return (react_1.default.createElement("div", { className: "test-results" },
|
|
127
|
-
react_1.default.createElement("div", { className: "
|
|
128
|
-
react_1.default.createElement("div", { className: "
|
|
129
|
-
react_1.default.createElement("div",
|
|
130
|
-
react_1.default.createElement("h4", null,
|
|
131
|
-
"Given: ",
|
|
132
|
-
given.name),
|
|
133
|
-
given.features && given.features.length > 0 && (react_1.default.createElement("div", { className: "mt-1" },
|
|
134
|
-
react_1.default.createElement("small", null, "Features:"),
|
|
135
|
-
react_1.default.createElement("ul", { className: "list-unstyled" }, given.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer", className: "text-white" }, new URL(feature).hostname)) : (react_1.default.createElement("span", { className: "text-white" }, feature))))))))),
|
|
136
|
-
given.artifacts && given.artifacts.length > 0 && (react_1.default.createElement("div", { className: "dropdown" },
|
|
137
|
-
react_1.default.createElement("button", { className: "btn btn-sm btn-light dropdown-toggle", type: "button", "data-bs-toggle": "dropdown" },
|
|
138
|
-
"Artifacts (",
|
|
139
|
-
given.artifacts.length,
|
|
140
|
-
")"),
|
|
141
|
-
react_1.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" }, given.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
|
|
142
|
-
react_1.default.createElement("a", { className: "dropdown-item", href: `reports/${projectName}/${testName
|
|
143
|
-
.split(".")
|
|
144
|
-
.slice(0, -1)
|
|
145
|
-
.join(".")}/${runtime}/${artifact}`, target: "_blank", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))),
|
|
146
|
-
react_1.default.createElement("div", { className: "card-body" },
|
|
147
|
-
given.whens.map((when, j) => (react_1.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error
|
|
148
|
-
? "bg-danger text-white"
|
|
149
|
-
: "bg-success text-white"}` },
|
|
150
|
-
react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
|
|
161
|
+
return (react_1.default.createElement("div", { className: "test-results" },
|
|
162
|
+
testData.givens.map((given, i) => (react_1.default.createElement("div", { key: i, className: "mb-4 card" },
|
|
163
|
+
react_1.default.createElement("div", { className: "card-header bg-primary text-white" },
|
|
164
|
+
react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
|
|
151
165
|
react_1.default.createElement("div", null,
|
|
152
|
-
react_1.default.createElement("
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
react_1.default.createElement("h4", null,
|
|
167
|
+
"Given: ",
|
|
168
|
+
given.name),
|
|
169
|
+
given.features && given.features.length > 0 && (react_1.default.createElement("div", { className: "mt-1" },
|
|
170
|
+
react_1.default.createElement("small", null, "Features:"),
|
|
171
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, given.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer", className: "text-white" }, new URL(feature).hostname)) : (react_1.default.createElement("span", { className: "text-white" }, feature))))))))),
|
|
172
|
+
given.artifacts && given.artifacts.length > 0 && (react_1.default.createElement("div", { className: "dropdown" },
|
|
173
|
+
react_1.default.createElement("button", { className: "btn btn-sm btn-light dropdown-toggle", type: "button", "data-bs-toggle": "dropdown" },
|
|
174
|
+
"Artifacts (",
|
|
175
|
+
given.artifacts.length,
|
|
176
|
+
")"),
|
|
177
|
+
react_1.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" }, given.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
|
|
178
|
+
react_1.default.createElement("a", { className: "dropdown-item", href: `reports/${projectName}/${testName
|
|
164
179
|
.split(".")
|
|
165
180
|
.slice(0, -1)
|
|
166
|
-
.join(".")}/${runtime}/${artifact}`, target: "_blank",
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
react_1.default.createElement("div",
|
|
181
|
+
.join(".")}/${runtime}/${artifact}`, target: "_blank", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))),
|
|
182
|
+
react_1.default.createElement("div", { className: "card-body" },
|
|
183
|
+
given.whens.map((when, j) => (react_1.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error
|
|
184
|
+
? "bg-danger text-white"
|
|
185
|
+
: "bg-success text-white"}` },
|
|
186
|
+
react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
|
|
172
187
|
react_1.default.createElement("div", null,
|
|
173
|
-
react_1.default.createElement("
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
react_1.default.createElement("
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
react_1.default.createElement("
|
|
182
|
-
|
|
183
|
-
react_1.default.createElement("
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
188
|
+
react_1.default.createElement("div", null,
|
|
189
|
+
react_1.default.createElement("strong", null, "When:"),
|
|
190
|
+
" ",
|
|
191
|
+
when.name,
|
|
192
|
+
when.features && when.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
|
|
193
|
+
react_1.default.createElement("small", null, "Features:"),
|
|
194
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, when.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname)) : (feature))))))),
|
|
195
|
+
when.error && react_1.default.createElement("pre", { className: "mt-2" }, when.error))),
|
|
196
|
+
when.artifacts && when.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
|
|
197
|
+
react_1.default.createElement("strong", null, "Artifacts:"),
|
|
198
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
|
|
199
|
+
react_1.default.createElement("a", { href: `reports/${projectName}/${testName
|
|
200
|
+
.split(".")
|
|
201
|
+
.slice(0, -1)
|
|
202
|
+
.join(".")}/${runtime}/${artifact}`, target: "_blank", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))))),
|
|
203
|
+
given.thens.map((then, k) => (react_1.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error
|
|
204
|
+
? "bg-danger text-white"
|
|
205
|
+
: "bg-success text-white"}` },
|
|
206
|
+
react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
|
|
207
|
+
react_1.default.createElement("div", null,
|
|
208
|
+
react_1.default.createElement("div", null,
|
|
209
|
+
react_1.default.createElement("strong", null, "Then:"),
|
|
210
|
+
" ",
|
|
211
|
+
then.name,
|
|
212
|
+
then.features && then.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
|
|
213
|
+
react_1.default.createElement("small", null, "Features:"),
|
|
214
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, then.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname)) : (feature))))))),
|
|
215
|
+
then.error && react_1.default.createElement("pre", { className: "mt-2" }, then.error))),
|
|
216
|
+
then.artifacts && then.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
|
|
217
|
+
react_1.default.createElement("strong", null, "Artifacts:"),
|
|
218
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
|
|
219
|
+
react_1.default.createElement("a", { href: `reports/${projectName}/${testName
|
|
220
|
+
.split(".")
|
|
221
|
+
.slice(0, -1)
|
|
222
|
+
.join(".")}/${runtime}/${artifact}`, target: "_blank", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))))))))),
|
|
223
|
+
(buildErrors.errors.length > 0 || buildErrors.warnings.length > 0) && (react_1.default.createElement("div", { className: "mb-4 card border-danger" },
|
|
224
|
+
react_1.default.createElement("div", { className: "card-header bg-danger text-white" },
|
|
225
|
+
react_1.default.createElement("h4", null, "Build Errors and Warnings")),
|
|
226
|
+
react_1.default.createElement("div", { className: "card-body" },
|
|
227
|
+
buildErrors.errors.length > 0 && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
228
|
+
react_1.default.createElement("h5", null, "Errors"),
|
|
229
|
+
react_1.default.createElement("ul", null, buildErrors.errors.map((error, idx) => (react_1.default.createElement("li", { key: `build-error-${idx}` },
|
|
230
|
+
react_1.default.createElement("strong", null, error.text),
|
|
231
|
+
error.location && (react_1.default.createElement("div", null,
|
|
232
|
+
"File: ",
|
|
233
|
+
error.location.file,
|
|
234
|
+
" Line: ",
|
|
235
|
+
error.location.line,
|
|
236
|
+
" Column: ",
|
|
237
|
+
error.location.column)))))))),
|
|
238
|
+
buildErrors.warnings.length > 0 && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
239
|
+
react_1.default.createElement("h5", null, "Warnings"),
|
|
240
|
+
react_1.default.createElement("ul", null, buildErrors.warnings.map((warning, idx) => (react_1.default.createElement("li", { key: `build-warning-${idx}` },
|
|
241
|
+
react_1.default.createElement("strong", null, warning.text),
|
|
242
|
+
warning.location && (react_1.default.createElement("div", null,
|
|
243
|
+
"File: ",
|
|
244
|
+
warning.location.file,
|
|
245
|
+
" Line: ",
|
|
246
|
+
warning.location.line,
|
|
247
|
+
" Column: ",
|
|
248
|
+
warning.location.column)))))))))))));
|
|
187
249
|
};
|
|
188
250
|
console.log("Rendering TestPageView with logs:", {
|
|
189
251
|
logKeys: Object.keys(logs),
|
|
@@ -280,10 +342,10 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
280
342
|
react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.standardLogs ? 'down' : 'right'} me-1` }),
|
|
281
343
|
react_1.default.createElement("span", null, "Standard Logs")),
|
|
282
344
|
expandedSections.standardLogs && (react_1.default.createElement("div", null, Object.values(logFiles_1.STANDARD_LOGS).map((logName) => {
|
|
283
|
-
const logContent = logs[logName];
|
|
345
|
+
const logContent = logs ? logs[logName] : undefined;
|
|
284
346
|
const exists = logContent !== undefined &&
|
|
285
347
|
((typeof logContent === "string" && logContent.trim() !== "") ||
|
|
286
|
-
(typeof logContent === "object" && Object.keys(logContent).length > 0));
|
|
348
|
+
(typeof logContent === "object" && logContent !== null && Object.keys(logContent).length > 0));
|
|
287
349
|
return (react_1.default.createElement(FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
|
|
288
350
|
if (exists) {
|
|
289
351
|
setActiveTab(logName);
|
|
@@ -303,15 +365,16 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
303
365
|
}
|
|
304
366
|
} }));
|
|
305
367
|
})))),
|
|
306
|
-
|
|
368
|
+
runtime && logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime] &&
|
|
369
|
+
Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime]).length > 0 && (react_1.default.createElement("div", { className: "p-2" },
|
|
307
370
|
react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: 'pointer', fontSize: '0.875rem' }, onClick: () => setExpandedSections(prev => (Object.assign(Object.assign({}, prev), { runtimeLogs: !prev.runtimeLogs }))) },
|
|
308
371
|
react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.runtimeLogs ? 'down' : 'right'} me-1` }),
|
|
309
372
|
react_1.default.createElement("span", null, "Runtime Logs")),
|
|
310
373
|
expandedSections.runtimeLogs && (react_1.default.createElement("div", null, Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime]).map((logName) => {
|
|
311
|
-
const logContent = logs[logName];
|
|
374
|
+
const logContent = logs ? logs[logName] : undefined;
|
|
312
375
|
const exists = logContent !== undefined &&
|
|
313
376
|
((typeof logContent === "string" && logContent.trim() !== "") ||
|
|
314
|
-
(typeof logContent === "object" && Object.keys(logContent).length > 0));
|
|
377
|
+
(typeof logContent === "object" && logContent !== null && Object.keys(logContent).length > 0));
|
|
315
378
|
return (react_1.default.createElement(FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
|
|
316
379
|
if (exists) {
|
|
317
380
|
setActiveTab(logName);
|
|
@@ -331,7 +394,7 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
331
394
|
}
|
|
332
395
|
} }));
|
|
333
396
|
}))))),
|
|
334
|
-
logs.source_files && (react_1.default.createElement("div", { className: "p-2" },
|
|
397
|
+
logs && logs.source_files && (react_1.default.createElement("div", { className: "p-2" },
|
|
335
398
|
react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: 'pointer', fontSize: '0.875rem' }, onClick: () => setExpandedSections(prev => (Object.assign(Object.assign({}, prev), { sourceFiles: !prev.sourceFiles }))) },
|
|
336
399
|
react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.sourceFiles ? 'down' : 'right'} me-1` }),
|
|
337
400
|
react_1.default.createElement("span", null, "Source Files")),
|
|
@@ -362,7 +425,59 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
|
|
|
362
425
|
react_1.default.createElement("img", { src: selectedFile.content, alt: selectedFile.path, className: "img-fluid", style: { maxHeight: '300px' } }),
|
|
363
426
|
react_1.default.createElement("div", { className: "mt-2" },
|
|
364
427
|
react_1.default.createElement("a", { href: selectedFile.content, target: "_blank", rel: "noopener noreferrer", className: "btn btn-sm btn-outline-primary" }, "Open Full Size")))),
|
|
365
|
-
(selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith(".json")) &&
|
|
428
|
+
(selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith("build.json")) && (react_1.default.createElement("div", null,
|
|
429
|
+
react_1.default.createElement("h5", null, "Build Information"),
|
|
430
|
+
(() => {
|
|
431
|
+
var _a, _b;
|
|
432
|
+
try {
|
|
433
|
+
const buildData = JSON.parse(selectedFile.content);
|
|
434
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
435
|
+
((_a = buildData.errors) === null || _a === void 0 ? void 0 : _a.length) > 0 && (react_1.default.createElement("div", { className: "mb-3" },
|
|
436
|
+
react_1.default.createElement("h6", { className: "text-danger" },
|
|
437
|
+
"Errors (",
|
|
438
|
+
buildData.errors.length,
|
|
439
|
+
")"),
|
|
440
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.errors.map((error, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 bg-light rounded" },
|
|
441
|
+
react_1.default.createElement("div", { className: "text-danger fw-bold" }, error.text),
|
|
442
|
+
error.location && (react_1.default.createElement("div", { className: "small text-muted" },
|
|
443
|
+
"File: ",
|
|
444
|
+
error.location.file,
|
|
445
|
+
"Line: ",
|
|
446
|
+
error.location.line,
|
|
447
|
+
"Column: ",
|
|
448
|
+
error.location.column)),
|
|
449
|
+
error.notes && error.notes.length > 0 && (react_1.default.createElement("div", { className: "small" },
|
|
450
|
+
"Notes:",
|
|
451
|
+
react_1.default.createElement("ul", null, error.notes.map((note, noteIndex) => (react_1.default.createElement("li", { key: noteIndex }, note.text)))))))))))),
|
|
452
|
+
((_b = buildData.warnings) === null || _b === void 0 ? void 0 : _b.length) > 0 && (react_1.default.createElement("div", { className: "mb-3" },
|
|
453
|
+
react_1.default.createElement("h6", { className: "text-warning" },
|
|
454
|
+
"Warnings (",
|
|
455
|
+
buildData.warnings.length,
|
|
456
|
+
")"),
|
|
457
|
+
react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.warnings.map((warning, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 bg-light rounded" },
|
|
458
|
+
react_1.default.createElement("div", { className: "text-warning fw-bold" }, warning.text),
|
|
459
|
+
warning.location && (react_1.default.createElement("div", { className: "small text-muted" },
|
|
460
|
+
"File: ",
|
|
461
|
+
warning.location.file,
|
|
462
|
+
"Line: ",
|
|
463
|
+
warning.location.line,
|
|
464
|
+
"Column: ",
|
|
465
|
+
warning.location.column)),
|
|
466
|
+
warning.notes && warning.notes.length > 0 && (react_1.default.createElement("div", { className: "small" },
|
|
467
|
+
"Notes:",
|
|
468
|
+
react_1.default.createElement("ul", null, warning.notes.map((note, noteIndex) => (react_1.default.createElement("li", { key: noteIndex }, note.text)))))))))))),
|
|
469
|
+
(!buildData.errors || buildData.errors.length === 0) &&
|
|
470
|
+
(!buildData.warnings || buildData.warnings.length === 0) && (react_1.default.createElement("div", { className: "alert alert-success" }, "No build errors or warnings"))));
|
|
471
|
+
}
|
|
472
|
+
catch (e) {
|
|
473
|
+
return (react_1.default.createElement("div", { className: "alert alert-danger" },
|
|
474
|
+
"Error parsing build.json: ",
|
|
475
|
+
e.message));
|
|
476
|
+
}
|
|
477
|
+
})())),
|
|
478
|
+
(selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith(".json")) &&
|
|
479
|
+
!selectedFile.path.endsWith("tests.json") &&
|
|
480
|
+
!selectedFile.path.endsWith("build.json") && (react_1.default.createElement("pre", { className: "bg-light p-2 small" },
|
|
366
481
|
react_1.default.createElement("code", null, selectedFile.content))),
|
|
367
482
|
(selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.includes("source_files")) && (react_1.default.createElement("div", null,
|
|
368
483
|
react_1.default.createElement("div", { className: "mb-2 small text-muted" },
|
|
@@ -87,6 +87,7 @@ const TestPage = () => {
|
|
|
87
87
|
const receivedLogs = await testResponse.logs;
|
|
88
88
|
console.log('Received logs:', Object.keys(receivedLogs));
|
|
89
89
|
let sourceFiles = {};
|
|
90
|
+
let buildLogs = {};
|
|
90
91
|
if (metafileRes.ok) {
|
|
91
92
|
const metafile = await metafileRes.json();
|
|
92
93
|
if ((_a = metafile === null || metafile === void 0 ? void 0 : metafile.metafile) === null || _a === void 0 ? void 0 : _a.outputs) {
|
|
@@ -99,28 +100,34 @@ const TestPage = () => {
|
|
|
99
100
|
const normalizedTestPath = testPath.replace(/\./g, '_');
|
|
100
101
|
const testFileName = testPath.split('/').pop();
|
|
101
102
|
const testBaseName = testFileName === null || testFileName === void 0 ? void 0 : testFileName.split('.').slice(0, -1).join('.');
|
|
103
|
+
// Also check outputPath normalized for slashes replaced by underscores
|
|
104
|
+
const normalizedOutputPath = outputPath.replace(/\//g, '_');
|
|
102
105
|
return output.entryPoint === testEntryPoint ||
|
|
103
106
|
outputPath.includes(normalizedTestPath) ||
|
|
107
|
+
normalizedOutputPath.includes(normalizedTestPath) ||
|
|
104
108
|
(testBaseName && outputPath.includes(testBaseName));
|
|
105
109
|
});
|
|
106
110
|
// Then collect all inputs from matching outputs
|
|
107
111
|
matchingOutputs.forEach(([_, output]) => {
|
|
108
112
|
Object.keys(output.inputs).forEach(inputPath => {
|
|
109
|
-
// Check if this input is a
|
|
110
|
-
if ((inputPath.endsWith('.ts') || inputPath.endsWith('.tsx')) &&
|
|
113
|
+
// Check if this input is a source file (TypeScript or Go) and not in node_modules
|
|
114
|
+
if ((inputPath.endsWith('.ts') || inputPath.endsWith('.tsx') || inputPath.endsWith('.go')) &&
|
|
111
115
|
!inputPath.includes('node_modules')) {
|
|
112
116
|
// Get the full input details from metafile.inputs
|
|
113
117
|
const inputDetails = metafile.metafile.inputs[inputPath];
|
|
114
118
|
if (inputDetails) {
|
|
115
119
|
tsSources.add(inputPath);
|
|
116
|
-
// Also include any imported
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
// Also include any imported source files (for TypeScript)
|
|
121
|
+
// Go files don't have imports in the same way, so we'll only process for TypeScript
|
|
122
|
+
if (inputPath.endsWith('.ts') || inputPath.endsWith('.tsx')) {
|
|
123
|
+
inputDetails.imports.forEach(imp => {
|
|
124
|
+
if ((imp.path.endsWith('.ts') || imp.path.endsWith('.tsx')) &&
|
|
125
|
+
!imp.path.includes('node_modules') &&
|
|
126
|
+
!imp.external) {
|
|
127
|
+
tsSources.add(imp.path);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
124
131
|
}
|
|
125
132
|
}
|
|
126
133
|
});
|
|
@@ -167,11 +174,14 @@ const TestPage = () => {
|
|
|
167
174
|
});
|
|
168
175
|
});
|
|
169
176
|
sourceFiles = fileTree;
|
|
177
|
+
buildLogs = metafile;
|
|
170
178
|
}
|
|
171
179
|
}
|
|
172
|
-
// Add source files to logs
|
|
180
|
+
// Add source files and build logs to logs
|
|
173
181
|
receivedLogs['source_files'] = sourceFiles;
|
|
182
|
+
receivedLogs['build_logs'] = buildLogs;
|
|
174
183
|
console.log('Source files structure:', sourceFiles);
|
|
184
|
+
console.log('Build logs:', buildLogs);
|
|
175
185
|
// Ensure tests.json is properly formatted
|
|
176
186
|
if (receivedLogs['tests.json']) {
|
|
177
187
|
console.log('tests.json content type:', typeof receivedLogs['tests.json']);
|
|
@@ -210,6 +220,35 @@ const TestPage = () => {
|
|
|
210
220
|
catch (err) {
|
|
211
221
|
console.error('Failed to load summary:', err);
|
|
212
222
|
}
|
|
223
|
+
// Fetch build.json to get build errors and warnings
|
|
224
|
+
try {
|
|
225
|
+
// The build.json is in the runtime directory directly under the test path
|
|
226
|
+
// testPath is "src/lib/pmProxy.test/index.ts"
|
|
227
|
+
// We need to use the directory path without the filename
|
|
228
|
+
const pathParts = testPath.split('/');
|
|
229
|
+
const fileName = pathParts.pop();
|
|
230
|
+
const directoryPath = pathParts.join('/');
|
|
231
|
+
// Construct the path without the filename without extension
|
|
232
|
+
const buildUrl = `/reports/${projectName}/${directoryPath}/${runtime}/build.json`;
|
|
233
|
+
console.log(`Fetching build.json from: ${buildUrl}`);
|
|
234
|
+
const buildResponse = await fetch(buildUrl);
|
|
235
|
+
if (buildResponse.ok) {
|
|
236
|
+
const buildData = await buildResponse.json();
|
|
237
|
+
console.log('Build data received:', buildData);
|
|
238
|
+
// Add build errors and warnings to logs
|
|
239
|
+
receivedLogs['build.json'] = buildData;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.log('Build.json not found or not accessible, status:', buildResponse.status);
|
|
243
|
+
// Add an empty build.json to logs to prevent errors
|
|
244
|
+
receivedLogs['build.json'] = { errors: [], warnings: [] };
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
console.log('No build.json found or error fetching it:', err);
|
|
249
|
+
// Add an empty build.json to logs to prevent errors
|
|
250
|
+
receivedLogs['build.json'] = { errors: [], warnings: [] };
|
|
251
|
+
}
|
|
213
252
|
}
|
|
214
253
|
catch (err) {
|
|
215
254
|
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
6
7
|
const Node_1 = __importDefault(require("../../Node"));
|
|
7
8
|
const specification_1 = require("./specification");
|
|
8
9
|
const implementation_1 = require("./implementation");
|
package/dist/common/src/run.js
CHANGED
|
@@ -1,83 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
process.exit(-1);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
const projectName = process.argv[2];
|
|
54
|
-
const mode = process.argv[3];
|
|
55
|
-
if (mode !== "once" && mode !== "dev") {
|
|
56
|
-
console.error("the 2nd argument should be 'dev' or 'once' ");
|
|
57
|
-
process.exit(-1);
|
|
58
|
-
}
|
|
59
|
-
const f = process.cwd() + "/" + "testeranto.config.ts";
|
|
60
|
-
console.log("config file:", f);
|
|
61
|
-
Promise.resolve(`${f}`).then(s => __importStar(require(s))).then(async (module) => {
|
|
62
|
-
const bigConfig = module.default || module;
|
|
63
|
-
const rawConfig = bigConfig.projects[projectName];
|
|
64
|
-
if (!rawConfig) {
|
|
65
|
-
console.error(`Project "${projectName}" does not exist in the configuration.`);
|
|
66
|
-
console.error("Available projects:", Object.keys(bigConfig.projects));
|
|
67
|
-
process.exit(-1);
|
|
68
|
-
}
|
|
69
|
-
if (!rawConfig.tests) {
|
|
70
|
-
console.error(projectName, "appears to have no tests: ", f);
|
|
71
|
-
console.error(`here is the config:`);
|
|
72
|
-
console.log(JSON.stringify(rawConfig));
|
|
73
|
-
process.exit(-1);
|
|
74
|
-
}
|
|
75
|
-
const config = Object.assign(Object.assign({}, rawConfig), { buildDir: process.cwd() + "/" + `testeranto/${projectName}.json` });
|
|
76
|
-
const pm = new main_1.PM_Main(config, projectName, mode);
|
|
77
|
-
pm.start();
|
|
78
|
-
process.stdin.on("keypress", (str, key) => {
|
|
79
|
-
if (key.name === "q") {
|
|
80
|
-
pm.stop();
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
});
|
|
2
|
+
// import ansiC from "ansi-colors";
|
|
3
|
+
// import readline from "readline";
|
|
4
|
+
// import { PM_Main } from "./PM/main";
|
|
5
|
+
// import { ITestconfig, IBuiltConfig, IProject } from "./Types";
|
|
6
|
+
// readline.emitKeypressEvents(process.stdin);
|
|
7
|
+
// if (process.stdin.isTTY) process.stdin.setRawMode(true);
|
|
8
|
+
// console.log(ansiC.inverse("Press 'q' to initiate a graceful shutdown."));
|
|
9
|
+
// console.log(ansiC.inverse("Press 'x' to quit forcefully."));
|
|
10
|
+
// process.stdin.on("keypress", (str, key) => {
|
|
11
|
+
// if (key.name === "x") {
|
|
12
|
+
// console.log(ansiC.inverse("Shutting down forcefully..."));
|
|
13
|
+
// process.exit(-1);
|
|
14
|
+
// }
|
|
15
|
+
// });
|
|
16
|
+
// const projectName = process.argv[2];
|
|
17
|
+
// const mode = process.argv[3] as "once" | "dev";
|
|
18
|
+
// if (mode !== "once" && mode !== "dev") {
|
|
19
|
+
// console.error("the 2nd argument should be 'dev' or 'once' ");
|
|
20
|
+
// process.exit(-1);
|
|
21
|
+
// }
|
|
22
|
+
// const f = process.cwd() + "/" + "testeranto.config.ts";
|
|
23
|
+
// console.log("config file:", f);
|
|
24
|
+
// import(f).then(async (module) => {
|
|
25
|
+
// const bigConfig: IProject = module.default || module;
|
|
26
|
+
// const rawConfig: ITestconfig = bigConfig.projects[projectName];
|
|
27
|
+
// if (!rawConfig) {
|
|
28
|
+
// console.error(`Project "${projectName}" does not exist in the configuration.`);
|
|
29
|
+
// console.error("Available projects:", Object.keys(bigConfig.projects));
|
|
30
|
+
// process.exit(-1);
|
|
31
|
+
// }
|
|
32
|
+
// if (!rawConfig.tests) {
|
|
33
|
+
// console.error(projectName, "appears to have no tests: ", f);
|
|
34
|
+
// console.error(`here is the config:`);
|
|
35
|
+
// console.log(JSON.stringify(rawConfig));
|
|
36
|
+
// process.exit(-1);
|
|
37
|
+
// }
|
|
38
|
+
// const config: IBuiltConfig = {
|
|
39
|
+
// ...rawConfig,
|
|
40
|
+
// buildDir: process.cwd() + "/" + `testeranto/${projectName}.json`,
|
|
41
|
+
// };
|
|
42
|
+
// const pm = new PM_Main(config, projectName, mode);
|
|
43
|
+
// pm.start();
|
|
44
|
+
// process.stdin.on("keypress", (str, key) => {
|
|
45
|
+
// if (key.name === "q") {
|
|
46
|
+
// pm.stop();
|
|
47
|
+
// }
|
|
48
|
+
// });
|
|
49
|
+
// });
|