elm-pages 3.0.0-beta.2 → 3.0.0-beta.20

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 (109) hide show
  1. package/README.md +10 -1
  2. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2420 -1592
  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 +1326 -121
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +15215 -13007
  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 +1 -1
  14. package/generator/dead-code-review/elm.json +8 -6
  15. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +189 -17
  16. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +255 -21
  17. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  21. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1326 -121
  22. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +14620 -12636
  23. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  24. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
  25. package/generator/review/elm.json +8 -8
  26. package/generator/src/RouteBuilder.elm +66 -52
  27. package/generator/src/SharedTemplate.elm +3 -2
  28. package/generator/src/SiteConfig.elm +3 -2
  29. package/generator/src/basepath-middleware.js +3 -3
  30. package/generator/src/build.js +122 -86
  31. package/generator/src/cli.js +247 -51
  32. package/generator/src/codegen.js +29 -27
  33. package/generator/src/compatibility-key.js +1 -0
  34. package/generator/src/compile-elm.js +20 -22
  35. package/generator/src/config.js +39 -0
  36. package/generator/src/copy-dir.js +2 -2
  37. package/generator/src/dev-server.js +119 -110
  38. package/generator/src/dir-helpers.js +9 -26
  39. package/generator/src/elm-codegen.js +5 -4
  40. package/generator/src/elm-file-constants.js +2 -3
  41. package/generator/src/error-formatter.js +12 -11
  42. package/generator/src/file-helpers.js +3 -4
  43. package/generator/src/generate-template-module-connector.js +14 -21
  44. package/generator/src/init.js +8 -7
  45. package/generator/src/pre-render-html.js +41 -28
  46. package/generator/src/render-test.js +109 -0
  47. package/generator/src/render-worker.js +26 -28
  48. package/generator/src/render.js +322 -142
  49. package/generator/src/request-cache.js +200 -162
  50. package/generator/src/rewrite-client-elm-json.js +5 -5
  51. package/generator/src/rewrite-elm-json.js +7 -7
  52. package/generator/src/route-codegen-helpers.js +16 -31
  53. package/generator/src/seo-renderer.js +12 -7
  54. package/generator/src/vite-utils.js +77 -0
  55. package/generator/static-code/hmr.js +16 -2
  56. package/generator/template/app/Api.elm +3 -3
  57. package/generator/template/app/Route/Index.elm +3 -3
  58. package/generator/template/app/Shared.elm +3 -3
  59. package/generator/template/app/Site.elm +9 -4
  60. package/package.json +21 -21
  61. package/src/ApiRoute.elm +199 -61
  62. package/src/BackendTask/Custom.elm +214 -0
  63. package/src/BackendTask/Env.elm +90 -0
  64. package/src/{DataSource → BackendTask}/File.elm +128 -43
  65. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  66. package/src/BackendTask/Http.elm +673 -0
  67. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  68. package/src/BackendTask/Internal/Request.elm +28 -0
  69. package/src/BackendTask/Random.elm +79 -0
  70. package/src/BackendTask/Time.elm +47 -0
  71. package/src/BackendTask.elm +537 -0
  72. package/src/FatalError.elm +89 -0
  73. package/src/Form/Field.elm +1 -1
  74. package/src/Form.elm +72 -92
  75. package/src/Head/Seo.elm +4 -4
  76. package/src/Head.elm +237 -7
  77. package/src/HtmlPrinter.elm +7 -3
  78. package/src/Internal/ApiRoute.elm +7 -5
  79. package/src/PageServerResponse.elm +6 -1
  80. package/src/Pages/Generate.elm +775 -132
  81. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  82. package/src/Pages/Internal/FatalError.elm +5 -0
  83. package/src/Pages/Internal/Form.elm +21 -1
  84. package/src/Pages/Internal/Platform/Cli.elm +479 -747
  85. package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
  86. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  87. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  88. package/src/Pages/Internal/Platform/GeneratorApplication.elm +373 -0
  89. package/src/Pages/Internal/Platform/StaticResponses.elm +73 -270
  90. package/src/Pages/Internal/Platform/ToJsPayload.elm +4 -7
  91. package/src/Pages/Internal/Platform.elm +54 -53
  92. package/src/Pages/Internal/Script.elm +17 -0
  93. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  94. package/src/Pages/Manifest.elm +29 -4
  95. package/src/Pages/ProgramConfig.elm +12 -8
  96. package/src/Pages/Script.elm +109 -0
  97. package/src/Pages/SiteConfig.elm +3 -2
  98. package/src/Pages/StaticHttp/Request.elm +2 -2
  99. package/src/Pages/StaticHttpRequest.elm +23 -98
  100. package/src/RequestsAndPending.elm +8 -19
  101. package/src/Result/Extra.elm +21 -0
  102. package/src/Server/Request.elm +43 -34
  103. package/src/Server/Session.elm +166 -100
  104. package/src/Server/SetCookie.elm +89 -31
  105. package/src/DataSource/Env.elm +0 -38
  106. package/src/DataSource/Http.elm +0 -446
  107. package/src/DataSource/Internal/Request.elm +0 -20
  108. package/src/DataSource/Port.elm +0 -90
  109. package/src/DataSource.elm +0 -538
@@ -1,11 +1,14 @@
1
- const seo = require("./seo-renderer.js");
2
- const cliVersion = require("../../package.json").version;
3
- const path = require("path");
1
+ import * as seo from "./seo-renderer.js";
2
+ import * as packageJson from "../../package.json" assert { type: "json" };
3
+ import * as path from "path";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const cliVersion = packageJson.version;
4
7
 
5
8
  /** @typedef { { head: any[]; errors: any[]; html: string; route: string; title: string; } } Arg */
6
9
  /** @typedef { { tag : 'PageProgress'; args : Arg[] } } PageProgress */
7
10
 
8
- function wrapHtml(basePath, fromElm, contentDatPayload) {
11
+ export function wrapHtml(basePath, fromElm, contentDatPayload) {
9
12
  const seoData = seo.gather(fromElm.head);
10
13
  return {
11
14
  kind: "html-template",
@@ -17,28 +20,34 @@ function wrapHtml(basePath, fromElm, contentDatPayload) {
17
20
  };
18
21
  }
19
22
 
20
- function templateHtml() {
23
+ /**
24
+ * @param {boolean} devMode
25
+ * @param {(context: {cliVersion: string;}) => string} userHeadTagsTemplate
26
+ */
27
+ export function templateHtml(devMode, userHeadTagsTemplate) {
28
+ const __filename = fileURLToPath(import.meta.url);
29
+ const __dirname = path.dirname(__filename);
21
30
  return /* html */ `<!DOCTYPE html>
22
31
  <!-- ROOT --><html lang="en">
23
32
  <head>
24
- <!-- PLACEHOLDER_PRELOADS -->
25
- <script defer src="/elm.js" type="text/javascript"></script>
26
- <script defer src="${path.join(
27
- __dirname,
28
- "../static-code/elm-pages.js"
29
- )}" type="module"></script>
30
- <link rel="stylesheet" href="/style.css" />
31
33
  <meta charset="UTF-8" />
32
- <meta name="viewport" content="width=device-width,initial-scale=1" />
33
34
  <title><!-- PLACEHOLDER_TITLE --></title>
34
- <meta name="generator" content="elm-pages v${cliVersion}" />
35
- <meta name="mobile-web-app-capable" content="yes" />
36
- <meta name="theme-color" content="#ffffff" />
37
- <meta name="apple-mobile-web-app-capable" content="yes" />
38
- <meta
39
- name="apple-mobile-web-app-status-bar-style"
40
- content="black-translucent"
41
- />
35
+ ${
36
+ devMode
37
+ ? `<script src="/hmr.js" type="text/javascript"></script>
38
+ <link rel="stylesheet" href="/dev-style.css">`
39
+ : `<!-- PLACEHOLDER_PRELOADS -->`
40
+ }
41
+ <script defer src="/elm.js" type="text/javascript"></script>
42
+ ${
43
+ devMode
44
+ ? `<script src="/elm-pages.js" type="module"></script>`
45
+ : `<script defer src="${path.join(
46
+ __dirname,
47
+ "../static-code/elm-pages.js"
48
+ )}" type="module"></script>`
49
+ }
50
+ ${indent(userHeadTagsTemplate({ cliVersion }))}
42
51
  <!-- PLACEHOLDER_HEAD_AND_DATA -->
43
52
  </head>
44
53
  <body>
@@ -48,10 +57,20 @@ function templateHtml() {
48
57
  </html>`;
49
58
  }
50
59
 
60
+ /**
61
+ * @param {string} snippet
62
+ */
63
+ function indent(snippet) {
64
+ return snippet
65
+ .split("\n")
66
+ .map((line) => ` ${line}`)
67
+ .join("\n");
68
+ }
69
+
51
70
  /**
52
71
  * @param {string} processedTemplate
53
72
  */
54
- function replaceTemplate(processedTemplate, info) {
73
+ export function replaceTemplate(processedTemplate, info) {
55
74
  return processedTemplate
56
75
  .replace(
57
76
  /<!--\s*PLACEHOLDER_HEAD_AND_DATA\s*-->/,
@@ -62,9 +81,3 @@ function replaceTemplate(processedTemplate, info) {
62
81
  .replace(/<!--\s*PLACEHOLDER_HTML\s* -->/, info.html)
63
82
  .replace(/<!-- ROOT -->\S*<html lang="en">/m, info.rootElement);
64
83
  }
65
-
66
- module.exports = {
67
- wrapHtml,
68
- templateHtml,
69
- replaceTemplate,
70
- };
@@ -0,0 +1,109 @@
1
+ const renderer = require("../../generator/src/render");
2
+ const path = require("path");
3
+ const compiledElmPath = path.join(process.cwd(), "elm-stuff/elm-pages/elm.js");
4
+ const codegen = require("./codegen.js");
5
+ const {
6
+ compileElmForBrowser,
7
+ runElmReview,
8
+ compileCliApp,
9
+ } = require("./compile-elm.js");
10
+ const { restoreColorSafe } = require("./error-formatter");
11
+
12
+ async function run({ pathname, serverRequest }) {
13
+ try {
14
+ const basePath = "/";
15
+ await codegen.generate(basePath);
16
+ console.log("Compiling...");
17
+ await compileCliApp(
18
+ { port: 1234, base: basePath, https: false, debug: true },
19
+ ".elm-pages/Main.elm",
20
+
21
+ path.join(process.cwd(), "elm-stuff/elm-pages/", "elm.js"),
22
+
23
+ // "elm.js",
24
+ "elm-stuff/elm-pages/",
25
+ path.join("elm-stuff/elm-pages/", "elm.js")
26
+ );
27
+ console.log("Compiling DONE");
28
+
29
+ const portsFilePath =
30
+ ".elm-pages/compiled-ports/custom-backend-task-FA2IJND6.js";
31
+ const mode = "dev-server";
32
+
33
+ const renderResult = await renderer.render(
34
+ portsFilePath,
35
+ basePath,
36
+ require(compiledElmPath),
37
+ mode,
38
+ pathname,
39
+ serverRequest,
40
+ function (patterns) {},
41
+ true
42
+ );
43
+ console.log("renderResult", renderResult);
44
+ } catch (error) {
45
+ console.log("ERROR");
46
+ console.log(restoreColorSafe(error));
47
+ }
48
+ }
49
+
50
+ // run({
51
+ // serverRequest: {
52
+ // method: "POST",
53
+ // headers: {
54
+ // host: "localhost:1234",
55
+ // cookie: "darkMode=%7B%7D.X1hjuYBa1OZulUomD5yrPy6VcYeY3sC7SKZVGViT0Q4",
56
+ // accept: "*/*",
57
+ // "accept-language": "en-US,en;q=0.9",
58
+ // connection: "keep-alive",
59
+ // "content-type": "application/x-www-form-urlencoded",
60
+ // origin: "http://localhost:1234",
61
+ // referer: "http://localhost:1234/dark-mode",
62
+ // },
63
+ // rawUrl: "http://localhost:1234/dark-mode/content.dat",
64
+ // body: "name=1",
65
+ // requestTime: 1671391652138,
66
+ // multiPartFormData: null,
67
+ // },
68
+ // pathname: "/dark-mode/content.dat",
69
+ // });
70
+
71
+ // run({
72
+ // pathname: "/fetcher/content.dat",
73
+ // serverRequest: {
74
+ // method: "POST",
75
+ // headers: {
76
+ // host: "localhost:1234",
77
+ // cookie: "darkMode=%7B%7D",
78
+ // accept: "*/*",
79
+ // "content-type": "application/x-www-form-urlencoded",
80
+ // origin: "http://localhost:1234",
81
+ // referer: "http://localhost:1234/fetcher",
82
+ // },
83
+ // rawUrl: "http://localhost:1234/fetcher/content.dat",
84
+ // body: "name=1",
85
+ // requestTime: 1671296755228,
86
+ // multiPartFormData: null,
87
+ // },
88
+ // });
89
+
90
+ run({
91
+ serverRequest: {
92
+ method: "POST",
93
+ headers: {
94
+ host: "localhost:1234",
95
+ "cache-control": "max-age=0",
96
+ accept:
97
+ "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
98
+ "content-type": "application/x-www-form-urlencoded",
99
+ referer: "http://localhost:1234/login",
100
+ cookie:
101
+ "darkMode=%7B%22darkMode%22%3A%22%22%7D.vtrl8xZXjtx9E3iidJrgurAz4Vk7rnMQmf6zKiAbwNo; mysession=%7B%7D.YX1rW5PIpRFkjgIjLn4p9iyl5r9kWLYHqQUYxAYKJgQ",
102
+ },
103
+ rawUrl: "http://localhost:1234/login/content.dat",
104
+ body: "name=1",
105
+ requestTime: 1671391652138,
106
+ multiPartFormData: null,
107
+ },
108
+ pathname: "/login/content.dat",
109
+ });
@@ -1,19 +1,20 @@
1
- const renderer = require("../../generator/src/render");
2
- const path = require("path");
3
- const fs = require("./dir-helpers.js");
4
- const compiledElmPath = path.join(process.cwd(), "elm-stuff/elm-pages/elm.js");
5
- const { parentPort, threadId, workerData } = require("worker_threads");
6
- let Elm;
7
-
8
- global.staticHttpCache = {};
1
+ import * as renderer from "../../generator/src/render.js";
2
+ import * as path from "node:path";
3
+ import * as fs from "./dir-helpers.js";
4
+ import { readFileSync, writeFileSync } from "node:fs";
5
+ import { stat } from "fs/promises";
6
+ import { parentPort, threadId, workerData } from "node:worker_threads";
7
+ import * as url from "url";
9
8
 
10
9
  async function run({ mode, pathname, serverRequest, portsFilePath }) {
11
10
  console.time(`${threadId} ${pathname}`);
12
11
  try {
13
- const renderResult = await renderer(
14
- portsFilePath,
12
+ const renderResult = await renderer.render(
13
+ typeof portsFilePath === "string"
14
+ ? await import(url.pathToFileURL(path.resolve(portsFilePath)).href)
15
+ : portsFilePath,
15
16
  workerData.basePath,
16
- requireElm(mode),
17
+ await requireElm(mode),
17
18
  mode,
18
19
  pathname,
19
20
  serverRequest,
@@ -42,20 +43,17 @@ async function run({ mode, pathname, serverRequest, portsFilePath }) {
42
43
  console.timeEnd(`${threadId} ${pathname}`);
43
44
  }
44
45
 
45
- function requireElm(mode) {
46
- if (mode === "build") {
47
- if (!Elm) {
48
- const warnOriginal = console.warn;
49
- console.warn = function () {};
50
-
51
- Elm = require(compiledElmPath);
52
- console.warn = warnOriginal;
53
- }
54
- return Elm;
55
- } else {
56
- delete require.cache[require.resolve(compiledElmPath)];
57
- return require(compiledElmPath);
58
- }
46
+ async function requireElm(mode) {
47
+ const compiledElmPath = path.join(
48
+ process.cwd(),
49
+ "elm-stuff/elm-pages/elm.cjs"
50
+ );
51
+ let elmImportPath = compiledElmPath;
52
+ const warnOriginal = console.warn;
53
+ console.warn = function () {};
54
+ const Elm = (await import(elmImportPath)).default;
55
+ console.warn = warnOriginal;
56
+ return Elm;
59
57
  }
60
58
 
61
59
  async function outputString(
@@ -67,13 +65,13 @@ async function outputString(
67
65
  const args = fromElm;
68
66
  const normalizedRoute = args.route.replace(/index$/, "");
69
67
  await fs.tryMkdir(`./dist/${normalizedRoute}`);
70
- const template = await fs.readFileSync("./dist/template.html", "utf8");
71
- fs.writeFileSync(
68
+ const template = readFileSync("./dist/template.html", "utf8");
69
+ writeFileSync(
72
70
  `dist/${normalizedRoute}/index.html`,
73
71
  renderTemplate(template, fromElm)
74
72
  );
75
73
  args.contentDatPayload &&
76
- fs.writeFileSync(
74
+ writeFileSync(
77
75
  `dist/${normalizedRoute}/content.dat`,
78
76
  Buffer.from(args.contentDatPayload.buffer)
79
77
  );