raktajs 0.1.2 → 0.1.4

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.
@@ -113,15 +113,18 @@ function isBuildTimeMode(mode) {
113
113
  }
114
114
  // src/render/renderer.ts
115
115
  function buildHtmlShell(options) {
116
+ const title = options.title ?? options.appName;
117
+ const faviconPath = options.faviconPath ?? "/favicon.ico";
118
+ const descriptionMeta = options.description !== undefined ? `<meta name="description" content="${options.description}" />` : "";
116
119
  return `
117
120
  <!DOCTYPE html>
118
121
  <html lang="${options.lang}">
119
122
  <head>
120
123
  <meta charset="UTF-8" />
121
124
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
122
- <title>
123
- ${options.appName}
124
- </title>
125
+ <title>${title}</title>
126
+ ${descriptionMeta}
127
+ <link rel="icon" href="${faviconPath}" sizes="any" />
125
128
  <link rel="stylesheet" href="${options.cssPath}" />
126
129
  </head>
127
130
  <body>
@@ -180,4 +183,4 @@ export {
180
183
  RENDER_MODE_DESCRIPTORS
181
184
  };
182
185
 
183
- //# debugId=CC5E8D5EC6EA00C564756E2164756E21
186
+ //# debugId=8EF42828C43460A564756E2164756E21
@@ -3,9 +3,9 @@
3
3
  "sources": ["..\\..\\src\\render\\modes.ts", "..\\..\\src\\render\\renderer.ts"],
4
4
  "sourcesContent": [
5
5
  "import type {\n\tRenderConfig,\n\tRenderMode,\n\tRenderModeDescriptor,\n\tResolvedRouteMode,\n} from \"./types\";\n\nexport const RENDER_MODE_DESCRIPTORS: Readonly<\n\tRecord<RenderMode, RenderModeDescriptor>\n> = {\n\tcsr: {\n\t\tmode: \"csr\",\n\t\tlabel: \"Client-Side Rendering\",\n\t\tshortLabel: \"CSR\",\n\t\tdescription:\n\t\t\t\"React renders entirely in the browser. The server sends a minimal HTML shell with a JS bundle. No server required at runtime.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n\tssr: {\n\t\tmode: \"ssr\",\n\t\tlabel: \"Server-Side Rendering\",\n\t\tshortLabel: \"SSR\",\n\t\tdescription:\n\t\t\t\"React renders to HTML on the server per request. The client receives full HTML and then hydrates. Requires a running Node/Bun server.\",\n\t\tserverRequired: true,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tssg: {\n\t\tmode: \"ssg\",\n\t\tlabel: \"Static Site Generation\",\n\t\tshortLabel: \"SSG\",\n\t\tdescription:\n\t\t\t\"Pages are fully rendered at build time. Output is static HTML files. No server required at runtime.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: true,\n\t\tclientHydration: false,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tcsg: {\n\t\tmode: \"csg\",\n\t\tlabel: \"Client-Side Generation\",\n\t\tshortLabel: \"CSG\",\n\t\tdescription:\n\t\t\t\"A static shell is generated at build time, data is fetched and rendered on the client. Combines SSG speed with dynamic data.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: true,\n\t\tclientHydration: true,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tspa: {\n\t\tmode: \"spa\",\n\t\tlabel: \"Single Page Application\",\n\t\tshortLabel: \"SPA\",\n\t\tdescription:\n\t\t\t\"A single HTML entry point is served for all routes. React handles all routing client-side. Equivalent to a standard Vite SPA.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n\thybrid: {\n\t\tmode: \"hybrid\",\n\t\tlabel: \"Hybrid Rendering\",\n\t\tshortLabel: \"Hybrid\",\n\t\tdescription:\n\t\t\t\"Different routes use different render modes. Configured via the `render.routes` map in rakta.config.ts. The top-level mode is the fallback.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n};\n\n/**\n * Returns true if the pathname matches a given route pattern.\n * Supports exact paths and simple :param segments (e.g. /blog/:slug).\n */\nfunction pathMatchesPattern(pathname: string, pattern: string): boolean {\n\tif (pattern === pathname) return true;\n\n\tconst patternParts = pattern.split(\"/\");\n\tconst pathParts = pathname.split(\"/\");\n\n\tif (patternParts.length !== pathParts.length) return false;\n\n\tfor (let i = 0; i < patternParts.length; i++) {\n\t\tconst pp = patternParts[i];\n\t\tconst path = pathParts[i];\n\t\tif (pp === undefined || path === undefined) return false;\n\t\tif (pp.startsWith(\":\")) continue; // dynamic segment — always matches\n\t\tif (pp !== path) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Resolves the render mode for the given pathname using the provided config.\n * Route-specific overrides take priority. The most specific (longest) matching\n * pattern wins. Falls back to `config.defaultMode`.\n */\nexport function resolveRouteMode(\n\tpathname: string,\n\tconfig: RenderConfig,\n): ResolvedRouteMode {\n\tconst patterns = Object.keys(config.routes).sort(\n\t\t(a, b) => b.length - a.length, // longest pattern first (most specific)\n\t);\n\n\tfor (const pattern of patterns) {\n\t\tconst overrideMode = config.routes[pattern];\n\t\tif (overrideMode !== undefined && pathMatchesPattern(pathname, pattern)) {\n\t\t\treturn {\n\t\t\t\troutePath: pathname,\n\t\t\t\tmode: overrideMode,\n\t\t\t\tsource: \"route-override\",\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\troutePath: pathname,\n\t\tmode: config.defaultMode,\n\t\tsource: \"default\",\n\t};\n}\n\nexport function getModeDescriptor(mode: RenderMode): RenderModeDescriptor {\n\treturn RENDER_MODE_DESCRIPTORS[mode];\n}\n\nexport function isRoadmapMode(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].roadmap;\n}\n\nexport function requiresServer(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].serverRequired;\n}\n\nexport function isBuildTimeMode(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].buildTimeGenerated;\n}\n",
6
- "import { isRoadmapMode } from \"./modes\";\nimport type {\n\tRenderContext,\n\tRenderFailure,\n\tRenderMode,\n\tRenderResult,\n\tRenderSuccess,\n} from \"./types\";\n\nexport interface RendererOptions {\n\treadonly appName: string;\n\treadonly scriptPath: string;\n\treadonly cssPath: string;\n\treadonly lang: string;\n}\n\nfunction buildHtmlShell(options: RendererOptions): string {\n\treturn `\n <!DOCTYPE html>\n <html lang=\"${options.lang}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>\n ${options.appName}\n </title>\n <link rel=\"stylesheet\" href=\"${options.cssPath}\" />\n </head>\n <body>\n <div id=\"rakta-root\"></div>\n <script type=\"module\" src=\"${options.scriptPath}\"></script>\n </body>\n </html>`;\n}\n\nfunction makeSuccess(\n\thtml: string,\n\tmode: RenderMode,\n\trenderMs: number,\n\thttpStatus: number = 200,\n\tfromCache: boolean = false,\n): RenderSuccess {\n\treturn {\n\t\tkind: \"success\",\n\t\thtml,\n\t\tmode,\n\t\thttpStatus,\n\t\tresponseHeaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\tfromCache,\n\t\trenderMs,\n\t};\n}\n\nfunction makeFailure(\n\treason: string,\n\tmode: RenderMode,\n\thttpStatus: number = 500,\n): RenderFailure {\n\treturn { kind: \"failure\", reason, mode, httpStatus };\n}\n\n/**\n * Render a page using the resolved mode from the context.\n * Roadmap modes (ssr, ssg, csg) fall back to a CSR shell in v0.1.0.\n */\nexport async function render(\n\tcontext: RenderContext,\n\toptions: RendererOptions,\n): Promise<RenderResult> {\n\tconst startMs = Date.now();\n\n\t// Roadmap modes: fall back to CSR shell with a warning\n\tif (isRoadmapMode(context.mode)) {\n\t\tconsole.warn(\n\t\t\t`[Rakta.js] Render mode \"${context.mode}\" is a roadmap feature (v0.2.0). ` +\n\t\t\t\t`Falling back to CSR for: ${context.routePath}`,\n\t\t);\n\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\t}\n\n\tswitch (context.mode) {\n\t\tcase \"csr\":\n\t\tcase \"spa\":\n\t\t\treturn makeSuccess(\n\t\t\t\tbuildHtmlShell(options),\n\t\t\t\tcontext.mode,\n\t\t\t\tDate.now() - startMs,\n\t\t\t);\n\n\t\tcase \"hybrid\":\n\t\t\t// Hybrid resolution happens upstream in Tide. If it reaches the renderer\n\t\t\t// as hybrid, the route had no specific override - fall back to CSR.\n\t\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\n\t\tcase \"ssr\":\n\t\tcase \"ssg\":\n\t\tcase \"csg\":\n\t\t\t// These are already caught by isRoadmapMode above, but TypeScript\n\t\t\t// requires an exhaustive switch for the RenderMode union.\n\t\t\treturn makeFailure(\n\t\t\t\t`Render mode \"${context.mode}\" is not yet implemented.`,\n\t\t\t\tcontext.mode,\n\t\t\t\t501,\n\t\t\t);\n\t}\n}\n\nexport function renderNotFound(options: RendererOptions): RenderSuccess {\n\treturn makeSuccess(buildHtmlShell(options), \"csr\", 0, 404);\n}\n\nexport function renderServerError(\n\treason: string,\n\tmode: RenderMode,\n): RenderFailure {\n\treturn makeFailure(reason, mode, 500);\n}\n"
6
+ "import { isRoadmapMode } from \"./modes\";\nimport type {\n\tRenderContext,\n\tRenderFailure,\n\tRenderMode,\n\tRenderResult,\n\tRenderSuccess,\n} from \"./types\";\n\nexport interface RendererOptions {\n\treadonly appName: string;\n\treadonly title?: string | undefined;\n\treadonly description?: string | undefined;\n\treadonly faviconPath?: string | undefined;\n\treadonly scriptPath: string;\n\treadonly cssPath: string;\n\treadonly lang: string;\n}\n\nfunction buildHtmlShell(options: RendererOptions): string {\n\tconst title = options.title ?? options.appName;\n\tconst faviconPath = options.faviconPath ?? \"/favicon.ico\";\n\tconst descriptionMeta =\n\t\toptions.description !== undefined\n\t\t\t? `<meta name=\"description\" content=\"${options.description}\" />`\n\t\t\t: \"\";\n\n\treturn `\n <!DOCTYPE html>\n <html lang=\"${options.lang}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${title}</title>\n ${descriptionMeta}\n <link rel=\"icon\" href=\"${faviconPath}\" sizes=\"any\" />\n <link rel=\"stylesheet\" href=\"${options.cssPath}\" />\n </head>\n <body>\n <div id=\"rakta-root\"></div>\n <script type=\"module\" src=\"${options.scriptPath}\"></script>\n </body>\n </html>`;\n}\n\nfunction makeSuccess(\n\thtml: string,\n\tmode: RenderMode,\n\trenderMs: number,\n\thttpStatus: number = 200,\n\tfromCache: boolean = false,\n): RenderSuccess {\n\treturn {\n\t\tkind: \"success\",\n\t\thtml,\n\t\tmode,\n\t\thttpStatus,\n\t\tresponseHeaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\tfromCache,\n\t\trenderMs,\n\t};\n}\n\nfunction makeFailure(\n\treason: string,\n\tmode: RenderMode,\n\thttpStatus: number = 500,\n): RenderFailure {\n\treturn { kind: \"failure\", reason, mode, httpStatus };\n}\n\n/**\n * Render a page using the resolved mode from the context.\n * Roadmap modes (ssr, ssg, csg) fall back to a CSR shell in v0.1.0.\n */\nexport async function render(\n\tcontext: RenderContext,\n\toptions: RendererOptions,\n): Promise<RenderResult> {\n\tconst startMs = Date.now();\n\n\t// Roadmap modes: fall back to CSR shell with a warning\n\tif (isRoadmapMode(context.mode)) {\n\t\tconsole.warn(\n\t\t\t`[Rakta.js] Render mode \"${context.mode}\" is a roadmap feature (v0.2.0). ` +\n\t\t\t\t`Falling back to CSR for: ${context.routePath}`,\n\t\t);\n\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\t}\n\n\tswitch (context.mode) {\n\t\tcase \"csr\":\n\t\tcase \"spa\":\n\t\t\treturn makeSuccess(\n\t\t\t\tbuildHtmlShell(options),\n\t\t\t\tcontext.mode,\n\t\t\t\tDate.now() - startMs,\n\t\t\t);\n\n\t\tcase \"hybrid\":\n\t\t\t// Hybrid resolution happens upstream in Tide. If it reaches the renderer\n\t\t\t// as hybrid, the route had no specific override - fall back to CSR.\n\t\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\n\t\tcase \"ssr\":\n\t\tcase \"ssg\":\n\t\tcase \"csg\":\n\t\t\t// These are already caught by isRoadmapMode above, but TypeScript\n\t\t\t// requires an exhaustive switch for the RenderMode union.\n\t\t\treturn makeFailure(\n\t\t\t\t`Render mode \"${context.mode}\" is not yet implemented.`,\n\t\t\t\tcontext.mode,\n\t\t\t\t501,\n\t\t\t);\n\t}\n}\n\nexport function renderNotFound(options: RendererOptions): RenderSuccess {\n\treturn makeSuccess(buildHtmlShell(options), \"csr\", 0, 404);\n}\n\nexport function renderServerError(\n\treason: string,\n\tmode: RenderMode,\n): RenderFailure {\n\treturn makeFailure(reason, mode, 500);\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "CC5E8D5EC6EA00C564756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "8EF42828C43460A564756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -1,6 +1,9 @@
1
1
  import type { RenderContext, RenderFailure, RenderMode, RenderResult, RenderSuccess } from "./types";
2
2
  export interface RendererOptions {
3
3
  readonly appName: string;
4
+ readonly title?: string | undefined;
5
+ readonly description?: string | undefined;
6
+ readonly faviconPath?: string | undefined;
4
7
  readonly scriptPath: string;
5
8
  readonly cssPath: string;
6
9
  readonly lang: string;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,aAAa,EACb,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AA+CD;;;GAGG;AACH,wBAAsB,MAAM,CAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,CAAC,CAqCvB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAEtE;AAED,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACd,aAAa,CAEf"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,aAAa,EACb,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAsDD;;;GAGG;AACH,wBAAsB,MAAM,CAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,CAAC,CAqCvB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAEtE;AAED,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACd,aAAa,CAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/tide/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,WAAW,CAAC;AAOxE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAkG9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,aAAa,EAAE,iBAAiB,EAChC,YAAY,EAAE,YAAY,GACxB,WAAW,CA2Gb"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/tide/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,WAAW,CAAC;AAOxE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAkG9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,aAAa,EAAE,iBAAiB,EAChC,YAAY,EAAE,YAAY,GACxB,WAAW,CA6Gb"}
@@ -108,15 +108,18 @@ function isRoadmapMode(mode) {
108
108
  }
109
109
  // src/render/renderer.ts
110
110
  function buildHtmlShell(options) {
111
+ const title = options.title ?? options.appName;
112
+ const faviconPath = options.faviconPath ?? "/favicon.ico";
113
+ const descriptionMeta = options.description !== undefined ? `<meta name="description" content="${options.description}" />` : "";
111
114
  return `
112
115
  <!DOCTYPE html>
113
116
  <html lang="${options.lang}">
114
117
  <head>
115
118
  <meta charset="UTF-8" />
116
119
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
117
- <title>
118
- ${options.appName}
119
- </title>
120
+ <title>${title}</title>
121
+ ${descriptionMeta}
122
+ <link rel="icon" href="${faviconPath}" sizes="any" />
120
123
  <link rel="stylesheet" href="${options.cssPath}" />
121
124
  </head>
122
125
  <body>
@@ -440,8 +443,10 @@ function createBunAdapter(adapterConfig, renderConfig) {
440
443
  timestampMs: runtimeContext.timestampMs
441
444
  }, {
442
445
  appName: adapterConfig.appName,
446
+ title: adapterConfig.seo.defaultTitle,
447
+ description: adapterConfig.seo.defaultDescription,
443
448
  scriptPath: "/app.js",
444
- cssPath: "/globals.css",
449
+ cssPath: "/app.css",
445
450
  lang: "en"
446
451
  });
447
452
  if (renderResult.kind === "failure") {
@@ -477,4 +482,4 @@ export {
477
482
  buildErrorResponse
478
483
  };
479
484
 
480
- //# debugId=05010CDFFCF397B164756E2164756E21
485
+ //# debugId=C80F226E5734F0BB64756E2164756E21
@@ -2,15 +2,15 @@
2
2
  "version": 3,
3
3
  "sources": ["..\\..\\src\\tide\\adapter.ts", "..\\..\\src\\render\\modes.ts", "..\\..\\src\\render\\renderer.ts", "..\\..\\src\\router\\scanner.ts", "..\\..\\src\\router\\manifest.ts", "..\\..\\src\\router\\matcher.ts", "..\\..\\src\\tide\\runtime.ts"],
4
4
  "sourcesContent": [
5
- "import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type RenderConfig, render, resolveRouteMode } from \"../render\";\nimport { generateManifest, matchRoute } from \"../router\";\nimport {\n\tbuildErrorResponse,\n\tbuildHtmlResponse,\n\tcreateRuntimeContext,\n} from \"./runtime\";\nimport type { TideAdapter, TideAdapterConfig } from \"./types\";\n\nconst STATIC_MIME_TYPES: Readonly<Record<string, string>> = {\n\t\".js\": \"application/javascript; charset=utf-8\",\n\t\".ts\": \"application/javascript; charset=utf-8\",\n\t\".css\": \"text/css; charset=utf-8\",\n\t\".json\": \"application/json; charset=utf-8\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".webp\": \"image/webp\",\n\t\".svg\": \"image/svg+xml\",\n\t\".ico\": \"image/x-icon\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n};\n\ntype ApiRouteHandler = (request: Request) => Response | Promise<Response>;\n\ninterface ApiRouteExports {\n\treadonly GET?: ApiRouteHandler;\n\treadonly POST?: ApiRouteHandler;\n\treadonly PUT?: ApiRouteHandler;\n\treadonly PATCH?: ApiRouteHandler;\n\treadonly DELETE?: ApiRouteHandler;\n\treadonly HEAD?: ApiRouteHandler;\n\treadonly OPTIONS?: ApiRouteHandler;\n}\n\nfunction mimeForPath(filePath: string): string {\n\tconst extensionIndex = filePath.lastIndexOf(\".\");\n\n\tif (extensionIndex < 0) {\n\t\treturn \"application/octet-stream\";\n\t}\n\n\tconst extension = filePath.slice(extensionIndex).toLowerCase();\n\n\treturn STATIC_MIME_TYPES[extension] ?? \"application/octet-stream\";\n}\n\nfunction normalizeStaticPath(pathname: string): string {\n\tconst pathnameWithoutLeadingSlash = pathname.replace(/^\\/+/, \"\");\n\n\tif (pathnameWithoutLeadingSlash.length > 0) {\n\t\treturn pathnameWithoutLeadingSlash;\n\t}\n\n\treturn \"index.html\";\n}\n\nfunction isReadableFile(filePath: string): boolean {\n\treturn existsSync(filePath) && statSync(filePath).isFile();\n}\n\nfunction isApiRouteExports(value: unknown): value is ApiRouteExports {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction getApiRouteHandler(\n\trouteExports: ApiRouteExports,\n\tmethod: string,\n): ApiRouteHandler | undefined {\n\tif (method === \"GET\") {\n\t\treturn routeExports.GET;\n\t}\n\n\tif (method === \"POST\") {\n\t\treturn routeExports.POST;\n\t}\n\n\tif (method === \"PUT\") {\n\t\treturn routeExports.PUT;\n\t}\n\n\tif (method === \"PATCH\") {\n\t\treturn routeExports.PATCH;\n\t}\n\n\tif (method === \"DELETE\") {\n\t\treturn routeExports.DELETE;\n\t}\n\n\tif (method === \"HEAD\") {\n\t\treturn routeExports.HEAD;\n\t}\n\n\tif (method === \"OPTIONS\") {\n\t\treturn routeExports.OPTIONS;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Creates the Bun Tide adapter.\n * Handles static files, API routes, and page rendering.\n */\nexport function createBunAdapter(\n\tadapterConfig: TideAdapterConfig,\n\trenderConfig: RenderConfig,\n): TideAdapter {\n\tconst manifest = generateManifest(adapterConfig.appDir);\n\tconst searchDirectories = [adapterConfig.publicDir, adapterConfig.outDir];\n\n\tlet serverInstance: ReturnType<typeof Bun.serve> | undefined;\n\n\tasync function handle(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\t\tconst { pathname } = url;\n\t\tconst staticPathname = normalizeStaticPath(pathname);\n\n\t\tfor (const searchDirectory of searchDirectories) {\n\t\t\tconst filePath = join(searchDirectory, staticPathname);\n\n\t\t\tif (isReadableFile(filePath)) {\n\t\t\t\treturn new Response(readFileSync(filePath), {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": mimeForPath(filePath),\n\t\t\t\t\t\t\"Cache-Control\": \"public, max-age=31536000, immutable\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst apiRoutes = manifest.routes.filter((route) => route.kind === \"api\");\n\t\tconst apiMatch = matchRoute(pathname, apiRoutes);\n\n\t\tif (apiMatch) {\n\t\t\tconst modulePath = join(adapterConfig.appDir, apiMatch.entry.filePath);\n\n\t\t\tconst routeModule: unknown = await import(modulePath);\n\n\t\t\tif (!isApiRouteExports(routeModule)) {\n\t\t\t\treturn new Response(\"Invalid API route module\", {\n\t\t\t\t\tstatus: 500,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst handler = getApiRouteHandler(\n\t\t\t\trouteModule,\n\t\t\t\trequest.method.toUpperCase(),\n\t\t\t);\n\n\t\t\tif (!handler) {\n\t\t\t\treturn new Response(\"Method not allowed\", {\n\t\t\t\t\tstatus: 405,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn await handler(request);\n\t\t}\n\n\t\tconst resolvedRouteMode = resolveRouteMode(pathname, renderConfig);\n\n\t\tconst runtimeContext = createRuntimeContext(\n\t\t\trequest,\n\t\t\turl,\n\t\t\t{},\n\t\t\tresolvedRouteMode.mode,\n\t\t);\n\n\t\tconst renderResult = await render(\n\t\t\t{\n\t\t\t\troutePath: runtimeContext.pathname,\n\t\t\t\tmode: runtimeContext.resolvedMode,\n\t\t\t\tparams: runtimeContext.params,\n\t\t\t\tsearchParams: runtimeContext.searchParams,\n\t\t\t\trequestHeaders: runtimeContext.requestHeaders,\n\t\t\t\ttimestampMs: runtimeContext.timestampMs,\n\t\t\t},\n\t\t\t{\n\t\t\t\tappName: adapterConfig.appName,\n\t\t\t\tscriptPath: \"/app.js\",\n\t\t\t\tcssPath: \"/globals.css\",\n\t\t\t\tlang: \"en\",\n\t\t\t},\n\t\t);\n\n\t\tif (renderResult.kind === \"failure\") {\n\t\t\treturn buildErrorResponse(renderResult.reason, renderResult.httpStatus);\n\t\t}\n\n\t\treturn buildHtmlResponse(renderResult.html, renderResult.httpStatus);\n\t}\n\n\treturn {\n\t\tkind: \"bun\",\n\t\thandle,\n\t\tstart: async (): Promise<void> => {\n\t\t\tserverInstance = Bun.serve({\n\t\t\t\tport: adapterConfig.port,\n\t\t\t\thostname: adapterConfig.host,\n\t\t\t\tfetch: handle,\n\t\t\t});\n\n\t\t\tconsole.log(\n\t\t\t\t`[Rakta.js Tide] Running at http://${adapterConfig.host}:${serverInstance.port}`,\n\t\t\t);\n\t\t},\n\t\tstop: (): void => {\n\t\t\tif (!serverInstance) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tserverInstance.stop();\n\t\t},\n\t};\n}\n",
5
+ "import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type RenderConfig, render, resolveRouteMode } from \"../render\";\nimport { generateManifest, matchRoute } from \"../router\";\nimport {\n\tbuildErrorResponse,\n\tbuildHtmlResponse,\n\tcreateRuntimeContext,\n} from \"./runtime\";\nimport type { TideAdapter, TideAdapterConfig } from \"./types\";\n\nconst STATIC_MIME_TYPES: Readonly<Record<string, string>> = {\n\t\".js\": \"application/javascript; charset=utf-8\",\n\t\".ts\": \"application/javascript; charset=utf-8\",\n\t\".css\": \"text/css; charset=utf-8\",\n\t\".json\": \"application/json; charset=utf-8\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".webp\": \"image/webp\",\n\t\".svg\": \"image/svg+xml\",\n\t\".ico\": \"image/x-icon\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n};\n\ntype ApiRouteHandler = (request: Request) => Response | Promise<Response>;\n\ninterface ApiRouteExports {\n\treadonly GET?: ApiRouteHandler;\n\treadonly POST?: ApiRouteHandler;\n\treadonly PUT?: ApiRouteHandler;\n\treadonly PATCH?: ApiRouteHandler;\n\treadonly DELETE?: ApiRouteHandler;\n\treadonly HEAD?: ApiRouteHandler;\n\treadonly OPTIONS?: ApiRouteHandler;\n}\n\nfunction mimeForPath(filePath: string): string {\n\tconst extensionIndex = filePath.lastIndexOf(\".\");\n\n\tif (extensionIndex < 0) {\n\t\treturn \"application/octet-stream\";\n\t}\n\n\tconst extension = filePath.slice(extensionIndex).toLowerCase();\n\n\treturn STATIC_MIME_TYPES[extension] ?? \"application/octet-stream\";\n}\n\nfunction normalizeStaticPath(pathname: string): string {\n\tconst pathnameWithoutLeadingSlash = pathname.replace(/^\\/+/, \"\");\n\n\tif (pathnameWithoutLeadingSlash.length > 0) {\n\t\treturn pathnameWithoutLeadingSlash;\n\t}\n\n\treturn \"index.html\";\n}\n\nfunction isReadableFile(filePath: string): boolean {\n\treturn existsSync(filePath) && statSync(filePath).isFile();\n}\n\nfunction isApiRouteExports(value: unknown): value is ApiRouteExports {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction getApiRouteHandler(\n\trouteExports: ApiRouteExports,\n\tmethod: string,\n): ApiRouteHandler | undefined {\n\tif (method === \"GET\") {\n\t\treturn routeExports.GET;\n\t}\n\n\tif (method === \"POST\") {\n\t\treturn routeExports.POST;\n\t}\n\n\tif (method === \"PUT\") {\n\t\treturn routeExports.PUT;\n\t}\n\n\tif (method === \"PATCH\") {\n\t\treturn routeExports.PATCH;\n\t}\n\n\tif (method === \"DELETE\") {\n\t\treturn routeExports.DELETE;\n\t}\n\n\tif (method === \"HEAD\") {\n\t\treturn routeExports.HEAD;\n\t}\n\n\tif (method === \"OPTIONS\") {\n\t\treturn routeExports.OPTIONS;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Creates the Bun Tide adapter.\n * Handles static files, API routes, and page rendering.\n */\nexport function createBunAdapter(\n\tadapterConfig: TideAdapterConfig,\n\trenderConfig: RenderConfig,\n): TideAdapter {\n\tconst manifest = generateManifest(adapterConfig.appDir);\n\tconst searchDirectories = [adapterConfig.publicDir, adapterConfig.outDir];\n\n\tlet serverInstance: ReturnType<typeof Bun.serve> | undefined;\n\n\tasync function handle(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\t\tconst { pathname } = url;\n\t\tconst staticPathname = normalizeStaticPath(pathname);\n\n\t\tfor (const searchDirectory of searchDirectories) {\n\t\t\tconst filePath = join(searchDirectory, staticPathname);\n\n\t\t\tif (isReadableFile(filePath)) {\n\t\t\t\treturn new Response(readFileSync(filePath), {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": mimeForPath(filePath),\n\t\t\t\t\t\t\"Cache-Control\": \"public, max-age=31536000, immutable\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst apiRoutes = manifest.routes.filter((route) => route.kind === \"api\");\n\t\tconst apiMatch = matchRoute(pathname, apiRoutes);\n\n\t\tif (apiMatch) {\n\t\t\tconst modulePath = join(adapterConfig.appDir, apiMatch.entry.filePath);\n\n\t\t\tconst routeModule: unknown = await import(modulePath);\n\n\t\t\tif (!isApiRouteExports(routeModule)) {\n\t\t\t\treturn new Response(\"Invalid API route module\", {\n\t\t\t\t\tstatus: 500,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst handler = getApiRouteHandler(\n\t\t\t\trouteModule,\n\t\t\t\trequest.method.toUpperCase(),\n\t\t\t);\n\n\t\t\tif (!handler) {\n\t\t\t\treturn new Response(\"Method not allowed\", {\n\t\t\t\t\tstatus: 405,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn await handler(request);\n\t\t}\n\n\t\tconst resolvedRouteMode = resolveRouteMode(pathname, renderConfig);\n\n\t\tconst runtimeContext = createRuntimeContext(\n\t\t\trequest,\n\t\t\turl,\n\t\t\t{},\n\t\t\tresolvedRouteMode.mode,\n\t\t);\n\n\t\tconst renderResult = await render(\n\t\t\t{\n\t\t\t\troutePath: runtimeContext.pathname,\n\t\t\t\tmode: runtimeContext.resolvedMode,\n\t\t\t\tparams: runtimeContext.params,\n\t\t\t\tsearchParams: runtimeContext.searchParams,\n\t\t\t\trequestHeaders: runtimeContext.requestHeaders,\n\t\t\t\ttimestampMs: runtimeContext.timestampMs,\n\t\t\t},\n\t\t\t{\n\t\t\t\tappName: adapterConfig.appName,\n\t\t\t\ttitle: adapterConfig.seo.defaultTitle,\n\t\t\t\tdescription: adapterConfig.seo.defaultDescription,\n\t\t\t\tscriptPath: \"/app.js\",\n\t\t\t\tcssPath: \"/app.css\",\n\t\t\t\tlang: \"en\",\n\t\t\t},\n\t\t);\n\n\t\tif (renderResult.kind === \"failure\") {\n\t\t\treturn buildErrorResponse(renderResult.reason, renderResult.httpStatus);\n\t\t}\n\n\t\treturn buildHtmlResponse(renderResult.html, renderResult.httpStatus);\n\t}\n\n\treturn {\n\t\tkind: \"bun\",\n\t\thandle,\n\t\tstart: async (): Promise<void> => {\n\t\t\tserverInstance = Bun.serve({\n\t\t\t\tport: adapterConfig.port,\n\t\t\t\thostname: adapterConfig.host,\n\t\t\t\tfetch: handle,\n\t\t\t});\n\n\t\t\tconsole.log(\n\t\t\t\t`[Rakta.js Tide] Running at http://${adapterConfig.host}:${serverInstance.port}`,\n\t\t\t);\n\t\t},\n\t\tstop: (): void => {\n\t\t\tif (!serverInstance) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tserverInstance.stop();\n\t\t},\n\t};\n}\n",
6
6
  "import type {\n\tRenderConfig,\n\tRenderMode,\n\tRenderModeDescriptor,\n\tResolvedRouteMode,\n} from \"./types\";\n\nexport const RENDER_MODE_DESCRIPTORS: Readonly<\n\tRecord<RenderMode, RenderModeDescriptor>\n> = {\n\tcsr: {\n\t\tmode: \"csr\",\n\t\tlabel: \"Client-Side Rendering\",\n\t\tshortLabel: \"CSR\",\n\t\tdescription:\n\t\t\t\"React renders entirely in the browser. The server sends a minimal HTML shell with a JS bundle. No server required at runtime.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n\tssr: {\n\t\tmode: \"ssr\",\n\t\tlabel: \"Server-Side Rendering\",\n\t\tshortLabel: \"SSR\",\n\t\tdescription:\n\t\t\t\"React renders to HTML on the server per request. The client receives full HTML and then hydrates. Requires a running Node/Bun server.\",\n\t\tserverRequired: true,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tssg: {\n\t\tmode: \"ssg\",\n\t\tlabel: \"Static Site Generation\",\n\t\tshortLabel: \"SSG\",\n\t\tdescription:\n\t\t\t\"Pages are fully rendered at build time. Output is static HTML files. No server required at runtime.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: true,\n\t\tclientHydration: false,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tcsg: {\n\t\tmode: \"csg\",\n\t\tlabel: \"Client-Side Generation\",\n\t\tshortLabel: \"CSG\",\n\t\tdescription:\n\t\t\t\"A static shell is generated at build time, data is fetched and rendered on the client. Combines SSG speed with dynamic data.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: true,\n\t\tclientHydration: true,\n\t\troadmap: true, // Roadmap: v0.2.0\n\t},\n\tspa: {\n\t\tmode: \"spa\",\n\t\tlabel: \"Single Page Application\",\n\t\tshortLabel: \"SPA\",\n\t\tdescription:\n\t\t\t\"A single HTML entry point is served for all routes. React handles all routing client-side. Equivalent to a standard Vite SPA.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n\thybrid: {\n\t\tmode: \"hybrid\",\n\t\tlabel: \"Hybrid Rendering\",\n\t\tshortLabel: \"Hybrid\",\n\t\tdescription:\n\t\t\t\"Different routes use different render modes. Configured via the `render.routes` map in rakta.config.ts. The top-level mode is the fallback.\",\n\t\tserverRequired: false,\n\t\tbuildTimeGenerated: false,\n\t\tclientHydration: true,\n\t\troadmap: false,\n\t},\n};\n\n/**\n * Returns true if the pathname matches a given route pattern.\n * Supports exact paths and simple :param segments (e.g. /blog/:slug).\n */\nfunction pathMatchesPattern(pathname: string, pattern: string): boolean {\n\tif (pattern === pathname) return true;\n\n\tconst patternParts = pattern.split(\"/\");\n\tconst pathParts = pathname.split(\"/\");\n\n\tif (patternParts.length !== pathParts.length) return false;\n\n\tfor (let i = 0; i < patternParts.length; i++) {\n\t\tconst pp = patternParts[i];\n\t\tconst path = pathParts[i];\n\t\tif (pp === undefined || path === undefined) return false;\n\t\tif (pp.startsWith(\":\")) continue; // dynamic segment — always matches\n\t\tif (pp !== path) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Resolves the render mode for the given pathname using the provided config.\n * Route-specific overrides take priority. The most specific (longest) matching\n * pattern wins. Falls back to `config.defaultMode`.\n */\nexport function resolveRouteMode(\n\tpathname: string,\n\tconfig: RenderConfig,\n): ResolvedRouteMode {\n\tconst patterns = Object.keys(config.routes).sort(\n\t\t(a, b) => b.length - a.length, // longest pattern first (most specific)\n\t);\n\n\tfor (const pattern of patterns) {\n\t\tconst overrideMode = config.routes[pattern];\n\t\tif (overrideMode !== undefined && pathMatchesPattern(pathname, pattern)) {\n\t\t\treturn {\n\t\t\t\troutePath: pathname,\n\t\t\t\tmode: overrideMode,\n\t\t\t\tsource: \"route-override\",\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\troutePath: pathname,\n\t\tmode: config.defaultMode,\n\t\tsource: \"default\",\n\t};\n}\n\nexport function getModeDescriptor(mode: RenderMode): RenderModeDescriptor {\n\treturn RENDER_MODE_DESCRIPTORS[mode];\n}\n\nexport function isRoadmapMode(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].roadmap;\n}\n\nexport function requiresServer(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].serverRequired;\n}\n\nexport function isBuildTimeMode(mode: RenderMode): boolean {\n\treturn RENDER_MODE_DESCRIPTORS[mode].buildTimeGenerated;\n}\n",
7
- "import { isRoadmapMode } from \"./modes\";\nimport type {\n\tRenderContext,\n\tRenderFailure,\n\tRenderMode,\n\tRenderResult,\n\tRenderSuccess,\n} from \"./types\";\n\nexport interface RendererOptions {\n\treadonly appName: string;\n\treadonly scriptPath: string;\n\treadonly cssPath: string;\n\treadonly lang: string;\n}\n\nfunction buildHtmlShell(options: RendererOptions): string {\n\treturn `\n <!DOCTYPE html>\n <html lang=\"${options.lang}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>\n ${options.appName}\n </title>\n <link rel=\"stylesheet\" href=\"${options.cssPath}\" />\n </head>\n <body>\n <div id=\"rakta-root\"></div>\n <script type=\"module\" src=\"${options.scriptPath}\"></script>\n </body>\n </html>`;\n}\n\nfunction makeSuccess(\n\thtml: string,\n\tmode: RenderMode,\n\trenderMs: number,\n\thttpStatus: number = 200,\n\tfromCache: boolean = false,\n): RenderSuccess {\n\treturn {\n\t\tkind: \"success\",\n\t\thtml,\n\t\tmode,\n\t\thttpStatus,\n\t\tresponseHeaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\tfromCache,\n\t\trenderMs,\n\t};\n}\n\nfunction makeFailure(\n\treason: string,\n\tmode: RenderMode,\n\thttpStatus: number = 500,\n): RenderFailure {\n\treturn { kind: \"failure\", reason, mode, httpStatus };\n}\n\n/**\n * Render a page using the resolved mode from the context.\n * Roadmap modes (ssr, ssg, csg) fall back to a CSR shell in v0.1.0.\n */\nexport async function render(\n\tcontext: RenderContext,\n\toptions: RendererOptions,\n): Promise<RenderResult> {\n\tconst startMs = Date.now();\n\n\t// Roadmap modes: fall back to CSR shell with a warning\n\tif (isRoadmapMode(context.mode)) {\n\t\tconsole.warn(\n\t\t\t`[Rakta.js] Render mode \"${context.mode}\" is a roadmap feature (v0.2.0). ` +\n\t\t\t\t`Falling back to CSR for: ${context.routePath}`,\n\t\t);\n\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\t}\n\n\tswitch (context.mode) {\n\t\tcase \"csr\":\n\t\tcase \"spa\":\n\t\t\treturn makeSuccess(\n\t\t\t\tbuildHtmlShell(options),\n\t\t\t\tcontext.mode,\n\t\t\t\tDate.now() - startMs,\n\t\t\t);\n\n\t\tcase \"hybrid\":\n\t\t\t// Hybrid resolution happens upstream in Tide. If it reaches the renderer\n\t\t\t// as hybrid, the route had no specific override - fall back to CSR.\n\t\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\n\t\tcase \"ssr\":\n\t\tcase \"ssg\":\n\t\tcase \"csg\":\n\t\t\t// These are already caught by isRoadmapMode above, but TypeScript\n\t\t\t// requires an exhaustive switch for the RenderMode union.\n\t\t\treturn makeFailure(\n\t\t\t\t`Render mode \"${context.mode}\" is not yet implemented.`,\n\t\t\t\tcontext.mode,\n\t\t\t\t501,\n\t\t\t);\n\t}\n}\n\nexport function renderNotFound(options: RendererOptions): RenderSuccess {\n\treturn makeSuccess(buildHtmlShell(options), \"csr\", 0, 404);\n}\n\nexport function renderServerError(\n\treason: string,\n\tmode: RenderMode,\n): RenderFailure {\n\treturn makeFailure(reason, mode, 500);\n}\n",
7
+ "import { isRoadmapMode } from \"./modes\";\nimport type {\n\tRenderContext,\n\tRenderFailure,\n\tRenderMode,\n\tRenderResult,\n\tRenderSuccess,\n} from \"./types\";\n\nexport interface RendererOptions {\n\treadonly appName: string;\n\treadonly title?: string | undefined;\n\treadonly description?: string | undefined;\n\treadonly faviconPath?: string | undefined;\n\treadonly scriptPath: string;\n\treadonly cssPath: string;\n\treadonly lang: string;\n}\n\nfunction buildHtmlShell(options: RendererOptions): string {\n\tconst title = options.title ?? options.appName;\n\tconst faviconPath = options.faviconPath ?? \"/favicon.ico\";\n\tconst descriptionMeta =\n\t\toptions.description !== undefined\n\t\t\t? `<meta name=\"description\" content=\"${options.description}\" />`\n\t\t\t: \"\";\n\n\treturn `\n <!DOCTYPE html>\n <html lang=\"${options.lang}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${title}</title>\n ${descriptionMeta}\n <link rel=\"icon\" href=\"${faviconPath}\" sizes=\"any\" />\n <link rel=\"stylesheet\" href=\"${options.cssPath}\" />\n </head>\n <body>\n <div id=\"rakta-root\"></div>\n <script type=\"module\" src=\"${options.scriptPath}\"></script>\n </body>\n </html>`;\n}\n\nfunction makeSuccess(\n\thtml: string,\n\tmode: RenderMode,\n\trenderMs: number,\n\thttpStatus: number = 200,\n\tfromCache: boolean = false,\n): RenderSuccess {\n\treturn {\n\t\tkind: \"success\",\n\t\thtml,\n\t\tmode,\n\t\thttpStatus,\n\t\tresponseHeaders: { \"Content-Type\": \"text/html; charset=utf-8\" },\n\t\tfromCache,\n\t\trenderMs,\n\t};\n}\n\nfunction makeFailure(\n\treason: string,\n\tmode: RenderMode,\n\thttpStatus: number = 500,\n): RenderFailure {\n\treturn { kind: \"failure\", reason, mode, httpStatus };\n}\n\n/**\n * Render a page using the resolved mode from the context.\n * Roadmap modes (ssr, ssg, csg) fall back to a CSR shell in v0.1.0.\n */\nexport async function render(\n\tcontext: RenderContext,\n\toptions: RendererOptions,\n): Promise<RenderResult> {\n\tconst startMs = Date.now();\n\n\t// Roadmap modes: fall back to CSR shell with a warning\n\tif (isRoadmapMode(context.mode)) {\n\t\tconsole.warn(\n\t\t\t`[Rakta.js] Render mode \"${context.mode}\" is a roadmap feature (v0.2.0). ` +\n\t\t\t\t`Falling back to CSR for: ${context.routePath}`,\n\t\t);\n\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\t}\n\n\tswitch (context.mode) {\n\t\tcase \"csr\":\n\t\tcase \"spa\":\n\t\t\treturn makeSuccess(\n\t\t\t\tbuildHtmlShell(options),\n\t\t\t\tcontext.mode,\n\t\t\t\tDate.now() - startMs,\n\t\t\t);\n\n\t\tcase \"hybrid\":\n\t\t\t// Hybrid resolution happens upstream in Tide. If it reaches the renderer\n\t\t\t// as hybrid, the route had no specific override - fall back to CSR.\n\t\t\treturn makeSuccess(buildHtmlShell(options), \"csr\", Date.now() - startMs);\n\n\t\tcase \"ssr\":\n\t\tcase \"ssg\":\n\t\tcase \"csg\":\n\t\t\t// These are already caught by isRoadmapMode above, but TypeScript\n\t\t\t// requires an exhaustive switch for the RenderMode union.\n\t\t\treturn makeFailure(\n\t\t\t\t`Render mode \"${context.mode}\" is not yet implemented.`,\n\t\t\t\tcontext.mode,\n\t\t\t\t501,\n\t\t\t);\n\t}\n}\n\nexport function renderNotFound(options: RendererOptions): RenderSuccess {\n\treturn makeSuccess(buildHtmlShell(options), \"csr\", 0, 404);\n}\n\nexport function renderServerError(\n\treason: string,\n\tmode: RenderMode,\n): RenderFailure {\n\treturn makeFailure(reason, mode, 500);\n}\n",
8
8
  "import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport type { RouteKind, RouteManifestEntry, RouteSegment } from \"./types.js\";\n\nconst FILE_TO_KIND: Record<string, RouteKind> = {\n\t\"page.tsx\": \"page\",\n\t\"page.ts\": \"page\",\n\t\"page.jsx\": \"page\",\n\t\"page.js\": \"page\",\n\t\"layout.tsx\": \"layout\",\n\t\"layout.ts\": \"layout\",\n\t\"layout.jsx\": \"layout\",\n\t\"layout.js\": \"layout\",\n\t\"loading.tsx\": \"loading\",\n\t\"loading.ts\": \"loading\",\n\t\"loading.jsx\": \"loading\",\n\t\"loading.js\": \"loading\",\n\t\"notFound.tsx\": \"notFound\",\n\t\"notFound.ts\": \"notFound\",\n\t\"notFound.jsx\": \"notFound\",\n\t\"notFound.js\": \"notFound\",\n\t\"error.tsx\": \"error\",\n\t\"error.ts\": \"error\",\n\t\"error.jsx\": \"error\",\n\t\"error.js\": \"error\",\n\t\"route.ts\": \"api\",\n\t\"route.js\": \"api\",\n};\n\nfunction parseSegment(raw: string): RouteSegment {\n\tconst isDynamic = raw.startsWith(\"[\") && raw.endsWith(\"]\");\n\tconst paramName = isDynamic ? raw.slice(1, -1) : \"\";\n\n\treturn { raw, isDynamic, paramName };\n}\n\nfunction collectParamNames(segments: RouteSegment[]): string[] {\n\treturn segments\n\t\t.filter((segment) => segment.isDynamic && segment.paramName.length > 0)\n\t\t.map((segment) => segment.paramName);\n}\n\nfunction segmentsToUrlPattern(segments: RouteSegment[]): string {\n\tif (segments.length === 0) return \"/\";\n\tconst parts = segments.map((segment) =>\n\t\tsegment.isDynamic && segment.paramName\n\t\t\t? `:${segment.paramName}`\n\t\t\t: segment.raw,\n\t);\n\treturn `/${parts.join(\"/\")}`;\n}\n\nfunction scanDirectory(\n\tdirPath: string,\n\tappRoot: string,\n\tresults: RouteManifestEntry[],\n): void {\n\tif (!existsSync(dirPath)) return;\n\n\tconst entries = readdirSync(dirPath);\n\n\tfor (const entryName of entries) {\n\t\tconst fullPath = join(dirPath, entryName);\n\t\tconst stats = statSync(fullPath);\n\n\t\tif (stats.isDirectory()) {\n\t\t\tscanDirectory(fullPath, appRoot, results);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!stats.isFile()) continue;\n\n\t\tconst kind = FILE_TO_KIND[entryName];\n\t\tif (!kind) continue;\n\n\t\t// Get path relative to app root, using forward slashes\n\t\tconst relativePath = relative(appRoot, fullPath).replace(/\\\\/g, \"/\");\n\n\t\t// Extract directory segments (all parts except the filename)\n\t\tconst dirRelative = relative(appRoot, dirPath).replace(/\\\\/g, \"/\");\n\t\tconst rawSegments = dirRelative === \"\" ? [] : dirRelative.split(\"/\");\n\n\t\tconst segments: RouteSegment[] = rawSegments.map(parseSegment);\n\t\tconst urlPattern = segmentsToUrlPattern(segments);\n\t\tconst paramNames = collectParamNames(segments);\n\t\tconst isDynamic = paramNames.length > 0;\n\n\t\tresults.push({\n\t\t\tfilePath: relativePath,\n\t\t\turlPattern,\n\t\t\tkind,\n\t\t\tsegments,\n\t\t\tisDynamic,\n\t\t\tparamNames,\n\t\t});\n\t}\n}\n\nexport interface ScanOptions {\n\tappDir: string;\n}\n\nexport function scanRoutes(options: ScanOptions): RouteManifestEntry[] {\n\tconst results: RouteManifestEntry[] = [];\n\tscanDirectory(options.appDir, options.appDir, results);\n\n\t// Sort: static routes before dynamic, shorter patterns first\n\tresults.sort((routeA, routeB) => {\n\t\tif (routeA.isDynamic !== routeB.isDynamic) {\n\t\t\treturn routeA.isDynamic ? 1 : -1;\n\t\t}\n\t\treturn routeA.urlPattern.localeCompare(routeB.urlPattern);\n\t});\n\n\treturn results;\n}\n",
9
9
  "import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { scanRoutes } from \"./scanner\";\nimport type { RouteManifest } from \"./types\";\n\nexport function generateManifest(appDir: string): RouteManifest {\n\tconst routes = scanRoutes({ appDir });\n\n\tconst manifest: RouteManifest = {\n\t\tversion: \"1\",\n\t\tgeneratedAt: new Date().toISOString(),\n\t\troutes,\n\t};\n\n\treturn manifest;\n}\n\nexport function writeManifest(\n\tmanifest: RouteManifest,\n\toutputPath: string,\n): void {\n\twriteFileSync(outputPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n}\n\nexport function readManifest(manifestPath: string): RouteManifest | null {\n\tif (!existsSync(manifestPath)) return null;\n\n\tconst raw = readFileSync(manifestPath, \"utf-8\");\n\n\tconst parsed: unknown = JSON.parse(raw);\n\tif (\n\t\ttypeof parsed !== \"object\" ||\n\t\tparsed === null ||\n\t\t!(\"version\" in parsed) ||\n\t\t!(\"routes\" in parsed)\n\t) {\n\t\treturn null;\n\t}\n\n\treturn parsed as RouteManifest;\n}\n\nexport function printManifest(manifest: RouteManifest): void {\n\tconst pageRoutes = manifest.routes.filter((route) => route.kind === \"page\");\n\tconst apiRoutes = manifest.routes.filter((route) => route.kind === \"api\");\n\tconst layoutRoutes = manifest.routes.filter(\n\t\t(route) => route.kind === \"layout\",\n\t);\n\tconst specialRoutes = manifest.routes.filter((route) =>\n\t\t[\"loading\", \"not-found\", \"error\"].includes(route.kind),\n\t);\n\n\tconst line = \"─\".repeat(56);\n\n\tconsole.log(`\\n Rakta.js Route Manifest`);\n\tconsole.log(` ${line}`);\n\tconsole.log(` Generated: ${manifest.generatedAt}`);\n\tconsole.log(` Total: ${manifest.routes.length} routes\\n`);\n\n\tif (pageRoutes.length > 0) {\n\t\tconsole.log(\" Pages:\");\n\t\tfor (const route of pageRoutes) {\n\t\t\tconst dynamic = route.isDynamic\n\t\t\t\t? ` [params: ${route.paramNames.join(\", \")}]`\n\t\t\t\t: \"\";\n\t\t\tconsole.log(` GET ${route.urlPattern}${dynamic}`);\n\t\t}\n\t\tconsole.log(\"\");\n\t}\n\n\tif (apiRoutes.length > 0) {\n\t\tconsole.log(\" API Routes:\");\n\t\tfor (const route of apiRoutes) {\n\t\t\tconst dynamic = route.isDynamic\n\t\t\t\t? ` [params: ${route.paramNames.join(\", \")}]`\n\t\t\t\t: \"\";\n\t\t\tconsole.log(` ANY ${route.urlPattern}${dynamic}`);\n\t\t}\n\t\tconsole.log(\"\");\n\t}\n\n\tif (layoutRoutes.length > 0) {\n\t\tconsole.log(\" Layouts:\");\n\t\tfor (const route of layoutRoutes) {\n\t\t\tconsole.log(\n\t\t\t\t` ${route.urlPattern === \"/\" ? \"root\" : route.urlPattern}`,\n\t\t\t);\n\t\t}\n\t\tconsole.log(\"\");\n\t}\n\n\tif (specialRoutes.length > 0) {\n\t\tconsole.log(\" Special:\");\n\t\tfor (const route of specialRoutes) {\n\t\t\tconsole.log(` [${route.kind}] ${route.filePath}`);\n\t\t}\n\t\tconsole.log(\"\");\n\t}\n\n\tconsole.log(` ${line}\\n`);\n}\n",
10
10
  "import type {\n\tMatchedRoute,\n\tRouteManifestEntry,\n\tRouteSegment,\n} from \"./types.js\";\n\nfunction escapeRegex(text: string): string {\n\treturn text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildPatternRegex(segments: RouteSegment[]): {\n\tregex: RegExp;\n\tparamNames: string[];\n} {\n\tconst paramNames: string[] = [];\n\n\tconst parts = segments.map((segment) => {\n\t\tif (segment.isDynamic && segment.paramName) {\n\t\t\tparamNames.push(segment.paramName);\n\t\t\t// Match any non-slash sequence for the param\n\t\t\treturn \"([^/]+)\";\n\t\t}\n\t\treturn escapeRegex(segment.raw);\n\t});\n\n\tconst pattern = parts.length === 0 ? \"\" : `/${parts.join(\"/\")}`;\n\tconst regex = new RegExp(`^${pattern || \"/\"}$`);\n\n\treturn { regex, paramNames };\n}\n\nexport function matchRoute(\n\tpathname: string,\n\troutes: RouteManifestEntry[],\n): MatchedRoute | null {\n\t// Normalize pathname: strip trailing slash unless root\n\tconst normalized =\n\t\tpathname !== \"/\" && pathname.endsWith(\"/\")\n\t\t\t? pathname.slice(0, -1)\n\t\t\t: pathname;\n\n\tfor (const entry of routes) {\n\t\t// Only match pages and api routes\n\t\tif (entry.kind !== \"page\" && entry.kind !== \"api\") continue;\n\n\t\tconst { regex, paramNames } = buildPatternRegex(entry.segments);\n\t\tconst match = regex.exec(normalized);\n\n\t\tif (!match) continue;\n\n\t\tconst params: Record<string, string> = {};\n\t\tparamNames.forEach((name, index) => {\n\t\t\tconst captured = match[index + 1];\n\t\t\tif (captured !== undefined) {\n\t\t\t\tparams[name] = decodeURIComponent(captured);\n\t\t\t}\n\t\t});\n\n\t\treturn { entry, params };\n\t}\n\n\treturn null;\n}\n\nexport function findLayoutsForPathname(\n\tpathname: string,\n\troutes: RouteManifestEntry[],\n): RouteManifestEntry[] {\n\tconst layoutRoutes = routes.filter((route) => route.kind === \"layout\");\n\n\treturn layoutRoutes.filter((layout) => {\n\t\tif (layout.urlPattern === \"/\") return true;\n\t\treturn (\n\t\t\tpathname === layout.urlPattern ||\n\t\t\tpathname.startsWith(`${layout.urlPattern}/`)\n\t\t);\n\t});\n}\n\nexport function findSpecialRoute(\n\tkind: \"loading\" | \"not-found\" | \"error\",\n\tpathname: string,\n\troutes: RouteManifestEntry[],\n): RouteManifestEntry | null {\n\tconst candidates = routes.filter((route) => route.kind === kind);\n\n\t// Find the most specific match (longest matching prefix)\n\tlet best: RouteManifestEntry | null = null;\n\tlet bestLength = -1;\n\n\tfor (const candidate of candidates) {\n\t\tconst prefix = candidate.urlPattern === \"/\" ? \"\" : candidate.urlPattern;\n\t\tif (pathname.startsWith(prefix) && prefix.length > bestLength) {\n\t\t\tbest = candidate;\n\t\t\tbestLength = prefix.length;\n\t\t}\n\t}\n\n\treturn best;\n}\n",
11
11
  "import type { RenderMode } from \"rakta/render\";\nimport type { TideRuntimeContext } from \"./types\";\n\nexport function createRuntimeContext(\n\trequest: Request,\n\turl: URL,\n\tparams: Readonly<Record<string, string>>,\n\tresolvedMode: RenderMode,\n): TideRuntimeContext {\n\tconst searchParams: Record<string, string> = {};\n\turl.searchParams.forEach((value, key) => {\n\t\tsearchParams[key] = value;\n\t});\n\n\tconst requestHeaders: Record<string, string> = {};\n\trequest.headers.forEach((value, key) => {\n\t\trequestHeaders[key] = value;\n\t});\n\n\treturn {\n\t\turl,\n\t\tparams,\n\t\trequest,\n\t\tsearchParams,\n\t\tresolvedMode,\n\t\trequestHeaders,\n\t\tpathname: url.pathname,\n\t\ttimestampMs: Date.now(),\n\t\tmethod: request.method.toUpperCase(),\n\t};\n}\n\nexport function buildTextResponse(\n\tbody: string,\n\tstatus: number,\n\theaders: Record<string, string>,\n): Response {\n\treturn new Response(body, { status, headers });\n}\n\nexport function buildHtmlResponse(\n\thtml: string,\n\tstatus: number = 200,\n): Response {\n\treturn buildTextResponse(html, status, {\n\t\t\"Content-Type\": \"text/html; charset=utf-8\",\n\t});\n}\n\nexport function buildJsonResponse(\n\tresponseData: Record<string, string | number | boolean | object>,\n\tstatus: number = 200,\n): Response {\n\treturn buildTextResponse(JSON.stringify(responseData), status, {\n\t\t\"Content-Type\": \"application/json; charset=utf-8\",\n\t});\n}\n\nexport function buildErrorResponse(\n\terrorMessage: string,\n\tstatus: number = 500,\n): Response {\n\treturn buildJsonResponse({ error: errorMessage }, status);\n}\n"
12
12
  ],
13
- "mappings": ";;AAAA,uBAAS,uCAA0B;AACnC,iBAAS;;;ACMF,IAAM,0BAET;AAAA,EACH,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,aACC;AAAA,IACD,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACV;AACD;AAMA,SAAS,kBAAkB,CAAC,UAAkB,SAA0B;AAAA,EACvE,IAAI,YAAY;AAAA,IAAU,OAAO;AAAA,EAEjC,MAAM,eAAe,QAAQ,MAAM,GAAG;AAAA,EACtC,MAAM,YAAY,SAAS,MAAM,GAAG;AAAA,EAEpC,IAAI,aAAa,WAAW,UAAU;AAAA,IAAQ,OAAO;AAAA,EAErD,SAAS,IAAI,EAAG,IAAI,aAAa,QAAQ,KAAK;AAAA,IAC7C,MAAM,KAAK,aAAa;AAAA,IACxB,MAAM,OAAO,UAAU;AAAA,IACvB,IAAI,OAAO,aAAa,SAAS;AAAA,MAAW,OAAO;AAAA,IACnD,IAAI,GAAG,WAAW,GAAG;AAAA,MAAG;AAAA,IACxB,IAAI,OAAO;AAAA,MAAM,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO;AAAA;AAQD,SAAS,gBAAgB,CAC/B,UACA,QACoB;AAAA,EACpB,MAAM,WAAW,OAAO,KAAK,OAAO,MAAM,EAAE,KAC3C,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MACxB;AAAA,EAEA,WAAW,WAAW,UAAU;AAAA,IAC/B,MAAM,eAAe,OAAO,OAAO;AAAA,IACnC,IAAI,iBAAiB,aAAa,mBAAmB,UAAU,OAAO,GAAG;AAAA,MACxE,OAAO;AAAA,QACN,WAAW;AAAA,QACX,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN,WAAW;AAAA,IACX,MAAM,OAAO;AAAA,IACb,QAAQ;AAAA,EACT;AAAA;AAOM,SAAS,aAAa,CAAC,MAA2B;AAAA,EACxD,OAAO,wBAAwB,MAAM;AAAA;;ACzHtC,SAAS,cAAc,CAAC,SAAkC;AAAA,EACzD,OAAO;AAAA;AAAA,kBAEU,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKR,QAAQ;AAAA;AAAA,2CAEiB,QAAQ;AAAA;AAAA;AAAA;AAAA,yCAIV,QAAQ;AAAA;AAAA;AAAA;AAKjD,SAAS,WAAW,CACnB,MACA,MACA,UACA,aAAqB,KACrB,YAAqB,OACL;AAAA,EAChB,OAAO;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,EAAE,gBAAgB,2BAA2B;AAAA,IAC9D;AAAA,IACA;AAAA,EACD;AAAA;AAGD,SAAS,WAAW,CACnB,QACA,MACA,aAAqB,KACL;AAAA,EAChB,OAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,WAAW;AAAA;AAOpD,eAAsB,MAAM,CAC3B,SACA,SACwB;AAAA,EACxB,MAAM,UAAU,KAAK,IAAI;AAAA,EAGzB,IAAI,cAAc,QAAQ,IAAI,GAAG;AAAA,IAChC,QAAQ,KACP,2BAA2B,QAAQ,0CAClC,4BAA4B,QAAQ,WACtC;AAAA,IACA,OAAO,YAAY,eAAe,OAAO,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO;AAAA,EACxE;AAAA,EAEA,QAAQ,QAAQ;AAAA,SACV;AAAA,SACA;AAAA,MACJ,OAAO,YACN,eAAe,OAAO,GACtB,QAAQ,MACR,KAAK,IAAI,IAAI,OACd;AAAA,SAEI;AAAA,MAGJ,OAAO,YAAY,eAAe,OAAO,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO;AAAA,SAEnE;AAAA,SACA;AAAA,SACA;AAAA,MAGJ,OAAO,YACN,gBAAgB,QAAQ,iCACxB,QAAQ,MACR,GACD;AAAA;AAAA;;ACvGH;AACA;AAGA,IAAM,eAA0C;AAAA,EAC/C,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACb;AAEA,SAAS,YAAY,CAAC,KAA2B;AAAA,EAChD,MAAM,YAAY,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG;AAAA,EACzD,MAAM,YAAY,YAAY,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,EAEjD,OAAO,EAAE,KAAK,WAAW,UAAU;AAAA;AAGpC,SAAS,iBAAiB,CAAC,UAAoC;AAAA,EAC9D,OAAO,SACL,OAAO,CAAC,YAAY,QAAQ,aAAa,QAAQ,UAAU,SAAS,CAAC,EACrE,IAAI,CAAC,YAAY,QAAQ,SAAS;AAAA;AAGrC,SAAS,oBAAoB,CAAC,UAAkC;AAAA,EAC/D,IAAI,SAAS,WAAW;AAAA,IAAG,OAAO;AAAA,EAClC,MAAM,QAAQ,SAAS,IAAI,CAAC,YAC3B,QAAQ,aAAa,QAAQ,YAC1B,IAAI,QAAQ,cACZ,QAAQ,GACZ;AAAA,EACA,OAAO,IAAI,MAAM,KAAK,GAAG;AAAA;AAG1B,SAAS,aAAa,CACrB,SACA,SACA,SACO;AAAA,EACP,IAAI,CAAC,WAAW,OAAO;AAAA,IAAG;AAAA,EAE1B,MAAM,UAAU,YAAY,OAAO;AAAA,EAEnC,WAAW,aAAa,SAAS;AAAA,IAChC,MAAM,WAAW,KAAK,SAAS,SAAS;AAAA,IACxC,MAAM,QAAQ,SAAS,QAAQ;AAAA,IAE/B,IAAI,MAAM,YAAY,GAAG;AAAA,MACxB,cAAc,UAAU,SAAS,OAAO;AAAA,MACxC;AAAA,IACD;AAAA,IAEA,IAAI,CAAC,MAAM,OAAO;AAAA,MAAG;AAAA,IAErB,MAAM,OAAO,aAAa;AAAA,IAC1B,IAAI,CAAC;AAAA,MAAM;AAAA,IAGX,MAAM,eAAe,SAAS,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAAA,IAGnE,MAAM,cAAc,SAAS,SAAS,OAAO,EAAE,QAAQ,OAAO,GAAG;AAAA,IACjE,MAAM,cAAc,gBAAgB,KAAK,CAAC,IAAI,YAAY,MAAM,GAAG;AAAA,IAEnE,MAAM,WAA2B,YAAY,IAAI,YAAY;AAAA,IAC7D,MAAM,aAAa,qBAAqB,QAAQ;AAAA,IAChD,MAAM,aAAa,kBAAkB,QAAQ;AAAA,IAC7C,MAAM,YAAY,WAAW,SAAS;AAAA,IAEtC,QAAQ,KAAK;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAOM,SAAS,UAAU,CAAC,SAA4C;AAAA,EACtE,MAAM,UAAgC,CAAC;AAAA,EACvC,cAAc,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAAA,EAGrD,QAAQ,KAAK,CAAC,QAAQ,WAAW;AAAA,IAChC,IAAI,OAAO,cAAc,OAAO,WAAW;AAAA,MAC1C,OAAO,OAAO,YAAY,IAAI;AAAA,IAC/B;AAAA,IACA,OAAO,OAAO,WAAW,cAAc,OAAO,UAAU;AAAA,GACxD;AAAA,EAED,OAAO;AAAA;;;AC9GD,SAAS,gBAAgB,CAAC,QAA+B;AAAA,EAC/D,MAAM,SAAS,WAAW,EAAE,OAAO,CAAC;AAAA,EAEpC,MAAM,WAA0B;AAAA,IAC/B,SAAS;AAAA,IACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,IACpC;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;;ACPR,SAAS,WAAW,CAAC,MAAsB;AAAA,EAC1C,OAAO,KAAK,QAAQ,uBAAuB,MAAM;AAAA;AAGlD,SAAS,iBAAiB,CAAC,UAGzB;AAAA,EACD,MAAM,aAAuB,CAAC;AAAA,EAE9B,MAAM,QAAQ,SAAS,IAAI,CAAC,YAAY;AAAA,IACvC,IAAI,QAAQ,aAAa,QAAQ,WAAW;AAAA,MAC3C,WAAW,KAAK,QAAQ,SAAS;AAAA,MAEjC,OAAO;AAAA,IACR;AAAA,IACA,OAAO,YAAY,QAAQ,GAAG;AAAA,GAC9B;AAAA,EAED,MAAM,UAAU,MAAM,WAAW,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG;AAAA,EAC5D,MAAM,QAAQ,IAAI,OAAO,IAAI,WAAW,MAAM;AAAA,EAE9C,OAAO,EAAE,OAAO,WAAW;AAAA;AAGrB,SAAS,UAAU,CACzB,UACA,QACsB;AAAA,EAEtB,MAAM,aACL,aAAa,OAAO,SAAS,SAAS,GAAG,IACtC,SAAS,MAAM,GAAG,EAAE,IACpB;AAAA,EAEJ,WAAW,SAAS,QAAQ;AAAA,IAE3B,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,MAAO;AAAA,IAEnD,QAAQ,OAAO,eAAe,kBAAkB,MAAM,QAAQ;AAAA,IAC9D,MAAM,QAAQ,MAAM,KAAK,UAAU;AAAA,IAEnC,IAAI,CAAC;AAAA,MAAO;AAAA,IAEZ,MAAM,SAAiC,CAAC;AAAA,IACxC,WAAW,QAAQ,CAAC,MAAM,UAAU;AAAA,MACnC,MAAM,WAAW,MAAM,QAAQ;AAAA,MAC/B,IAAI,aAAa,WAAW;AAAA,QAC3B,OAAO,QAAQ,mBAAmB,QAAQ;AAAA,MAC3C;AAAA,KACA;AAAA,IAED,OAAO,EAAE,OAAO,OAAO;AAAA,EACxB;AAAA,EAEA,OAAO;AAAA;;AC1DD,SAAS,oBAAoB,CACnC,SACA,KACA,QACA,cACqB;AAAA,EACrB,MAAM,eAAuC,CAAC;AAAA,EAC9C,IAAI,aAAa,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACxC,aAAa,OAAO;AAAA,GACpB;AAAA,EAED,MAAM,iBAAyC,CAAC;AAAA,EAChD,QAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACvC,eAAe,OAAO;AAAA,GACtB;AAAA,EAED,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,IAAI;AAAA,IACd,aAAa,KAAK,IAAI;AAAA,IACtB,QAAQ,QAAQ,OAAO,YAAY;AAAA,EACpC;AAAA;AAGM,SAAS,iBAAiB,CAChC,MACA,QACA,SACW;AAAA,EACX,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA;AAGvC,SAAS,iBAAiB,CAChC,MACA,SAAiB,KACN;AAAA,EACX,OAAO,kBAAkB,MAAM,QAAQ;AAAA,IACtC,gBAAgB;AAAA,EACjB,CAAC;AAAA;AAGK,SAAS,iBAAiB,CAChC,cACA,SAAiB,KACN;AAAA,EACX,OAAO,kBAAkB,KAAK,UAAU,YAAY,GAAG,QAAQ;AAAA,IAC9D,gBAAgB;AAAA,EACjB,CAAC;AAAA;AAGK,SAAS,kBAAkB,CACjC,cACA,SAAiB,KACN;AAAA,EACX,OAAO,kBAAkB,EAAE,OAAO,aAAa,GAAG,MAAM;AAAA;;;ANnDzD,IAAM,oBAAsD;AAAA,EAC3D,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AACX;AAcA,SAAS,WAAW,CAAC,UAA0B;AAAA,EAC9C,MAAM,iBAAiB,SAAS,YAAY,GAAG;AAAA,EAE/C,IAAI,iBAAiB,GAAG;AAAA,IACvB,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,YAAY,SAAS,MAAM,cAAc,EAAE,YAAY;AAAA,EAE7D,OAAO,kBAAkB,cAAc;AAAA;AAGxC,SAAS,mBAAmB,CAAC,UAA0B;AAAA,EACtD,MAAM,8BAA8B,SAAS,QAAQ,QAAQ,EAAE;AAAA,EAE/D,IAAI,4BAA4B,SAAS,GAAG;AAAA,IAC3C,OAAO;AAAA,EACR;AAAA,EAEA,OAAO;AAAA;AAGR,SAAS,cAAc,CAAC,UAA2B;AAAA,EAClD,OAAO,YAAW,QAAQ,KAAK,UAAS,QAAQ,EAAE,OAAO;AAAA;AAG1D,SAAS,iBAAiB,CAAC,OAA0C;AAAA,EACpE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAChD,OAAO;AAAA,EACR;AAAA,EAEA,OAAO;AAAA;AAGR,SAAS,kBAAkB,CAC1B,cACA,QAC8B;AAAA,EAC9B,IAAI,WAAW,OAAO;AAAA,IACrB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAAQ;AAAA,IACtB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,OAAO;AAAA,IACrB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,SAAS;AAAA,IACvB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,UAAU;AAAA,IACxB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAAQ;AAAA,IACtB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,WAAW;AAAA,IACzB,OAAO,aAAa;AAAA,EACrB;AAAA,EAEA;AAAA;AAOM,SAAS,gBAAgB,CAC/B,eACA,cACc;AAAA,EACd,MAAM,WAAW,iBAAiB,cAAc,MAAM;AAAA,EACtD,MAAM,oBAAoB,CAAC,cAAc,WAAW,cAAc,MAAM;AAAA,EAExE,IAAI;AAAA,EAEJ,eAAe,MAAM,CAAC,SAAqC;AAAA,IAC1D,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC/B,QAAQ,aAAa;AAAA,IACrB,MAAM,iBAAiB,oBAAoB,QAAQ;AAAA,IAEnD,WAAW,mBAAmB,mBAAmB;AAAA,MAChD,MAAM,WAAW,MAAK,iBAAiB,cAAc;AAAA,MAErD,IAAI,eAAe,QAAQ,GAAG;AAAA,QAC7B,OAAO,IAAI,SAAS,aAAa,QAAQ,GAAG;AAAA,UAC3C,SAAS;AAAA,YACR,gBAAgB,YAAY,QAAQ;AAAA,YACpC,iBAAiB;AAAA,UAClB;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IAEA,MAAM,YAAY,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK;AAAA,IACxE,MAAM,WAAW,WAAW,UAAU,SAAS;AAAA,IAE/C,IAAI,UAAU;AAAA,MACb,MAAM,aAAa,MAAK,cAAc,QAAQ,SAAS,MAAM,QAAQ;AAAA,MAErE,MAAM,cAAuB,MAAa;AAAA,MAE1C,IAAI,CAAC,kBAAkB,WAAW,GAAG;AAAA,QACpC,OAAO,IAAI,SAAS,4BAA4B;AAAA,UAC/C,QAAQ;AAAA,QACT,CAAC;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,mBACf,aACA,QAAQ,OAAO,YAAY,CAC5B;AAAA,MAEA,IAAI,CAAC,SAAS;AAAA,QACb,OAAO,IAAI,SAAS,sBAAsB;AAAA,UACzC,QAAQ;AAAA,QACT,CAAC;AAAA,MACF;AAAA,MAEA,OAAO,MAAM,QAAQ,OAAO;AAAA,IAC7B;AAAA,IAEA,MAAM,oBAAoB,iBAAiB,UAAU,YAAY;AAAA,IAEjE,MAAM,iBAAiB,qBACtB,SACA,KACA,CAAC,GACD,kBAAkB,IACnB;AAAA,IAEA,MAAM,eAAe,MAAM,OAC1B;AAAA,MACC,WAAW,eAAe;AAAA,MAC1B,MAAM,eAAe;AAAA,MACrB,QAAQ,eAAe;AAAA,MACvB,cAAc,eAAe;AAAA,MAC7B,gBAAgB,eAAe;AAAA,MAC/B,aAAa,eAAe;AAAA,IAC7B,GACA;AAAA,MACC,SAAS,cAAc;AAAA,MACvB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM;AAAA,IACP,CACD;AAAA,IAEA,IAAI,aAAa,SAAS,WAAW;AAAA,MACpC,OAAO,mBAAmB,aAAa,QAAQ,aAAa,UAAU;AAAA,IACvE;AAAA,IAEA,OAAO,kBAAkB,aAAa,MAAM,aAAa,UAAU;AAAA;AAAA,EAGpE,OAAO;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,OAAO,YAA2B;AAAA,MACjC,iBAAiB,IAAI,MAAM;AAAA,QAC1B,MAAM,cAAc;AAAA,QACpB,UAAU,cAAc;AAAA,QACxB,OAAO;AAAA,MACR,CAAC;AAAA,MAED,QAAQ,IACP,qCAAqC,cAAc,QAAQ,eAAe,MAC3E;AAAA;AAAA,IAED,MAAM,MAAY;AAAA,MACjB,IAAI,CAAC,gBAAgB;AAAA,QACpB;AAAA,MACD;AAAA,MAEA,eAAe,KAAK;AAAA;AAAA,EAEtB;AAAA;",
14
- "debugId": "05010CDFFCF397B164756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "C80F226E5734F0BB64756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -1,4 +1,5 @@
1
1
  import type { RenderMode } from "rakta/render";
2
+ import type { SeoConfig } from "../config/defineConfig";
2
3
  export type TideAdapterKind = "bun" | "node" | "edge";
3
4
  export interface TideRuntimeContext {
4
5
  readonly request: Request;
@@ -22,6 +23,7 @@ export interface TideAdapterConfig {
22
23
  readonly port: number;
23
24
  readonly host: string;
24
25
  readonly appName: string;
26
+ readonly seo: SeoConfig;
25
27
  readonly appDir: string;
26
28
  readonly publicDir: string;
27
29
  readonly outDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tide/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,CACxB,OAAO,EAAE,kBAAkB,KACvB,OAAO,CAAC,qBAAqB,GAAG,QAAQ,CAAC,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tide/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,CACxB,OAAO,EAAE,kBAAkB,KACvB,OAAO,CAAC,qBAAqB,GAAG,QAAQ,CAAC,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "raktajs",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Rakta.js core framework package for React, Bun, TypeScript, app routing, rendering, SEO, components, RPC, store, schema, HTTP, PWA, and auto imports.",
5
5
  "type": "module",
6
6
  "license": "MIT",