testeranto 0.167.0 → 0.172.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 (185) hide show
  1. package/dist/common/src/NavBar.js +45 -0
  2. package/dist/common/src/PM/main.js +81 -59
  3. package/dist/common/src/Pure.js +16 -14
  4. package/dist/common/src/ReportServer.js +48 -5
  5. package/dist/common/src/Web.js +35 -20
  6. package/dist/common/src/components/SunriseAnimation.test/implementation.js +1 -0
  7. package/dist/common/src/components/SunriseAnimation.test/index.js +1 -0
  8. package/dist/common/src/components/SunriseAnimation.test/interface.js +1 -0
  9. package/dist/common/src/components/SunriseAnimation.test/specification.js +1 -0
  10. package/dist/common/src/components/TestStatusBadge.js +55 -0
  11. package/dist/common/src/components/pure/ProjectPageView.js +204 -0
  12. package/dist/common/src/components/pure/ProjectPageView.test/adapter.js +20 -0
  13. package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +71 -0
  14. package/dist/common/src/components/pure/ProjectPageView.test/index.js +10 -0
  15. package/dist/common/src/components/pure/ProjectPageView.test/specification.js +19 -0
  16. package/dist/common/src/components/pure/ProjectPageView.test/types.js +2 -0
  17. package/dist/common/src/lib/BaseSuite.js +3 -3
  18. package/dist/common/src/lib/BaseSuite.test/test.js +1 -1
  19. package/dist/common/src/lib/abstractBase.js +41 -14
  20. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
  21. package/dist/common/src/lib/pmProxy.js +185 -64
  22. package/dist/common/testeranto.config.js +6 -0
  23. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  24. package/dist/module/src/App.js +3 -3
  25. package/dist/module/src/PM/main.js +81 -59
  26. package/dist/module/src/ProjectsPage.js +1 -110
  27. package/dist/module/src/Pure.js +16 -14
  28. package/dist/module/src/ReportServer.js +48 -5
  29. package/dist/module/src/TestPage.js +45 -16
  30. package/dist/module/src/Web.js +35 -20
  31. package/dist/module/src/components/SunriseAnimation.test/implementation.js +1 -0
  32. package/dist/module/src/components/SunriseAnimation.test/index.js +1 -0
  33. package/dist/module/src/components/SunriseAnimation.test/interface.js +1 -0
  34. package/dist/module/src/components/SunriseAnimation.test/specification.js +1 -0
  35. package/dist/module/src/components/pure/ProjectPageView.js +197 -0
  36. package/dist/module/src/components/pure/ProjectPageView.test/adapter.js +17 -0
  37. package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +68 -0
  38. package/dist/module/src/components/pure/ProjectPageView.test/index.js +5 -0
  39. package/dist/module/src/components/pure/ProjectPageView.test/specification.js +15 -0
  40. package/dist/module/src/components/pure/ProjectPageView.test/types.js +1 -0
  41. package/dist/module/src/components/pure/ProjectsPageView.js +58 -0
  42. package/dist/module/src/components/pure/TestPageView.js +136 -0
  43. package/dist/module/src/components/stateful/ProjectPage.js +63 -0
  44. package/dist/module/src/components/stateful/ProjectsPage.js +55 -0
  45. package/dist/module/src/components/stateful/TestPage.js +82 -0
  46. package/dist/module/src/lib/BaseSuite.js +3 -3
  47. package/dist/module/src/lib/BaseSuite.test/test.js +1 -1
  48. package/dist/module/src/lib/abstractBase.js +41 -14
  49. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +1 -1
  50. package/dist/module/src/lib/pmProxy.js +185 -64
  51. package/dist/module/testeranto.config.js +6 -0
  52. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  53. package/dist/prebuild/App.css +13 -9
  54. package/dist/prebuild/App.js +600 -551
  55. package/dist/prebuild/ReportServer.mjs +44 -4
  56. package/dist/prebuild/run.mjs +67 -39
  57. package/dist/types/src/NavBar.d.ts +19 -0
  58. package/dist/types/src/PM/index.d.ts +3 -1
  59. package/dist/types/src/PM/main.d.ts +0 -4
  60. package/dist/types/src/PM/node.d.ts +2 -2
  61. package/dist/types/src/components/SunriseAnimation.test/interface.d.ts +0 -0
  62. package/dist/types/src/components/SunriseAnimation.test/specification.d.ts +0 -0
  63. package/dist/types/src/components/TestStatusBadge.d.ts +15 -0
  64. package/dist/types/src/components/pure/ProjectPageView.d.ts +14 -0
  65. package/dist/types/src/components/pure/ProjectPageView.test/adapter.d.ts +3 -0
  66. package/dist/types/src/components/pure/ProjectPageView.test/implementation.d.ts +3 -0
  67. package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +2 -0
  68. package/dist/types/src/components/pure/ProjectPageView.test/specification.d.ts +3 -0
  69. package/dist/types/src/components/pure/ProjectPageView.test/types.d.ts +39 -0
  70. package/dist/types/src/lib/BaseSuite.d.ts +2 -0
  71. package/dist/types/src/lib/abstractBase.d.ts +12 -0
  72. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  73. package/package.json +5 -3
  74. package/src/App.tsx +5 -9
  75. package/src/PM/index.ts +1 -1
  76. package/src/PM/main.ts +87 -82
  77. package/src/PM/node.ts +2 -2
  78. package/src/ProjectsPage.tsx +1 -164
  79. package/src/Pure.ts +16 -16
  80. package/src/ReportServer.ts +49 -6
  81. package/src/TestPage.tsx +78 -5
  82. package/src/Web.ts +35 -35
  83. package/src/components/SunriseAnimation.test/implementation.ts +0 -0
  84. package/src/components/SunriseAnimation.test/index.ts +0 -0
  85. package/src/components/SunriseAnimation.test/interface.ts +0 -0
  86. package/src/components/SunriseAnimation.test/specification.ts +0 -0
  87. package/src/components/pure/ProjectPageView.test/adapter.ts +21 -0
  88. package/src/components/pure/ProjectPageView.test/implementation.tsx +84 -0
  89. package/src/components/pure/ProjectPageView.test/index.ts +8 -0
  90. package/src/components/pure/ProjectPageView.test/specification.ts +31 -0
  91. package/src/components/pure/ProjectPageView.test/types.ts +55 -0
  92. package/src/components/pure/ProjectPageView.tsx +332 -0
  93. package/src/components/pure/ProjectsPageView.tsx +99 -0
  94. package/src/components/pure/TestPageView.tsx +278 -0
  95. package/src/components/stateful/ProjectPage.tsx +83 -0
  96. package/src/components/stateful/ProjectsPage.tsx +73 -0
  97. package/src/components/stateful/TestPage.tsx +107 -0
  98. package/src/lib/BaseSuite.test/test.ts +1 -1
  99. package/src/lib/BaseSuite.ts +9 -4
  100. package/src/lib/abstractBase.ts +45 -14
  101. package/src/lib/baseBuilder.test/baseBuilder.test.adapter.ts +1 -1
  102. package/src/lib/pmProxy.ts +184 -87
  103. package/testeranto/App.css +13 -9
  104. package/testeranto/App.js +600 -551
  105. package/testeranto/bundles/node/allTests/{chunk-4ONUZRZ4.mjs → chunk-3EUGBAOM.mjs} +1 -1
  106. package/testeranto/bundles/node/allTests/{chunk-IDCUSTSM.mjs → chunk-E75CSRER.mjs} +246 -115
  107. package/testeranto/bundles/node/allTests/{chunk-NQEP7SN4.mjs → chunk-M6DO7VMB.mjs} +1 -1
  108. package/testeranto/bundles/node/allTests/metafile.json +37 -37
  109. package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +4 -4
  110. package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +3 -3
  111. package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +3 -3
  112. package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +2 -17
  113. package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +354 -252
  114. package/testeranto/bundles/pure/allTests/{chunk-5SBJWHSZ.mjs → chunk-KHDVEHF7.mjs} +2 -17
  115. package/testeranto/bundles/pure/allTests/{chunk-4ULDTZFU.mjs → chunk-VMUSFSZM.mjs} +246 -115
  116. package/testeranto/bundles/pure/allTests/metafile.json +72 -42
  117. package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +2 -2
  118. package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +3 -3
  119. package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +2 -29
  120. package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +2283 -0
  121. package/testeranto/bundles/web/allTests/{chunk-46E6YGGN.mjs → chunk-U7AW26HL.mjs} +292 -142
  122. package/testeranto/bundles/web/allTests/metafile.json +22 -943
  123. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.html +19 -0
  124. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.mjs +37524 -0
  125. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +20 -2
  126. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +26 -2
  127. package/testeranto/reports/allTests/config.json +8 -0
  128. package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +9 -3
  129. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/bdd_errors.txt +1 -0
  130. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +13 -0
  131. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +50 -0
  132. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +2 -0
  133. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +17 -0
  134. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +32 -0
  135. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +68 -0
  136. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +22 -39
  137. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +6 -3
  138. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +8 -1
  139. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +6 -3
  140. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +9 -3
  141. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +66 -55
  142. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +2 -2
  143. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +6 -3
  144. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +10 -5
  145. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +16 -48
  146. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +18 -9
  147. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +8 -1
  148. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +10 -5
  149. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +62 -33
  150. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +2 -2
  151. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +18 -9
  152. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +10 -5
  153. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +37 -50
  154. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +36 -18
  155. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +8 -1
  156. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +2 -2
  157. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +9 -3
  158. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +28 -43
  159. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +28 -14
  160. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +8 -1
  161. package/testeranto/reports/allTests/summary.json +15 -8
  162. package/testeranto/reportsnode_build_errors +20 -0
  163. package/testeranto/reportspure_build_errors +343 -0
  164. package/testeranto/reportsweb_build_errors +25 -0
  165. package/testeranto.config.ts +7 -0
  166. package/tsc.log +100 -26
  167. package/dist/tsconfig.tsbuildinfo +0 -1
  168. package/testeranto/bundles/node/allTests/chunk-FFBRDUBH.mjs +0 -677
  169. package/testeranto/bundles/node/allTests/chunk-H2IBV7SY.mjs +0 -113
  170. package/testeranto/bundles/node/allTests/chunk-ZHOULXPN.mjs +0 -252
  171. package/testeranto/bundles/pure/allTests/chunk-CSMXYJ65.mjs +0 -200
  172. package/testeranto/bundles/pure/allTests/chunk-QK4IXLF6.mjs +0 -674
  173. package/testeranto/bundles/web/allTests/chunk-TU3MJSSI.mjs +0 -855
  174. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test/manifest.json +0 -1
  175. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/manifest.json +0 -1
  176. package/testeranto/reports/allTests/src/Pure.test/pure/manifest.json +0 -1
  177. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/manifest.json +0 -1
  178. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/manifest.json +0 -1
  179. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/manifest.json +0 -1
  180. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/manifest.json +0 -1
  181. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/manifest.json +0 -1
  182. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/manifest.json +0 -1
  183. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/manifest.json +0 -1
  184. /package/{testeranto/reports/allTests/src/Pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/implementation.d.ts} +0 -0
  185. /package/{testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/logs.txt → dist/types/src/components/SunriseAnimation.test/index.d.ts} +0 -0
package/testeranto/App.js CHANGED
@@ -2383,9 +2383,9 @@
2383
2383
  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") {
2384
2384
  __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
2385
2385
  }
2386
- var React87 = require_react();
2386
+ var React90 = require_react();
2387
2387
  var Scheduler = require_scheduler();
2388
- var ReactSharedInternals = React87.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
2388
+ var ReactSharedInternals = React90.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
2389
2389
  var suppressWarning = false;
2390
2390
  function setSuppressWarning(newSuppressWarning) {
2391
2391
  {
@@ -3990,7 +3990,7 @@
3990
3990
  {
3991
3991
  if (props.value == null) {
3992
3992
  if (typeof props.children === "object" && props.children !== null) {
3993
- React87.Children.forEach(props.children, function(child) {
3993
+ React90.Children.forEach(props.children, function(child) {
3994
3994
  if (child == null) {
3995
3995
  return;
3996
3996
  }
@@ -12437,7 +12437,7 @@
12437
12437
  }
12438
12438
  }
12439
12439
  var fakeInternalInstance = {};
12440
- var emptyRefsObject = new React87.Component().refs;
12440
+ var emptyRefsObject = new React90.Component().refs;
12441
12441
  var didWarnAboutStateAssignmentForComponent;
12442
12442
  var didWarnAboutUninitializedState;
12443
12443
  var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
@@ -23609,7 +23609,7 @@
23609
23609
  if (true) {
23610
23610
  (function() {
23611
23611
  "use strict";
23612
- var React87 = require_react();
23612
+ var React90 = require_react();
23613
23613
  var REACT_ELEMENT_TYPE = Symbol.for("react.element");
23614
23614
  var REACT_PORTAL_TYPE = Symbol.for("react.portal");
23615
23615
  var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment");
@@ -23635,7 +23635,7 @@
23635
23635
  }
23636
23636
  return null;
23637
23637
  }
23638
- var ReactSharedInternals = React87.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
23638
+ var ReactSharedInternals = React90.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
23639
23639
  function error(format) {
23640
23640
  {
23641
23641
  {
@@ -25317,10 +25317,10 @@
25317
25317
  });
25318
25318
 
25319
25319
  // src/App.tsx
25320
- var import_react63 = __toESM(require_react(), 1);
25320
+ var import_react66 = __toESM(require_react(), 1);
25321
25321
  var import_client = __toESM(require_client(), 1);
25322
25322
 
25323
- // node_modules/react-router/dist/development/chunk-EF7DTUVF.mjs
25323
+ // node_modules/react-router/dist/development/chunk-C37GKA54.mjs
25324
25324
  var React = __toESM(require_react(), 1);
25325
25325
  var React2 = __toESM(require_react(), 1);
25326
25326
  var React3 = __toESM(require_react(), 1);
@@ -26302,68 +26302,71 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
26302
26302
  }
26303
26303
  }
26304
26304
  }
26305
- return renderedMatches.reduceRight((outlet, match, index) => {
26306
- let error;
26307
- let shouldRenderHydrateFallback = false;
26308
- let errorElement = null;
26309
- let hydrateFallbackElement = null;
26310
- if (dataRouterState) {
26311
- error = errors && match.route.id ? errors[match.route.id] : void 0;
26312
- errorElement = match.route.errorElement || defaultErrorElement;
26313
- if (renderFallback) {
26314
- if (fallbackIndex < 0 && index === 0) {
26315
- warningOnce(
26316
- "route-fallback",
26317
- false,
26318
- "No `HydrateFallback` element provided to render during initial hydration"
26319
- );
26320
- shouldRenderHydrateFallback = true;
26321
- hydrateFallbackElement = null;
26322
- } else if (fallbackIndex === index) {
26323
- shouldRenderHydrateFallback = true;
26324
- hydrateFallbackElement = match.route.hydrateFallbackElement || null;
26305
+ return renderedMatches.reduceRight(
26306
+ (outlet, match, index) => {
26307
+ let error;
26308
+ let shouldRenderHydrateFallback = false;
26309
+ let errorElement = null;
26310
+ let hydrateFallbackElement = null;
26311
+ if (dataRouterState) {
26312
+ error = errors && match.route.id ? errors[match.route.id] : void 0;
26313
+ errorElement = match.route.errorElement || defaultErrorElement;
26314
+ if (renderFallback) {
26315
+ if (fallbackIndex < 0 && index === 0) {
26316
+ warningOnce(
26317
+ "route-fallback",
26318
+ false,
26319
+ "No `HydrateFallback` element provided to render during initial hydration"
26320
+ );
26321
+ shouldRenderHydrateFallback = true;
26322
+ hydrateFallbackElement = null;
26323
+ } else if (fallbackIndex === index) {
26324
+ shouldRenderHydrateFallback = true;
26325
+ hydrateFallbackElement = match.route.hydrateFallbackElement || null;
26326
+ }
26325
26327
  }
26326
26328
  }
26327
- }
26328
- let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));
26329
- let getChildren = () => {
26330
- let children;
26331
- if (error) {
26332
- children = errorElement;
26333
- } else if (shouldRenderHydrateFallback) {
26334
- children = hydrateFallbackElement;
26335
- } else if (match.route.Component) {
26336
- children = /* @__PURE__ */ React2.createElement(match.route.Component, null);
26337
- } else if (match.route.element) {
26338
- children = match.route.element;
26339
- } else {
26340
- children = outlet;
26341
- }
26342
- return /* @__PURE__ */ React2.createElement(
26343
- RenderedRoute,
26344
- {
26345
- match,
26346
- routeContext: {
26347
- outlet,
26348
- matches: matches2,
26349
- isDataRoute: dataRouterState != null
26350
- },
26351
- children
26329
+ let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));
26330
+ let getChildren = () => {
26331
+ let children;
26332
+ if (error) {
26333
+ children = errorElement;
26334
+ } else if (shouldRenderHydrateFallback) {
26335
+ children = hydrateFallbackElement;
26336
+ } else if (match.route.Component) {
26337
+ children = /* @__PURE__ */ React2.createElement(match.route.Component, null);
26338
+ } else if (match.route.element) {
26339
+ children = match.route.element;
26340
+ } else {
26341
+ children = outlet;
26352
26342
  }
26353
- );
26354
- };
26355
- return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React2.createElement(
26356
- RenderErrorBoundary,
26357
- {
26358
- location: dataRouterState.location,
26359
- revalidation: dataRouterState.revalidation,
26360
- component: errorElement,
26361
- error,
26362
- children: getChildren(),
26363
- routeContext: { outlet: null, matches: matches2, isDataRoute: true }
26364
- }
26365
- ) : getChildren();
26366
- }, null);
26343
+ return /* @__PURE__ */ React2.createElement(
26344
+ RenderedRoute,
26345
+ {
26346
+ match,
26347
+ routeContext: {
26348
+ outlet,
26349
+ matches: matches2,
26350
+ isDataRoute: dataRouterState != null
26351
+ },
26352
+ children
26353
+ }
26354
+ );
26355
+ };
26356
+ return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React2.createElement(
26357
+ RenderErrorBoundary,
26358
+ {
26359
+ location: dataRouterState.location,
26360
+ revalidation: dataRouterState.revalidation,
26361
+ component: errorElement,
26362
+ error,
26363
+ children: getChildren(),
26364
+ routeContext: { outlet: null, matches: matches2, isDataRoute: true }
26365
+ }
26366
+ ) : getChildren();
26367
+ },
26368
+ null
26369
+ );
26367
26370
  }
26368
26371
  function getDataRouterConsoleError(hookName) {
26369
26372
  return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`;
@@ -26473,7 +26476,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
26473
26476
  }) {
26474
26477
  return useRoutesImpl(routes, void 0, state, future);
26475
26478
  }
26476
- function Route(_props) {
26479
+ function Route(props) {
26477
26480
  invariant(
26478
26481
  false,
26479
26482
  `A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`
@@ -26964,10 +26967,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
26964
26967
  }
26965
26968
  };
26966
26969
  }
26967
- function PrefetchPageLinks({
26968
- page,
26969
- ...dataLinkProps
26970
- }) {
26970
+ function PrefetchPageLinks({ page, ...linkProps }) {
26971
26971
  let { router } = useDataRouterContext2();
26972
26972
  let matches = React8.useMemo(
26973
26973
  () => matchRoutes(router.routes, page, router.basename),
@@ -26976,7 +26976,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
26976
26976
  if (!matches) {
26977
26977
  return null;
26978
26978
  }
26979
- return /* @__PURE__ */ React8.createElement(PrefetchPageLinksImpl, { page, matches, ...dataLinkProps });
26979
+ return /* @__PURE__ */ React8.createElement(PrefetchPageLinksImpl, { page, matches, ...linkProps });
26980
26980
  }
26981
26981
  function useKeyedPrefetchLinks(matches) {
26982
26982
  let { manifest, routeModules } = useFrameworkContext();
@@ -27093,7 +27093,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
27093
27093
  try {
27094
27094
  if (isBrowser) {
27095
27095
  window.__reactRouterVersion = // @ts-expect-error
27096
- "7.7.0";
27096
+ "7.7.1";
27097
27097
  }
27098
27098
  } catch (e) {
27099
27099
  }
@@ -27659,7 +27659,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
27659
27659
  };
27660
27660
  }, [callback, capture]);
27661
27661
  }
27662
- function useViewTransitionState(to, opts = {}) {
27662
+ function useViewTransitionState(to, { relative } = {}) {
27663
27663
  let vtContext = React10.useContext(ViewTransitionContext);
27664
27664
  invariant(
27665
27665
  vtContext != null,
@@ -27669,7 +27669,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
27669
27669
  "useViewTransitionState"
27670
27670
  /* useViewTransitionState */
27671
27671
  );
27672
- let path = useResolvedPath(to, { relative: opts.relative });
27672
+ let path = useResolvedPath(to, { relative });
27673
27673
  if (!vtContext.isTransitioning) {
27674
27674
  return false;
27675
27675
  }
@@ -27681,8 +27681,11 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
27681
27681
  // node_modules/react-router/dist/development/index.mjs
27682
27682
  "use client";
27683
27683
 
27684
- // src/ProjectsPage.tsx
27685
- var import_react57 = __toESM(require_react(), 1);
27684
+ // src/components/stateful/TestPage.tsx
27685
+ var import_react59 = __toESM(require_react(), 1);
27686
+
27687
+ // src/components/pure/TestPageView.tsx
27688
+ var import_react58 = __toESM(require_react(), 1);
27686
27689
 
27687
27690
  // node_modules/@babel/runtime/helpers/esm/extends.js
27688
27691
  function _extends() {
@@ -32124,118 +32127,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32124
32127
  })), rightContent && /* @__PURE__ */ import_react56.default.createElement(Nav_default2, null, rightContent))));
32125
32128
  };
32126
32129
 
32127
- // src/ProjectsPage.tsx
32128
- var ProjectsPage = () => {
32129
- const [projects, setProjects] = (0, import_react57.useState)([]);
32130
- const [summaries, setSummaries] = (0, import_react57.useState)({});
32131
- const [loading, setLoading] = (0, import_react57.useState)(true);
32132
- const [error, setError] = (0, import_react57.useState)(null);
32133
- const navigate = useNavigate();
32134
- const [configs, setConfigs] = (0, import_react57.useState)({});
32135
- (0, import_react57.useEffect)(() => {
32136
- const fetchProjects = async () => {
32137
- try {
32138
- const projectsRes = await fetch(`projects.json`);
32139
- const projectNames = await projectsRes.json();
32140
- const projectsData = await Promise.all(
32141
- projectNames.map(async (name) => {
32142
- const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
32143
- fetch(`reports/${name}/summary.json`),
32144
- fetch(`bundles/node/${name}/metafile.json`),
32145
- fetch(`bundles/web/${name}/metafile.json`),
32146
- fetch(`bundles/pure/${name}/metafile.json`),
32147
- fetch(`reports/${name}/config.json`)
32148
- ]);
32149
- const [summary, nodeData, webData, pureData, configData] = await Promise.all([
32150
- summaryRes.json(),
32151
- nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
32152
- webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
32153
- pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
32154
- configRes.json()
32155
- ]);
32156
- setSummaries((prev) => ({ ...prev, [name]: summary }));
32157
- setConfigs((prev) => ({ ...prev, [name]: configData }));
32158
- return {
32159
- name,
32160
- testCount: Object.keys(summary).length,
32161
- nodeStatus: nodeData.errors?.length ? "failed" : nodeData.warnings?.length ? "warning" : "success",
32162
- webStatus: webData.errors?.length ? "failed" : webData.warnings?.length ? "warning" : "success",
32163
- pureStatus: pureData.errors?.length ? "failed" : pureData.warnings?.length ? "warning" : "success",
32164
- config: Object.keys(configData).length
32165
- };
32166
- })
32167
- );
32168
- setProjects(projectsData);
32169
- } catch (err) {
32170
- setError(err instanceof Error ? err.message : "Unknown error");
32171
- } finally {
32172
- setLoading(false);
32173
- }
32174
- };
32175
- fetchProjects();
32176
- }, []);
32177
- const getStatusIcon = (status) => {
32178
- switch (status) {
32179
- case "success":
32180
- return "\u2705";
32181
- case "failed":
32182
- return "\u274C";
32183
- case "warning":
32184
- return "\u26A0\uFE0F";
32185
- default:
32186
- return "\u2753";
32187
- }
32188
- };
32189
- if (loading)
32190
- return /* @__PURE__ */ import_react57.default.createElement("div", null, "Loading projects...");
32191
- if (error)
32192
- return /* @__PURE__ */ import_react57.default.createElement(Alert_default, { variant: "danger" }, "Error: ", error);
32193
- console.log(configs);
32194
- return /* @__PURE__ */ import_react57.default.createElement("div", { className: "p-3" }, /* @__PURE__ */ import_react57.default.createElement(NavBar, { title: "Testeranto", backLink: null }), /* @__PURE__ */ import_react57.default.createElement(Table_default, { striped: true, bordered: true, hover: true, responsive: true }, /* @__PURE__ */ import_react57.default.createElement("thead", null, /* @__PURE__ */ import_react57.default.createElement("tr", null, /* @__PURE__ */ import_react57.default.createElement("th", null, "Project"), /* @__PURE__ */ import_react57.default.createElement("th", null, "Tests"), /* @__PURE__ */ import_react57.default.createElement("th", null, "Node"), /* @__PURE__ */ import_react57.default.createElement("th", null, "Web"), /* @__PURE__ */ import_react57.default.createElement("th", null, "Pure"))), /* @__PURE__ */ import_react57.default.createElement("tbody", null, projects.map((project) => /* @__PURE__ */ import_react57.default.createElement("tr", { key: project.name }, /* @__PURE__ */ import_react57.default.createElement("td", null, /* @__PURE__ */ import_react57.default.createElement("a", { href: "#", onClick: (e) => {
32195
- e.preventDefault();
32196
- navigate(`/projects/${project.name}`);
32197
- } }, project.name)), /* @__PURE__ */ import_react57.default.createElement("td", null, /* @__PURE__ */ import_react57.default.createElement("div", { style: { maxHeight: "200px", overflowY: "auto" } }, summaries[project.name] ? Object.keys(summaries[project.name]).map((testName2) => {
32198
- const testData = summaries[project.name][testName2];
32199
- const runTime = configs[project.name].tests.find((t) => t[0] === testName2)[1];
32200
- const hasRuntimeErrors = testData.runTimeErrors > 0;
32201
- const hasStaticErrors = testData.typeErrors > 0 || testData.staticErrors > 0;
32202
- return /* @__PURE__ */ import_react57.default.createElement("div", { key: testName2 }, /* @__PURE__ */ import_react57.default.createElement(
32203
- "a",
32204
- {
32205
- href: `#/projects/${project.name}/tests/${encodeURIComponent(testName2)}/${runTime}`
32206
- },
32207
- hasRuntimeErrors ? "\u274C " : hasStaticErrors ? "\u26A0\uFE0F " : "",
32208
- testName2.split("/").pop()
32209
- ));
32210
- }) : /* @__PURE__ */ import_react57.default.createElement("div", null, "Loading tests..."))), /* @__PURE__ */ import_react57.default.createElement("td", null, /* @__PURE__ */ import_react57.default.createElement(
32211
- "a",
32212
- {
32213
- href: `#/projects/${project.name}#node`
32214
- },
32215
- getStatusIcon(project.nodeStatus),
32216
- " Node build logs"
32217
- )), /* @__PURE__ */ import_react57.default.createElement("td", null, /* @__PURE__ */ import_react57.default.createElement(
32218
- "a",
32219
- {
32220
- href: `#/projects/${project.name}#web`
32221
- },
32222
- getStatusIcon(project.webStatus),
32223
- " Web build logs"
32224
- )), /* @__PURE__ */ import_react57.default.createElement("td", null, /* @__PURE__ */ import_react57.default.createElement(
32225
- "a",
32226
- {
32227
- href: `#/projects/${project.name}#pure`
32228
- },
32229
- getStatusIcon(project.pureStatus),
32230
- " Pure build logs"
32231
- )))))));
32232
- };
32233
-
32234
- // src/ProjectPage.tsx
32235
- var import_react59 = __toESM(require_react(), 1);
32236
-
32237
32130
  // src/components/TestStatusBadge.tsx
32238
- var import_react58 = __toESM(require_react(), 1);
32131
+ var import_react57 = __toESM(require_react(), 1);
32239
32132
  var TestStatusBadge = (props) => {
32240
32133
  console.groupCollapsed(`[TestStatusBadge] Rendering for ${props.testName}`);
32241
32134
  console.log("Raw props:", JSON.parse(JSON.stringify(props)));
@@ -32266,7 +32159,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32266
32159
  if (props.variant === "compact") {
32267
32160
  console.log("Rendering compact badge:", bddStatus);
32268
32161
  console.groupEnd();
32269
- return /* @__PURE__ */ import_react58.default.createElement(Badge_default, { bg: bddStatus.variant }, bddStatus.text);
32162
+ return /* @__PURE__ */ import_react57.default.createElement(Badge_default, { bg: bddStatus.variant }, bddStatus.text);
32270
32163
  }
32271
32164
  console.log("Rendering full badge set with:", {
32272
32165
  bddStatus,
@@ -32274,186 +32167,149 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32274
32167
  staticErrors: props.staticErrors
32275
32168
  });
32276
32169
  console.groupEnd();
32277
- return /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex gap-2" }, /* @__PURE__ */ import_react58.default.createElement(Badge_default, { bg: bddStatus.variant }, bddStatus.text));
32170
+ return /* @__PURE__ */ import_react57.default.createElement("div", { className: "d-flex gap-2" }, /* @__PURE__ */ import_react57.default.createElement(Badge_default, { bg: bddStatus.variant }, bddStatus.text));
32278
32171
  };
32279
32172
 
32280
- // src/ProjectPage.tsx
32281
- var BuildLogViewer = ({ logs, runtime }) => {
32282
- if (!logs)
32283
- return /* @__PURE__ */ import_react59.default.createElement(Alert_default, { variant: "info" }, "Loading ", runtime.toLowerCase(), " build logs...");
32284
- const hasErrors = logs.errors?.length > 0;
32285
- const hasWarnings = logs.warnings?.length > 0;
32286
- const [activeTab, setActiveTab] = (0, import_react59.useState)("summary");
32287
- return /* @__PURE__ */ import_react59.default.createElement("div", null, /* @__PURE__ */ import_react59.default.createElement(Tab_default.Container, { activeKey: activeTab, onSelect: (k) => setActiveTab(k || "summary") }, /* @__PURE__ */ import_react59.default.createElement(Nav_default2, { variant: "tabs", className: "mb-3" }, /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Link, { eventKey: "summary" }, "Build Summary")), /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Link, { eventKey: "warnings" }, hasWarnings ? `\u26A0\uFE0F Warnings (${logs.warnings.length})` : "Warnings")), /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react59.default.createElement(Nav_default2.Link, { eventKey: "errors" }, hasErrors ? `\u274C Errors (${logs.errors.length})` : "Errors"))), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Content, null, /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "summary" }, /* @__PURE__ */ import_react59.default.createElement(Card_default, null, /* @__PURE__ */ import_react59.default.createElement(Card_default.Header, { className: "d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react59.default.createElement("h5", null, "Build Summary"), /* @__PURE__ */ import_react59.default.createElement("div", null, hasErrors && /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "danger", className: "me-2" }, logs.errors.length, " Error", logs.errors.length !== 1 ? "s" : ""), hasWarnings && /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "warning", text: "dark" }, logs.warnings.length, " Warning", logs.warnings.length !== 1 ? "s" : ""), !hasErrors && !hasWarnings && /* @__PURE__ */ import_react59.default.createElement("div", { className: "d-flex align-items-center gap-2" }, /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "success" }, "Build Successful"), logs.testsExist && /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "info" }, "tests.json \u2713")))), /* @__PURE__ */ import_react59.default.createElement(Card_default.Body, null, /* @__PURE__ */ import_react59.default.createElement("div", { className: "mb-3" }, /* @__PURE__ */ import_react59.default.createElement("h6", null, "Input Files (", Object.keys(logs.metafile?.inputs || {}).length, ")"), /* @__PURE__ */ import_react59.default.createElement(ListGroup_default, { className: "max-h-200 overflow-auto" }, Object.keys(logs.metafile?.inputs || {}).map((file) => /* @__PURE__ */ import_react59.default.createElement(ListGroup_default.Item, { key: file, className: "py-2" }, /* @__PURE__ */ import_react59.default.createElement("code", null, file), /* @__PURE__ */ import_react59.default.createElement("div", { className: "text-muted small" }, logs.metafile.inputs[file].bytes, " bytes"))))), /* @__PURE__ */ import_react59.default.createElement("div", null, /* @__PURE__ */ import_react59.default.createElement("h6", null, "Output Files (", Object.keys(logs.metafile?.outputs || {}).length, ")"), /* @__PURE__ */ import_react59.default.createElement(ListGroup_default, { className: "max-h-200 overflow-auto" }, Object.keys(logs.metafile?.outputs || {}).map((file) => /* @__PURE__ */ import_react59.default.createElement(ListGroup_default.Item, { key: file, className: "py-2" }, /* @__PURE__ */ import_react59.default.createElement("code", null, file), /* @__PURE__ */ import_react59.default.createElement("div", { className: "text-muted small" }, logs.metafile.outputs[file].bytes, " bytes", logs.metafile.outputs[file].entryPoint && /* @__PURE__ */ import_react59.default.createElement("span", { className: "ms-2 badge bg-info" }, "Entry Point"))))))))), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "warnings" }, hasWarnings ? /* @__PURE__ */ import_react59.default.createElement(Card_default, { className: "border-warning" }, /* @__PURE__ */ import_react59.default.createElement(Card_default.Header, { className: "bg-warning text-white d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react59.default.createElement("span", null, "Build Warnings (", logs.warnings.length, ")"), /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "light", text: "dark" }, (/* @__PURE__ */ new Date()).toLocaleString())), /* @__PURE__ */ import_react59.default.createElement(Card_default.Body, { className: "p-0" }, /* @__PURE__ */ import_react59.default.createElement(ListGroup_default, { variant: "flush" }, logs.warnings.map((warn, i) => /* @__PURE__ */ import_react59.default.createElement(ListGroup_default.Item, { key: i, className: "text-warning" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "d-flex justify-content-between" }, /* @__PURE__ */ import_react59.default.createElement("strong", null, warn.location?.file || "Unknown file", warn.location?.line && `:${warn.location.line}`), /* @__PURE__ */ import_react59.default.createElement("small", { className: "text-muted" }, warn.pluginName ? `[${warn.pluginName}]` : "")), /* @__PURE__ */ import_react59.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react59.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, warn.text || warn.message || JSON.stringify(warn))), warn.detail && /* @__PURE__ */ import_react59.default.createElement("div", { className: "mt-1 small text-muted" }, /* @__PURE__ */ import_react59.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, warn.detail))))))) : /* @__PURE__ */ import_react59.default.createElement(Alert_default, { variant: "info" }, "No warnings found")), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "errors" }, hasErrors ? /* @__PURE__ */ import_react59.default.createElement(Card_default, { className: "border-danger" }, /* @__PURE__ */ import_react59.default.createElement(Card_default.Header, { className: "bg-danger text-white d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react59.default.createElement("span", null, "Build Errors (", logs.errors.length, ")"), /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "light", text: "dark" }, (/* @__PURE__ */ new Date()).toLocaleString())), /* @__PURE__ */ import_react59.default.createElement(Card_default.Body, { className: "p-0" }, /* @__PURE__ */ import_react59.default.createElement(ListGroup_default, { variant: "flush" }, logs.errors.map((err, i) => /* @__PURE__ */ import_react59.default.createElement(ListGroup_default.Item, { key: i, className: "text-danger" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "d-flex justify-content-between" }, /* @__PURE__ */ import_react59.default.createElement("strong", null, err.location?.file || "Unknown file", err.location?.line && `:${err.location.line}`), /* @__PURE__ */ import_react59.default.createElement("small", { className: "text-muted" }, err.pluginName ? `[${err.pluginName}]` : "")), /* @__PURE__ */ import_react59.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react59.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, err.text || err.message || JSON.stringify(err))), err.detail && /* @__PURE__ */ import_react59.default.createElement("div", { className: "mt-1 small text-muted" }, /* @__PURE__ */ import_react59.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, err.detail))))))) : /* @__PURE__ */ import_react59.default.createElement(Alert_default, { variant: "success" }, /* @__PURE__ */ import_react59.default.createElement("h5", null, "No Errors Found"), /* @__PURE__ */ import_react59.default.createElement("p", { className: "mb-0" }, "The build completed without any errors."))))));
32288
- };
32289
- var ProjectPage = () => {
32290
- const [summary, setSummary] = (0, import_react59.useState)(null);
32291
- const [nodeLogs, setNodeLogs] = (0, import_react59.useState)(null);
32292
- const [webLogs, setWebLogs] = (0, import_react59.useState)(null);
32293
- const [pureLogs, setPureLogs] = (0, import_react59.useState)(null);
32294
- const [config, setConfig] = (0, import_react59.useState)({});
32295
- const [loading, setLoading] = (0, import_react59.useState)(true);
32296
- const [error, setError] = (0, import_react59.useState)(null);
32297
- const [projectName, setProjectName] = (0, import_react59.useState)("");
32298
- const navigate = useNavigate();
32299
- const location = useLocation();
32300
- const [route, setRoute] = (0, import_react59.useState)("tests");
32301
- (0, import_react59.useEffect)(() => {
32302
- const hash = location.hash.replace("#", "");
32303
- if (hash && ["tests", "node", "web", "pure"].includes(hash)) {
32304
- setRoute(hash);
32305
- } else {
32306
- setRoute("tests");
32307
- }
32308
- }, [location.hash]);
32309
- const { projectName: name } = useParams();
32310
- (0, import_react59.useEffect)(() => {
32311
- if (!name)
32312
- return;
32313
- setProjectName(name);
32314
- const hash = window.location.hash.replace("#", "");
32315
- if (hash && ["tests", "node", "web", "pure"].includes(hash)) {
32316
- setRoute(hash);
32317
- }
32318
- const fetchData = async () => {
32319
- try {
32320
- const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
32321
- fetch(`reports/${name}/summary.json`),
32322
- fetch(`bundles/node/${name}/metafile.json`),
32323
- fetch(`bundles/web/${name}/metafile.json`),
32324
- fetch(`bundles/pure/${name}/metafile.json`),
32325
- fetch(`reports/${name}/config.json`)
32326
- ]);
32327
- if (!summaryRes.ok)
32328
- throw new Error("Failed to fetch summary");
32329
- const [summaryData, nodeData, webData, pureData, configData] = await Promise.all([
32330
- summaryRes.json(),
32331
- nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
32332
- webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
32333
- pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
32334
- configRes.ok ? configRes.json() : { tests: [] }
32335
- ]);
32336
- setSummary(summaryData);
32337
- setNodeLogs(nodeData);
32338
- setWebLogs(webData);
32339
- setPureLogs(pureData);
32340
- setConfig(configData);
32341
- } catch (err) {
32342
- setError(err instanceof Error ? err.message : "Unknown error");
32343
- } finally {
32344
- setLoading(false);
32345
- }
32346
- };
32347
- fetchData();
32348
- }, []);
32349
- if (loading)
32350
- return /* @__PURE__ */ import_react59.default.createElement("div", null, "Loading project data...");
32351
- if (error)
32352
- return /* @__PURE__ */ import_react59.default.createElement(Alert_default, { variant: "danger" }, "Error: ", error);
32353
- if (!summary)
32354
- return /* @__PURE__ */ import_react59.default.createElement(Alert_default, { variant: "warning" }, "No data found for project");
32355
- const testStatuses = Object.entries(summary).map(([testName2, testData]) => {
32356
- console.groupCollapsed(`[ProjectPage] Processing test: ${testName2}`);
32357
- console.log("Raw test data from summary.json:", testData);
32358
- const checkTestsJson = async () => {
32359
- try {
32360
- let runtimeType = "node";
32361
- const testConfig = config.tests?.find((t) => t[0] === testName2);
32362
- if (testConfig) {
32363
- runtimeType = testConfig[1] || runtimeType;
32364
- } else if (testName2.includes(".web.")) {
32365
- runtimeType = "web";
32366
- } else if (testName2.includes(".pure.")) {
32367
- runtimeType = "pure";
32368
- }
32369
- const jsonPath = `reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtimeType}/tests.json`;
32370
- const res = await fetch(jsonPath, {
32371
- method: "HEAD"
32372
- });
32373
- return res.ok;
32374
- } catch {
32375
- return false;
32376
- }
32377
- };
32378
- const testsJsonExists = checkTestsJson();
32379
- const status = {
32380
- testName: testName2,
32381
- testsExist: testsJsonExists && testData.testsExist !== false,
32382
- // Ensure boolean
32383
- runTimeErrors: Number(testData.runTimeErrors) || 0,
32384
- // Ensure number
32385
- typeErrors: Number(testData.typeErrors) || 0,
32386
- staticErrors: Number(testData.staticErrors) || 0
32387
- };
32388
- console.log("Normalized status:", status);
32389
- console.log("tests.json exists:", testsJsonExists);
32390
- if (status.runTimeErrors === -1 && status.testsExist) {
32391
- console.warn("Inconsistent state: runTimeErrors=-1 but testsExist=true");
32392
- }
32393
- if (!status.testsExist && status.runTimeErrors > 0) {
32394
- console.warn("Inconsistent state: testsExist=false but runTimeErrors>0");
32395
- }
32396
- console.groupEnd();
32397
- return status;
32398
- });
32399
- return /* @__PURE__ */ import_react59.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react59.default.createElement(
32173
+ // src/components/pure/TestPageView.tsx
32174
+ var TestPageView = ({
32175
+ route,
32176
+ setRoute,
32177
+ navigate,
32178
+ projectName,
32179
+ testName: testName2,
32180
+ decodedTestPath,
32181
+ runtime,
32182
+ testData,
32183
+ logs,
32184
+ typeErrors,
32185
+ lintErrors,
32186
+ testsExist,
32187
+ errorCounts
32188
+ }) => {
32189
+ return /* @__PURE__ */ import_react58.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react58.default.createElement(
32400
32190
  NavBar,
32401
32191
  {
32402
- title: projectName,
32403
- backLink: "/",
32192
+ title: decodedTestPath,
32193
+ backLink: `/projects/${projectName}`,
32404
32194
  navItems: [
32405
32195
  {
32406
- to: `#tests`,
32407
- label: testStatuses.some((t) => t.runTimeErrors > 0) ? "\u274C Tests" : testStatuses.some((t) => t.typeErrors > 0 || t.staticErrors > 0) ? "\u26A0\uFE0F Tests" : "\u2705 Tests",
32408
- active: route === "tests",
32409
- className: testStatuses.some((t) => t.runTimeErrors > 0) ? "text-danger fw-bold" : testStatuses.some((t) => t.typeErrors > 0 || t.staticErrors > 0) ? "text-warning fw-bold" : ""
32196
+ label: "",
32197
+ badge: {
32198
+ variant: runtime === "node" ? "primary" : runtime === "web" ? "success" : "info",
32199
+ text: runtime
32200
+ },
32201
+ className: "pe-none d-flex align-items-center gap-2"
32410
32202
  },
32411
32203
  {
32412
- to: `#node`,
32413
- label: nodeLogs?.errors?.length ? "\u274C Node Build" : nodeLogs?.warnings?.length ? "\u26A0\uFE0F Node Build" : "Node Build",
32414
- active: route === "node",
32415
- className: nodeLogs?.errors?.length ? "text-danger fw-bold" : nodeLogs?.warnings?.length ? "text-warning fw-bold" : ""
32204
+ to: `#results`,
32205
+ label: /* @__PURE__ */ import_react58.default.createElement(
32206
+ TestStatusBadge,
32207
+ {
32208
+ testName: decodedTestPath,
32209
+ testsExist,
32210
+ runTimeErrors: errorCounts.runTimeErrors,
32211
+ variant: "compact"
32212
+ }
32213
+ ),
32214
+ className: !testsExist || errorCounts.runTimeErrors > 0 ? "text-danger fw-bold" : "",
32215
+ active: route === "results"
32416
32216
  },
32417
32217
  {
32418
- to: `#web`,
32419
- label: webLogs?.errors?.length ? "\u274C Web Build" : webLogs?.warnings?.length ? "\u26A0\uFE0F Web Build" : "Web Build",
32420
- active: route === "web",
32421
- className: webLogs?.errors?.length ? "text-danger fw-bold" : webLogs?.warnings?.length ? "text-warning fw-bold" : ""
32218
+ to: `#logs`,
32219
+ label: `Runtime logs`,
32220
+ active: route === "logs"
32422
32221
  },
32423
32222
  {
32424
- to: `#pure`,
32425
- label: pureLogs?.errors?.length ? "\u274C Pure Build" : pureLogs?.warnings?.length ? "\u26A0\uFE0F Pure Build" : "Pure Build",
32426
- active: route === "pure",
32427
- className: pureLogs?.errors?.length ? "text-danger fw-bold" : pureLogs?.warnings?.length ? "text-warning fw-bold" : ""
32223
+ to: `#types`,
32224
+ label: errorCounts.typeErrors > 0 ? `tsc (\u274C * ${errorCounts.typeErrors})` : "tsc \u2705 ",
32225
+ active: route === "types"
32226
+ },
32227
+ {
32228
+ to: `#lint`,
32229
+ label: errorCounts.staticErrors > 0 ? `eslint (\u274C *${errorCounts.staticErrors}) ` : "eslint \u2705",
32230
+ active: route === "lint"
32428
32231
  }
32429
- ]
32430
- }
32431
- ), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Container, { activeKey: route, onSelect: (k) => {
32432
- if (k) {
32433
- setRoute(k);
32434
- navigate(`#${k}`, { replace: true });
32435
- }
32436
- } }, /* @__PURE__ */ import_react59.default.createElement(Tab_default.Content, null, /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "tests" }, /* @__PURE__ */ import_react59.default.createElement(Table_default, { striped: true, bordered: true, hover: true }, /* @__PURE__ */ import_react59.default.createElement("thead", null, /* @__PURE__ */ import_react59.default.createElement("tr", null, /* @__PURE__ */ import_react59.default.createElement("th", null, "Test"), /* @__PURE__ */ import_react59.default.createElement("th", null, "Runtime"), /* @__PURE__ */ import_react59.default.createElement("th", null, "BDD Errors"), /* @__PURE__ */ import_react59.default.createElement("th", null, "Type Errors"), /* @__PURE__ */ import_react59.default.createElement("th", null, "Lint Errors"))), /* @__PURE__ */ import_react59.default.createElement("tbody", null, testStatuses.map((test) => {
32437
- const testConfig = config.tests?.find((t) => t[0] === test.testName);
32438
- const runTime = testConfig?.[1] || "node";
32439
- const hasRuntimeErrors = test.runTimeErrors > 0;
32440
- const hasTypeErrors = test.typeErrors > 0;
32441
- const hasLintErrors = test.staticErrors > 0;
32442
- return /* @__PURE__ */ import_react59.default.createElement("tr", { key: test.testName }, /* @__PURE__ */ import_react59.default.createElement("td", null, /* @__PURE__ */ import_react59.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${runTime}` }, test.testName)), /* @__PURE__ */ import_react59.default.createElement("td", null, /* @__PURE__ */ import_react59.default.createElement(Badge_default, { bg: "secondary", className: "ms-2" }, runTime)), /* @__PURE__ */ import_react59.default.createElement("td", null, /* @__PURE__ */ import_react59.default.createElement(
32443
- TestStatusBadge,
32444
- {
32445
- testName: test.testName,
32446
- testsExist: test.testsExist,
32447
- runTimeErrors: test.runTimeErrors,
32448
- typeErrors: test.typeErrors,
32449
- staticErrors: test.staticErrors
32450
- }
32451
- )), /* @__PURE__ */ import_react59.default.createElement("td", null, /* @__PURE__ */ import_react59.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${runTime}#types` }, test.typeErrors > 0 ? `tsc (\u274C * ${test.typeErrors})` : "tsc \u2705")), /* @__PURE__ */ import_react59.default.createElement("td", null, /* @__PURE__ */ import_react59.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${runTime}#lint` }, test.staticErrors > 0 ? `eslint (\u274C *${test.staticErrors})` : "eslint \u2705")));
32452
- })))), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "node" }, /* @__PURE__ */ import_react59.default.createElement(BuildLogViewer, { logs: nodeLogs, runtime: "Node" })), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "web" }, /* @__PURE__ */ import_react59.default.createElement(BuildLogViewer, { logs: webLogs, runtime: "Web" })), /* @__PURE__ */ import_react59.default.createElement(Tab_default.Pane, { eventKey: "pure" }, /* @__PURE__ */ import_react59.default.createElement(BuildLogViewer, { logs: pureLogs, runtime: "Pure" })))));
32453
- };
32454
-
32455
- // src/TestPage.tsx
32456
- var import_react60 = __toESM(require_react(), 1);
32232
+ ],
32233
+ rightContent: /* @__PURE__ */ import_react58.default.createElement(
32234
+ Button_default2,
32235
+ {
32236
+ variant: "info",
32237
+ onClick: async () => {
32238
+ try {
32239
+ const promptPath = `testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/prompt.txt`;
32240
+ const messagePath = `testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/message.txt`;
32241
+ const command = `aider --load ${promptPath} --message-file ${messagePath}`;
32242
+ await navigator.clipboard.writeText(command);
32243
+ alert("Copied aider command to clipboard!");
32244
+ } catch (err) {
32245
+ alert("Failed to copy command to clipboard");
32246
+ console.error("Copy failed:", err);
32247
+ }
32248
+ },
32249
+ className: "ms-2"
32250
+ },
32251
+ "\u{1F916}"
32252
+ )
32253
+ }
32254
+ ), /* @__PURE__ */ import_react58.default.createElement(Tab_default.Container, { activeKey: route, onSelect: (k) => {
32255
+ if (k) {
32256
+ setRoute(k);
32257
+ navigate(`#${k}`, { replace: true });
32258
+ }
32259
+ } }, /* @__PURE__ */ import_react58.default.createElement(Tab_default.Content, { className: "mt-3" }, /* @__PURE__ */ import_react58.default.createElement(Tab_default.Pane, { eventKey: "results" }, !testsExist ? /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "danger", className: "mt-3" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "Tests did not run to completion"), /* @__PURE__ */ import_react58.default.createElement("p", null, "The test results file (tests.json) was not found or could not be loaded."), /* @__PURE__ */ import_react58.default.createElement("div", { className: "mt-3" }, /* @__PURE__ */ import_react58.default.createElement(
32260
+ Button_default2,
32261
+ {
32262
+ variant: "outline-light",
32263
+ onClick: () => setRoute("logs"),
32264
+ className: "me-2"
32265
+ },
32266
+ "View Runtime Logs"
32267
+ ), /* @__PURE__ */ import_react58.default.createElement(
32268
+ Button_default2,
32269
+ {
32270
+ variant: "outline-light",
32271
+ onClick: () => navigate(`/projects/${projectName}#${runtime}`)
32272
+ },
32273
+ "View Build Logs"
32274
+ ))) : testData ? /* @__PURE__ */ import_react58.default.createElement("div", { className: "test-results" }, testData.givens.map((given, i) => /* @__PURE__ */ import_react58.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "Given: ", given.name), given.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "dropdown" }, /* @__PURE__ */ import_react58.default.createElement(
32275
+ "button",
32276
+ {
32277
+ className: "btn btn-sm btn-light dropdown-toggle",
32278
+ type: "button",
32279
+ "data-bs-toggle": "dropdown"
32280
+ },
32281
+ "Artifacts (",
32282
+ given.artifacts.length,
32283
+ ")"
32284
+ ), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" }, given.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32285
+ "a",
32286
+ {
32287
+ className: "dropdown-item",
32288
+ href: `/testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/${artifact}`,
32289
+ target: "_blank",
32290
+ rel: "noopener noreferrer"
32291
+ },
32292
+ artifact.split("/").pop()
32293
+ ))))))), /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "When:"), " ", when.name, when.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, when.error)), when.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32294
+ "a",
32295
+ {
32296
+ href: `/testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/${artifact}`,
32297
+ target: "_blank",
32298
+ className: "text-white",
32299
+ rel: "noopener noreferrer"
32300
+ },
32301
+ artifact.split("/").pop()
32302
+ )))))))), given.thens.map((then, k) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Then:"), " ", then.name, then.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, then.error)), then.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32303
+ "a",
32304
+ {
32305
+ href: `/testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/${artifact}`,
32306
+ target: "_blank",
32307
+ className: "text-white",
32308
+ rel: "noopener noreferrer"
32309
+ },
32310
+ artifact.split("/").pop()
32311
+ )))))))))))) : /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "warning" }, "No test results found")), /* @__PURE__ */ import_react58.default.createElement(Tab_default.Pane, { eventKey: "logs" }, logs === void 0 ? /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "danger" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "Logs file missing"), /* @__PURE__ */ import_react58.default.createElement("p", null, "The runtime logs file (logs.txt) was not found."), /* @__PURE__ */ import_react58.default.createElement("p", null, "This suggests the test may not have executed properly.")) : logs === "" ? /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "success" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "No runtime logs"), /* @__PURE__ */ import_react58.default.createElement("p", null, "The test executed successfully with no log output.")) : /* @__PURE__ */ import_react58.default.createElement("pre", { className: "bg-dark text-white p-3" }, logs)), /* @__PURE__ */ import_react58.default.createElement(Tab_default.Pane, { eventKey: "types" }, typeErrors ? /* @__PURE__ */ import_react58.default.createElement("pre", { className: "bg-dark text-white p-3" }, typeErrors) : /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "warning" }, "No type errors found")), /* @__PURE__ */ import_react58.default.createElement(Tab_default.Pane, { eventKey: "lint" }, lintErrors ? /* @__PURE__ */ import_react58.default.createElement("pre", { className: "bg-dark text-white p-3" }, lintErrors) : /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "warning" }, "No lint errors found")), /* @__PURE__ */ import_react58.default.createElement(Tab_default.Pane, { eventKey: "coverage" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "coverage-report" }, /* @__PURE__ */ import_react58.default.createElement(Alert_default, { variant: "info" }, "Coverage reports coming soon!"), /* @__PURE__ */ import_react58.default.createElement("div", { className: "coverage-stats" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "stat-card bg-success text-white" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "85%"), /* @__PURE__ */ import_react58.default.createElement("p", null, "Lines Covered")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "stat-card bg-warning text-dark" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "72%"), /* @__PURE__ */ import_react58.default.createElement("p", null, "Branches Covered")), /* @__PURE__ */ import_react58.default.createElement("div", { className: "stat-card bg-info text-white" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "91%"), /* @__PURE__ */ import_react58.default.createElement("p", null, "Functions Covered"))))))));
32312
+ };
32457
32313
 
32458
32314
  // src/utils/api.ts
32459
32315
  var fetchTestData = async (projectName, filepath, runTime) => {
@@ -32492,12 +32348,12 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32492
32348
  }
32493
32349
  };
32494
32350
 
32495
- // src/TestPage.tsx
32351
+ // src/components/stateful/TestPage.tsx
32496
32352
  var TestPage = () => {
32497
32353
  const navigate = useNavigate();
32498
32354
  const location = useLocation();
32499
- const [route, setRoute] = (0, import_react60.useState)("results");
32500
- (0, import_react60.useEffect)(() => {
32355
+ const [route, setRoute] = (0, import_react59.useState)("results");
32356
+ (0, import_react59.useEffect)(() => {
32501
32357
  const hash = location.hash.replace("#", "");
32502
32358
  if (hash && ["results", "logs", "types", "lint", "coverage"].includes(hash)) {
32503
32359
  setRoute(hash);
@@ -32505,26 +32361,26 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32505
32361
  setRoute("results");
32506
32362
  }
32507
32363
  }, [location.hash]);
32508
- const [testName2, setTestName] = (0, import_react60.useState)("");
32509
- const [testData, setTestData] = (0, import_react60.useState)(null);
32510
- const [logs, setLogs] = (0, import_react60.useState)("");
32511
- const [typeErrors, setTypeErrors] = (0, import_react60.useState)("");
32512
- const [lintErrors, setLintErrors] = (0, import_react60.useState)("");
32513
- const [loading, setLoading] = (0, import_react60.useState)(true);
32514
- const [error, setError] = (0, import_react60.useState)(null);
32515
- const [testsExist, setTestsExist] = (0, import_react60.useState)(true);
32516
- const [errorCounts, setErrorCounts] = (0, import_react60.useState)({
32364
+ const [testName2, setTestName] = (0, import_react59.useState)("");
32365
+ const [testData, setTestData] = (0, import_react59.useState)(null);
32366
+ const [logs, setLogs] = (0, import_react59.useState)("");
32367
+ const [typeErrors, setTypeErrors] = (0, import_react59.useState)("");
32368
+ const [lintErrors, setLintErrors] = (0, import_react59.useState)("");
32369
+ const [loading, setLoading] = (0, import_react59.useState)(true);
32370
+ const [error, setError] = (0, import_react59.useState)(null);
32371
+ const [testsExist, setTestsExist] = (0, import_react59.useState)(true);
32372
+ const [errorCounts, setErrorCounts] = (0, import_react59.useState)({
32517
32373
  typeErrors: 0,
32518
32374
  staticErrors: 0,
32519
32375
  runTimeErrors: 0
32520
32376
  });
32521
- const [summary, setSummary] = (0, import_react60.useState)(null);
32377
+ const [summary, setSummary] = (0, import_react59.useState)(null);
32522
32378
  const { projectName, "*": splat } = useParams();
32523
32379
  const pathParts = splat ? splat.split("/") : [];
32524
32380
  const runtime = pathParts.pop() || "";
32525
32381
  const testPath = pathParts.join("/");
32526
32382
  const decodedTestPath = testPath ? decodeURIComponent(testPath) : "";
32527
- (0, import_react60.useEffect)(() => {
32383
+ (0, import_react59.useEffect)(() => {
32528
32384
  if (!projectName || !testPath || !runtime)
32529
32385
  return;
32530
32386
  setTestName(testPath);
@@ -32542,26 +32398,15 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32542
32398
  throw new Error("Failed to fetch summary");
32543
32399
  const allSummaries = await summaryResponse.json();
32544
32400
  const testSummary = allSummaries[testPath];
32545
- console.log("testSummary", testSummary);
32546
32401
  if (testSummary) {
32547
- console.groupCollapsed(`[TestPage] Processing test summary for ${testPath}`);
32548
- console.log("Raw test summary:", testSummary);
32549
32402
  const counts = {
32550
32403
  typeErrors: Number(testSummary.typeErrors) || 0,
32551
32404
  staticErrors: Number(testSummary.staticErrors) || 0,
32552
32405
  runTimeErrors: Number(testSummary.runTimeErrors) || 0
32553
32406
  };
32554
- console.log("Normalized counts:", counts);
32555
- if (counts.runTimeErrors === -1 && testSummary.testsExist) {
32556
- console.warn("Inconsistent state: runTimeErrors=-1 but testsExist=true");
32557
- }
32558
- if (!testSummary.testsExist && counts.runTimeErrors > 0) {
32559
- console.warn("Inconsistent state: testsExist=false but runTimeErrors>0");
32560
- }
32561
32407
  setSummary(testSummary);
32562
32408
  setErrorCounts(counts);
32563
32409
  setTestsExist(testSummary.testsExist !== false);
32564
- console.groupEnd();
32565
32410
  }
32566
32411
  } catch (err) {
32567
32412
  console.error("Failed to load summary:", err);
@@ -32575,123 +32420,39 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32575
32420
  };
32576
32421
  fetchData();
32577
32422
  }, []);
32578
- if (loading)
32579
- return /* @__PURE__ */ import_react60.default.createElement("div", null, "Loading test data...");
32580
- if (error)
32581
- return /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "danger" }, "Error: ", error);
32582
- console.log("Test status debug:", {
32583
- testName: testName2,
32584
- testsExist,
32585
- testData,
32586
- fails: testData?.fails,
32587
- runTimeErrors: errorCounts.runTimeErrors,
32588
- typeErrors: errorCounts.typeErrors,
32589
- staticErrors: errorCounts.staticErrors
32590
- });
32591
- console.log("Test data:", {
32592
- testData,
32593
- testsExist,
32594
- errorCounts,
32595
- summary
32596
- });
32597
- return /* @__PURE__ */ import_react60.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react60.default.createElement(
32598
- NavBar,
32423
+ return /* @__PURE__ */ import_react59.default.createElement(
32424
+ TestPageView,
32599
32425
  {
32600
- title: decodedTestPath,
32601
- backLink: `/projects/${projectName}`,
32602
- navItems: [
32603
- {
32604
- label: "",
32605
- badge: {
32606
- variant: runtime === "node" ? "primary" : runtime === "web" ? "success" : "info",
32607
- text: runtime
32608
- },
32609
- className: "pe-none d-flex align-items-center gap-2"
32610
- },
32611
- {
32612
- to: `#results`,
32613
- label: /* @__PURE__ */ import_react60.default.createElement(
32614
- TestStatusBadge,
32615
- {
32616
- testName: decodedTestPath,
32617
- testsExist,
32618
- runTimeErrors: errorCounts.runTimeErrors,
32619
- variant: "compact"
32620
- }
32621
- ),
32622
- className: !testsExist || errorCounts.runTimeErrors > 0 ? "text-danger fw-bold" : "",
32623
- active: route === "results"
32624
- },
32625
- {
32626
- to: `#logs`,
32627
- label: `Runtime logs`,
32628
- active: route === "logs"
32629
- },
32630
- {
32631
- to: `#types`,
32632
- label: errorCounts.typeErrors > 0 ? `tsc (\u274C * ${errorCounts.typeErrors})` : "tsc \u2705 ",
32633
- active: route === "types"
32634
- },
32635
- {
32636
- to: `#lint`,
32637
- label: errorCounts.staticErrors > 0 ? `eslint (\u274C *${errorCounts.staticErrors}) ` : "eslint \u2705",
32638
- active: route === "lint"
32639
- }
32640
- ],
32641
- rightContent: /* @__PURE__ */ import_react60.default.createElement(
32642
- Button_default2,
32643
- {
32644
- variant: "info",
32645
- onClick: async () => {
32646
- try {
32647
- const promptPath = `testeranto/reports/${projectName}/${testPath.split(".").slice(0, -1).join(".")}/${runtime}/prompt.txt`;
32648
- const messagePath = `testeranto/reports/${projectName}/${testPath.split(".").slice(0, -1).join(".")}/${runtime}/message.txt`;
32649
- const command = `aider --load ${promptPath} --message-file ${messagePath}`;
32650
- await navigator.clipboard.writeText(command);
32651
- alert("Copied aider command to clipboard!");
32652
- } catch (err) {
32653
- alert("Failed to copy command to clipboard");
32654
- console.error("Copy failed:", err);
32655
- }
32656
- },
32657
- className: "ms-2"
32658
- },
32659
- "\u{1F916}"
32660
- )
32661
- }
32662
- ), /* @__PURE__ */ import_react60.default.createElement(Tab_default.Container, { activeKey: route, onSelect: (k) => {
32663
- if (k) {
32664
- setRoute(k);
32665
- navigate(`#${k}`, { replace: true });
32426
+ route,
32427
+ setRoute,
32428
+ navigate,
32429
+ projectName,
32430
+ testName: testName2,
32431
+ decodedTestPath,
32432
+ runtime,
32433
+ testData,
32434
+ logs,
32435
+ typeErrors,
32436
+ lintErrors,
32437
+ loading,
32438
+ error,
32439
+ testsExist,
32440
+ errorCounts,
32441
+ summary
32666
32442
  }
32667
- } }, /* @__PURE__ */ import_react60.default.createElement(Tab_default.Content, { className: "mt-3" }, /* @__PURE__ */ import_react60.default.createElement(Tab_default.Pane, { eventKey: "results" }, !testsExist ? /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "danger", className: "mt-3" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "Tests did not run to completion"), /* @__PURE__ */ import_react60.default.createElement("p", null, "The test results file (tests.json) was not found or could not be loaded."), /* @__PURE__ */ import_react60.default.createElement("div", { className: "mt-3" }, /* @__PURE__ */ import_react60.default.createElement(
32668
- Button_default2,
32669
- {
32670
- variant: "outline-light",
32671
- onClick: () => setRoute("logs"),
32672
- className: "me-2"
32673
- },
32674
- "View Runtime Logs"
32675
- ), /* @__PURE__ */ import_react60.default.createElement(
32676
- Button_default2,
32677
- {
32678
- variant: "outline-light",
32679
- onClick: () => navigate(`/projects/${projectName}#${runtime}`)
32680
- },
32681
- "View Build Logs"
32682
- ))) : testData ? /* @__PURE__ */ import_react60.default.createElement("div", { className: "test-results" }, /* @__PURE__ */ import_react60.default.createElement("div", { className: "mb-3" }), testData.givens.map((given, i) => /* @__PURE__ */ import_react60.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react60.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "Given: ", given.name)), /* @__PURE__ */ import_react60.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react60.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react60.default.createElement("strong", null, "When:"), " ", when.name, when.error && /* @__PURE__ */ import_react60.default.createElement("pre", { className: "mt-2" }, when.error))), given.thens.map((then, k) => /* @__PURE__ */ import_react60.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react60.default.createElement("strong", null, "Then:"), " ", then.name, then.error && /* @__PURE__ */ import_react60.default.createElement("pre", { className: "mt-2" }, then.error))))))) : /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "warning" }, "No test results found")), /* @__PURE__ */ import_react60.default.createElement(Tab_default.Pane, { eventKey: "logs" }, logs === void 0 ? /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "danger" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "Logs file missing"), /* @__PURE__ */ import_react60.default.createElement("p", null, "The runtime logs file (logs.txt) was not found."), /* @__PURE__ */ import_react60.default.createElement("p", null, "This suggests the test may not have executed properly.")) : logs === "" ? /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "success" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "No runtime logs"), /* @__PURE__ */ import_react60.default.createElement("p", null, "The test executed successfully with no log output.")) : /* @__PURE__ */ import_react60.default.createElement("pre", { className: "bg-dark text-white p-3" }, logs)), /* @__PURE__ */ import_react60.default.createElement(Tab_default.Pane, { eventKey: "types" }, typeErrors ? /* @__PURE__ */ import_react60.default.createElement("pre", { className: "bg-dark text-white p-3" }, typeErrors) : /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "warning" }, "No type errors found")), /* @__PURE__ */ import_react60.default.createElement(Tab_default.Pane, { eventKey: "lint" }, lintErrors ? /* @__PURE__ */ import_react60.default.createElement("pre", { className: "bg-dark text-white p-3" }, lintErrors) : /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "warning" }, "No lint errors found")), /* @__PURE__ */ import_react60.default.createElement(Tab_default.Pane, { eventKey: "coverage" }, /* @__PURE__ */ import_react60.default.createElement("div", { className: "coverage-report" }, /* @__PURE__ */ import_react60.default.createElement(Alert_default, { variant: "info" }, "Coverage reports coming soon!"), /* @__PURE__ */ import_react60.default.createElement("div", { className: "coverage-stats" }, /* @__PURE__ */ import_react60.default.createElement("div", { className: "stat-card bg-success text-white" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "85%"), /* @__PURE__ */ import_react60.default.createElement("p", null, "Lines Covered")), /* @__PURE__ */ import_react60.default.createElement("div", { className: "stat-card bg-warning text-dark" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "72%"), /* @__PURE__ */ import_react60.default.createElement("p", null, "Branches Covered")), /* @__PURE__ */ import_react60.default.createElement("div", { className: "stat-card bg-info text-white" }, /* @__PURE__ */ import_react60.default.createElement("h4", null, "91%"), /* @__PURE__ */ import_react60.default.createElement("p", null, "Functions Covered"))))))));
32443
+ );
32683
32444
  };
32684
32445
 
32685
32446
  // src/SettingsButton.tsx
32686
- var import_react62 = __toESM(require_react(), 1);
32447
+ var import_react61 = __toESM(require_react(), 1);
32687
32448
 
32688
32449
  // src/components/SunriseAnimation.tsx
32689
- var import_react61 = __toESM(require_react(), 1);
32450
+ var import_react60 = __toESM(require_react(), 1);
32690
32451
  var SunriseAnimation = ({ active }) => {
32691
- const [position, setPosition] = (0, import_react61.useState)(0);
32692
- const [dimensions, setDimensions] = (0, import_react61.useState)({ width: 0, height: 0 });
32693
- const animationIdRef = (0, import_react61.useRef)(null);
32694
- (0, import_react61.useEffect)(() => {
32452
+ const [position, setPosition] = (0, import_react60.useState)(0);
32453
+ const [dimensions, setDimensions] = (0, import_react60.useState)({ width: 0, height: 0 });
32454
+ const animationIdRef = (0, import_react60.useRef)(null);
32455
+ (0, import_react60.useEffect)(() => {
32695
32456
  setDimensions({
32696
32457
  width: window.innerWidth,
32697
32458
  height: window.innerHeight
@@ -32709,7 +32470,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32709
32470
  }, []);
32710
32471
  const ANIMATION_DURATION = 1e4;
32711
32472
  const UPDATE_INTERVAL = 50;
32712
- (0, import_react61.useEffect)(() => {
32473
+ (0, import_react60.useEffect)(() => {
32713
32474
  if (!active) {
32714
32475
  if (animationIdRef.current) {
32715
32476
  cancelAnimationFrame(animationIdRef.current);
@@ -32744,7 +32505,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32744
32505
  const normalizedPos = (position + 1) / 2;
32745
32506
  if (!active)
32746
32507
  return null;
32747
- return /* @__PURE__ */ import_react61.default.createElement("div", { id: "sunrise", style: {
32508
+ return /* @__PURE__ */ import_react60.default.createElement("div", { id: "sunrise", style: {
32748
32509
  width: "100vw",
32749
32510
  height: "100vh",
32750
32511
  position: "fixed",
@@ -32753,7 +32514,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32753
32514
  backgroundColor: "transparent",
32754
32515
  overflow: "hidden",
32755
32516
  pointerEvents: "none"
32756
- } }, /* @__PURE__ */ import_react61.default.createElement("div", { id: "daily-bg", style: {
32517
+ } }, /* @__PURE__ */ import_react60.default.createElement("div", { id: "daily-bg", style: {
32757
32518
  position: "absolute",
32758
32519
  top: 0,
32759
32520
  left: 0,
@@ -32761,7 +32522,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32761
32522
  height: "100%",
32762
32523
  backgroundColor: "rgba(0,0,0,0.3)",
32763
32524
  zIndex: -1001
32764
- } }), "Stars Container", /* @__PURE__ */ import_react61.default.createElement(
32525
+ } }), "Stars Container", /* @__PURE__ */ import_react60.default.createElement(
32765
32526
  "div",
32766
32527
  {
32767
32528
  id: "starsContainer",
@@ -32778,7 +32539,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32778
32539
  opacity: Math.max(0, 0.5 - normalizedPos * 0.5)
32779
32540
  }
32780
32541
  },
32781
- /* @__PURE__ */ import_react61.default.createElement(
32542
+ /* @__PURE__ */ import_react60.default.createElement(
32782
32543
  "div",
32783
32544
  {
32784
32545
  id: "stars",
@@ -32794,7 +32555,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32794
32555
  }
32795
32556
  }
32796
32557
  )
32797
- ), /* @__PURE__ */ import_react61.default.createElement(
32558
+ ), /* @__PURE__ */ import_react60.default.createElement(
32798
32559
  "div",
32799
32560
  {
32800
32561
  id: "sun",
@@ -32810,7 +32571,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32810
32571
  opacity: 0.5
32811
32572
  }
32812
32573
  }
32813
- ), /* @__PURE__ */ import_react61.default.createElement(
32574
+ ), /* @__PURE__ */ import_react60.default.createElement(
32814
32575
  "div",
32815
32576
  {
32816
32577
  id: "sunDay",
@@ -32825,7 +32586,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32825
32586
  opacity: Math.max(0, 1 - yPos / dimensions.height)
32826
32587
  }
32827
32588
  }
32828
- ), /* @__PURE__ */ import_react61.default.createElement(
32589
+ ), /* @__PURE__ */ import_react60.default.createElement(
32829
32590
  "div",
32830
32591
  {
32831
32592
  id: "sunSet",
@@ -32840,7 +32601,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32840
32601
  opacity: Math.max(0, yPos / dimensions.height - 0.2)
32841
32602
  }
32842
32603
  }
32843
- ), /* @__PURE__ */ import_react61.default.createElement(
32604
+ ), /* @__PURE__ */ import_react60.default.createElement(
32844
32605
  "div",
32845
32606
  {
32846
32607
  id: "sky",
@@ -32855,7 +32616,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32855
32616
  opacity: Math.max(0, 1 - yPos / dimensions.height)
32856
32617
  }
32857
32618
  }
32858
- ), /* @__PURE__ */ import_react61.default.createElement(
32619
+ ), /* @__PURE__ */ import_react60.default.createElement(
32859
32620
  "div",
32860
32621
  {
32861
32622
  id: "horizon",
@@ -32870,7 +32631,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32870
32631
  opacity: Math.max(0, yPos > dimensions.height / 2 ? (dimensions.height - yPos) / (dimensions.height / 2) + 0.2 : yPos / (dimensions.height / 2))
32871
32632
  }
32872
32633
  }
32873
- ), /* @__PURE__ */ import_react61.default.createElement(
32634
+ ), /* @__PURE__ */ import_react60.default.createElement(
32874
32635
  "div",
32875
32636
  {
32876
32637
  id: "horizonNight",
@@ -32885,7 +32646,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32885
32646
  opacity: Math.max(0, (yPos - dimensions.height * 4 / 5) / (dimensions.height - dimensions.height * 4 / 5))
32886
32647
  }
32887
32648
  }
32888
- ), /* @__PURE__ */ import_react61.default.createElement(
32649
+ ), /* @__PURE__ */ import_react60.default.createElement(
32889
32650
  "div",
32890
32651
  {
32891
32652
  id: "moon",
@@ -32900,7 +32661,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32900
32661
  opacity: Math.max(0, (yPos - dimensions.height * 9 / 10) / (dimensions.height - dimensions.height * 9 / 10))
32901
32662
  }
32902
32663
  }
32903
- ), /* @__PURE__ */ import_react61.default.createElement(
32664
+ ), /* @__PURE__ */ import_react60.default.createElement(
32904
32665
  "div",
32905
32666
  {
32906
32667
  id: "water",
@@ -32915,7 +32676,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32915
32676
  zIndex: -400
32916
32677
  }
32917
32678
  }
32918
- ), /* @__PURE__ */ import_react61.default.createElement(
32679
+ ), /* @__PURE__ */ import_react60.default.createElement(
32919
32680
  "div",
32920
32681
  {
32921
32682
  id: "waterReflectionContainer",
@@ -32932,7 +32693,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32932
32693
  transform: `translateY(${dimensions.height - yPos}px)`
32933
32694
  }
32934
32695
  },
32935
- /* @__PURE__ */ import_react61.default.createElement(
32696
+ /* @__PURE__ */ import_react60.default.createElement(
32936
32697
  "div",
32937
32698
  {
32938
32699
  id: "waterReflectionMiddle",
@@ -32949,7 +32710,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32949
32710
  }
32950
32711
  }
32951
32712
  )
32952
- ), /* @__PURE__ */ import_react61.default.createElement(
32713
+ ), /* @__PURE__ */ import_react60.default.createElement(
32953
32714
  "div",
32954
32715
  {
32955
32716
  id: "waterDistance",
@@ -32964,7 +32725,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32964
32725
  opacity: Math.max(0, yPos / dimensions.height + 0.6)
32965
32726
  }
32966
32727
  }
32967
- ), /* @__PURE__ */ import_react61.default.createElement(
32728
+ ), /* @__PURE__ */ import_react60.default.createElement(
32968
32729
  "div",
32969
32730
  {
32970
32731
  id: "darknessOverlaySky",
@@ -32979,7 +32740,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32979
32740
  zIndex: -50
32980
32741
  }
32981
32742
  }
32982
- ), /* @__PURE__ */ import_react61.default.createElement(
32743
+ ), /* @__PURE__ */ import_react60.default.createElement(
32983
32744
  "div",
32984
32745
  {
32985
32746
  id: "darknessOverlay",
@@ -32994,7 +32755,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32994
32755
  zIndex: -5
32995
32756
  }
32996
32757
  }
32997
- ), /* @__PURE__ */ import_react61.default.createElement(
32758
+ ), /* @__PURE__ */ import_react60.default.createElement(
32998
32759
  "div",
32999
32760
  {
33000
32761
  id: "oceanRipple",
@@ -33015,12 +32776,12 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33015
32776
 
33016
32777
  // src/SettingsButton.tsx
33017
32778
  var SettingsButton = ({ className }) => {
33018
- (0, import_react62.useEffect)(() => {
32779
+ (0, import_react61.useEffect)(() => {
33019
32780
  return () => {
33020
32781
  };
33021
32782
  }, []);
33022
- const [showModal, setShowModal] = (0, import_react62.useState)(false);
33023
- const [theme, setTheme] = (0, import_react62.useState)(localStorage.getItem("theme") || "system");
32783
+ const [showModal, setShowModal] = (0, import_react61.useState)(false);
32784
+ const [theme, setTheme] = (0, import_react61.useState)(localStorage.getItem("theme") || "system");
33024
32785
  const handleThemeChange = (e) => {
33025
32786
  const newTheme = e.target.value;
33026
32787
  setTheme(newTheme);
@@ -33031,14 +32792,14 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33031
32792
  }
33032
32793
  document.documentElement.setAttribute("data-bs-theme", themeToApply);
33033
32794
  };
33034
- return /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, /* @__PURE__ */ import_react62.default.createElement("div", { id: "settings-button" }, /* @__PURE__ */ import_react62.default.createElement(
32795
+ return /* @__PURE__ */ import_react61.default.createElement(import_react61.default.Fragment, null, /* @__PURE__ */ import_react61.default.createElement("div", { id: "settings-button" }, /* @__PURE__ */ import_react61.default.createElement(
33035
32796
  "button",
33036
32797
  {
33037
32798
  className: `btn btn-sm btn-outline-secondary ${className}`,
33038
32799
  onClick: () => setShowModal(true)
33039
32800
  },
33040
- /* @__PURE__ */ import_react62.default.createElement("div", { id: "gear-icon-settings" }, "\u2699\uFE0F")
33041
- )), /* @__PURE__ */ import_react62.default.createElement(SunriseAnimation_default, { active: theme === "daily" }), /* @__PURE__ */ import_react62.default.createElement(Modal_default2, { show: showModal, onHide: () => setShowModal(false), size: "lg" }, /* @__PURE__ */ import_react62.default.createElement(Modal_default2.Header, { closeButton: true, className: "border-0" }, /* @__PURE__ */ import_react62.default.createElement(Modal_default2.Title, { className: "d-flex align-items-center" }, /* @__PURE__ */ import_react62.default.createElement("i", { className: "bi bi-palette-fill me-2" }), /* @__PURE__ */ import_react62.default.createElement("span", null, "Settings"))), /* @__PURE__ */ import_react62.default.createElement("div", { className: "alert alert-warning mx-3 mt-2 mb-0" }, /* @__PURE__ */ import_react62.default.createElement("i", { className: "bi bi-exclamation-triangle-fill me-2" }), /* @__PURE__ */ import_react62.default.createElement("strong", null, "Warning:"), ' Themes are an experimental feature. Only "Business casual" is fully supported at this time.'), /* @__PURE__ */ import_react62.default.createElement(Modal_default2.Body, { className: "p-0" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "p-3" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "row g-3" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32801
+ /* @__PURE__ */ import_react61.default.createElement("div", { id: "gear-icon-settings" }, "\u2699\uFE0F")
32802
+ )), /* @__PURE__ */ import_react61.default.createElement(SunriseAnimation_default, { active: theme === "daily" }), /* @__PURE__ */ import_react61.default.createElement(Modal_default2, { show: showModal, onHide: () => setShowModal(false), size: "lg" }, /* @__PURE__ */ import_react61.default.createElement(Modal_default2.Header, { closeButton: true, className: "border-0" }, /* @__PURE__ */ import_react61.default.createElement(Modal_default2.Title, { className: "d-flex align-items-center" }, /* @__PURE__ */ import_react61.default.createElement("i", { className: "bi bi-palette-fill me-2" }), /* @__PURE__ */ import_react61.default.createElement("span", null, "Settings"))), /* @__PURE__ */ import_react61.default.createElement("div", { className: "alert alert-warning mx-3 mt-2 mb-0" }, /* @__PURE__ */ import_react61.default.createElement("i", { className: "bi bi-exclamation-triangle-fill me-2" }), /* @__PURE__ */ import_react61.default.createElement("strong", null, "Warning:"), ' Themes are an experimental feature. Only "Business casual" is fully supported at this time.'), /* @__PURE__ */ import_react61.default.createElement(Modal_default2.Body, { className: "p-0" }, /* @__PURE__ */ import_react61.default.createElement("div", { className: "p-3" }, /* @__PURE__ */ import_react61.default.createElement("div", { className: "row g-3" }, /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33042
32803
  "div",
33043
32804
  {
33044
32805
  className: `card theme-card ${theme === "system" ? "border-primary" : ""}`,
@@ -33048,8 +32809,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33048
32809
  borderColor: "#adb5bd"
33049
32810
  }
33050
32811
  },
33051
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-0" }, "9 to 5"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Follows your OS theme"))
33052
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32812
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-0" }, "9 to 5"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Follows your OS theme"))
32813
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33053
32814
  "div",
33054
32815
  {
33055
32816
  className: `card theme-card ${theme === "light" ? "border-primary" : ""}`,
@@ -33061,8 +32822,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33061
32822
  borderWidth: "2px"
33062
32823
  }
33063
32824
  },
33064
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Business casual"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Clean & professional"))
33065
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32825
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Business casual"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Clean & professional"))
32826
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33066
32827
  "div",
33067
32828
  {
33068
32829
  className: `card theme-card ${theme === "dark" ? "border-primary" : ""}`,
@@ -33074,8 +32835,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33074
32835
  borderWidth: "2px"
33075
32836
  }
33076
32837
  },
33077
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Business formal"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Premium & focused"))
33078
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32838
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Business formal"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Premium & focused"))
32839
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33079
32840
  "div",
33080
32841
  {
33081
32842
  className: `card theme-card ${theme === "light-vibrant" ? "border-primary" : ""}`,
@@ -33086,8 +32847,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33086
32847
  color: "#fff"
33087
32848
  }
33088
32849
  },
33089
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Office Party"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Colorful & fun"))
33090
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32850
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Office Party"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Colorful & fun"))
32851
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33091
32852
  "div",
33092
32853
  {
33093
32854
  className: `card theme-card ${theme === "dark-vibrant" ? "border-primary" : ""}`,
@@ -33098,8 +32859,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33098
32859
  color: "#fff"
33099
32860
  }
33100
32861
  },
33101
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "After Party"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Neon nightlife"))
33102
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32862
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "After Party"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Neon nightlife"))
32863
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33103
32864
  "div",
33104
32865
  {
33105
32866
  className: `card theme-card ${theme === "sepia" ? "border-primary" : ""}`,
@@ -33110,8 +32871,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33110
32871
  color: "#3a3226"
33111
32872
  }
33112
32873
  },
33113
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "WFH"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Vintage warmth"))
33114
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32874
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "WFH"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Vintage warmth"))
32875
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33115
32876
  "div",
33116
32877
  {
33117
32878
  className: `card theme-card ${theme === "light-grayscale" ? "border-primary" : ""}`,
@@ -33123,8 +32884,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33123
32884
  borderWidth: "2px"
33124
32885
  }
33125
32886
  },
33126
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Serious Business"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Simple & distraction-free"))
33127
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32887
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Serious Business"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Simple & distraction-free"))
32888
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33128
32889
  "div",
33129
32890
  {
33130
32891
  className: `card theme-card ${theme === "dark-grayscale" ? "border-primary" : ""}`,
@@ -33136,8 +32897,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33136
32897
  borderWidth: "2px"
33137
32898
  }
33138
32899
  },
33139
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Very Serious business"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Maximum readability"))
33140
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32900
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Very Serious business"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Maximum readability"))
32901
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33141
32902
  "div",
33142
32903
  {
33143
32904
  className: `card theme-card ${theme === "daily" ? "border-primary" : ""}`,
@@ -33148,8 +32909,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33148
32909
  color: "#00192d"
33149
32910
  }
33150
32911
  },
33151
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-1" }, "Dreaming of PTO"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Sunrise, sunset"))
33152
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32912
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-1" }, "Dreaming of PTO"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Sunrise, sunset"))
32913
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33153
32914
  "div",
33154
32915
  {
33155
32916
  className: `card theme-card ${theme === "protanopia" ? "border-primary" : ""}`,
@@ -33160,8 +32921,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33160
32921
  color: "#333"
33161
32922
  }
33162
32923
  },
33163
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-0" }, "Protanopia"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Red-blind mode"))
33164
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32924
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-0" }, "Protanopia"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Red-blind mode"))
32925
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33165
32926
  "div",
33166
32927
  {
33167
32928
  className: `card theme-card ${theme === "deuteranopia" ? "border-primary" : ""}`,
@@ -33172,8 +32933,8 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33172
32933
  color: "#333"
33173
32934
  }
33174
32935
  },
33175
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-0" }, "Deuteranopia"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Green-blind mode"))
33176
- )), /* @__PURE__ */ import_react62.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react62.default.createElement(
32936
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-0" }, "Deuteranopia"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Green-blind mode"))
32937
+ )), /* @__PURE__ */ import_react61.default.createElement("div", { className: "col-md-4" }, /* @__PURE__ */ import_react61.default.createElement(
33177
32938
  "div",
33178
32939
  {
33179
32940
  className: `card theme-card ${theme === "tritanopia" ? "border-primary" : ""}`,
@@ -33184,23 +32945,311 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
33184
32945
  color: "#333"
33185
32946
  }
33186
32947
  },
33187
- /* @__PURE__ */ import_react62.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react62.default.createElement("h5", { className: "card-title mb-0" }, "Tritanopia"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "small text-muted mb-0" }, "Blue-blind mode"))
33188
- ))))), /* @__PURE__ */ import_react62.default.createElement(Modal_default2.Footer, { className: "border-0" }, /* @__PURE__ */ import_react62.default.createElement(Button_default2, { variant: "btn-primary", onClick: () => setShowModal(false) }, "Done"))));
32948
+ /* @__PURE__ */ import_react61.default.createElement("div", { className: "card-body text-center p-3" }, /* @__PURE__ */ import_react61.default.createElement("h5", { className: "card-title mb-0" }, "Tritanopia"), /* @__PURE__ */ import_react61.default.createElement("p", { className: "small text-muted mb-0" }, "Blue-blind mode"))
32949
+ ))))), /* @__PURE__ */ import_react61.default.createElement(Modal_default2.Footer, { className: "border-0" }, /* @__PURE__ */ import_react61.default.createElement(Button_default2, { variant: "btn-primary", onClick: () => setShowModal(false) }, "Done"))));
33189
32950
  };
33190
32951
 
33191
- // src/App.tsx
33192
- var App = () => {
33193
- return /* @__PURE__ */ import_react63.default.createElement(HashRouter, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "d-flex flex-column min-vh-100", key: window.location.pathname }, /* @__PURE__ */ import_react63.default.createElement("main", { className: "flex-grow-1 p-3" }, /* @__PURE__ */ import_react63.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react63.default.createElement(Routes, null, /* @__PURE__ */ import_react63.default.createElement(Route, { path: "/", element: /* @__PURE__ */ import_react63.default.createElement(ProjectsPage, null) }), /* @__PURE__ */ import_react63.default.createElement(Route, { path: "/projects/:projectName", element: /* @__PURE__ */ import_react63.default.createElement(ProjectPage, null) }), /* @__PURE__ */ import_react63.default.createElement(
33194
- Route,
32952
+ // src/components/stateful/ProjectPage.tsx
32953
+ var import_react63 = __toESM(require_react(), 1);
32954
+
32955
+ // src/components/pure/ProjectPageView.tsx
32956
+ var import_react62 = __toESM(require_react(), 1);
32957
+ var BuildLogViewer = ({ logs, runtime }) => {
32958
+ if (!logs)
32959
+ return /* @__PURE__ */ import_react62.default.createElement(Alert_default, { variant: "info" }, "Loading ", runtime.toLowerCase(), " build logs...");
32960
+ const hasErrors = logs.errors?.length > 0;
32961
+ const hasWarnings = logs.warnings?.length > 0;
32962
+ const [activeTab, setActiveTab] = import_react62.default.useState("summary");
32963
+ return /* @__PURE__ */ import_react62.default.createElement("div", null, /* @__PURE__ */ import_react62.default.createElement(Tab_default.Container, { activeKey: activeTab, onSelect: (k) => setActiveTab(k || "summary") }, /* @__PURE__ */ import_react62.default.createElement(Nav_default2, { variant: "tabs", className: "mb-3" }, /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Link, { eventKey: "summary" }, "Build Summary")), /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Link, { eventKey: "warnings" }, hasWarnings ? `\u26A0\uFE0F Warnings (${logs.warnings.length})` : "Warnings")), /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Item, null, /* @__PURE__ */ import_react62.default.createElement(Nav_default2.Link, { eventKey: "errors" }, hasErrors ? `\u274C Errors (${logs.errors.length})` : "Errors"))), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Content, null, /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "summary" }, /* @__PURE__ */ import_react62.default.createElement(Card_default, null, /* @__PURE__ */ import_react62.default.createElement(Card_default.Header, { className: "d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react62.default.createElement("h5", null, "Build Summary"), /* @__PURE__ */ import_react62.default.createElement("div", null, hasErrors && /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "danger", className: "me-2" }, logs.errors.length, " Error", logs.errors.length !== 1 ? "s" : ""), hasWarnings && /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "warning", text: "dark" }, logs.warnings.length, " Warning", logs.warnings.length !== 1 ? "s" : ""), !hasErrors && !hasWarnings && /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "success" }, "Build Successful"))), /* @__PURE__ */ import_react62.default.createElement(Card_default.Body, null, /* @__PURE__ */ import_react62.default.createElement("div", { className: "mb-3" }, /* @__PURE__ */ import_react62.default.createElement("h6", null, "Input Files (", Object.keys(logs.metafile?.inputs || {}).length, ")"), /* @__PURE__ */ import_react62.default.createElement(ListGroup_default, { className: "max-h-200 overflow-auto" }, Object.keys(logs.metafile?.inputs || {}).map((file) => /* @__PURE__ */ import_react62.default.createElement(ListGroup_default.Item, { key: file, className: "py-2" }, /* @__PURE__ */ import_react62.default.createElement("code", null, file), /* @__PURE__ */ import_react62.default.createElement("div", { className: "text-muted small" }, logs.metafile.inputs[file].bytes, " bytes"))))), /* @__PURE__ */ import_react62.default.createElement("div", null, /* @__PURE__ */ import_react62.default.createElement("h6", null, "Output Files (", Object.keys(logs.metafile?.outputs || {}).length, ")"), /* @__PURE__ */ import_react62.default.createElement(ListGroup_default, { className: "max-h-200 overflow-auto" }, Object.keys(logs.metafile?.outputs || {}).map((file) => /* @__PURE__ */ import_react62.default.createElement(ListGroup_default.Item, { key: file, className: "py-2" }, /* @__PURE__ */ import_react62.default.createElement("code", null, file), /* @__PURE__ */ import_react62.default.createElement("div", { className: "text-muted small" }, logs.metafile.outputs[file].bytes, " bytes", logs.metafile.outputs[file].entryPoint && /* @__PURE__ */ import_react62.default.createElement("span", { className: "ms-2 badge bg-info" }, "Entry Point"))))))))), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "warnings" }, hasWarnings ? /* @__PURE__ */ import_react62.default.createElement(Card_default, { className: "border-warning" }, /* @__PURE__ */ import_react62.default.createElement(Card_default.Header, { className: "bg-warning text-white d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react62.default.createElement("span", null, "Build Warnings (", logs.warnings.length, ")"), /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "light", text: "dark" }, (/* @__PURE__ */ new Date()).toLocaleString())), /* @__PURE__ */ import_react62.default.createElement(Card_default.Body, { className: "p-0" }, /* @__PURE__ */ import_react62.default.createElement(ListGroup_default, { variant: "flush" }, logs.warnings.map((warn, i) => /* @__PURE__ */ import_react62.default.createElement(ListGroup_default.Item, { key: i, className: "text-warning" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "d-flex justify-content-between" }, /* @__PURE__ */ import_react62.default.createElement("strong", null, warn.location?.file || "Unknown file", warn.location?.line && `:${warn.location.line}`), /* @__PURE__ */ import_react62.default.createElement("small", { className: "text-muted" }, warn.pluginName ? `[${warn.pluginName}]` : "")), /* @__PURE__ */ import_react62.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react62.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, warn.text || warn.message || JSON.stringify(warn))), warn.detail && /* @__PURE__ */ import_react62.default.createElement("div", { className: "mt-1 small text-muted" }, /* @__PURE__ */ import_react62.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, warn.detail))))))) : /* @__PURE__ */ import_react62.default.createElement(Alert_default, { variant: "info" }, "No warnings found")), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "errors" }, hasErrors ? /* @__PURE__ */ import_react62.default.createElement(Card_default, { className: "border-danger" }, /* @__PURE__ */ import_react62.default.createElement(Card_default.Header, { className: "bg-danger text-white d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react62.default.createElement("span", null, "Build Errors (", logs.errors.length, ")"), /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "light", text: "dark" }, (/* @__PURE__ */ new Date()).toLocaleString())), /* @__PURE__ */ import_react62.default.createElement(Card_default.Body, { className: "p-0" }, /* @__PURE__ */ import_react62.default.createElement(ListGroup_default, { variant: "flush" }, logs.errors.map((err, i) => /* @__PURE__ */ import_react62.default.createElement(ListGroup_default.Item, { key: i, className: "text-danger" }, /* @__PURE__ */ import_react62.default.createElement("div", { className: "d-flex justify-content-between" }, /* @__PURE__ */ import_react62.default.createElement("strong", null, err.location?.file || "Unknown file", err.location?.line && `:${err.location.line}`), /* @__PURE__ */ import_react62.default.createElement("small", { className: "text-muted" }, err.pluginName ? `[${err.pluginName}]` : "")), /* @__PURE__ */ import_react62.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react62.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, err.text || err.message || JSON.stringify(err))), err.detail && /* @__PURE__ */ import_react62.default.createElement("div", { className: "mt-1 small text-muted" }, /* @__PURE__ */ import_react62.default.createElement("pre", { className: "mb-0 p-2 bg-light rounded" }, err.detail))))))) : /* @__PURE__ */ import_react62.default.createElement(Alert_default, { variant: "success" }, /* @__PURE__ */ import_react62.default.createElement("h5", null, "No Errors Found"), /* @__PURE__ */ import_react62.default.createElement("p", { className: "mb-0" }, "The build completed without any errors."))))));
32964
+ };
32965
+ var ProjectPageView = ({
32966
+ summary,
32967
+ nodeLogs,
32968
+ webLogs,
32969
+ pureLogs,
32970
+ config,
32971
+ loading,
32972
+ error,
32973
+ projectName,
32974
+ route,
32975
+ setRoute,
32976
+ navigate
32977
+ }) => {
32978
+ if (loading)
32979
+ return /* @__PURE__ */ import_react62.default.createElement("div", null, "Loading project data...");
32980
+ if (error)
32981
+ return /* @__PURE__ */ import_react62.default.createElement(Alert_default, { variant: "danger" }, "Error: ", error);
32982
+ if (!summary)
32983
+ return /* @__PURE__ */ import_react62.default.createElement(Alert_default, { variant: "warning" }, "No data found for project");
32984
+ const testStatuses = Object.entries(summary).map(([testName2, testData]) => {
32985
+ const runTime = config.tests?.find((t) => t[0] === testName2)?.[1] || "node";
32986
+ return {
32987
+ testName: testName2,
32988
+ testsExist: testData.testsExist !== false,
32989
+ runTimeErrors: Number(testData.runTimeErrors) || 0,
32990
+ typeErrors: Number(testData.typeErrors) || 0,
32991
+ staticErrors: Number(testData.staticErrors) || 0,
32992
+ runTime
32993
+ };
32994
+ });
32995
+ return /* @__PURE__ */ import_react62.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react62.default.createElement(
32996
+ NavBar,
33195
32997
  {
33196
- path: "/projects/:projectName/tests/*",
33197
- element: /* @__PURE__ */ import_react63.default.createElement(TestPage, null)
32998
+ title: projectName,
32999
+ backLink: "/",
33000
+ navItems: [
33001
+ {
33002
+ to: `#tests`,
33003
+ label: testStatuses.some((t) => t.runTimeErrors > 0) ? "\u274C Tests" : testStatuses.some((t) => t.typeErrors > 0 || t.staticErrors > 0) ? "\u26A0\uFE0F Tests" : "\u2705 Tests",
33004
+ active: route === "tests",
33005
+ className: testStatuses.some((t) => t.runTimeErrors > 0) ? "text-danger fw-bold" : testStatuses.some((t) => t.typeErrors > 0 || t.staticErrors > 0) ? "text-warning fw-bold" : ""
33006
+ },
33007
+ {
33008
+ to: `#node`,
33009
+ label: nodeLogs?.errors?.length ? "\u274C Node Build" : nodeLogs?.warnings?.length ? "\u26A0\uFE0F Node Build" : "Node Build",
33010
+ active: route === "node",
33011
+ className: nodeLogs?.errors?.length ? "text-danger fw-bold" : nodeLogs?.warnings?.length ? "text-warning fw-bold" : ""
33012
+ },
33013
+ {
33014
+ to: `#web`,
33015
+ label: webLogs?.errors?.length ? "\u274C Web Build" : webLogs?.warnings?.length ? "\u26A0\uFE0F Web Build" : "Web Build",
33016
+ active: route === "web",
33017
+ className: webLogs?.errors?.length ? "text-danger fw-bold" : webLogs?.warnings?.length ? "text-warning fw-bold" : ""
33018
+ },
33019
+ {
33020
+ to: `#pure`,
33021
+ label: pureLogs?.errors?.length ? "\u274C Pure Build" : pureLogs?.warnings?.length ? "\u26A0\uFE0F Pure Build" : "Pure Build",
33022
+ active: route === "pure",
33023
+ className: pureLogs?.errors?.length ? "text-danger fw-bold" : pureLogs?.warnings?.length ? "text-warning fw-bold" : ""
33024
+ }
33025
+ ]
33026
+ }
33027
+ ), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Container, { activeKey: route, onSelect: (k) => {
33028
+ if (k) {
33029
+ setRoute(k);
33030
+ navigate(`#${k}`, { replace: true });
33198
33031
  }
33199
- ), /* @__PURE__ */ import_react63.default.createElement(Route, { path: "/projects/:projectName#:tab", element: /* @__PURE__ */ import_react63.default.createElement(ProjectPage, null) })))), /* @__PURE__ */ import_react63.default.createElement("footer", { className: "bg-light py-3 d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react63.default.createElement(SettingsButton, null)), /* @__PURE__ */ import_react63.default.createElement(Container_default, { className: "text-end", fluid: true }, "made with \u2764\uFE0F and ", /* @__PURE__ */ import_react63.default.createElement("a", { href: "https://www.npmjs.com/package/testeranto" }, "testeranto")))));
33032
+ } }, /* @__PURE__ */ import_react62.default.createElement(Tab_default.Content, null, /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "tests" }, /* @__PURE__ */ import_react62.default.createElement(Table_default, { striped: true, bordered: true, hover: true }, /* @__PURE__ */ import_react62.default.createElement("thead", null, /* @__PURE__ */ import_react62.default.createElement("tr", null, /* @__PURE__ */ import_react62.default.createElement("th", null, "Test"), /* @__PURE__ */ import_react62.default.createElement("th", null, "Runtime"), /* @__PURE__ */ import_react62.default.createElement("th", null, "Status"), /* @__PURE__ */ import_react62.default.createElement("th", null, "Type Errors"), /* @__PURE__ */ import_react62.default.createElement("th", null, "Lint Errors"))), /* @__PURE__ */ import_react62.default.createElement("tbody", null, testStatuses.map((test) => /* @__PURE__ */ import_react62.default.createElement("tr", { key: test.testName }, /* @__PURE__ */ import_react62.default.createElement("td", null, /* @__PURE__ */ import_react62.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${test.runTime}` }, test.testName)), /* @__PURE__ */ import_react62.default.createElement("td", null, /* @__PURE__ */ import_react62.default.createElement(Badge_default, { bg: "secondary", className: "ms-2" }, test.runTime)), /* @__PURE__ */ import_react62.default.createElement("td", null, /* @__PURE__ */ import_react62.default.createElement(
33033
+ TestStatusBadge,
33034
+ {
33035
+ testName: test.testName,
33036
+ testsExist: test.testsExist,
33037
+ runTimeErrors: test.runTimeErrors
33038
+ }
33039
+ )), /* @__PURE__ */ import_react62.default.createElement("td", null, /* @__PURE__ */ import_react62.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${test.runTime}#types` }, test.typeErrors > 0 ? `\u274C ${test.typeErrors}` : "\u2705")), /* @__PURE__ */ import_react62.default.createElement("td", null, /* @__PURE__ */ import_react62.default.createElement("a", { href: `#/projects/${projectName}/tests/${encodeURIComponent(test.testName)}/${test.runTime}#lint` }, test.staticErrors > 0 ? `\u274C ${test.staticErrors}` : "\u2705"))))))), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "node" }, /* @__PURE__ */ import_react62.default.createElement(BuildLogViewer, { logs: nodeLogs, runtime: "Node" })), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "web" }, /* @__PURE__ */ import_react62.default.createElement(BuildLogViewer, { logs: webLogs, runtime: "Web" })), /* @__PURE__ */ import_react62.default.createElement(Tab_default.Pane, { eventKey: "pure" }, /* @__PURE__ */ import_react62.default.createElement(BuildLogViewer, { logs: pureLogs, runtime: "Pure" })))));
33040
+ };
33041
+
33042
+ // src/components/stateful/ProjectPage.tsx
33043
+ var ProjectPage = () => {
33044
+ const [summary, setSummary] = (0, import_react63.useState)(null);
33045
+ const [nodeLogs, setNodeLogs] = (0, import_react63.useState)(null);
33046
+ const [webLogs, setWebLogs] = (0, import_react63.useState)(null);
33047
+ const [pureLogs, setPureLogs] = (0, import_react63.useState)(null);
33048
+ const [config, setConfig] = (0, import_react63.useState)({});
33049
+ const [loading, setLoading] = (0, import_react63.useState)(true);
33050
+ const [error, setError] = (0, import_react63.useState)(null);
33051
+ const [projectName, setProjectName] = (0, import_react63.useState)("");
33052
+ const navigate = useNavigate();
33053
+ const location = useLocation();
33054
+ const [route, setRoute] = (0, import_react63.useState)("tests");
33055
+ (0, import_react63.useEffect)(() => {
33056
+ const hash = location.hash.replace("#", "");
33057
+ if (hash && ["tests", "node", "web", "pure"].includes(hash)) {
33058
+ setRoute(hash);
33059
+ } else {
33060
+ setRoute("tests");
33061
+ }
33062
+ }, [location.hash]);
33063
+ const { projectName: name } = useParams();
33064
+ (0, import_react63.useEffect)(() => {
33065
+ if (!name)
33066
+ return;
33067
+ setProjectName(name);
33068
+ const fetchData = async () => {
33069
+ try {
33070
+ const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
33071
+ fetch(`reports/${name}/summary.json`),
33072
+ fetch(`bundles/node/${name}/metafile.json`),
33073
+ fetch(`bundles/web/${name}/metafile.json`),
33074
+ fetch(`bundles/pure/${name}/metafile.json`),
33075
+ fetch(`reports/${name}/config.json`)
33076
+ ]);
33077
+ const [summaryData, nodeData, webData, pureData, configData] = await Promise.all([
33078
+ summaryRes.ok ? summaryRes.json() : {},
33079
+ nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
33080
+ webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
33081
+ pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
33082
+ configRes.ok ? configRes.json() : { tests: [] }
33083
+ ]);
33084
+ setSummary(summaryData);
33085
+ setNodeLogs(nodeData);
33086
+ setWebLogs(webData);
33087
+ setPureLogs(pureData);
33088
+ setConfig(configData);
33089
+ } catch (err) {
33090
+ setError(err instanceof Error ? err.message : "Unknown error");
33091
+ } finally {
33092
+ setLoading(false);
33093
+ }
33094
+ };
33095
+ fetchData();
33096
+ }, [name]);
33097
+ return /* @__PURE__ */ import_react63.default.createElement(
33098
+ ProjectPageView,
33099
+ {
33100
+ summary,
33101
+ nodeLogs,
33102
+ webLogs,
33103
+ pureLogs,
33104
+ config,
33105
+ loading,
33106
+ error,
33107
+ projectName,
33108
+ route,
33109
+ setRoute,
33110
+ navigate
33111
+ }
33112
+ );
33113
+ };
33114
+
33115
+ // src/components/stateful/ProjectsPage.tsx
33116
+ var import_react65 = __toESM(require_react(), 1);
33117
+
33118
+ // src/components/pure/ProjectsPageView.tsx
33119
+ var import_react64 = __toESM(require_react(), 1);
33120
+ var ProjectsPageView = ({
33121
+ projects,
33122
+ summaries,
33123
+ configs,
33124
+ loading,
33125
+ error,
33126
+ navigate
33127
+ }) => {
33128
+ const getStatusIcon = (status) => {
33129
+ switch (status) {
33130
+ case "success":
33131
+ return "\u2705";
33132
+ case "failed":
33133
+ return "\u274C";
33134
+ case "warning":
33135
+ return "\u26A0\uFE0F";
33136
+ default:
33137
+ return "\u2753";
33138
+ }
33139
+ };
33140
+ if (loading)
33141
+ return /* @__PURE__ */ import_react64.default.createElement("div", null, "Loading projects...");
33142
+ if (error)
33143
+ return /* @__PURE__ */ import_react64.default.createElement(Alert_default, { variant: "danger" }, "Error: ", error);
33144
+ return /* @__PURE__ */ import_react64.default.createElement("div", { className: "p-3" }, /* @__PURE__ */ import_react64.default.createElement(NavBar, { title: "Testeranto", backLink: null }), /* @__PURE__ */ import_react64.default.createElement(Table_default, { striped: true, bordered: true, hover: true, responsive: true }, /* @__PURE__ */ import_react64.default.createElement("thead", null, /* @__PURE__ */ import_react64.default.createElement("tr", null, /* @__PURE__ */ import_react64.default.createElement("th", null, "Project"), /* @__PURE__ */ import_react64.default.createElement("th", null, "Tests"), /* @__PURE__ */ import_react64.default.createElement("th", null, "Node"), /* @__PURE__ */ import_react64.default.createElement("th", null, "Web"), /* @__PURE__ */ import_react64.default.createElement("th", null, "Pure"))), /* @__PURE__ */ import_react64.default.createElement("tbody", null, projects.map((project) => /* @__PURE__ */ import_react64.default.createElement("tr", { key: project.name }, /* @__PURE__ */ import_react64.default.createElement("td", null, /* @__PURE__ */ import_react64.default.createElement("a", { href: "#", onClick: (e) => {
33145
+ e.preventDefault();
33146
+ navigate(`/projects/${project.name}`);
33147
+ } }, project.name)), /* @__PURE__ */ import_react64.default.createElement("td", null, /* @__PURE__ */ import_react64.default.createElement("div", { style: { maxHeight: "200px", overflowY: "auto" } }, summaries[project.name] ? Object.keys(summaries[project.name]).map((testName2) => {
33148
+ const testData = summaries[project.name][testName2];
33149
+ const runTime = configs[project.name].tests.find((t) => t[0] === testName2)[1];
33150
+ const hasRuntimeErrors = testData.runTimeErrors > 0;
33151
+ const hasStaticErrors = testData.typeErrors > 0 || testData.staticErrors > 0;
33152
+ return /* @__PURE__ */ import_react64.default.createElement("div", { key: testName2 }, /* @__PURE__ */ import_react64.default.createElement(
33153
+ "a",
33154
+ {
33155
+ href: `#/projects/${project.name}/tests/${encodeURIComponent(testName2)}/${runTime}`
33156
+ },
33157
+ hasRuntimeErrors ? "\u274C " : hasStaticErrors ? "\u26A0\uFE0F " : "",
33158
+ testName2.split("/").pop()
33159
+ ));
33160
+ }) : /* @__PURE__ */ import_react64.default.createElement("div", null, "Loading tests..."))), /* @__PURE__ */ import_react64.default.createElement("td", null, /* @__PURE__ */ import_react64.default.createElement(
33161
+ "a",
33162
+ {
33163
+ href: `#/projects/${project.name}#node`
33164
+ },
33165
+ getStatusIcon(project.nodeStatus),
33166
+ " Node build logs"
33167
+ )), /* @__PURE__ */ import_react64.default.createElement("td", null, /* @__PURE__ */ import_react64.default.createElement(
33168
+ "a",
33169
+ {
33170
+ href: `#/projects/${project.name}#web`
33171
+ },
33172
+ getStatusIcon(project.webStatus),
33173
+ " Web build logs"
33174
+ )), /* @__PURE__ */ import_react64.default.createElement("td", null, /* @__PURE__ */ import_react64.default.createElement(
33175
+ "a",
33176
+ {
33177
+ href: `#/projects/${project.name}#pure`
33178
+ },
33179
+ getStatusIcon(project.pureStatus),
33180
+ " Pure build logs"
33181
+ )))))));
33182
+ };
33183
+
33184
+ // src/components/stateful/ProjectsPage.tsx
33185
+ var ProjectsPage = () => {
33186
+ const [projects, setProjects] = (0, import_react65.useState)([]);
33187
+ const [summaries, setSummaries] = (0, import_react65.useState)({});
33188
+ const [loading, setLoading] = (0, import_react65.useState)(true);
33189
+ const [error, setError] = (0, import_react65.useState)(null);
33190
+ const [configs, setConfigs] = (0, import_react65.useState)({});
33191
+ const navigate = useNavigate();
33192
+ (0, import_react65.useEffect)(() => {
33193
+ const fetchProjects = async () => {
33194
+ try {
33195
+ const projectsRes = await fetch(`projects.json`);
33196
+ const projectNames = await projectsRes.json();
33197
+ const projectsData = await Promise.all(
33198
+ projectNames.map(async (name) => {
33199
+ const [summaryRes, nodeRes, webRes, pureRes, configRes] = await Promise.all([
33200
+ fetch(`reports/${name}/summary.json`),
33201
+ fetch(`bundles/node/${name}/metafile.json`),
33202
+ fetch(`bundles/web/${name}/metafile.json`),
33203
+ fetch(`bundles/pure/${name}/metafile.json`),
33204
+ fetch(`reports/${name}/config.json`)
33205
+ ]);
33206
+ const [summary, nodeData, webData, pureData, configData] = await Promise.all([
33207
+ summaryRes.json(),
33208
+ nodeRes.ok ? nodeRes.json() : { errors: ["Failed to load node build logs"] },
33209
+ webRes.ok ? webRes.json() : { errors: ["Failed to load web build logs"] },
33210
+ pureRes.ok ? pureRes.json() : { errors: ["Failed to load pure build logs"] },
33211
+ configRes.json()
33212
+ ]);
33213
+ setSummaries((prev) => ({ ...prev, [name]: summary }));
33214
+ setConfigs((prev) => ({ ...prev, [name]: configData }));
33215
+ return {
33216
+ name,
33217
+ testCount: Object.keys(summary).length,
33218
+ nodeStatus: nodeData.errors?.length ? "failed" : nodeData.warnings?.length ? "warning" : "success",
33219
+ webStatus: webData.errors?.length ? "failed" : webData.warnings?.length ? "warning" : "success",
33220
+ pureStatus: pureData.errors?.length ? "failed" : pureData.warnings?.length ? "warning" : "success"
33221
+ };
33222
+ })
33223
+ );
33224
+ setProjects(projectsData);
33225
+ } catch (err) {
33226
+ setError(err instanceof Error ? err.message : "Unknown error");
33227
+ } finally {
33228
+ setLoading(false);
33229
+ }
33230
+ };
33231
+ fetchProjects();
33232
+ }, []);
33233
+ return /* @__PURE__ */ import_react65.default.createElement(
33234
+ ProjectsPageView,
33235
+ {
33236
+ projects,
33237
+ summaries,
33238
+ configs,
33239
+ loading,
33240
+ error,
33241
+ navigate
33242
+ }
33243
+ );
33244
+ };
33245
+
33246
+ // src/App.tsx
33247
+ var App = () => {
33248
+ return /* @__PURE__ */ import_react66.default.createElement(HashRouter, null, /* @__PURE__ */ import_react66.default.createElement("div", { className: "d-flex flex-column min-vh-100", key: window.location.pathname }, /* @__PURE__ */ import_react66.default.createElement("main", { className: "flex-grow-1 p-3" }, /* @__PURE__ */ import_react66.default.createElement(Container_default, { fluid: true }, /* @__PURE__ */ import_react66.default.createElement(Routes, null, /* @__PURE__ */ import_react66.default.createElement(Route, { path: "/", element: /* @__PURE__ */ import_react66.default.createElement(ProjectsPage, null) }), /* @__PURE__ */ import_react66.default.createElement(Route, { path: "/projects/:projectName", element: /* @__PURE__ */ import_react66.default.createElement(ProjectPage, null) }), /* @__PURE__ */ import_react66.default.createElement(Route, { path: "/projects/:projectName/tests/*", element: /* @__PURE__ */ import_react66.default.createElement(TestPage, null) }), /* @__PURE__ */ import_react66.default.createElement(Route, { path: "/projects/:projectName#:tab", element: /* @__PURE__ */ import_react66.default.createElement(ProjectPage, null) })))), /* @__PURE__ */ import_react66.default.createElement("footer", { className: "bg-light py-3 d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react66.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react66.default.createElement(SettingsButton, null)), /* @__PURE__ */ import_react66.default.createElement(Container_default, { className: "text-end", fluid: true }, "made with \u2764\uFE0F and ", /* @__PURE__ */ import_react66.default.createElement("a", { href: "https://www.npmjs.com/package/testeranto" }, "testeranto")))));
33200
33249
  };
33201
33250
  if (typeof window !== "undefined") {
33202
33251
  window.App = App;
33203
- window.React = import_react63.default;
33252
+ window.React = import_react66.default;
33204
33253
  window.ReactDOM = import_client.default;
33205
33254
  }
33206
33255
  })();
@@ -33287,9 +33336,9 @@ object-assign/index.js:
33287
33336
  @license MIT
33288
33337
  *)
33289
33338
 
33290
- react-router/dist/development/chunk-EF7DTUVF.mjs:
33339
+ react-router/dist/development/chunk-C37GKA54.mjs:
33291
33340
  (**
33292
- * react-router v7.7.0
33341
+ * react-router v7.7.1
33293
33342
  *
33294
33343
  * Copyright (c) Remix Software Inc.
33295
33344
  *
@@ -33301,7 +33350,7 @@ react-router/dist/development/chunk-EF7DTUVF.mjs:
33301
33350
 
33302
33351
  react-router/dist/development/index.mjs:
33303
33352
  (**
33304
- * react-router v7.7.0
33353
+ * react-router v7.7.1
33305
33354
  *
33306
33355
  * Copyright (c) Remix Software Inc.
33307
33356
  *