@react-router/cloudflare
Advanced tools
Comparing version
@@ -1,3 +0,52 @@ | ||
export { createWorkersKVSessionStorage } from "./sessions/workersKVStorage"; | ||
export type { createPagesFunctionHandlerParams, GetLoadContextFunction, RequestHandler, } from "./worker"; | ||
export { createPagesFunctionHandler, createRequestHandler } from "./worker"; | ||
import { SessionData, SessionStorage, SessionIdStorageStrategy, AppLoadContext, ServerBuild } from 'react-router'; | ||
import { CacheStorage } from '@cloudflare/workers-types'; | ||
interface WorkersKVSessionStorageOptions { | ||
/** | ||
* The Cookie used to store the session id on the client, or options used | ||
* to automatically create one. | ||
*/ | ||
cookie?: SessionIdStorageStrategy["cookie"]; | ||
/** | ||
* The KVNamespace used to store the sessions. | ||
*/ | ||
kv: KVNamespace; | ||
} | ||
/** | ||
* Creates a SessionStorage that stores session data in the Clouldflare KV Store. | ||
* | ||
* The advantage of using this instead of cookie session storage is that | ||
* KV Store may contain much more data than cookies. | ||
*/ | ||
declare function createWorkersKVSessionStorage<Data = SessionData, FlashData = Data>({ cookie, kv, }: WorkersKVSessionStorageOptions): SessionStorage<Data, FlashData>; | ||
/** | ||
* A function that returns the value to use as `context` in route `loader` and | ||
* `action` functions. | ||
* | ||
* You can think of this as an escape hatch that allows you to pass | ||
* environment/platform-specific values through to your loader/action. | ||
*/ | ||
type GetLoadContextFunction<Env = unknown, Params extends string = any, Data extends Record<string, unknown> = Record<string, unknown>> = (args: { | ||
request: Request; | ||
context: { | ||
cloudflare: EventContext<Env, Params, Data> & { | ||
cf: EventContext<Env, Params, Data>["request"]["cf"]; | ||
ctx: { | ||
waitUntil: EventContext<Env, Params, Data>["waitUntil"]; | ||
passThroughOnException: EventContext<Env, Params, Data>["passThroughOnException"]; | ||
}; | ||
caches: CacheStorage; | ||
}; | ||
}; | ||
}) => AppLoadContext | Promise<AppLoadContext>; | ||
type RequestHandler<Env = any> = PagesFunction<Env>; | ||
interface createPagesFunctionHandlerParams<Env = any> { | ||
build: ServerBuild | (() => ServerBuild | Promise<ServerBuild>); | ||
getLoadContext?: GetLoadContextFunction<Env>; | ||
mode?: string; | ||
} | ||
declare function createRequestHandler<Env = any>({ build, mode, getLoadContext, }: createPagesFunctionHandlerParams<Env>): RequestHandler<Env>; | ||
declare function createPagesFunctionHandler<Env = any>({ build, getLoadContext, mode, }: createPagesFunctionHandlerParams<Env>): (context: EventContext<Env, any, any>) => Promise<Response>; | ||
export { type GetLoadContextFunction, type RequestHandler, createPagesFunctionHandler, type createPagesFunctionHandlerParams, createRequestHandler, createWorkersKVSessionStorage }; |
/** | ||
* @react-router/cloudflare v0.0.0-experimental-7de693505 | ||
* @react-router/cloudflare v0.0.0-experimental-9f7fdccd4 | ||
* | ||
@@ -11,13 +11,148 @@ * Copyright (c) Remix Software Inc. | ||
*/ | ||
'use strict'; | ||
"use strict"; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, { get: all[name], enumerable: true }); | ||
}; | ||
var __copyProps = (to, from, except, desc) => { | ||
if (from && typeof from === "object" || typeof from === "function") { | ||
for (let key of __getOwnPropNames(from)) | ||
if (!__hasOwnProp.call(to, key) && key !== except) | ||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
} | ||
return to; | ||
}; | ||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
// index.ts | ||
var react_router_cloudflare_exports = {}; | ||
__export(react_router_cloudflare_exports, { | ||
createPagesFunctionHandler: () => createPagesFunctionHandler, | ||
createRequestHandler: () => createRequestHandler, | ||
createWorkersKVSessionStorage: () => createWorkersKVSessionStorage | ||
}); | ||
module.exports = __toCommonJS(react_router_cloudflare_exports); | ||
var workersKVStorage = require('./sessions/workersKVStorage.js'); | ||
var worker = require('./worker.js'); | ||
// sessions/workersKVStorage.ts | ||
var import_react_router = require("react-router"); | ||
function createWorkersKVSessionStorage({ | ||
cookie, | ||
kv | ||
}) { | ||
return (0, import_react_router.createSessionStorage)({ | ||
cookie, | ||
async createData(data, expires) { | ||
while (true) { | ||
let randomBytes = crypto.getRandomValues(new Uint8Array(8)); | ||
let id = [...randomBytes].map((x) => x.toString(16).padStart(2, "0")).join(""); | ||
if (await kv.get(id, "json")) { | ||
continue; | ||
} | ||
await kv.put(id, JSON.stringify(data), { | ||
expiration: expires ? Math.round(expires.getTime() / 1e3) : void 0 | ||
}); | ||
return id; | ||
} | ||
}, | ||
async readData(id) { | ||
let session = await kv.get(id); | ||
if (!session) { | ||
return null; | ||
} | ||
return JSON.parse(session); | ||
}, | ||
async updateData(id, data, expires) { | ||
await kv.put(id, JSON.stringify(data), { | ||
expiration: expires ? Math.round(expires.getTime() / 1e3) : void 0 | ||
}); | ||
}, | ||
async deleteData(id) { | ||
await kv.delete(id); | ||
} | ||
}); | ||
} | ||
exports.createWorkersKVSessionStorage = workersKVStorage.createWorkersKVSessionStorage; | ||
exports.createPagesFunctionHandler = worker.createPagesFunctionHandler; | ||
exports.createRequestHandler = worker.createRequestHandler; | ||
// worker.ts | ||
var import_react_router2 = require("react-router"); | ||
function createRequestHandler({ | ||
build, | ||
mode, | ||
getLoadContext = ({ context }) => ({ | ||
...context, | ||
cloudflare: { | ||
...context.cloudflare, | ||
cf: context.cloudflare.request.cf | ||
} | ||
}) | ||
}) { | ||
let handleRequest = (0, import_react_router2.createRequestHandler)(build, mode); | ||
return async (cloudflare) => { | ||
let loadContext = await getLoadContext({ | ||
request: cloudflare.request, | ||
context: { | ||
cloudflare: { | ||
...cloudflare, | ||
cf: cloudflare.request.cf, | ||
ctx: { | ||
waitUntil: cloudflare.waitUntil.bind(cloudflare), | ||
passThroughOnException: cloudflare.passThroughOnException.bind(cloudflare) | ||
}, | ||
caches | ||
} | ||
} | ||
}); | ||
return handleRequest(cloudflare.request, loadContext); | ||
}; | ||
} | ||
function createPagesFunctionHandler({ | ||
build, | ||
getLoadContext, | ||
mode | ||
}) { | ||
let handleRequest = createRequestHandler({ | ||
build, | ||
getLoadContext, | ||
mode | ||
}); | ||
let handleFetch = async (context) => { | ||
let response; | ||
context.request.headers.delete("if-none-match"); | ||
try { | ||
response = await context.env.ASSETS.fetch( | ||
context.request.url, | ||
context.request.clone() | ||
); | ||
response = response && response.status >= 200 && response.status < 400 ? new Response(response.body, response) : void 0; | ||
} catch { | ||
} | ||
if (!response) { | ||
response = await handleRequest(context); | ||
} | ||
return response; | ||
}; | ||
return async (context) => { | ||
try { | ||
return await handleFetch(context); | ||
} catch (error) { | ||
if (process.env.NODE_ENV === "development" && error instanceof Error) { | ||
console.error(error); | ||
return new Response(error.message || error.toString(), { | ||
status: 500 | ||
}); | ||
} | ||
return new Response("Internal Error", { | ||
status: 500 | ||
}); | ||
} | ||
}; | ||
} | ||
// Annotate the CommonJS export names for ESM import in node: | ||
0 && (module.exports = { | ||
createPagesFunctionHandler, | ||
createRequestHandler, | ||
createWorkersKVSessionStorage | ||
}); |
{ | ||
"name": "@react-router/cloudflare", | ||
"version": "0.0.0-experimental-7de693505", | ||
"version": "0.0.0-experimental-9f7fdccd4", | ||
"description": "Cloudflare platform abstractions for React Router", | ||
@@ -18,16 +18,39 @@ "bugs": { | ||
".": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
"import": { | ||
"types": "./dist/index.d.mts", | ||
"default": "./dist/index.mjs" | ||
}, | ||
"default": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
} | ||
}, | ||
"./package.json": "./package.json" | ||
}, | ||
"wireit": { | ||
"build": { | ||
"command": "tsup", | ||
"files": [ | ||
"sessions/**", | ||
"*.ts", | ||
"tsconfig.json", | ||
"package.json" | ||
], | ||
"output": [ | ||
"dist/**" | ||
] | ||
} | ||
}, | ||
"devDependencies": { | ||
"@cloudflare/workers-types": "^4.20230518.0", | ||
"typescript": "^5.1.0", | ||
"react-router": "0.0.0-experimental-7de693505" | ||
"tsup": "^8.3.0", | ||
"typescript": "^5.1.6", | ||
"wireit": "0.14.9", | ||
"react-router": "0.0.0-experimental-9f7fdccd4" | ||
}, | ||
"peerDependencies": { | ||
"@cloudflare/workers-types": "^4.0.0", | ||
"tsup": "^8.3.0", | ||
"typescript": "^5.1.0", | ||
"react-router": "^0.0.0-experimental-7de693505" | ||
"react-router": "^0.0.0-experimental-9f7fdccd4" | ||
}, | ||
@@ -40,3 +63,3 @@ "peerDependenciesMeta": { | ||
"engines": { | ||
"node": ">=18.0.0" | ||
"node": ">=20.0.0" | ||
}, | ||
@@ -50,5 +73,4 @@ "files": [ | ||
"scripts": { | ||
"build": "rollup -c", | ||
"tsc": "tsc" | ||
"build": "wireit" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
# React Router Cloudflare | ||
# @react-router/cloudflare | ||
@@ -3,0 +3,0 @@ Cloudflare platform abstractions for [React Router.](https://reactrouter.com) |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
15878
54.56%330
52.07%4
33.33%5
66.67%7
-22.22%2
100%1
Infinity%