// 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}` } function __render_0d8cb769_2027(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { Show } from \"solid-js\";") if (routes.some(r => r.url === '/demo/better-auth')) { __append("import { Link } from \"@tanstack/solid-router\";") } __append("import { authClient } from \"../../lib/auth-client\";\n\nexport default function BetterAuthHeader() {\n const session = authClient.useSession();\n\n return (\n \n }\n >\n r.url === '/demo/better-auth')) { __append("fallback={\n \n Sign in\n \n }") } __append(">\n {(user) => (\n
\n \n \n {user().name?.charAt(0).toUpperCase() || \"U\"}\n \n
\n }\n >\n {(image) => \"\"}\n \n {\n void authClient.signOut();\n }}\n class=\"flex-1 h-9 px-4 text-sm font-medium bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50 border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors\"\n >\n Sign out\n \n \n )}\n \n \n );\n}\n") return __output } function __render_2ca117a6_183(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("# Better Auth configuration\nBETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET= # Generate a secret key: `") __append(getPackageManagerExecuteScript('@better-auth/cli', ['secret'])) __append("`\n") return __output } function __render_f1192baf_807(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("## Setting up Better Auth\n\n1. Generate and set the `BETTER_AUTH_SECRET` environment variable in your `.env.local`:\n\n ```bash\n ") __append(getPackageManagerExecuteScript('@better-auth/cli', ['secret'])) __append("\n ```\n\n2. Visit the [Better Auth documentation](https://www.better-auth.com) to unlock the full potential of authentication in your app.\n\n### Adding a Database (Optional)\n\nBetter Auth can work in stateless mode, but to persist user data, add a database:\n\n```typescript\n// src/lib/auth.ts\nimport { betterAuth } from \"better-auth\";\nimport { Pool } from \"pg\";\n\nexport const auth = betterAuth({\n database: new Pool({\n connectionString: process.env.DATABASE_URL,\n }),\n // ... rest of config\n});\n```\n\nThen run migrations:\n\n```bash\n") __append(getPackageManagerExecuteScript('@better-auth/cli', ['migrate'])) __append("\n```\n") return __output } const templateRenderers: Record = { "0d8cb769:2027": __render_0d8cb769_2027, "2ca117a6:183": __render_2ca117a6_183, "f1192baf:807": __render_f1192baf_807, } 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": "Better Auth", "description": "Self-hosted user accounts and sessions (open source, full control).", "phase": "add-on", "type": "add-on", "category": "auth", "exclusive": [ "auth" ], "color": "#000000", "link": "https://www.better-auth.com/", "modes": [ "file-router" ], "routes": [ { "url": "/demo/better-auth", "name": "Better Auth", "path": "src/routes/demo.better-auth.tsx", "jsName": "BetterAuthDemo" } ], "integrations": [ { "type": "header-user", "jsName": "BetterAuthHeader", "path": "src/integrations/better-auth/header-user.tsx" } ], "id": "better-auth", "version": "0.0.0", "packageAdditions": { "dependencies": { "better-auth": "^1.5.3" } }, "readme": "## Setting up Better Auth\n\n1. Generate and set the `BETTER_AUTH_SECRET` environment variable in your `.env.local`:\n\n ```bash\n <%- getPackageManagerExecuteScript('@better-auth/cli', ['secret']) %>\n ```\n\n2. Visit the [Better Auth documentation](https://www.better-auth.com) to unlock the full potential of authentication in your app.\n\n### Adding a Database (Optional)\n\nBetter Auth can work in stateless mode, but to persist user data, add a database:\n\n```typescript\n// src/lib/auth.ts\nimport { betterAuth } from \"better-auth\";\nimport { Pool } from \"pg\";\n\nexport const auth = betterAuth({\n database: new Pool({\n connectionString: process.env.DATABASE_URL,\n }),\n // ... rest of config\n});\n```\n\nThen run migrations:\n\n```bash\n<%- getPackageManagerExecuteScript('@better-auth/cli', ['migrate']) %>\n```\n", "readmeIsEjs": true, "files": { "_dot_env.local.append.ejs": "# Better Auth configuration\nBETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET= # Generate a secret key: `<%- getPackageManagerExecuteScript('@better-auth/cli', ['secret']) %>`\n", "src/integrations/better-auth/header-user.tsx.ejs": "import { Show } from \"solid-js\";\n<%_ if (routes.some(r => r.url === '/demo/better-auth')) { _%>\nimport { Link } from \"@tanstack/solid-router\";\n<%_ } _%>\nimport { authClient } from \"../../lib/auth-client\";\n\nexport default function BetterAuthHeader() {\n const session = authClient.useSession();\n\n return (\n \n }\n >\n r.url === '/demo/better-auth')) { _%>\n fallback={\n \n Sign in\n \n }\n<%_ } _%>\n >\n {(user) => (\n
\n \n \n {user().name?.charAt(0).toUpperCase() || \"U\"}\n \n
\n }\n >\n {(image) => \"\"}\n \n {\n void authClient.signOut();\n }}\n class=\"flex-1 h-9 px-4 text-sm font-medium bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50 border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors\"\n >\n Sign out\n \n \n )}\n \n \n );\n}\n", "src/lib/auth-client.ts": "import { createAuthClient } from 'better-auth/solid'\n\nexport const authClient = createAuthClient()\n", "src/lib/auth.ts": "import { betterAuth } from 'better-auth'\nimport { tanstackStartCookies } from 'better-auth/tanstack-start'\n\nexport const auth = betterAuth({\n emailAndPassword: {\n enabled: true,\n },\n plugins: [tanstackStartCookies()],\n})\n", "src/routes/api/auth/$.ts": "import { createFileRoute } from '@tanstack/solid-router'\nimport { auth } from '../../../lib/auth'\n\nexport const Route = createFileRoute('/api/auth/$')({\n server: {\n handlers: {\n GET: ({ request }) => auth.handler(request),\n POST: ({ request }) => auth.handler(request),\n },\n },\n})\n", "src/routes/demo.better-auth.tsx": "import { createFileRoute } from '@tanstack/solid-router'\nimport { createSignal, Show } from 'solid-js'\nimport { authClient } from '../lib/auth-client'\n\nexport const Route = createFileRoute('/demo/better-auth')({\n component: BetterAuthDemo,\n})\n\nfunction BetterAuthDemo() {\n const session = authClient.useSession()\n const [isSignUp, setIsSignUp] = createSignal(false)\n const [email, setEmail] = createSignal('')\n const [password, setPassword] = createSignal('')\n const [name, setName] = createSignal('')\n const [error, setError] = createSignal('')\n const [loading, setLoading] = createSignal(false)\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setError('')\n setLoading(true)\n\n try {\n if (isSignUp()) {\n const result = await authClient.signUp.email({\n email: email(),\n password: password(),\n name: name(),\n })\n if (result.error) {\n setError(result.error.message || 'Sign up failed')\n }\n } else {\n const result = await authClient.signIn.email({\n email: email(),\n password: password(),\n })\n if (result.error) {\n setError(result.error.message || 'Sign in failed')\n }\n }\n } catch (err) {\n setError('An unexpected error occurred')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n \n
\n \n }\n >\n \n
\n

Better Auth

\n

\n {isSignUp() ? 'Create an account' : 'Sign in'}\n

\n

\n {isSignUp()\n ? 'Enter your information to create an account'\n : 'Enter your email below to login to your account'}\n

\n\n
\n \n
\n \n setName(e.currentTarget.value)}\n class=\"demo-input\"\n required\n />\n
\n
\n\n
\n \n setEmail(e.currentTarget.value)}\n class=\"demo-input\"\n required\n />\n
\n\n
\n \n Password\n \n setPassword(e.currentTarget.value)}\n class=\"demo-input\"\n required\n minLength={8}\n />\n
\n\n \n
\n

{error()}

\n
\n
\n\n \n \n \n Please wait\n \n }\n >\n {isSignUp() ? 'Create account' : 'Sign in'}\n \n \n \n\n
\n {\n setIsSignUp(!isSignUp())\n setError('')\n }}\n class=\"demo-muted text-sm transition-colors hover:text-[var(--sea-ink)]\"\n >\n {isSignUp()\n ? 'Already have an account? Sign in'\n : \"Don't have an account? Sign up\"}\n \n
\n\n

\n Built with{' '}\n \n BETTER-AUTH\n \n .\n

\n
\n \n }\n >\n {(user) => (\n
\n
\n
\n

Better Auth

\n

Welcome back

\n

\n You're signed in as {user().email}\n

\n
\n\n
\n \n \n {user().name?.charAt(0).toUpperCase() || 'U'}\n \n
\n }\n >\n {(image) => \"\"}\n \n
\n

{user().name}

\n

\n {user().email}\n

\n
\n
\n\n {\n void authClient.signOut()\n }}\n class=\"demo-button demo-button-secondary w-full\"\n >\n Sign out\n \n\n

\n Built with{' '}\n \n BETTER-AUTH\n \n .\n

\n \n \n )}\n \n \n )\n}\n" }, "deletedFiles": [], "smallLogo": "\n\n\n\n\n\n\n\n\n" } satisfies AddOnCompiled