jeasx 2.6.1 → 2.7.0

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/cli.js CHANGED
@@ -37,12 +37,6 @@ async function build() {
37
37
 
38
38
  async function dev() {
39
39
  process.env.NODE_ENV = "development";
40
- process.setSourceMapsEnabled(true);
41
- // Bun: https://bun.sh/docs/runtime/nodejs-apis#process
42
- if (process.sourceMapsEnabled === undefined) {
43
- // @ts-ignore
44
- process.sourceMapsEnabled = true;
45
- }
46
40
  await build();
47
41
  await start();
48
42
  }
package/env.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { existsSync } from "node:fs";
2
- import { join } from "node:path";
3
2
 
4
3
  /**
5
4
  * Load environment variables from .env-files into process.env in the following order:
@@ -9,11 +8,8 @@ import { join } from "node:path";
9
8
  * 3. .env.local
10
9
  * 4. .env
11
10
  * 5. .env.defaults
12
- * 6. .env.js
13
- *
14
- * .env.js is imported as an ES module and will always overwrite existing variables.
15
11
  */
16
- export default async function env() {
12
+ export default function env() {
17
13
  if (process.loadEnvFile) {
18
14
  [
19
15
  ...(process.env.NODE_ENV
@@ -26,30 +22,4 @@ export default async function env() {
26
22
  .filter(existsSync)
27
23
  .forEach(process.loadEnvFile);
28
24
  }
29
- try {
30
- const envFile = `file://${join(process.cwd(), ".env.js")}`;
31
- const envObject = (await import(envFile)).default;
32
- Object.entries(envObject).forEach(([key, value]) => {
33
- try {
34
- switch (typeof value) {
35
- case "string":
36
- process.env[key] = value;
37
- break;
38
- case "function":
39
- process.env[key] = value.toString();
40
- break;
41
- default:
42
- process.env[key] = JSON.stringify(value);
43
- break;
44
- }
45
- } catch (error) {
46
- // JSON.stringify throws TypeError for circular references or BigInts.
47
- console.error("❌", `"${key}" in .env.js throws`, error);
48
- }
49
- });
50
- return { ...process.env, ...envObject };
51
- } catch {
52
- // ERR_MODULE_NOT_FOUND
53
- return { ...process.env };
54
- }
55
25
  }
package/esbuild.config.js CHANGED
@@ -1,15 +1,17 @@
1
1
  import * as esbuild from "esbuild";
2
+ import { join } from "node:path";
2
3
  import env from "./env.js";
3
4
 
4
- const ENV = await env();
5
+ env();
5
6
 
6
- const BUILD_TIME = `"${ENV.BUILD_TIME || Date.now().toString(36)}"`;
7
+ const CONFIG = (await import(`file://${join(process.cwd(), "jeasx.config.js")}`)).default;
8
+ const BUILD_TIME = `"${process.env.BUILD_TIME || Date.now().toString(36)}"`;
7
9
 
8
- const BROWSER_PUBLIC_ENV = Object.keys(ENV)
10
+ const BROWSER_PUBLIC_ENV = Object.keys(process.env)
9
11
  .filter((key) => key.startsWith("BROWSER_PUBLIC_"))
10
12
  .reduce(
11
13
  (env, key) => {
12
- env[`process.env.${key}`] = `"${ENV[key]}"`;
14
+ env[`process.env.${key}`] = `"${process.env[key]}"`;
13
15
  return env;
14
16
  },
15
17
  Object({ "process.env.BROWSER_PUBLIC_BUILD_TIME": BUILD_TIME }),
@@ -24,15 +26,13 @@ const buildOptions = [
24
26
  logLevel: "info",
25
27
  color: true,
26
28
  bundle: true,
27
- sourcemap: process.sourceMapsEnabled,
28
- sourcesContent: false,
29
29
  outdir: "dist",
30
30
  publicPath: "/",
31
31
  assetNames: "[dir]/[name]-[hash]",
32
32
  platform: "neutral",
33
33
  format: "esm",
34
34
  packages: "external",
35
- ...ENV.ESBUILD_SERVER_OPTIONS?.(),
35
+ ...CONFIG.ESBUILD_SERVER_OPTIONS?.(),
36
36
  },
37
37
  {
38
38
  entryPoints: ["src/**/index.*"],
@@ -41,14 +41,12 @@ const buildOptions = [
41
41
  logLevel: "info",
42
42
  color: true,
43
43
  bundle: true,
44
- sourcemap: process.sourceMapsEnabled,
45
- sourcesContent: true,
46
44
  outdir: "dist",
47
45
  publicPath: "/",
48
46
  assetNames: "[dir]/[name]-[hash]",
49
47
  platform: "browser",
50
48
  format: "esm",
51
- ...ENV.ESBUILD_BROWSER_OPTIONS?.(),
49
+ ...CONFIG.ESBUILD_BROWSER_OPTIONS?.(),
52
50
  },
53
51
  ];
54
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jeasx",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "description": "Jeasx - the ease of JSX with the power of SSR",
5
5
  "keywords": [
6
6
  "async",
@@ -26,16 +26,19 @@
26
26
  "type": "module",
27
27
  "main": "server.js",
28
28
  "scripts": {
29
- "build": "esbuild --platform=node --format=esm --sourcemap=linked --sources-content=false --outdir=. serverless.ts"
29
+ "build": "esbuild --platform=node --format=esm --sourcemap=linked --outdir=. serverless.ts"
30
30
  },
31
31
  "dependencies": {
32
32
  "@fastify/cookie": "11.0.2",
33
33
  "@fastify/formbody": "8.0.2",
34
34
  "@fastify/multipart": "10.0.0",
35
35
  "@fastify/static": "9.1.3",
36
- "@types/node": "25.7.0",
36
+ "@types/node": "25.9.1",
37
37
  "esbuild": "0.28.0",
38
38
  "fastify": "5.8.5",
39
39
  "jsx-async-runtime": "2.1.2"
40
+ },
41
+ "allowScripts": {
42
+ "esbuild@0.28.0": true
40
43
  }
41
44
  }
package/serverless.js CHANGED
@@ -8,28 +8,28 @@ import { stat } from "node:fs/promises";
8
8
  import { freemem } from "node:os";
9
9
  import { join } from "node:path";
10
10
  import env from "./env.js";
11
- const ENV = await env();
12
- const CWD = process.cwd();
11
+ env();
12
+ const CONFIG = (await import(`file://${join(process.cwd(), "jeasx.config.js")}`)).default;
13
13
  const NODE_ENV_IS_DEVELOPMENT = process.env.NODE_ENV === "development";
14
14
  const ROUTE_CACHE_LIMIT = Math.floor(freemem() / 1024 / 1024);
15
- const FASTIFY_SERVER = ENV.FASTIFY_SERVER ?? ((fastify2) => fastify2);
15
+ const FASTIFY_SERVER = CONFIG.FASTIFY_SERVER ?? ((fastify2) => fastify2);
16
16
  var serverless_default = FASTIFY_SERVER(
17
17
  fastify({
18
- ...ENV.FASTIFY_SERVER_OPTIONS?.()
18
+ ...CONFIG.FASTIFY_SERVER_OPTIONS?.()
19
19
  })
20
20
  ).register((fastify2) => {
21
21
  fastify2.register(fastifyCookie, {
22
- ...ENV.FASTIFY_COOKIE_OPTIONS?.()
22
+ ...CONFIG.FASTIFY_COOKIE_OPTIONS?.()
23
23
  }).register(fastifyFormbody, {
24
- ...ENV.FASTIFY_FORMBODY_OPTIONS?.()
24
+ ...CONFIG.FASTIFY_FORMBODY_OPTIONS?.()
25
25
  }).register(fastifyMultipart, {
26
- ...ENV.FASTIFY_MULTIPART_OPTIONS?.()
26
+ ...CONFIG.FASTIFY_MULTIPART_OPTIONS?.()
27
27
  }).register(fastifyStatic, {
28
- root: ["public", "dist"].map((dir) => join(CWD, dir)),
28
+ root: ["public", "dist"].map((dir) => join(process.cwd(), dir)),
29
29
  wildcard: false,
30
30
  globIgnore: ["/**/\\[*\\].js?(.map)"],
31
31
  // ignore server routes
32
- ...ENV.FASTIFY_STATIC_OPTIONS?.()
32
+ ...CONFIG.FASTIFY_STATIC_OPTIONS?.()
33
33
  }).decorateRequest("route", "").decorateRequest("path", "").addHook("onRequest", async (request) => {
34
34
  const index = request.url.indexOf("?");
35
35
  request.path = index === -1 ? request.url : request.url.slice(0, index);
@@ -59,7 +59,7 @@ async function handler(request, reply) {
59
59
  }
60
60
  if (module === void 0) {
61
61
  try {
62
- const modulePath = join(CWD, "dist", `${route}.js`);
62
+ const modulePath = join(process.cwd(), "dist", `${route}.js`);
63
63
  if (NODE_ENV_IS_DEVELOPMENT) {
64
64
  if (typeof require === "function") {
65
65
  if (require.cache[modulePath]) {
package/serverless.js.map CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["serverless.ts"],
4
- "mappings": "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",
4
+ "sourcesContent": ["import fastifyCookie, { FastifyCookieOptions } from \"@fastify/cookie\";\nimport fastifyFormbody, { FastifyFormbodyOptions } from \"@fastify/formbody\";\nimport fastifyMultipart, { FastifyMultipartOptions } from \"@fastify/multipart\";\nimport fastifyStatic, { FastifyStaticOptions } from \"@fastify/static\";\nimport fastify, {\n FastifyInstance,\n FastifyReply,\n FastifyRequest,\n FastifyServerOptions,\n} from \"fastify\";\nimport { jsxToString } from \"jsx-async-runtime\";\nimport { stat } from \"node:fs/promises\";\nimport { freemem } from \"node:os\";\nimport { join } from \"node:path\";\nimport env from \"./env.js\";\n\nenv();\n\nconst CONFIG = (await import(`file://${join(process.cwd(), \"jeasx.config.js\")}`)).default;\nconst NODE_ENV_IS_DEVELOPMENT = process.env.NODE_ENV === \"development\";\nconst ROUTE_CACHE_LIMIT = Math.floor(freemem() / 1024 / 1024);\n\ndeclare module \"fastify\" {\n interface FastifyRequest {\n path: string; // Path without query parameters\n route: string; // Path to resolved route handler\n }\n}\n\n// Enhance Fastify server from userland\nconst FASTIFY_SERVER = (CONFIG.FASTIFY_SERVER ?? ((fastify) => fastify)) as (\n fastify: FastifyInstance,\n) => FastifyInstance;\n\n// Create and export a Fastify instance\nexport default FASTIFY_SERVER(\n fastify({\n ...(CONFIG.FASTIFY_SERVER_OPTIONS?.() as FastifyServerOptions),\n }),\n)\n // Create encapsulation context\n .register((fastify) => {\n fastify\n .register(fastifyCookie, {\n ...(CONFIG.FASTIFY_COOKIE_OPTIONS?.() as FastifyCookieOptions),\n })\n .register(fastifyFormbody, {\n ...(CONFIG.FASTIFY_FORMBODY_OPTIONS?.() as FastifyFormbodyOptions),\n })\n .register(fastifyMultipart, {\n ...(CONFIG.FASTIFY_MULTIPART_OPTIONS?.() as FastifyMultipartOptions),\n })\n .register(fastifyStatic, {\n root: [\"public\", \"dist\"].map((dir) => join(process.cwd(), dir)),\n wildcard: false,\n globIgnore: [\"/**/\\\\[*\\\\].js?(.map)\"], // ignore server routes\n ...(CONFIG.FASTIFY_STATIC_OPTIONS?.() as FastifyStaticOptions),\n })\n .decorateRequest(\"route\", \"\")\n .decorateRequest(\"path\", \"\")\n .addHook(\"onRequest\", async (request) => {\n // Extract path from url\n const index = request.url.indexOf(\"?\");\n request.path = index === -1 ? request.url : request.url.slice(0, index);\n })\n .all(\"*\", async (request: FastifyRequest, reply: FastifyReply) => {\n try {\n const payload = await handler(request, reply);\n if (\n reply.getHeader(\"content-type\") === undefined &&\n (typeof payload === \"string\" || Buffer.isBuffer(payload))\n ) {\n reply.type(\"text/html; charset=utf-8\");\n }\n return payload;\n } catch (error) {\n request.log.error(error);\n throw error;\n }\n });\n });\n\n// Cache for resolved route modules, 'null' means no module exists.\nconst modules = new Map<string, { default: Function }>();\n\n/**\n * Resolves route module based on the request path and execute it.\n */\nasync function handler(request: FastifyRequest, reply: FastifyReply) {\n let response: unknown;\n\n // Global context object for route handlers\n const context = {};\n\n // Default props for route handlers\n const props = { request, reply };\n\n try {\n // Execute route handlers for current request\n for (const route of generateRoutes(request.path)) {\n // Resolve module via cache\n let module = modules.get(route);\n\n // Module was cached as not found?\n if (module === null) {\n continue;\n }\n\n // Module was not loaded yet?\n if (module === undefined) {\n try {\n const modulePath = join(process.cwd(), \"dist\", `${route}.js`);\n if (NODE_ENV_IS_DEVELOPMENT) {\n if (typeof require === \"function\") {\n // Bun: Remove module from cache before importing\n // as query parameter for import is ignored (see Node).\n if (require.cache[modulePath]) {\n delete require.cache[modulePath];\n }\n module = await import(`file://${modulePath}`);\n } else {\n // Node: Use timestamp as query parameter to update modules.\n const mtime = (await stat(modulePath)).mtime.getTime();\n module = await import(`file://${modulePath}?${mtime}`);\n }\n } else {\n // Load and cache module for non-development\n module = await import(`file://${modulePath}`);\n modules.set(route, module);\n }\n } catch (e) {\n switch (e.code) {\n case \"ENOENT\":\n case \"ENOTDIR\":\n case \"ERR_MODULE_NOT_FOUND\":\n if (!NODE_ENV_IS_DEVELOPMENT) {\n // Cache module as not found\n modules.set(route, null);\n }\n continue;\n default:\n // Module exists, but fails to load.\n throw e;\n }\n } finally {\n // Remove oldest entry from cache if limit is reached\n if (modules.size > ROUTE_CACHE_LIMIT) {\n modules.delete(modules.keys().next().value);\n }\n }\n }\n\n // Store current route in request\n request.route = route;\n\n response =\n // Call functions with 'this' context and props as parameters\n typeof module.default === \"function\"\n ? await module.default.call(context, props)\n : module.default; // otherwise return default export\n\n if (reply.sent) {\n return;\n } else if (route.endsWith(\"/[404]\")) {\n // Preserve existing status if a 404 page is requested directly.\n // If no status is defined, set status to 404 automatically.\n if (reply.statusCode === 200 && !request.path.endsWith(\"/404\")) {\n reply.status(404);\n }\n break;\n } else if (typeof response === \"string\" || Buffer.isBuffer(response) || isJSX(response)) {\n break;\n } else if (\n route.endsWith(\"/[...guard]\") &&\n (response === undefined || typeof response === \"object\")\n ) {\n // Add object entries from guard to props\n Object.assign(props, response);\n continue;\n } else if (reply.statusCode === 404) {\n continue;\n } else {\n break;\n }\n }\n return await renderJSX(context, response);\n } catch (error) {\n const errorHandler = context[\"errorHandler\"];\n if (typeof errorHandler === \"function\") {\n reply.status(500);\n response = await errorHandler.call(context, error);\n return await renderJSX(context, response);\n } else {\n throw error;\n }\n }\n}\n\n/**\n * Generates all possible routes based on the given input path.\n */\nfunction generateRoutes(path: string): string[] {\n // \"/a/b/c\" => [\"/a/b/c\", \"/a/b\", \"/a\", \"\"]\n const segments = generateSegments(path);\n\n // \"/a/b/c\" => [\"/a/b/[c]\", \"/a/b/c/[index]\"]\n const edges = generateEdges(segments[0]);\n\n return [\n ...segments\n .toReversed() // [...guard]s are evaluated from top to bottom\n .map((segment) => `${segment}/[...guard]`),\n ...edges.map((edge) => `${edge}`),\n ...segments.map((segment) => `${segment}/[...path]`),\n ...segments.map((segment) => `${segment}/[404]`),\n ];\n}\n\n/**\n * Transforms a given path into an array of all its segments.\n *\n * @example\n * generateSegments(\"/a/b/c\") => [\"/a/b/c\", \"/a/b\", \"/a\", \"\"]\n */\nfunction generateSegments(path: string): string[] {\n return path\n .split(\"/\")\n .filter((segment) => segment !== \"\")\n .reduce((acc, segment) => {\n acc.push((acc.length > 0 ? acc[acc.length - 1] : \"\") + \"/\" + segment);\n return acc;\n }, [])\n .reverse()\n .concat(\"\");\n}\n\n/**\n * Generates edge routes for the given input path.\n *\n * An edge is either a route with a named segment (e.g. \"/a/b/[c]\")\n * or a route with an \"index\" segment (e.g. \"/a/b/c/[index]\").\n */\nfunction generateEdges(path: string): string[] {\n const edges = [];\n if (path) {\n const lastSegment = path.lastIndexOf(\"/\") + 1;\n edges.push(`${path.substring(0, lastSegment)}[${path.substring(lastSegment)}]`);\n }\n edges.push(`${path}/[index]`);\n return edges;\n}\n\n/**\n * Determines if a given object is a JSX element.\n */\nfunction isJSX(obj: unknown): boolean {\n return !!obj && typeof obj === \"object\" && \"type\" in obj && \"props\" in obj;\n}\n\n/**\n * Renders JSX to string and applies optional response handler.\n */\nasync function renderJSX(context: object, response: unknown) {\n const payload = isJSX(response) ? await jsxToString.call(context, response) : response;\n\n // Post-process the payload with an optional response handler\n const responseHandler = context[\"responseHandler\"];\n return typeof responseHandler === \"function\"\n ? await responseHandler.call(context, payload)\n : payload;\n}\n"],
5
+ "mappings": "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",
5
6
  "names": ["fastify"]
6
7
  }
package/serverless.ts CHANGED
@@ -14,9 +14,9 @@ import { freemem } from "node:os";
14
14
  import { join } from "node:path";
15
15
  import env from "./env.js";
16
16
 
17
- const ENV = await env();
17
+ env();
18
18
 
19
- const CWD = process.cwd();
19
+ const CONFIG = (await import(`file://${join(process.cwd(), "jeasx.config.js")}`)).default;
20
20
  const NODE_ENV_IS_DEVELOPMENT = process.env.NODE_ENV === "development";
21
21
  const ROUTE_CACHE_LIMIT = Math.floor(freemem() / 1024 / 1024);
22
22
 
@@ -28,33 +28,33 @@ declare module "fastify" {
28
28
  }
29
29
 
30
30
  // Enhance Fastify server from userland
31
- const FASTIFY_SERVER = (ENV.FASTIFY_SERVER ?? ((fastify) => fastify)) as (
31
+ const FASTIFY_SERVER = (CONFIG.FASTIFY_SERVER ?? ((fastify) => fastify)) as (
32
32
  fastify: FastifyInstance,
33
33
  ) => FastifyInstance;
34
34
 
35
35
  // Create and export a Fastify instance
36
36
  export default FASTIFY_SERVER(
37
37
  fastify({
38
- ...(ENV.FASTIFY_SERVER_OPTIONS?.() as FastifyServerOptions),
38
+ ...(CONFIG.FASTIFY_SERVER_OPTIONS?.() as FastifyServerOptions),
39
39
  }),
40
40
  )
41
41
  // Create encapsulation context
42
42
  .register((fastify) => {
43
43
  fastify
44
44
  .register(fastifyCookie, {
45
- ...(ENV.FASTIFY_COOKIE_OPTIONS?.() as FastifyCookieOptions),
45
+ ...(CONFIG.FASTIFY_COOKIE_OPTIONS?.() as FastifyCookieOptions),
46
46
  })
47
47
  .register(fastifyFormbody, {
48
- ...(ENV.FASTIFY_FORMBODY_OPTIONS?.() as FastifyFormbodyOptions),
48
+ ...(CONFIG.FASTIFY_FORMBODY_OPTIONS?.() as FastifyFormbodyOptions),
49
49
  })
50
50
  .register(fastifyMultipart, {
51
- ...(ENV.FASTIFY_MULTIPART_OPTIONS?.() as FastifyMultipartOptions),
51
+ ...(CONFIG.FASTIFY_MULTIPART_OPTIONS?.() as FastifyMultipartOptions),
52
52
  })
53
53
  .register(fastifyStatic, {
54
- root: ["public", "dist"].map((dir) => join(CWD, dir)),
54
+ root: ["public", "dist"].map((dir) => join(process.cwd(), dir)),
55
55
  wildcard: false,
56
56
  globIgnore: ["/**/\\[*\\].js?(.map)"], // ignore server routes
57
- ...(ENV.FASTIFY_STATIC_OPTIONS?.() as FastifyStaticOptions),
57
+ ...(CONFIG.FASTIFY_STATIC_OPTIONS?.() as FastifyStaticOptions),
58
58
  })
59
59
  .decorateRequest("route", "")
60
60
  .decorateRequest("path", "")
@@ -109,7 +109,7 @@ async function handler(request: FastifyRequest, reply: FastifyReply) {
109
109
  // Module was not loaded yet?
110
110
  if (module === undefined) {
111
111
  try {
112
- const modulePath = join(CWD, "dist", `${route}.js`);
112
+ const modulePath = join(process.cwd(), "dist", `${route}.js`);
113
113
  if (NODE_ENV_IS_DEVELOPMENT) {
114
114
  if (typeof require === "function") {
115
115
  // Bun: Remove module from cache before importing