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.
- package/README.md +2 -2
- package/adapter/netlify.js +207 -0
- package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2731 -2939
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16840 -13653
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
- package/generator/dead-code-review/elm.json +9 -7
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
- package/generator/review/elm.json +10 -10
- package/generator/src/RouteBuilder.elm +93 -128
- package/generator/src/SharedTemplate.elm +8 -7
- package/generator/src/SiteConfig.elm +3 -2
- package/generator/src/basepath-middleware.js +3 -3
- package/generator/src/build.js +143 -59
- package/generator/src/cli.js +292 -88
- package/generator/src/codegen.js +29 -27
- package/generator/src/compatibility-key.js +3 -0
- package/generator/src/compile-elm.js +43 -26
- package/generator/src/config.js +2 -4
- package/generator/src/copy-dir.js +2 -2
- package/generator/src/dev-server.js +160 -102
- package/generator/src/dir-helpers.js +9 -26
- package/generator/src/elm-codegen.js +5 -4
- package/generator/src/elm-file-constants.js +2 -3
- package/generator/src/error-formatter.js +12 -11
- package/generator/src/file-helpers.js +3 -4
- package/generator/src/generate-template-module-connector.js +23 -23
- package/generator/src/init.js +9 -8
- package/generator/src/pre-render-html.js +10 -13
- package/generator/src/render-test.js +109 -0
- package/generator/src/render-worker.js +25 -28
- package/generator/src/render.js +320 -143
- package/generator/src/request-cache.js +265 -162
- package/generator/src/resolve-elm-module.js +64 -0
- package/generator/src/rewrite-client-elm-json.js +6 -5
- package/generator/src/rewrite-elm-json-help.js +56 -0
- package/generator/src/rewrite-elm-json.js +17 -7
- package/generator/src/route-codegen-helpers.js +16 -31
- package/generator/src/seo-renderer.js +1 -3
- package/generator/src/vite-utils.js +1 -2
- package/generator/static-code/elm-pages.js +10 -0
- package/generator/static-code/hmr.js +79 -13
- package/generator/template/app/Api.elm +3 -2
- package/generator/template/app/Effect.elm +155 -0
- package/generator/template/app/ErrorPage.elm +49 -6
- package/generator/template/app/Route/Blog/Slug_.elm +86 -0
- package/generator/template/app/Route/Greet.elm +107 -0
- package/generator/template/app/Route/Hello.elm +119 -0
- package/generator/template/app/Route/Index.elm +26 -25
- package/generator/template/app/Shared.elm +38 -39
- package/generator/template/app/Site.elm +4 -7
- package/generator/template/app/View.elm +9 -8
- package/generator/template/codegen/elm.codegen.json +18 -0
- package/generator/template/custom-backend-task.ts +3 -0
- package/generator/template/elm-pages.config.mjs +13 -0
- package/generator/template/elm-tooling.json +0 -3
- package/generator/template/elm.json +25 -20
- package/generator/template/index.ts +1 -2
- package/generator/template/netlify.toml +4 -1
- package/generator/template/package.json +10 -4
- package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
- package/generator/template/script/custom-backend-task.ts +3 -0
- package/generator/template/script/elm.json +61 -0
- package/generator/template/script/src/AddRoute.elm +312 -0
- package/generator/template/script/src/Stars.elm +42 -0
- package/package.json +30 -27
- package/src/ApiRoute.elm +249 -82
- package/src/BackendTask/Custom.elm +325 -0
- package/src/BackendTask/Env.elm +90 -0
- package/src/{DataSource → BackendTask}/File.elm +171 -56
- package/src/{DataSource → BackendTask}/Glob.elm +136 -125
- package/src/BackendTask/Http.elm +679 -0
- package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
- package/src/BackendTask/Internal/Request.elm +69 -0
- package/src/BackendTask/Random.elm +79 -0
- package/src/BackendTask/Time.elm +47 -0
- package/src/BackendTask.elm +531 -0
- package/src/FatalError.elm +90 -0
- package/src/FormData.elm +21 -18
- package/src/Head/Seo.elm +4 -4
- package/src/Head.elm +112 -8
- package/src/Internal/ApiRoute.elm +7 -5
- package/src/Internal/Request.elm +84 -4
- package/src/PageServerResponse.elm +6 -1
- package/src/Pages/ConcurrentSubmission.elm +127 -0
- package/src/Pages/Form.elm +340 -0
- package/src/Pages/FormData.elm +19 -0
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/FatalError.elm +5 -0
- package/src/Pages/Internal/Msg.elm +93 -0
- package/src/Pages/Internal/NotFoundReason.elm +4 -4
- package/src/Pages/Internal/Platform/Cli.elm +586 -768
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
- package/src/Pages/Internal/Platform/Effect.elm +1 -2
- package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
- package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
- package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
- package/src/Pages/Internal/Platform.elm +330 -203
- package/src/Pages/Internal/ResponseSketch.elm +2 -2
- package/src/Pages/Internal/Script.elm +17 -0
- package/src/Pages/Internal/StaticHttpBody.elm +35 -1
- package/src/Pages/Manifest.elm +52 -11
- package/src/Pages/Navigation.elm +85 -0
- package/src/Pages/PageUrl.elm +26 -12
- package/src/Pages/ProgramConfig.elm +32 -22
- package/src/Pages/Script.elm +166 -0
- package/src/Pages/SiteConfig.elm +3 -2
- package/src/Pages/StaticHttp/Request.elm +2 -2
- package/src/Pages/StaticHttpRequest.elm +23 -99
- package/src/Pages/Url.elm +3 -3
- package/src/PagesMsg.elm +88 -0
- package/src/QueryParams.elm +21 -172
- package/src/RenderRequest.elm +7 -7
- package/src/RequestsAndPending.elm +37 -20
- package/src/Result/Extra.elm +26 -0
- package/src/Scaffold/Form.elm +569 -0
- package/src/Scaffold/Route.elm +1431 -0
- package/src/Server/Request.elm +476 -1001
- package/src/Server/Response.elm +130 -36
- package/src/Server/Session.elm +181 -111
- package/src/Server/SetCookie.elm +80 -32
- package/src/Stub.elm +53 -0
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
- package/src/{Path.elm → UrlPath.elm} +33 -36
- package/generator/template/public/images/icon-png.png +0 -0
- package/src/DataSource/Env.elm +0 -38
- package/src/DataSource/Http.elm +0 -446
- package/src/DataSource/Internal/Request.elm +0 -20
- package/src/DataSource/Port.elm +0 -90
- package/src/DataSource.elm +0 -546
- package/src/Form/Field.elm +0 -717
- package/src/Form/FieldStatus.elm +0 -36
- package/src/Form/FieldView.elm +0 -417
- package/src/Form/FormData.elm +0 -22
- package/src/Form/Validation.elm +0 -391
- package/src/Form/Value.elm +0 -118
- package/src/Form.elm +0 -1683
- package/src/FormDecoder.elm +0 -102
- package/src/Pages/FormState.elm +0 -256
- package/src/Pages/Generate.elm +0 -1242
- package/src/Pages/Internal/Form.elm +0 -17
- package/src/Pages/Internal/Platform/Cli.elm.bak +0 -1276
- package/src/Pages/Msg.elm +0 -79
- 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
|
-
|
|
10
|
-
|
|
11
|
-
if (initialErrorPage) {
|
|
12
|
-
handleEvent(sendContentJsonPort, { data: "content.dat" });
|
|
11
|
+
function waitFunc() {
|
|
12
|
+
return reconnectFrequencySeconds * 1000;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
-
`-- ${title.replace("-", " ")} --------------- ${
|
|
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
|
|
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
|
-
|
|
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 ->
|
|
22
|
-
view error =
|
|
53
|
+
view : ErrorPage -> Model -> View Msg
|
|
54
|
+
view error model =
|
|
23
55
|
{ body =
|
|
24
|
-
Html.div []
|
|
25
|
-
[ Html.text "
|
|
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
|
-
|
|
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
|
+
}
|