elm-pages 3.0.0-beta.9 → 3.0.1
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} +2730 -2938
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/dependencies.c59ecaf7fa8379e3a2d0f793fe9784e3060cb64a6d1fe22b8f6a054502021dbe.json +1 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Console-Text.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Console-Text.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Generated-Main.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Generated-Main.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Color.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Color.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Monochrome.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format-Monochrome.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console-Format.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Console.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Highlightable.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Highlightable.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-JUnit.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-JUnit.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Json.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Json.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Reporter.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-Reporter.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-TestResults.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Reporter-TestResults.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-JsMessage.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-JsMessage.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Console.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Console.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Diff.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node-Vendor-Diff.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/Test-Runner-Node.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/lock +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elm.json +38 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/elmTestOutput.js +30883 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/package.json +1 -0
- package/generator/dead-code-review/elm-stuff/generated-code/elm-community/elm-test/0.19.1-revision9/src/Test/Generated/Main.elm +27 -0
- 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 +17042 -13855
- 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 +2 -2
- package/generator/dead-code-review/elm.json +9 -7
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +64 -13
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +66 -50
- 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 +2 -2
- 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 +34 -25
- 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
package/generator/src/render.js
CHANGED
|
@@ -1,68 +1,221 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { default as mm } from "micromatch";
|
|
5
|
+
import { default as matter } from "gray-matter";
|
|
6
|
+
import * as globby from "globby";
|
|
7
|
+
import * as fsPromises from "node:fs/promises";
|
|
8
|
+
import * as preRenderHtml from "./pre-render-html.js";
|
|
9
|
+
import { lookupOrPerform } from "./request-cache.js";
|
|
10
|
+
import * as kleur from "kleur/colors";
|
|
11
|
+
import * as cookie from "cookie-signature";
|
|
12
|
+
import { compatibilityKey } from "./compatibility-key.js";
|
|
13
|
+
import * as fs from "node:fs";
|
|
14
|
+
import * as crypto from "node:crypto";
|
|
15
|
+
import { restoreColorSafe } from "./error-formatter.js";
|
|
14
16
|
|
|
15
17
|
process.on("unhandledRejection", (error) => {
|
|
16
18
|
console.error(error);
|
|
17
19
|
});
|
|
18
20
|
let foundErrors;
|
|
19
|
-
let pendingDataSourceResponses;
|
|
20
|
-
let pendingDataSourceCount;
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param {string} basePath
|
|
25
|
+
* @param {Object} elmModule
|
|
26
|
+
* @param {string} path
|
|
27
|
+
* @param {{ method: string; hostname: string; query: Record<string, string | undefined>; headers: Record<string, string>; host: string; pathname: string; port: number | null; protocol: string; rawUrl: string; }} request
|
|
28
|
+
* @param {(pattern: string) => void} addBackendTaskWatcher
|
|
29
|
+
* @param {boolean} hasFsAccess
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
export async function render(
|
|
33
|
+
portsFile,
|
|
34
|
+
basePath,
|
|
35
|
+
elmModule,
|
|
36
|
+
mode,
|
|
37
|
+
path,
|
|
38
|
+
request,
|
|
39
|
+
addBackendTaskWatcher,
|
|
40
|
+
hasFsAccess
|
|
41
|
+
) {
|
|
42
|
+
// const { fs, resetInMemoryFs } = require("./request-cache-fs.js")(hasFsAccess);
|
|
43
|
+
// resetInMemoryFs();
|
|
44
|
+
foundErrors = false;
|
|
45
|
+
// since init/update are never called in pre-renders, and BackendTask.Http is called using pure NodeJS HTTP fetching
|
|
46
|
+
// we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
|
|
47
|
+
global.XMLHttpRequest = {};
|
|
48
|
+
const result = await runElmApp(
|
|
34
49
|
portsFile,
|
|
35
50
|
basePath,
|
|
36
51
|
elmModule,
|
|
37
52
|
mode,
|
|
38
53
|
path,
|
|
39
54
|
request,
|
|
40
|
-
|
|
55
|
+
addBackendTaskWatcher,
|
|
41
56
|
hasFsAccess
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {Object} elmModule
|
|
63
|
+
* @returns
|
|
64
|
+
* @param {string[]} cliOptions
|
|
65
|
+
* @param {any} portsFile
|
|
66
|
+
* @param {string} scriptModuleName
|
|
67
|
+
*/
|
|
68
|
+
export async function runGenerator(
|
|
69
|
+
cliOptions,
|
|
70
|
+
portsFile,
|
|
71
|
+
elmModule,
|
|
72
|
+
scriptModuleName
|
|
73
|
+
) {
|
|
74
|
+
global.isRunningGenerator = true;
|
|
75
|
+
// const { fs, resetInMemoryFs } = require("./request-cache-fs.js")(true);
|
|
76
|
+
// resetInMemoryFs();
|
|
77
|
+
foundErrors = false;
|
|
78
|
+
// since init/update are never called in pre-renders, and BackendTask.Http is called using pure NodeJS HTTP fetching
|
|
79
|
+
// we can provide a fake HTTP instead of xhr2 (which is otherwise needed for Elm HTTP requests from Node)
|
|
80
|
+
global.XMLHttpRequest = {};
|
|
81
|
+
try {
|
|
82
|
+
const result = await runGeneratorAppHelp(
|
|
83
|
+
cliOptions,
|
|
54
84
|
portsFile,
|
|
55
|
-
|
|
85
|
+
"",
|
|
56
86
|
elmModule,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
fs,
|
|
62
|
-
hasFsAccess
|
|
87
|
+
scriptModuleName,
|
|
88
|
+
"production",
|
|
89
|
+
"",
|
|
90
|
+
true
|
|
63
91
|
);
|
|
64
92
|
return result;
|
|
65
|
-
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
console.log(restoreColorSafe(error));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @param {string} basePath
|
|
100
|
+
* @param {Object} elmModule
|
|
101
|
+
* @param {string} pagePath
|
|
102
|
+
* @param {string} mode
|
|
103
|
+
* @returns {Promise<({is404: boolean;} & ({kind: 'json';contentJson: string;} | {kind: 'html';htmlString: string;} | {kind: 'api-response';body: string;}))>}
|
|
104
|
+
* @param {string[]} cliOptions
|
|
105
|
+
* @param {any} portsFile
|
|
106
|
+
* @param {typeof import("fs") | import("memfs").IFs} fs
|
|
107
|
+
* @param {boolean} hasFsAccess
|
|
108
|
+
* @param {string} scriptModuleName
|
|
109
|
+
*/
|
|
110
|
+
function runGeneratorAppHelp(
|
|
111
|
+
cliOptions,
|
|
112
|
+
portsFile,
|
|
113
|
+
basePath,
|
|
114
|
+
elmModule,
|
|
115
|
+
scriptModuleName,
|
|
116
|
+
mode,
|
|
117
|
+
pagePath,
|
|
118
|
+
hasFsAccess
|
|
119
|
+
) {
|
|
120
|
+
const isDevServer = mode !== "build";
|
|
121
|
+
let patternsToWatch = new Set();
|
|
122
|
+
let app = null;
|
|
123
|
+
let killApp;
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const isBytes = pagePath.match(/content\.dat\/?$/);
|
|
126
|
+
|
|
127
|
+
app = elmModule.Elm.Main.init({
|
|
128
|
+
flags: {
|
|
129
|
+
compatibilityKey,
|
|
130
|
+
argv: ["", `elm-pages run ${scriptModuleName}`, ...cliOptions],
|
|
131
|
+
versionMessage: "1.2.3",
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
killApp = () => {
|
|
136
|
+
app.ports.toJsPort.unsubscribe(portHandler);
|
|
137
|
+
app.die();
|
|
138
|
+
app = null;
|
|
139
|
+
// delete require.cache[require.resolve(compiledElmPath)];
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
async function portHandler(/** @type { FromElm } */ newThing) {
|
|
143
|
+
let fromElm;
|
|
144
|
+
let contentDatPayload;
|
|
145
|
+
|
|
146
|
+
fromElm = newThing;
|
|
147
|
+
if (fromElm.command === "log") {
|
|
148
|
+
console.log(fromElm.value);
|
|
149
|
+
} else if (fromElm.tag === "ApiResponse") {
|
|
150
|
+
// Finished successfully
|
|
151
|
+
process.exit(0);
|
|
152
|
+
} else if (fromElm.tag === "PageProgress") {
|
|
153
|
+
const args = fromElm.args[0];
|
|
154
|
+
|
|
155
|
+
if (isBytes) {
|
|
156
|
+
resolve({
|
|
157
|
+
kind: "bytes",
|
|
158
|
+
is404: false,
|
|
159
|
+
contentJson: JSON.stringify({
|
|
160
|
+
staticData: args.contentJson,
|
|
161
|
+
is404: false,
|
|
162
|
+
}),
|
|
163
|
+
statusCode: args.statusCode,
|
|
164
|
+
headers: args.headers,
|
|
165
|
+
contentDatPayload,
|
|
166
|
+
});
|
|
167
|
+
} else {
|
|
168
|
+
resolve(
|
|
169
|
+
outputString(basePath, fromElm, isDevServer, contentDatPayload)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
} else if (fromElm.tag === "DoHttp") {
|
|
173
|
+
app.ports.gotBatchSub.send(
|
|
174
|
+
Object.fromEntries(
|
|
175
|
+
await Promise.all(
|
|
176
|
+
fromElm.args[0].map(([requestHash, requestToPerform]) => {
|
|
177
|
+
if (
|
|
178
|
+
requestToPerform.url !== "elm-pages-internal://port" &&
|
|
179
|
+
requestToPerform.url.startsWith("elm-pages-internal://")
|
|
180
|
+
) {
|
|
181
|
+
return runInternalJob(
|
|
182
|
+
requestHash,
|
|
183
|
+
app,
|
|
184
|
+
mode,
|
|
185
|
+
requestToPerform,
|
|
186
|
+
hasFsAccess,
|
|
187
|
+
patternsToWatch
|
|
188
|
+
);
|
|
189
|
+
} else {
|
|
190
|
+
return runHttpJob(
|
|
191
|
+
requestHash,
|
|
192
|
+
portsFile,
|
|
193
|
+
app,
|
|
194
|
+
mode,
|
|
195
|
+
requestToPerform,
|
|
196
|
+
hasFsAccess,
|
|
197
|
+
requestToPerform
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
);
|
|
204
|
+
} else if (fromElm.tag === "Errors") {
|
|
205
|
+
foundErrors = true;
|
|
206
|
+
reject(fromElm.args[0].errorsJson);
|
|
207
|
+
} else {
|
|
208
|
+
console.log(fromElm);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
app.ports.toJsPort.subscribe(portHandler);
|
|
212
|
+
}).finally(() => {
|
|
213
|
+
try {
|
|
214
|
+
killApp();
|
|
215
|
+
killApp = null;
|
|
216
|
+
} catch (error) {}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
66
219
|
|
|
67
220
|
/**
|
|
68
221
|
* @param {string} basePath
|
|
@@ -70,7 +223,7 @@ module.exports =
|
|
|
70
223
|
* @param {string} pagePath
|
|
71
224
|
* @param {string} mode
|
|
72
225
|
* @param {{ method: string; hostname: string; query: string; headers: Object; host: string; pathname: string; port: string; protocol: string; rawUrl: string; }} request
|
|
73
|
-
* @param {(pattern: string) => void}
|
|
226
|
+
* @param {(pattern: string) => void} addBackendTaskWatcher
|
|
74
227
|
* @returns {Promise<({is404: boolean} & ( { kind: 'json'; contentJson: string} | { kind: 'html'; htmlString: string } | { kind: 'api-response'; body: string; }) )>}
|
|
75
228
|
*/
|
|
76
229
|
function runElmApp(
|
|
@@ -80,8 +233,7 @@ function runElmApp(
|
|
|
80
233
|
mode,
|
|
81
234
|
pagePath,
|
|
82
235
|
request,
|
|
83
|
-
|
|
84
|
-
fs,
|
|
236
|
+
addBackendTaskWatcher,
|
|
85
237
|
hasFsAccess
|
|
86
238
|
) {
|
|
87
239
|
const isDevServer = mode !== "build";
|
|
@@ -95,7 +247,6 @@ function runElmApp(
|
|
|
95
247
|
.replace(/content\.dat\/?$/, "");
|
|
96
248
|
|
|
97
249
|
const modifiedRequest = { ...request, path: route };
|
|
98
|
-
// console.log("StaticHttp cache keys", Object.keys(global.staticHttpCache));
|
|
99
250
|
app = elmModule.Elm.Main.init({
|
|
100
251
|
flags: {
|
|
101
252
|
mode,
|
|
@@ -129,9 +280,6 @@ function runElmApp(
|
|
|
129
280
|
console.log(fromElm.value);
|
|
130
281
|
} else if (fromElm.tag === "ApiResponse") {
|
|
131
282
|
const args = fromElm.args[0];
|
|
132
|
-
if (mode === "build") {
|
|
133
|
-
global.staticHttpCache = args.staticHttpCache;
|
|
134
|
-
}
|
|
135
283
|
|
|
136
284
|
resolve({
|
|
137
285
|
kind: "api-response",
|
|
@@ -141,10 +289,6 @@ function runElmApp(
|
|
|
141
289
|
});
|
|
142
290
|
} else if (fromElm.tag === "PageProgress") {
|
|
143
291
|
const args = fromElm.args[0];
|
|
144
|
-
if (mode === "build") {
|
|
145
|
-
global.staticHttpCache = args.staticHttpCache;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
292
|
if (isBytes) {
|
|
149
293
|
resolve({
|
|
150
294
|
kind: "bytes",
|
|
@@ -163,30 +307,37 @@ function runElmApp(
|
|
|
163
307
|
);
|
|
164
308
|
}
|
|
165
309
|
} else if (fromElm.tag === "DoHttp") {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
310
|
+
app.ports.gotBatchSub.send(
|
|
311
|
+
Object.fromEntries(
|
|
312
|
+
await Promise.all(
|
|
313
|
+
fromElm.args[0].map(([requestHash, requestToPerform]) => {
|
|
314
|
+
if (
|
|
315
|
+
requestToPerform.url !== "elm-pages-internal://port" &&
|
|
316
|
+
requestToPerform.url.startsWith("elm-pages-internal://")
|
|
317
|
+
) {
|
|
318
|
+
return runInternalJob(
|
|
319
|
+
requestHash,
|
|
320
|
+
app,
|
|
321
|
+
mode,
|
|
322
|
+
requestToPerform,
|
|
323
|
+
hasFsAccess,
|
|
324
|
+
patternsToWatch
|
|
325
|
+
);
|
|
326
|
+
} else {
|
|
327
|
+
return runHttpJob(
|
|
328
|
+
requestHash,
|
|
329
|
+
portsFile,
|
|
330
|
+
app,
|
|
331
|
+
mode,
|
|
332
|
+
requestToPerform,
|
|
333
|
+
hasFsAccess,
|
|
334
|
+
requestToPerform
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
})
|
|
338
|
+
)
|
|
339
|
+
)
|
|
340
|
+
);
|
|
190
341
|
} else if (fromElm.tag === "Errors") {
|
|
191
342
|
foundErrors = true;
|
|
192
343
|
reject(fromElm.args[0].errorsJson);
|
|
@@ -197,7 +348,7 @@ function runElmApp(
|
|
|
197
348
|
app.ports.toJsPort.subscribe(portHandler);
|
|
198
349
|
app.ports.sendPageData.subscribe(portHandler);
|
|
199
350
|
}).finally(() => {
|
|
200
|
-
|
|
351
|
+
addBackendTaskWatcher(patternsToWatch);
|
|
201
352
|
try {
|
|
202
353
|
killApp();
|
|
203
354
|
killApp = null;
|
|
@@ -246,17 +397,16 @@ async function outputString(
|
|
|
246
397
|
/** @typedef { { head: any[]; errors: any[]; contentJson: any[]; html: string; route: string; title: string; } } Arg */
|
|
247
398
|
|
|
248
399
|
async function runHttpJob(
|
|
400
|
+
requestHash,
|
|
249
401
|
portsFile,
|
|
250
402
|
app,
|
|
251
403
|
mode,
|
|
252
404
|
requestToPerform,
|
|
253
|
-
fs,
|
|
254
405
|
hasFsAccess,
|
|
255
406
|
useCache
|
|
256
407
|
) {
|
|
257
|
-
pendingDataSourceCount += 1;
|
|
258
408
|
try {
|
|
259
|
-
const
|
|
409
|
+
const lookupResponse = await lookupOrPerform(
|
|
260
410
|
portsFile,
|
|
261
411
|
mode,
|
|
262
412
|
requestToPerform,
|
|
@@ -264,17 +414,31 @@ async function runHttpJob(
|
|
|
264
414
|
useCache
|
|
265
415
|
);
|
|
266
416
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
417
|
+
if (lookupResponse.kind === "cache-response-path") {
|
|
418
|
+
const responseFilePath = lookupResponse.value;
|
|
419
|
+
return [
|
|
420
|
+
requestHash,
|
|
421
|
+
{
|
|
422
|
+
request: requestToPerform,
|
|
423
|
+
response: JSON.parse(
|
|
424
|
+
(await fs.promises.readFile(responseFilePath, "utf8")).toString()
|
|
425
|
+
),
|
|
426
|
+
},
|
|
427
|
+
];
|
|
428
|
+
} else if (lookupResponse.kind === "response-json") {
|
|
429
|
+
return [
|
|
430
|
+
requestHash,
|
|
431
|
+
{
|
|
432
|
+
request: requestToPerform,
|
|
433
|
+
response: lookupResponse.value,
|
|
434
|
+
},
|
|
435
|
+
];
|
|
436
|
+
} else {
|
|
437
|
+
throw `Unexpected kind ${lookupResponse}`;
|
|
438
|
+
}
|
|
273
439
|
} catch (error) {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
pendingDataSourceCount -= 1;
|
|
277
|
-
flushIfDone(app);
|
|
440
|
+
console.log("@@@ERROR", error);
|
|
441
|
+
// sendError(app, error);
|
|
278
442
|
}
|
|
279
443
|
}
|
|
280
444
|
|
|
@@ -292,46 +456,54 @@ function jsonResponse(request, json) {
|
|
|
292
456
|
}
|
|
293
457
|
|
|
294
458
|
async function runInternalJob(
|
|
459
|
+
requestHash,
|
|
295
460
|
app,
|
|
296
461
|
mode,
|
|
297
462
|
requestToPerform,
|
|
298
|
-
fs,
|
|
299
463
|
hasFsAccess,
|
|
300
464
|
patternsToWatch
|
|
301
465
|
) {
|
|
302
466
|
try {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
if (requestToPerform.url === "elm-pages-internal://read-file") {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
467
|
+
if (requestToPerform.url === "elm-pages-internal://log") {
|
|
468
|
+
return [requestHash, await runLogJob(requestToPerform)];
|
|
469
|
+
} else if (requestToPerform.url === "elm-pages-internal://read-file") {
|
|
470
|
+
return [
|
|
471
|
+
requestHash,
|
|
472
|
+
await readFileJobNew(requestToPerform, patternsToWatch),
|
|
473
|
+
];
|
|
309
474
|
} else if (requestToPerform.url === "elm-pages-internal://glob") {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
475
|
+
return [requestHash, await runGlobNew(requestToPerform, patternsToWatch)];
|
|
476
|
+
} else if (requestToPerform.url === "elm-pages-internal://randomSeed") {
|
|
477
|
+
return [
|
|
478
|
+
requestHash,
|
|
479
|
+
jsonResponse(
|
|
480
|
+
requestToPerform,
|
|
481
|
+
crypto.getRandomValues(new Uint32Array(1))[0]
|
|
482
|
+
),
|
|
483
|
+
];
|
|
484
|
+
} else if (requestToPerform.url === "elm-pages-internal://now") {
|
|
485
|
+
return [requestHash, jsonResponse(requestToPerform, Date.now())];
|
|
313
486
|
} else if (requestToPerform.url === "elm-pages-internal://env") {
|
|
314
|
-
|
|
315
|
-
await runEnvJob(requestToPerform, patternsToWatch)
|
|
316
|
-
);
|
|
487
|
+
return [requestHash, await runEnvJob(requestToPerform, patternsToWatch)];
|
|
317
488
|
} else if (requestToPerform.url === "elm-pages-internal://encrypt") {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
489
|
+
return [
|
|
490
|
+
requestHash,
|
|
491
|
+
await runEncryptJob(requestToPerform, patternsToWatch),
|
|
492
|
+
];
|
|
321
493
|
} else if (requestToPerform.url === "elm-pages-internal://decrypt") {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
494
|
+
return [
|
|
495
|
+
requestHash,
|
|
496
|
+
await runDecryptJob(requestToPerform, patternsToWatch),
|
|
497
|
+
];
|
|
498
|
+
} else if (requestToPerform.url === "elm-pages-internal://write-file") {
|
|
499
|
+
return [requestHash, await runWriteFileJob(requestToPerform)];
|
|
325
500
|
} else {
|
|
326
|
-
throw `Unexpected internal
|
|
501
|
+
throw `Unexpected internal BackendTask request format: ${kleur.yellow(
|
|
327
502
|
JSON.stringify(2, null, requestToPerform)
|
|
328
503
|
)}`;
|
|
329
504
|
}
|
|
330
505
|
} catch (error) {
|
|
331
506
|
sendError(app, error);
|
|
332
|
-
} finally {
|
|
333
|
-
pendingDataSourceCount -= 1;
|
|
334
|
-
flushIfDone(app);
|
|
335
507
|
}
|
|
336
508
|
}
|
|
337
509
|
|
|
@@ -346,6 +518,7 @@ async function readFileJobNew(req, patternsToWatch) {
|
|
|
346
518
|
path.join(process.env.LAMBDA_TASK_ROOT || process.cwd(), filePath)
|
|
347
519
|
)
|
|
348
520
|
).toString();
|
|
521
|
+
// TODO does this throw an error if there is invalid frontmatter?
|
|
349
522
|
const parsedFile = matter(fileContents);
|
|
350
523
|
|
|
351
524
|
return jsonResponse(req, {
|
|
@@ -354,10 +527,24 @@ async function readFileJobNew(req, patternsToWatch) {
|
|
|
354
527
|
rawFile: fileContents,
|
|
355
528
|
});
|
|
356
529
|
} catch (error) {
|
|
530
|
+
return jsonResponse(req, {
|
|
531
|
+
errorCode: error.code,
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
async function runWriteFileJob(req) {
|
|
536
|
+
const data = req.body.args[0];
|
|
537
|
+
try {
|
|
538
|
+
const fullPathToWrite = path.join(process.cwd(), data.path);
|
|
539
|
+
await fsPromises.mkdir(path.dirname(fullPathToWrite), { recursive: true });
|
|
540
|
+
await fsPromises.writeFile(fullPathToWrite, data.body);
|
|
541
|
+
return jsonResponse(req, null);
|
|
542
|
+
} catch (error) {
|
|
543
|
+
console.trace(error);
|
|
357
544
|
throw {
|
|
358
|
-
title: "
|
|
359
|
-
message: `
|
|
360
|
-
|
|
545
|
+
title: "BackendTask Error",
|
|
546
|
+
message: `BackendTask.Generator.writeFile failed for file path: ${kleur.yellow(
|
|
547
|
+
data.path
|
|
361
548
|
)}\n${kleur.red(error.toString())}`,
|
|
362
549
|
};
|
|
363
550
|
}
|
|
@@ -366,7 +553,7 @@ async function readFileJobNew(req, patternsToWatch) {
|
|
|
366
553
|
async function runGlobNew(req, patternsToWatch) {
|
|
367
554
|
try {
|
|
368
555
|
const { pattern, options } = req.body.args[0];
|
|
369
|
-
const matchedPaths = await globby(pattern, options);
|
|
556
|
+
const matchedPaths = await globby.globby(pattern, options);
|
|
370
557
|
patternsToWatch.add(pattern);
|
|
371
558
|
|
|
372
559
|
return jsonResponse(
|
|
@@ -384,6 +571,15 @@ async function runGlobNew(req, patternsToWatch) {
|
|
|
384
571
|
}
|
|
385
572
|
}
|
|
386
573
|
|
|
574
|
+
async function runLogJob(req) {
|
|
575
|
+
try {
|
|
576
|
+
console.log(req.body.args[0].message);
|
|
577
|
+
return jsonResponse(req, null);
|
|
578
|
+
} catch (e) {
|
|
579
|
+
console.log(`Error performing env '${JSON.stringify(req.body)}'`);
|
|
580
|
+
throw e;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
387
583
|
async function runEnvJob(req, patternsToWatch) {
|
|
388
584
|
try {
|
|
389
585
|
const expectedEnv = req.body.args[0];
|
|
@@ -404,7 +600,7 @@ async function runEncryptJob(req, patternsToWatch) {
|
|
|
404
600
|
);
|
|
405
601
|
} catch (e) {
|
|
406
602
|
throw {
|
|
407
|
-
title: "
|
|
603
|
+
title: "BackendTask Encrypt Error",
|
|
408
604
|
message:
|
|
409
605
|
e.toString() + e.stack + "\n\n" + JSON.stringify(rawRequest, null, 2),
|
|
410
606
|
};
|
|
@@ -421,32 +617,13 @@ async function runDecryptJob(req, patternsToWatch) {
|
|
|
421
617
|
return jsonResponse(req, JSON.parse(signed || "null"));
|
|
422
618
|
} catch (e) {
|
|
423
619
|
throw {
|
|
424
|
-
title: "
|
|
620
|
+
title: "BackendTask Decrypt Error",
|
|
425
621
|
message:
|
|
426
622
|
e.toString() + e.stack + "\n\n" + JSON.stringify(rawRequest, null, 2),
|
|
427
623
|
};
|
|
428
624
|
}
|
|
429
625
|
}
|
|
430
626
|
|
|
431
|
-
function flushIfDone(app) {
|
|
432
|
-
if (foundErrors) {
|
|
433
|
-
pendingDataSourceResponses = [];
|
|
434
|
-
} else if (pendingDataSourceCount === 0) {
|
|
435
|
-
// console.log(
|
|
436
|
-
// `Flushing ${pendingDataSourceResponses.length} items in ${timeUntilThreshold}ms`
|
|
437
|
-
// );
|
|
438
|
-
|
|
439
|
-
flushQueue(app);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
function flushQueue(app) {
|
|
444
|
-
const temp = pendingDataSourceResponses;
|
|
445
|
-
pendingDataSourceResponses = [];
|
|
446
|
-
// console.log("@@@ FLUSHING", temp.length);
|
|
447
|
-
app.ports.gotBatchSub.send(temp);
|
|
448
|
-
}
|
|
449
|
-
|
|
450
627
|
/**
|
|
451
628
|
* @param {{ ports: { fromJsPort: { send: (arg0: { tag: string; data: any; }) => void; }; }; }} app
|
|
452
629
|
* @param {{ message: string; title: string; }} error
|