rwsdk 0.1.16 → 0.1.17-test.20250715200658

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 (298) hide show
  1. package/dist/lib/$.d.mts +8 -0
  2. package/dist/lib/$.mjs +5 -0
  3. package/dist/lib/constants.d.mts +4 -0
  4. package/dist/lib/constants.mjs +6 -0
  5. package/dist/lib/findWranglerConfig.d.mts +1 -0
  6. package/dist/lib/findWranglerConfig.mjs +12 -0
  7. package/dist/lib/getShortName.d.mts +1 -0
  8. package/dist/lib/getShortName.mjs +2 -0
  9. package/dist/lib/getSrcPaths.d.ts +15 -0
  10. package/dist/lib/getSrcPaths.js +80 -0
  11. package/dist/lib/hasPkgScript.d.mts +1 -0
  12. package/dist/lib/hasPkgScript.mjs +9 -0
  13. package/dist/lib/jsonUtils.d.mts +28 -0
  14. package/dist/lib/jsonUtils.mjs +167 -0
  15. package/dist/lib/setupEnvFiles.d.mts +4 -0
  16. package/dist/lib/setupEnvFiles.mjs +31 -0
  17. package/dist/lib/smokeTests/artifacts.d.mts +10 -0
  18. package/dist/lib/smokeTests/artifacts.mjs +164 -0
  19. package/dist/lib/smokeTests/browser.d.mts +48 -0
  20. package/dist/lib/smokeTests/browser.mjs +1041 -0
  21. package/dist/lib/smokeTests/cleanup.d.mts +5 -0
  22. package/dist/lib/smokeTests/cleanup.mjs +214 -0
  23. package/dist/lib/smokeTests/codeUpdates.d.mts +8 -0
  24. package/dist/lib/smokeTests/codeUpdates.mjs +229 -0
  25. package/dist/lib/smokeTests/constants.d.mts +5 -0
  26. package/dist/lib/smokeTests/constants.mjs +10 -0
  27. package/dist/lib/smokeTests/development.d.mts +11 -0
  28. package/dist/lib/smokeTests/development.mjs +209 -0
  29. package/dist/lib/smokeTests/environment.d.mts +14 -0
  30. package/dist/lib/smokeTests/environment.mjs +163 -0
  31. package/dist/lib/smokeTests/release.d.mts +61 -0
  32. package/dist/lib/smokeTests/release.mjs +526 -0
  33. package/dist/lib/smokeTests/reporting.d.mts +13 -0
  34. package/dist/lib/smokeTests/reporting.mjs +355 -0
  35. package/dist/lib/smokeTests/runSmokeTests.d.mts +5 -0
  36. package/dist/lib/smokeTests/runSmokeTests.mjs +144 -0
  37. package/dist/lib/smokeTests/state.d.mts +48 -0
  38. package/dist/lib/smokeTests/state.mjs +57 -0
  39. package/dist/lib/smokeTests/templates/SmokeTest.template.d.ts +1 -0
  40. package/dist/lib/smokeTests/templates/SmokeTest.template.js +81 -0
  41. package/dist/lib/smokeTests/templates/SmokeTestClient.template.d.ts +1 -0
  42. package/dist/lib/smokeTests/templates/SmokeTestClient.template.js +159 -0
  43. package/dist/lib/smokeTests/templates/smokeTestFunctions.template.d.ts +1 -0
  44. package/dist/lib/smokeTests/templates/smokeTestFunctions.template.js +19 -0
  45. package/dist/lib/smokeTests/types.d.mts +75 -0
  46. package/dist/lib/smokeTests/utils.d.mts +15 -0
  47. package/dist/lib/smokeTests/utils.mjs +147 -0
  48. package/dist/llms/index.d.ts +3 -0
  49. package/dist/llms/index.js +35 -0
  50. package/dist/llms/rules/interruptors.d.ts +1 -0
  51. package/dist/llms/rules/interruptors.js +243 -0
  52. package/dist/llms/rules/middleware.d.ts +1 -0
  53. package/dist/llms/rules/middleware.js +71 -0
  54. package/dist/llms/rules/react.d.ts +1 -0
  55. package/dist/llms/rules/react.js +106 -0
  56. package/dist/llms/rules/request-response.d.ts +1 -0
  57. package/dist/llms/rules/request-response.js +209 -0
  58. package/dist/runtime/client.d.ts +17 -0
  59. package/dist/runtime/client.js +74 -0
  60. package/dist/runtime/clientNavigation.d.ts +4 -0
  61. package/dist/runtime/clientNavigation.js +53 -0
  62. package/dist/runtime/clientNavigation.test.d.ts +1 -0
  63. package/dist/runtime/clientNavigation.test.js +55 -0
  64. package/dist/runtime/constants.d.ts +1 -0
  65. package/dist/runtime/constants.js +1 -0
  66. package/dist/runtime/entries/auth.d.ts +1 -0
  67. package/dist/runtime/entries/auth.js +1 -0
  68. package/dist/runtime/entries/client.d.ts +4 -0
  69. package/dist/runtime/entries/client.js +4 -0
  70. package/dist/runtime/entries/clientSSR.d.ts +1 -0
  71. package/dist/runtime/entries/clientSSR.js +1 -0
  72. package/dist/runtime/entries/no-react-server.d.ts +0 -0
  73. package/dist/runtime/entries/no-react-server.js +2 -0
  74. package/dist/runtime/entries/react-server-only.d.ts +0 -0
  75. package/dist/runtime/entries/react-server-only.js +2 -0
  76. package/dist/runtime/entries/router.d.ts +2 -0
  77. package/dist/runtime/entries/router.js +2 -0
  78. package/dist/runtime/entries/ssr.d.ts +1 -0
  79. package/dist/runtime/entries/ssr.js +1 -0
  80. package/dist/runtime/entries/worker.d.ts +9 -0
  81. package/dist/runtime/entries/worker.js +9 -0
  82. package/dist/runtime/error.d.ts +6 -0
  83. package/dist/runtime/error.js +8 -0
  84. package/dist/runtime/imports/ClientOnly.d.ts +3 -0
  85. package/dist/runtime/imports/ClientOnly.js +8 -0
  86. package/dist/runtime/imports/client.d.ts +4 -0
  87. package/dist/runtime/imports/client.js +33 -0
  88. package/dist/runtime/imports/ssr.d.ts +5 -0
  89. package/dist/runtime/imports/ssr.js +20 -0
  90. package/dist/runtime/imports/worker.d.ts +5 -0
  91. package/dist/runtime/imports/worker.js +22 -0
  92. package/dist/runtime/lib/auth/index.d.ts +1 -0
  93. package/dist/runtime/lib/auth/index.js +1 -0
  94. package/dist/runtime/lib/auth/session.d.ts +50 -0
  95. package/dist/runtime/lib/auth/session.js +148 -0
  96. package/dist/runtime/lib/db/DOWorkerDialect.d.ts +29 -0
  97. package/dist/runtime/lib/db/DOWorkerDialect.js +66 -0
  98. package/dist/runtime/lib/db/SqliteDurableObject.d.ts +14 -0
  99. package/dist/runtime/lib/db/SqliteDurableObject.js +42 -0
  100. package/dist/runtime/lib/db/createDb.d.ts +2 -0
  101. package/dist/runtime/lib/db/createDb.js +33 -0
  102. package/dist/runtime/lib/db/index.d.ts +4 -0
  103. package/dist/runtime/lib/db/index.js +3 -0
  104. package/dist/runtime/lib/db/migrations.d.ts +23 -0
  105. package/dist/runtime/lib/db/migrations.js +34 -0
  106. package/dist/runtime/lib/db/typeInference/assert.d.ts +2 -0
  107. package/dist/runtime/lib/db/typeInference/assert.js +1 -0
  108. package/dist/runtime/lib/db/typeInference/builders/alterColumn.d.ts +27 -0
  109. package/dist/runtime/lib/db/typeInference/builders/alterColumn.js +1 -0
  110. package/dist/runtime/lib/db/typeInference/builders/alterTable.d.ts +53 -0
  111. package/dist/runtime/lib/db/typeInference/builders/alterTable.js +1 -0
  112. package/dist/runtime/lib/db/typeInference/builders/columnDefinition.d.ts +26 -0
  113. package/dist/runtime/lib/db/typeInference/builders/columnDefinition.js +1 -0
  114. package/dist/runtime/lib/db/typeInference/builders/createTable.d.ts +49 -0
  115. package/dist/runtime/lib/db/typeInference/builders/createTable.js +1 -0
  116. package/dist/runtime/lib/db/typeInference/builders/createView.d.ts +17 -0
  117. package/dist/runtime/lib/db/typeInference/builders/createView.js +1 -0
  118. package/dist/runtime/lib/db/typeInference/builders/dropTable.d.ts +11 -0
  119. package/dist/runtime/lib/db/typeInference/builders/dropTable.js +1 -0
  120. package/dist/runtime/lib/db/typeInference/builders/dropView.d.ts +12 -0
  121. package/dist/runtime/lib/db/typeInference/builders/dropView.js +1 -0
  122. package/dist/runtime/lib/db/typeInference/builders/schema.d.ts +24 -0
  123. package/dist/runtime/lib/db/typeInference/builders/schema.js +1 -0
  124. package/dist/runtime/lib/db/typeInference/database.d.ts +27 -0
  125. package/dist/runtime/lib/db/typeInference/database.js +1 -0
  126. package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.d.ts +1 -0
  127. package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.js +360 -0
  128. package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.d.ts +1 -0
  129. package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.js +33 -0
  130. package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.d.ts +1 -0
  131. package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.js +143 -0
  132. package/dist/runtime/lib/db/typeInference/typetests/print.d.ts +3 -0
  133. package/dist/runtime/lib/db/typeInference/typetests/print.js +1 -0
  134. package/dist/runtime/lib/db/typeInference/typetests/testUtils.d.ts +2 -0
  135. package/dist/runtime/lib/db/typeInference/typetests/testUtils.js +1 -0
  136. package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.d.ts +1 -0
  137. package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.js +17 -0
  138. package/dist/runtime/lib/db/typeInference/utils.d.ts +82 -0
  139. package/dist/runtime/lib/db/typeInference/utils.js +2 -0
  140. package/dist/runtime/lib/debug.d.ts +2 -0
  141. package/dist/runtime/lib/debug.js +36 -0
  142. package/dist/runtime/lib/links.d.ts +14 -0
  143. package/dist/runtime/lib/links.js +38 -0
  144. package/dist/runtime/lib/realtime/client.d.ts +7 -0
  145. package/dist/runtime/lib/realtime/client.js +166 -0
  146. package/dist/runtime/lib/realtime/constants.d.ts +1 -0
  147. package/dist/runtime/lib/realtime/constants.js +1 -0
  148. package/dist/runtime/lib/realtime/durableObject.d.ts +29 -0
  149. package/dist/runtime/lib/realtime/durableObject.js +187 -0
  150. package/dist/runtime/lib/realtime/renderRealtimeClients.d.ts +7 -0
  151. package/dist/runtime/lib/realtime/renderRealtimeClients.js +6 -0
  152. package/dist/runtime/lib/realtime/shared.d.ts +10 -0
  153. package/dist/runtime/lib/realtime/shared.js +10 -0
  154. package/dist/runtime/lib/realtime/validateUpgradeRequest.d.ts +6 -0
  155. package/dist/runtime/lib/realtime/validateUpgradeRequest.js +29 -0
  156. package/dist/runtime/lib/realtime/worker.d.ts +3 -0
  157. package/dist/runtime/lib/realtime/worker.js +16 -0
  158. package/dist/runtime/lib/router.d.ts +56 -0
  159. package/dist/runtime/lib/router.js +210 -0
  160. package/dist/runtime/lib/router.test.d.ts +1 -0
  161. package/dist/runtime/lib/router.test.js +58 -0
  162. package/dist/runtime/lib/streams/consumeEventStream.d.ts +4 -0
  163. package/dist/runtime/lib/streams/consumeEventStream.js +13 -0
  164. package/dist/runtime/lib/turnstile/TurnstileScript.d.ts +1 -0
  165. package/dist/runtime/lib/turnstile/TurnstileScript.js +2 -0
  166. package/dist/runtime/lib/turnstile/turnstile.d.ts +3 -0
  167. package/dist/runtime/lib/turnstile/turnstile.js +3 -0
  168. package/dist/runtime/lib/turnstile/useTurnstile.d.ts +4 -0
  169. package/dist/runtime/lib/turnstile/useTurnstile.js +23 -0
  170. package/dist/runtime/lib/turnstile/verifyTurnstileToken.d.ts +4 -0
  171. package/dist/runtime/lib/turnstile/verifyTurnstileToken.js +15 -0
  172. package/dist/runtime/lib/utils.d.ts +1 -0
  173. package/dist/runtime/lib/utils.js +1 -0
  174. package/dist/runtime/register/client.d.ts +1 -0
  175. package/dist/runtime/register/client.js +5 -0
  176. package/dist/runtime/register/ssr.d.ts +3 -0
  177. package/dist/runtime/register/ssr.js +26 -0
  178. package/dist/runtime/register/worker.d.ts +4 -0
  179. package/dist/runtime/register/worker.js +42 -0
  180. package/dist/runtime/render/createClientManifest.d.ts +1 -0
  181. package/dist/runtime/render/createClientManifest.js +7 -0
  182. package/dist/runtime/render/createModuleMap.d.ts +1 -0
  183. package/dist/runtime/render/createModuleMap.js +13 -0
  184. package/dist/runtime/render/renderRscThenableToHtmlStream.d.ts +9 -0
  185. package/dist/runtime/render/renderRscThenableToHtmlStream.js +49 -0
  186. package/dist/runtime/render/renderToRscStream.d.ts +5 -0
  187. package/dist/runtime/render/renderToRscStream.js +46 -0
  188. package/dist/runtime/render/renderToStream.d.ts +9 -0
  189. package/dist/runtime/render/renderToStream.js +27 -0
  190. package/dist/runtime/render/renderToString.d.ts +7 -0
  191. package/dist/runtime/render/renderToString.js +26 -0
  192. package/dist/runtime/render/transformRscToHtmlStream.d.ts +8 -0
  193. package/dist/runtime/render/transformRscToHtmlStream.js +19 -0
  194. package/dist/runtime/requestInfo/types.d.ts +11 -0
  195. package/dist/runtime/requestInfo/types.js +1 -0
  196. package/dist/runtime/requestInfo/worker.d.ts +5 -0
  197. package/dist/runtime/requestInfo/worker.js +33 -0
  198. package/dist/runtime/script.d.ts +5 -0
  199. package/dist/runtime/script.js +8 -0
  200. package/dist/runtime/ssrBridge.d.ts +2 -0
  201. package/dist/runtime/ssrBridge.js +11 -0
  202. package/dist/runtime/worker.d.ts +18 -0
  203. package/dist/runtime/worker.js +173 -0
  204. package/dist/scripts/__sdk.d.mts +1 -0
  205. package/dist/scripts/__sdk.mjs +14 -0
  206. package/dist/scripts/debug-sync.d.mts +6 -0
  207. package/dist/scripts/debug-sync.mjs +224 -0
  208. package/dist/scripts/dev-init.d.mts +1 -0
  209. package/dist/scripts/dev-init.mjs +25 -0
  210. package/dist/scripts/ensure-deploy-env.d.mts +1 -0
  211. package/dist/scripts/ensure-deploy-env.mjs +271 -0
  212. package/dist/scripts/ensure-env.d.mts +1 -0
  213. package/dist/scripts/ensure-env.mjs +9 -0
  214. package/dist/scripts/migrate-new.d.mts +1 -0
  215. package/dist/scripts/migrate-new.mjs +51 -0
  216. package/dist/scripts/smoke-test.d.mts +1 -0
  217. package/dist/scripts/smoke-test.mjs +166 -0
  218. package/dist/scripts/worker-run.d.mts +1 -0
  219. package/dist/scripts/worker-run.mjs +82 -0
  220. package/dist/vite/checkIsUsingPrisma.d.mts +6 -0
  221. package/dist/vite/checkIsUsingPrisma.mjs +18 -0
  222. package/dist/vite/configPlugin.d.mts +9 -0
  223. package/dist/vite/configPlugin.mjs +169 -0
  224. package/dist/vite/createDirectiveLookupPlugin.d.mts +21 -0
  225. package/dist/vite/createDirectiveLookupPlugin.mjs +231 -0
  226. package/dist/vite/devServerTimingPlugin.d.mts +2 -0
  227. package/dist/vite/devServerTimingPlugin.mjs +24 -0
  228. package/dist/vite/directivesPlugin.d.mts +6 -0
  229. package/dist/vite/directivesPlugin.mjs +200 -0
  230. package/dist/vite/ensureAliasArray.d.mts +2 -0
  231. package/dist/vite/ensureAliasArray.mjs +17 -0
  232. package/dist/vite/findSpecifiers.d.mts +31 -0
  233. package/dist/vite/findSpecifiers.mjs +230 -0
  234. package/dist/vite/findSsrSpecifiers.d.mts +11 -0
  235. package/dist/vite/findSsrSpecifiers.mjs +67 -0
  236. package/dist/vite/hasDirective.d.mts +7 -0
  237. package/dist/vite/hasDirective.mjs +54 -0
  238. package/dist/vite/hasOwnCloudflareVitePlugin.d.mts +3 -0
  239. package/dist/vite/hasOwnCloudflareVitePlugin.mjs +14 -0
  240. package/dist/vite/index.d.mts +1 -0
  241. package/dist/vite/index.mjs +1 -0
  242. package/dist/vite/injectVitePreamblePlugin.d.mts +4 -0
  243. package/dist/vite/injectVitePreamblePlugin.mjs +23 -0
  244. package/dist/vite/invalidateCacheIfPrismaClientChanged.d.mts +3 -0
  245. package/dist/vite/invalidateCacheIfPrismaClientChanged.mjs +27 -0
  246. package/dist/vite/invalidateModule.d.mts +6 -0
  247. package/dist/vite/invalidateModule.mjs +30 -0
  248. package/dist/vite/miniflareHMRPlugin.d.mts +10 -0
  249. package/dist/vite/miniflareHMRPlugin.mjs +209 -0
  250. package/dist/vite/moveStaticAssetsPlugin.d.mts +4 -0
  251. package/dist/vite/moveStaticAssetsPlugin.mjs +12 -0
  252. package/dist/vite/normalizeModulePath.d.mts +1 -0
  253. package/dist/vite/normalizeModulePath.mjs +13 -0
  254. package/dist/vite/prismaPlugin.d.mts +4 -0
  255. package/dist/vite/prismaPlugin.mjs +43 -0
  256. package/dist/vite/reactConditionsResolverPlugin.d.mts +16 -0
  257. package/dist/vite/reactConditionsResolverPlugin.mjs +179 -0
  258. package/dist/vite/redwoodPlugin.d.mts +12 -0
  259. package/dist/vite/redwoodPlugin.mjs +105 -0
  260. package/dist/vite/ssrBridgePlugin.d.mts +7 -0
  261. package/dist/vite/ssrBridgePlugin.mjs +137 -0
  262. package/dist/vite/transformClientComponents.d.mts +12 -0
  263. package/dist/vite/transformClientComponents.mjs +116 -0
  264. package/dist/vite/transformClientComponents.test.d.mts +1 -0
  265. package/dist/vite/transformClientComponents.test.mjs +264 -0
  266. package/dist/vite/transformJsxScriptTagsPlugin.d.mts +8 -0
  267. package/dist/vite/transformJsxScriptTagsPlugin.mjs +315 -0
  268. package/dist/vite/transformJsxScriptTagsPlugin.test.d.mts +1 -0
  269. package/dist/vite/transformJsxScriptTagsPlugin.test.mjs +334 -0
  270. package/dist/vite/transformServerFunctions.d.mts +16 -0
  271. package/dist/vite/transformServerFunctions.mjs +296 -0
  272. package/dist/vite/transformServerFunctions.test.d.mts +1 -0
  273. package/dist/vite/transformServerFunctions.test.mjs +124 -0
  274. package/dist/vite/useClientLookupPlugin.d.mts +5 -0
  275. package/dist/vite/useClientLookupPlugin.mjs +15 -0
  276. package/dist/vite/useServerLookupPlugin.d.mts +5 -0
  277. package/dist/vite/useServerLookupPlugin.mjs +15 -0
  278. package/dist/vite/useServerPlugin.d.mts +1 -0
  279. package/dist/vite/useServerPlugin.mjs +1 -0
  280. package/dist/vite/virtualPlugin.d.mts +2 -0
  281. package/dist/vite/virtualPlugin.mjs +18 -0
  282. package/dist/vite/vitePreamblePlugin.d.mts +1 -0
  283. package/dist/vite/vitePreamblePlugin.mjs +11 -0
  284. package/package.json +1 -1
  285. package/dist/runtime/lib/db/typeInference/builders/table.d.ts +0 -10
  286. package/dist/vite/invalidateClientModule.d.mts +0 -2
  287. package/dist/vite/invalidateClientModule.mjs +0 -8
  288. package/dist/vite/invalidateModule copy.d.mts +0 -2
  289. package/dist/vite/invalidateModule copy.mjs +0 -14
  290. package/dist/vite/invalidateSSRModule.d.mts +0 -2
  291. package/dist/vite/invalidateSSRModule.mjs +0 -7
  292. package/dist/vite/mode.d.mts +0 -5
  293. package/dist/vite/mode.mjs +0 -25
  294. package/dist/vite/modePlugin.d.mts +0 -2
  295. package/dist/vite/modePlugin.mjs +0 -10
  296. /package/dist/{runtime/lib/db/typeInference/builders/table.js → lib/smokeTests/types.mjs} +0 -0
  297. /package/dist/vite/{isJsFile.d.ts → isJsFile.d.mts} +0 -0
  298. /package/dist/vite/{isJsFile.js → isJsFile.mjs} +0 -0
@@ -0,0 +1,355 @@
1
+ import { join, basename } from "path";
2
+ import { writeFile } from "fs/promises";
3
+ import { mkdirp } from "fs-extra";
4
+ import { log } from "./constants.mjs";
5
+ import { state } from "./state.mjs";
6
+ /**
7
+ * Maps a test status to a display string with emoji
8
+ */
9
+ function formatTestStatus(status) {
10
+ switch (status) {
11
+ case "PASSED":
12
+ return "✅ PASSED";
13
+ case "FAILED":
14
+ return "❌ FAILED";
15
+ case "SKIPPED":
16
+ return "⏩ SKIPPED";
17
+ case "DID_NOT_RUN":
18
+ return "⚠️ DID NOT RUN";
19
+ default:
20
+ return "❓ UNKNOWN";
21
+ }
22
+ }
23
+ /**
24
+ * Generates the final test report without doing any resource cleanup.
25
+ */
26
+ export async function generateFinalReport() {
27
+ try {
28
+ // Helper function to check if a failure matches the specified patterns
29
+ function failureMatches(failure, patterns, notPatterns = []) {
30
+ // Check if any of the patterns match in either step or error
31
+ const matchesPattern = patterns.some((pattern) => failure.step.includes(pattern) ||
32
+ (failure.error && failure.error.includes(pattern)));
33
+ // Check if any of the not-patterns match in either step or error
34
+ const matchesNotPattern = notPatterns.some((pattern) => failure.step.includes(pattern) ||
35
+ (failure.error && failure.error.includes(pattern)));
36
+ // Return true if it matches a pattern and doesn't match any not-pattern
37
+ return matchesPattern && !matchesNotPattern;
38
+ }
39
+ // Create a report object
40
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
41
+ const report = {
42
+ timestamp,
43
+ success: state.exitCode === 0,
44
+ exitCode: state.exitCode,
45
+ workerName: (state.resources.workerName || null),
46
+ projectDir: state.options.artifactDir
47
+ ? join(state.options.artifactDir, "project")
48
+ : null,
49
+ logFiles: state.options.artifactDir
50
+ ? {
51
+ stdout: join(state.options.artifactDir, "logs", `stdout-${timestamp}.log`),
52
+ stderr: join(state.options.artifactDir, "logs", `stderr-${timestamp}.log`),
53
+ combined: join(state.options.artifactDir, "logs", `combined-${timestamp}.log`),
54
+ }
55
+ : null,
56
+ failures: state.failures,
57
+ options: {
58
+ customPath: state.options.customPath,
59
+ skipDev: state.options.skipDev,
60
+ skipRelease: state.options.skipRelease,
61
+ skipClient: state.options.skipClient,
62
+ },
63
+ testStatus: state.testStatus,
64
+ };
65
+ // Always print the report to console in a pretty format
66
+ console.log("\n==================================================");
67
+ console.log(" 📊 SMOKE TEST REPORT ");
68
+ console.log("==================================================");
69
+ console.log("--------------------------------------------------");
70
+ console.log(`Timestamp: ${timestamp}`);
71
+ console.log(`Status: ${report.success ? "✅ PASSED" : "❌ FAILED"}`);
72
+ console.log(`Exit code: ${state.exitCode}`);
73
+ if (report.workerName) {
74
+ console.log(`Worker name: ${report.workerName}`);
75
+ }
76
+ console.log(`Test options:`);
77
+ console.log(` - Custom path: ${report.options.customPath || "/"}`);
78
+ console.log(` - Skip dev: ${report.options.skipDev ? "Yes" : "No"}`);
79
+ console.log(` - Skip release: ${report.options.skipRelease ? "Yes" : "No"}`);
80
+ console.log(` - Skip client: ${report.options.skipClient ? "Yes" : "No"}`);
81
+ // Add info about log files
82
+ if (report.logFiles) {
83
+ console.log(`Log files:`);
84
+ console.log(` - stdout: ${basename(report.logFiles.stdout)}`);
85
+ console.log(` - stderr: ${basename(report.logFiles.stderr)}`);
86
+ console.log(` - combined: ${basename(report.logFiles.combined)}`);
87
+ }
88
+ console.log("--------------------------------------------------");
89
+ // Add summary of failures count
90
+ if (state.failures.length > 0) {
91
+ console.log(`\n❌ Failed tests: ${state.failures.length}`);
92
+ }
93
+ else if (report.success) {
94
+ console.log("\n✅ All smoke tests passed successfully!");
95
+ }
96
+ // Group failures by step to determine which stages had issues
97
+ const devFailures = state.failures.filter((f) => failureMatches(f, ["Development", "Development Server", "Development -"]));
98
+ const releaseFailures = state.failures.filter((f) => failureMatches(f, ["Production", "Release", "Production -"]));
99
+ // Add hierarchical test results overview
100
+ console.log("\n==================================================");
101
+ console.log(" 🔍 TEST RESULTS SUMMARY ");
102
+ console.log("==================================================");
103
+ // Dev tests summary using the new testStatus system
104
+ console.log(`● Development Tests: ${formatTestStatus(state.testStatus.dev.overall)}`);
105
+ // Only show details if the overall test status is not "SKIPPED" or "DID_NOT_RUN"
106
+ if (state.testStatus.dev.overall !== "SKIPPED" &&
107
+ state.testStatus.dev.overall !== "DID_NOT_RUN") {
108
+ console.log(` ├─ Initial Tests:`);
109
+ console.log(` │ ├─ Server-side: ${formatTestStatus(state.testStatus.dev.initialServerSide)}`);
110
+ console.log(` │ ├─ Client-side: ${formatTestStatus(state.testStatus.dev.initialClientSide)}`);
111
+ console.log(` │ ├─ Server Render Check: ${formatTestStatus(state.testStatus.dev.initialServerRenderCheck)}`);
112
+ console.log(` │ ├─ Server HMR: ${formatTestStatus(state.testStatus.dev.initialServerHmr)}`);
113
+ console.log(` │ └─ Client HMR: ${formatTestStatus(state.testStatus.dev.initialClientHmr)}`);
114
+ console.log(` └─ Realtime Tests:`);
115
+ console.log(` ├─ Upgrade: ${formatTestStatus(state.testStatus.dev.realtimeUpgrade)}`);
116
+ console.log(` ├─ Server-side: ${formatTestStatus(state.testStatus.dev.realtimeServerSide)}`);
117
+ console.log(` ├─ Client-side: ${formatTestStatus(state.testStatus.dev.realtimeClientSide)}`);
118
+ console.log(` ├─ Server Render Check: ${formatTestStatus(state.testStatus.dev.realtimeServerRenderCheck)}`);
119
+ console.log(` ├─ Server HMR: ${formatTestStatus(state.testStatus.dev.realtimeServerHmr)}`);
120
+ console.log(` └─ Client HMR: ${formatTestStatus(state.testStatus.dev.realtimeClientHmr)}`);
121
+ }
122
+ // Production tests summary using the new testStatus system
123
+ console.log(`● Production Tests: ${formatTestStatus(state.testStatus.production.overall)}`);
124
+ // Only show details if the overall test status is not "SKIPPED" or "DID_NOT_RUN"
125
+ if (state.testStatus.production.overall !== "SKIPPED" &&
126
+ state.testStatus.production.overall !== "DID_NOT_RUN") {
127
+ console.log(` ├─ Release Command: ${formatTestStatus(state.testStatus.production.releaseCommand)}`);
128
+ // Only show these if release command was either not run or passed
129
+ if (state.testStatus.production.releaseCommand !== "FAILED") {
130
+ console.log(` ├─ Initial Tests:`);
131
+ console.log(` │ ├─ Server-side: ${formatTestStatus(state.testStatus.production.initialServerSide)}`);
132
+ console.log(` │ ├─ Client-side: ${formatTestStatus(state.testStatus.production.initialClientSide)}`);
133
+ console.log(` │ └─ Server Render Check: ${formatTestStatus(state.testStatus.production.initialServerRenderCheck)}`);
134
+ console.log(` └─ Realtime Tests:`);
135
+ console.log(` ├─ Upgrade: ${formatTestStatus(state.testStatus.production.realtimeUpgrade)}`);
136
+ console.log(` ├─ Server-side: ${formatTestStatus(state.testStatus.production.realtimeServerSide)}`);
137
+ console.log(` ├─ Client-side: ${formatTestStatus(state.testStatus.production.realtimeClientSide)}`);
138
+ console.log(` └─ Server Render Check: ${formatTestStatus(state.testStatus.production.realtimeServerRenderCheck)}`);
139
+ }
140
+ else {
141
+ console.log(` └─ Tests: ⏩ SKIPPED (release command failed)`);
142
+ }
143
+ }
144
+ // Add failures to the report file if we have a valid artifactDir
145
+ if (state.options.artifactDir) {
146
+ try {
147
+ // Ensure the directory exists, even if it was not created earlier
148
+ await mkdirp(state.options.artifactDir);
149
+ // Use the standardized reports directory
150
+ const reportDir = join(state.options.artifactDir, "reports");
151
+ // Ensure the directory exists
152
+ await mkdirp(reportDir);
153
+ const reportPath = join(reportDir, `smoke-test-report-${timestamp}.json`);
154
+ await writeFile(reportPath, JSON.stringify(report, null, 2));
155
+ console.log(`\n📝 Report saved to ${reportPath}`);
156
+ }
157
+ catch (reportError) {
158
+ console.error(`⚠️ Could not save report to file: ${reportError instanceof Error ? reportError.message : String(reportError)}`);
159
+ }
160
+ }
161
+ else {
162
+ console.log("\n⚠️ No artifacts directory specified, report not saved to disk");
163
+ }
164
+ // Report failures with clear environment context
165
+ if (state.failures.length > 0) {
166
+ console.log("\n==================================================");
167
+ console.log(" 🔍 FAILURE DETAILS ");
168
+ console.log("==================================================");
169
+ // Group failures by environment (Dev vs Release)
170
+ if (devFailures.length > 0) {
171
+ console.log("----------------- DEVELOPMENT ENVIRONMENT -----------------");
172
+ devFailures.forEach((failure, index) => {
173
+ console.log(`Failure #${index + 1}: ${failure.step}`);
174
+ // Split error message into lines if it's long
175
+ const errorLines = failure.error.split("\n");
176
+ console.log(`Error: ${errorLines[0]}`);
177
+ for (let i = 1; i < errorLines.length; i++) {
178
+ console.log(` ${errorLines[i]}`);
179
+ }
180
+ console.log(``);
181
+ });
182
+ console.log(`--------------------------------------------------`);
183
+ }
184
+ if (releaseFailures.length > 0) {
185
+ console.log("----------------- PRODUCTION ENVIRONMENT -----------------");
186
+ releaseFailures.forEach((failure, index) => {
187
+ console.log(`Failure #${index + 1}: ${failure.step}`);
188
+ // Split error message into lines if it's long
189
+ const errorLines = failure.error.split("\n");
190
+ console.log(`Error: ${errorLines[0]}`);
191
+ for (let i = 1; i < errorLines.length; i++) {
192
+ console.log(` ${errorLines[i]}`);
193
+ }
194
+ console.log(``);
195
+ });
196
+ console.log(`--------------------------------------------------`);
197
+ }
198
+ // Show other failures that don't fit into the above categories
199
+ const otherFailures = state.failures.filter((f) => !devFailures.includes(f) && !releaseFailures.includes(f));
200
+ if (otherFailures.length > 0) {
201
+ console.log("----------------- OTHER FAILURES -----------------");
202
+ otherFailures.forEach((failure, index) => {
203
+ console.log(`Failure #${index + 1}: ${failure.step}`);
204
+ // Split error message into lines if it's long
205
+ const errorLines = failure.error.split("\n");
206
+ console.log(`Error: ${errorLines[0]}`);
207
+ for (let i = 1; i < errorLines.length; i++) {
208
+ console.log(` ${errorLines[i]}`);
209
+ }
210
+ console.log(``);
211
+ });
212
+ console.log(`--------------------------------------------------`);
213
+ }
214
+ }
215
+ }
216
+ catch (error) {
217
+ // Last resort error handling
218
+ console.error("❌ Failed to generate report:", error);
219
+ }
220
+ }
221
+ /**
222
+ * Updates the test status in the state object and reports the result.
223
+ */
224
+ export function reportSmokeTestResult(result, type, phase = "", environment = "Development") {
225
+ const phasePrefix = phase ? `(${phase}) ` : "";
226
+ log("Reporting %s%s smoke test result: %O", phasePrefix, type, result);
227
+ if (result.verificationPassed) {
228
+ console.log(`✅ ${phasePrefix}${type} smoke test passed!`);
229
+ if (result.serverTimestamp) {
230
+ console.log(`✅ Server timestamp: ${result.serverTimestamp}`);
231
+ }
232
+ if (result.clientTimestamp) {
233
+ console.log(`✅ Client timestamp: ${result.clientTimestamp}`);
234
+ }
235
+ }
236
+ else {
237
+ log("ERROR: %s%s smoke test failed. Status: %s. Error: %s", phasePrefix, type, result.status, result.error || "unknown");
238
+ // The actual state update and error throwing is now handled by the caller functions
239
+ // We only need to report the result in the console
240
+ console.error(`❌ ${phasePrefix}${type} smoke test failed. Status: ${result.status}${result.error ? `. Error: ${result.error}` : ""}`);
241
+ }
242
+ }
243
+ /**
244
+ * Initialize test statuses based on test options
245
+ */
246
+ export function initializeTestStatus() {
247
+ // Set default status for all tests as "DID_NOT_RUN"
248
+ // Dev tests
249
+ state.testStatus.dev.overall = "DID_NOT_RUN";
250
+ state.testStatus.dev.initialServerSide = "DID_NOT_RUN";
251
+ state.testStatus.dev.initialClientSide = "DID_NOT_RUN";
252
+ state.testStatus.dev.initialServerRenderCheck = "DID_NOT_RUN";
253
+ state.testStatus.dev.realtimeUpgrade = "DID_NOT_RUN";
254
+ state.testStatus.dev.realtimeServerSide = "DID_NOT_RUN";
255
+ state.testStatus.dev.realtimeClientSide = "DID_NOT_RUN";
256
+ state.testStatus.dev.realtimeServerRenderCheck = "DID_NOT_RUN";
257
+ state.testStatus.dev.initialServerHmr = "DID_NOT_RUN";
258
+ state.testStatus.dev.initialClientHmr = "DID_NOT_RUN";
259
+ state.testStatus.dev.realtimeServerHmr = "DID_NOT_RUN";
260
+ state.testStatus.dev.realtimeClientHmr = "DID_NOT_RUN";
261
+ // Production tests
262
+ state.testStatus.production.overall = "DID_NOT_RUN";
263
+ state.testStatus.production.releaseCommand = "DID_NOT_RUN";
264
+ state.testStatus.production.initialServerSide = "DID_NOT_RUN";
265
+ state.testStatus.production.initialClientSide = "DID_NOT_RUN";
266
+ state.testStatus.production.initialServerRenderCheck = "DID_NOT_RUN";
267
+ state.testStatus.production.realtimeUpgrade = "DID_NOT_RUN";
268
+ state.testStatus.production.realtimeServerSide = "DID_NOT_RUN";
269
+ state.testStatus.production.realtimeClientSide = "DID_NOT_RUN";
270
+ state.testStatus.production.realtimeServerRenderCheck = "DID_NOT_RUN";
271
+ state.testStatus.production.initialServerHmr = "DID_NOT_RUN";
272
+ state.testStatus.production.initialClientHmr = "DID_NOT_RUN";
273
+ state.testStatus.production.realtimeServerHmr = "DID_NOT_RUN";
274
+ state.testStatus.production.realtimeClientHmr = "DID_NOT_RUN";
275
+ // Now override with specific statuses based on options
276
+ // Mark skipped tests based on options
277
+ if (state.options.skipDev) {
278
+ state.testStatus.dev.overall = "SKIPPED";
279
+ state.testStatus.dev.initialServerSide = "SKIPPED";
280
+ state.testStatus.dev.initialClientSide = "SKIPPED";
281
+ state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
282
+ state.testStatus.dev.realtimeUpgrade = "SKIPPED";
283
+ state.testStatus.dev.realtimeServerSide = "SKIPPED";
284
+ state.testStatus.dev.realtimeClientSide = "SKIPPED";
285
+ state.testStatus.dev.realtimeServerRenderCheck = "SKIPPED";
286
+ state.testStatus.dev.initialServerHmr = "SKIPPED";
287
+ state.testStatus.dev.initialClientHmr = "SKIPPED";
288
+ state.testStatus.dev.realtimeServerHmr = "SKIPPED";
289
+ state.testStatus.dev.realtimeClientHmr = "SKIPPED";
290
+ }
291
+ if (state.options.skipRelease) {
292
+ state.testStatus.production.overall = "SKIPPED";
293
+ state.testStatus.production.releaseCommand = "SKIPPED";
294
+ state.testStatus.production.initialServerSide = "SKIPPED";
295
+ state.testStatus.production.initialClientSide = "SKIPPED";
296
+ state.testStatus.production.initialServerRenderCheck = "SKIPPED";
297
+ state.testStatus.production.realtimeUpgrade = "SKIPPED";
298
+ state.testStatus.production.realtimeServerSide = "SKIPPED";
299
+ state.testStatus.production.realtimeClientSide = "SKIPPED";
300
+ state.testStatus.production.realtimeServerRenderCheck = "SKIPPED";
301
+ state.testStatus.production.initialServerHmr = "SKIPPED";
302
+ state.testStatus.production.initialClientHmr = "SKIPPED";
303
+ state.testStatus.production.realtimeServerHmr = "SKIPPED";
304
+ state.testStatus.production.realtimeClientHmr = "SKIPPED";
305
+ }
306
+ if (state.options.skipClient) {
307
+ state.testStatus.dev.initialClientSide = "SKIPPED";
308
+ state.testStatus.dev.realtimeClientSide = "SKIPPED";
309
+ state.testStatus.production.initialClientSide = "SKIPPED";
310
+ state.testStatus.production.realtimeClientSide = "SKIPPED";
311
+ state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
312
+ state.testStatus.dev.realtimeServerRenderCheck = "SKIPPED";
313
+ state.testStatus.production.initialServerRenderCheck = "SKIPPED";
314
+ state.testStatus.production.realtimeServerRenderCheck = "SKIPPED";
315
+ state.testStatus.dev.initialClientHmr = "SKIPPED";
316
+ state.testStatus.dev.realtimeClientHmr = "SKIPPED";
317
+ state.testStatus.production.initialClientHmr = "SKIPPED";
318
+ state.testStatus.production.realtimeClientHmr = "SKIPPED";
319
+ }
320
+ // Skip HMR tests in production and when requested
321
+ state.testStatus.production.initialServerHmr = "SKIPPED";
322
+ state.testStatus.production.initialClientHmr = "SKIPPED";
323
+ state.testStatus.production.realtimeServerHmr = "SKIPPED";
324
+ state.testStatus.production.realtimeClientHmr = "SKIPPED";
325
+ if (state.options.skipHmr) {
326
+ state.testStatus.dev.initialServerHmr = "SKIPPED";
327
+ state.testStatus.dev.initialClientHmr = "SKIPPED";
328
+ state.testStatus.dev.realtimeServerHmr = "SKIPPED";
329
+ state.testStatus.dev.realtimeClientHmr = "SKIPPED";
330
+ }
331
+ // Handle realtime option which skips initial tests
332
+ if (state.options.realtime) {
333
+ // In realtime mode, initial tests are skipped
334
+ if (!state.options.skipDev) {
335
+ state.testStatus.dev.initialServerSide = "SKIPPED";
336
+ state.testStatus.dev.initialClientSide = "SKIPPED";
337
+ state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
338
+ state.testStatus.dev.initialServerHmr = "SKIPPED";
339
+ state.testStatus.dev.initialClientHmr = "SKIPPED";
340
+ // Set the upgrade test to PASSED as it's implicitly run for realtime mode
341
+ state.testStatus.dev.realtimeUpgrade = "PASSED";
342
+ }
343
+ if (!state.options.skipRelease) {
344
+ state.testStatus.production.initialServerSide = "SKIPPED";
345
+ state.testStatus.production.initialClientSide = "SKIPPED";
346
+ state.testStatus.production.initialServerRenderCheck = "SKIPPED";
347
+ state.testStatus.production.initialServerHmr = "SKIPPED";
348
+ state.testStatus.production.initialClientHmr = "SKIPPED";
349
+ // Set release command to PASSED since it must have succeeded for realtime tests to run
350
+ state.testStatus.production.releaseCommand = "PASSED";
351
+ // Set the upgrade test to PASSED as it's implicitly run for realtime mode
352
+ state.testStatus.production.realtimeUpgrade = "PASSED";
353
+ }
354
+ }
355
+ }
@@ -0,0 +1,5 @@
1
+ import { SmokeTestOptions } from "./types.mjs";
2
+ /**
3
+ * Main function that orchestrates the smoke test flow
4
+ */
5
+ export declare function runSmokeTests(options?: SmokeTestOptions): Promise<void>;
@@ -0,0 +1,144 @@
1
+ import { join } from "path";
2
+ import { getBrowserPath } from "./browser.mjs";
3
+ import { setupArtifactsDirectory } from "./artifacts.mjs";
4
+ import { setupTestEnvironment } from "./environment.mjs";
5
+ import { runDevServer, runDevTest } from "./development.mjs";
6
+ import { runReleaseTest } from "./release.mjs";
7
+ import { fail, teardown, log } from "./utils.mjs";
8
+ import { state, updateTestStatus } from "./state.mjs";
9
+ import { initializeTestStatus } from "./reporting.mjs";
10
+ /**
11
+ * Main function that orchestrates the smoke test flow
12
+ */
13
+ export async function runSmokeTests(options = {}) {
14
+ log("Starting smoke test with options: %O", options);
15
+ // Store options in state immediately for force report generation if needed
16
+ state.options = options;
17
+ // Initialize test status based on options
18
+ initializeTestStatus();
19
+ // Set default artifacts directory if not specified
20
+ if (!options.artifactDir) {
21
+ options.artifactDir = join(process.cwd(), ".artifacts");
22
+ log("Using default artifacts directory: %s", options.artifactDir);
23
+ // Update state.options with the default value
24
+ state.options.artifactDir = options.artifactDir;
25
+ }
26
+ // Clean and recreate artifacts directory
27
+ await setupArtifactsDirectory(options.artifactDir, options);
28
+ log("Initialized log capturing to artifact files");
29
+ // Throw immediately if both tests would be skipped
30
+ if (options.skipDev && options.skipRelease) {
31
+ log("Error: Both dev and release tests are skipped");
32
+ await fail(new Error("Cannot skip both dev and release tests. At least one must run."), 1, "Configuration");
33
+ }
34
+ // Prepare browser early to avoid waiting later
35
+ console.log("🔍 Preparing browser for testing...");
36
+ let browserPath;
37
+ try {
38
+ browserPath = await getBrowserPath(options);
39
+ console.log(`✅ Browser ready at: ${browserPath}`);
40
+ }
41
+ catch (error) {
42
+ await fail(error, 1, "Browser Preparation");
43
+ }
44
+ log("Setting up test environment");
45
+ try {
46
+ const resources = await setupTestEnvironment(options);
47
+ // Store resources in module-level state
48
+ state.resources = resources;
49
+ // Track failures to determine final exit code
50
+ let hasFailures = false;
51
+ // Run the tests that weren't skipped
52
+ if (!options.skipDev) {
53
+ log("Starting development server");
54
+ try {
55
+ // Start the dev server first, store the stop function in resources
56
+ const { url, stopDev } = await runDevServer(resources.targetDir);
57
+ resources.stopDev = stopDev;
58
+ state.resources.stopDev = stopDev;
59
+ log("Running development server tests");
60
+ await runDevTest(url, options.artifactDir, options.customPath, browserPath, options.headless !== false, options.bail, options.skipClient, options.realtime, options.skipHmr);
61
+ // Mark that dev tests have run successfully
62
+ state.devTestsRan = true;
63
+ // Update the overall dev test status to PASSED
64
+ state.testStatus.dev.overall = "PASSED";
65
+ }
66
+ catch (error) {
67
+ hasFailures = true;
68
+ log("Error during development server testing: %O", error);
69
+ console.error(`❌ Development server test failed: ${error instanceof Error ? error.message : String(error)}`);
70
+ // Record the failure
71
+ state.failures.push({
72
+ step: "Development Server Test",
73
+ error: error instanceof Error ? error.message : String(error),
74
+ details: error instanceof Error && error.stack ? error.stack : undefined,
75
+ });
76
+ // Mark overall dev test status as FAILED
77
+ state.testStatus.dev.overall = "FAILED";
78
+ // If bail option is true, stop the tests
79
+ if (options.bail) {
80
+ await fail(error, 1, "Development Server Test");
81
+ }
82
+ // Otherwise, continue with the release test
83
+ console.log("Continuing with next tests since --bail is not enabled...");
84
+ }
85
+ }
86
+ else {
87
+ log("Skipping development server tests");
88
+ }
89
+ if (!options.skipRelease) {
90
+ if (options.realtime) {
91
+ // If --realtime flag is set, status is already set in initializeTestStatus
92
+ console.log("⏩ Using realtime mode for Production tests (--realtime option enabled)");
93
+ }
94
+ else {
95
+ // Update status when release command runs
96
+ try {
97
+ console.log("\n🚀 Running release command smoke test");
98
+ await runReleaseTest(options.customPath, options.artifactDir, resources, browserPath, options.headless !== false, options.bail, options.skipClient, options.projectDir, options.realtime, options.skipHmr);
99
+ // Update release command status to PASSED
100
+ updateTestStatus("production", "releaseCommand", "PASSED");
101
+ // Mark that release tests have run successfully
102
+ state.releaseTestsRan = true;
103
+ // Update the overall production test status to PASSED
104
+ state.testStatus.production.overall = "PASSED";
105
+ }
106
+ catch (error) {
107
+ // Update release command status to FAILED
108
+ updateTestStatus("production", "releaseCommand", "FAILED");
109
+ hasFailures = true;
110
+ log("Error during release testing: %O", error);
111
+ console.error(`❌ Release test failed: ${error instanceof Error ? error.message : String(error)}`);
112
+ // Record the failure
113
+ state.failures.push({
114
+ step: "Release Test",
115
+ error: error instanceof Error ? error.message : String(error),
116
+ details: error instanceof Error && error.stack ? error.stack : undefined,
117
+ });
118
+ // Mark overall production test status as FAILED
119
+ state.testStatus.production.overall = "FAILED";
120
+ // If bail option is true, stop the tests
121
+ if (options.bail) {
122
+ await fail(error, 1, "Release Test");
123
+ }
124
+ }
125
+ }
126
+ }
127
+ else {
128
+ log("Skipping release/production tests");
129
+ }
130
+ // Set the exit code based on whether there were failures
131
+ if (hasFailures) {
132
+ state.exitCode = 1;
133
+ console.log("\n⚠️ Some smoke tests failed, but continued running since --bail was not enabled.");
134
+ }
135
+ else {
136
+ console.log("\n✅ All smoke tests passed!");
137
+ }
138
+ // Call teardown with the final exit code
139
+ await teardown();
140
+ }
141
+ catch (error) {
142
+ await fail(error, 1, "Test Environment Setup");
143
+ }
144
+ }
@@ -0,0 +1,48 @@
1
+ import { SmokeTestOptions, TestResources } from "./types.mjs";
2
+ export type TestStatusValue = "SKIPPED" | "DID_NOT_RUN" | "PASSED" | "FAILED";
3
+ export interface TestStatus {
4
+ dev: {
5
+ overall: TestStatusValue;
6
+ initialServerSide: TestStatusValue;
7
+ initialClientSide: TestStatusValue;
8
+ initialServerRenderCheck: TestStatusValue;
9
+ realtimeUpgrade: TestStatusValue;
10
+ realtimeServerSide: TestStatusValue;
11
+ realtimeClientSide: TestStatusValue;
12
+ realtimeServerRenderCheck: TestStatusValue;
13
+ initialServerHmr: TestStatusValue;
14
+ initialClientHmr: TestStatusValue;
15
+ realtimeServerHmr: TestStatusValue;
16
+ realtimeClientHmr: TestStatusValue;
17
+ };
18
+ production: {
19
+ overall: TestStatusValue;
20
+ releaseCommand: TestStatusValue;
21
+ initialServerSide: TestStatusValue;
22
+ initialClientSide: TestStatusValue;
23
+ initialServerRenderCheck: TestStatusValue;
24
+ realtimeUpgrade: TestStatusValue;
25
+ realtimeServerSide: TestStatusValue;
26
+ realtimeClientSide: TestStatusValue;
27
+ realtimeServerRenderCheck: TestStatusValue;
28
+ initialServerHmr: TestStatusValue;
29
+ initialClientHmr: TestStatusValue;
30
+ realtimeServerHmr: TestStatusValue;
31
+ realtimeClientHmr: TestStatusValue;
32
+ };
33
+ }
34
+ export declare const state: {
35
+ isTearingDown: boolean;
36
+ exitCode: number;
37
+ resources: TestResources;
38
+ options: SmokeTestOptions;
39
+ failures: {
40
+ step: string;
41
+ error: string;
42
+ details?: string;
43
+ }[];
44
+ devTestsRan: boolean;
45
+ releaseTestsRan: boolean;
46
+ testStatus: TestStatus;
47
+ };
48
+ export declare function updateTestStatus(env: "dev" | "production", test: keyof TestStatus["dev"] | keyof TestStatus["production"], status: TestStatusValue): void;
@@ -0,0 +1,57 @@
1
+ // Module-level state to track resources and teardown status
2
+ export const state = {
3
+ isTearingDown: false,
4
+ exitCode: 0,
5
+ resources: {
6
+ tempDirCleanup: undefined,
7
+ workerName: undefined,
8
+ originalCwd: process.cwd(),
9
+ targetDir: undefined,
10
+ workerCreatedDuringTest: false,
11
+ stopDev: undefined,
12
+ },
13
+ options: {},
14
+ // Add a new failures array to track all failures
15
+ failures: [],
16
+ // Track whether tests have actually run
17
+ devTestsRan: false,
18
+ releaseTestsRan: false,
19
+ // New detailed test status tracking
20
+ testStatus: {
21
+ dev: {
22
+ overall: "DID_NOT_RUN",
23
+ initialServerSide: "DID_NOT_RUN",
24
+ initialClientSide: "DID_NOT_RUN",
25
+ initialServerRenderCheck: "DID_NOT_RUN",
26
+ realtimeUpgrade: "DID_NOT_RUN",
27
+ realtimeServerSide: "DID_NOT_RUN",
28
+ realtimeClientSide: "DID_NOT_RUN",
29
+ realtimeServerRenderCheck: "DID_NOT_RUN",
30
+ // HMR test statuses
31
+ initialServerHmr: "DID_NOT_RUN",
32
+ initialClientHmr: "DID_NOT_RUN",
33
+ realtimeServerHmr: "DID_NOT_RUN",
34
+ realtimeClientHmr: "DID_NOT_RUN",
35
+ },
36
+ production: {
37
+ overall: "DID_NOT_RUN",
38
+ releaseCommand: "DID_NOT_RUN",
39
+ initialServerSide: "DID_NOT_RUN",
40
+ initialClientSide: "DID_NOT_RUN",
41
+ initialServerRenderCheck: "DID_NOT_RUN",
42
+ realtimeUpgrade: "DID_NOT_RUN",
43
+ realtimeServerSide: "DID_NOT_RUN",
44
+ realtimeClientSide: "DID_NOT_RUN",
45
+ realtimeServerRenderCheck: "DID_NOT_RUN",
46
+ // HMR test statuses
47
+ initialServerHmr: "DID_NOT_RUN",
48
+ initialClientHmr: "DID_NOT_RUN",
49
+ realtimeServerHmr: "DID_NOT_RUN",
50
+ realtimeClientHmr: "DID_NOT_RUN",
51
+ },
52
+ },
53
+ };
54
+ // Helper function to update test status
55
+ export function updateTestStatus(env, test, status) {
56
+ state.testStatus[env][test] = status;
57
+ }
@@ -0,0 +1 @@
1
+ export declare function getSmokeTestTemplate(skipClient?: boolean): string;