jeasx 2.2.1 → 2.2.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-01-17 - Jeasx 2.2.2 released
4
+
5
+ 🎉 This release now preserves the original status code when a 404 page is accessed directly (previously defaulted to 200). This improvement makes it easier to use Jeasx as a static site generator and to fetch the 404 page with common tools for saving it to a file system. While Jeasx is fundamentally a server-side rendering framework, there are valid use cases where serving a static page alone is sufficient.
6
+
7
+ For example, you can use `wget` to download a Jeasx website to a www-directory with just a single line:
8
+
9
+ ```bash
10
+ wget --mirror --page-requisites --no-host-directories --directory-prefix=www http://localhost:3000 http://localhost:3000/404
11
+ ```
12
+
13
+ Have a look at the [Dockerfile](https://github.com/jeasx/jeasx-website/blob/main/Dockerfile) of the Jeasx website to see how things can be wired up for serving a static export with Caddy as web server.
14
+
15
+ Dependency updates: `fastify@5.7.1`, `@fastify/static@9.0.0`, `@types/node@24.10.9`
16
+
3
17
  ## 2025-12-21 - Jeasx 2.2.1 released
4
18
 
5
19
  🎉 Just a patch release with a minor cleanup for explicit path joins in `serverless.ts`.
@@ -14,11 +28,11 @@ Dependency updates: `esbuild@0.27.2`, `jsx-async-runtime@2.0.2`, `@types/node@24
14
28
 
15
29
  To configure Fastify (or a specific plugin), you can now use simple JSON objects which mirror the corresponding Fastify options. Have a look at the linked Fastify documentation for a reference of all existing options:
16
30
 
17
- - [`FASTIFY_SERVER_OPTIONS`](<https://fastify.dev/docs/latest/Reference/Server/>)
18
- - [`FASTIFY_COOKIE_OPTIONS`](<https://github.com/fastify/fastify-cookie#options>)
19
- - [`FASTIFY_FORMBODY_OPTIONS`](<https://github.com/fastify/fastify-formbody#options>)
20
- - [`FASTIFY_MULTIPART_OPTIONS`](<https://github.com/fastify/fastify-multipart#options>)
21
- - [`FASTIFY_STATIC_OPTIONS`](<https://github.com/fastify/fastify-static#options>)
31
+ - [`FASTIFY_SERVER_OPTIONS`](https://fastify.dev/docs/latest/Reference/Server/)
32
+ - [`FASTIFY_COOKIE_OPTIONS`](https://github.com/fastify/fastify-cookie#options)
33
+ - [`FASTIFY_FORMBODY_OPTIONS`](https://github.com/fastify/fastify-formbody#options)
34
+ - [`FASTIFY_MULTIPART_OPTIONS`](https://github.com/fastify/fastify-multipart#options)
35
+ - [`FASTIFY_STATIC_OPTIONS`](https://github.com/fastify/fastify-static#options)
22
36
 
23
37
  To optimise the developer experience, it is highly recommended that you use the recently introduced `.env.js` file to provide these configuration options. Alternatively, you can also provide them via `.env` or your process environment. Jeasx comes with a minimal set of reasonable [Fastify defaults](https://github.com/jeasx/jeasx/blob/main/serverless.ts), but you can also overwrite them if necessary.
24
38
 
@@ -329,7 +343,7 @@ Added two new environment variables (`FASTIFY_DISABLE_REQUEST_LOGGING` and `FAST
329
343
 
330
344
  ## 2024-12-01 - Jeasx 1.1.0 released
331
345
 
332
- 🎉 Migrated from dotenv to dotenv-flow, so you can use NODE_ENV-specific .env* files (like `.env.development`) to configure different environments for production and development. This is useful to disable caching headers (e.g. via `FASTIFY_STATIC_HEADERS`) in development, as Jeasx applies `FASTIFY_STATIC_HEADERS` in development from now on for a more consistent developer expierence. See updated .env-files in the quickstart-project for an example how to disable caching in development. This is only needed if you have configured `FASTIFY_STATIC_HEADERS` for your existing projects.
346
+ 🎉 Migrated from dotenv to dotenv-flow, so you can use NODE_ENV-specific .env\* files (like `.env.development`) to configure different environments for production and development. This is useful to disable caching headers (e.g. via `FASTIFY_STATIC_HEADERS`) in development, as Jeasx applies `FASTIFY_STATIC_HEADERS` in development from now on for a more consistent developer expierence. See updated .env-files in the quickstart-project for an example how to disable caching in development. This is only needed if you have configured `FASTIFY_STATIC_HEADERS` for your existing projects.
333
347
 
334
348
  Bumped default environment variable `ESBUILD_BROWSER_TARGET` to more recent browser versions (e.g. `chrome126, edge126, firefox128, safari17`). If you want to stick with older versions, you can override it via the environment. Learn more about possible values at the esbuild website.
335
349
 
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024-2025 Maik Jablonski (<mail@jeasx.dev>)
3
+ Copyright (c) 2024-2026 Maik Jablonski (<mail@jeasx.dev>)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jeasx",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "Jeasx - the ease of JSX with the power of SSR",
5
5
  "keywords": [
6
6
  "jsx",
@@ -27,10 +27,10 @@
27
27
  "@fastify/cookie": "11.0.2",
28
28
  "@fastify/formbody": "8.0.2",
29
29
  "@fastify/multipart": "9.3.0",
30
- "@fastify/static": "8.3.0",
31
- "@types/node": "24.10.4",
30
+ "@fastify/static": "9.0.0",
31
+ "@types/node": "24.10.9",
32
32
  "esbuild": "0.27.2",
33
- "fastify": "5.6.2",
33
+ "fastify": "5.7.1",
34
34
  "jsx-async-runtime": "2.0.2"
35
35
  },
36
36
  "scripts": {
package/serverless.js CHANGED
@@ -14,9 +14,7 @@ const NODE_ENV_IS_DEVELOPMENT = process.env.NODE_ENV === "development";
14
14
  const JEASX_ROUTE_CACHE_LIMIT = Math.floor(freemem() / 1024 / 1024);
15
15
  var serverless_default = Fastify({
16
16
  logger: true,
17
- ...jsonToOptions(
18
- process.env.FASTIFY_SERVER_OPTIONS
19
- )
17
+ ...jsonToOptions(process.env.FASTIFY_SERVER_OPTIONS)
20
18
  }).register(fastifyCookie, {
21
19
  ...jsonToOptions(
22
20
  process.env.FASTIFY_COOKIE_OPTIONS
@@ -110,7 +108,9 @@ async function handler(request, reply) {
110
108
  if (reply.sent) {
111
109
  return;
112
110
  } else if (route.endsWith("/[404]")) {
113
- reply.status(404);
111
+ if (reply.statusCode === 200 && !request.path.endsWith("/404")) {
112
+ reply.status(404);
113
+ }
114
114
  break;
115
115
  } else if (typeof response === "string" || Buffer.isBuffer(response) || isJSX(response)) {
116
116
  break;
package/serverless.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["serverless.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/serverless.ts CHANGED
@@ -5,7 +5,7 @@ import fastifyStatic, { FastifyStaticOptions } from "@fastify/static";
5
5
  import Fastify, {
6
6
  FastifyReply,
7
7
  FastifyRequest,
8
- FastifyServerOptions,
8
+ FastifyServerOptions
9
9
  } from "fastify";
10
10
  import { jsxToString } from "jsx-async-runtime";
11
11
  import { stat } from "node:fs/promises";
@@ -29,25 +29,23 @@ declare module "fastify" {
29
29
  // Create and export a Fastify app instance
30
30
  export default Fastify({
31
31
  logger: true,
32
- ...(jsonToOptions(
33
- process.env.FASTIFY_SERVER_OPTIONS
34
- ) as FastifyServerOptions),
32
+ ...(jsonToOptions(process.env.FASTIFY_SERVER_OPTIONS) as FastifyServerOptions)
35
33
  })
36
34
  .register(fastifyCookie, {
37
35
  ...(jsonToOptions(
38
36
  process.env.FASTIFY_COOKIE_OPTIONS
39
- ) as FastifyCookieOptions),
37
+ ) as FastifyCookieOptions)
40
38
  })
41
39
  .register(fastifyFormbody, {
42
40
  ...(jsonToOptions(
43
41
  process.env.FASTIFY_FORMBODY_OPTIONS
44
- ) as FastifyFormbodyOptions),
42
+ ) as FastifyFormbodyOptions)
45
43
  })
46
44
  .register(fastifyMultipart, {
47
45
  attachFieldsToBody: "keyValues",
48
46
  ...(jsonToOptions(
49
47
  process.env.FASTIFY_MULTIPART_OPTIONS
50
- ) as FastifyMultipartOptions),
48
+ ) as FastifyMultipartOptions)
51
49
  })
52
50
  .register(fastifyStatic, {
53
51
  root: [["public"], ["dist", "browser"]].map((dir) => join(CWD, ...dir)),
@@ -56,7 +54,7 @@ export default Fastify({
56
54
  preCompressed: true,
57
55
  ...(jsonToOptions(
58
56
  process.env.FASTIFY_STATIC_OPTIONS
59
- ) as FastifyStaticOptions),
57
+ ) as FastifyStaticOptions)
60
58
  })
61
59
  .decorateRequest("route", "")
62
60
  .decorateRequest("path", "")
@@ -159,13 +157,17 @@ async function handler(request: FastifyRequest, reply: FastifyReply) {
159
157
  response = await module.default.call(context, {
160
158
  request,
161
159
  reply,
162
- ...(typeof response === "object" ? response : {}),
160
+ ...(typeof response === "object" ? response : {})
163
161
  });
164
162
 
165
163
  if (reply.sent) {
166
164
  return;
167
165
  } else if (route.endsWith("/[404]")) {
168
- reply.status(404);
166
+ // Preserve existing status if a 404 page is requested directly.
167
+ // If no status is defined, set status to 404 automatically.
168
+ if (reply.statusCode === 200 && !request.path.endsWith("/404")) {
169
+ reply.status(404);
170
+ }
169
171
  break;
170
172
  } else if (
171
173
  typeof response === "string" ||
@@ -213,7 +215,7 @@ function generateRoutes(path: string): string[] {
213
215
  .map((segment) => `${segment}/[...guard]`),
214
216
  ...edges.map((edge) => `${edge}`),
215
217
  ...segments.map((segment) => `${segment}/[...path]`),
216
- ...segments.map((segment) => `${segment}/[404]`),
218
+ ...segments.map((segment) => `${segment}/[404]`)
217
219
  ];
218
220
  }
219
221
 
@@ -264,13 +266,12 @@ function isJSX(obj: unknown): boolean {
264
266
  * Renders JSX to string and applies optional response handler.
265
267
  */
266
268
  async function renderJSX(context: object, response: unknown) {
267
- const payload = isJSX(response)
268
- ? await jsxToString.call(context, response)
269
- : response;
269
+ const payload =
270
+ isJSX(response) ? await jsxToString.call(context, response) : response;
270
271
 
271
272
  // Post-process the payload with an optional response handler
272
273
  const responseHandler = context["responseHandler"];
273
- return typeof responseHandler === "function"
274
- ? await responseHandler.call(context, payload)
274
+ return typeof responseHandler === "function" ?
275
+ await responseHandler.call(context, payload)
275
276
  : payload;
276
277
  }