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,12 +1,15 @@
1
- const fs = require("fs");
2
- const copySync = require("fs-extra").copySync;
3
- const path = require("path");
4
- const kleur = require("kleur");
1
+ import * as fs from "fs";
2
+ import * as fsExtra from "fs-extra";
3
+ import * as path from "path";
4
+ import * as kleur from "kleur/colors";
5
+ import { fileURLToPath } from "url";
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
5
8
 
6
9
  /**
7
10
  * @param {string} name
8
11
  */
9
- async function run(name) {
12
+ export async function run(name) {
10
13
  console.log("Creating " + name + " project...");
11
14
 
12
15
  const appRoot = path.resolve(name.toString());
@@ -14,7 +17,7 @@ async function run(name) {
14
17
 
15
18
  if (!fs.existsSync(name)) {
16
19
  try {
17
- copySync(template, appRoot);
20
+ fsExtra.copySync(template, appRoot);
18
21
  fs.renameSync(
19
22
  path.resolve(appRoot, "gitignore"),
20
23
  path.resolve(appRoot, ".gitignore")
@@ -36,5 +39,3 @@ async function run(name) {
36
39
  kleur.green("Project is successfully created in `" + appRoot + "`.")
37
40
  );
38
41
  }
39
-
40
- module.exports = { run };
@@ -1,11 +1,12 @@
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 path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { packageVersion } from "./compatibility-key.js";
4
5
 
5
6
  /** @typedef { { head: any[]; errors: any[]; html: string; route: string; title: string; } } Arg */
6
7
  /** @typedef { { tag : 'PageProgress'; args : Arg[] } } PageProgress */
7
8
 
8
- function wrapHtml(basePath, fromElm, contentDatPayload) {
9
+ export function wrapHtml(basePath, fromElm, contentDatPayload) {
9
10
  const seoData = seo.gather(fromElm.head);
10
11
  return {
11
12
  kind: "html-template",
@@ -17,28 +18,34 @@ function wrapHtml(basePath, fromElm, contentDatPayload) {
17
18
  };
18
19
  }
19
20
 
20
- function templateHtml() {
21
+ /**
22
+ * @param {boolean} devMode
23
+ * @param {(context: {cliVersion: string;}) => string} userHeadTagsTemplate
24
+ */
25
+ export function templateHtml(devMode, userHeadTagsTemplate) {
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = path.dirname(__filename);
21
28
  return /* html */ `<!DOCTYPE html>
22
29
  <!-- ROOT --><html lang="en">
23
30
  <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
31
  <meta charset="UTF-8" />
32
- <meta name="viewport" content="width=device-width,initial-scale=1" />
33
32
  <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
- />
33
+ ${
34
+ devMode
35
+ ? `<script src="/hmr.js" type="text/javascript"></script>
36
+ <link rel="stylesheet" href="/dev-style.css">`
37
+ : `<!-- PLACEHOLDER_PRELOADS -->`
38
+ }
39
+ <script defer src="/elm.js" type="text/javascript"></script>
40
+ ${
41
+ devMode
42
+ ? `<script src="/elm-pages.js" type="module"></script>`
43
+ : `<script defer src="${path.join(
44
+ __dirname,
45
+ "../static-code/elm-pages.js"
46
+ )}" type="module"></script>`
47
+ }
48
+ ${indent(userHeadTagsTemplate({ cliVersion: packageVersion }))}
42
49
  <!-- PLACEHOLDER_HEAD_AND_DATA -->
43
50
  </head>
44
51
  <body>
@@ -48,10 +55,20 @@ function templateHtml() {
48
55
  </html>`;
49
56
  }
50
57
 
58
+ /**
59
+ * @param {string} snippet
60
+ */
61
+ function indent(snippet) {
62
+ return snippet
63
+ .split("\n")
64
+ .map((line) => ` ${line}`)
65
+ .join("\n");
66
+ }
67
+
51
68
  /**
52
69
  * @param {string} processedTemplate
53
70
  */
54
- function replaceTemplate(processedTemplate, info) {
71
+ export function replaceTemplate(processedTemplate, info) {
55
72
  return processedTemplate
56
73
  .replace(
57
74
  /<!--\s*PLACEHOLDER_HEAD_AND_DATA\s*-->/,
@@ -62,9 +79,3 @@ function replaceTemplate(processedTemplate, info) {
62
79
  .replace(/<!--\s*PLACEHOLDER_HTML\s* -->/, info.html)
63
80
  .replace(/<!-- ROOT -->\S*<html lang="en">/m, info.rootElement);
64
81
  }
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,19 @@
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 { parentPort, threadId, workerData } from "node:worker_threads";
6
+ import * as url from "node:url";
9
7
 
10
8
  async function run({ mode, pathname, serverRequest, portsFilePath }) {
11
9
  console.time(`${threadId} ${pathname}`);
12
10
  try {
13
- const renderResult = await renderer(
14
- portsFilePath,
11
+ const renderResult = await renderer.render(
12
+ typeof portsFilePath === "string"
13
+ ? await import(url.pathToFileURL(path.resolve(portsFilePath)).href)
14
+ : portsFilePath,
15
15
  workerData.basePath,
16
- requireElm(mode),
16
+ await requireElm(mode),
17
17
  mode,
18
18
  pathname,
19
19
  serverRequest,
@@ -42,20 +42,17 @@ async function run({ mode, pathname, serverRequest, portsFilePath }) {
42
42
  console.timeEnd(`${threadId} ${pathname}`);
43
43
  }
44
44
 
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
- }
45
+ async function requireElm(mode) {
46
+ const compiledElmPath = path.join(
47
+ process.cwd(),
48
+ "elm-stuff/elm-pages/elm.cjs"
49
+ );
50
+ let pathAsUrl = url.pathToFileURL(compiledElmPath);
51
+ const warnOriginal = console.warn;
52
+ console.warn = function () {};
53
+ const Elm = (await import(pathAsUrl.toString())).default;
54
+ console.warn = warnOriginal;
55
+ return Elm;
59
56
  }
60
57
 
61
58
  async function outputString(
@@ -67,13 +64,13 @@ async function outputString(
67
64
  const args = fromElm;
68
65
  const normalizedRoute = args.route.replace(/index$/, "");
69
66
  await fs.tryMkdir(`./dist/${normalizedRoute}`);
70
- const template = await fs.readFileSync("./dist/template.html", "utf8");
71
- fs.writeFileSync(
67
+ const template = readFileSync("./dist/template.html", "utf8");
68
+ writeFileSync(
72
69
  `dist/${normalizedRoute}/index.html`,
73
70
  renderTemplate(template, fromElm)
74
71
  );
75
72
  args.contentDatPayload &&
76
- fs.writeFileSync(
73
+ writeFileSync(
77
74
  `dist/${normalizedRoute}/content.dat`,
78
75
  Buffer.from(args.contentDatPayload.buffer)
79
76
  );