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,7 +1,7 @@
1
1
  /**
2
2
  * @param {string[]} name
3
3
  */
4
- function routeParams(name) {
4
+ export function routeParams(name) {
5
5
  return name
6
6
  .map((section) => {
7
7
  const routeParamMatch = section.match(/([A-Z][A-Za-z0-9]*)__?$/);
@@ -17,7 +17,7 @@ function routeParams(name) {
17
17
  * @param {string[]} name
18
18
  * @returns {Segment[]}
19
19
  */
20
- function parseRouteParams(name) {
20
+ export function parseRouteParams(name) {
21
21
  return name.flatMap((section) => {
22
22
  const routeParamMatch = section.match(/([A-Z][A-Za-z0-9]*)(_?_?)$/);
23
23
  const maybeParam = (routeParamMatch && routeParamMatch[1]) || "TODO";
@@ -68,7 +68,7 @@ function parseRouteParams(name) {
68
68
  * @param {string[]} name
69
69
  * @returns {( Segment | {kind: 'static'; name: string})[]}
70
70
  */
71
- function parseRouteParamsWithStatic(name) {
71
+ export function parseRouteParamsWithStatic(name) {
72
72
  return name.flatMap((section) => {
73
73
  const routeParamMatch = section.match(/([A-Z][A-Za-z0-9]*)(_?_?)$/);
74
74
  const maybeParam = (routeParamMatch && routeParamMatch[1]) || "TODO";
@@ -123,7 +123,7 @@ function parseRouteParamsWithStatic(name) {
123
123
  * @param {string[]} name
124
124
  * @returns {string}
125
125
  */
126
- function routeVariantDefinition(name) {
126
+ export function routeVariantDefinition(name) {
127
127
  const newLocal = parseRouteParams(name);
128
128
  if (newLocal.length == 0) {
129
129
  return routeVariant(name);
@@ -151,7 +151,7 @@ function routeVariantDefinition(name) {
151
151
  * @param {string[]} name
152
152
  * @returns {string}
153
153
  */
154
- function toPathPattern(name) {
154
+ export function toPathPattern(name) {
155
155
  return (
156
156
  "/" +
157
157
  parseRouteParamsWithStatic(name)
@@ -181,7 +181,7 @@ function toPathPattern(name) {
181
181
  * @param {string[]} name
182
182
  * @returns {string[]}
183
183
  */
184
- function toPathPatterns(name) {
184
+ export function toPathPatterns(name) {
185
185
  const segments = parseRouteParamsWithStatic(name);
186
186
 
187
187
  const lastSegment = segments[segments.length - 1];
@@ -199,7 +199,7 @@ function toPathPatterns(name) {
199
199
  /**
200
200
  * @param {string[]} segments
201
201
  */
202
- function joinPath(segments) {
202
+ export function joinPath(segments) {
203
203
  const joined = segments.join("/");
204
204
  if (joined.startsWith("/")) {
205
205
  return joined;
@@ -211,7 +211,7 @@ function joinPath(segments) {
211
211
  /**
212
212
  * @return {string[]}
213
213
  */
214
- function newHelper(segments) {
214
+ export function newHelper(segments) {
215
215
  return segments.map((param) => {
216
216
  switch (param.kind) {
217
217
  case "static": {
@@ -238,7 +238,7 @@ function newHelper(segments) {
238
238
  * @param {string[]} name
239
239
  * @returns {string}
240
240
  */
241
- function toElmPathPattern(name) {
241
+ export function toElmPathPattern(name) {
242
242
  const parsedSegments = parseRouteParamsWithStatic(name);
243
243
 
244
244
  const foundEndings = parsedSegments.flatMap((segment) => {
@@ -297,14 +297,14 @@ function toElmPathPattern(name) {
297
297
  * @param {string} input
298
298
  * @returns {string}
299
299
  */
300
- function camelToKebab(input) {
300
+ export function camelToKebab(input) {
301
301
  return input.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
302
302
  }
303
303
 
304
304
  /**
305
305
  * @param {string[]} name
306
306
  */
307
- function paramsRecord(name) {
307
+ export function paramsRecord(name) {
308
308
  return `{ ${parseRouteParams(name).map((param) => {
309
309
  switch (param.kind) {
310
310
  case "dynamic": {
@@ -326,7 +326,7 @@ function paramsRecord(name) {
326
326
  /**
327
327
  * @param {string[]} name
328
328
  */
329
- function routeVariant(name) {
329
+ export function routeVariant(name) {
330
330
  return `${name.join("__")}`;
331
331
  }
332
332
 
@@ -334,44 +334,29 @@ function routeVariant(name) {
334
334
  * @param {string[]} name
335
335
  * @param {string} paramsName
336
336
  */
337
- function destructureRoute(name, paramsName) {
337
+ export function destructureRoute(name, paramsName) {
338
338
  return emptyRouteParams(name)
339
339
  ? `Route.${routeVariant(name)}`
340
340
  : `(Route.${routeVariant(name)} ${paramsName})`;
341
341
  }
342
342
 
343
- function referenceRouteParams(name, paramsName) {
343
+ export function referenceRouteParams(name, paramsName) {
344
344
  return emptyRouteParams(name) ? `{}` : paramsName;
345
345
  }
346
346
  /**
347
347
  * @param {string[]} name
348
348
  */
349
- function emptyRouteParams(name) {
349
+ export function emptyRouteParams(name) {
350
350
  return parseRouteParams(name).length === 0;
351
351
  }
352
352
 
353
353
  /**
354
354
  * @param {string} name
355
355
  */
356
- function toFieldName(name) {
356
+ export function toFieldName(name) {
357
357
  if (name === "SPLAT") {
358
358
  return "splat";
359
359
  } else {
360
360
  return name.charAt(0).toLowerCase() + name.slice(1);
361
361
  }
362
362
  }
363
-
364
- module.exports = {
365
- routeParams,
366
- routeVariantDefinition,
367
- routeVariant,
368
- toFieldName,
369
- paramsRecord,
370
- toPathPattern,
371
- toPathPatterns,
372
- parseRouteParams,
373
- parseRouteParamsWithStatic,
374
- toElmPathPattern,
375
- destructureRoute,
376
- referenceRouteParams,
377
- };
@@ -1,11 +1,9 @@
1
- module.exports = { gather };
2
-
3
1
  /** @typedef { { type: 'root'; keyValuePair: [string, string] } } RootTagModifier */
4
2
 
5
3
  /**
6
4
  * @param {( SeoTag | RootTagModifier )[]} tags
7
5
  */
8
- function gather(tags) {
6
+ export function gather(tags) {
9
7
  const withoutRootModifiers = tags.flatMap((value) => {
10
8
  if (value.type === "root") {
11
9
  return [];
@@ -4,7 +4,7 @@
4
4
  * @param {...import('vite').UserConfig} configs
5
5
  * @returns {import('vite').UserConfig}
6
6
  */
7
- function merge_vite_configs(...configs) {
7
+ export function merge_vite_configs(...configs) {
8
8
  return deep_merge(
9
9
  ...configs.map((config) => ({
10
10
  ...config,
@@ -75,4 +75,3 @@ function merge_into(a, b) {
75
75
  }
76
76
  }
77
77
  }
78
- module.exports = { merge_vite_configs };
@@ -103,4 +103,14 @@ function find_anchor(node) {
103
103
  return /** @type {HTMLAnchorElement} */ (node);
104
104
  }
105
105
 
106
+ Object.defineProperty(SubmitEvent.prototype, "fields", {
107
+ get: function fields() {
108
+ let formData = new FormData(this.currentTarget);
109
+ if (this.submitter?.name) {
110
+ formData.append(this.submitter.name, this.submitter.value);
111
+ }
112
+ return [...formData.entries()];
113
+ },
114
+ });
115
+
106
116
  setup();
@@ -5,15 +5,69 @@ var eventSource = null;
5
5
  let updateAppContentJson = new Promise((resolve, reject) => resolve(() => {}));
6
6
 
7
7
  function connect(sendContentJsonPort, initialErrorPage) {
8
+ let reconnectFrequencySeconds = 1;
9
+ // reconnect logic based on: https://stackoverflow.com/a/61148682/383983
8
10
  // Listen for the server to tell us that an HMR update is available
9
- eventSource = new EventSource("/stream");
10
- window.reloadOnOk = initialErrorPage;
11
- if (initialErrorPage) {
12
- handleEvent(sendContentJsonPort, { data: "content.dat" });
11
+ function waitFunc() {
12
+ return reconnectFrequencySeconds * 1000;
13
13
  }
14
- eventSource.onmessage = async function (evt) {
15
- handleEvent(sendContentJsonPort, evt);
16
- };
14
+ function tryToSetupFunc() {
15
+ setupEventSource();
16
+ reconnectFrequencySeconds *= 2;
17
+ if (reconnectFrequencySeconds >= 8) {
18
+ reconnectFrequencySeconds = 8;
19
+ }
20
+ }
21
+ function reconnectFunc() {
22
+ console.log(
23
+ `Attempting dev server reconnect in ${reconnectFrequencySeconds}...`
24
+ );
25
+ setTimeout(tryToSetupFunc, waitFunc());
26
+ }
27
+ function setupEventSource() {
28
+ eventSource = new EventSource("/stream");
29
+ window.reloadOnOk = initialErrorPage;
30
+
31
+ try {
32
+ if (initialErrorPage) {
33
+ handleEvent(sendContentJsonPort, { data: "content.dat" });
34
+ }
35
+ } catch (e) {}
36
+ eventSource.onopen = async function () {
37
+ hideError();
38
+ reconnectFrequencySeconds = 1;
39
+ };
40
+ eventSource.onerror = async function (evt) {
41
+ eventSource && eventSource.close();
42
+ reconnectFunc();
43
+
44
+ showReconnectBanner();
45
+ };
46
+ eventSource.onmessage = async function (evt) {
47
+ handleEvent(sendContentJsonPort, evt);
48
+ };
49
+ }
50
+
51
+ setupEventSource();
52
+ }
53
+
54
+ function showReconnectBanner() {
55
+ showError({
56
+ type: "compile-errors",
57
+ errors: [
58
+ {
59
+ path: "",
60
+ name: "",
61
+ problems: [
62
+ {
63
+ title: "",
64
+ // region: "",
65
+ message: ["Dev server is disconnected..."],
66
+ },
67
+ ],
68
+ },
69
+ ],
70
+ });
17
71
  }
18
72
 
19
73
  async function handleEvent(sendContentJsonPort, evt) {
@@ -28,8 +82,7 @@ async function handleEvent(sendContentJsonPort, evt) {
28
82
 
29
83
  try {
30
84
  await fetchContentJson;
31
- const elmJsResponse = await elmJsRequest;
32
- thenApplyHmr(elmJsResponse);
85
+ thenApplyHmr(await elmJsRequest);
33
86
  } catch (errorJson) {
34
87
  if (typeof errorJson === "string") {
35
88
  errorJson = JSON.parse(errorJson);
@@ -116,8 +169,7 @@ var myDisposeCallback = function () {
116
169
  var module = {
117
170
  hot: {
118
171
  accept: async function () {
119
- const sendInUpdatedContentJson = await updateAppContentJson;
120
- sendInUpdatedContentJson();
172
+ (await updateAppContentJson)();
121
173
  },
122
174
 
123
175
  dispose: function (callback) {
@@ -224,8 +276,11 @@ function htmlSanitize(str, type) {
224
276
  );
225
277
  }
226
278
 
227
- const parseHeader = (title, path) =>
228
- `-- ${title.replace("-", " ")} --------------- ${path}`;
279
+ function parseHeader(title, path) {
280
+ return `-- ${(title || "ERROR").replace("-", " ")} --------------- ${
281
+ path || ""
282
+ }`;
283
+ }
229
284
 
230
285
  /*
231
286
  |-------------------------------------------------------------------------------
@@ -253,6 +308,14 @@ const parseConsoleErrors =
253
308
  * */
254
309
  (info) => {
255
310
  if (info.rule) {
311
+ if (info.details) {
312
+ return joinMessage(
313
+ info.details.reduce(consoleMsg, {
314
+ error: [consoleHeader(info.rule, path)],
315
+ style: [styleColor("blue")],
316
+ })
317
+ );
318
+ }
256
319
  return joinMessage(
257
320
  info.formatted.reduce(consoleMsg, {
258
321
  error: [consoleHeader(info.rule, path)],
@@ -313,6 +376,9 @@ const parseHtmlErrors = (path) => (info) => {
313
376
  if (info.rule) {
314
377
  return info.formatted.reduce(htmlMsg, htmlHeader(info.rule, path));
315
378
  } else {
379
+ if (info.details) {
380
+ return info.details.reduce(htmlMsg, htmlHeader(info.title, path));
381
+ }
316
382
  return info.message.reduce(htmlMsg, htmlHeader(info.title, path));
317
383
  }
318
384
  };
@@ -1,14 +1,15 @@
1
1
  module Api exposing (routes)
2
2
 
3
3
  import ApiRoute exposing (ApiRoute)
4
- import DataSource exposing (DataSource)
4
+ import BackendTask exposing (BackendTask)
5
+ import FatalError exposing (FatalError)
5
6
  import Html exposing (Html)
6
7
  import Pages.Manifest as Manifest
7
8
  import Route exposing (Route)
8
9
 
9
10
 
10
11
  routes :
11
- DataSource (List Route)
12
+ BackendTask FatalError (List Route)
12
13
  -> (Maybe { indent : Int, newLines : Bool } -> Html Never -> String)
13
14
  -> List (ApiRoute ApiRoute.Response)
14
15
  routes getStaticRoutes htmlToString =
@@ -0,0 +1,155 @@
1
+ module Effect exposing (Effect(..), batch, fromCmd, map, none, perform)
2
+
3
+ {-|
4
+
5
+ @docs Effect, batch, fromCmd, map, none, perform
6
+
7
+ -}
8
+
9
+ import Browser.Navigation
10
+ import Form
11
+ import Http
12
+ import Json.Decode as Decode
13
+ import Pages.Fetcher
14
+ import Url exposing (Url)
15
+
16
+
17
+ {-| -}
18
+ type Effect msg
19
+ = None
20
+ | Cmd (Cmd msg)
21
+ | Batch (List (Effect msg))
22
+ | GetStargazers (Result Http.Error Int -> msg)
23
+ | SetField { formId : String, name : String, value : String }
24
+ | FetchRouteData
25
+ { data : Maybe FormData
26
+ , toMsg : Result Http.Error Url -> msg
27
+ }
28
+ | Submit
29
+ { values : FormData
30
+ , toMsg : Result Http.Error Url -> msg
31
+ }
32
+ | SubmitFetcher (Pages.Fetcher.Fetcher msg)
33
+
34
+
35
+ {-| -}
36
+ type alias RequestInfo =
37
+ { contentType : String
38
+ , body : String
39
+ }
40
+
41
+
42
+ {-| -}
43
+ none : Effect msg
44
+ none =
45
+ None
46
+
47
+
48
+ {-| -}
49
+ batch : List (Effect msg) -> Effect msg
50
+ batch =
51
+ Batch
52
+
53
+
54
+ {-| -}
55
+ fromCmd : Cmd msg -> Effect msg
56
+ fromCmd =
57
+ Cmd
58
+
59
+
60
+ {-| -}
61
+ map : (a -> b) -> Effect a -> Effect b
62
+ map fn effect =
63
+ case effect of
64
+ None ->
65
+ None
66
+
67
+ Cmd cmd ->
68
+ Cmd (Cmd.map fn cmd)
69
+
70
+ Batch list ->
71
+ Batch (List.map (map fn) list)
72
+
73
+ GetStargazers toMsg ->
74
+ GetStargazers (toMsg >> fn)
75
+
76
+ FetchRouteData fetchInfo ->
77
+ FetchRouteData
78
+ { data = fetchInfo.data
79
+ , toMsg = fetchInfo.toMsg >> fn
80
+ }
81
+
82
+ Submit fetchInfo ->
83
+ Submit
84
+ { values = fetchInfo.values
85
+ , toMsg = fetchInfo.toMsg >> fn
86
+ }
87
+
88
+ SetField info ->
89
+ SetField info
90
+
91
+ SubmitFetcher fetcher ->
92
+ fetcher
93
+ |> Pages.Fetcher.map fn
94
+ |> SubmitFetcher
95
+
96
+
97
+ {-| -}
98
+ perform :
99
+ { fetchRouteData :
100
+ { data : Maybe FormData
101
+ , toMsg : Result Http.Error Url -> pageMsg
102
+ }
103
+ -> Cmd msg
104
+ , submit :
105
+ { values : FormData
106
+ , toMsg : Result Http.Error Url -> pageMsg
107
+ }
108
+ -> Cmd msg
109
+ , runFetcher :
110
+ Pages.Fetcher.Fetcher pageMsg
111
+ -> Cmd msg
112
+ , fromPageMsg : pageMsg -> msg
113
+ , key : Browser.Navigation.Key
114
+ , setField : { formId : String, name : String, value : String } -> Cmd msg
115
+ }
116
+ -> Effect pageMsg
117
+ -> Cmd msg
118
+ perform ({ fromPageMsg, key } as helpers) effect =
119
+ case effect of
120
+ None ->
121
+ Cmd.none
122
+
123
+ Cmd cmd ->
124
+ Cmd.map fromPageMsg cmd
125
+
126
+ SetField info ->
127
+ helpers.setField info
128
+
129
+ Batch list ->
130
+ Cmd.batch (List.map (perform helpers) list)
131
+
132
+ GetStargazers toMsg ->
133
+ Http.get
134
+ { url =
135
+ "https://api.github.com/repos/dillonkearns/elm-pages"
136
+ , expect = Http.expectJson (toMsg >> fromPageMsg) (Decode.field "stargazers_count" Decode.int)
137
+ }
138
+
139
+ FetchRouteData fetchInfo ->
140
+ helpers.fetchRouteData
141
+ fetchInfo
142
+
143
+ Submit record ->
144
+ helpers.submit record
145
+
146
+ SubmitFetcher record ->
147
+ helpers.runFetcher record
148
+
149
+
150
+ type alias FormData =
151
+ { fields : List ( String, String )
152
+ , method : Form.Method
153
+ , action : String
154
+ , id : Maybe String
155
+ }
@@ -1,6 +1,38 @@
1
- module ErrorPage exposing (ErrorPage(..), internalError, notFound, statusCode, view)
1
+ module ErrorPage exposing (ErrorPage(..), Model, Msg, head, init, internalError, notFound, statusCode, update, view)
2
2
 
3
+ import Effect exposing (Effect)
4
+ import Head
3
5
  import Html exposing (Html)
6
+ import Html.Events exposing (onClick)
7
+ import View exposing (View)
8
+
9
+
10
+ type Msg
11
+ = Increment
12
+
13
+
14
+ type alias Model =
15
+ { count : Int
16
+ }
17
+
18
+
19
+ init : ErrorPage -> ( Model, Effect Msg )
20
+ init errorPage =
21
+ ( { count = 0 }
22
+ , Effect.none
23
+ )
24
+
25
+
26
+ update : ErrorPage -> Msg -> Model -> ( Model, Effect Msg )
27
+ update errorPage msg model =
28
+ case msg of
29
+ Increment ->
30
+ ( { model | count = model.count + 1 }, Effect.none )
31
+
32
+
33
+ head : ErrorPage -> List Head.Tag
34
+ head errorPage =
35
+ []
4
36
 
5
37
 
6
38
  type ErrorPage
@@ -18,13 +50,24 @@ internalError =
18
50
  InternalError
19
51
 
20
52
 
21
- view : ErrorPage -> { body : Html msg, title : String }
22
- view error =
53
+ view : ErrorPage -> Model -> View Msg
54
+ view error model =
23
55
  { body =
24
- Html.div []
25
- [ Html.text "Hi! This is a NotFound error"
56
+ [ Html.div []
57
+ [ Html.p [] [ Html.text "Page not found. Maybe try another URL?" ]
58
+ , Html.div []
59
+ [ Html.button
60
+ [ onClick Increment
61
+ ]
62
+ [ Html.text
63
+ (model.count
64
+ |> String.fromInt
65
+ )
66
+ ]
67
+ ]
26
68
  ]
27
- , title = "Error"
69
+ ]
70
+ , title = "This is a NotFound Error"
28
71
  }
29
72
 
30
73
 
@@ -0,0 +1,86 @@
1
+ module Route.Blog.Slug_ exposing (ActionData, Data, Model, Msg, route)
2
+
3
+ import BackendTask exposing (BackendTask)
4
+ import FatalError exposing (FatalError)
5
+ import Head
6
+ import Head.Seo as Seo
7
+ import Html
8
+ import Pages.Url
9
+ import PagesMsg exposing (PagesMsg)
10
+ import RouteBuilder exposing (App, StatelessRoute)
11
+ import Shared
12
+ import View exposing (View)
13
+
14
+
15
+ type alias Model =
16
+ {}
17
+
18
+
19
+ type alias Msg =
20
+ ()
21
+
22
+
23
+ type alias RouteParams =
24
+ { slug : String }
25
+
26
+
27
+ route : StatelessRoute RouteParams Data ActionData
28
+ route =
29
+ RouteBuilder.preRender
30
+ { head = head
31
+ , pages = pages
32
+ , data = data
33
+ }
34
+ |> RouteBuilder.buildNoState { view = view }
35
+
36
+
37
+ pages : BackendTask FatalError (List RouteParams)
38
+ pages =
39
+ BackendTask.succeed
40
+ [ { slug = "hello" }
41
+ ]
42
+
43
+
44
+ type alias Data =
45
+ { something : String
46
+ }
47
+
48
+
49
+ type alias ActionData =
50
+ {}
51
+
52
+
53
+ data : RouteParams -> BackendTask FatalError Data
54
+ data routeParams =
55
+ BackendTask.map Data
56
+ (BackendTask.succeed "Hi")
57
+
58
+
59
+ head :
60
+ App Data ActionData RouteParams
61
+ -> List Head.Tag
62
+ head app =
63
+ Seo.summary
64
+ { canonicalUrlOverride = Nothing
65
+ , siteName = "elm-pages"
66
+ , image =
67
+ { url = Pages.Url.external "TODO"
68
+ , alt = "elm-pages logo"
69
+ , dimensions = Nothing
70
+ , mimeType = Nothing
71
+ }
72
+ , description = "TODO"
73
+ , locale = Nothing
74
+ , title = "TODO title" -- metadata.title -- TODO
75
+ }
76
+ |> Seo.website
77
+
78
+
79
+ view :
80
+ App Data ActionData RouteParams
81
+ -> Shared.Model
82
+ -> View (PagesMsg Msg)
83
+ view app sharedModel =
84
+ { title = "Placeholder - Blog.Slug_"
85
+ , body = [ Html.text "You're on the page Blog.Slug_" ]
86
+ }