@anaemia/core 0.3.7 → 0.5.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.
Files changed (94) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/config.d.ts +8 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/plugins/lightningcss.js +4 -4
  8. package/dist/runtime/context.d.ts.map +1 -1
  9. package/dist/runtime/context.js +5 -4
  10. package/dist/runtime/entry-client.jsx +4 -5
  11. package/dist/runtime/entry-server.d.ts +1 -2
  12. package/dist/runtime/entry-server.d.ts.map +1 -1
  13. package/dist/runtime/entry-server.jsx +18 -321
  14. package/dist/runtime/resources.d.ts.map +1 -1
  15. package/dist/runtime/resources.js +2 -1
  16. package/dist/runtime/route-data.d.ts.map +1 -1
  17. package/dist/runtime/route-data.js +4 -3
  18. package/dist/runtime/route-request.d.ts.map +1 -1
  19. package/dist/runtime/route-request.js +3 -2
  20. package/dist/runtime/rpc-client.d.ts.map +1 -1
  21. package/dist/runtime/rpc-client.js +10 -9
  22. package/dist/runtime/server/app.d.ts +22 -0
  23. package/dist/runtime/server/app.d.ts.map +1 -0
  24. package/dist/runtime/server/app.js +21 -0
  25. package/dist/runtime/server/assets.d.ts +5 -0
  26. package/dist/runtime/server/assets.d.ts.map +1 -0
  27. package/dist/runtime/server/assets.js +48 -0
  28. package/dist/runtime/server/boot.d.ts +4 -0
  29. package/dist/runtime/server/boot.d.ts.map +1 -0
  30. package/dist/runtime/server/boot.js +6 -0
  31. package/dist/runtime/server/env.d.ts +3 -0
  32. package/dist/runtime/server/env.d.ts.map +1 -0
  33. package/dist/runtime/server/env.js +14 -0
  34. package/dist/runtime/server/guards.d.ts +29 -0
  35. package/dist/runtime/server/guards.d.ts.map +1 -0
  36. package/dist/runtime/server/guards.js +12 -0
  37. package/dist/runtime/server/html.d.ts +15 -0
  38. package/dist/runtime/server/html.d.ts.map +1 -0
  39. package/dist/runtime/server/html.js +62 -0
  40. package/dist/runtime/server/hydration.d.ts +3 -0
  41. package/dist/runtime/server/hydration.d.ts.map +1 -0
  42. package/dist/runtime/server/hydration.js +20 -0
  43. package/dist/runtime/server/manifest.d.ts +14 -0
  44. package/dist/runtime/server/manifest.d.ts.map +1 -0
  45. package/dist/runtime/server/manifest.js +59 -0
  46. package/dist/runtime/server/render-request.d.ts +21 -0
  47. package/dist/runtime/server/render-request.d.ts.map +1 -0
  48. package/dist/runtime/server/render-request.jsx +170 -0
  49. package/dist/runtime/server/route-match.d.ts +14 -0
  50. package/dist/runtime/server/route-match.d.ts.map +1 -0
  51. package/dist/runtime/server/route-match.js +35 -0
  52. package/dist/runtime/server/rpc.d.ts +3 -0
  53. package/dist/runtime/server/rpc.d.ts.map +1 -0
  54. package/dist/runtime/server/rpc.js +32 -0
  55. package/dist/runtime/server/types.d.ts +33 -0
  56. package/dist/runtime/server/types.d.ts.map +1 -0
  57. package/dist/runtime/server/types.js +1 -0
  58. package/dist/runtime/shared/constants.d.ts +8 -0
  59. package/dist/runtime/shared/constants.d.ts.map +1 -0
  60. package/dist/runtime/shared/constants.js +7 -0
  61. package/dist/types.d.ts.map +1 -1
  62. package/package.json +11 -7
  63. package/src/anaemia.d.ts +75 -0
  64. package/src/config.ts +9 -1
  65. package/src/index.ts +9 -1
  66. package/src/plugins/index.ts +1 -1
  67. package/src/plugins/lightningcss.ts +11 -11
  68. package/src/runtime/context.browser.ts +1 -1
  69. package/src/runtime/context.ts +6 -5
  70. package/src/runtime/entry-client.tsx +5 -8
  71. package/src/runtime/entry-server.tsx +19 -373
  72. package/src/runtime/resources.ts +3 -2
  73. package/src/runtime/route-data.ts +6 -5
  74. package/src/runtime/route-request.ts +4 -3
  75. package/src/runtime/rpc-client.ts +14 -13
  76. package/src/runtime/server/app.ts +44 -0
  77. package/src/runtime/server/assets.ts +69 -0
  78. package/src/runtime/server/boot.ts +9 -0
  79. package/src/runtime/server/env.ts +17 -0
  80. package/src/runtime/server/guards.ts +26 -0
  81. package/src/runtime/server/html.ts +84 -0
  82. package/src/runtime/server/hydration.ts +26 -0
  83. package/src/runtime/server/manifest.ts +69 -0
  84. package/src/runtime/server/render-request.tsx +230 -0
  85. package/src/runtime/server/route-match.ts +45 -0
  86. package/src/runtime/server/rpc.ts +34 -0
  87. package/src/runtime/server/types.ts +36 -0
  88. package/src/runtime/shared/constants.ts +7 -0
  89. package/src/runtime/webpack.d.ts +1 -1
  90. package/src/types.ts +18 -3
  91. package/test/integration/hmr.test.mjs +18 -5
  92. package/test/rpc-client.test.mjs +1 -1
  93. package/test/run-on-server.test.mjs +2 -6
  94. package/tsconfig.json +1 -1
@@ -1,9 +1,10 @@
1
1
  import { isServer } from "solid-js/web";
2
+ import { ANAEMIA_DATA_SCRIPT_ID, RPC_PATH, SERVER_FUNCTION_DATA_KEY } from "./shared/constants.js";
2
3
  let _clientCache = null;
3
4
  function ensureCacheInitialized() {
4
5
  if (isServer || _clientCache)
5
6
  return;
6
- const script = document.getElementById("__ANAEMIA_DATA__");
7
+ const script = document.getElementById(ANAEMIA_DATA_SCRIPT_ID);
7
8
  try {
8
9
  _clientCache = JSON.parse(script?.textContent || "{}");
9
10
  }
@@ -30,48 +31,48 @@ export function $$executeClientRpc(hashId) {
30
31
  if (isServer) {
31
32
  const store = getServerStore();
32
33
  if (store) {
33
- const functionCache = store.get("__SERVER_FUNCTION_DATA__");
34
+ const functionCache = store.get(SERVER_FUNCTION_DATA_KEY);
34
35
  if (functionCache?.[hashId]) {
35
36
  const match = findLooseCacheMatch(functionCache[hashId], args[0]);
36
37
  if (match)
37
38
  return match.data;
38
39
  }
39
40
  }
40
- return undefined;
41
+ return;
41
42
  }
42
43
  ensureCacheInitialized();
43
- const serverFunctionData = _clientCache?.__SERVER_FUNCTION_DATA__?.[hashId];
44
+ const serverFunctionData = _clientCache?.[SERVER_FUNCTION_DATA_KEY]?.[hashId];
44
45
  const match = findLooseCacheMatch(serverFunctionData ?? {}, args[0]);
45
46
  if (match) {
46
47
  const { matchingKey, data } = match;
47
48
  delete serverFunctionData[matchingKey];
48
49
  return data;
49
50
  }
50
- const response = await fetch(`/_rpc?id=${hashId}`, {
51
+ const response = await fetch(`${RPC_PATH}?id=${hashId}`, {
51
52
  method: "POST",
52
53
  headers: { "Content-Type": "application/json" },
53
54
  body: JSON.stringify(args),
54
55
  });
55
56
  if (!response.ok)
56
57
  throw new Error(`[anaemia] RPC execution failed: ${response.status}`);
57
- return await response.json();
58
+ return (await response.json());
58
59
  };
59
60
  asyncRpcCall.id = hashId;
60
61
  asyncRpcCall.readHydrationCache = function (...args) {
61
62
  if (isServer) {
62
63
  const store = getServerStore();
63
64
  if (store) {
64
- const functionCache = store.get("__SERVER_FUNCTION_DATA__");
65
+ const functionCache = store.get(SERVER_FUNCTION_DATA_KEY);
65
66
  if (functionCache?.[hashId]) {
66
67
  const match = findLooseCacheMatch(functionCache[hashId], args[0]);
67
68
  if (match)
68
69
  return match.data;
69
70
  }
70
71
  }
71
- return undefined;
72
+ return;
72
73
  }
73
74
  ensureCacheInitialized();
74
- const serverFunctionData = _clientCache?.__SERVER_FUNCTION_DATA__?.[hashId];
75
+ const serverFunctionData = _clientCache?.[SERVER_FUNCTION_DATA_KEY]?.[hashId];
75
76
  const match = findLooseCacheMatch(serverFunctionData ?? {}, args[0]);
76
77
  return match ? match.data : undefined;
77
78
  };
@@ -0,0 +1,22 @@
1
+ import { Hono } from "hono";
2
+ import type { Component } from "solid-js";
3
+ import type { RuntimeEnv } from "./types.js";
4
+ import type { GuardFn } from "./guards.js";
5
+ import type { ManifestSnapshot } from "./manifest.js";
6
+ type ServerLoader = (args: {
7
+ params: Record<string, string>;
8
+ request: Request;
9
+ }) => unknown | Promise<unknown>;
10
+ type CreateServerAppOptions = {
11
+ App: Component;
12
+ env: RuntimeEnv;
13
+ preloadActiveClientRoute: (path: string) => unknown | Promise<unknown>;
14
+ serverLoaderRegistry: Map<string, ServerLoader>;
15
+ serverGuardRegistry: Map<string, (() => Promise<GuardFn[]>)[]>;
16
+ registerServerRoutes: (app: Hono) => void;
17
+ getManifestSnapshot: () => ManifestSnapshot;
18
+ loadManifestAndTemplate: () => Promise<void>;
19
+ };
20
+ export declare function createServerApp(options: CreateServerAppOptions): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
21
+ export {};
22
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAM1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/G,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAChD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,oBAAoB,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC1C,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;IAC5C,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,8EAkB9D"}
@@ -0,0 +1,21 @@
1
+ import { Hono } from "hono";
2
+ import { compress } from "hono/compress";
3
+ import { ssrStorage } from "../context.js";
4
+ import { HONO_CONTEXT_KEY } from "../shared/constants.js";
5
+ import { registerAssetRoutes } from "./assets.js";
6
+ import { registerRpcRoute } from "./rpc.js";
7
+ import { createRenderRequestHandler } from "./render-request.jsx";
8
+ export function createServerApp(options) {
9
+ const app = new Hono();
10
+ app.use("*", compress());
11
+ app.use("*", async (c, next) => {
12
+ const store = new Map();
13
+ store.set(HONO_CONTEXT_KEY, c);
14
+ return await ssrStorage.run(store, next);
15
+ });
16
+ registerAssetRoutes(app, options.env);
17
+ registerRpcRoute(app);
18
+ options.registerServerRoutes(app);
19
+ app.get("*", createRenderRequestHandler(options));
20
+ return app;
21
+ }
@@ -0,0 +1,5 @@
1
+ import type { Context, Hono } from "hono";
2
+ import type { RuntimeEnv } from "./types.js";
3
+ export declare function registerAssetRoutes(app: Hono, env: RuntimeEnv): void;
4
+ export declare function setDevResponseCacheHeaders(c: Context, env: RuntimeEnv): void;
5
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAwB7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,QAqC7D;AAED,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,QAGrE"}
@@ -0,0 +1,48 @@
1
+ import { serveStatic } from "@hono/node-server/serve-static";
2
+ function setNoCacheHeaders(c) {
3
+ c.header("Cache-Control", "no-cache, no-store, must-revalidate");
4
+ c.header("Pragma", "no-cache");
5
+ c.header("Expires", "0");
6
+ }
7
+ async function proxyDevAsset(c, targetUrl, notFoundMessage, failureMessage) {
8
+ try {
9
+ const response = await fetch(targetUrl);
10
+ if (!response.ok)
11
+ return c.text(notFoundMessage, 404);
12
+ const contentType = response.headers.get("content-type");
13
+ if (contentType)
14
+ c.header("content-type", contentType);
15
+ setNoCacheHeaders(c);
16
+ return c.body(await response.arrayBuffer());
17
+ }
18
+ catch {
19
+ return c.text(failureMessage, 500);
20
+ }
21
+ }
22
+ export function registerAssetRoutes(app, env) {
23
+ if (env.isDev) {
24
+ app.get("/assets/*", (c) => proxyDevAsset(c, `${env.devServerUrl}${c.req.path}`, "asset not found in Rspack memory", "failed to connect to Rspack dev server asset bridge"));
25
+ }
26
+ else {
27
+ app.use("/assets/*", async (c, next) => {
28
+ await next();
29
+ if (c.res.ok)
30
+ c.res.headers.set("Cache-Control", "public, max-age=31536000, immutable");
31
+ });
32
+ app.use("/assets/*", serveStatic({
33
+ root: env.clientDistPath,
34
+ }));
35
+ }
36
+ app.use(async (c, next) => {
37
+ const requestPath = c.req.path;
38
+ if (env.isDev && requestPath.includes(".hot-update.")) {
39
+ return proxyDevAsset(c, `${env.devServerUrl}${requestPath}`, "hot update not found", "failed to fetch hot update");
40
+ }
41
+ await next();
42
+ });
43
+ }
44
+ export function setDevResponseCacheHeaders(c, env) {
45
+ if (!env.isDev)
46
+ return;
47
+ setNoCacheHeaders(c);
48
+ }
@@ -0,0 +1,4 @@
1
+ import type { Hono } from "hono";
2
+ import type { RuntimeEnv } from "./types.js";
3
+ export declare function serveServer(app: Hono, env: RuntimeEnv): void;
4
+ //# sourceMappingURL=boot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/boot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,QAIrD"}
@@ -0,0 +1,6 @@
1
+ import { serve } from "@hono/node-server";
2
+ export function serveServer(app, env) {
3
+ serve({ fetch: app.fetch, port: env.port }, (info) => {
4
+ console.log(`[anaemia framework] server live at http://localhost:${info.port}`);
5
+ });
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { RuntimeEnv } from "./types.js";
2
+ export declare function createRuntimeEnv(processEnv?: NodeJS.ProcessEnv): RuntimeEnv;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,CAaxF"}
@@ -0,0 +1,14 @@
1
+ import path from "node:path";
2
+ export function createRuntimeEnv(processEnv = process.env) {
3
+ const port = Number(processEnv.PORT) || 3000;
4
+ const isDev = processEnv.NODE_ENV !== "production";
5
+ const devPort = Number(processEnv.RSPACK_DEV_PORT) || 4445;
6
+ return {
7
+ port,
8
+ isDev,
9
+ devServerUrl: `http://localhost:${devPort}`,
10
+ templatePath: path.resolve(process.cwd(), "./dist/client/index.html"),
11
+ manifestPath: path.resolve(process.cwd(), "./dist/route-manifest.json"),
12
+ clientDistPath: path.resolve(process.cwd(), "./dist/client"),
13
+ };
14
+ }
@@ -0,0 +1,29 @@
1
+ export type GuardFn = (ctx: {
2
+ params: Record<string, string>;
3
+ request: Request;
4
+ url: string;
5
+ }) => void | undefined | {
6
+ redirect: string;
7
+ status?: 301 | 302 | 307 | 308;
8
+ } | {
9
+ status: number;
10
+ body?: string;
11
+ } | Promise<void | undefined | {
12
+ redirect: string;
13
+ status?: number;
14
+ } | {
15
+ status: number;
16
+ body?: string;
17
+ }>;
18
+ export declare function runGuards(serverGuardRegistry: Map<string, (() => Promise<GuardFn[]>)[]>, pattern: string, ctx: {
19
+ params: Record<string, string>;
20
+ request: Request;
21
+ url: string;
22
+ }): Promise<{
23
+ status: number;
24
+ body?: string;
25
+ } | {
26
+ redirect: string;
27
+ status?: number;
28
+ } | null>;
29
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/guards.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,KACG,IAAI,GACJ,SAAS,GACT;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;CAAE,GACpD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1G,wBAAsB,SAAS,CAC7B,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAC9D,OAAO,EAAE,MAAM,EACf,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;YAN1D,MAAM;WAAS,MAAM;;cACQ,MAAM;aAAW,MAAM;UAgBjE"}
@@ -0,0 +1,12 @@
1
+ export async function runGuards(serverGuardRegistry, pattern, ctx) {
2
+ const chain = serverGuardRegistry.get(pattern) ?? [];
3
+ for (const loadGuards of chain) {
4
+ const guards = await loadGuards();
5
+ for (const guard of guards) {
6
+ const result = await guard(ctx);
7
+ if (result && ("redirect" in result || "status" in result))
8
+ return result;
9
+ }
10
+ }
11
+ return null;
12
+ }
@@ -0,0 +1,15 @@
1
+ import type { RouteManifest } from "./types.js";
2
+ export declare function getRouteAssetTags(manifest: RouteManifest, activeChunk: string): {
3
+ scripts: string;
4
+ styles: string;
5
+ };
6
+ export declare function createDevNoCacheHeadTags(isDev: boolean): string;
7
+ export declare function createHtmlStreamShell(args: {
8
+ template: string;
9
+ headInjections: string;
10
+ bodyInjections: string;
11
+ }): {
12
+ beforeEntry: string;
13
+ afterEntry: string;
14
+ };
15
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,YAAY,CAAC;AA8B7D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcnH;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI/D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG;IACjH,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CA2BA"}
@@ -0,0 +1,62 @@
1
+ import { ENTRY_ATTRIBUTE } from "../shared/constants.js";
2
+ const ENTRY_TAG_REGEX = /(<([a-zA-Z0-9-]+)[^>]*anaemia-entry[^>]*>)(.*?)(<\/\2>)/is;
3
+ function normalizeAssetUrl(url) {
4
+ if (!url || typeof url !== "string")
5
+ return "";
6
+ if (url.startsWith("http://") || url.startsWith("https://"))
7
+ return url;
8
+ return url.startsWith("/") ? url : `/${url}`;
9
+ }
10
+ function chunkAssetTags(chunk) {
11
+ if (!chunk)
12
+ return { scripts: "", styles: "" };
13
+ const scripts = (chunk.js ?? "")
14
+ ? (Array.isArray(chunk.js) ? chunk.js : [chunk.js])
15
+ .map((jsFile) => `<script type="module" src="${normalizeAssetUrl(jsFile)}"></script>\n`)
16
+ .join("")
17
+ : "";
18
+ const styles = (chunk.css ?? "")
19
+ ? (Array.isArray(chunk.css) ? chunk.css : [chunk.css])
20
+ .map((cssFile) => `<link rel="stylesheet" href="${normalizeAssetUrl(cssFile)}">\n`)
21
+ .join("")
22
+ : "";
23
+ return { scripts, styles };
24
+ }
25
+ export function getRouteAssetTags(manifest, activeChunk) {
26
+ const chunkNames = ["client", "commons", "vendors"];
27
+ if (activeChunk && activeChunk !== "client")
28
+ chunkNames.push(activeChunk);
29
+ return chunkNames.reduce((assetTags, chunkName) => {
30
+ const tags = chunkAssetTags(manifest.chunks[chunkName]);
31
+ return {
32
+ scripts: assetTags.scripts + tags.scripts,
33
+ styles: assetTags.styles + tags.styles,
34
+ };
35
+ }, { scripts: "", styles: "" });
36
+ }
37
+ export function createDevNoCacheHeadTags(isDev) {
38
+ return isDev
39
+ ? `<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">\n<meta http-equiv="Pragma" content="no-cache">\n<meta http-equiv="Expires" content="0">\n`
40
+ : "";
41
+ }
42
+ export function createHtmlStreamShell(args) {
43
+ const templateWithHead = args.template.replace("<head>", `<head>${args.headInjections}`);
44
+ const entryMatch = ENTRY_TAG_REGEX.exec(templateWithHead);
45
+ if (entryMatch) {
46
+ const [fullMatch, openTag, _tagName, _inner, closeTag] = entryMatch;
47
+ const beforeEntry = `${templateWithHead.slice(0, entryMatch.index)}${openTag}`;
48
+ const afterEntry = `${closeTag}${templateWithHead.slice(entryMatch.index + fullMatch.length)}`.replace("</body>", `${args.bodyInjections}</body>`);
49
+ return { beforeEntry, afterEntry };
50
+ }
51
+ const bodyCloseIndex = templateWithHead.lastIndexOf("</body>");
52
+ if (bodyCloseIndex >= 0) {
53
+ return {
54
+ beforeEntry: `${templateWithHead.slice(0, bodyCloseIndex)}<div ${ENTRY_ATTRIBUTE}>`,
55
+ afterEntry: `</div>${args.bodyInjections}${templateWithHead.slice(bodyCloseIndex)}`,
56
+ };
57
+ }
58
+ return {
59
+ beforeEntry: `${templateWithHead}<div ${ENTRY_ATTRIBUTE}>`,
60
+ afterEntry: `</div>${args.bodyInjections}`,
61
+ };
62
+ }
@@ -0,0 +1,3 @@
1
+ export declare function createHydrationDataScript(store: Map<string, unknown>): string;
2
+ export declare function createHydrationRuntimeScript(): string;
3
+ //# sourceMappingURL=hydration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/hydration.ts"],"names":[],"mappings":"AAWA,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAU7E;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD"}
@@ -0,0 +1,20 @@
1
+ import { generateHydrationScript } from "solid-js/web";
2
+ import { ANAEMIA_DATA_SCRIPT_ID, LOADER_DATA_KEY, SERVER_FUNCTION_DATA_KEY } from "../shared/constants.js";
3
+ function serializeJsonForHtml(value) {
4
+ return JSON.stringify(value)
5
+ .replace(/&/g, "\\u0026")
6
+ .replace(/</g, "\\u003c")
7
+ .replace(/>/g, "\\u003e")
8
+ .replace(/\//g, "\\u002f");
9
+ }
10
+ export function createHydrationDataScript(store) {
11
+ const rawStorePayload = Object.fromEntries(store);
12
+ const finalHydrationStatePayload = {
13
+ [LOADER_DATA_KEY]: rawStorePayload[LOADER_DATA_KEY] || {},
14
+ [SERVER_FUNCTION_DATA_KEY]: rawStorePayload[SERVER_FUNCTION_DATA_KEY] || {},
15
+ };
16
+ return `<script id="${ANAEMIA_DATA_SCRIPT_ID}" type="application/json">${serializeJsonForHtml(finalHydrationStatePayload)}</script>\n`;
17
+ }
18
+ export function createHydrationRuntimeScript() {
19
+ return generateHydrationScript();
20
+ }
@@ -0,0 +1,14 @@
1
+ import type { RouteManifest, RuntimeEnv } from "./types.js";
2
+ export type ManifestSnapshot = {
3
+ template: string;
4
+ manifest: RouteManifest | null;
5
+ sortedRoutes: RouteManifest["routes"];
6
+ staticRoutes: Set<string>;
7
+ loaderRoutes: Set<string>;
8
+ guardRoutes: Set<string>;
9
+ };
10
+ export declare function createManifestStore(env: RuntimeEnv): {
11
+ load: () => Promise<void>;
12
+ getSnapshot: () => ManifestSnapshot;
13
+ };
14
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU;;uBAyCzB,gBAAgB;EAczC"}
@@ -0,0 +1,59 @@
1
+ import fs from "node:fs";
2
+ import { sortRoutes } from "./route-match.js";
3
+ export function createManifestStore(env) {
4
+ let memoizedHtmlTemplate = "";
5
+ let memoizedManifest = null;
6
+ let memoizedSortedRoutes = [];
7
+ const load = async () => {
8
+ if (env.isDev) {
9
+ try {
10
+ memoizedHtmlTemplate = await fetch(`${env.devServerUrl}/index.html`).then((response) => {
11
+ if (!response.ok)
12
+ throw new Error(`index.html fetch failed: ${response.status}`);
13
+ return response.text();
14
+ });
15
+ }
16
+ catch (err) {
17
+ console.error("[anaemia engine sync error - HTML fetch failed]:", err);
18
+ memoizedHtmlTemplate = "";
19
+ }
20
+ try {
21
+ if (fs.existsSync(env.manifestPath)) {
22
+ memoizedManifest = JSON.parse(fs.readFileSync(env.manifestPath, "utf-8"));
23
+ }
24
+ else {
25
+ memoizedManifest = { routes: [], chunks: {}, errors: {} };
26
+ }
27
+ }
28
+ catch (err) {
29
+ console.error("[anaemia engine sync error - manifest read failed]:", err);
30
+ memoizedManifest = { routes: [], chunks: {}, errors: {} };
31
+ }
32
+ }
33
+ else {
34
+ try {
35
+ if (fs.existsSync(env.templatePath))
36
+ memoizedHtmlTemplate = fs.readFileSync(env.templatePath, "utf-8");
37
+ if (fs.existsSync(env.manifestPath)) {
38
+ memoizedManifest = JSON.parse(fs.readFileSync(env.manifestPath, "utf-8"));
39
+ }
40
+ }
41
+ catch {
42
+ console.warn("build assets not fully initialized during bootstrapping cycle.");
43
+ }
44
+ }
45
+ memoizedSortedRoutes = memoizedManifest ? sortRoutes(memoizedManifest.routes) : [];
46
+ };
47
+ const getSnapshot = () => {
48
+ const routes = memoizedManifest?.routes ?? [];
49
+ return {
50
+ template: memoizedHtmlTemplate,
51
+ manifest: memoizedManifest,
52
+ sortedRoutes: memoizedSortedRoutes,
53
+ staticRoutes: new Set(routes.filter((r) => r.isStatic).map((r) => r.urlPattern)),
54
+ loaderRoutes: new Set(routes.filter((r) => r.hasLoader).map((r) => r.urlPattern)),
55
+ guardRoutes: new Set(routes.filter((r) => r.hasGuard).map((r) => r.urlPattern)),
56
+ };
57
+ };
58
+ return { load, getSnapshot };
59
+ }
@@ -0,0 +1,21 @@
1
+ import type { Component } from "solid-js";
2
+ import type { Context } from "hono";
3
+ import { type GuardFn } from "./guards.js";
4
+ import type { RuntimeEnv } from "./types.js";
5
+ import type { ManifestSnapshot } from "./manifest.js";
6
+ type ServerLoader = (args: {
7
+ params: Record<string, string>;
8
+ request: Request;
9
+ }) => unknown | Promise<unknown>;
10
+ type RenderRequestOptions = {
11
+ App: Component;
12
+ env: RuntimeEnv;
13
+ preloadActiveClientRoute: (path: string) => unknown | Promise<unknown>;
14
+ serverLoaderRegistry: Map<string, ServerLoader>;
15
+ serverGuardRegistry: Map<string, (() => Promise<GuardFn[]>)[]>;
16
+ getManifestSnapshot: () => ManifestSnapshot;
17
+ loadManifestAndTemplate: () => Promise<void>;
18
+ };
19
+ export declare function createRenderRequestHandler(options: RenderRequestOptions): (c: Context) => Promise<Response>;
20
+ export {};
21
+ //# sourceMappingURL=render-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-request.d.ts","sourceRoot":"","sources":["../../../src/runtime/server/render-request.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAMpC,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/G,KAAK,oBAAoB,GAAG;IAC1B,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAChD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;IAC5C,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAmGF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,IACxD,GAAG,OAAO,uBAsGzB"}