elm-pages 3.0.25 → 3.0.27

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.
@@ -145,7 +145,7 @@ declarationVisitor node context =
145
145
  (\recordSetter ->
146
146
  case Node.value recordSetter of
147
147
  ( keyNode, valueNode ) ->
148
- if Node.value keyNode == "data" || Node.value keyNode == "action" then
148
+ if Node.value keyNode == "data" || Node.value keyNode == "action" || Node.value keyNode == "pages" then
149
149
  if isAlreadyApplied context.lookupTable (Node.value valueNode) then
150
150
  Nothing
151
151
 
@@ -203,7 +203,7 @@ expressionVisitor node context =
203
203
  (\recordSetter ->
204
204
  case Node.value recordSetter of
205
205
  ( keyNode, valueNode ) ->
206
- if Node.value keyNode == "data" || Node.value keyNode == "action" then
206
+ if Node.value keyNode == "data" || Node.value keyNode == "action" || Node.value keyNode == "pages" then
207
207
  if isAlreadyApplied context.lookupTable (Node.value valueNode) then
208
208
  Nothing
209
209
 
@@ -234,16 +234,28 @@ expressionVisitor node context =
234
234
  ++ " = "
235
235
  ++ (case pageBuilderName of
236
236
  "preRender" ->
237
- "\\_ -> "
238
- ++ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
239
- ++ " "
240
- ++ exceptionFromString
237
+ if key == "pages" then
238
+ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
239
+ ++ " "
240
+ ++ exceptionFromString
241
+
242
+ else
243
+ "\\_ -> "
244
+ ++ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
245
+ ++ " "
246
+ ++ exceptionFromString
241
247
 
242
248
  "preRenderWithFallback" ->
243
- "\\_ -> "
244
- ++ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
245
- ++ " "
246
- ++ exceptionFromString
249
+ if key == "pages" then
250
+ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
251
+ ++ " "
252
+ ++ exceptionFromString
253
+
254
+ else
255
+ "\\_ -> "
256
+ ++ referenceFunction context.importContext ( [ "BackendTask" ], "fail" )
257
+ ++ " "
258
+ ++ exceptionFromString
247
259
 
248
260
  "serverRender" ->
249
261
  "\\_ _ -> "
@@ -311,7 +311,7 @@ route =
311
311
  RouteBuilder.preRender
312
312
  { data = data
313
313
  , head = head
314
- , pages = pages
314
+ , pages = BackendTask.fail (FatalError.fromString "")
315
315
  }
316
316
  |> RouteBuilder.buildNoState { view = view }
317
317
 
@@ -366,7 +366,7 @@ route =
366
366
  RouteBuilder.preRender
367
367
  { data = \\_ -> BackendTask.fail (FatalError.fromString "")
368
368
  , head = head
369
- , pages = pages
369
+ , pages = BackendTask.fail (FatalError.fromString "")
370
370
  }
371
371
  |> RouteBuilder.buildNoState { view = view }
372
372
 
@@ -374,6 +374,109 @@ route =
374
374
  data : BackendTask Data
375
375
  data =
376
376
  BackendTask.succeed ()
377
+ """
378
+ ]
379
+ , test "replaces pages record setter in preRender" <|
380
+ \() ->
381
+ """module Route.Blog.Slug_ exposing (Data, Model, Msg, route)
382
+
383
+ import Server.Request as Request
384
+
385
+ import BackendTask exposing (BackendTask)
386
+ import FatalError
387
+ import RouteBuilder exposing (Page, App)
388
+ import Pages.PageUrl exposing (PageUrl)
389
+ import Pages.Url
390
+ import UrlPath
391
+ import Route exposing (Route)
392
+ import Shared
393
+ import View exposing (View)
394
+
395
+
396
+ type alias Model =
397
+ {}
398
+
399
+
400
+ type alias Msg =
401
+ ()
402
+
403
+
404
+ type alias RouteParams =
405
+ { slug : String }
406
+
407
+
408
+ type alias Data =
409
+ ()
410
+
411
+
412
+ route : StatelessRoute RouteParams Data ActionData
413
+ route =
414
+ RouteBuilder.preRender
415
+ { data = \\_ -> BackendTask.fail (FatalError.fromString "")
416
+ , head = head
417
+ , pages = pages
418
+ }
419
+ |> RouteBuilder.buildNoState { view = view }
420
+
421
+
422
+ pages : BackendTask (List RouteParams)
423
+ pages =
424
+ BackendTask.succeed [ { slug = "hello" } ]
425
+ """
426
+ |> Review.Test.run rule
427
+ |> Review.Test.expectErrors
428
+ [ Review.Test.error
429
+ { message = "Codemod"
430
+ , details =
431
+ [ "" ]
432
+ , under =
433
+ """pages = pages
434
+ }"""
435
+ }
436
+ |> Review.Test.whenFixed
437
+ """module Route.Blog.Slug_ exposing (Data, Model, Msg, route)
438
+
439
+ import Server.Request as Request
440
+
441
+ import BackendTask exposing (BackendTask)
442
+ import FatalError
443
+ import RouteBuilder exposing (Page, App)
444
+ import Pages.PageUrl exposing (PageUrl)
445
+ import Pages.Url
446
+ import UrlPath
447
+ import Route exposing (Route)
448
+ import Shared
449
+ import View exposing (View)
450
+
451
+
452
+ type alias Model =
453
+ {}
454
+
455
+
456
+ type alias Msg =
457
+ ()
458
+
459
+
460
+ type alias RouteParams =
461
+ { slug : String }
462
+
463
+
464
+ type alias Data =
465
+ ()
466
+
467
+
468
+ route : StatelessRoute RouteParams Data ActionData
469
+ route =
470
+ RouteBuilder.preRender
471
+ { data = \\_ -> BackendTask.fail (FatalError.fromString "")
472
+ , head = head
473
+ , pages = BackendTask.fail (FatalError.fromString "")}
474
+ |> RouteBuilder.buildNoState { view = view }
475
+
476
+
477
+ pages : BackendTask (List RouteParams)
478
+ pages =
479
+ BackendTask.succeed [ { slug = "hello" } ]
377
480
  """
378
481
  ]
379
482
  , test "replaces data record setter with RouteBuilder.serverRendered" <|
@@ -1,3 +1,3 @@
1
1
  export const compatibilityKey = 22;
2
2
 
3
- export const packageVersion = "3.0.25";
3
+ export const packageVersion = "3.0.27";
@@ -133,6 +133,12 @@ async function compileElm(options, elmEntrypointPath, outputPath, cwd) {
133
133
 
134
134
  function spawnElmMake(options, elmEntrypointPath, outputPath, cwd) {
135
135
  return new Promise(async (resolve, reject) => {
136
+ try {
137
+ await fsPromises.unlink(outputPath);
138
+ } catch (e) {
139
+ /* File may not exist, so ignore errors */
140
+ }
141
+
136
142
  const subprocess = spawnCallback(
137
143
  `lamdera`,
138
144
  [
@@ -152,13 +158,6 @@ function spawnElmMake(options, elmEntrypointPath, outputPath, cwd) {
152
158
  cwd: cwd,
153
159
  }
154
160
  );
155
- if (await fsHelpers.fileExists(outputPath)) {
156
- try {
157
- await fsPromises.unlink(outputPath, {
158
- force: true /* ignore errors if file doesn't exist */,
159
- });
160
- } catch (e) {}
161
- }
162
161
  let commandOutput = "";
163
162
 
164
163
  subprocess.stderr.on("data", function (data) {
@@ -412,12 +412,7 @@ async function outputString(
412
412
 
413
413
  /** @typedef { { head: any[]; errors: any[]; contentJson: any[]; html: string; route: string; title: string; } } Arg */
414
414
 
415
- async function runHttpJob(
416
- requestHash,
417
- portsFile,
418
- mode,
419
- requestToPerform,
420
- ) {
415
+ async function runHttpJob(requestHash, portsFile, mode, requestToPerform) {
421
416
  try {
422
417
  const lookupResponse = await lookupOrPerform(
423
418
  portsFile,
@@ -490,18 +485,13 @@ async function runInternalJob(
490
485
  portsFile
491
486
  ) {
492
487
  try {
493
- const cwd = path.resolve(...requestToPerform.dir);
494
- const quiet = requestToPerform.quiet;
495
- const env = { ...process.env, ...requestToPerform.env };
496
-
497
- const context = { cwd, quiet, env };
498
488
  switch (requestToPerform.url) {
499
489
  case "elm-pages-internal://log":
500
490
  return [requestHash, await runLogJob(requestToPerform)];
501
491
  case "elm-pages-internal://read-file":
502
492
  return [
503
493
  requestHash,
504
- await readFileJobNew(requestToPerform, patternsToWatch, context),
494
+ await readFileJobNew(requestToPerform, patternsToWatch),
505
495
  ];
506
496
  case "elm-pages-internal://read-file-binary":
507
497
  return [
@@ -539,7 +529,7 @@ async function runInternalJob(
539
529
  await runDecryptJob(requestToPerform, patternsToWatch),
540
530
  ];
541
531
  case "elm-pages-internal://write-file":
542
- return [requestHash, await runWriteFileJob(requestToPerform, context)];
532
+ return [requestHash, await runWriteFileJob(requestToPerform)];
543
533
  case "elm-pages-internal://sleep":
544
534
  return [requestHash, await runSleep(requestToPerform)];
545
535
  case "elm-pages-internal://which":
@@ -549,10 +539,7 @@ async function runInternalJob(
549
539
  case "elm-pages-internal://shell":
550
540
  return [requestHash, await runShell(requestToPerform)];
551
541
  case "elm-pages-internal://stream":
552
- return [
553
- requestHash,
554
- await runStream(requestToPerform, portsFile, context),
555
- ];
542
+ return [requestHash, await runStream(requestToPerform, portsFile)];
556
543
  case "elm-pages-internal://start-spinner":
557
544
  return [requestHash, runStartSpinner(requestToPerform)];
558
545
  case "elm-pages-internal://stop-spinner":
@@ -567,7 +554,19 @@ async function runInternalJob(
567
554
  }
568
555
  }
569
556
 
570
- async function readFileJobNew(req, patternsToWatch, { cwd }) {
557
+ /**
558
+ * @param {{ dir: string[]; quiet: boolean; env: { [key:string]: string; }; }} requestToPerform
559
+ */
560
+ function getContext(requestToPerform) {
561
+ const cwd = path.resolve(...requestToPerform.dir);
562
+ const quiet = requestToPerform.quiet;
563
+ const env = { ...process.env, ...requestToPerform.env };
564
+
565
+ return { cwd, quiet, env };
566
+ }
567
+
568
+ async function readFileJobNew(req, patternsToWatch) {
569
+ const { cwd } = getContext(req);
571
570
  // TODO use cwd
572
571
  const filePath = path.resolve(cwd, req.body.args[1]);
573
572
  try {
@@ -639,8 +638,9 @@ async function runQuestion(req) {
639
638
  return jsonResponse(req, await question(req.body.args[0]));
640
639
  }
641
640
 
642
- function runStream(req, portsFile, context) {
641
+ function runStream(req, portsFile) {
643
642
  return new Promise(async (resolve) => {
643
+ const context = getContext(req);
644
644
  let metadataResponse = null;
645
645
  let lastStream = null;
646
646
  try {
@@ -1153,7 +1153,8 @@ export async function question({ prompt }) {
1153
1153
  });
1154
1154
  }
1155
1155
 
1156
- async function runWriteFileJob(req, { cwd }) {
1156
+ async function runWriteFileJob(req) {
1157
+ const { cwd } = getContext(req);
1157
1158
  const data = req.body.args[0];
1158
1159
  const filePath = path.resolve(cwd, data.path);
1159
1160
  try {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elm-pages",
3
3
  "type": "module",
4
- "version": "3.0.25",
4
+ "version": "3.0.27",
5
5
  "homepage": "https://elm-pages.com",
6
6
  "moduleResolution": "node",
7
7
  "description": "Hybrid Elm framework with full-stack and static routes.",
@@ -28,47 +28,50 @@
28
28
  "dependencies": {
29
29
  "@sindresorhus/merge-streams": "^4.0.0",
30
30
  "busboy": "^1.6.0",
31
- "chokidar": "^4.0.3",
31
+ "chokidar": "^5.0.0",
32
32
  "cli-cursor": "^5.0.0",
33
- "commander": "^13.1.0",
33
+ "commander": "^14.0.2",
34
34
  "connect": "^3.7.0",
35
35
  "cookie-signature": "^1.2.2",
36
36
  "cross-spawn": "7.0.6",
37
37
  "devcert": "^1.2.2",
38
38
  "elm-doc-preview": "^6.0.1",
39
39
  "elm-hot": "^1.1.6",
40
- "esbuild": "^0.25.0",
41
- "fs-extra": "^11.3.0",
42
- "globby": "14.1.0",
40
+ "esbuild": "^0.27.2",
41
+ "fs-extra": "^11.3.3",
42
+ "globby": "16.1.0",
43
43
  "gray-matter": "^4.0.3",
44
44
  "jsesc": "^3.1.0",
45
45
  "kleur": "^4.1.5",
46
- "make-fetch-happen": "^14.0.3",
47
- "memfs": "^4.17.0",
46
+ "make-fetch-happen": "^15.0.3",
47
+ "memfs": "^4.51.1",
48
48
  "micromatch": "^4.0.8",
49
- "serve-static": "^1.16.2",
50
- "terser": "^5.39.0",
51
- "vite": "^6.2.0",
52
- "which": "^5.0.0"
49
+ "serve-static": "^2.2.1",
50
+ "terser": "^5.44.1",
51
+ "vite": "^7.3.1",
52
+ "which": "^6.0.0"
53
+ },
54
+ "optionalDependencies": {
55
+ "@rollup/rollup-linux-x64-gnu": "4.55.1"
53
56
  },
54
57
  "devDependencies": {
55
58
  "@types/cross-spawn": "^6.0.6",
56
59
  "@types/fs-extra": "^11.0.4",
57
60
  "@types/make-fetch-happen": "^10.0.4",
58
- "@types/micromatch": "^4.0.9",
59
- "@types/node": "^22.13.9",
60
- "@types/serve-static": "^1.15.7",
61
- "cypress": "^14.1.0",
61
+ "@types/micromatch": "^4.0.10",
62
+ "@types/node": "^25.0.3",
63
+ "@types/serve-static": "^2.2.0",
64
+ "cypress": "^15.8.2",
62
65
  "elm-codegen": "^0.6.1",
63
66
  "elm-optimize-level-2": "^0.3.5",
64
- "elm-review": "^2.13.2",
65
- "elm-test": "^0.19.1-revision15",
66
- "elm-tooling": "^1.15.1",
67
+ "elm-review": "^2.13.5",
68
+ "elm-test": "^0.19.1-revision17",
69
+ "elm-tooling": "^1.17.0",
67
70
  "elm-verify-examples": "^6.0.3",
68
- "lamdera": "^0.19.1-1.3.2",
69
- "prettier": "^3.5.3",
70
- "typescript": "^5.8.2",
71
- "vitest": "^3.0.7"
71
+ "lamdera": "^0.19.1-1.4.0",
72
+ "prettier": "^3.7.4",
73
+ "typescript": "^5.9.3",
74
+ "vitest": "^4.0.16"
72
75
  },
73
76
  "files": [
74
77
  "adapter/",