// Generated by scripts/generate-manifest.mjs. Do not edit by hand. import type { AddOnCompiled } from '../../../../../types.js' type TemplateRecord = Record type TemplateAddOn = TemplateRecord & { integrations?: Array routes?: Array } type TemplateRenderContext = { [key: string]: any packageManager: any projectName: any typescript: any tailwind: any blank: any js: any jsx: any fileRouter: any codeRouter: any routerOnly: any includeExamples: any addOnEnabled: Record addOnOption: Record addOns: Array integrations: Array routes: Array getPackageManagerAddScript: (...args: Array) => string getPackageManagerRunScript: (...args: Array) => string getPackageManagerExecuteScript: (...args: Array) => string relativePath: (...args: Array) => string integrationImportContent: (...args: Array) => string integrationImportCode: (...args: Array) => string | undefined renderTemplate: (content: string) => string ignoreFile: () => never } type TemplateRenderer = (context: TemplateRenderContext) => string | undefined function __escapeXML(value: unknown) { if (value === undefined || value === null) { return '' } return String(value).replace(/[&<>'"]/g, (character) => { switch (character) { case '&': return '&' case '<': return '<' case '>': return '>' case '"': return '"' case "'": return ''' default: return character } }) } export function getManifestTemplateKey(template: string) { let hash = 0x811c9dc5 for (let i = 0; i < template.length; i++) { hash ^= template.charCodeAt(i) hash = Math.imul(hash, 0x01000193) >>> 0 } return `${hash.toString(16).padStart(8, '0')}:${template.length}` } const templateRenderers: Record = { } export function hasManifestTemplate(template: string) { return getManifestTemplateKey(template) in templateRenderers } export function renderManifestTemplate( template: string, context: TemplateRenderContext, ) { const key = getManifestTemplateKey(template) const renderer = templateRenderers[key] if (!renderer) { throw new Error(`Template ${key} was not precompiled into the manifest`) } return renderer(context) ?? '' } export const addOn = { "name": "WorkOS", "description": "Enterprise SSO, SAML, and directory sync (good for B2B apps).", "phase": "add-on", "modes": [ "file-router" ], "type": "add-on", "category": "auth", "exclusive": [ "auth" ], "color": "#6363F1", "priority": 160, "partner": { "id": "workos", "tier": "silver" }, "link": "https://workos.com", "routes": [ { "icon": "CircleUserRound", "url": "/demo/workos", "name": "WorkOS", "path": "src/routes/demo.workos.tsx", "jsName": "WorkOSDemo" } ], "integrations": [ { "type": "header-user", "jsName": "WorkOSHeader", "path": "src/components/workos-user.tsx" }, { "type": "provider", "jsName": "WorkOSProvider", "path": "src/integrations/workos/provider.tsx" } ], "envVars": [ { "name": "WORKOS_CLIENT_ID", "description": "WorkOS client ID", "required": true, "secret": false, "file": ".env.local" }, { "name": "WORKOS_API_KEY", "description": "WorkOS API key", "required": true, "secret": true, "file": ".env.local" }, { "name": "WORKOS_REDIRECT_URI", "description": "AuthKit callback URL", "required": true, "default": "http://localhost:3000/api/auth/callback", "secret": false, "file": ".env.local" }, { "name": "WORKOS_COOKIE_PASSWORD", "description": "Session cookie encryption password (at least 32 characters)", "required": true, "secret": true, "file": ".env.local" }, { "name": "WORKOS_API_HOSTNAME", "description": "WorkOS API hostname", "required": false, "default": "api.workos.com", "secret": false, "file": ".env.local" } ], "id": "workos", "version": "0.0.0", "packageAdditions": { "engines": { "node": ">=22.11.0" }, "dependencies": { "@workos-inc/node": "^10.8.0", "@workos/authkit-tanstack-react-start": "^0.11.0" } }, "readme": "## Setting up WorkOS\n\nThis integration uses WorkOS AuthKit's full-stack TanStack Start SDK and requires\nNode.js 22.11 or newer.\n\n1. Copy your client ID and API key from the [WorkOS dashboard](https://dashboard.workos.com/api-keys).\n2. Fill in `.env.local`:\n\n ```bash\n WORKOS_CLIENT_ID=client_...\n WORKOS_API_KEY=sk_test_...\n WORKOS_REDIRECT_URI=http://localhost:3000/api/auth/callback\n WORKOS_COOKIE_PASSWORD=a-random-value-at-least-32-characters-long\n WORKOS_API_HOSTNAME=api.workos.com\n ```\n\n3. On the dashboard's [Redirects page](https://dashboard.workos.com/redirects), add\n `http://localhost:3000/api/auth/callback` as a redirect URI and\n `http://localhost:3000/api/auth/sign-in` as the sign-in endpoint.\n4. Start the app and visit `/demo/workos`.\n\n### What's wired up\n\n- `authkitMiddleware()` manages the encrypted server-side session in `src/start.ts`.\n- `/api/auth/callback` completes the OAuth callback.\n- `/api/auth/sign-in` initiates sign-in and supports a `returnPathname` query parameter.\n- `` supplies reactive auth state to the header and demo route.\n\nFor authorization in loaders and server functions, use `getAuth()` from\n`@workos/authkit-tanstack-react-start`. Keep `WORKOS_API_KEY` and\n`WORKOS_COOKIE_PASSWORD` server-only, and replace the local callback and sign-in URLs\nwith their production equivalents when deploying.\n", "readmeIsEjs": false, "files": { "_dot_env.local.append": "# WorkOS configuration: https://dashboard.workos.com/api-keys\nWORKOS_CLIENT_ID=\nWORKOS_API_KEY=\nWORKOS_REDIRECT_URI=http://localhost:3000/api/auth/callback\n\n# Generate a random value at least 32 characters long.\nWORKOS_COOKIE_PASSWORD=\n\n# Use your custom authentication domain in production, if configured.\nWORKOS_API_HOSTNAME=api.workos.com\n", "src/components/workos-user.tsx": "import { useAuth } from '@workos/authkit-tanstack-react-start/client'\n\nexport default function WorkOSUser({ large }: { large?: boolean }) {\n const { user, loading, signOut } = useAuth()\n\n const buttonClasses = `${\n large ? 'px-6 py-3 text-base' : 'px-4 py-2 text-sm'\n } demo-button`\n\n if (loading) return null\n\n if (user) {\n return (\n
\n
\n {user.profilePictureUrl && (\n \n )}\n {user.firstName} {user.lastName}\n
\n \n
\n )\n }\n\n return (\n \n Sign In {large && 'with AuthKit'}\n \n )\n}\n", "src/integrations/workos/provider.tsx": "import { AuthKitProvider } from '@workos/authkit-tanstack-react-start/client'\n\nexport default function AppWorkOSProvider({\n children,\n}: {\n children: React.ReactNode\n}) {\n return {children}\n}\n", "src/routes/api/auth/callback.tsx": "import { createFileRoute } from '@tanstack/react-router'\nimport { handleCallbackRoute } from '@workos/authkit-tanstack-react-start'\n\nexport const Route = createFileRoute('/api/auth/callback')({\n server: {\n handlers: {\n GET: handleCallbackRoute(),\n },\n },\n})\n", "src/routes/api/auth/sign-in.tsx": "import { createFileRoute } from '@tanstack/react-router'\nimport { getSignInUrl } from '@workos/authkit-tanstack-react-start'\n\nexport const Route = createFileRoute('/api/auth/sign-in')({\n server: {\n handlers: {\n GET: async ({ request }) => {\n const returnPathname = new URL(request.url).searchParams.get(\n 'returnPathname',\n )\n const url = await getSignInUrl(\n returnPathname ? { data: { returnPathname } } : undefined,\n )\n\n return new Response(null, {\n status: 307,\n headers: { Location: url },\n })\n },\n },\n },\n})\n", "src/routes/demo/workos.tsx": "import { createFileRoute } from '@tanstack/react-router'\nimport { useAuth } from '@workos/authkit-tanstack-react-start/client'\n\nexport const Route = createFileRoute('/demo/workos')({\n component: App,\n})\n\nfunction App() {\n const { user, loading, signOut } = useAuth()\n\n if (loading) {\n return (\n
\n
\n

Loading...

\n
\n
\n )\n }\n\n if (user) {\n return (\n
\n
\n

WorkOS

\n

User Profile

\n\n
\n {user.profilePictureUrl && (\n
\n \n
\n )}\n\n
\n
\n \n

{user.firstName || 'N/A'}

\n
\n\n
\n \n

{user.lastName || 'N/A'}

\n
\n\n
\n \n

{user.email || 'N/A'}

\n
\n\n
\n \n

\n {user.id || 'N/A'}\n

\n
\n
\n\n void signOut()}\n className=\"demo-button w-full\"\n >\n Sign Out\n \n
\n
\n
\n )\n }\n\n return (\n
\n
\n

WorkOS

\n

WorkOS Authentication

\n

\n Sign in to view your profile information\n

\n \n Sign In with AuthKit\n \n
\n
\n )\n}\n" }, "deletedFiles": [], "smallLogo": "\n\n\n\n" } satisfies AddOnCompiled