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.
Files changed (129) hide show
  1. package/README.md +10 -1
  2. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2864 -2589
  3. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1447 -342
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16458 -13724
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  14. package/generator/dead-code-review/elm.json +9 -7
  15. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
  16. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
  17. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  21. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  22. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  23. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  24. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  25. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1447 -342
  26. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +24542 -21748
  27. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  28. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  29. package/generator/review/elm.json +10 -10
  30. package/generator/src/RouteBuilder.elm +113 -107
  31. package/generator/src/SharedTemplate.elm +3 -2
  32. package/generator/src/SiteConfig.elm +3 -2
  33. package/generator/src/basepath-middleware.js +3 -3
  34. package/generator/src/build.js +125 -88
  35. package/generator/src/cli.js +273 -88
  36. package/generator/src/codegen.js +29 -27
  37. package/generator/src/compatibility-key.js +3 -0
  38. package/generator/src/compile-elm.js +43 -26
  39. package/generator/src/config.js +39 -0
  40. package/generator/src/copy-dir.js +2 -2
  41. package/generator/src/dev-server.js +150 -133
  42. package/generator/src/dir-helpers.js +9 -26
  43. package/generator/src/elm-codegen.js +5 -4
  44. package/generator/src/elm-file-constants.js +2 -3
  45. package/generator/src/error-formatter.js +12 -11
  46. package/generator/src/file-helpers.js +3 -4
  47. package/generator/src/generate-template-module-connector.js +23 -22
  48. package/generator/src/init.js +9 -8
  49. package/generator/src/pre-render-html.js +39 -28
  50. package/generator/src/render-test.js +109 -0
  51. package/generator/src/render-worker.js +25 -28
  52. package/generator/src/render.js +320 -142
  53. package/generator/src/request-cache.js +252 -163
  54. package/generator/src/resolve-elm-module.js +63 -0
  55. package/generator/src/rewrite-client-elm-json.js +6 -5
  56. package/generator/src/rewrite-elm-json-help.js +56 -0
  57. package/generator/src/rewrite-elm-json.js +17 -7
  58. package/generator/src/route-codegen-helpers.js +16 -31
  59. package/generator/src/seo-renderer.js +12 -7
  60. package/generator/src/vite-utils.js +77 -0
  61. package/generator/static-code/hmr.js +79 -13
  62. package/generator/template/app/Api.elm +6 -5
  63. package/generator/template/app/Effect.elm +123 -0
  64. package/generator/template/app/ErrorPage.elm +37 -6
  65. package/generator/template/app/Route/Index.elm +17 -10
  66. package/generator/template/app/Shared.elm +24 -47
  67. package/generator/template/app/Site.elm +19 -6
  68. package/generator/template/app/View.elm +1 -8
  69. package/generator/template/elm-tooling.json +0 -3
  70. package/generator/template/elm.json +32 -24
  71. package/generator/template/package.json +10 -4
  72. package/package.json +29 -27
  73. package/src/ApiRoute.elm +199 -61
  74. package/src/BackendTask/Custom.elm +325 -0
  75. package/src/BackendTask/Env.elm +90 -0
  76. package/src/{DataSource → BackendTask}/File.elm +128 -43
  77. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  78. package/src/BackendTask/Http.elm +673 -0
  79. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  80. package/src/BackendTask/Internal/Request.elm +28 -0
  81. package/src/BackendTask/Random.elm +79 -0
  82. package/src/BackendTask/Time.elm +47 -0
  83. package/src/BackendTask.elm +537 -0
  84. package/src/FatalError.elm +89 -0
  85. package/src/Form/Field.elm +21 -9
  86. package/src/Form/FieldView.elm +94 -14
  87. package/src/Form.elm +275 -400
  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/FormState.elm +6 -5
  93. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  94. package/src/Pages/Internal/FatalError.elm +5 -0
  95. package/src/Pages/Internal/Form.elm +21 -1
  96. package/src/Pages/{Msg.elm → Internal/Msg.elm} +26 -16
  97. package/src/Pages/Internal/Platform/Cli.elm +598 -763
  98. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  99. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  100. package/src/Pages/Internal/Platform/GeneratorApplication.elm +373 -0
  101. package/src/Pages/Internal/Platform/StaticResponses.elm +73 -270
  102. package/src/Pages/Internal/Platform/ToJsPayload.elm +4 -7
  103. package/src/Pages/Internal/Platform.elm +216 -102
  104. package/src/Pages/Internal/Script.elm +17 -0
  105. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  106. package/src/Pages/Manifest.elm +29 -4
  107. package/src/Pages/PageUrl.elm +23 -9
  108. package/src/Pages/ProgramConfig.elm +14 -10
  109. package/src/Pages/Script.elm +109 -0
  110. package/src/Pages/SiteConfig.elm +3 -2
  111. package/src/Pages/StaticHttp/Request.elm +2 -2
  112. package/src/Pages/StaticHttpRequest.elm +23 -98
  113. package/src/PagesMsg.elm +92 -0
  114. package/src/Path.elm +16 -19
  115. package/src/QueryParams.elm +21 -172
  116. package/src/RequestsAndPending.elm +8 -19
  117. package/src/Result/Extra.elm +26 -0
  118. package/src/Scaffold/Form.elm +560 -0
  119. package/src/Scaffold/Route.elm +1388 -0
  120. package/src/Server/Request.elm +43 -37
  121. package/src/Server/Session.elm +62 -42
  122. package/src/Server/SetCookie.elm +12 -4
  123. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  124. package/src/DataSource/Env.elm +0 -38
  125. package/src/DataSource/Http.elm +0 -446
  126. package/src/DataSource/Internal/Request.elm +0 -20
  127. package/src/DataSource/Port.elm +0 -90
  128. package/src/DataSource.elm +0 -538
  129. package/src/Pages/Generate.elm +0 -800
@@ -1,21 +1,25 @@
1
- const fs = require("./dir-helpers.js");
2
- const fsPromises = require("fs").promises;
3
-
4
- const { runElmReview } = require("./compile-elm.js");
5
- const { restoreColorSafe } = require("./error-formatter");
6
- const path = require("path");
7
- const spawnCallback = require("cross-spawn").spawn;
8
- const codegen = require("./codegen.js");
9
- const terser = require("terser");
10
- const os = require("os");
11
- const { Worker, SHARE_ENV } = require("worker_threads");
12
- const { ensureDirSync } = require("./file-helpers.js");
13
- const { generateClientFolder } = require("./codegen.js");
14
- const which = require("which");
15
- const { build } = require("vite");
16
- const preRenderHtml = require("./pre-render-html.js");
17
- const esbuild = require("esbuild");
18
- const { createHash } = require("crypto");
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
- const ELM_FILE_PATH = path.join(
40
- DIR_PATH,
41
- "./elm-stuff/elm-pages",
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 DataSource.Http is called using pure NodeJS HTTP fetching
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
- const config = await import(
84
- path.join(process.cwd(), "elm-pages.config.mjs")
85
- )
86
- .then(async (elmPagesConfig) => {
87
- return elmPagesConfig.default || {};
88
- })
89
- .catch((error) => {
90
- console.warn(
91
- "No `elm-pages.config.mjs` file found. Using default config."
92
- );
93
- return {};
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
- ...viteConfig,
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 = require(assetManifestPath);
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 preloads = `<link rel="modulepreload" href="/${manifest["elm-stuff/elm-pages/index.html"]["file"]}" />`;
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 -->", 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: ["./port-data-source"],
150
+ entryPoints: ["./custom-backend-task"],
141
151
  platform: "node",
142
- outfile: ".elm-pages/compiled-ports/port-data-source.js",
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
- watch: false,
149
- logLevel: "error",
158
+ format: "esm",
159
+ packages: "external",
160
+ logLevel: "silent",
150
161
  })
151
162
  .then((result) => {
152
- global.portsFilePath = Object.keys(result.metafile.outputs)[0];
163
+ try {
164
+ global.portsFilePath = Object.keys(result.metafile.outputs)[0];
165
+ } catch (e) {}
153
166
  })
154
167
  .catch((error) => {
155
- if (
156
- error.errors.length === 1 &&
157
- error.errors[0].text.includes(
158
- `Could not resolve "./port-data-source"`
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 portDataSourceCompiled;
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 fs.copyFile(optimizedOutputPath, outputPath);
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
- : "Array.from(new FormData(event.target))")
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
- `lamdera`,
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.js",
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/port-data-source.js",
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 };