testeranto 0.199.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.
Files changed (157) hide show
  1. package/bin/test_runner +0 -0
  2. package/bin/testeranto +0 -0
  3. package/bundle.js +2 -2
  4. package/cmd/test_runner/main.go +65 -0
  5. package/cmd/testeranto/main.go +37 -0
  6. package/dist/common/src/PM/main.js +126 -11
  7. package/dist/common/src/PM/pitonoRunner.js +54 -0
  8. package/dist/common/src/components/pure/TestPageView.js +180 -65
  9. package/dist/common/src/components/stateful/TestPage.js +50 -11
  10. package/dist/common/src/lib/abstractBase.test/index.js +1 -0
  11. package/dist/common/src/run.js +48 -82
  12. package/dist/common/src/{build.js → testeranto.js} +107 -55
  13. package/dist/common/src/utils/golingvuMetafile.js +116 -0
  14. package/dist/common/src/utils/logFiles.js +2 -1
  15. package/dist/common/src/utils/pitonoMetafile.js +67 -0
  16. package/dist/common/src/utils.js +40 -1
  17. package/dist/common/testeranto.config.js +23 -21
  18. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  19. package/dist/module/src/PM/main.js +126 -11
  20. package/dist/module/src/PM/pitonoRunner.js +47 -0
  21. package/dist/module/src/components/pure/TestPageView.js +180 -65
  22. package/dist/module/src/components/stateful/TestPage.js +50 -11
  23. package/dist/module/src/lib/abstractBase.test/index.js +1 -0
  24. package/dist/module/src/run.js +49 -45
  25. package/dist/module/src/{build.js → testeranto.js} +107 -55
  26. package/dist/module/src/utils/golingvuMetafile.js +109 -0
  27. package/dist/module/src/utils/logFiles.js +2 -1
  28. package/dist/module/src/utils/pitonoMetafile.js +60 -0
  29. package/dist/module/src/utils.js +40 -1
  30. package/dist/module/testeranto.config.js +23 -21
  31. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  32. package/dist/prebuild/App.js +81 -17
  33. package/dist/types/src/PM/main.d.ts +2 -0
  34. package/dist/types/src/PM/pitonoRunner.d.ts +7 -0
  35. package/dist/types/src/Types.d.ts +1 -1
  36. package/dist/types/src/run.d.ts +0 -1
  37. package/dist/types/src/utils/golingvuMetafile.d.ts +19 -0
  38. package/dist/types/src/utils/logFiles.d.ts +5 -1
  39. package/dist/types/src/utils/pitonoMetafile.d.ts +7 -0
  40. package/dist/types/src/utils.d.ts +5 -0
  41. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  42. package/docs/index.md +13 -13
  43. package/example/test_example.py +106 -0
  44. package/go.mod +3 -0
  45. package/package.json +2 -2
  46. package/pitono/__init__.py +54 -0
  47. package/pitono/base_given.py +131 -0
  48. package/pitono/base_suite.py +95 -0
  49. package/pitono/base_then.py +50 -0
  50. package/pitono/base_when.py +52 -0
  51. package/pitono/core_generator.py +110 -0
  52. package/pitono/pitono.egg-info/PKG-INFO +17 -0
  53. package/pitono/pitono.egg-info/SOURCES.txt +7 -0
  54. package/pitono/pitono.egg-info/dependency_links.txt +1 -0
  55. package/pitono/pitono.egg-info/entry_points.txt +2 -0
  56. package/pitono/pitono.egg-info/top_level.txt +1 -0
  57. package/pitono/pyproject.toml +26 -0
  58. package/pitono/setup.py +40 -0
  59. package/pitono/simple_adapter.py +24 -0
  60. package/pitono/types.py +78 -0
  61. package/sampleMetafile.json +56 -0
  62. package/src/PM/main.ts +146 -17
  63. package/src/PM/pitonoRunner.ts +49 -0
  64. package/src/Types.ts +1 -1
  65. package/src/components/pure/TestPageView.tsx +175 -8
  66. package/src/components/stateful/TestPage.tsx +57 -16
  67. package/src/core/types.go +36 -0
  68. package/src/golingvu/README.md +3 -0
  69. package/src/golingvu/base_given.go +76 -0
  70. package/src/golingvu/base_suite.go +39 -0
  71. package/src/golingvu/base_suite_test.go +197 -0
  72. package/src/golingvu/base_then.go +21 -0
  73. package/src/golingvu/base_when.go +21 -0
  74. package/src/golingvu/golingvu.go +179 -0
  75. package/src/golingvu/test_adapter.go +33 -0
  76. package/src/golingvu/types.go +86 -0
  77. package/src/lib/abstractBase.test/index.ts +1 -0
  78. package/src/pitono/README.md +3 -0
  79. package/src/run.ts +48 -48
  80. package/src/templates/frontpage.html +26 -17
  81. package/src/{build.ts → testeranto.ts} +128 -58
  82. package/src/utils/golingvuMetafile.ts +165 -0
  83. package/src/utils/logFiles.ts +2 -1
  84. package/src/utils/pitonoMetafile.ts +68 -0
  85. package/src/utils.ts +38 -1
  86. package/testeranto/App.js +81 -17
  87. package/testeranto/metafiles/golang/core.json +72 -0
  88. package/testeranto/metafiles/node/core.json +21 -459
  89. package/testeranto/metafiles/pure/core.json +18 -119
  90. package/testeranto/metafiles/web/core.json +37 -16797
  91. package/testeranto/reports/core/config.json +8 -40
  92. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +6 -0
  93. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +12 -1
  94. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +2 -0
  95. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +11 -1
  96. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +2 -0
  97. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/prompt.txt +13 -3
  98. package/testeranto/reports/core/summary.json +9 -45
  99. package/testeranto.config.ts +25 -21
  100. package/tsc.log +46 -7
  101. package/dist/common/src/lib/mocks.test.js +0 -11
  102. package/dist/module/src/lib/mocks.test.js +0 -11
  103. package/dist/prebuild/build.mjs +0 -578
  104. package/dist/prebuild/run.mjs +0 -2290
  105. package/dist/tsconfig.tsbuildinfo +0 -1
  106. package/dist/types/src/lib/mocks.test.d.ts +0 -0
  107. package/src/lib/mocks.test.ts +0 -11
  108. package/testeranto/reports/core/src/Pure.test/pure/exit.log +0 -0
  109. package/testeranto/reports/core/src/Pure.test/pure/lint_errors.txt +0 -0
  110. package/testeranto/reports/core/src/Pure.test/pure/message.txt +0 -17
  111. package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +0 -14
  112. package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +0 -66
  113. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/debug.log +0 -0
  114. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/error.log +0 -67
  115. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +0 -1
  116. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +0 -2
  117. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/lint_errors.txt +0 -0
  118. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/message.txt +0 -17
  119. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/prompt.txt +0 -16
  120. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/tests.json +0 -68
  121. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/type_errors.txt +0 -56
  122. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/warn.log +0 -0
  123. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/debug.log +0 -0
  124. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/error.log +0 -22
  125. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +0 -1
  126. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +0 -2
  127. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -13
  128. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -17
  129. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -16
  130. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/tests.json +0 -88
  131. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -45
  132. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/warn.log +0 -0
  133. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/debug.log +0 -0
  134. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/error.log +0 -0
  135. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/exit.log +0 -1
  136. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/info.log +0 -2
  137. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/lint_errors.txt +0 -47
  138. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/message.txt +0 -17
  139. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/prompt.txt +0 -17
  140. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/tests.json +0 -57
  141. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/type_errors.txt +0 -99
  142. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/warn.log +0 -0
  143. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/exit.log +0 -1
  144. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/lint_errors.txt +0 -0
  145. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/message.txt +0 -17
  146. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/prompt.txt +0 -17
  147. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stderr.log +0 -18
  148. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stdout.log +0 -0
  149. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/type_errors.txt +0 -32
  150. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +0 -1
  151. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +0 -15
  152. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +0 -17
  153. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +0 -17
  154. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +0 -66
  155. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +0 -10
  156. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +0 -47
  157. /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" }, testData.givens.map((given, i) => (react_1.default.createElement("div", { key: i, className: "mb-4 card" },
127
- react_1.default.createElement("div", { className: "card-header bg-primary text-white" },
128
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
129
- react_1.default.createElement("div", null,
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("div", null,
153
- react_1.default.createElement("strong", null, "When:"),
154
- " ",
155
- when.name,
156
- when.features && when.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
157
- react_1.default.createElement("small", null, "Features:"),
158
- 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))))))),
159
- when.error && react_1.default.createElement("pre", { className: "mt-2" }, when.error))),
160
- when.artifacts && when.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
161
- react_1.default.createElement("strong", null, "Artifacts:"),
162
- react_1.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
163
- react_1.default.createElement("a", { href: `reports/${projectName}/${testName
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", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))))),
167
- given.thens.map((then, k) => (react_1.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error
168
- ? "bg-danger text-white"
169
- : "bg-success text-white"}` },
170
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
171
- react_1.default.createElement("div", null,
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("strong", null, "Then:"),
174
- " ",
175
- then.name,
176
- then.features && then.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
177
- react_1.default.createElement("small", null, "Features:"),
178
- 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))))))),
179
- then.error && react_1.default.createElement("pre", { className: "mt-2" }, then.error))),
180
- then.artifacts && then.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
181
- react_1.default.createElement("strong", null, "Artifacts:"),
182
- react_1.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
183
- react_1.default.createElement("a", { href: `reports/${projectName}/${testName
184
- .split(".")
185
- .slice(0, -1)
186
- .join(".")}/${runtime}/${artifact}`, target: "_blank", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop())))))))))))))))));
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
- Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime]).length > 0 && (react_1.default.createElement("div", { className: "p-2" },
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")) && !selectedFile.path.endsWith("tests.json") && (react_1.default.createElement("pre", { className: "bg-light p-2 small" },
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 TypeScript file and not in node_modules
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 TypeScript files
117
- inputDetails.imports.forEach(imp => {
118
- if ((imp.path.endsWith('.ts') || imp.path.endsWith('.tsx')) &&
119
- !imp.path.includes('node_modules') &&
120
- !imp.external) {
121
- tsSources.add(imp.path);
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");
@@ -1,83 +1,49 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const ansi_colors_1 = __importDefault(require("ansi-colors"));
40
- const readline_1 = __importDefault(require("readline"));
41
- const main_1 = require("./PM/main");
42
- readline_1.default.emitKeypressEvents(process.stdin);
43
- if (process.stdin.isTTY)
44
- process.stdin.setRawMode(true);
45
- console.log(ansi_colors_1.default.inverse("Press 'q' to initiate a graceful shutdown."));
46
- console.log(ansi_colors_1.default.inverse("Press 'x' to quit forcefully."));
47
- process.stdin.on("keypress", (str, key) => {
48
- if (key.name === "x") {
49
- console.log(ansi_colors_1.default.inverse("Shutting down forcefully..."));
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
+ // });