elm-pages 3.0.0-beta.9 → 3.0.1

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 (208) hide show
  1. package/README.md +2 -2
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2730 -2938
  4. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/dependencies.c59ecaf7fa8379e3a2d0f793fe9784e3060cb64a6d1fe22b8f6a054502021dbe.json +1 -0
  5. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Console-Text.elmi +0 -0
  6. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Console-Text.elmo +0 -0
  7. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  8. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  9. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmi +0 -0
  10. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  11. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Generated-Main.elmi +0 -0
  12. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Generated-Main.elmo +0 -0
  13. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Color.elmi +0 -0
  14. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Color.elmo +0 -0
  15. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Monochrome.elmi +0 -0
  16. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Monochrome.elmo +0 -0
  17. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format.elmi +0 -0
  18. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format.elmo +0 -0
  19. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console.elmi +0 -0
  20. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console.elmo +0 -0
  21. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Highlightable.elmi +0 -0
  22. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Highlightable.elmo +0 -0
  23. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-JUnit.elmi +0 -0
  24. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-JUnit.elmo +0 -0
  25. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Json.elmi +0 -0
  26. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Json.elmo +0 -0
  27. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Reporter.elmi +0 -0
  28. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Reporter.elmo +0 -0
  29. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-TestResults.elmi +0 -0
  30. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-TestResults.elmo +0 -0
  31. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-JsMessage.elmi +0 -0
  32. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-JsMessage.elmo +0 -0
  33. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Console.elmi +0 -0
  34. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Console.elmo +0 -0
  35. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Diff.elmi +0 -0
  36. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Diff.elmo +0 -0
  37. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node.elmi +0 -0
  38. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node.elmo +0 -0
  39. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/d.dat +0 -0
  40. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/i.dat +0 -0
  41. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/lock +0 -0
  42. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/o.dat +0 -0
  43. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm.json +38 -0
  44. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elmTestOutput.js +30883 -0
  45. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/package.json +1 -0
  46. package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/src/Test/Generated/Main.elm +27 -0
  47. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  48. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  49. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  50. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  51. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  52. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  53. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  54. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  55. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +17042 -13855
  56. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  57. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
  58. package/generator/dead-code-review/elm.json +9 -7
  59. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +64 -13
  60. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +66 -50
  61. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  62. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  63. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  64. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  65. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  66. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  67. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  68. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  69. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  70. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
  71. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  72. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
  73. package/generator/review/elm.json +10 -10
  74. package/generator/src/RouteBuilder.elm +93 -128
  75. package/generator/src/SharedTemplate.elm +8 -7
  76. package/generator/src/SiteConfig.elm +3 -2
  77. package/generator/src/basepath-middleware.js +3 -3
  78. package/generator/src/build.js +143 -59
  79. package/generator/src/cli.js +292 -88
  80. package/generator/src/codegen.js +29 -27
  81. package/generator/src/compatibility-key.js +3 -0
  82. package/generator/src/compile-elm.js +43 -26
  83. package/generator/src/config.js +2 -4
  84. package/generator/src/copy-dir.js +2 -2
  85. package/generator/src/dev-server.js +160 -102
  86. package/generator/src/dir-helpers.js +9 -26
  87. package/generator/src/elm-codegen.js +5 -4
  88. package/generator/src/elm-file-constants.js +2 -3
  89. package/generator/src/error-formatter.js +12 -11
  90. package/generator/src/file-helpers.js +3 -4
  91. package/generator/src/generate-template-module-connector.js +23 -23
  92. package/generator/src/init.js +9 -8
  93. package/generator/src/pre-render-html.js +10 -13
  94. package/generator/src/render-test.js +109 -0
  95. package/generator/src/render-worker.js +25 -28
  96. package/generator/src/render.js +320 -143
  97. package/generator/src/request-cache.js +265 -162
  98. package/generator/src/resolve-elm-module.js +64 -0
  99. package/generator/src/rewrite-client-elm-json.js +6 -5
  100. package/generator/src/rewrite-elm-json-help.js +56 -0
  101. package/generator/src/rewrite-elm-json.js +17 -7
  102. package/generator/src/route-codegen-helpers.js +16 -31
  103. package/generator/src/seo-renderer.js +1 -3
  104. package/generator/src/vite-utils.js +1 -2
  105. package/generator/static-code/elm-pages.js +10 -0
  106. package/generator/static-code/hmr.js +79 -13
  107. package/generator/template/app/Api.elm +3 -2
  108. package/generator/template/app/Effect.elm +155 -0
  109. package/generator/template/app/ErrorPage.elm +49 -6
  110. package/generator/template/app/Route/Blog/Slug_.elm +86 -0
  111. package/generator/template/app/Route/Greet.elm +107 -0
  112. package/generator/template/app/Route/Hello.elm +119 -0
  113. package/generator/template/app/Route/Index.elm +26 -25
  114. package/generator/template/app/Shared.elm +38 -39
  115. package/generator/template/app/Site.elm +4 -7
  116. package/generator/template/app/View.elm +9 -8
  117. package/generator/template/codegen/elm.codegen.json +18 -0
  118. package/generator/template/custom-backend-task.ts +3 -0
  119. package/generator/template/elm-pages.config.mjs +13 -0
  120. package/generator/template/elm-tooling.json +0 -3
  121. package/generator/template/elm.json +34 -25
  122. package/generator/template/index.ts +1 -2
  123. package/generator/template/netlify.toml +4 -1
  124. package/generator/template/package.json +10 -4
  125. package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
  126. package/generator/template/script/custom-backend-task.ts +3 -0
  127. package/generator/template/script/elm.json +61 -0
  128. package/generator/template/script/src/AddRoute.elm +312 -0
  129. package/generator/template/script/src/Stars.elm +42 -0
  130. package/package.json +30 -27
  131. package/src/ApiRoute.elm +249 -82
  132. package/src/BackendTask/Custom.elm +325 -0
  133. package/src/BackendTask/Env.elm +90 -0
  134. package/src/{DataSource → BackendTask}/File.elm +171 -56
  135. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  136. package/src/BackendTask/Http.elm +679 -0
  137. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  138. package/src/BackendTask/Internal/Request.elm +69 -0
  139. package/src/BackendTask/Random.elm +79 -0
  140. package/src/BackendTask/Time.elm +47 -0
  141. package/src/BackendTask.elm +531 -0
  142. package/src/FatalError.elm +90 -0
  143. package/src/FormData.elm +21 -18
  144. package/src/Head/Seo.elm +4 -4
  145. package/src/Head.elm +112 -8
  146. package/src/Internal/ApiRoute.elm +7 -5
  147. package/src/Internal/Request.elm +84 -4
  148. package/src/PageServerResponse.elm +6 -1
  149. package/src/Pages/ConcurrentSubmission.elm +127 -0
  150. package/src/Pages/Form.elm +340 -0
  151. package/src/Pages/FormData.elm +19 -0
  152. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  153. package/src/Pages/Internal/FatalError.elm +5 -0
  154. package/src/Pages/Internal/Msg.elm +93 -0
  155. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  156. package/src/Pages/Internal/Platform/Cli.elm +586 -768
  157. package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
  158. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  159. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  160. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  161. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  162. package/src/Pages/Internal/Platform.elm +330 -203
  163. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  164. package/src/Pages/Internal/Script.elm +17 -0
  165. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  166. package/src/Pages/Manifest.elm +52 -11
  167. package/src/Pages/Navigation.elm +85 -0
  168. package/src/Pages/PageUrl.elm +26 -12
  169. package/src/Pages/ProgramConfig.elm +32 -22
  170. package/src/Pages/Script.elm +166 -0
  171. package/src/Pages/SiteConfig.elm +3 -2
  172. package/src/Pages/StaticHttp/Request.elm +2 -2
  173. package/src/Pages/StaticHttpRequest.elm +23 -99
  174. package/src/Pages/Url.elm +3 -3
  175. package/src/PagesMsg.elm +88 -0
  176. package/src/QueryParams.elm +21 -172
  177. package/src/RenderRequest.elm +7 -7
  178. package/src/RequestsAndPending.elm +37 -20
  179. package/src/Result/Extra.elm +26 -0
  180. package/src/Scaffold/Form.elm +569 -0
  181. package/src/Scaffold/Route.elm +1431 -0
  182. package/src/Server/Request.elm +476 -1001
  183. package/src/Server/Response.elm +130 -36
  184. package/src/Server/Session.elm +181 -111
  185. package/src/Server/SetCookie.elm +80 -32
  186. package/src/Stub.elm +53 -0
  187. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  188. package/src/{Path.elm → UrlPath.elm} +33 -36
  189. package/generator/template/public/images/icon-png.png +0 -0
  190. package/src/DataSource/Env.elm +0 -38
  191. package/src/DataSource/Http.elm +0 -446
  192. package/src/DataSource/Internal/Request.elm +0 -20
  193. package/src/DataSource/Port.elm +0 -90
  194. package/src/DataSource.elm +0 -546
  195. package/src/Form/Field.elm +0 -717
  196. package/src/Form/FieldStatus.elm +0 -36
  197. package/src/Form/FieldView.elm +0 -417
  198. package/src/Form/FormData.elm +0 -22
  199. package/src/Form/Validation.elm +0 -391
  200. package/src/Form/Value.elm +0 -118
  201. package/src/Form.elm +0 -1683
  202. package/src/FormDecoder.elm +0 -102
  203. package/src/Pages/FormState.elm +0 -256
  204. package/src/Pages/Generate.elm +0 -1242
  205. package/src/Pages/Internal/Form.elm +0 -17
  206. package/src/Pages/Internal/Platform/Cli.elm.bak +0 -1276
  207. package/src/Pages/Msg.elm +0 -79
  208. package/src/Pages/Transition.elm +0 -70
@@ -1,68 +1,221 @@
1
1
  // @ts-check
2
2
 
3
- const path = require("path");
4
- const mm = require("micromatch");
5
- const matter = require("gray-matter");
6
- const globby = require("globby");
7
- const fsPromises = require("fs").promises;
8
- const preRenderHtml = require("./pre-render-html.js");
9
- const { lookupOrPerform } = require("./request-cache.js");
10
- const kleur = require("kleur");
11
- const cookie = require("cookie-signature");
12
- const { compatibilityKey } = require("../compatibility-key.js");
13
- kleur.enabled = true;
3
+ import * as path from "node:path";
4
+ import { default as mm } from "micromatch";
5
+ import { default as matter } from "gray-matter";
6
+ import * as globby from "globby";
7
+ import * as fsPromises from "node:fs/promises";
8
+ import * as preRenderHtml from "./pre-render-html.js";
9
+ import { lookupOrPerform } from "./request-cache.js";
10
+ import * as kleur from "kleur/colors";
11
+ import * as cookie from "cookie-signature";
12
+ import { compatibilityKey } from "./compatibility-key.js";
13
+ import * as fs from "node:fs";
14
+ import * as crypto from "node:crypto";
15
+ import { restoreColorSafe } from "./error-formatter.js";
14
16
 
15
17
  process.on("unhandledRejection", (error) => {
16
18
  console.error(error);
17
19
  });
18
20
  let foundErrors;
19
- let pendingDataSourceResponses;
20
- let pendingDataSourceCount;
21
21
 
22
- module.exports =
23
- /**
24
- *
25
- * @param {string} basePath
26
- * @param {Object} elmModule
27
- * @param {string} path
28
- * @param {{ method: string; hostname: string; query: Record<string, string | undefined>; headers: Record<string, string>; host: string; pathname: string; port: number | null; protocol: string; rawUrl: string; }} request
29
- * @param {(pattern: string) => void} addDataSourceWatcher
30
- * @param {boolean} hasFsAccess
31
- * @returns
32
- */
33
- async function run(
22
+ /**
23
+ *
24
+ * @param {string} basePath
25
+ * @param {Object} elmModule
26
+ * @param {string} path
27
+ * @param {{ method: string; hostname: string; query: Record<string, string | undefined>; headers: Record<string, string>; host: string; pathname: string; port: number | null; protocol: string; rawUrl: string; }} request
28
+ * @param {(pattern: string) => void} addBackendTaskWatcher
29
+ * @param {boolean} hasFsAccess
30
+ * @returns
31
+ */
32
+ export async function render(
33
+ portsFile,
34
+ basePath,
35
+ elmModule,
36
+ mode,
37
+ path,
38
+ request,
39
+ addBackendTaskWatcher,
40
+ hasFsAccess
41
+ ) {
42
+ // const { fs, resetInMemoryFs } = require("./request-cache-fs.js")(hasFsAccess);
43
+ // resetInMemoryFs();
44
+ foundErrors = false;
45
+ // since init/update are never called in pre-renders, and BackendTask.Http is called using pure NodeJS HTTP fetching
46
+ // we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
47
+ global.XMLHttpRequest = {};
48
+ const result = await runElmApp(
34
49
  portsFile,
35
50
  basePath,
36
51
  elmModule,
37
52
  mode,
38
53
  path,
39
54
  request,
40
- addDataSourceWatcher,
55
+ addBackendTaskWatcher,
41
56
  hasFsAccess
42
- ) {
43
- const { fs, resetInMemoryFs } = require("./request-cache-fs.js")(
44
- hasFsAccess
45
- );
46
- resetInMemoryFs();
47
- foundErrors = false;
48
- pendingDataSourceResponses = [];
49
- pendingDataSourceCount = 0;
50
- // since init/update are never called in pre-renders, and DataSource.Http is called using pure NodeJS HTTP fetching
51
- // we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
52
- XMLHttpRequest = {};
53
- const result = await runElmApp(
57
+ );
58
+ return result;
59
+ }
60
+
61
+ /**
62
+ * @param {Object} elmModule
63
+ * @returns
64
+ * @param {string[]} cliOptions
65
+ * @param {any} portsFile
66
+ * @param {string} scriptModuleName
67
+ */
68
+ export async function runGenerator(
69
+ cliOptions,
70
+ portsFile,
71
+ elmModule,
72
+ scriptModuleName
73
+ ) {
74
+ global.isRunningGenerator = true;
75
+ // const { fs, resetInMemoryFs } = require("./request-cache-fs.js")(true);
76
+ // resetInMemoryFs();
77
+ foundErrors = false;
78
+ // since init/update are never called in pre-renders, and BackendTask.Http is called using pure NodeJS HTTP fetching
79
+ // we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
80
+ global.XMLHttpRequest = {};
81
+ try {
82
+ const result = await runGeneratorAppHelp(
83
+ cliOptions,
54
84
  portsFile,
55
- basePath,
85
+ "",
56
86
  elmModule,
57
- mode,
58
- path,
59
- request,
60
- addDataSourceWatcher,
61
- fs,
62
- hasFsAccess
87
+ scriptModuleName,
88
+ "production",
89
+ "",
90
+ true
63
91
  );
64
92
  return result;
65
- };
93
+ } catch (error) {
94
+ process.exitCode = 1;
95
+ console.log(restoreColorSafe(error));
96
+ }
97
+ }
98
+ /**
99
+ * @param {string} basePath
100
+ * @param {Object} elmModule
101
+ * @param {string} pagePath
102
+ * @param {string} mode
103
+ * @returns {Promise<({is404: boolean;} & ({kind: 'json';contentJson: string;} | {kind: 'html';htmlString: string;} | {kind: 'api-response';body: string;}))>}
104
+ * @param {string[]} cliOptions
105
+ * @param {any} portsFile
106
+ * @param {typeof import("fs") | import("memfs").IFs} fs
107
+ * @param {boolean} hasFsAccess
108
+ * @param {string} scriptModuleName
109
+ */
110
+ function runGeneratorAppHelp(
111
+ cliOptions,
112
+ portsFile,
113
+ basePath,
114
+ elmModule,
115
+ scriptModuleName,
116
+ mode,
117
+ pagePath,
118
+ hasFsAccess
119
+ ) {
120
+ const isDevServer = mode !== "build";
121
+ let patternsToWatch = new Set();
122
+ let app = null;
123
+ let killApp;
124
+ return new Promise((resolve, reject) => {
125
+ const isBytes = pagePath.match(/content\.dat\/?$/);
126
+
127
+ app = elmModule.Elm.Main.init({
128
+ flags: {
129
+ compatibilityKey,
130
+ argv: ["", `elm-pages run ${scriptModuleName}`, ...cliOptions],
131
+ versionMessage: "1.2.3",
132
+ },
133
+ });
134
+
135
+ killApp = () => {
136
+ app.ports.toJsPort.unsubscribe(portHandler);
137
+ app.die();
138
+ app = null;
139
+ // delete require.cache[require.resolve(compiledElmPath)];
140
+ };
141
+
142
+ async function portHandler(/** @type { FromElm } */ newThing) {
143
+ let fromElm;
144
+ let contentDatPayload;
145
+
146
+ fromElm = newThing;
147
+ if (fromElm.command === "log") {
148
+ console.log(fromElm.value);
149
+ } else if (fromElm.tag === "ApiResponse") {
150
+ // Finished successfully
151
+ process.exit(0);
152
+ } else if (fromElm.tag === "PageProgress") {
153
+ const args = fromElm.args[0];
154
+
155
+ if (isBytes) {
156
+ resolve({
157
+ kind: "bytes",
158
+ is404: false,
159
+ contentJson: JSON.stringify({
160
+ staticData: args.contentJson,
161
+ is404: false,
162
+ }),
163
+ statusCode: args.statusCode,
164
+ headers: args.headers,
165
+ contentDatPayload,
166
+ });
167
+ } else {
168
+ resolve(
169
+ outputString(basePath, fromElm, isDevServer, contentDatPayload)
170
+ );
171
+ }
172
+ } else if (fromElm.tag === "DoHttp") {
173
+ app.ports.gotBatchSub.send(
174
+ Object.fromEntries(
175
+ await Promise.all(
176
+ fromElm.args[0].map(([requestHash, requestToPerform]) => {
177
+ if (
178
+ requestToPerform.url !== "elm-pages-internal://port" &&
179
+ requestToPerform.url.startsWith("elm-pages-internal://")
180
+ ) {
181
+ return runInternalJob(
182
+ requestHash,
183
+ app,
184
+ mode,
185
+ requestToPerform,
186
+ hasFsAccess,
187
+ patternsToWatch
188
+ );
189
+ } else {
190
+ return runHttpJob(
191
+ requestHash,
192
+ portsFile,
193
+ app,
194
+ mode,
195
+ requestToPerform,
196
+ hasFsAccess,
197
+ requestToPerform
198
+ );
199
+ }
200
+ })
201
+ )
202
+ )
203
+ );
204
+ } else if (fromElm.tag === "Errors") {
205
+ foundErrors = true;
206
+ reject(fromElm.args[0].errorsJson);
207
+ } else {
208
+ console.log(fromElm);
209
+ }
210
+ }
211
+ app.ports.toJsPort.subscribe(portHandler);
212
+ }).finally(() => {
213
+ try {
214
+ killApp();
215
+ killApp = null;
216
+ } catch (error) {}
217
+ });
218
+ }
66
219
 
67
220
  /**
68
221
  * @param {string} basePath
@@ -70,7 +223,7 @@ module.exports =
70
223
  * @param {string} pagePath
71
224
  * @param {string} mode
72
225
  * @param {{ method: string; hostname: string; query: string; headers: Object; host: string; pathname: string; port: string; protocol: string; rawUrl: string; }} request
73
- * @param {(pattern: string) => void} addDataSourceWatcher
226
+ * @param {(pattern: string) => void} addBackendTaskWatcher
74
227
  * @returns {Promise<({is404: boolean} & ( { kind: 'json'; contentJson: string} | { kind: 'html'; htmlString: string } | { kind: 'api-response'; body: string; }) )>}
75
228
  */
76
229
  function runElmApp(
@@ -80,8 +233,7 @@ function runElmApp(
80
233
  mode,
81
234
  pagePath,
82
235
  request,
83
- addDataSourceWatcher,
84
- fs,
236
+ addBackendTaskWatcher,
85
237
  hasFsAccess
86
238
  ) {
87
239
  const isDevServer = mode !== "build";
@@ -95,7 +247,6 @@ function runElmApp(
95
247
  .replace(/content\.dat\/?$/, "");
96
248
 
97
249
  const modifiedRequest = { ...request, path: route };
98
- // console.log("StaticHttp cache keys", Object.keys(global.staticHttpCache));
99
250
  app = elmModule.Elm.Main.init({
100
251
  flags: {
101
252
  mode,
@@ -129,9 +280,6 @@ function runElmApp(
129
280
  console.log(fromElm.value);
130
281
  } else if (fromElm.tag === "ApiResponse") {
131
282
  const args = fromElm.args[0];
132
- if (mode === "build") {
133
- global.staticHttpCache = args.staticHttpCache;
134
- }
135
283
 
136
284
  resolve({
137
285
  kind: "api-response",
@@ -141,10 +289,6 @@ function runElmApp(
141
289
  });
142
290
  } else if (fromElm.tag === "PageProgress") {
143
291
  const args = fromElm.args[0];
144
- if (mode === "build") {
145
- global.staticHttpCache = args.staticHttpCache;
146
- }
147
-
148
292
  if (isBytes) {
149
293
  resolve({
150
294
  kind: "bytes",
@@ -163,30 +307,37 @@ function runElmApp(
163
307
  );
164
308
  }
165
309
  } else if (fromElm.tag === "DoHttp") {
166
- const requestToPerform = fromElm.args[0];
167
- if (
168
- requestToPerform.url !== "elm-pages-internal://port" &&
169
- requestToPerform.url.startsWith("elm-pages-internal://")
170
- ) {
171
- runInternalJob(
172
- app,
173
- mode,
174
- requestToPerform,
175
- fs,
176
- hasFsAccess,
177
- patternsToWatch
178
- );
179
- } else {
180
- runHttpJob(
181
- portsFile,
182
- app,
183
- mode,
184
- requestToPerform,
185
- fs,
186
- hasFsAccess,
187
- fromElm.args[1]
188
- );
189
- }
310
+ app.ports.gotBatchSub.send(
311
+ Object.fromEntries(
312
+ await Promise.all(
313
+ fromElm.args[0].map(([requestHash, requestToPerform]) => {
314
+ if (
315
+ requestToPerform.url !== "elm-pages-internal://port" &&
316
+ requestToPerform.url.startsWith("elm-pages-internal://")
317
+ ) {
318
+ return runInternalJob(
319
+ requestHash,
320
+ app,
321
+ mode,
322
+ requestToPerform,
323
+ hasFsAccess,
324
+ patternsToWatch
325
+ );
326
+ } else {
327
+ return runHttpJob(
328
+ requestHash,
329
+ portsFile,
330
+ app,
331
+ mode,
332
+ requestToPerform,
333
+ hasFsAccess,
334
+ requestToPerform
335
+ );
336
+ }
337
+ })
338
+ )
339
+ )
340
+ );
190
341
  } else if (fromElm.tag === "Errors") {
191
342
  foundErrors = true;
192
343
  reject(fromElm.args[0].errorsJson);
@@ -197,7 +348,7 @@ function runElmApp(
197
348
  app.ports.toJsPort.subscribe(portHandler);
198
349
  app.ports.sendPageData.subscribe(portHandler);
199
350
  }).finally(() => {
200
- addDataSourceWatcher(patternsToWatch);
351
+ addBackendTaskWatcher(patternsToWatch);
201
352
  try {
202
353
  killApp();
203
354
  killApp = null;
@@ -246,17 +397,16 @@ async function outputString(
246
397
  /** @typedef { { head: any[]; errors: any[]; contentJson: any[]; html: string; route: string; title: string; } } Arg */
247
398
 
248
399
  async function runHttpJob(
400
+ requestHash,
249
401
  portsFile,
250
402
  app,
251
403
  mode,
252
404
  requestToPerform,
253
- fs,
254
405
  hasFsAccess,
255
406
  useCache
256
407
  ) {
257
- pendingDataSourceCount += 1;
258
408
  try {
259
- const responseFilePath = await lookupOrPerform(
409
+ const lookupResponse = await lookupOrPerform(
260
410
  portsFile,
261
411
  mode,
262
412
  requestToPerform,
@@ -264,17 +414,31 @@ async function runHttpJob(
264
414
  useCache
265
415
  );
266
416
 
267
- pendingDataSourceResponses.push({
268
- request: requestToPerform,
269
- response: JSON.parse(
270
- (await fs.promises.readFile(responseFilePath, "utf8")).toString()
271
- ),
272
- });
417
+ if (lookupResponse.kind === "cache-response-path") {
418
+ const responseFilePath = lookupResponse.value;
419
+ return [
420
+ requestHash,
421
+ {
422
+ request: requestToPerform,
423
+ response: JSON.parse(
424
+ (await fs.promises.readFile(responseFilePath, "utf8")).toString()
425
+ ),
426
+ },
427
+ ];
428
+ } else if (lookupResponse.kind === "response-json") {
429
+ return [
430
+ requestHash,
431
+ {
432
+ request: requestToPerform,
433
+ response: lookupResponse.value,
434
+ },
435
+ ];
436
+ } else {
437
+ throw `Unexpected kind ${lookupResponse}`;
438
+ }
273
439
  } catch (error) {
274
- sendError(app, error);
275
- } finally {
276
- pendingDataSourceCount -= 1;
277
- flushIfDone(app);
440
+ console.log("@@@ERROR", error);
441
+ // sendError(app, error);
278
442
  }
279
443
  }
280
444
 
@@ -292,46 +456,54 @@ function jsonResponse(request, json) {
292
456
  }
293
457
 
294
458
  async function runInternalJob(
459
+ requestHash,
295
460
  app,
296
461
  mode,
297
462
  requestToPerform,
298
- fs,
299
463
  hasFsAccess,
300
464
  patternsToWatch
301
465
  ) {
302
466
  try {
303
- pendingDataSourceCount += 1;
304
-
305
- if (requestToPerform.url === "elm-pages-internal://read-file") {
306
- pendingDataSourceResponses.push(
307
- await readFileJobNew(requestToPerform, patternsToWatch)
308
- );
467
+ if (requestToPerform.url === "elm-pages-internal://log") {
468
+ return [requestHash, await runLogJob(requestToPerform)];
469
+ } else if (requestToPerform.url === "elm-pages-internal://read-file") {
470
+ return [
471
+ requestHash,
472
+ await readFileJobNew(requestToPerform, patternsToWatch),
473
+ ];
309
474
  } else if (requestToPerform.url === "elm-pages-internal://glob") {
310
- pendingDataSourceResponses.push(
311
- await runGlobNew(requestToPerform, patternsToWatch)
312
- );
475
+ return [requestHash, await runGlobNew(requestToPerform, patternsToWatch)];
476
+ } else if (requestToPerform.url === "elm-pages-internal://randomSeed") {
477
+ return [
478
+ requestHash,
479
+ jsonResponse(
480
+ requestToPerform,
481
+ crypto.getRandomValues(new Uint32Array(1))[0]
482
+ ),
483
+ ];
484
+ } else if (requestToPerform.url === "elm-pages-internal://now") {
485
+ return [requestHash, jsonResponse(requestToPerform, Date.now())];
313
486
  } else if (requestToPerform.url === "elm-pages-internal://env") {
314
- pendingDataSourceResponses.push(
315
- await runEnvJob(requestToPerform, patternsToWatch)
316
- );
487
+ return [requestHash, await runEnvJob(requestToPerform, patternsToWatch)];
317
488
  } else if (requestToPerform.url === "elm-pages-internal://encrypt") {
318
- pendingDataSourceResponses.push(
319
- await runEncryptJob(requestToPerform, patternsToWatch)
320
- );
489
+ return [
490
+ requestHash,
491
+ await runEncryptJob(requestToPerform, patternsToWatch),
492
+ ];
321
493
  } else if (requestToPerform.url === "elm-pages-internal://decrypt") {
322
- pendingDataSourceResponses.push(
323
- await runDecryptJob(requestToPerform, patternsToWatch)
324
- );
494
+ return [
495
+ requestHash,
496
+ await runDecryptJob(requestToPerform, patternsToWatch),
497
+ ];
498
+ } else if (requestToPerform.url === "elm-pages-internal://write-file") {
499
+ return [requestHash, await runWriteFileJob(requestToPerform)];
325
500
  } else {
326
- throw `Unexpected internal DataSource request format: ${kleur.yellow(
501
+ throw `Unexpected internal BackendTask request format: ${kleur.yellow(
327
502
  JSON.stringify(2, null, requestToPerform)
328
503
  )}`;
329
504
  }
330
505
  } catch (error) {
331
506
  sendError(app, error);
332
- } finally {
333
- pendingDataSourceCount -= 1;
334
- flushIfDone(app);
335
507
  }
336
508
  }
337
509
 
@@ -346,6 +518,7 @@ async function readFileJobNew(req, patternsToWatch) {
346
518
  path.join(process.env.LAMBDA_TASK_ROOT || process.cwd(), filePath)
347
519
  )
348
520
  ).toString();
521
+ // TODO does this throw an error if there is invalid frontmatter?
349
522
  const parsedFile = matter(fileContents);
350
523
 
351
524
  return jsonResponse(req, {
@@ -354,10 +527,24 @@ async function readFileJobNew(req, patternsToWatch) {
354
527
  rawFile: fileContents,
355
528
  });
356
529
  } catch (error) {
530
+ return jsonResponse(req, {
531
+ errorCode: error.code,
532
+ });
533
+ }
534
+ }
535
+ async function runWriteFileJob(req) {
536
+ const data = req.body.args[0];
537
+ try {
538
+ const fullPathToWrite = path.join(process.cwd(), data.path);
539
+ await fsPromises.mkdir(path.dirname(fullPathToWrite), { recursive: true });
540
+ await fsPromises.writeFile(fullPathToWrite, data.body);
541
+ return jsonResponse(req, null);
542
+ } catch (error) {
543
+ console.trace(error);
357
544
  throw {
358
- title: "DataSource.File Error",
359
- message: `A DataSource.File read failed because I couldn't find this file: ${kleur.yellow(
360
- filePath
545
+ title: "BackendTask Error",
546
+ message: `BackendTask.Generator.writeFile failed for file path: ${kleur.yellow(
547
+ data.path
361
548
  )}\n${kleur.red(error.toString())}`,
362
549
  };
363
550
  }
@@ -366,7 +553,7 @@ async function readFileJobNew(req, patternsToWatch) {
366
553
  async function runGlobNew(req, patternsToWatch) {
367
554
  try {
368
555
  const { pattern, options } = req.body.args[0];
369
- const matchedPaths = await globby(pattern, options);
556
+ const matchedPaths = await globby.globby(pattern, options);
370
557
  patternsToWatch.add(pattern);
371
558
 
372
559
  return jsonResponse(
@@ -384,6 +571,15 @@ async function runGlobNew(req, patternsToWatch) {
384
571
  }
385
572
  }
386
573
 
574
+ async function runLogJob(req) {
575
+ try {
576
+ console.log(req.body.args[0].message);
577
+ return jsonResponse(req, null);
578
+ } catch (e) {
579
+ console.log(`Error performing env '${JSON.stringify(req.body)}'`);
580
+ throw e;
581
+ }
582
+ }
387
583
  async function runEnvJob(req, patternsToWatch) {
388
584
  try {
389
585
  const expectedEnv = req.body.args[0];
@@ -404,7 +600,7 @@ async function runEncryptJob(req, patternsToWatch) {
404
600
  );
405
601
  } catch (e) {
406
602
  throw {
407
- title: "DataSource Encrypt Error",
603
+ title: "BackendTask Encrypt Error",
408
604
  message:
409
605
  e.toString() + e.stack + "\n\n" + JSON.stringify(rawRequest, null, 2),
410
606
  };
@@ -421,32 +617,13 @@ async function runDecryptJob(req, patternsToWatch) {
421
617
  return jsonResponse(req, JSON.parse(signed || "null"));
422
618
  } catch (e) {
423
619
  throw {
424
- title: "DataSource Decrypt Error",
620
+ title: "BackendTask Decrypt Error",
425
621
  message:
426
622
  e.toString() + e.stack + "\n\n" + JSON.stringify(rawRequest, null, 2),
427
623
  };
428
624
  }
429
625
  }
430
626
 
431
- function flushIfDone(app) {
432
- if (foundErrors) {
433
- pendingDataSourceResponses = [];
434
- } else if (pendingDataSourceCount === 0) {
435
- // console.log(
436
- // `Flushing ${pendingDataSourceResponses.length} items in ${timeUntilThreshold}ms`
437
- // );
438
-
439
- flushQueue(app);
440
- }
441
- }
442
-
443
- function flushQueue(app) {
444
- const temp = pendingDataSourceResponses;
445
- pendingDataSourceResponses = [];
446
- // console.log("@@@ FLUSHING", temp.length);
447
- app.ports.gotBatchSub.send(temp);
448
- }
449
-
450
627
  /**
451
628
  * @param {{ ports: { fromJsPort: { send: (arg0: { tag: string; data: any; }) => void; }; }; }} app
452
629
  * @param {{ message: string; title: string; }} error