testeranto 0.158.1 → 0.160.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/Init.js +3 -3
- package/dist/common/src/utils/api.js +33 -192
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/Init.js +3 -3
- package/dist/module/src/ProjectPage.js +128 -21
- package/dist/module/src/ProjectsPage.js +15 -9
- package/dist/module/src/TestPage.js +65 -18
- package/dist/module/src/utils/api.js +33 -192
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/App.js +901 -581
- package/dist/prebuild/init-docs.mjs +3 -3
- package/dist/types/src/utils/api.d.ts +2 -20
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/notify.sh +47 -0
- package/package.json +2 -2
- package/src/Init.ts +3 -3
- package/src/ProjectPage.tsx +204 -38
- package/src/ProjectsPage.tsx +23 -19
- package/src/TestPage.tsx +79 -18
- package/src/utils/api.ts +40 -193
- package/testeranto/App.js +901 -581
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +4 -4
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +1 -1
- package/dist/module/src/BuildLogsPage.js +0 -99
- package/dist/module/src/Project.js +0 -332
- package/src/BuildLogsPage.tsx +0 -108
- package/src/Project.tsx +0 -375
package/src/Project.tsx
DELETED
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
// /* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
-
// import ReactDom from "react-dom/client";
|
|
3
|
-
// import React, { useEffect, useState } from "react";
|
|
4
|
-
// import { Col, Nav, Row, Tab, Table } from "react-bootstrap";
|
|
5
|
-
|
|
6
|
-
// import { Footer } from "./Footer";
|
|
7
|
-
// import { IBuiltConfig } from "./lib";
|
|
8
|
-
// import { ISummary } from "./Types";
|
|
9
|
-
|
|
10
|
-
// import { SettingsButton } from "./SettingsButton";
|
|
11
|
-
|
|
12
|
-
// import SunriseAnimation from "./components/SunriseAnimation";
|
|
13
|
-
|
|
14
|
-
// import "./Project.scss"
|
|
15
|
-
|
|
16
|
-
// type ISummaries = [string, IBuiltConfig, ISummary][];
|
|
17
|
-
|
|
18
|
-
// const BigBoard = () => {
|
|
19
|
-
|
|
20
|
-
// const bigConfigElement = document.getElementById("bigConfig");
|
|
21
|
-
|
|
22
|
-
// if (!bigConfigElement) throw new Error("bigConfig element not found");
|
|
23
|
-
// const projects = JSON.parse(bigConfigElement.innerHTML) as string[];
|
|
24
|
-
|
|
25
|
-
// const [summary, setSummary] = useState<ISummaries>();
|
|
26
|
-
// const [nodeLogs, setNodeLogs] = useState<Record<string, string>>({});
|
|
27
|
-
// const [webLogs, setWebLogs] = useState<Record<string, string>>({});
|
|
28
|
-
// const [pureLogs, setPureLogs] = useState<Record<string, string>>({});
|
|
29
|
-
// const [activeTab, setActiveTab] = useState<string>(() => {
|
|
30
|
-
// const hash = window.location.hash.replace('#', '');
|
|
31
|
-
// return hash || "node";
|
|
32
|
-
// });
|
|
33
|
-
|
|
34
|
-
// const fetchLogs = async (project: string) => {
|
|
35
|
-
// try {
|
|
36
|
-
// const [nodeRes, webRes, pureRes] = await Promise.all([
|
|
37
|
-
// fetch(`./bundles/node/${project}/metafile.json`),
|
|
38
|
-
// fetch(`./bundles/web/${project}/metafile.json`),
|
|
39
|
-
// fetch(`./bundles/pure/${project}/metafile.json`),
|
|
40
|
-
// ]);
|
|
41
|
-
|
|
42
|
-
// setNodeLogs({ [project]: await nodeRes.json() });
|
|
43
|
-
// setWebLogs({ [project]: await webRes.json() });
|
|
44
|
-
// setPureLogs({ [project]: await pureRes.json() });
|
|
45
|
-
// } catch (error) {
|
|
46
|
-
// console.error("Error fetching logs:", error);
|
|
47
|
-
// setNodeLogs({ [project]: "ERROR" });
|
|
48
|
-
// setNodeLogs({ [project]: "ERROR" });
|
|
49
|
-
// setNodeLogs({ [project]: "ERROR" });
|
|
50
|
-
|
|
51
|
-
// }
|
|
52
|
-
// };
|
|
53
|
-
|
|
54
|
-
// useEffect(() => {
|
|
55
|
-
|
|
56
|
-
// (async () => {
|
|
57
|
-
// const x: Promise<[string, IBuiltConfig, ISummary]>[] = projects.map(
|
|
58
|
-
// async (p) => {
|
|
59
|
-
|
|
60
|
-
// fetchLogs(p);
|
|
61
|
-
|
|
62
|
-
// return [
|
|
63
|
-
// p,
|
|
64
|
-
|
|
65
|
-
// (await (
|
|
66
|
-
// await fetch(`./reports/config.json`)
|
|
67
|
-
// ).json()) as IBuiltConfig,
|
|
68
|
-
|
|
69
|
-
// (await (
|
|
70
|
-
// await fetch(`./reports/${p}/summary.json`)
|
|
71
|
-
// ).json()) as ISummary,
|
|
72
|
-
// ] as [string, IBuiltConfig, ISummary];
|
|
73
|
-
// }
|
|
74
|
-
// );
|
|
75
|
-
|
|
76
|
-
// Promise.all(x).then((v) => {
|
|
77
|
-
// setSummary(v);
|
|
78
|
-
// });
|
|
79
|
-
// })();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// }, []);
|
|
83
|
-
|
|
84
|
-
// if (!summary || summary?.length === 0) {
|
|
85
|
-
// return <div>loading...</div>;
|
|
86
|
-
// }
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// return (
|
|
90
|
-
// <div>
|
|
91
|
-
|
|
92
|
-
// <SunriseAnimation active={false} />
|
|
93
|
-
|
|
94
|
-
// <div className="container-fluid p-4" style={{ backgroundColor: 'transparent', position: 'relative', zIndex: 10 }}>
|
|
95
|
-
// {/* Sky and sun elements */}
|
|
96
|
-
// {/* <div id="sky"></div>
|
|
97
|
-
// <div id="sun"></div>
|
|
98
|
-
// <div id="sunDay"></div>
|
|
99
|
-
// <div id="sunSet"></div>
|
|
100
|
-
// <div id="horizon"></div>
|
|
101
|
-
// <div id="water"></div>
|
|
102
|
-
// <div id="waterReflectionContainer">
|
|
103
|
-
// <div id="waterReflectionMiddle"></div>
|
|
104
|
-
// </div> */}
|
|
105
|
-
// <Tab.Container activeKey={activeTab} defaultActiveKey="node">
|
|
106
|
-
// <nav className="navbar navbar-expand-lg navbar-light bg-light mb-3 rounded">
|
|
107
|
-
// <div className="container-fluid">
|
|
108
|
-
// <span className="navbar-brand text-muted">Project: testeranto</span>
|
|
109
|
-
// <Nav variant="pills" className="me-auto" activeKey={activeTab} onSelect={(k) => {
|
|
110
|
-
// setActiveTab(k || "node");
|
|
111
|
-
// window.location.hash = k || "node";
|
|
112
|
-
// }}>
|
|
113
|
-
// <Nav.Item>
|
|
114
|
-
// <Nav.Link eventKey="projects">Test Results</Nav.Link>
|
|
115
|
-
// </Nav.Item>
|
|
116
|
-
// <Nav.Item>
|
|
117
|
-
// <Nav.Link
|
|
118
|
-
// eventKey="node"
|
|
119
|
-
// className={Object.values(nodeLogs).every(log => !log.errors || log.errors.length === 0)
|
|
120
|
-
// ? "text-success"
|
|
121
|
-
// : "text-danger"}
|
|
122
|
-
// >
|
|
123
|
-
// Node Build {Object.values(nodeLogs).every(log => !log.errors || log.errors.length === 0) ? "✅" : "❌"}
|
|
124
|
-
// </Nav.Link>
|
|
125
|
-
// </Nav.Item>
|
|
126
|
-
// <Nav.Item>
|
|
127
|
-
// <Nav.Link
|
|
128
|
-
// eventKey="web"
|
|
129
|
-
// className={Object.values(webLogs).every(log => !log.errors || log.errors.length === 0)
|
|
130
|
-
// ? "text-success"
|
|
131
|
-
// : "text-danger"}
|
|
132
|
-
// >
|
|
133
|
-
// Web Build {Object.values(webLogs).every(log => !log.errors || log.errors.length === 0) ? "✅" : "❌"}
|
|
134
|
-
// </Nav.Link>
|
|
135
|
-
// </Nav.Item>
|
|
136
|
-
// <Nav.Item>
|
|
137
|
-
// <Nav.Link
|
|
138
|
-
// eventKey="pure"
|
|
139
|
-
// className={Object.values(pureLogs).every(log => !log.errors || log.errors.length === 0)
|
|
140
|
-
// ? "text-success"
|
|
141
|
-
// : "text-danger"}
|
|
142
|
-
// >
|
|
143
|
-
// Pure Build {Object.values(pureLogs).every(log => !log.errors || log.errors.length === 0) ? "✅" : "❌"}
|
|
144
|
-
// </Nav.Link>
|
|
145
|
-
// </Nav.Item>
|
|
146
|
-
|
|
147
|
-
// </Nav>
|
|
148
|
-
// </div>
|
|
149
|
-
// </nav>
|
|
150
|
-
// <Row>
|
|
151
|
-
// <Tab.Content>
|
|
152
|
-
// <Tab.Pane eventKey="node">
|
|
153
|
-
// {Object.keys(nodeLogs).length > 0 && (
|
|
154
|
-
// <div className={`alert ${Object.values(nodeLogs).every(log => !log.errors || log.errors.length === 0)
|
|
155
|
-
// ? 'alert-success'
|
|
156
|
-
// : 'alert-danger'} d-flex justify-content-between align-items-center`}>
|
|
157
|
-
// <span>
|
|
158
|
-
// {Object.values(nodeLogs).every(log => !log.errors || log.errors.length === 0)
|
|
159
|
-
// ? '✅ All Node builds passed successfully'
|
|
160
|
-
// : '❌ Some Node builds failed'}
|
|
161
|
-
// </span>
|
|
162
|
-
// {!Object.values(nodeLogs).every(log => !log.errors || log.errors.length === 0) && (
|
|
163
|
-
// <button
|
|
164
|
-
// onClick={() => alert('AI debugger coming soon!')}
|
|
165
|
-
// className="btn btn-sm btn-primary"
|
|
166
|
-
// title="Get AI help debugging these build failures"
|
|
167
|
-
// >
|
|
168
|
-
// 🤖🪄✨
|
|
169
|
-
// </button>
|
|
170
|
-
// )}
|
|
171
|
-
// </div>
|
|
172
|
-
// )}
|
|
173
|
-
// <pre >
|
|
174
|
-
// {JSON.stringify(nodeLogs, null, 2)}
|
|
175
|
-
// </pre>
|
|
176
|
-
// </Tab.Pane>
|
|
177
|
-
// <Tab.Pane eventKey="web">
|
|
178
|
-
// {Object.keys(webLogs).length > 0 && (
|
|
179
|
-
// <div className={`alert ${Object.values(webLogs).every(log => !log.errors || log.errors.length === 0)
|
|
180
|
-
// ? 'alert-success'
|
|
181
|
-
// : 'alert-danger'} d-flex justify-content-between align-items-center`}>
|
|
182
|
-
// <span>
|
|
183
|
-
// {Object.values(webLogs).every(log => !log.errors || log.errors.length === 0)
|
|
184
|
-
// ? '✅ All Web builds passed successfully'
|
|
185
|
-
// : '❌ Some Web builds failed'}
|
|
186
|
-
// </span>
|
|
187
|
-
// {!Object.values(webLogs).every(log => !log.errors || log.errors.length === 0) && (
|
|
188
|
-
// <button
|
|
189
|
-
// onClick={() => alert('AI debugger coming soon!')}
|
|
190
|
-
// className="btn btn-sm btn-primary"
|
|
191
|
-
// title="Get AI help debugging these build failures"
|
|
192
|
-
// >
|
|
193
|
-
// 🤖🪄✨
|
|
194
|
-
// </button>
|
|
195
|
-
// )}
|
|
196
|
-
// </div>
|
|
197
|
-
// )}
|
|
198
|
-
// <pre >
|
|
199
|
-
// {JSON.stringify(webLogs, null, 2)}
|
|
200
|
-
// </pre>
|
|
201
|
-
// </Tab.Pane>
|
|
202
|
-
// <Tab.Pane eventKey="pure">
|
|
203
|
-
// {Object.keys(pureLogs).length > 0 && (
|
|
204
|
-
// <div className={`alert ${Object.values(pureLogs).every(log => !log.errors || log.errors.length === 0)
|
|
205
|
-
// ? 'alert-success'
|
|
206
|
-
// : 'alert-danger'} d-flex justify-content-between align-items-center`}>
|
|
207
|
-
// <span>
|
|
208
|
-
// {Object.values(pureLogs).every(log => !log.errors || log.errors.length === 0)
|
|
209
|
-
// ? '✅ All Pure builds passed successfully'
|
|
210
|
-
// : '❌ Some Pure builds failed'}
|
|
211
|
-
// </span>
|
|
212
|
-
// {!Object.values(pureLogs).every(log => !log.errors || log.errors.length === 0) && (
|
|
213
|
-
// <button
|
|
214
|
-
// onClick={() => alert('AI debugger coming soon!')}
|
|
215
|
-
// className="btn btn-sm btn-primary"
|
|
216
|
-
// title="Get AI help debugging these build failures"
|
|
217
|
-
// >
|
|
218
|
-
// 🤖🪄✨
|
|
219
|
-
// </button>
|
|
220
|
-
// )}
|
|
221
|
-
// </div>
|
|
222
|
-
// )}
|
|
223
|
-
// <pre >
|
|
224
|
-
// {JSON.stringify(pureLogs, null, 2)}
|
|
225
|
-
// </pre>
|
|
226
|
-
// </Tab.Pane>
|
|
227
|
-
// <Tab.Pane eventKey="projects">
|
|
228
|
-
// <Tab.Container defaultActiveKey={projects[0]}>
|
|
229
|
-
// <Row>
|
|
230
|
-
// <Col sm={3}>
|
|
231
|
-
// <Nav variant="pills" className="flex-column">
|
|
232
|
-
// {projects.map((project) => (
|
|
233
|
-
// <Nav.Item key={project}>
|
|
234
|
-
// <Nav.Link eventKey={project}>{project}</Nav.Link>
|
|
235
|
-
// </Nav.Item>
|
|
236
|
-
// ))}
|
|
237
|
-
// </Nav>
|
|
238
|
-
// </Col>
|
|
239
|
-
// <Col sm={9}>
|
|
240
|
-
// <Tab.Content>
|
|
241
|
-
// {projects.map((project) => (
|
|
242
|
-
// <Tab.Pane key={project} eventKey={project}>
|
|
243
|
-
// <Table>
|
|
244
|
-
// <Table>
|
|
245
|
-
// <thead>
|
|
246
|
-
// <tr>
|
|
247
|
-
// <th>project</th>
|
|
248
|
-
// <th>platform</th>
|
|
249
|
-
// <th>BDD errors</th>
|
|
250
|
-
// <th>Lint errors</th>
|
|
251
|
-
// <th>Type errors</th>
|
|
252
|
-
|
|
253
|
-
// </tr>
|
|
254
|
-
// </thead>
|
|
255
|
-
|
|
256
|
-
// <tbody>
|
|
257
|
-
// {...summary.map((s) => {
|
|
258
|
-
// return (
|
|
259
|
-
// <>
|
|
260
|
-
// <tr>
|
|
261
|
-
// <th>{s[0]}</th>
|
|
262
|
-
// </tr>
|
|
263
|
-
// {...s[1].tests.map((t) => {
|
|
264
|
-
// const x = `${s[0]}/${t[0]
|
|
265
|
-
// .split(".")
|
|
266
|
-
// .slice(0, -1)
|
|
267
|
-
// .join(".")}/${t[1]}`;
|
|
268
|
-
// const y = s[2][t[0]];
|
|
269
|
-
|
|
270
|
-
// if (!y) return <pre>ERROR</pre>
|
|
271
|
-
|
|
272
|
-
// return (
|
|
273
|
-
// <tr>
|
|
274
|
-
// <td>{t[0]}</td>
|
|
275
|
-
// <td>
|
|
276
|
-
// <button
|
|
277
|
-
// className={`btn btn-sm ${(t[1] === "node" && nodeLogs[s[0]]?.errors?.length === 0) ||
|
|
278
|
-
// (t[1] === "web" && webLogs[s[0]]?.errors?.length === 0) ||
|
|
279
|
-
// (t[1] === "pure" && pureLogs[s[0]]?.errors?.length === 0)
|
|
280
|
-
// ? "btn-outline-success"
|
|
281
|
-
// : "btn-outline-danger"
|
|
282
|
-
// }`}
|
|
283
|
-
// onClick={() => {
|
|
284
|
-
// const tabKey = t[1] === "node" ? "node" : t[1] === "web" ? "web" : "pure";
|
|
285
|
-
// setActiveTab(tabKey);
|
|
286
|
-
// }}
|
|
287
|
-
// title={
|
|
288
|
-
// (t[1] === "node" && nodeLogs[s[0]]?.errors?.length === 0) ||
|
|
289
|
-
// (t[1] === "web" && webLogs[s[0]]?.errors?.length === 0) ||
|
|
290
|
-
// (t[1] === "pure" && pureLogs[s[0]]?.errors?.length === 0)
|
|
291
|
-
// ? "Build succeeded"
|
|
292
|
-
// : "Build failed"
|
|
293
|
-
// }
|
|
294
|
-
// >
|
|
295
|
-
// {t[1]}
|
|
296
|
-
// {(t[1] === "node" && nodeLogs[s[0]]?.errors?.length === 0) ||
|
|
297
|
-
// (t[1] === "web" && webLogs[s[0]]?.errors?.length === 0) ||
|
|
298
|
-
// (t[1] === "pure" && pureLogs[s[0]]?.errors?.length === 0)
|
|
299
|
-
// ? " ✅"
|
|
300
|
-
// : " ❌"}
|
|
301
|
-
// </button>
|
|
302
|
-
// </td>
|
|
303
|
-
// <td>
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
// <a
|
|
309
|
-
// href={`./reports/${x}/index.html`}
|
|
310
|
-
// >
|
|
311
|
-
|
|
312
|
-
// {
|
|
313
|
-
// (y.runTimeErrors < 0) && "‼️ Tests did not complete"
|
|
314
|
-
// }
|
|
315
|
-
|
|
316
|
-
// {
|
|
317
|
-
// y.runTimeErrors === 0 && "✅ All tests passed"
|
|
318
|
-
// }
|
|
319
|
-
|
|
320
|
-
// {
|
|
321
|
-
// y.runTimeErrors > 0 && `⚠️ ${y.runTimeErrors} failures`
|
|
322
|
-
// }
|
|
323
|
-
|
|
324
|
-
// </a>
|
|
325
|
-
// </td>
|
|
326
|
-
// <td>
|
|
327
|
-
// <a
|
|
328
|
-
// href={`./reports/${x}/lint_errors.txt`}
|
|
329
|
-
// >
|
|
330
|
-
// {y.staticErrors}
|
|
331
|
-
// </a>
|
|
332
|
-
// </td>
|
|
333
|
-
// <td>
|
|
334
|
-
// <a
|
|
335
|
-
// href={`./reports/${x}/type_errors.txt`}
|
|
336
|
-
// >
|
|
337
|
-
// {y.typeErrors}
|
|
338
|
-
// </a>
|
|
339
|
-
// </td>
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
// </tr>
|
|
343
|
-
// );
|
|
344
|
-
// })}
|
|
345
|
-
// </>
|
|
346
|
-
// );
|
|
347
|
-
// })}
|
|
348
|
-
// </tbody>
|
|
349
|
-
// </Table>
|
|
350
|
-
// </Table>
|
|
351
|
-
// </Tab.Pane>
|
|
352
|
-
// ))}
|
|
353
|
-
// </Tab.Content>
|
|
354
|
-
// </Col>
|
|
355
|
-
// </Row>
|
|
356
|
-
// </Tab.Container>
|
|
357
|
-
// </Tab.Pane>
|
|
358
|
-
// </Tab.Content>
|
|
359
|
-
// </Row>
|
|
360
|
-
// </Tab.Container>
|
|
361
|
-
|
|
362
|
-
// {/* disabled for now */}
|
|
363
|
-
// {/* <SettingsButton className="gear-icon" /> */}
|
|
364
|
-
|
|
365
|
-
// <Footer />
|
|
366
|
-
// </div></div>
|
|
367
|
-
// );
|
|
368
|
-
// };
|
|
369
|
-
|
|
370
|
-
// document.addEventListener("DOMContentLoaded", function () {
|
|
371
|
-
// const elem = document.getElementById("root");
|
|
372
|
-
// if (elem) {
|
|
373
|
-
// ReactDom.createRoot(elem).render(React.createElement(BigBoard, {}));
|
|
374
|
-
// }
|
|
375
|
-
// });
|