@appwarden/middleware
Version:
Instantly disable all user interaction with your app deployed on Cloudflare or Vercel
397 lines (393 loc) • 26.1 kB
TypeScript
import { z } from 'zod';
/**
* Zod schema for React Router Cloudflare adapter configuration.
* Validates the config object returned by the configFn.
*/
declare const ReactRouterCloudflareConfigSchema: z.ZodObject<{
/** The slug/path of the lock page to redirect to when the site is locked */
lockPageSlug: z.ZodEffects<z.ZodString, string, string>;
/** The Appwarden API token for authentication */
appwardenApiToken: z.ZodEffects<z.ZodEffects<z.ZodString, string, unknown>, string, unknown>;
/** Optional custom API hostname (defaults to https://api.appwarden.io) */
appwardenApiHostname: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>;
/** Enable debug logging */
debug: z.ZodDefault<z.ZodEffects<z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodBoolean]>>, boolean | "true" | "false", string | boolean | undefined>, boolean, string | boolean | undefined>>;
/** Optional Content Security Policy configuration */
contentSecurityPolicy: z.ZodOptional<z.ZodLazy<z.ZodObject<{
mode: z.ZodUnion<[z.ZodLiteral<"disabled">, z.ZodLiteral<"report-only">, z.ZodLiteral<"enforced">]>;
directives: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodObject<{
"default-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"script-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"style-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"img-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"connect-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"font-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"object-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"media-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"frame-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
sandbox: z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"report-uri": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"child-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"form-action": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"frame-ancestors": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"plugin-types": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"base-uri": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"report-to": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"worker-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"manifest-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"prefetch-src": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"navigate-to": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"require-sri-for": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"block-all-mixed-content": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"upgrade-insecure-requests": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"trusted-types": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
"require-trusted-types-for": z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodString, z.ZodBoolean]>>;
}, "strip", z.ZodTypeAny, {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
}, {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
}>]>, string | {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
}, string | {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
}>, {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
} | undefined, string | {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
}>;
}, "strip", z.ZodTypeAny, {
mode: "disabled" | "report-only" | "enforced";
directives?: {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
} | undefined;
}, {
mode: "disabled" | "report-only" | "enforced";
directives: string | {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
};
}>>>;
}, "strip", z.ZodTypeAny, {
debug: boolean;
lockPageSlug: string;
appwardenApiToken: string;
contentSecurityPolicy?: {
mode: "disabled" | "report-only" | "enforced";
directives?: {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
} | undefined;
} | undefined;
appwardenApiHostname?: string | undefined;
}, {
lockPageSlug: string;
debug?: string | boolean | undefined;
contentSecurityPolicy?: {
mode: "disabled" | "report-only" | "enforced";
directives: string | {
"default-src"?: string | boolean | string[] | undefined;
"script-src"?: string | boolean | string[] | undefined;
"style-src"?: string | boolean | string[] | undefined;
"img-src"?: string | boolean | string[] | undefined;
"connect-src"?: string | boolean | string[] | undefined;
"font-src"?: string | boolean | string[] | undefined;
"object-src"?: string | boolean | string[] | undefined;
"media-src"?: string | boolean | string[] | undefined;
"frame-src"?: string | boolean | string[] | undefined;
sandbox?: string | boolean | string[] | undefined;
"report-uri"?: string | boolean | string[] | undefined;
"child-src"?: string | boolean | string[] | undefined;
"form-action"?: string | boolean | string[] | undefined;
"frame-ancestors"?: string | boolean | string[] | undefined;
"plugin-types"?: string | boolean | string[] | undefined;
"base-uri"?: string | boolean | string[] | undefined;
"report-to"?: string | boolean | string[] | undefined;
"worker-src"?: string | boolean | string[] | undefined;
"manifest-src"?: string | boolean | string[] | undefined;
"prefetch-src"?: string | boolean | string[] | undefined;
"navigate-to"?: string | boolean | string[] | undefined;
"require-sri-for"?: string | boolean | string[] | undefined;
"block-all-mixed-content"?: string | boolean | string[] | undefined;
"upgrade-insecure-requests"?: string | boolean | string[] | undefined;
"trusted-types"?: string | boolean | string[] | undefined;
"require-trusted-types-for"?: string | boolean | string[] | undefined;
};
} | undefined;
appwardenApiToken?: unknown;
appwardenApiHostname?: string | undefined;
}>;
type ReactRouterCloudflareConfig = z.infer<typeof ReactRouterCloudflareConfigSchema>;
/**
* Input type for React Router Cloudflare adapter configuration.
* This is the pre-transformation type that accepts string | boolean for debug
* and string | object for CSP directives, allowing users to pass environment
* variables directly without manual transformation.
*/
type ReactRouterAppwardenConfigInput = z.input<typeof ReactRouterCloudflareConfigSchema>;
declare function getAppwardenConfiguration(generatedConfig: Record<string, unknown>, config: Partial<ReactRouterAppwardenConfigInput>): ReactRouterCloudflareConfig;
/**
* Configuration function that returns the config.
* This allows dynamic configuration based on environment variables from cloudflare:workers.
* The config can use the relaxed input types (string | boolean for debug,
* string | object for CSP directives) which will be transformed by Zod.
*
* @param runtime - Optional runtime context (for backward compatibility)
*/
type ReactRouterConfigFn = (runtime?: unknown) => ReactRouterAppwardenConfigInput | ReactRouterCloudflareConfig;
/**
* React Router middleware function signature.
* This matches the unstable_middleware export type in React Router v7.
*/
interface ReactRouterMiddlewareArgs {
request: Request;
params: Record<string, string | undefined>;
}
type ReactRouterMiddlewareFunction = (args: ReactRouterMiddlewareArgs, next: () => Promise<void | Response>) => Promise<void | Response>;
/**
* Creates an Appwarden middleware function for React Router.
*
* This middleware checks if the site is locked and redirects to the lock page if so.
* It should be exported from your root route (root.tsx) to protect all routes.
*
* @example
* ```typescript
* // app/root.tsx
* import { env } from "cloudflare:workers"
* import { createAppwardenMiddleware } from "@appwarden/middleware/cloudflare/react-router"
*
* export const unstable_middleware = [
* createAppwardenMiddleware(() => ({
* lockPageSlug: env.APPWARDEN_LOCK_PAGE_SLUG,
* appwardenApiToken: env.APPWARDEN_API_TOKEN,
* })),
* ]
* ```
*
* @param configFn - A function that returns the config using env from cloudflare:workers
* @returns A React Router middleware function
*/
declare function createAppwardenMiddleware(configFn: ReactRouterConfigFn): ReactRouterMiddlewareFunction;
export { type ReactRouterAppwardenConfigInput, type ReactRouterCloudflareConfig, type ReactRouterConfigFn, type ReactRouterMiddlewareArgs, type ReactRouterMiddlewareFunction, createAppwardenMiddleware, getAppwardenConfiguration };