elm-pages 3.0.0-beta.9 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) 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} +2731 -2939
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16840 -13653
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  14. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  15. package/generator/dead-code-review/elm.json +9 -7
  16. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
  17. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  21. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  22. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  23. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  24. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  25. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  26. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
  28. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  29. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  30. package/generator/review/elm.json +10 -10
  31. package/generator/src/RouteBuilder.elm +93 -128
  32. package/generator/src/SharedTemplate.elm +8 -7
  33. package/generator/src/SiteConfig.elm +3 -2
  34. package/generator/src/basepath-middleware.js +3 -3
  35. package/generator/src/build.js +143 -59
  36. package/generator/src/cli.js +292 -88
  37. package/generator/src/codegen.js +29 -27
  38. package/generator/src/compatibility-key.js +3 -0
  39. package/generator/src/compile-elm.js +43 -26
  40. package/generator/src/config.js +2 -4
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +160 -102
  43. package/generator/src/dir-helpers.js +9 -26
  44. package/generator/src/elm-codegen.js +5 -4
  45. package/generator/src/elm-file-constants.js +2 -3
  46. package/generator/src/error-formatter.js +12 -11
  47. package/generator/src/file-helpers.js +3 -4
  48. package/generator/src/generate-template-module-connector.js +23 -23
  49. package/generator/src/init.js +9 -8
  50. package/generator/src/pre-render-html.js +10 -13
  51. package/generator/src/render-test.js +109 -0
  52. package/generator/src/render-worker.js +25 -28
  53. package/generator/src/render.js +320 -143
  54. package/generator/src/request-cache.js +265 -162
  55. package/generator/src/resolve-elm-module.js +64 -0
  56. package/generator/src/rewrite-client-elm-json.js +6 -5
  57. package/generator/src/rewrite-elm-json-help.js +56 -0
  58. package/generator/src/rewrite-elm-json.js +17 -7
  59. package/generator/src/route-codegen-helpers.js +16 -31
  60. package/generator/src/seo-renderer.js +1 -3
  61. package/generator/src/vite-utils.js +1 -2
  62. package/generator/static-code/elm-pages.js +10 -0
  63. package/generator/static-code/hmr.js +79 -13
  64. package/generator/template/app/Api.elm +3 -2
  65. package/generator/template/app/Effect.elm +155 -0
  66. package/generator/template/app/ErrorPage.elm +49 -6
  67. package/generator/template/app/Route/Blog/Slug_.elm +86 -0
  68. package/generator/template/app/Route/Greet.elm +107 -0
  69. package/generator/template/app/Route/Hello.elm +119 -0
  70. package/generator/template/app/Route/Index.elm +26 -25
  71. package/generator/template/app/Shared.elm +38 -39
  72. package/generator/template/app/Site.elm +4 -7
  73. package/generator/template/app/View.elm +9 -8
  74. package/generator/template/codegen/elm.codegen.json +18 -0
  75. package/generator/template/custom-backend-task.ts +3 -0
  76. package/generator/template/elm-pages.config.mjs +13 -0
  77. package/generator/template/elm-tooling.json +0 -3
  78. package/generator/template/elm.json +25 -20
  79. package/generator/template/index.ts +1 -2
  80. package/generator/template/netlify.toml +4 -1
  81. package/generator/template/package.json +10 -4
  82. package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
  83. package/generator/template/script/custom-backend-task.ts +3 -0
  84. package/generator/template/script/elm.json +61 -0
  85. package/generator/template/script/src/AddRoute.elm +312 -0
  86. package/generator/template/script/src/Stars.elm +42 -0
  87. package/package.json +30 -27
  88. package/src/ApiRoute.elm +249 -82
  89. package/src/BackendTask/Custom.elm +325 -0
  90. package/src/BackendTask/Env.elm +90 -0
  91. package/src/{DataSource → BackendTask}/File.elm +171 -56
  92. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  93. package/src/BackendTask/Http.elm +679 -0
  94. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  95. package/src/BackendTask/Internal/Request.elm +69 -0
  96. package/src/BackendTask/Random.elm +79 -0
  97. package/src/BackendTask/Time.elm +47 -0
  98. package/src/BackendTask.elm +531 -0
  99. package/src/FatalError.elm +90 -0
  100. package/src/FormData.elm +21 -18
  101. package/src/Head/Seo.elm +4 -4
  102. package/src/Head.elm +112 -8
  103. package/src/Internal/ApiRoute.elm +7 -5
  104. package/src/Internal/Request.elm +84 -4
  105. package/src/PageServerResponse.elm +6 -1
  106. package/src/Pages/ConcurrentSubmission.elm +127 -0
  107. package/src/Pages/Form.elm +340 -0
  108. package/src/Pages/FormData.elm +19 -0
  109. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  110. package/src/Pages/Internal/FatalError.elm +5 -0
  111. package/src/Pages/Internal/Msg.elm +93 -0
  112. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  113. package/src/Pages/Internal/Platform/Cli.elm +586 -768
  114. package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
  115. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  116. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  117. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  118. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  119. package/src/Pages/Internal/Platform.elm +330 -203
  120. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  121. package/src/Pages/Internal/Script.elm +17 -0
  122. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  123. package/src/Pages/Manifest.elm +52 -11
  124. package/src/Pages/Navigation.elm +85 -0
  125. package/src/Pages/PageUrl.elm +26 -12
  126. package/src/Pages/ProgramConfig.elm +32 -22
  127. package/src/Pages/Script.elm +166 -0
  128. package/src/Pages/SiteConfig.elm +3 -2
  129. package/src/Pages/StaticHttp/Request.elm +2 -2
  130. package/src/Pages/StaticHttpRequest.elm +23 -99
  131. package/src/Pages/Url.elm +3 -3
  132. package/src/PagesMsg.elm +88 -0
  133. package/src/QueryParams.elm +21 -172
  134. package/src/RenderRequest.elm +7 -7
  135. package/src/RequestsAndPending.elm +37 -20
  136. package/src/Result/Extra.elm +26 -0
  137. package/src/Scaffold/Form.elm +569 -0
  138. package/src/Scaffold/Route.elm +1431 -0
  139. package/src/Server/Request.elm +476 -1001
  140. package/src/Server/Response.elm +130 -36
  141. package/src/Server/Session.elm +181 -111
  142. package/src/Server/SetCookie.elm +80 -32
  143. package/src/Stub.elm +53 -0
  144. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  145. package/src/{Path.elm → UrlPath.elm} +33 -36
  146. package/generator/template/public/images/icon-png.png +0 -0
  147. package/src/DataSource/Env.elm +0 -38
  148. package/src/DataSource/Http.elm +0 -446
  149. package/src/DataSource/Internal/Request.elm +0 -20
  150. package/src/DataSource/Port.elm +0 -90
  151. package/src/DataSource.elm +0 -546
  152. package/src/Form/Field.elm +0 -717
  153. package/src/Form/FieldStatus.elm +0 -36
  154. package/src/Form/FieldView.elm +0 -417
  155. package/src/Form/FormData.elm +0 -22
  156. package/src/Form/Validation.elm +0 -391
  157. package/src/Form/Value.elm +0 -118
  158. package/src/Form.elm +0 -1683
  159. package/src/FormDecoder.elm +0 -102
  160. package/src/Pages/FormState.elm +0 -256
  161. package/src/Pages/Generate.elm +0 -1242
  162. package/src/Pages/Internal/Form.elm +0 -17
  163. package/src/Pages/Internal/Platform/Cli.elm.bak +0 -1276
  164. package/src/Pages/Msg.elm +0 -79
  165. package/src/Pages/Transition.elm +0 -70
package/README.md CHANGED
@@ -13,7 +13,7 @@ A **statically typed** site generator, written with pure Elm.
13
13
  ## Getting Started Resources
14
14
 
15
15
  - [elm-pages Docs Site](https://elm-pages.com/docs)
16
- - [elm-pages Elm API Docs](https://package.elm-lang.org/packages/dillonkearns/elm-pages/latest/)
16
+ - [elm-pages Elm API Docs](https://package.elm-lang.org/packages/dillonkearns/elm-pages/10.0.0/)
17
17
  - [Quick start repo](https://github.com/dillonkearns/elm-pages-starter) [(live site hosted here)](https://elm-pages-starter.netlify.com)
18
18
  - [Introducing `elm-pages` blog post](https://elm-pages.com/blog/introducing-elm-pages)
19
19
  - [`examples` folder](https://github.com/dillonkearns/elm-pages/blob/master/examples/) (includes https://elm-pages.com site source)
@@ -81,7 +81,7 @@ https://github.com/dillonkearns/elm-pages/projects
81
81
  You will see an error if the NPM and Elm package do not have a matching Compatibility Key. Usually it's best to upgrade to the latest version of both the Elm and NPM
82
82
  packages when you upgrade. However, in case you want to install versions that are behind the latest, the Compatibility Key is included here for reference.
83
83
 
84
- Current Compatibility Key: 1.
84
+ Current Compatibility Key: 20.
85
85
 
86
86
  ## Contributors ✨
87
87
 
@@ -0,0 +1,207 @@
1
+ import * as fs from "fs";
2
+
3
+ export default async function run({
4
+ renderFunctionFilePath,
5
+ routePatterns,
6
+ apiRoutePatterns,
7
+ }) {
8
+ console.log("Running Netlify adapter");
9
+ ensureDirSync("functions/render");
10
+ ensureDirSync("functions/server-render");
11
+
12
+ fs.copyFileSync(
13
+ renderFunctionFilePath,
14
+ "./functions/render/elm-pages-cli.mjs"
15
+ );
16
+ fs.copyFileSync(
17
+ renderFunctionFilePath,
18
+ "./functions/server-render/elm-pages-cli.mjs"
19
+ );
20
+
21
+ fs.writeFileSync("./functions/render/index.mjs", rendererCode(true));
22
+ fs.writeFileSync("./functions/server-render/index.mjs", rendererCode(false));
23
+ // TODO rename functions/render to functions/fallback-render
24
+ // TODO prepend instead of writing file
25
+
26
+ const apiServerRoutes = apiRoutePatterns.filter(isServerSide);
27
+
28
+ ensureValidRoutePatternsForNetlify(apiServerRoutes);
29
+
30
+ const apiRouteRedirects = apiServerRoutes
31
+ .map((apiRoute) => {
32
+ if (apiRoute.kind === "prerender-with-fallback") {
33
+ return `${apiPatternToRedirectPattern(
34
+ apiRoute.pathPattern
35
+ )} /.netlify/builders/render 200`;
36
+ } else if (apiRoute.kind === "serverless") {
37
+ return `${apiPatternToRedirectPattern(
38
+ apiRoute.pathPattern
39
+ )} /.netlify/functions/server-render 200`;
40
+ } else {
41
+ throw "Unhandled API Server Route";
42
+ }
43
+ })
44
+ .join("\n");
45
+
46
+ const redirectsFile =
47
+ routePatterns
48
+ .filter(isServerSide)
49
+ .map((route) => {
50
+ if (route.kind === "prerender-with-fallback") {
51
+ return `${route.pathPattern} /.netlify/builders/render 200
52
+ ${route.pathPattern}/content.dat /.netlify/builders/render 200`;
53
+ } else {
54
+ return `${route.pathPattern} /.netlify/functions/server-render 200
55
+ ${route.pathPattern}/content.dat /.netlify/functions/server-render 200`;
56
+ }
57
+ })
58
+ .join("\n") +
59
+ "\n" +
60
+ apiRouteRedirects +
61
+ "\n";
62
+
63
+ fs.writeFileSync("dist/_redirects", redirectsFile);
64
+ }
65
+
66
+ function ensureValidRoutePatternsForNetlify(apiRoutePatterns) {
67
+ const invalidNetlifyRoutes = apiRoutePatterns.filter((apiRoute) =>
68
+ apiRoute.pathPattern.some(({ kind }) => kind === "hybrid")
69
+ );
70
+ if (invalidNetlifyRoutes.length > 0) {
71
+ throw (
72
+ "Invalid Netlify routes!\n" +
73
+ invalidNetlifyRoutes
74
+ .map((value) => JSON.stringify(value, null, 2))
75
+ .join(", ")
76
+ );
77
+ }
78
+ }
79
+
80
+ function isServerSide(route) {
81
+ return (
82
+ route.kind === "prerender-with-fallback" || route.kind === "serverless"
83
+ );
84
+ }
85
+
86
+ /**
87
+ * @param {boolean} isOnDemand
88
+ */
89
+ function rendererCode(isOnDemand) {
90
+ return `import * as elmPages from "./elm-pages-cli.mjs";
91
+ import * as busboy from "busboy";
92
+
93
+ ${
94
+ isOnDemand
95
+ ? `import { builder } from "@netlify/functions";
96
+
97
+ export const handler = builder(render);`
98
+ : `
99
+
100
+ export const handler = render;`
101
+ }
102
+
103
+
104
+ /**
105
+ * @param {import('aws-lambda').APIGatewayProxyEvent} event
106
+ * @param {any} context
107
+ */
108
+ async function render(event, context) {
109
+ try {
110
+ const renderResult = await elmPages.render(await reqToJson(event));
111
+ const { headers, statusCode } = renderResult;
112
+
113
+ if (renderResult.kind === "bytes") {
114
+ return {
115
+ body: Buffer.from(renderResult.body).toString("base64"),
116
+ isBase64Encoded: true,
117
+ multiValueHeaders: {
118
+ "Content-Type": ["application/octet-stream"],
119
+ "x-powered-by": ["elm-pages"],
120
+ ...headers,
121
+ },
122
+ statusCode,
123
+ };
124
+ } else if (renderResult.kind === "api-response") {
125
+ return {
126
+ body: renderResult.body,
127
+ multiValueHeaders: headers,
128
+ statusCode,
129
+ isBase64Encoded: renderResult.isBase64Encoded,
130
+ };
131
+ } else {
132
+ return {
133
+ body: renderResult.body,
134
+ multiValueHeaders: {
135
+ "Content-Type": ["text/html"],
136
+ "x-powered-by": ["elm-pages"],
137
+ ...headers,
138
+ },
139
+ statusCode,
140
+ };
141
+ }
142
+ } catch (error) {
143
+ console.error(error);
144
+ console.error(JSON.stringify(error, null, 2));
145
+ return {
146
+ body: \`<body><h1>Error</h1><pre>\${JSON.stringify(error, null, 2)}</pre></body>\`,
147
+ statusCode: 500,
148
+ multiValueHeaders: {
149
+ "Content-Type": ["text/html"],
150
+ "x-powered-by": ["elm-pages"],
151
+ },
152
+ };
153
+ }
154
+ }
155
+
156
+ /**
157
+ * @param {import('aws-lambda').APIGatewayProxyEvent} req
158
+ * @returns {{method: string; rawUrl: string; body: string?; headers: Record<string, string>; multiPartFormData: unknown }}
159
+ */
160
+ function reqToJson(req) {
161
+ return {
162
+ method: req.httpMethod,
163
+ headers: req.headers,
164
+ rawUrl: req.rawUrl,
165
+ body: req.body,
166
+ multiPartFormData: null,
167
+ };
168
+ }
169
+ `;
170
+ }
171
+
172
+ /**
173
+ * @param {fs.PathLike} dirpath
174
+ */
175
+ function ensureDirSync(dirpath) {
176
+ try {
177
+ fs.mkdirSync(dirpath, { recursive: true });
178
+ } catch (err) {
179
+ if (err.code !== "EEXIST") throw err;
180
+ }
181
+ }
182
+
183
+ /** @typedef {{kind: 'dynamic'} | {kind: 'literal', value: string}} ApiSegment */
184
+
185
+ /**
186
+ * @param {ApiSegment[]} pathPattern
187
+ */
188
+ function apiPatternToRedirectPattern(pathPattern) {
189
+ return (
190
+ "/" +
191
+ pathPattern
192
+ .map((segment, index) => {
193
+ switch (segment.kind) {
194
+ case "literal": {
195
+ return segment.value;
196
+ }
197
+ case "dynamic": {
198
+ return `:dynamic${index}`;
199
+ }
200
+ default: {
201
+ throw "Unhandled segment: " + JSON.stringify(segment);
202
+ }
203
+ }
204
+ })
205
+ .join("/")
206
+ );
207
+ }