elm-pages 3.0.0-beta.3 → 3.0.0-beta.31
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 +10 -1
- package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2864 -2589
- 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 +1447 -342
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16458 -13724
- 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 +1447 -342
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +24542 -21748
- 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 +113 -107
- package/generator/src/SharedTemplate.elm +3 -2
- package/generator/src/SiteConfig.elm +3 -2
- package/generator/src/basepath-middleware.js +3 -3
- package/generator/src/build.js +125 -88
- package/generator/src/cli.js +273 -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 +39 -0
- package/generator/src/copy-dir.js +2 -2
- package/generator/src/dev-server.js +150 -133
- 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 -22
- package/generator/src/init.js +9 -8
- package/generator/src/pre-render-html.js +39 -28
- package/generator/src/render-test.js +109 -0
- package/generator/src/render-worker.js +25 -28
- package/generator/src/render.js +320 -142
- package/generator/src/request-cache.js +252 -163
- package/generator/src/resolve-elm-module.js +63 -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 +12 -7
- package/generator/src/vite-utils.js +77 -0
- package/generator/static-code/hmr.js +79 -13
- package/generator/template/app/Api.elm +6 -5
- package/generator/template/app/Effect.elm +123 -0
- package/generator/template/app/ErrorPage.elm +37 -6
- package/generator/template/app/Route/Index.elm +17 -10
- package/generator/template/app/Shared.elm +24 -47
- package/generator/template/app/Site.elm +19 -6
- package/generator/template/app/View.elm +1 -8
- package/generator/template/elm-tooling.json +0 -3
- package/generator/template/elm.json +32 -24
- package/generator/template/package.json +10 -4
- package/package.json +29 -27
- package/src/ApiRoute.elm +199 -61
- package/src/BackendTask/Custom.elm +325 -0
- package/src/BackendTask/Env.elm +90 -0
- package/src/{DataSource → BackendTask}/File.elm +128 -43
- package/src/{DataSource → BackendTask}/Glob.elm +136 -125
- package/src/BackendTask/Http.elm +673 -0
- package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
- package/src/BackendTask/Internal/Request.elm +28 -0
- package/src/BackendTask/Random.elm +79 -0
- package/src/BackendTask/Time.elm +47 -0
- package/src/BackendTask.elm +537 -0
- package/src/FatalError.elm +89 -0
- package/src/Form/Field.elm +21 -9
- package/src/Form/FieldView.elm +94 -14
- package/src/Form.elm +275 -400
- package/src/Head.elm +237 -7
- package/src/HtmlPrinter.elm +7 -3
- package/src/Internal/ApiRoute.elm +7 -5
- package/src/PageServerResponse.elm +6 -1
- package/src/Pages/FormState.elm +6 -5
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/FatalError.elm +5 -0
- package/src/Pages/Internal/Form.elm +21 -1
- package/src/Pages/{Msg.elm → Internal/Msg.elm} +26 -16
- package/src/Pages/Internal/Platform/Cli.elm +598 -763
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
- package/src/Pages/Internal/Platform/Effect.elm +1 -2
- package/src/Pages/Internal/Platform/GeneratorApplication.elm +373 -0
- package/src/Pages/Internal/Platform/StaticResponses.elm +73 -270
- package/src/Pages/Internal/Platform/ToJsPayload.elm +4 -7
- package/src/Pages/Internal/Platform.elm +216 -102
- package/src/Pages/Internal/Script.elm +17 -0
- package/src/Pages/Internal/StaticHttpBody.elm +35 -1
- package/src/Pages/Manifest.elm +29 -4
- package/src/Pages/PageUrl.elm +23 -9
- package/src/Pages/ProgramConfig.elm +14 -10
- package/src/Pages/Script.elm +109 -0
- package/src/Pages/SiteConfig.elm +3 -2
- package/src/Pages/StaticHttp/Request.elm +2 -2
- package/src/Pages/StaticHttpRequest.elm +23 -98
- package/src/PagesMsg.elm +92 -0
- package/src/Path.elm +16 -19
- package/src/QueryParams.elm +21 -172
- package/src/RequestsAndPending.elm +8 -19
- package/src/Result/Extra.elm +26 -0
- package/src/Scaffold/Form.elm +560 -0
- package/src/Scaffold/Route.elm +1388 -0
- package/src/Server/Request.elm +43 -37
- package/src/Server/Session.elm +62 -42
- package/src/Server/SetCookie.elm +12 -4
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
- 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 -538
- package/src/Pages/Generate.elm +0 -800
package/generator/src/build.js
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import * as fs from "./dir-helpers.js";
|
|
2
|
+
import * as fsPromises from "fs/promises";
|
|
3
|
+
import { runElmReview } from "./compile-elm.js";
|
|
4
|
+
import { restoreColorSafe } from "./error-formatter.js";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { spawn as spawnCallback } from "cross-spawn";
|
|
7
|
+
import * as codegen from "./codegen.js";
|
|
8
|
+
import * as terser from "terser";
|
|
9
|
+
import * as os from "os";
|
|
10
|
+
import { Worker, SHARE_ENV } from "worker_threads";
|
|
11
|
+
import { ensureDirSync } from "./file-helpers.js";
|
|
12
|
+
import { generateClientFolder } from "./codegen.js";
|
|
13
|
+
import { default as which } from "which";
|
|
14
|
+
import { build } from "vite";
|
|
15
|
+
import * as preRenderHtml from "./pre-render-html.js";
|
|
16
|
+
import * as esbuild from "esbuild";
|
|
17
|
+
import { createHash } from "crypto";
|
|
18
|
+
import { merge_vite_configs } from "./vite-utils.js";
|
|
19
|
+
import { resolveConfig } from "./config.js";
|
|
20
|
+
import * as globby from "globby";
|
|
21
|
+
import { fileURLToPath } from "url";
|
|
22
|
+
import { copyFile } from "fs/promises";
|
|
19
23
|
|
|
20
24
|
let pool = [];
|
|
21
25
|
let pagesReady;
|
|
@@ -28,7 +32,6 @@ let pagesReadyCalled = false;
|
|
|
28
32
|
let activeWorkers = 0;
|
|
29
33
|
let buildError = false;
|
|
30
34
|
|
|
31
|
-
const DIR_PATH = process.cwd();
|
|
32
35
|
const OUTPUT_FILE_NAME = "elm.js";
|
|
33
36
|
|
|
34
37
|
process.on("unhandledRejection", (error) => {
|
|
@@ -36,11 +39,9 @@ process.on("unhandledRejection", (error) => {
|
|
|
36
39
|
process.exitCode = 1;
|
|
37
40
|
});
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
OUTPUT_FILE_NAME
|
|
43
|
-
);
|
|
42
|
+
function ELM_FILE_PATH() {
|
|
43
|
+
return path.join(process.cwd(), "./elm-stuff/elm-pages", OUTPUT_FILE_NAME);
|
|
44
|
+
}
|
|
44
45
|
|
|
45
46
|
async function ensureRequiredDirs() {
|
|
46
47
|
ensureDirSync(`dist`);
|
|
@@ -65,50 +66,41 @@ async function ensureRequiredExecutables() {
|
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
async function run(options) {
|
|
69
|
+
export async function run(options) {
|
|
69
70
|
try {
|
|
70
71
|
await ensureRequiredDirs();
|
|
71
72
|
await ensureRequiredExecutables();
|
|
72
|
-
// since init/update are never called in pre-renders, and
|
|
73
|
+
// since init/update are never called in pre-renders, and BackendTask.Http is called using pure NodeJS HTTP fetching
|
|
73
74
|
// we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
|
|
74
75
|
|
|
75
76
|
const generateCode = codegen.generate(options.base);
|
|
76
77
|
|
|
77
78
|
await generateCode;
|
|
79
|
+
|
|
80
|
+
const config = await resolveConfig();
|
|
78
81
|
await fsPromises.writeFile(
|
|
79
82
|
"elm-stuff/elm-pages/index.html",
|
|
80
|
-
preRenderHtml.templateHtml()
|
|
83
|
+
preRenderHtml.templateHtml(false, config.headTagsTemplate)
|
|
81
84
|
);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const viteConfig = config.vite || {};
|
|
96
|
-
|
|
97
|
-
const buildComplete = build({
|
|
98
|
-
configFile: false,
|
|
99
|
-
root: process.cwd(),
|
|
100
|
-
base: options.base,
|
|
101
|
-
ssr: false,
|
|
102
|
-
|
|
103
|
-
build: {
|
|
104
|
-
manifest: true,
|
|
105
|
-
outDir: "dist",
|
|
106
|
-
rollupOptions: {
|
|
107
|
-
input: "elm-stuff/elm-pages/index.html",
|
|
85
|
+
const viteConfig = merge_vite_configs(
|
|
86
|
+
{
|
|
87
|
+
configFile: false,
|
|
88
|
+
root: process.cwd(),
|
|
89
|
+
base: options.base,
|
|
90
|
+
ssr: false,
|
|
91
|
+
|
|
92
|
+
build: {
|
|
93
|
+
manifest: true,
|
|
94
|
+
outDir: "dist",
|
|
95
|
+
rollupOptions: {
|
|
96
|
+
input: "elm-stuff/elm-pages/index.html",
|
|
97
|
+
},
|
|
108
98
|
},
|
|
109
99
|
},
|
|
110
|
-
|
|
111
|
-
|
|
100
|
+
config.vite || {}
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const buildComplete = build(viteConfig);
|
|
112
104
|
const compileClientDone = compileElm(options);
|
|
113
105
|
await buildComplete;
|
|
114
106
|
await compileClientDone;
|
|
@@ -119,53 +111,71 @@ async function run(options) {
|
|
|
119
111
|
withoutExtension
|
|
120
112
|
);
|
|
121
113
|
const assetManifestPath = path.join(process.cwd(), "dist/manifest.json");
|
|
122
|
-
const manifest =
|
|
114
|
+
const manifest = (
|
|
115
|
+
await import(assetManifestPath, {
|
|
116
|
+
assert: { type: "json" },
|
|
117
|
+
})
|
|
118
|
+
).default;
|
|
123
119
|
const indexTemplate = await fsPromises.readFile(
|
|
124
120
|
"dist/elm-stuff/elm-pages/index.html",
|
|
125
121
|
"utf-8"
|
|
126
122
|
);
|
|
127
|
-
const
|
|
123
|
+
const preloadFiles = [
|
|
124
|
+
`elm.${browserElmHash}.js`,
|
|
125
|
+
...Object.entries(manifest).map((entry) => entry[1].file),
|
|
126
|
+
].map((file) => path.join(options.base, file));
|
|
127
|
+
const userProcessedPreloads = preloadFiles.flatMap((file) => {
|
|
128
|
+
const userPreloadForFile = config.preloadTagForFile(file);
|
|
129
|
+
if (userPreloadForFile === true) {
|
|
130
|
+
return [defaultPreloadForFile(file)];
|
|
131
|
+
} else if (userPreloadForFile === false) {
|
|
132
|
+
return [];
|
|
133
|
+
} else if (typeof userPreloadForFile === "string") {
|
|
134
|
+
return [userPreloadForFile];
|
|
135
|
+
} else {
|
|
136
|
+
throw `I expected preloadTagForFile in elm-pages.config.mjs to return a string or boolean, but instead it returned: ${userPreloadForFile}`;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
128
139
|
|
|
129
140
|
const processedIndexTemplate = indexTemplate
|
|
130
|
-
.replace("<!-- PLACEHOLDER_PRELOADS -->",
|
|
141
|
+
.replace("<!-- PLACEHOLDER_PRELOADS -->", userProcessedPreloads.join(""))
|
|
131
142
|
.replace(
|
|
132
143
|
'<script defer src="/elm.js" type="text/javascript"></script>',
|
|
133
144
|
`<script defer src="/elm.${browserElmHash}.js" type="text/javascript"></script>`
|
|
134
145
|
);
|
|
135
146
|
await fsPromises.writeFile("dist/template.html", processedIndexTemplate);
|
|
136
147
|
await fsPromises.unlink(assetManifestPath);
|
|
137
|
-
|
|
138
|
-
const portDataSourceCompiled = esbuild
|
|
148
|
+
const portBackendTaskCompiled = esbuild
|
|
139
149
|
.build({
|
|
140
|
-
entryPoints: ["./
|
|
150
|
+
entryPoints: ["./custom-backend-task"],
|
|
141
151
|
platform: "node",
|
|
142
|
-
outfile: ".elm-pages/compiled-ports/
|
|
152
|
+
outfile: ".elm-pages/compiled-ports/custom-backend-task.mjs",
|
|
143
153
|
assetNames: "[name]-[hash]",
|
|
144
154
|
chunkNames: "chunks/[name]-[hash]",
|
|
145
155
|
outExtension: { ".js": ".js" },
|
|
146
156
|
metafile: true,
|
|
147
157
|
bundle: true,
|
|
148
|
-
|
|
149
|
-
|
|
158
|
+
format: "esm",
|
|
159
|
+
packages: "external",
|
|
160
|
+
logLevel: "silent",
|
|
150
161
|
})
|
|
151
162
|
.then((result) => {
|
|
152
|
-
|
|
163
|
+
try {
|
|
164
|
+
global.portsFilePath = Object.keys(result.metafile.outputs)[0];
|
|
165
|
+
} catch (e) {}
|
|
153
166
|
})
|
|
154
167
|
.catch((error) => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
console.warn("No port-data-source file found.");
|
|
162
|
-
} else {
|
|
163
|
-
console.error("Failed to load port-data-source file", error);
|
|
168
|
+
const portBackendTaskFileFound =
|
|
169
|
+
globby.globbySync("./custom-backend-task.*").length > 0;
|
|
170
|
+
if (portBackendTaskFileFound) {
|
|
171
|
+
// don't present error if there are no files matching custom-backend-task
|
|
172
|
+
// if there are files matching custom-backend-task, warn the user in case something went wrong loading it
|
|
173
|
+
console.error("Failed to start custom-backend-task watcher", error);
|
|
164
174
|
}
|
|
165
175
|
});
|
|
166
176
|
// TODO extract common code for compiling ports file?
|
|
167
177
|
|
|
168
|
-
XMLHttpRequest = {};
|
|
178
|
+
global.XMLHttpRequest = {};
|
|
169
179
|
const compileCli = compileCliApp(options);
|
|
170
180
|
try {
|
|
171
181
|
await compileCli;
|
|
@@ -184,7 +194,7 @@ async function run(options) {
|
|
|
184
194
|
}
|
|
185
195
|
process.exit(1);
|
|
186
196
|
}
|
|
187
|
-
await
|
|
197
|
+
await portBackendTaskCompiled;
|
|
188
198
|
const cliDone = runCli(options);
|
|
189
199
|
await cliDone;
|
|
190
200
|
|
|
@@ -202,8 +212,9 @@ async function run(options) {
|
|
|
202
212
|
processedIndexTemplate
|
|
203
213
|
);
|
|
204
214
|
} catch (error) {
|
|
215
|
+
console.trace(error);
|
|
205
216
|
if (error) {
|
|
206
|
-
console.error(error);
|
|
217
|
+
console.error(restoreColorSafe(error));
|
|
207
218
|
}
|
|
208
219
|
buildError = true;
|
|
209
220
|
process.exitCode = 1;
|
|
@@ -215,6 +226,8 @@ async function run(options) {
|
|
|
215
226
|
*/
|
|
216
227
|
function initWorker(basePath, whenDone) {
|
|
217
228
|
return new Promise((resolve, reject) => {
|
|
229
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
230
|
+
const __dirname = path.dirname(__filename);
|
|
218
231
|
activeWorkers += 1;
|
|
219
232
|
let newWorker = {
|
|
220
233
|
worker: new Worker(path.join(__dirname, "./render-worker.js"), {
|
|
@@ -343,7 +356,7 @@ async function fingerprintElmAsset(fullOutputPath, withoutExtension) {
|
|
|
343
356
|
return fileHash;
|
|
344
357
|
}
|
|
345
358
|
|
|
346
|
-
function elmOptimizeLevel2(outputPath, cwd) {
|
|
359
|
+
export function elmOptimizeLevel2(outputPath, cwd) {
|
|
347
360
|
return new Promise((resolve, reject) => {
|
|
348
361
|
const optimizedOutputPath = outputPath + ".opt";
|
|
349
362
|
const subprocess = spawnCallback(
|
|
@@ -364,7 +377,7 @@ function elmOptimizeLevel2(outputPath, cwd) {
|
|
|
364
377
|
|
|
365
378
|
subprocess.on("close", async (code) => {
|
|
366
379
|
if (code === 0) {
|
|
367
|
-
await
|
|
380
|
+
await copyFile(optimizedOutputPath, outputPath);
|
|
368
381
|
resolve();
|
|
369
382
|
} else {
|
|
370
383
|
if (!buildError) {
|
|
@@ -403,7 +416,7 @@ async function spawnElmMake(mode, options, elmEntrypointPath, outputPath, cwd) {
|
|
|
403
416
|
"function appendSubmitter (myFormData, event) { event.submitter && event.submitter.name && event.submitter.name.length > 0 ? myFormData.append(event.submitter.name, event.submitter.value) : myFormData; return myFormData }; return " +
|
|
404
417
|
(options.debug
|
|
405
418
|
? "_Json_wrap(Array.from(appendSubmitter(new FormData(_Json_unwrap(event).target), _Json_unwrap(event))))"
|
|
406
|
-
: "
|
|
419
|
+
: "[...(appendSubmitter(new FormData(event.target), event))]")
|
|
407
420
|
)
|
|
408
421
|
);
|
|
409
422
|
}
|
|
@@ -433,8 +446,9 @@ function modeToOptions(mode) {
|
|
|
433
446
|
*/
|
|
434
447
|
function runElmMake(mode, options, elmEntrypointPath, outputPath, cwd) {
|
|
435
448
|
return new Promise(async (resolve, reject) => {
|
|
449
|
+
const executableName = options.executableName || "lamdera";
|
|
436
450
|
const subprocess = spawnCallback(
|
|
437
|
-
|
|
451
|
+
executableName,
|
|
438
452
|
[
|
|
439
453
|
"make",
|
|
440
454
|
elmEntrypointPath,
|
|
@@ -534,7 +548,7 @@ async function runTerser(filePath) {
|
|
|
534
548
|
}
|
|
535
549
|
}
|
|
536
550
|
|
|
537
|
-
async function compileCliApp(options) {
|
|
551
|
+
export async function compileCliApp(options) {
|
|
538
552
|
await spawnElmMake(
|
|
539
553
|
// TODO should be --optimize, but there seems to be an issue with the html to JSON with --optimize
|
|
540
554
|
options.debug ? "debug" : "optimize",
|
|
@@ -544,7 +558,7 @@ async function compileCliApp(options) {
|
|
|
544
558
|
path.join(process.cwd(), "elm-stuff/elm-pages")
|
|
545
559
|
);
|
|
546
560
|
|
|
547
|
-
const elmFileContent = await fsPromises.readFile(ELM_FILE_PATH, "utf-8");
|
|
561
|
+
const elmFileContent = await fsPromises.readFile(ELM_FILE_PATH(), "utf-8");
|
|
548
562
|
// Source: https://github.com/elm-explorations/test/blob/d5eb84809de0f8bbf50303efd26889092c800609/src/Elm/Kernel/HtmlAsJson.js
|
|
549
563
|
const forceThunksSource = ` _HtmlAsJson_toJson(x)
|
|
550
564
|
}
|
|
@@ -590,7 +604,7 @@ function _HtmlAsJson_toJson(html) {
|
|
|
590
604
|
`;
|
|
591
605
|
|
|
592
606
|
await fsPromises.writeFile(
|
|
593
|
-
ELM_FILE_PATH,
|
|
607
|
+
ELM_FILE_PATH().replace(/\.js$/, ".cjs"),
|
|
594
608
|
elmFileContent
|
|
595
609
|
.replace(
|
|
596
610
|
/return \$elm\$json\$Json\$Encode\$string\(.REPLACE_ME_WITH_JSON_STRINGIFY.\)/g,
|
|
@@ -605,14 +619,14 @@ function _HtmlAsJson_toJson(html) {
|
|
|
605
619
|
async function runAdapter(adaptFn, processedIndexTemplate) {
|
|
606
620
|
try {
|
|
607
621
|
await adaptFn({
|
|
608
|
-
renderFunctionFilePath: "./elm-stuff/elm-pages/elm.
|
|
622
|
+
renderFunctionFilePath: "./elm-stuff/elm-pages/elm.cjs",
|
|
609
623
|
routePatterns: JSON.parse(
|
|
610
624
|
await fsPromises.readFile("./dist/route-patterns.json", "utf-8")
|
|
611
625
|
),
|
|
612
626
|
apiRoutePatterns: JSON.parse(
|
|
613
627
|
await fsPromises.readFile("./dist/api-patterns.json", "utf-8")
|
|
614
628
|
),
|
|
615
|
-
portsFilePath: "./.elm-pages/compiled-ports/
|
|
629
|
+
portsFilePath: "./.elm-pages/compiled-ports/custom-backend-task.mjs",
|
|
616
630
|
htmlTemplate: processedIndexTemplate,
|
|
617
631
|
});
|
|
618
632
|
console.log("Success - Adapter script complete");
|
|
@@ -627,6 +641,31 @@ async function runAdapter(adaptFn, processedIndexTemplate) {
|
|
|
627
641
|
}
|
|
628
642
|
}
|
|
629
643
|
|
|
644
|
+
// Source: https://github.com/vitejs/vite/blob/c53ffec3465d2d28d08d29ca61313469e03f5dd6/playground/ssr-vue/src/entry-server.js#L50-L68
|
|
645
|
+
/**
|
|
646
|
+
* @param {string} file
|
|
647
|
+
*/
|
|
648
|
+
function defaultPreloadForFile(file) {
|
|
649
|
+
if (file.endsWith(".js")) {
|
|
650
|
+
return `<link rel="modulepreload" crossorigin href="${file}">`;
|
|
651
|
+
} else if (file.endsWith(".css")) {
|
|
652
|
+
return `<link rel="preload" href="${file}" as="style">`;
|
|
653
|
+
} else if (file.endsWith(".woff")) {
|
|
654
|
+
return ` <link rel="preload" href="${file}" as="font" type="font/woff" crossorigin>`;
|
|
655
|
+
} else if (file.endsWith(".woff2")) {
|
|
656
|
+
return ` <link rel="preload" href="${file}" as="font" type="font/woff2" crossorigin>`;
|
|
657
|
+
} else if (file.endsWith(".gif")) {
|
|
658
|
+
return ` <link rel="preload" href="${file}" as="image" type="image/gif">`;
|
|
659
|
+
} else if (file.endsWith(".jpg") || file.endsWith(".jpeg")) {
|
|
660
|
+
return ` <link rel="preload" href="${file}" as="image" type="image/jpeg">`;
|
|
661
|
+
} else if (file.endsWith(".png")) {
|
|
662
|
+
return ` <link rel="preload" href="${file}" as="image" type="image/png">`;
|
|
663
|
+
} else {
|
|
664
|
+
// TODO
|
|
665
|
+
return "";
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
630
669
|
/** @typedef { { route : string; contentJson : string; head : SeoTag[]; html: string; body: string; } } FromElm */
|
|
631
670
|
/** @typedef {HeadTag | JsonLdTag} SeoTag */
|
|
632
671
|
/** @typedef {{ name: string; attributes: string[][]; type: 'head' }} HeadTag */
|
|
@@ -641,5 +680,3 @@ async function runAdapter(adaptFn, processedIndexTemplate) {
|
|
|
641
680
|
* @param {string} contentJsonString
|
|
642
681
|
* @returns {string}
|
|
643
682
|
*/
|
|
644
|
-
|
|
645
|
-
module.exports = { run };
|