@canmi/seam-server 0.2.3 → 0.2.14

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/dist/index.d.ts CHANGED
@@ -24,6 +24,7 @@ declare function uint32(): SchemaNode<number>;
24
24
  declare function float32(): SchemaNode<number>;
25
25
  declare function float64(): SchemaNode<number>;
26
26
  declare function timestamp(): SchemaNode<string>;
27
+ declare function html(): SchemaNode<string>;
27
28
  //#endregion
28
29
  //#region src/types/composites.d.ts
29
30
  type Simplify<T> = { [K in keyof T]: T[K] } & {};
@@ -59,6 +60,7 @@ declare const t: {
59
60
  readonly float32: typeof float32;
60
61
  readonly float64: typeof float64;
61
62
  readonly timestamp: typeof timestamp;
63
+ readonly html: typeof html;
62
64
  };
63
65
  //#endregion
64
66
  //#region src/manifest/index.d.ts
@@ -79,6 +81,22 @@ interface HandleResult {
79
81
  body: unknown;
80
82
  }
81
83
  //#endregion
84
+ //#region src/router/handler.d.ts
85
+ interface BatchCall {
86
+ procedure: string;
87
+ input: unknown;
88
+ }
89
+ type BatchResultItem = {
90
+ ok: true;
91
+ data: unknown;
92
+ } | {
93
+ ok: false;
94
+ error: {
95
+ code: string;
96
+ message: string;
97
+ };
98
+ };
99
+ //#endregion
82
100
  //#region src/page/index.d.ts
83
101
  interface LoaderResult {
84
102
  procedure: string;
@@ -94,6 +112,7 @@ interface PageDef {
94
112
  template: string;
95
113
  loaders: Record<string, LoaderFn>;
96
114
  layoutChain?: LayoutDef[];
115
+ headMeta?: string;
97
116
  }
98
117
  declare function definePage(config: PageDef): PageDef;
99
118
  //#endregion
@@ -134,6 +153,9 @@ interface RouterOptions {
134
153
  interface Router<T extends DefinitionMap> {
135
154
  manifest(): ProcedureManifest;
136
155
  handle(procedureName: string, body: unknown): Promise<HandleResult>;
156
+ handleBatch(calls: BatchCall[]): Promise<{
157
+ results: BatchResultItem[];
158
+ }>;
137
159
  handleSubscription(name: string, input: unknown): AsyncIterable<unknown>;
138
160
  handlePage(path: string): Promise<HandlePageResult | null>;
139
161
  readonly hasPages: boolean;
@@ -174,9 +196,14 @@ interface HttpStreamResponse {
174
196
  }
175
197
  type HttpResponse = HttpBodyResponse | HttpStreamResponse;
176
198
  type HttpHandler = (req: HttpRequest) => Promise<HttpResponse>;
199
+ interface RpcHashMap {
200
+ procedures: Record<string, string>;
201
+ batch: string;
202
+ }
177
203
  interface HttpHandlerOptions {
178
204
  staticDir?: string;
179
205
  fallback?: HttpHandler;
206
+ rpcHashMap?: RpcHashMap;
180
207
  }
181
208
  /** Format a single SSE data event */
182
209
  declare function sseDataEvent(data: unknown): string;
@@ -192,7 +219,11 @@ declare function drainStream(stream: AsyncIterable<string>, write: (chunk: strin
192
219
  declare function toWebResponse(result: HttpResponse): Response;
193
220
  //#endregion
194
221
  //#region src/page/build-loader.d.ts
222
+ /** Load the RPC hash map from build output (returns undefined when obfuscation is off) */
223
+ declare function loadRpcHashMap(distDir: string): RpcHashMap | undefined;
195
224
  declare function loadBuildOutput(distDir: string): Record<string, PageDef>;
225
+ /** Load build output with lazy template getters — templates re-read from disk on each access */
226
+ declare function loadBuildOutputDev(distDir: string): Record<string, PageDef>;
196
227
  //#endregion
197
228
  //#region src/subscription.d.ts
198
229
  /**
@@ -227,5 +258,11 @@ declare function createDevProxy(opts: DevProxyOptions): HttpHandler;
227
258
  /** Serve static files from a directory, with index.html fallback for directories */
228
259
  declare function createStaticHandler(opts: StaticHandlerOptions): HttpHandler;
229
260
  //#endregion
230
- export { type CallbackSink, type DefinitionMap, type DevProxyOptions, type ErrorCode, type HandlePageResult, type HandleResult, type HttpBodyResponse, type HttpHandler, type HttpHandlerOptions, type HttpRequest, type HttpResponse, type HttpStreamResponse, type Infer, type LayoutDef, type LoaderFn, type OptionalSchemaNode, type PageDef, type PageTiming, type ProcedureDef, type ProcedureEntry, type ProcedureManifest, type ProcedureType, type Router, type RouterOptions, type SchemaNode, SeamError, type StaticHandlerOptions, type SubscriptionDef, createDevProxy, createHttpHandler, createRouter, createStaticHandler, definePage, drainStream, fromCallback, loadBuildOutput, serialize, sseCompleteEvent, sseDataEvent, sseErrorEvent, t, toWebResponse };
261
+ //#region src/dev/reload-watcher.d.ts
262
+ interface ReloadWatcher {
263
+ close(): void;
264
+ }
265
+ declare function watchReloadTrigger(distDir: string, onReload: () => void): ReloadWatcher;
266
+ //#endregion
267
+ export { type BatchCall, type BatchResultItem, type CallbackSink, type DefinitionMap, type DevProxyOptions, type ErrorCode, type HandlePageResult, type HandleResult, type HttpBodyResponse, type HttpHandler, type HttpHandlerOptions, type HttpRequest, type HttpResponse, type HttpStreamResponse, type Infer, type LayoutDef, type LoaderFn, type OptionalSchemaNode, type PageDef, type PageTiming, type ProcedureDef, type ProcedureEntry, type ProcedureManifest, type ProcedureType, type ReloadWatcher, type Router, type RouterOptions, type RpcHashMap, type SchemaNode, SeamError, type StaticHandlerOptions, type SubscriptionDef, createDevProxy, createHttpHandler, createRouter, createStaticHandler, definePage, drainStream, fromCallback, loadBuildOutput, loadBuildOutputDev, loadRpcHashMap, serialize, sseCompleteEvent, sseDataEvent, sseErrorEvent, t, toWebResponse, watchReloadTrigger };
231
268
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/procedure.ts","../src/page/index.ts","../src/page/handler.ts","../src/router/index.ts","../src/errors.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/proxy.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/procedure.ts","../src/router/handler.ts","../src/page/index.ts","../src/page/handler.ts","../src/router/index.ts","../src/errors.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { validate } from "jtd";
2
2
  import { escapeHtml, inject } from "@canmi/seam-injector";
3
3
  import { readFile } from "node:fs/promises";
4
4
  import { extname, join } from "node:path";
5
- import { readFileSync } from "node:fs";
5
+ import { readFileSync, watch } from "node:fs";
6
6
 
7
7
  //#region \0rolldown/runtime.js
8
8
  var __defProp = Object.defineProperty;
@@ -38,6 +38,7 @@ var primitives_exports = /* @__PURE__ */ __exportAll({
38
38
  boolean: () => boolean,
39
39
  float32: () => float32,
40
40
  float64: () => float64,
41
+ html: () => html,
41
42
  int16: () => int16,
42
43
  int32: () => int32,
43
44
  int8: () => int8,
@@ -80,6 +81,12 @@ function float64() {
80
81
  function timestamp() {
81
82
  return createSchemaNode({ type: "timestamp" });
82
83
  }
84
+ function html() {
85
+ return createSchemaNode({
86
+ type: "string",
87
+ metadata: { format: "html" }
88
+ });
89
+ }
83
90
 
84
91
  //#endregion
85
92
  //#region src/types/composites.ts
@@ -230,6 +237,19 @@ async function handleRequest(procedures, procedureName, rawBody, validateOutput)
230
237
  };
231
238
  }
232
239
  }
240
+ async function handleBatchRequest(procedures, calls, validateOutput) {
241
+ return { results: await Promise.all(calls.map(async (call) => {
242
+ const result = await handleRequest(procedures, call.procedure, call.input, validateOutput);
243
+ if (result.status === 200) return {
244
+ ok: true,
245
+ data: result.body
246
+ };
247
+ return {
248
+ ok: false,
249
+ error: result.body.error
250
+ };
251
+ })) };
252
+ }
233
253
  async function* handleSubscription(subscriptions, name, rawInput, validateOutput) {
234
254
  const sub = subscriptions.get(name);
235
255
  if (!sub) throw new SeamError("NOT_FOUND", `Subscription '${name}' not found`);
@@ -289,6 +309,14 @@ async function handlePageRequest(page, params, procedures) {
289
309
  layoutKeyed[layout.id] = data;
290
310
  innerContent = injectLayout(layout.template, flattenForSlots(data), innerContent);
291
311
  }
312
+ if (page.headMeta) {
313
+ const injectedMeta = inject(page.headMeta, flattenForSlots(pageKeyed), { skipDataScript: true });
314
+ const charsetIdx = innerContent.indexOf("<meta charset=\"utf-8\">");
315
+ if (charsetIdx !== -1) {
316
+ const insertAt = charsetIdx + 22;
317
+ innerContent = innerContent.slice(0, insertAt) + injectedMeta + innerContent.slice(insertAt);
318
+ }
319
+ }
292
320
  const seamData = { ...pageKeyed };
293
321
  if (Object.keys(layoutKeyed).length > 0) seamData._layouts = layoutKeyed;
294
322
  const script = `<script id="__SEAM_DATA__" type="application/json">${JSON.stringify(seamData)}<\/script>`;
@@ -387,6 +415,9 @@ function createRouter(procedures, opts) {
387
415
  handle(procedureName, body) {
388
416
  return handleRequest(procedureMap, procedureName, body, shouldValidateOutput);
389
417
  },
418
+ handleBatch(calls) {
419
+ return handleBatchRequest(procedureMap, calls, shouldValidateOutput);
420
+ },
390
421
  handleSubscription(name, input) {
391
422
  return handleSubscription(subscriptionMap, name, input, shouldValidateOutput);
392
423
  },
@@ -496,14 +527,39 @@ async function* sseStream(router, name, input) {
496
527
  else yield sseErrorEvent("INTERNAL_ERROR", error instanceof Error ? error.message : "Unknown error");
497
528
  }
498
529
  }
530
+ async function handleBatchHttp(req, router, hashToName) {
531
+ let body;
532
+ try {
533
+ body = await req.body();
534
+ } catch {
535
+ return errorResponse(400, "VALIDATION_ERROR", "Invalid JSON body");
536
+ }
537
+ if (!body || typeof body !== "object" || !Array.isArray(body.calls)) return errorResponse(400, "VALIDATION_ERROR", "Batch request must have a 'calls' array");
538
+ const calls = body.calls.map((c) => ({
539
+ procedure: typeof c.procedure === "string" ? hashToName?.get(c.procedure) ?? c.procedure : "",
540
+ input: c.input ?? {}
541
+ }));
542
+ return jsonResponse(200, await router.handleBatch(calls));
543
+ }
499
544
  function createHttpHandler(router, opts) {
545
+ const hashToName = opts?.rpcHashMap ? new Map(Object.entries(opts.rpcHashMap.procedures).map(([n, h]) => [h, n])) : null;
546
+ const batchHash = opts?.rpcHashMap?.batch ?? null;
500
547
  return async (req) => {
501
548
  const url = new URL(req.url, "http://localhost");
502
549
  const { pathname } = url;
503
- if (req.method === "GET" && pathname === MANIFEST_PATH) return jsonResponse(200, router.manifest());
550
+ if (req.method === "GET" && pathname === MANIFEST_PATH) {
551
+ if (opts?.rpcHashMap) return errorResponse(403, "FORBIDDEN", "Manifest disabled");
552
+ return jsonResponse(200, router.manifest());
553
+ }
504
554
  if (req.method === "POST" && pathname.startsWith(RPC_PREFIX)) {
505
- const name = pathname.slice(11);
555
+ let name = pathname.slice(11);
506
556
  if (!name) return errorResponse(404, "NOT_FOUND", "Empty procedure name");
557
+ if (name === "_batch" || batchHash && name === batchHash) return handleBatchHttp(req, router, hashToName);
558
+ if (hashToName) {
559
+ const resolved = hashToName.get(name);
560
+ if (!resolved) return errorResponse(404, "NOT_FOUND", "Not found");
561
+ name = resolved;
562
+ }
507
563
  let body;
508
564
  try {
509
565
  body = await req.body();
@@ -514,8 +570,13 @@ function createHttpHandler(router, opts) {
514
570
  return jsonResponse(result.status, result.body);
515
571
  }
516
572
  if (req.method === "GET" && pathname.startsWith(SUBSCRIBE_PREFIX)) {
517
- const name = pathname.slice(17);
573
+ let name = pathname.slice(17);
518
574
  if (!name) return errorResponse(404, "NOT_FOUND", "Empty subscription name");
575
+ if (hashToName) {
576
+ const resolved = hashToName.get(name);
577
+ if (!resolved) return errorResponse(404, "NOT_FOUND", "Not found");
578
+ name = resolved;
579
+ }
519
580
  const rawInput = url.searchParams.get("input");
520
581
  let input;
521
582
  try {
@@ -611,6 +672,38 @@ function resolveLayoutChain(layoutId, layoutEntries, templates) {
611
672
  chain.reverse();
612
673
  return chain;
613
674
  }
675
+ /** Resolve layout chain with lazy template getters (re-read from disk on each access) */
676
+ function resolveLayoutChainDev(layoutId, layoutEntries, distDir) {
677
+ const chain = [];
678
+ let currentId = layoutId;
679
+ while (currentId) {
680
+ const entry = layoutEntries[currentId];
681
+ if (!entry) break;
682
+ const layoutTemplatePath = join(distDir, entry.template);
683
+ const def = {
684
+ id: currentId,
685
+ template: "",
686
+ loaders: buildLoaderFns(entry.loaders ?? {})
687
+ };
688
+ Object.defineProperty(def, "template", {
689
+ get: () => readFileSync(layoutTemplatePath, "utf-8"),
690
+ enumerable: true
691
+ });
692
+ chain.push(def);
693
+ currentId = entry.parent;
694
+ }
695
+ chain.reverse();
696
+ return chain;
697
+ }
698
+ /** Load the RPC hash map from build output (returns undefined when obfuscation is off) */
699
+ function loadRpcHashMap(distDir) {
700
+ const hashMapPath = join(distDir, "rpc-hash-map.json");
701
+ try {
702
+ return JSON.parse(readFileSync(hashMapPath, "utf-8"));
703
+ } catch {
704
+ return;
705
+ }
706
+ }
614
707
  function loadBuildOutput(distDir) {
615
708
  const raw = readFileSync(join(distDir, "route-manifest.json"), "utf-8");
616
709
  const manifest = JSON.parse(raw);
@@ -621,10 +714,32 @@ function loadBuildOutput(distDir) {
621
714
  for (const [path, entry] of Object.entries(manifest.routes)) pages[path] = {
622
715
  template: readFileSync(join(distDir, entry.template), "utf-8"),
623
716
  loaders: buildLoaderFns(entry.loaders),
624
- layoutChain: entry.layout ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates) : []
717
+ layoutChain: entry.layout ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates) : [],
718
+ headMeta: entry.head_meta
625
719
  };
626
720
  return pages;
627
721
  }
722
+ /** Load build output with lazy template getters — templates re-read from disk on each access */
723
+ function loadBuildOutputDev(distDir) {
724
+ const raw = readFileSync(join(distDir, "route-manifest.json"), "utf-8");
725
+ const manifest = JSON.parse(raw);
726
+ const layoutEntries = manifest.layouts ?? {};
727
+ const pages = {};
728
+ for (const [path, entry] of Object.entries(manifest.routes)) {
729
+ const templatePath = join(distDir, entry.template);
730
+ const page = {
731
+ template: "",
732
+ loaders: buildLoaderFns(entry.loaders),
733
+ layoutChain: entry.layout ? resolveLayoutChainDev(entry.layout, layoutEntries, distDir) : []
734
+ };
735
+ Object.defineProperty(page, "template", {
736
+ get: () => readFileSync(templatePath, "utf-8"),
737
+ enumerable: true
738
+ });
739
+ pages[path] = page;
740
+ }
741
+ return pages;
742
+ }
628
743
 
629
744
  //#endregion
630
745
  //#region src/subscription.ts
@@ -748,5 +863,30 @@ function createStaticHandler(opts) {
748
863
  }
749
864
 
750
865
  //#endregion
751
- export { SeamError, createDevProxy, createHttpHandler, createRouter, createStaticHandler, definePage, drainStream, fromCallback, loadBuildOutput, serialize, sseCompleteEvent, sseDataEvent, sseErrorEvent, t, toWebResponse };
866
+ //#region src/dev/reload-watcher.ts
867
+ function watchReloadTrigger(distDir, onReload) {
868
+ const triggerPath = join(distDir, ".reload-trigger");
869
+ let watcher = null;
870
+ try {
871
+ watcher = watch(triggerPath, () => onReload());
872
+ } catch {
873
+ const dirWatcher = watch(distDir, (_event, filename) => {
874
+ if (filename === ".reload-trigger") {
875
+ dirWatcher.close();
876
+ watcher = watch(triggerPath, () => onReload());
877
+ onReload();
878
+ }
879
+ });
880
+ return { close() {
881
+ dirWatcher.close();
882
+ watcher?.close();
883
+ } };
884
+ }
885
+ return { close() {
886
+ watcher?.close();
887
+ } };
888
+ }
889
+
890
+ //#endregion
891
+ export { SeamError, createDevProxy, createHttpHandler, createRouter, createStaticHandler, definePage, drainStream, fromCallback, loadBuildOutput, loadBuildOutputDev, loadRpcHashMap, serialize, sseCompleteEvent, sseDataEvent, sseErrorEvent, t, toWebResponse, watchReloadTrigger };
752
892
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["primitives"],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/errors.ts","../src/validation/index.ts","../src/router/handler.ts","../src/page/handler.ts","../src/page/route-matcher.ts","../src/router/index.ts","../src/page/index.ts","../src/mime.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/proxy.ts"],"sourcesContent":["/* packages/server/core/typescript/src/types/schema.ts */\n\nimport type { Schema } from \"jtd\";\n\nexport type JTDSchema = Schema;\n\nexport interface SchemaNode<TOutput = unknown> {\n readonly _schema: JTDSchema;\n /** Phantom type marker — never exists at runtime */\n readonly _output: TOutput;\n}\n\nexport interface OptionalSchemaNode<TOutput = unknown> extends SchemaNode<TOutput> {\n readonly _optional: true;\n}\n\nexport type Infer<T extends SchemaNode> = T[\"_output\"];\n\nexport function createSchemaNode<T>(schema: JTDSchema): SchemaNode<T> {\n return { _schema: schema } as SchemaNode<T>;\n}\n\nexport function createOptionalSchemaNode<T>(schema: JTDSchema): OptionalSchemaNode<T> {\n return { _schema: schema, _optional: true } as OptionalSchemaNode<T>;\n}\n","/* packages/server/core/typescript/src/types/primitives.ts */\n\nimport type { SchemaNode } from \"./schema.js\";\nimport { createSchemaNode } from \"./schema.js\";\n\nexport function string(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\" });\n}\n\nexport function boolean(): SchemaNode<boolean> {\n return createSchemaNode<boolean>({ type: \"boolean\" });\n}\n\nexport function int8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int8\" });\n}\n\nexport function int16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int16\" });\n}\n\nexport function int32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int32\" });\n}\n\nexport function uint8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint8\" });\n}\n\nexport function uint16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint16\" });\n}\n\nexport function uint32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint32\" });\n}\n\nexport function float32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float32\" });\n}\n\nexport function float64(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float64\" });\n}\n\nexport function timestamp(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"timestamp\" });\n}\n","/* packages/server/core/typescript/src/types/composites.ts */\n\nimport type { SchemaNode, OptionalSchemaNode, Infer, JTDSchema } from \"./schema.js\";\nimport { createSchemaNode, createOptionalSchemaNode } from \"./schema.js\";\n\n// -- Type-level utilities --\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype RequiredKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? never : K;\n}[keyof T];\n\ntype OptionalKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? K : never;\n}[keyof T];\n\ntype InferObject<T extends Record<string, SchemaNode>> = Simplify<\n { [K in RequiredKeys<T>]: Infer<T[K]> } & { [K in OptionalKeys<T>]?: Infer<T[K]> }\n>;\n\n// -- Builders --\n\nexport function object<T extends Record<string, SchemaNode>>(\n fields: T,\n): SchemaNode<InferObject<T>> {\n const properties: Record<string, JTDSchema> = {};\n const optionalProperties: Record<string, JTDSchema> = {};\n\n for (const [key, node] of Object.entries(fields)) {\n if (\"_optional\" in node && node._optional === true) {\n optionalProperties[key] = node._schema;\n } else {\n properties[key] = node._schema;\n }\n }\n\n const schema: Record<string, unknown> = {};\n if (Object.keys(properties).length > 0 || Object.keys(optionalProperties).length === 0) {\n schema.properties = properties;\n }\n if (Object.keys(optionalProperties).length > 0) {\n schema.optionalProperties = optionalProperties;\n }\n\n return createSchemaNode<InferObject<T>>(schema as JTDSchema);\n}\n\nexport function optional<T>(node: SchemaNode<T>): OptionalSchemaNode<T> {\n return createOptionalSchemaNode<T>(node._schema);\n}\n\nexport function array<T>(node: SchemaNode<T>): SchemaNode<T[]> {\n return createSchemaNode<T[]>({ elements: node._schema });\n}\n\nexport function nullable<T>(node: SchemaNode<T>): SchemaNode<T | null> {\n return createSchemaNode<T | null>({ ...node._schema, nullable: true } as JTDSchema);\n}\n\nexport function enumType<const T extends readonly string[]>(values: T): SchemaNode<T[number]> {\n return createSchemaNode<T[number]>({ enum: [...values] } as JTDSchema);\n}\n\nexport function values<T>(node: SchemaNode<T>): SchemaNode<Record<string, T>> {\n return createSchemaNode<Record<string, T>>({ values: node._schema });\n}\n\ntype DiscriminatorUnion<TTag extends string, TMapping extends Record<string, SchemaNode>> = {\n [K in keyof TMapping & string]: Simplify<{ [P in TTag]: K } & Infer<TMapping[K]>>;\n}[keyof TMapping & string];\n\nexport function discriminator<\n TTag extends string,\n TMapping extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(tag: TTag, mapping: TMapping): SchemaNode<DiscriminatorUnion<TTag, TMapping>> {\n const jtdMapping: Record<string, JTDSchema> = {};\n for (const [key, node] of Object.entries(mapping)) {\n jtdMapping[key] = node._schema;\n }\n return createSchemaNode<DiscriminatorUnion<TTag, TMapping>>({\n discriminator: tag,\n mapping: jtdMapping,\n } as JTDSchema);\n}\n","/* packages/server/core/typescript/src/types/index.ts */\n\nimport * as primitives from \"./primitives.js\";\nimport {\n object,\n optional,\n array,\n nullable,\n enumType,\n values,\n discriminator,\n} from \"./composites.js\";\n\nexport const t = {\n ...primitives,\n object,\n optional,\n array,\n nullable,\n enum: enumType,\n values,\n discriminator,\n} as const;\n","/* packages/server/core/typescript/src/manifest/index.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode } from \"../types/schema.js\";\n\nexport type ProcedureType = \"query\" | \"subscription\";\n\nexport interface ProcedureEntry {\n type: ProcedureType;\n input: Schema;\n output: Schema;\n}\n\nexport interface ProcedureManifest {\n version: string;\n procedures: Record<string, ProcedureEntry>;\n}\n\nexport function buildManifest(\n definitions: Record<string, { input: SchemaNode; output: SchemaNode; type?: string }>,\n): ProcedureManifest {\n const mapped: ProcedureManifest[\"procedures\"] = {};\n\n for (const [name, def] of Object.entries(definitions)) {\n mapped[name] = {\n type: def.type === \"subscription\" ? \"subscription\" : \"query\",\n input: def.input._schema,\n output: def.output._schema,\n };\n }\n\n return { version: \"0.1.0\", procedures: mapped };\n}\n","/* packages/server/core/typescript/src/errors.ts */\n\nexport type ErrorCode =\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"RATE_LIMITED\"\n | \"INTERNAL_ERROR\"\n | (string & {});\n\nexport const DEFAULT_STATUS: Record<string, number> = {\n VALIDATION_ERROR: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n RATE_LIMITED: 429,\n INTERNAL_ERROR: 500,\n};\n\nexport class SeamError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status ?? DEFAULT_STATUS[code] ?? 500;\n this.name = \"SeamError\";\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n },\n };\n }\n}\n","/* packages/server/core/typescript/src/validation/index.ts */\n\nimport { validate } from \"jtd\";\nimport type { Schema, ValidationError as JTDValidationError } from \"jtd\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: JTDValidationError[];\n}\n\nexport function validateInput(schema: Schema, data: unknown): ValidationResult {\n const errors = validate(schema, data, { maxDepth: 32, maxErrors: 10 });\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function formatValidationErrors(errors: JTDValidationError[]): string {\n return errors\n .map((e) => {\n const path = e.instancePath.length > 0 ? e.instancePath.join(\"/\") : \"(root)\";\n const schema = e.schemaPath.join(\"/\");\n return `${path} (schema: ${schema})`;\n })\n .join(\"; \");\n}\n","/* packages/server/core/typescript/src/router/handler.ts */\n\nimport { SeamError } from \"../errors.js\";\nimport type { HandleResult, InternalProcedure, InternalSubscription } from \"../procedure.js\";\nimport { validateInput, formatValidationErrors } from \"../validation/index.js\";\n\nexport type { HandleResult, InternalProcedure } from \"../procedure.js\";\n\nexport async function handleRequest(\n procedures: Map<string, InternalProcedure>,\n procedureName: string,\n rawBody: unknown,\n validateOutput?: boolean,\n): Promise<HandleResult> {\n const procedure = procedures.get(procedureName);\n if (!procedure) {\n return {\n status: 404,\n body: new SeamError(\"NOT_FOUND\", `Procedure '${procedureName}' not found`).toJSON(),\n };\n }\n\n const validation = validateInput(procedure.inputSchema, rawBody);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n return {\n status: 400,\n body: new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`).toJSON(),\n };\n }\n\n try {\n const result = await procedure.handler({ input: rawBody });\n\n if (validateOutput) {\n const outValidation = validateInput(procedure.outputSchema, result);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`).toJSON(),\n };\n }\n }\n\n return { status: 200, body: result };\n } catch (error) {\n if (error instanceof SeamError) {\n return { status: error.status, body: error.toJSON() };\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", message).toJSON(),\n };\n }\n}\n\nexport async function* handleSubscription(\n subscriptions: Map<string, InternalSubscription>,\n name: string,\n rawInput: unknown,\n validateOutput?: boolean,\n): AsyncIterable<unknown> {\n const sub = subscriptions.get(name);\n if (!sub) {\n throw new SeamError(\"NOT_FOUND\", `Subscription '${name}' not found`);\n }\n\n const validation = validateInput(sub.inputSchema, rawInput);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n throw new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`);\n }\n\n for await (const value of sub.handler({ input: rawInput })) {\n if (validateOutput) {\n const outValidation = validateInput(sub.outputSchema, value);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n throw new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`);\n }\n }\n yield value;\n }\n}\n","/* packages/server/core/typescript/src/page/handler.ts */\n\nimport { inject, escapeHtml } from \"@canmi/seam-injector\";\nimport { SeamError } from \"../errors.js\";\nimport type { InternalProcedure } from \"../procedure.js\";\nimport type { PageDef, LoaderFn } from \"./index.js\";\n\nexport interface PageTiming {\n /** Procedure execution time in milliseconds */\n dataFetch: number;\n /** Template injection time in milliseconds */\n inject: number;\n}\n\nexport interface HandlePageResult {\n status: number;\n html: string;\n timing?: PageTiming;\n}\n\n/** Flatten keyed loader results: spread object values into a flat map for slot resolution */\nfunction flattenForSlots(keyed: Record<string, unknown>): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...keyed };\n for (const value of Object.values(keyed)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(merged, value as Record<string, unknown>);\n }\n }\n return merged;\n}\n\n/** Execute loaders, returning keyed results */\nasync function executeLoaders(\n loaders: Record<string, LoaderFn>,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<Record<string, unknown>> {\n const entries = Object.entries(loaders);\n const results = await Promise.all(\n entries.map(async ([key, loader]) => {\n const { procedure, input } = loader(params);\n const proc = procedures.get(procedure);\n if (!proc) throw new SeamError(\"INTERNAL_ERROR\", `Procedure '${procedure}' not found`);\n // Skip JTD validation -- loader input is trusted server-side code\n const result = await proc.handler({ input });\n return [key, result] as const;\n }),\n );\n return Object.fromEntries(results);\n}\n\n/** Split-inject a layout template around its outlet marker */\nfunction injectLayout(template: string, data: Record<string, unknown>, inner: string): string {\n const outletMarker = \"<!--seam:outlet-->\";\n const outletIdx = template.indexOf(outletMarker);\n if (outletIdx === -1) {\n return inject(template, data, { skipDataScript: true });\n }\n const before = template.slice(0, outletIdx);\n const after = template.slice(outletIdx + outletMarker.length);\n const injectedBefore = inject(before, data, { skipDataScript: true });\n const injectedAfter = inject(after, data, { skipDataScript: true });\n return injectedBefore + inner + injectedAfter;\n}\n\nexport async function handlePageRequest(\n page: PageDef,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<HandlePageResult> {\n try {\n const t0 = performance.now();\n const layoutChain = page.layoutChain ?? [];\n\n // Execute all loaders (layout chain + page) in parallel\n const loaderResults = await Promise.all([\n ...layoutChain.map((layout) => executeLoaders(layout.loaders, params, procedures)),\n executeLoaders(page.loaders, params, procedures),\n ]);\n\n const t1 = performance.now();\n\n // Partition: first N results are layout, last is page\n const layoutResults = loaderResults.slice(0, layoutChain.length);\n const pageKeyed = loaderResults[loaderResults.length - 1];\n\n // Inject page template\n let innerContent = inject(page.template, flattenForSlots(pageKeyed), { skipDataScript: true });\n\n // Compose layouts from innermost to outermost\n const layoutKeyed: Record<string, Record<string, unknown>> = {};\n for (let i = layoutChain.length - 1; i >= 0; i--) {\n const layout = layoutChain[i];\n const data = layoutResults[i];\n layoutKeyed[layout.id] = data;\n innerContent = injectLayout(layout.template, flattenForSlots(data), innerContent);\n }\n\n // Build __SEAM_DATA__: page data at top level, layout data under _layouts\n const seamData: Record<string, unknown> = { ...pageKeyed };\n if (Object.keys(layoutKeyed).length > 0) {\n seamData._layouts = layoutKeyed;\n }\n\n const script = `<script id=\"__SEAM_DATA__\" type=\"application/json\">${JSON.stringify(seamData)}</script>`;\n const bodyClose = innerContent.lastIndexOf(\"</body>\");\n let html: string;\n if (bodyClose !== -1) {\n html = innerContent.slice(0, bodyClose) + script + innerContent.slice(bodyClose);\n } else {\n html = innerContent + script;\n }\n\n const t2 = performance.now();\n\n return {\n status: 200,\n html,\n timing: { dataFetch: t1 - t0, inject: t2 - t1 },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n html: `<!DOCTYPE html><html><body><h1>500 Internal Server Error</h1><p>${escapeHtml(message)}</p></body></html>`,\n };\n }\n}\n","/* packages/server/core/typescript/src/page/route-matcher.ts */\n\ninterface CompiledRoute {\n segments: RouteSegment[];\n}\n\ntype RouteSegment = { kind: \"static\"; value: string } | { kind: \"param\"; name: string };\n\nfunction compileRoute(pattern: string): CompiledRoute {\n const segments: RouteSegment[] = pattern\n .split(\"/\")\n .filter(Boolean)\n .map((seg) =>\n seg.startsWith(\":\") ? { kind: \"param\", name: seg.slice(1) } : { kind: \"static\", value: seg },\n );\n return { segments };\n}\n\nfunction matchRoute(segments: RouteSegment[], pathParts: string[]): Record<string, string> | null {\n if (segments.length !== pathParts.length) return null;\n const params: Record<string, string> = {};\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (seg.kind === \"static\") {\n if (seg.value !== pathParts[i]) return null;\n } else {\n params[seg.name] = pathParts[i];\n }\n }\n return params;\n}\n\nexport class RouteMatcher<T> {\n private routes: { compiled: CompiledRoute; value: T }[] = [];\n\n add(pattern: string, value: T): void {\n this.routes.push({ compiled: compileRoute(pattern), value });\n }\n\n match(path: string): { value: T; params: Record<string, string> } | null {\n const parts = path.split(\"/\").filter(Boolean);\n for (const route of this.routes) {\n const params = matchRoute(route.compiled.segments, parts);\n if (params) return { value: route.value, params };\n }\n return null;\n }\n}\n","/* packages/server/core/typescript/src/router/index.ts */\n\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ProcedureManifest } from \"../manifest/index.js\";\nimport type { HandleResult, InternalProcedure } from \"./handler.js\";\nimport type { InternalSubscription } from \"../procedure.js\";\nimport type { HandlePageResult } from \"../page/handler.js\";\nimport type { PageDef } from \"../page/index.js\";\nimport { buildManifest } from \"../manifest/index.js\";\nimport { handleRequest, handleSubscription } from \"./handler.js\";\nimport { handlePageRequest } from \"../page/handler.js\";\nimport { RouteMatcher } from \"../page/route-matcher.js\";\n\nexport interface ProcedureDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface SubscriptionDef<TIn = unknown, TOut = unknown> {\n type: \"subscription\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n handler: (params: { input: TIn }) => AsyncIterable<TOut>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type DefinitionMap = Record<string, ProcedureDef<any, any> | SubscriptionDef<any, any>>;\n\nfunction isSubscriptionDef(def: ProcedureDef | SubscriptionDef): def is SubscriptionDef {\n return \"type\" in def && def.type === \"subscription\";\n}\n\nexport interface RouterOptions {\n pages?: Record<string, PageDef>;\n validateOutput?: boolean;\n}\n\nexport interface Router<T extends DefinitionMap> {\n manifest(): ProcedureManifest;\n handle(procedureName: string, body: unknown): Promise<HandleResult>;\n handleSubscription(name: string, input: unknown): AsyncIterable<unknown>;\n handlePage(path: string): Promise<HandlePageResult | null>;\n readonly hasPages: boolean;\n /** Exposed for adapter access to the definitions */\n readonly procedures: T;\n}\n\nexport function createRouter<T extends DefinitionMap>(\n procedures: T,\n opts?: RouterOptions,\n): Router<T> {\n const procedureMap = new Map<string, InternalProcedure>();\n const subscriptionMap = new Map<string, InternalSubscription>();\n\n for (const [name, def] of Object.entries(procedures)) {\n if (isSubscriptionDef(def)) {\n subscriptionMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalSubscription[\"handler\"],\n });\n } else {\n procedureMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalProcedure[\"handler\"],\n });\n }\n }\n\n const shouldValidateOutput =\n opts?.validateOutput ??\n (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\");\n\n const pageMatcher = new RouteMatcher<PageDef>();\n const pages = opts?.pages;\n if (pages) {\n for (const [pattern, page] of Object.entries(pages)) {\n pageMatcher.add(pattern, page);\n }\n }\n\n return {\n procedures,\n hasPages: !!pages && Object.keys(pages).length > 0,\n manifest() {\n return buildManifest(procedures);\n },\n handle(procedureName, body) {\n return handleRequest(procedureMap, procedureName, body, shouldValidateOutput);\n },\n handleSubscription(name, input) {\n return handleSubscription(subscriptionMap, name, input, shouldValidateOutput);\n },\n async handlePage(path) {\n const match = pageMatcher.match(path);\n if (!match) return null;\n return handlePageRequest(match.value, match.params, procedureMap);\n },\n };\n}\n","/* packages/server/core/typescript/src/page/index.ts */\n\nexport interface LoaderResult {\n procedure: string;\n input: unknown;\n}\n\nexport type LoaderFn = (params: Record<string, string>) => LoaderResult;\n\nexport interface LayoutDef {\n id: string;\n template: string;\n loaders: Record<string, LoaderFn>;\n}\n\nexport interface PageDef {\n template: string;\n loaders: Record<string, LoaderFn>;\n layoutChain?: LayoutDef[];\n}\n\nexport function definePage(config: PageDef): PageDef {\n return { ...config, layoutChain: config.layoutChain ?? [] };\n}\n","/* packages/server/core/typescript/src/mime.ts */\n\nexport const MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".ico\": \"image/x-icon\",\n \".map\": \"application/json\",\n \".ts\": \"application/javascript\",\n \".tsx\": \"application/javascript\",\n};\n","/* packages/server/core/typescript/src/http.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface HttpRequest {\n method: string;\n url: string;\n body: () => Promise<unknown>;\n}\n\nexport interface HttpBodyResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\nexport interface HttpStreamResponse {\n status: number;\n headers: Record<string, string>;\n stream: AsyncIterable<string>;\n}\n\nexport type HttpResponse = HttpBodyResponse | HttpStreamResponse;\n\nexport type HttpHandler = (req: HttpRequest) => Promise<HttpResponse>;\n\nexport interface HttpHandlerOptions {\n staticDir?: string;\n fallback?: HttpHandler;\n}\n\nconst RPC_PREFIX = \"/_seam/rpc/\";\nconst PAGE_PREFIX = \"/_seam/page/\";\nconst STATIC_PREFIX = \"/_seam/static/\";\nconst SUBSCRIBE_PREFIX = \"/_seam/subscribe/\";\nconst MANIFEST_PATH = \"/_seam/manifest.json\";\n\nconst JSON_HEADER = { \"Content-Type\": \"application/json\" };\nconst HTML_HEADER = { \"Content-Type\": \"text/html; charset=utf-8\" };\nconst SSE_HEADER = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n};\nconst IMMUTABLE_CACHE = \"public, max-age=31536000, immutable\";\n\nfunction jsonResponse(status: number, body: unknown): HttpBodyResponse {\n return { status, headers: JSON_HEADER, body };\n}\n\nfunction errorResponse(status: number, code: string, message: string): HttpBodyResponse {\n return jsonResponse(status, new SeamError(code, message).toJSON());\n}\n\nasync function handleStaticAsset(assetPath: string, staticDir: string): Promise<HttpBodyResponse> {\n if (assetPath.includes(\"..\")) {\n return errorResponse(403, \"VALIDATION_ERROR\", \"Forbidden\");\n }\n\n const filePath = join(staticDir, assetPath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const ext = extname(filePath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": IMMUTABLE_CACHE,\n },\n body: content,\n };\n } catch {\n return errorResponse(404, \"NOT_FOUND\", \"Asset not found\");\n }\n}\n\n/** Format a single SSE data event */\nexport function sseDataEvent(data: unknown): string {\n return `event: data\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\n/** Format an SSE error event */\nexport function sseErrorEvent(code: string, message: string): string {\n return `event: error\\ndata: ${JSON.stringify({ code, message })}\\n\\n`;\n}\n\n/** Format an SSE complete event */\nexport function sseCompleteEvent(): string {\n return \"event: complete\\ndata: {}\\n\\n\";\n}\n\nasync function* sseStream<T extends DefinitionMap>(\n router: Router<T>,\n name: string,\n input: unknown,\n): AsyncIterable<string> {\n try {\n for await (const value of router.handleSubscription(name, input)) {\n yield sseDataEvent(value);\n }\n yield sseCompleteEvent();\n } catch (error) {\n if (error instanceof SeamError) {\n yield sseErrorEvent(error.code, error.message);\n } else {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n yield sseErrorEvent(\"INTERNAL_ERROR\", message);\n }\n }\n}\n\nexport function createHttpHandler<T extends DefinitionMap>(\n router: Router<T>,\n opts?: HttpHandlerOptions,\n): HttpHandler {\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const { pathname } = url;\n\n if (req.method === \"GET\" && pathname === MANIFEST_PATH) {\n return jsonResponse(200, router.manifest());\n }\n\n if (req.method === \"POST\" && pathname.startsWith(RPC_PREFIX)) {\n const name = pathname.slice(RPC_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty procedure name\");\n }\n\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n\n const result = await router.handle(name, body);\n return jsonResponse(result.status, result.body);\n }\n\n if (req.method === \"GET\" && pathname.startsWith(SUBSCRIBE_PREFIX)) {\n const name = pathname.slice(SUBSCRIBE_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty subscription name\");\n }\n\n const rawInput = url.searchParams.get(\"input\");\n let input: unknown;\n try {\n input = rawInput ? JSON.parse(rawInput) : {};\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid input query parameter\");\n }\n\n return { status: 200, headers: SSE_HEADER, stream: sseStream(router, name, input) };\n }\n\n if (req.method === \"GET\" && pathname.startsWith(PAGE_PREFIX) && router.hasPages) {\n const pagePath = \"/\" + pathname.slice(PAGE_PREFIX.length);\n const result = await router.handlePage(pagePath);\n if (result) {\n return { status: result.status, headers: HTML_HEADER, body: result.html };\n }\n }\n\n if (req.method === \"GET\" && pathname.startsWith(STATIC_PREFIX) && opts?.staticDir) {\n const assetPath = pathname.slice(STATIC_PREFIX.length);\n return handleStaticAsset(assetPath, opts.staticDir);\n }\n\n if (opts?.fallback) return opts.fallback(req);\n return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n };\n}\n\nexport function serialize(body: unknown): string {\n return typeof body === \"string\" ? body : JSON.stringify(body);\n}\n\n/** Consume an async stream chunk-by-chunk; return false from write to stop early. */\nexport async function drainStream(\n stream: AsyncIterable<string>,\n write: (chunk: string) => boolean | void,\n): Promise<void> {\n try {\n for await (const chunk of stream) {\n if (write(chunk) === false) break;\n }\n } catch {\n // Client disconnected\n }\n}\n\n/** Convert an HttpResponse to a Web API Response (for adapters using fetch-compatible runtimes) */\nexport function toWebResponse(result: HttpResponse): Response {\n if (\"stream\" in result) {\n const stream = result.stream;\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n await drainStream(stream, (chunk) => {\n controller.enqueue(encoder.encode(chunk));\n });\n controller.close();\n },\n });\n return new Response(readable, { status: result.status, headers: result.headers });\n }\n return new Response(serialize(result.body), { status: result.status, headers: result.headers });\n}\n","/* packages/server/core/typescript/src/page/build-loader.ts */\n\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PageDef, LayoutDef, LoaderFn, LoaderResult } from \"./index.js\";\n\ninterface RouteManifest {\n layouts?: Record<string, LayoutManifestEntry>;\n routes: Record<string, RouteManifestEntry>;\n}\n\ninterface LayoutManifestEntry {\n template: string;\n loaders?: Record<string, LoaderConfig>;\n parent?: string;\n}\n\ninterface RouteManifestEntry {\n template: string;\n layout?: string;\n loaders: Record<string, LoaderConfig>;\n}\n\ninterface LoaderConfig {\n procedure: string;\n params?: Record<string, ParamConfig>;\n}\n\ninterface ParamConfig {\n from: \"route\";\n type?: \"string\" | \"int\";\n}\n\nfunction buildLoaderFn(config: LoaderConfig): LoaderFn {\n return (params: Record<string, string>): LoaderResult => {\n const input: Record<string, unknown> = {};\n if (config.params) {\n for (const [key, mapping] of Object.entries(config.params)) {\n const raw = params[key];\n input[key] = mapping.type === \"int\" ? Number(raw) : raw;\n }\n }\n return { procedure: config.procedure, input };\n };\n}\n\nfunction buildLoaderFns(configs: Record<string, LoaderConfig>): Record<string, LoaderFn> {\n const fns: Record<string, LoaderFn> = {};\n for (const [key, config] of Object.entries(configs)) {\n fns[key] = buildLoaderFn(config);\n }\n return fns;\n}\n\n/** Resolve parent chain for a layout, returning outer-to-inner order */\nfunction resolveLayoutChain(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n templates: Record<string, string>,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n chain.push({\n id: currentId,\n template: templates[currentId],\n loaders: buildLoaderFns(entry.loaders ?? {}),\n });\n currentId = entry.parent;\n }\n\n // Reverse: we walked inner→outer, but want outer→inner\n chain.reverse();\n return chain;\n}\n\nexport function loadBuildOutput(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n\n // Load layout templates\n const layoutTemplates: Record<string, string> = {};\n const layoutEntries = manifest.layouts ?? {};\n for (const [id, entry] of Object.entries(layoutEntries)) {\n layoutTemplates[id] = readFileSync(join(distDir, entry.template), \"utf-8\");\n }\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, entry.template);\n const template = readFileSync(templatePath, \"utf-8\");\n\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates)\n : [];\n\n pages[path] = { template, loaders, layoutChain };\n }\n return pages;\n}\n","/* packages/server/core/typescript/src/subscription.ts */\n\n/**\n * Bridge callback-style event sources to an AsyncGenerator.\n *\n * Usage:\n * const stream = fromCallback<string>(({ emit, end, error }) => {\n * emitter.on(\"data\", emit);\n * emitter.on(\"end\", end);\n * emitter.on(\"error\", error);\n * return () => emitter.removeAllListeners();\n * });\n */\nexport interface CallbackSink<T> {\n emit: (value: T) => void;\n end: () => void;\n error: (err: Error) => void;\n}\n\ntype QueueItem<T> = { type: \"value\"; value: T } | { type: \"end\" } | { type: \"error\"; error: Error };\n\nexport function fromCallback<T>(\n setup: (sink: CallbackSink<T>) => (() => void) | void,\n): AsyncGenerator<T, void, undefined> {\n const queue: QueueItem<T>[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n function notify() {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n }\n\n const sink: CallbackSink<T> = {\n emit(value) {\n if (done) return;\n queue.push({ type: \"value\", value });\n notify();\n },\n end() {\n if (done) return;\n done = true;\n queue.push({ type: \"end\" });\n notify();\n },\n error(err) {\n if (done) return;\n done = true;\n queue.push({ type: \"error\", error: err });\n notify();\n },\n };\n\n const cleanup = setup(sink);\n\n async function* generate(): AsyncGenerator<T, void, undefined> {\n try {\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n }\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.type === \"value\") {\n yield item.value;\n } else if (item.type === \"error\") {\n throw item.error;\n } else {\n return;\n }\n }\n }\n } finally {\n done = true;\n if (cleanup) cleanup();\n }\n }\n\n return generate();\n}\n","/* packages/server/core/typescript/src/proxy.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { HttpHandler, HttpBodyResponse } from \"./http.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface DevProxyOptions {\n /** Target URL to forward requests to (e.g. \"http://localhost:5173\") */\n target: string;\n}\n\nexport interface StaticHandlerOptions {\n /** Directory to serve static files from */\n dir: string;\n}\n\n/** Forward non-seam requests to a dev server (e.g. Vite) */\nexport function createDevProxy(opts: DevProxyOptions): HttpHandler {\n const target = opts.target.replace(/\\/$/, \"\");\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const proxyUrl = `${target}${url.pathname}${url.search}`;\n\n try {\n const resp = await fetch(proxyUrl, {\n method: req.method,\n headers: { Accept: \"*/*\" },\n });\n\n const body = await resp.text();\n const headers: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return { status: resp.status, headers, body };\n } catch {\n return {\n status: 502,\n headers: { \"Content-Type\": \"text/plain\" },\n body: `Bad Gateway: failed to connect to ${target}`,\n };\n }\n };\n}\n\n/** Serve static files from a directory, with index.html fallback for directories */\nexport function createStaticHandler(opts: StaticHandlerOptions): HttpHandler {\n const dir = opts.dir;\n\n return async (req): Promise<HttpBodyResponse> => {\n const url = new URL(req.url, \"http://localhost\");\n let filePath = url.pathname;\n\n if (filePath.includes(\"..\")) {\n return {\n status: 403,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Forbidden\",\n };\n }\n\n // Serve index.html for directory paths\n if (filePath.endsWith(\"/\")) {\n filePath += \"index.html\";\n }\n\n const fullPath = join(dir, filePath);\n try {\n const content = await readFile(fullPath);\n const ext = extname(fullPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: { \"Content-Type\": contentType },\n body: content.toString(),\n };\n } catch {\n return {\n status: 404,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Not found\",\n };\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["primitives"],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/errors.ts","../src/validation/index.ts","../src/router/handler.ts","../src/page/handler.ts","../src/page/route-matcher.ts","../src/router/index.ts","../src/page/index.ts","../src/mime.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"sourcesContent":["/* packages/server/core/typescript/src/types/schema.ts */\n\nimport type { Schema } from \"jtd\";\n\nexport type JTDSchema = Schema;\n\nexport interface SchemaNode<TOutput = unknown> {\n readonly _schema: JTDSchema;\n /** Phantom type marker — never exists at runtime */\n readonly _output: TOutput;\n}\n\nexport interface OptionalSchemaNode<TOutput = unknown> extends SchemaNode<TOutput> {\n readonly _optional: true;\n}\n\nexport type Infer<T extends SchemaNode> = T[\"_output\"];\n\nexport function createSchemaNode<T>(schema: JTDSchema): SchemaNode<T> {\n return { _schema: schema } as SchemaNode<T>;\n}\n\nexport function createOptionalSchemaNode<T>(schema: JTDSchema): OptionalSchemaNode<T> {\n return { _schema: schema, _optional: true } as OptionalSchemaNode<T>;\n}\n","/* packages/server/core/typescript/src/types/primitives.ts */\n\nimport type { SchemaNode } from \"./schema.js\";\nimport { createSchemaNode } from \"./schema.js\";\n\nexport function string(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\" });\n}\n\nexport function boolean(): SchemaNode<boolean> {\n return createSchemaNode<boolean>({ type: \"boolean\" });\n}\n\nexport function int8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int8\" });\n}\n\nexport function int16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int16\" });\n}\n\nexport function int32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int32\" });\n}\n\nexport function uint8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint8\" });\n}\n\nexport function uint16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint16\" });\n}\n\nexport function uint32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint32\" });\n}\n\nexport function float32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float32\" });\n}\n\nexport function float64(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float64\" });\n}\n\nexport function timestamp(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"timestamp\" });\n}\n\nexport function html(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\", metadata: { format: \"html\" } });\n}\n","/* packages/server/core/typescript/src/types/composites.ts */\n\nimport type { SchemaNode, OptionalSchemaNode, Infer, JTDSchema } from \"./schema.js\";\nimport { createSchemaNode, createOptionalSchemaNode } from \"./schema.js\";\n\n// -- Type-level utilities --\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype RequiredKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? never : K;\n}[keyof T];\n\ntype OptionalKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? K : never;\n}[keyof T];\n\ntype InferObject<T extends Record<string, SchemaNode>> = Simplify<\n { [K in RequiredKeys<T>]: Infer<T[K]> } & { [K in OptionalKeys<T>]?: Infer<T[K]> }\n>;\n\n// -- Builders --\n\nexport function object<T extends Record<string, SchemaNode>>(\n fields: T,\n): SchemaNode<InferObject<T>> {\n const properties: Record<string, JTDSchema> = {};\n const optionalProperties: Record<string, JTDSchema> = {};\n\n for (const [key, node] of Object.entries(fields)) {\n if (\"_optional\" in node && node._optional === true) {\n optionalProperties[key] = node._schema;\n } else {\n properties[key] = node._schema;\n }\n }\n\n const schema: Record<string, unknown> = {};\n if (Object.keys(properties).length > 0 || Object.keys(optionalProperties).length === 0) {\n schema.properties = properties;\n }\n if (Object.keys(optionalProperties).length > 0) {\n schema.optionalProperties = optionalProperties;\n }\n\n return createSchemaNode<InferObject<T>>(schema as JTDSchema);\n}\n\nexport function optional<T>(node: SchemaNode<T>): OptionalSchemaNode<T> {\n return createOptionalSchemaNode<T>(node._schema);\n}\n\nexport function array<T>(node: SchemaNode<T>): SchemaNode<T[]> {\n return createSchemaNode<T[]>({ elements: node._schema });\n}\n\nexport function nullable<T>(node: SchemaNode<T>): SchemaNode<T | null> {\n return createSchemaNode<T | null>({ ...node._schema, nullable: true } as JTDSchema);\n}\n\nexport function enumType<const T extends readonly string[]>(values: T): SchemaNode<T[number]> {\n return createSchemaNode<T[number]>({ enum: [...values] } as JTDSchema);\n}\n\nexport function values<T>(node: SchemaNode<T>): SchemaNode<Record<string, T>> {\n return createSchemaNode<Record<string, T>>({ values: node._schema });\n}\n\ntype DiscriminatorUnion<TTag extends string, TMapping extends Record<string, SchemaNode>> = {\n [K in keyof TMapping & string]: Simplify<{ [P in TTag]: K } & Infer<TMapping[K]>>;\n}[keyof TMapping & string];\n\nexport function discriminator<\n TTag extends string,\n TMapping extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(tag: TTag, mapping: TMapping): SchemaNode<DiscriminatorUnion<TTag, TMapping>> {\n const jtdMapping: Record<string, JTDSchema> = {};\n for (const [key, node] of Object.entries(mapping)) {\n jtdMapping[key] = node._schema;\n }\n return createSchemaNode<DiscriminatorUnion<TTag, TMapping>>({\n discriminator: tag,\n mapping: jtdMapping,\n } as JTDSchema);\n}\n","/* packages/server/core/typescript/src/types/index.ts */\n\nimport * as primitives from \"./primitives.js\";\nimport {\n object,\n optional,\n array,\n nullable,\n enumType,\n values,\n discriminator,\n} from \"./composites.js\";\n\nexport const t = {\n ...primitives,\n object,\n optional,\n array,\n nullable,\n enum: enumType,\n values,\n discriminator,\n} as const;\n","/* packages/server/core/typescript/src/manifest/index.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode } from \"../types/schema.js\";\n\nexport type ProcedureType = \"query\" | \"subscription\";\n\nexport interface ProcedureEntry {\n type: ProcedureType;\n input: Schema;\n output: Schema;\n}\n\nexport interface ProcedureManifest {\n version: string;\n procedures: Record<string, ProcedureEntry>;\n}\n\nexport function buildManifest(\n definitions: Record<string, { input: SchemaNode; output: SchemaNode; type?: string }>,\n): ProcedureManifest {\n const mapped: ProcedureManifest[\"procedures\"] = {};\n\n for (const [name, def] of Object.entries(definitions)) {\n mapped[name] = {\n type: def.type === \"subscription\" ? \"subscription\" : \"query\",\n input: def.input._schema,\n output: def.output._schema,\n };\n }\n\n return { version: \"0.1.0\", procedures: mapped };\n}\n","/* packages/server/core/typescript/src/errors.ts */\n\nexport type ErrorCode =\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"RATE_LIMITED\"\n | \"INTERNAL_ERROR\"\n | (string & {});\n\nexport const DEFAULT_STATUS: Record<string, number> = {\n VALIDATION_ERROR: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n RATE_LIMITED: 429,\n INTERNAL_ERROR: 500,\n};\n\nexport class SeamError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status ?? DEFAULT_STATUS[code] ?? 500;\n this.name = \"SeamError\";\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n },\n };\n }\n}\n","/* packages/server/core/typescript/src/validation/index.ts */\n\nimport { validate } from \"jtd\";\nimport type { Schema, ValidationError as JTDValidationError } from \"jtd\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: JTDValidationError[];\n}\n\nexport function validateInput(schema: Schema, data: unknown): ValidationResult {\n const errors = validate(schema, data, { maxDepth: 32, maxErrors: 10 });\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function formatValidationErrors(errors: JTDValidationError[]): string {\n return errors\n .map((e) => {\n const path = e.instancePath.length > 0 ? e.instancePath.join(\"/\") : \"(root)\";\n const schema = e.schemaPath.join(\"/\");\n return `${path} (schema: ${schema})`;\n })\n .join(\"; \");\n}\n","/* packages/server/core/typescript/src/router/handler.ts */\n\nimport { SeamError } from \"../errors.js\";\nimport type { HandleResult, InternalProcedure, InternalSubscription } from \"../procedure.js\";\nimport { validateInput, formatValidationErrors } from \"../validation/index.js\";\n\nexport type { HandleResult, InternalProcedure } from \"../procedure.js\";\n\nexport async function handleRequest(\n procedures: Map<string, InternalProcedure>,\n procedureName: string,\n rawBody: unknown,\n validateOutput?: boolean,\n): Promise<HandleResult> {\n const procedure = procedures.get(procedureName);\n if (!procedure) {\n return {\n status: 404,\n body: new SeamError(\"NOT_FOUND\", `Procedure '${procedureName}' not found`).toJSON(),\n };\n }\n\n const validation = validateInput(procedure.inputSchema, rawBody);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n return {\n status: 400,\n body: new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`).toJSON(),\n };\n }\n\n try {\n const result = await procedure.handler({ input: rawBody });\n\n if (validateOutput) {\n const outValidation = validateInput(procedure.outputSchema, result);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`).toJSON(),\n };\n }\n }\n\n return { status: 200, body: result };\n } catch (error) {\n if (error instanceof SeamError) {\n return { status: error.status, body: error.toJSON() };\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", message).toJSON(),\n };\n }\n}\n\nexport interface BatchCall {\n procedure: string;\n input: unknown;\n}\n\nexport type BatchResultItem =\n | { ok: true; data: unknown }\n | { ok: false; error: { code: string; message: string } };\n\nexport async function handleBatchRequest(\n procedures: Map<string, InternalProcedure>,\n calls: BatchCall[],\n validateOutput?: boolean,\n): Promise<{ results: BatchResultItem[] }> {\n const results = await Promise.all(\n calls.map(async (call) => {\n const result = await handleRequest(procedures, call.procedure, call.input, validateOutput);\n if (result.status === 200) {\n return { ok: true as const, data: result.body };\n }\n const envelope = result.body as { error: { code: string; message: string } };\n return { ok: false as const, error: envelope.error };\n }),\n );\n return { results };\n}\n\nexport async function* handleSubscription(\n subscriptions: Map<string, InternalSubscription>,\n name: string,\n rawInput: unknown,\n validateOutput?: boolean,\n): AsyncIterable<unknown> {\n const sub = subscriptions.get(name);\n if (!sub) {\n throw new SeamError(\"NOT_FOUND\", `Subscription '${name}' not found`);\n }\n\n const validation = validateInput(sub.inputSchema, rawInput);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n throw new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`);\n }\n\n for await (const value of sub.handler({ input: rawInput })) {\n if (validateOutput) {\n const outValidation = validateInput(sub.outputSchema, value);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n throw new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`);\n }\n }\n yield value;\n }\n}\n","/* packages/server/core/typescript/src/page/handler.ts */\n\nimport { inject, escapeHtml } from \"@canmi/seam-injector\";\nimport { SeamError } from \"../errors.js\";\nimport type { InternalProcedure } from \"../procedure.js\";\nimport type { PageDef, LoaderFn } from \"./index.js\";\n\nexport interface PageTiming {\n /** Procedure execution time in milliseconds */\n dataFetch: number;\n /** Template injection time in milliseconds */\n inject: number;\n}\n\nexport interface HandlePageResult {\n status: number;\n html: string;\n timing?: PageTiming;\n}\n\n/** Flatten keyed loader results: spread object values into a flat map for slot resolution */\nfunction flattenForSlots(keyed: Record<string, unknown>): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...keyed };\n for (const value of Object.values(keyed)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(merged, value as Record<string, unknown>);\n }\n }\n return merged;\n}\n\n/** Execute loaders, returning keyed results */\nasync function executeLoaders(\n loaders: Record<string, LoaderFn>,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<Record<string, unknown>> {\n const entries = Object.entries(loaders);\n const results = await Promise.all(\n entries.map(async ([key, loader]) => {\n const { procedure, input } = loader(params);\n const proc = procedures.get(procedure);\n if (!proc) throw new SeamError(\"INTERNAL_ERROR\", `Procedure '${procedure}' not found`);\n // Skip JTD validation -- loader input is trusted server-side code\n const result = await proc.handler({ input });\n return [key, result] as const;\n }),\n );\n return Object.fromEntries(results);\n}\n\n/** Split-inject a layout template around its outlet marker */\nfunction injectLayout(template: string, data: Record<string, unknown>, inner: string): string {\n const outletMarker = \"<!--seam:outlet-->\";\n const outletIdx = template.indexOf(outletMarker);\n if (outletIdx === -1) {\n return inject(template, data, { skipDataScript: true });\n }\n const before = template.slice(0, outletIdx);\n const after = template.slice(outletIdx + outletMarker.length);\n const injectedBefore = inject(before, data, { skipDataScript: true });\n const injectedAfter = inject(after, data, { skipDataScript: true });\n return injectedBefore + inner + injectedAfter;\n}\n\nexport async function handlePageRequest(\n page: PageDef,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<HandlePageResult> {\n try {\n const t0 = performance.now();\n const layoutChain = page.layoutChain ?? [];\n\n // Execute all loaders (layout chain + page) in parallel\n const loaderResults = await Promise.all([\n ...layoutChain.map((layout) => executeLoaders(layout.loaders, params, procedures)),\n executeLoaders(page.loaders, params, procedures),\n ]);\n\n const t1 = performance.now();\n\n // Partition: first N results are layout, last is page\n const layoutResults = loaderResults.slice(0, layoutChain.length);\n const pageKeyed = loaderResults[loaderResults.length - 1];\n\n // Inject page template\n let innerContent = inject(page.template, flattenForSlots(pageKeyed), { skipDataScript: true });\n\n // Compose layouts from innermost to outermost\n const layoutKeyed: Record<string, Record<string, unknown>> = {};\n for (let i = layoutChain.length - 1; i >= 0; i--) {\n const layout = layoutChain[i];\n const data = layoutResults[i];\n layoutKeyed[layout.id] = data;\n innerContent = injectLayout(layout.template, flattenForSlots(data), innerContent);\n }\n\n // Inject page-level metadata (<title>, <meta>, <link>) into <head>.\n // These were extracted from the page fragment at build time so they don't\n // end up inside the root div via <!--seam:outlet--> substitution.\n // Inserted after <meta charset=\"utf-8\"> so page <title> wins over layout metadata\n // (first <title> wins in HTML5).\n if (page.headMeta) {\n const injectedMeta = inject(page.headMeta, flattenForSlots(pageKeyed), {\n skipDataScript: true,\n });\n const charset = '<meta charset=\"utf-8\">';\n const charsetIdx = innerContent.indexOf(charset);\n if (charsetIdx !== -1) {\n const insertAt = charsetIdx + charset.length;\n innerContent =\n innerContent.slice(0, insertAt) + injectedMeta + innerContent.slice(insertAt);\n }\n }\n\n // Build __SEAM_DATA__: page data at top level, layout data under _layouts\n const seamData: Record<string, unknown> = { ...pageKeyed };\n if (Object.keys(layoutKeyed).length > 0) {\n seamData._layouts = layoutKeyed;\n }\n\n const script = `<script id=\"__SEAM_DATA__\" type=\"application/json\">${JSON.stringify(seamData)}</script>`;\n const bodyClose = innerContent.lastIndexOf(\"</body>\");\n let html: string;\n if (bodyClose !== -1) {\n html = innerContent.slice(0, bodyClose) + script + innerContent.slice(bodyClose);\n } else {\n html = innerContent + script;\n }\n\n const t2 = performance.now();\n\n return {\n status: 200,\n html,\n timing: { dataFetch: t1 - t0, inject: t2 - t1 },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n html: `<!DOCTYPE html><html><body><h1>500 Internal Server Error</h1><p>${escapeHtml(message)}</p></body></html>`,\n };\n }\n}\n","/* packages/server/core/typescript/src/page/route-matcher.ts */\n\ninterface CompiledRoute {\n segments: RouteSegment[];\n}\n\ntype RouteSegment = { kind: \"static\"; value: string } | { kind: \"param\"; name: string };\n\nfunction compileRoute(pattern: string): CompiledRoute {\n const segments: RouteSegment[] = pattern\n .split(\"/\")\n .filter(Boolean)\n .map((seg) =>\n seg.startsWith(\":\") ? { kind: \"param\", name: seg.slice(1) } : { kind: \"static\", value: seg },\n );\n return { segments };\n}\n\nfunction matchRoute(segments: RouteSegment[], pathParts: string[]): Record<string, string> | null {\n if (segments.length !== pathParts.length) return null;\n const params: Record<string, string> = {};\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (seg.kind === \"static\") {\n if (seg.value !== pathParts[i]) return null;\n } else {\n params[seg.name] = pathParts[i];\n }\n }\n return params;\n}\n\nexport class RouteMatcher<T> {\n private routes: { compiled: CompiledRoute; value: T }[] = [];\n\n add(pattern: string, value: T): void {\n this.routes.push({ compiled: compileRoute(pattern), value });\n }\n\n match(path: string): { value: T; params: Record<string, string> } | null {\n const parts = path.split(\"/\").filter(Boolean);\n for (const route of this.routes) {\n const params = matchRoute(route.compiled.segments, parts);\n if (params) return { value: route.value, params };\n }\n return null;\n }\n}\n","/* packages/server/core/typescript/src/router/index.ts */\n\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ProcedureManifest } from \"../manifest/index.js\";\nimport type { HandleResult, InternalProcedure } from \"./handler.js\";\nimport type { InternalSubscription } from \"../procedure.js\";\nimport type { HandlePageResult } from \"../page/handler.js\";\nimport type { PageDef } from \"../page/index.js\";\nimport { buildManifest } from \"../manifest/index.js\";\nimport { handleRequest, handleSubscription, handleBatchRequest } from \"./handler.js\";\nimport type { BatchCall, BatchResultItem } from \"./handler.js\";\nimport { handlePageRequest } from \"../page/handler.js\";\nimport { RouteMatcher } from \"../page/route-matcher.js\";\n\nexport interface ProcedureDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface SubscriptionDef<TIn = unknown, TOut = unknown> {\n type: \"subscription\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n handler: (params: { input: TIn }) => AsyncIterable<TOut>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type DefinitionMap = Record<string, ProcedureDef<any, any> | SubscriptionDef<any, any>>;\n\nfunction isSubscriptionDef(def: ProcedureDef | SubscriptionDef): def is SubscriptionDef {\n return \"type\" in def && def.type === \"subscription\";\n}\n\nexport interface RouterOptions {\n pages?: Record<string, PageDef>;\n validateOutput?: boolean;\n}\n\nexport interface Router<T extends DefinitionMap> {\n manifest(): ProcedureManifest;\n handle(procedureName: string, body: unknown): Promise<HandleResult>;\n handleBatch(calls: BatchCall[]): Promise<{ results: BatchResultItem[] }>;\n handleSubscription(name: string, input: unknown): AsyncIterable<unknown>;\n handlePage(path: string): Promise<HandlePageResult | null>;\n readonly hasPages: boolean;\n /** Exposed for adapter access to the definitions */\n readonly procedures: T;\n}\n\nexport function createRouter<T extends DefinitionMap>(\n procedures: T,\n opts?: RouterOptions,\n): Router<T> {\n const procedureMap = new Map<string, InternalProcedure>();\n const subscriptionMap = new Map<string, InternalSubscription>();\n\n for (const [name, def] of Object.entries(procedures)) {\n if (isSubscriptionDef(def)) {\n subscriptionMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalSubscription[\"handler\"],\n });\n } else {\n procedureMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalProcedure[\"handler\"],\n });\n }\n }\n\n const shouldValidateOutput =\n opts?.validateOutput ??\n (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\");\n\n const pageMatcher = new RouteMatcher<PageDef>();\n const pages = opts?.pages;\n if (pages) {\n for (const [pattern, page] of Object.entries(pages)) {\n pageMatcher.add(pattern, page);\n }\n }\n\n return {\n procedures,\n hasPages: !!pages && Object.keys(pages).length > 0,\n manifest() {\n return buildManifest(procedures);\n },\n handle(procedureName, body) {\n return handleRequest(procedureMap, procedureName, body, shouldValidateOutput);\n },\n handleBatch(calls) {\n return handleBatchRequest(procedureMap, calls, shouldValidateOutput);\n },\n handleSubscription(name, input) {\n return handleSubscription(subscriptionMap, name, input, shouldValidateOutput);\n },\n async handlePage(path) {\n const match = pageMatcher.match(path);\n if (!match) return null;\n return handlePageRequest(match.value, match.params, procedureMap);\n },\n };\n}\n","/* packages/server/core/typescript/src/page/index.ts */\n\nexport interface LoaderResult {\n procedure: string;\n input: unknown;\n}\n\nexport type LoaderFn = (params: Record<string, string>) => LoaderResult;\n\nexport interface LayoutDef {\n id: string;\n template: string;\n loaders: Record<string, LoaderFn>;\n}\n\nexport interface PageDef {\n template: string;\n loaders: Record<string, LoaderFn>;\n layoutChain?: LayoutDef[];\n headMeta?: string;\n}\n\nexport function definePage(config: PageDef): PageDef {\n return { ...config, layoutChain: config.layoutChain ?? [] };\n}\n","/* packages/server/core/typescript/src/mime.ts */\n\nexport const MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".ico\": \"image/x-icon\",\n \".map\": \"application/json\",\n \".ts\": \"application/javascript\",\n \".tsx\": \"application/javascript\",\n};\n","/* packages/server/core/typescript/src/http.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface HttpRequest {\n method: string;\n url: string;\n body: () => Promise<unknown>;\n}\n\nexport interface HttpBodyResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\nexport interface HttpStreamResponse {\n status: number;\n headers: Record<string, string>;\n stream: AsyncIterable<string>;\n}\n\nexport type HttpResponse = HttpBodyResponse | HttpStreamResponse;\n\nexport type HttpHandler = (req: HttpRequest) => Promise<HttpResponse>;\n\nexport interface RpcHashMap {\n procedures: Record<string, string>;\n batch: string;\n}\n\nexport interface HttpHandlerOptions {\n staticDir?: string;\n fallback?: HttpHandler;\n rpcHashMap?: RpcHashMap;\n}\n\nconst RPC_PREFIX = \"/_seam/rpc/\";\nconst PAGE_PREFIX = \"/_seam/page/\";\nconst STATIC_PREFIX = \"/_seam/static/\";\nconst SUBSCRIBE_PREFIX = \"/_seam/subscribe/\";\nconst MANIFEST_PATH = \"/_seam/manifest.json\";\n\nconst JSON_HEADER = { \"Content-Type\": \"application/json\" };\nconst HTML_HEADER = { \"Content-Type\": \"text/html; charset=utf-8\" };\nconst SSE_HEADER = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n};\nconst IMMUTABLE_CACHE = \"public, max-age=31536000, immutable\";\n\nfunction jsonResponse(status: number, body: unknown): HttpBodyResponse {\n return { status, headers: JSON_HEADER, body };\n}\n\nfunction errorResponse(status: number, code: string, message: string): HttpBodyResponse {\n return jsonResponse(status, new SeamError(code, message).toJSON());\n}\n\nasync function handleStaticAsset(assetPath: string, staticDir: string): Promise<HttpBodyResponse> {\n if (assetPath.includes(\"..\")) {\n return errorResponse(403, \"VALIDATION_ERROR\", \"Forbidden\");\n }\n\n const filePath = join(staticDir, assetPath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const ext = extname(filePath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": IMMUTABLE_CACHE,\n },\n body: content,\n };\n } catch {\n return errorResponse(404, \"NOT_FOUND\", \"Asset not found\");\n }\n}\n\n/** Format a single SSE data event */\nexport function sseDataEvent(data: unknown): string {\n return `event: data\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\n/** Format an SSE error event */\nexport function sseErrorEvent(code: string, message: string): string {\n return `event: error\\ndata: ${JSON.stringify({ code, message })}\\n\\n`;\n}\n\n/** Format an SSE complete event */\nexport function sseCompleteEvent(): string {\n return \"event: complete\\ndata: {}\\n\\n\";\n}\n\nasync function* sseStream<T extends DefinitionMap>(\n router: Router<T>,\n name: string,\n input: unknown,\n): AsyncIterable<string> {\n try {\n for await (const value of router.handleSubscription(name, input)) {\n yield sseDataEvent(value);\n }\n yield sseCompleteEvent();\n } catch (error) {\n if (error instanceof SeamError) {\n yield sseErrorEvent(error.code, error.message);\n } else {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n yield sseErrorEvent(\"INTERNAL_ERROR\", message);\n }\n }\n}\n\nasync function handleBatchHttp<T extends DefinitionMap>(\n req: HttpRequest,\n router: Router<T>,\n hashToName: Map<string, string> | null,\n): Promise<HttpBodyResponse> {\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n if (!body || typeof body !== \"object\" || !Array.isArray((body as { calls?: unknown }).calls)) {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Batch request must have a 'calls' array\");\n }\n const calls = (body as { calls: Array<{ procedure?: unknown; input?: unknown }> }).calls.map(\n (c) => ({\n procedure:\n typeof c.procedure === \"string\" ? (hashToName?.get(c.procedure) ?? c.procedure) : \"\",\n input: c.input ?? {},\n }),\n );\n const result = await router.handleBatch(calls);\n return jsonResponse(200, result);\n}\n\nexport function createHttpHandler<T extends DefinitionMap>(\n router: Router<T>,\n opts?: HttpHandlerOptions,\n): HttpHandler {\n // Build reverse lookup (hash -> original name) when obfuscation is active\n const hashToName: Map<string, string> | null = opts?.rpcHashMap\n ? new Map(Object.entries(opts.rpcHashMap.procedures).map(([n, h]) => [h, n]))\n : null;\n const batchHash = opts?.rpcHashMap?.batch ?? null;\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const { pathname } = url;\n\n if (req.method === \"GET\" && pathname === MANIFEST_PATH) {\n if (opts?.rpcHashMap) return errorResponse(403, \"FORBIDDEN\", \"Manifest disabled\");\n return jsonResponse(200, router.manifest());\n }\n\n if (req.method === \"POST\" && pathname.startsWith(RPC_PREFIX)) {\n let name = pathname.slice(RPC_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty procedure name\");\n }\n\n // Batch: match both original \"_batch\" and hashed batch endpoint\n if (name === \"_batch\" || (batchHash && name === batchHash)) {\n return handleBatchHttp(req, router, hashToName);\n }\n\n // Resolve hash -> original name when obfuscation is active\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n\n const result = await router.handle(name, body);\n return jsonResponse(result.status, result.body);\n }\n\n if (req.method === \"GET\" && pathname.startsWith(SUBSCRIBE_PREFIX)) {\n let name = pathname.slice(SUBSCRIBE_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty subscription name\");\n }\n\n // Resolve hash -> original name for subscriptions\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n const rawInput = url.searchParams.get(\"input\");\n let input: unknown;\n try {\n input = rawInput ? JSON.parse(rawInput) : {};\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid input query parameter\");\n }\n\n return { status: 200, headers: SSE_HEADER, stream: sseStream(router, name, input) };\n }\n\n if (req.method === \"GET\" && pathname.startsWith(PAGE_PREFIX) && router.hasPages) {\n const pagePath = \"/\" + pathname.slice(PAGE_PREFIX.length);\n const result = await router.handlePage(pagePath);\n if (result) {\n return { status: result.status, headers: HTML_HEADER, body: result.html };\n }\n }\n\n if (req.method === \"GET\" && pathname.startsWith(STATIC_PREFIX) && opts?.staticDir) {\n const assetPath = pathname.slice(STATIC_PREFIX.length);\n return handleStaticAsset(assetPath, opts.staticDir);\n }\n\n if (opts?.fallback) return opts.fallback(req);\n return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n };\n}\n\nexport function serialize(body: unknown): string {\n return typeof body === \"string\" ? body : JSON.stringify(body);\n}\n\n/** Consume an async stream chunk-by-chunk; return false from write to stop early. */\nexport async function drainStream(\n stream: AsyncIterable<string>,\n write: (chunk: string) => boolean | void,\n): Promise<void> {\n try {\n for await (const chunk of stream) {\n if (write(chunk) === false) break;\n }\n } catch {\n // Client disconnected\n }\n}\n\n/** Convert an HttpResponse to a Web API Response (for adapters using fetch-compatible runtimes) */\nexport function toWebResponse(result: HttpResponse): Response {\n if (\"stream\" in result) {\n const stream = result.stream;\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n await drainStream(stream, (chunk) => {\n controller.enqueue(encoder.encode(chunk));\n });\n controller.close();\n },\n });\n return new Response(readable, { status: result.status, headers: result.headers });\n }\n return new Response(serialize(result.body), { status: result.status, headers: result.headers });\n}\n","/* packages/server/core/typescript/src/page/build-loader.ts */\n\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PageDef, LayoutDef, LoaderFn, LoaderResult } from \"./index.js\";\nimport type { RpcHashMap } from \"../http.js\";\n\ninterface RouteManifest {\n layouts?: Record<string, LayoutManifestEntry>;\n routes: Record<string, RouteManifestEntry>;\n}\n\ninterface LayoutManifestEntry {\n template: string;\n loaders?: Record<string, LoaderConfig>;\n parent?: string;\n}\n\ninterface RouteManifestEntry {\n template: string;\n layout?: string;\n loaders: Record<string, LoaderConfig>;\n head_meta?: string;\n}\n\ninterface LoaderConfig {\n procedure: string;\n params?: Record<string, ParamConfig>;\n}\n\ninterface ParamConfig {\n from: \"route\";\n type?: \"string\" | \"int\";\n}\n\nfunction buildLoaderFn(config: LoaderConfig): LoaderFn {\n return (params: Record<string, string>): LoaderResult => {\n const input: Record<string, unknown> = {};\n if (config.params) {\n for (const [key, mapping] of Object.entries(config.params)) {\n const raw = params[key];\n input[key] = mapping.type === \"int\" ? Number(raw) : raw;\n }\n }\n return { procedure: config.procedure, input };\n };\n}\n\nfunction buildLoaderFns(configs: Record<string, LoaderConfig>): Record<string, LoaderFn> {\n const fns: Record<string, LoaderFn> = {};\n for (const [key, config] of Object.entries(configs)) {\n fns[key] = buildLoaderFn(config);\n }\n return fns;\n}\n\n/** Resolve parent chain for a layout, returning outer-to-inner order */\nfunction resolveLayoutChain(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n templates: Record<string, string>,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n chain.push({\n id: currentId,\n template: templates[currentId],\n loaders: buildLoaderFns(entry.loaders ?? {}),\n });\n currentId = entry.parent;\n }\n\n // Reverse: we walked inner→outer, but want outer→inner\n chain.reverse();\n return chain;\n}\n\n/** Resolve layout chain with lazy template getters (re-read from disk on each access) */\nfunction resolveLayoutChainDev(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n distDir: string,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n const layoutTemplatePath = join(distDir, entry.template);\n const def: LayoutDef = {\n id: currentId,\n template: \"\", // placeholder, overridden by getter\n loaders: buildLoaderFns(entry.loaders ?? {}),\n };\n Object.defineProperty(def, \"template\", {\n get: () => readFileSync(layoutTemplatePath, \"utf-8\"),\n enumerable: true,\n });\n chain.push(def);\n currentId = entry.parent;\n }\n\n chain.reverse();\n return chain;\n}\n\n/** Load the RPC hash map from build output (returns undefined when obfuscation is off) */\nexport function loadRpcHashMap(distDir: string): RpcHashMap | undefined {\n const hashMapPath = join(distDir, \"rpc-hash-map.json\");\n try {\n return JSON.parse(readFileSync(hashMapPath, \"utf-8\")) as RpcHashMap;\n } catch {\n return undefined;\n }\n}\n\nexport function loadBuildOutput(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n\n // Load layout templates\n const layoutTemplates: Record<string, string> = {};\n const layoutEntries = manifest.layouts ?? {};\n for (const [id, entry] of Object.entries(layoutEntries)) {\n layoutTemplates[id] = readFileSync(join(distDir, entry.template), \"utf-8\");\n }\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, entry.template);\n const template = readFileSync(templatePath, \"utf-8\");\n\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates)\n : [];\n\n pages[path] = { template, loaders, layoutChain, headMeta: entry.head_meta };\n }\n return pages;\n}\n\n/** Load build output with lazy template getters — templates re-read from disk on each access */\nexport function loadBuildOutputDev(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n\n const layoutEntries = manifest.layouts ?? {};\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, entry.template);\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChainDev(entry.layout, layoutEntries, distDir)\n : [];\n\n const page: PageDef = {\n template: \"\", // placeholder, overridden by getter\n loaders,\n layoutChain,\n };\n Object.defineProperty(page, \"template\", {\n get: () => readFileSync(templatePath, \"utf-8\"),\n enumerable: true,\n });\n pages[path] = page;\n }\n return pages;\n}\n","/* packages/server/core/typescript/src/subscription.ts */\n\n/**\n * Bridge callback-style event sources to an AsyncGenerator.\n *\n * Usage:\n * const stream = fromCallback<string>(({ emit, end, error }) => {\n * emitter.on(\"data\", emit);\n * emitter.on(\"end\", end);\n * emitter.on(\"error\", error);\n * return () => emitter.removeAllListeners();\n * });\n */\nexport interface CallbackSink<T> {\n emit: (value: T) => void;\n end: () => void;\n error: (err: Error) => void;\n}\n\ntype QueueItem<T> = { type: \"value\"; value: T } | { type: \"end\" } | { type: \"error\"; error: Error };\n\nexport function fromCallback<T>(\n setup: (sink: CallbackSink<T>) => (() => void) | void,\n): AsyncGenerator<T, void, undefined> {\n const queue: QueueItem<T>[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n function notify() {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n }\n\n const sink: CallbackSink<T> = {\n emit(value) {\n if (done) return;\n queue.push({ type: \"value\", value });\n notify();\n },\n end() {\n if (done) return;\n done = true;\n queue.push({ type: \"end\" });\n notify();\n },\n error(err) {\n if (done) return;\n done = true;\n queue.push({ type: \"error\", error: err });\n notify();\n },\n };\n\n const cleanup = setup(sink);\n\n async function* generate(): AsyncGenerator<T, void, undefined> {\n try {\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n }\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.type === \"value\") {\n yield item.value;\n } else if (item.type === \"error\") {\n throw item.error;\n } else {\n return;\n }\n }\n }\n } finally {\n done = true;\n if (cleanup) cleanup();\n }\n }\n\n return generate();\n}\n","/* packages/server/core/typescript/src/proxy.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { HttpHandler, HttpBodyResponse } from \"./http.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface DevProxyOptions {\n /** Target URL to forward requests to (e.g. \"http://localhost:5173\") */\n target: string;\n}\n\nexport interface StaticHandlerOptions {\n /** Directory to serve static files from */\n dir: string;\n}\n\n/** Forward non-seam requests to a dev server (e.g. Vite) */\nexport function createDevProxy(opts: DevProxyOptions): HttpHandler {\n const target = opts.target.replace(/\\/$/, \"\");\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const proxyUrl = `${target}${url.pathname}${url.search}`;\n\n try {\n const resp = await fetch(proxyUrl, {\n method: req.method,\n headers: { Accept: \"*/*\" },\n });\n\n const body = await resp.text();\n const headers: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return { status: resp.status, headers, body };\n } catch {\n return {\n status: 502,\n headers: { \"Content-Type\": \"text/plain\" },\n body: `Bad Gateway: failed to connect to ${target}`,\n };\n }\n };\n}\n\n/** Serve static files from a directory, with index.html fallback for directories */\nexport function createStaticHandler(opts: StaticHandlerOptions): HttpHandler {\n const dir = opts.dir;\n\n return async (req): Promise<HttpBodyResponse> => {\n const url = new URL(req.url, \"http://localhost\");\n let filePath = url.pathname;\n\n if (filePath.includes(\"..\")) {\n return {\n status: 403,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Forbidden\",\n };\n }\n\n // Serve index.html for directory paths\n if (filePath.endsWith(\"/\")) {\n filePath += \"index.html\";\n }\n\n const fullPath = join(dir, filePath);\n try {\n const content = await readFile(fullPath);\n const ext = extname(fullPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: { \"Content-Type\": contentType },\n body: content.toString(),\n };\n } catch {\n return {\n status: 404,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Not found\",\n };\n }\n };\n}\n","/* packages/server/core/typescript/src/dev/reload-watcher.ts */\n\nimport { watch, type FSWatcher } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ReloadWatcher {\n close(): void;\n}\n\nexport function watchReloadTrigger(distDir: string, onReload: () => void): ReloadWatcher {\n const triggerPath = join(distDir, \".reload-trigger\");\n let watcher: FSWatcher | null = null;\n try {\n watcher = watch(triggerPath, () => onReload());\n } catch {\n // Trigger file may not exist yet; watch directory until it appears\n const dirWatcher = watch(distDir, (_event, filename) => {\n if (filename === \".reload-trigger\") {\n dirWatcher.close();\n watcher = watch(triggerPath, () => onReload());\n // First creation IS the reload signal -- fire immediately\n onReload();\n }\n });\n return {\n close() {\n dirWatcher.close();\n watcher?.close();\n },\n };\n }\n return {\n close() {\n watcher?.close();\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canmi/seam-server",
3
- "version": "0.2.3",
3
+ "version": "0.2.14",
4
4
  "files": [
5
5
  "dist"
6
6
  ],