@maravilla-labs/adapter-react-router 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ export { maravillaReactRouter, type ReactRouterAdapterOptions } from './vite-plugin.js';
2
+ export { WORKER_TEMPLATE } from './worker-template.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { maravillaReactRouter } from './vite-plugin.js';
2
+ export { WORKER_TEMPLATE } from './worker-template.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAkC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Plugin } from 'vite';
2
+ import { type AdapterOptions } from '@maravilla-labs/adapter-core';
3
+ export interface ReactRouterAdapterOptions extends AdapterOptions {
4
+ /** Path to React Router server build output (default: 'build/server') */
5
+ serverBuildPath?: string;
6
+ /** Path to React Router client build output (default: 'build/client') */
7
+ clientBuildPath?: string;
8
+ /** Server build entry file name (default: 'index.js') */
9
+ serverBuildFile?: string;
10
+ }
11
+ /**
12
+ * Vite plugin that runs after React Router's build to produce
13
+ * a Maravilla Runtime bundle in `.maravilla/`.
14
+ */
15
+ export declare function maravillaReactRouter(options?: ReactRouterAdapterOptions): Plugin;
16
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,yBAA8B,GAAG,MAAM,CA0HpF"}
@@ -0,0 +1,99 @@
1
+ import { writeFileSync, mkdirSync, cpSync, existsSync, rmSync } from 'node:fs';
2
+ import { resolve, join } from 'node:path';
3
+ import { bundleServerEntry, analyzeBundle, generateManifest, writeManifest, collectAssets, buildAndIntegrateFunctions, } from '@maravilla-labs/adapter-core';
4
+ import { WORKER_TEMPLATE } from './worker-template.js';
5
+ /**
6
+ * Vite plugin that runs after React Router's build to produce
7
+ * a Maravilla Runtime bundle in `.maravilla/`.
8
+ */
9
+ export function maravillaReactRouter(options = {}) {
10
+ const { out = '.maravilla', serverBuildPath = 'build/server', clientBuildPath = 'build/client', serverBuildFile = 'index.js', envPrefix = 'PUBLIC_', polyfill = true, include = [], exclude = [], external = [], precompress = false, } = options;
11
+ let root;
12
+ return {
13
+ name: '@maravilla-labs/adapter-react-router',
14
+ apply: 'build',
15
+ enforce: 'post',
16
+ configResolved(config) {
17
+ root = config.root;
18
+ },
19
+ async closeBundle() {
20
+ const serverDir = resolve(root, serverBuildPath);
21
+ const clientDir = resolve(root, clientBuildPath);
22
+ // Verify React Router build output exists
23
+ const serverEntry = join(serverDir, serverBuildFile);
24
+ if (!existsSync(serverEntry)) {
25
+ console.warn(`[maravilla] React Router server build not found at ${serverEntry}. ` +
26
+ `Run 'react-router build' first, or check serverBuildPath/serverBuildFile options.`);
27
+ return;
28
+ }
29
+ const outDir = resolve(root, out);
30
+ const tmpDir = resolve(root, 'node_modules/.maravilla-tmp');
31
+ // Clean output
32
+ if (existsSync(outDir))
33
+ rmSync(outDir, { recursive: true });
34
+ mkdirSync(outDir, { recursive: true });
35
+ mkdirSync(tmpDir, { recursive: true });
36
+ console.log('[maravilla] Building Maravilla Runtime bundle for React Router 7...');
37
+ // Copy client assets to static directory
38
+ const staticDir = join(outDir, 'static');
39
+ if (existsSync(clientDir)) {
40
+ cpSync(clientDir, staticDir, { recursive: true });
41
+ console.log('[maravilla] Copied client assets to static/');
42
+ }
43
+ // Generate worker entry that imports the server build
44
+ const workerCode = WORKER_TEMPLATE.replace('__SERVER_BUILD__', serverEntry.replace(/\\/g, '/'));
45
+ const workerPath = join(tmpDir, 'worker.js');
46
+ writeFileSync(workerPath, workerCode);
47
+ // Bundle with esbuild
48
+ console.log('[maravilla] Bundling with esbuild...');
49
+ const result = await bundleServerEntry({
50
+ entrypoint: workerPath,
51
+ outfile: join(outDir, 'server.js'),
52
+ external,
53
+ treeShaking: false,
54
+ });
55
+ const analysis = await analyzeBundle(result);
56
+ if (analysis) {
57
+ console.log(analysis);
58
+ }
59
+ // Collect static assets and detect prerendered pages
60
+ const staticAssets = collectAssets(staticDir);
61
+ // Detect prerendered HTML files (React Router generates these for static routes)
62
+ const prerenderedPaths = staticAssets
63
+ .filter(p => p.endsWith('.html'))
64
+ .map(p => {
65
+ if (p === '/index.html')
66
+ return '/';
67
+ return p.replace(/\.html$/, '').replace(/\/index$/, '/');
68
+ });
69
+ // Generate manifest
70
+ const manifest = generateManifest({
71
+ adapterName: '@maravilla-labs/adapter-react-router',
72
+ prerenderedPaths,
73
+ staticAssets,
74
+ include,
75
+ exclude,
76
+ envPrefix,
77
+ features: {
78
+ ssr: true,
79
+ prerendering: prerenderedPaths.length > 0,
80
+ polyfill,
81
+ streaming: true,
82
+ compression: precompress,
83
+ },
84
+ extraMetadata: {
85
+ framework: 'react-router-7',
86
+ },
87
+ });
88
+ writeManifest(outDir, manifest);
89
+ // Build and integrate edge functions
90
+ await buildAndIntegrateFunctions(root, outDir);
91
+ // Cleanup temp directory
92
+ rmSync(tmpDir, { recursive: true, force: true });
93
+ console.log(`[maravilla] Build complete. Output written to ${out}`);
94
+ console.log('[maravilla] Deploy with:');
95
+ console.log(`[maravilla] maravilla deploy ${out}`);
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Worker template for React Router 7 on Maravilla Runtime.
3
+ *
4
+ * The __SERVER_BUILD__ placeholder is replaced at build time with the path
5
+ * to the React Router server build output.
6
+ */
7
+ export declare const WORKER_TEMPLATE = "// Maravilla Runtime Worker Polyfills\n// Shared across all framework adapters\n\nconst originalFetch = globalThis.fetch;\nconst OriginalRequest = globalThis.Request;\n\nclass EnhancedRequest extends OriginalRequest {\n constructor(input, init) {\n if (typeof input === 'string') {\n try {\n super(input, init);\n } catch (e) {\n if (globalThis.location && e.message && e.message.includes('relative')) {\n try {\n const absoluteUrl = new URL(input, globalThis.location.href);\n super(absoluteUrl.href, init);\n } catch (e2) {\n throw e;\n }\n } else {\n throw e;\n }\n }\n return;\n }\n\n if (input && typeof input === 'object' && !(input instanceof OriginalRequest)) {\n const url = input.url || input.href || input.toString();\n if (!url) {\n throw new TypeError('Request must have a URL');\n }\n const newInit = {\n method: input.method || init?.method || 'GET',\n headers: input.headers || init?.headers,\n body: input.body || init?.body,\n mode: input.mode || init?.mode,\n credentials: input.credentials || init?.credentials,\n cache: input.cache || init?.cache,\n redirect: input.redirect || init?.redirect,\n referrer: input.referrer || init?.referrer,\n referrerPolicy: input.referrerPolicy || init?.referrerPolicy,\n integrity: input.integrity || init?.integrity,\n keepalive: input.keepalive || init?.keepalive,\n signal: input.signal || init?.signal,\n ...init\n };\n super(url, newInit);\n return;\n }\n\n super(input, init);\n }\n}\n\nglobalThis.Request = EnhancedRequest;\n\nglobalThis.fetch = function enhancedFetch(input, init) {\n let request;\n\n if (input instanceof Request) {\n request = input;\n } else if (typeof input === 'string') {\n if (input.startsWith('http://') || input.startsWith('https://')) {\n request = new Request(input, init);\n } else if (globalThis.location) {\n try {\n const absoluteUrl = new URL(input, globalThis.location.href);\n request = new Request(absoluteUrl.href, init);\n } catch (e) {\n console.error('Failed to resolve relative URL:', input, 'against', globalThis.location.href);\n throw e;\n }\n } else {\n console.error('Cannot resolve relative URL without globalThis.location:', input);\n throw new Error('Cannot resolve relative URL without a base URL');\n }\n } else if (input && typeof input === 'object') {\n request = new Request(input, init);\n } else {\n throw new TypeError('First argument must be a string, Request, or URL');\n }\n\n return originalFetch(request);\n};\n\n\n// Import the React Router server build\nimport * as build from '__SERVER_BUILD__';\n\n// createRequestHandler comes from the React Router core package.\n// It accepts a server build and returns a fetch-compatible handler.\nconst { createRequestHandler } = await import('react-router');\n\nconst handler = createRequestHandler(build, 'production');\n\n/**\n * Main request handler for the Maravilla runtime.\n * Called by the runtime for each incoming HTTP request.\n */\nasync function handleRequest(request) {\n // Re-apply polyfills if needed (worker reuse)\n if (globalThis.Request !== EnhancedRequest) {\n globalThis.Request = EnhancedRequest;\n globalThis.fetch = enhancedFetch;\n }\n\n // Build the load context that React Router passes to loaders/actions.\n // Users access this via: export async function loader({ context }) { ... }\n const loadContext = {\n platform: globalThis.platform,\n env: globalThis.platform?.env || {},\n kv: globalThis.platform?.kv,\n db: globalThis.platform?.db,\n storage: globalThis.platform?.storage,\n queue: globalThis.platform?.queue,\n };\n\n return handler(request, loadContext);\n}\n\nglobalThis.handleRequest = handleRequest;\n";
8
+ //# sourceMappingURL=worker-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-template.d.ts","sourceRoot":"","sources":["../src/worker-template.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,eAAe,q6HAqC3B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { WORKER_POLYFILLS } from '@maravilla-labs/adapter-core';
2
+ /**
3
+ * Worker template for React Router 7 on Maravilla Runtime.
4
+ *
5
+ * The __SERVER_BUILD__ placeholder is replaced at build time with the path
6
+ * to the React Router server build output.
7
+ */
8
+ export const WORKER_TEMPLATE = `${WORKER_POLYFILLS}
9
+
10
+ // Import the React Router server build
11
+ import * as build from '__SERVER_BUILD__';
12
+
13
+ // createRequestHandler comes from the React Router core package.
14
+ // It accepts a server build and returns a fetch-compatible handler.
15
+ const { createRequestHandler } = await import('react-router');
16
+
17
+ const handler = createRequestHandler(build, 'production');
18
+
19
+ /**
20
+ * Main request handler for the Maravilla runtime.
21
+ * Called by the runtime for each incoming HTTP request.
22
+ */
23
+ async function handleRequest(request) {
24
+ // Re-apply polyfills if needed (worker reuse)
25
+ if (globalThis.Request !== EnhancedRequest) {
26
+ globalThis.Request = EnhancedRequest;
27
+ globalThis.fetch = enhancedFetch;
28
+ }
29
+
30
+ // Build the load context that React Router passes to loaders/actions.
31
+ // Users access this via: export async function loader({ context }) { ... }
32
+ const loadContext = {
33
+ platform: globalThis.platform,
34
+ env: globalThis.platform?.env || {},
35
+ kv: globalThis.platform?.kv,
36
+ db: globalThis.platform?.db,
37
+ storage: globalThis.platform?.storage,
38
+ queue: globalThis.platform?.queue,
39
+ };
40
+
41
+ return handler(request, loadContext);
42
+ }
43
+
44
+ globalThis.handleRequest = handleRequest;
45
+ `;
46
+ //# sourceMappingURL=worker-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-template.js","sourceRoot":"","sources":["../src/worker-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCjD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@maravilla-labs/adapter-react-router",
3
+ "version": "0.1.0",
4
+ "description": "React Router 7 adapter for Maravilla Runtime",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./vite": {
14
+ "types": "./dist/vite-plugin.d.ts",
15
+ "import": "./dist/vite-plugin.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "react-router",
28
+ "remix",
29
+ "adapter",
30
+ "maravilla",
31
+ "edge",
32
+ "runtime",
33
+ "ssr"
34
+ ],
35
+ "author": "SOLUTAS GmbH",
36
+ "license": "Proprietary",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/maravilla-labs/maravilla-runtime.git",
40
+ "directory": "packages/adapter-react-router"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "peerDependencies": {
46
+ "react-router": "^7.0.0",
47
+ "@react-router/dev": "^7.0.0",
48
+ "@maravilla-labs/functions": "*"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "@maravilla-labs/functions": {
52
+ "optional": true
53
+ },
54
+ "@react-router/dev": {
55
+ "optional": true
56
+ }
57
+ },
58
+ "dependencies": {
59
+ "@maravilla-labs/adapter-core": "workspace:*",
60
+ "esbuild": "^0.25.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^20.0.0",
64
+ "typescript": "^5.0.0",
65
+ "vite": "^6.0.0"
66
+ }
67
+ }