elm-pages 3.0.0-beta.4 → 3.0.0-beta.41

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 (148) hide show
  1. package/README.md +10 -1
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2828 -2933
  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 +1447 -342
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +17004 -13817
  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 +1447 -342
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25025 -21739
  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 +121 -114
  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 +209 -92
  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 +39 -0
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +176 -138
  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 +39 -28
  51. package/generator/src/render-test.js +109 -0
  52. package/generator/src/render-worker.js +25 -28
  53. package/generator/src/render.js +321 -142
  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 +12 -7
  61. package/generator/src/vite-utils.js +77 -0
  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 +6 -5
  65. package/generator/template/app/Effect.elm +123 -0
  66. package/generator/template/app/ErrorPage.elm +37 -6
  67. package/generator/template/app/Route/Index.elm +17 -10
  68. package/generator/template/app/Shared.elm +24 -47
  69. package/generator/template/app/Site.elm +19 -6
  70. package/generator/template/app/View.elm +1 -8
  71. package/generator/template/elm-tooling.json +0 -3
  72. package/generator/template/elm.json +32 -24
  73. package/generator/template/package.json +10 -4
  74. package/package.json +30 -27
  75. package/src/ApiRoute.elm +199 -61
  76. package/src/BackendTask/Custom.elm +325 -0
  77. package/src/BackendTask/Env.elm +90 -0
  78. package/src/{DataSource → BackendTask}/File.elm +171 -56
  79. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  80. package/src/BackendTask/Http.elm +679 -0
  81. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  82. package/src/BackendTask/Internal/Request.elm +69 -0
  83. package/src/BackendTask/Random.elm +79 -0
  84. package/src/BackendTask/Time.elm +47 -0
  85. package/src/BackendTask.elm +531 -0
  86. package/src/FatalError.elm +90 -0
  87. package/src/Head/Seo.elm +4 -4
  88. package/src/Head.elm +237 -7
  89. package/src/HtmlPrinter.elm +7 -3
  90. package/src/Internal/ApiRoute.elm +7 -5
  91. package/src/PageServerResponse.elm +6 -1
  92. package/src/Pages/ConcurrentSubmission.elm +127 -0
  93. package/src/Pages/Form.elm +340 -0
  94. package/src/Pages/FormData.elm +18 -0
  95. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  96. package/src/Pages/Internal/FatalError.elm +5 -0
  97. package/src/Pages/Internal/Msg.elm +93 -0
  98. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  99. package/src/Pages/Internal/Platform/Cli.elm +617 -768
  100. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  101. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  102. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  103. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  104. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  105. package/src/Pages/Internal/Platform.elm +359 -225
  106. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  107. package/src/Pages/Internal/Script.elm +17 -0
  108. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  109. package/src/Pages/Manifest.elm +52 -11
  110. package/src/Pages/Navigation.elm +87 -0
  111. package/src/Pages/PageUrl.elm +26 -12
  112. package/src/Pages/ProgramConfig.elm +35 -23
  113. package/src/Pages/Script.elm +166 -0
  114. package/src/Pages/SiteConfig.elm +3 -2
  115. package/src/Pages/StaticHttp/Request.elm +2 -2
  116. package/src/Pages/StaticHttpRequest.elm +23 -99
  117. package/src/Pages/Url.elm +3 -3
  118. package/src/PagesMsg.elm +88 -0
  119. package/src/QueryParams.elm +21 -172
  120. package/src/RenderRequest.elm +7 -7
  121. package/src/RequestsAndPending.elm +37 -20
  122. package/src/Result/Extra.elm +26 -0
  123. package/src/Scaffold/Form.elm +569 -0
  124. package/src/Scaffold/Route.elm +1411 -0
  125. package/src/Server/Request.elm +74 -72
  126. package/src/Server/Session.elm +62 -42
  127. package/src/Server/SetCookie.elm +80 -32
  128. package/src/Stub.elm +53 -0
  129. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  130. package/src/{Path.elm → UrlPath.elm} +33 -36
  131. package/src/DataSource/Env.elm +0 -38
  132. package/src/DataSource/Http.elm +0 -446
  133. package/src/DataSource/Internal/Request.elm +0 -20
  134. package/src/DataSource/Port.elm +0 -90
  135. package/src/DataSource.elm +0 -538
  136. package/src/Form/Field.elm +0 -717
  137. package/src/Form/FieldStatus.elm +0 -36
  138. package/src/Form/FieldView.elm +0 -417
  139. package/src/Form/FormData.elm +0 -22
  140. package/src/Form/Validation.elm +0 -391
  141. package/src/Form/Value.elm +0 -118
  142. package/src/Form.elm +0 -1683
  143. package/src/FormDecoder.elm +0 -102
  144. package/src/Pages/FormState.elm +0 -256
  145. package/src/Pages/Generate.elm +0 -800
  146. package/src/Pages/Internal/Form.elm +0 -17
  147. package/src/Pages/Msg.elm +0 -79
  148. package/src/Pages/Transition.elm +0 -70
package/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # `elm-pages` [![Netlify Status](https://api.netlify.com/api/v1/badges/8ee4a674-4f37-4f16-b99e-607c0a02ee75/deploy-status)](https://app.netlify.com/sites/elm-pages/deploys) [![Build Status](https://github.com/dillonkearns/elm-pages/workflows/Elm%20CI/badge.svg)](https://github.com/dillonkearns/elm-pages/actions?query=branch%3Amaster) [![npm](https://img.shields.io/npm/v/elm-pages.svg)](https://npmjs.com/package/elm-pages) [![Elm package](https://img.shields.io/elm-package/v/dillonkearns/elm-pages.svg)](https://package.elm-lang.org/packages/dillonkearns/elm-pages/latest/)
2
2
 
3
3
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
4
+
4
5
  [![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-)
6
+
5
7
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
6
8
 
7
9
  [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/dillonkearns/elm-pages-starter)
@@ -68,13 +70,19 @@ Try out `elm-pages`, open up Lighthouse, and
68
70
  see for yourself! Or check out https://elm-pages.com
69
71
  (find the source code in the [`examples/docs/`](https://github.com/dillonkearns/elm-pages/tree/master/examples/docs) folder).
70
72
 
71
-
72
73
  ## What's next?
73
74
 
74
75
  Take a look at the current projects to see the current priorities!
75
76
 
76
77
  https://github.com/dillonkearns/elm-pages/projects
77
78
 
79
+ ## Compatibility Key
80
+
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
+ 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
+
84
+ Current Compatibility Key: 18.
85
+
78
86
  ## Contributors ✨
79
87
 
80
88
  Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
@@ -94,6 +102,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
94
102
 
95
103
  <!-- markdownlint-enable -->
96
104
  <!-- prettier-ignore-end -->
105
+
97
106
  <!-- ALL-CONTRIBUTORS-LIST:END -->
98
107
 
99
108
  This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
@@ -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
+ }