@foldspace-fe/casdoor-next-auth-kit 0.1.5 → 0.1.7

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.
package/README.md CHANGED
@@ -70,11 +70,14 @@ import {
70
70
  ## 最常用命令
71
71
 
72
72
  ```bash
73
- npx @foldspace-fe/casdoor-next-auth-kit init
74
- npx @foldspace-fe/casdoor-next-auth-kit update
75
- npx @foldspace-fe/casdoor-next-auth-kit check
73
+ npx @foldspace-fe/casdoor-next-auth-kit@latest init
74
+ npx @foldspace-fe/casdoor-next-auth-kit@latest update
75
+ npx @foldspace-fe/casdoor-next-auth-kit@latest check
76
+ npx @foldspace-fe/casdoor-next-auth-kit@latest --version
76
77
  ```
77
78
 
79
+ `npx` 会读取 package 的 `bin` 入口并运行 `casdoor-next-auth-kit` CLI。
80
+
78
81
  ## 包导出
79
82
 
80
83
  - `@foldspace-fe/casdoor-next-auth-kit`
package/dist/cli.js CHANGED
@@ -5,6 +5,75 @@ import {
5
5
  getMissingManagedEnvKeys
6
6
  } from "./chunk-6E27SZ7V.js";
7
7
 
8
+ // package.json
9
+ var package_default = {
10
+ name: "@foldspace-fe/casdoor-next-auth-kit",
11
+ version: "0.1.0",
12
+ private: false,
13
+ type: "module",
14
+ repository: {
15
+ type: "git",
16
+ url: "https://github.com/foldspace-stack/casdoor-next-auth-kit"
17
+ },
18
+ homepage: "https://github.com/foldspace-stack/casdoor-next-auth-kit#readme",
19
+ bugs: {
20
+ url: "https://github.com/foldspace-stack/casdoor-next-auth-kit/issues"
21
+ },
22
+ main: "./dist/index.js",
23
+ types: "./dist/index.d.ts",
24
+ exports: {
25
+ ".": {
26
+ types: "./dist/index.d.ts",
27
+ default: "./dist/index.js"
28
+ },
29
+ "./casdoor": {
30
+ types: "./dist/casdoor/index.d.ts",
31
+ default: "./dist/casdoor/index.js"
32
+ },
33
+ "./next": {
34
+ types: "./dist/next/index.d.ts",
35
+ default: "./dist/next/index.js"
36
+ },
37
+ "./billing": {
38
+ types: "./dist/billing/index.d.ts",
39
+ default: "./dist/billing/index.js"
40
+ },
41
+ "./react": {
42
+ types: "./dist/react/index.d.ts",
43
+ default: "./dist/react/index.js"
44
+ }
45
+ },
46
+ bin: {
47
+ "casdoor-next-auth-kit": "./dist/cli.js"
48
+ },
49
+ publishConfig: {
50
+ access: "public",
51
+ provenance: true
52
+ },
53
+ files: ["dist", "README.md"],
54
+ scripts: {
55
+ build: "tsup && node ./scripts/copy-skill.mjs",
56
+ typecheck: "tsc -p tsconfig.json --noEmit",
57
+ dev: "tsup --watch"
58
+ },
59
+ peerDependencies: {
60
+ next: ">=16",
61
+ "next-auth": "^4.24.0",
62
+ react: ">=19",
63
+ "react-dom": ">=19"
64
+ },
65
+ dependencies: {
66
+ jose: "^6.1.0"
67
+ },
68
+ devDependencies: {
69
+ "@types/node": "^22.15.0",
70
+ "@types/react": "^19.2.0",
71
+ "@types/react-dom": "^19.2.0",
72
+ tsup: "^8.5.0",
73
+ typescript: "^5.6.3"
74
+ }
75
+ };
76
+
8
77
  // src/cli/operations.ts
9
78
  import fs2 from "fs";
10
79
  import path2 from "path";
@@ -105,7 +174,6 @@ function authConfigTemplate() {
105
174
  createLoginRouteHandler,
106
175
  createLogoutHandler,
107
176
  createNextAuthOptions,
108
- createNextAuthRouteHandler,
109
177
  createSignupRouteHandler,
110
178
  type AuthBusinessAdapter,
111
179
  type AuthKitConfig,
@@ -201,22 +269,28 @@ export const authOptions = createNextAuthOptions({
201
269
  adapter,
202
270
  persistence,
203
271
  });
204
- export const nextAuthHandlers = createNextAuthRouteHandler({
205
- config: authKitConfig,
206
- adapter,
207
- persistence,
208
- });
209
272
  export const apiProxyHandler = createCasdoorApiProxyHandler(authKitConfig, '/auth/api', '/api');
210
273
  export const commerceProxyHandler = createCasdoorCommerceProxyHandler(authKitConfig, '/auth/api/commerce', '/api/commerce');
211
274
  `;
212
275
  }
213
276
  function nextAuthRouteTemplate() {
214
- return `import { nextAuthHandlers } from '../../../auth-config';
277
+ return `import NextAuth from 'next-auth';
278
+ import { createNextAuthOptions } from '@foldspace-fe/casdoor-next-auth-kit';
279
+ import { adapter, authKitConfig, persistence } from '../../../auth-config';
215
280
 
216
281
  export const dynamic = 'force-dynamic';
282
+ export const runtime = 'nodejs';
217
283
 
218
- export const GET = nextAuthHandlers.GET;
219
- export const POST = nextAuthHandlers.POST;
284
+ const handler = NextAuth(
285
+ createNextAuthOptions({
286
+ config: authKitConfig,
287
+ adapter,
288
+ persistence,
289
+ }),
290
+ );
291
+
292
+ export const GET = handler;
293
+ export const POST = handler;
220
294
  `;
221
295
  }
222
296
  function authIndexHtmlTemplate() {
@@ -421,12 +495,25 @@ async function checkProject() {
421
495
  }
422
496
 
423
497
  // src/cli/index.ts
498
+ function printUsage() {
499
+ console.log("Usage: npx @foldspace-fe/casdoor-next-auth-kit@latest <init|update|check>");
500
+ console.log(" npx @foldspace-fe/casdoor-next-auth-kit@latest --help");
501
+ console.log(" npx @foldspace-fe/casdoor-next-auth-kit@latest --version");
502
+ }
424
503
  async function runCli(argv) {
425
504
  const command = argv[0] ?? "help";
505
+ if (command === "--help" || command === "-h" || command === "help") {
506
+ printUsage();
507
+ return;
508
+ }
509
+ if (command === "--version" || command === "-v") {
510
+ console.log(package_default.version);
511
+ return;
512
+ }
426
513
  if (command === "init") return initProject();
427
514
  if (command === "update") return updateProject();
428
515
  if (command === "check") return checkProject();
429
- console.log("Usage: npx @foldspace-fe/casdoor-next-auth-kit <init|update|check>");
516
+ printUsage();
430
517
  }
431
518
 
432
519
  // src/cli.ts
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/operations.ts","../src/cli/fs.ts","../src/cli/templates.ts","../src/cli/index.ts","../src/cli.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { AUTH_KIT_ENV_FILES, getMissingManagedEnvKeys } from '../core/env';\nimport { exists, preserveCustomBlock, read, removePath, writeGeneratedFile, writeTextFile } from './fs';\nimport {\n apiProxyRouteTemplate,\n authConfigTemplate,\n authIndexHtmlTemplate,\n authLoginRouteTemplate,\n authSignupRouteTemplate,\n authorizeRouteTemplate,\n callbackRouteTemplate,\n commerceProxyRouteTemplate,\n envTemplate,\n logoutRouteTemplate,\n nextAuthRouteTemplate,\n prismaSchemaTemplate,\n signupAuthorizeRouteTemplate,\n} from './templates';\n\nconst projectRoot = process.cwd();\nconst distRoot = path.dirname(fileURLToPath(import.meta.url));\nconst canonicalSkillPaths = [\n path.join(distRoot, 'skills/casdoor-next-auth-kit'),\n path.resolve(distRoot, '..', '..', '..', 'skills/casdoor-next-auth-kit'),\n];\nconst skillTarget = '.agents/skills/casdoor-next-auth-kit';\n\nconst targets = [\n ['app/(auth-kit)/auth-config.ts', authConfigTemplate],\n ['app/(auth-kit)/auth/login/route.ts', authLoginRouteTemplate],\n ['app/(auth-kit)/auth/signup/route.ts', authSignupRouteTemplate],\n ['app/(auth-kit)/login/oauth/authorize/route.ts', authorizeRouteTemplate],\n ['app/(auth-kit)/signup/oauth/authorize/route.ts', signupAuthorizeRouteTemplate],\n ['app/(auth-kit)/auth/api/[...path]/route.ts', apiProxyRouteTemplate],\n ['app/(auth-kit)/api/auth/[...nextauth]/route.ts', nextAuthRouteTemplate],\n ['app/(auth-kit)/callback/route.ts', callbackRouteTemplate],\n ['app/(auth-kit)/logout/route.ts', logoutRouteTemplate],\n ['app/(auth-kit)/auth/api/commerce/[...path]/route.ts', commerceProxyRouteTemplate],\n ['app/(auth-kit)/index-html.ts', authIndexHtmlTemplate],\n ['prisma/auth-kit.prisma', prismaSchemaTemplate],\n] as const;\n\nconst deprecatedTargets = [\n 'app/(auth-kit)/api/casdoor/[...path]/route.ts',\n 'app/(auth-kit)/api/casdoor/commerce/[...path]/route.ts',\n 'app/(auth-kit)/auth/api/casdoor/[...path]/route.ts',\n 'app/(auth-kit)/auth/api/casdoor/commerce/[...path]/route.ts',\n 'app/(auth-kit)/login/route.ts',\n 'app/(auth-kit)/signup/route.ts',\n 'app/(auth-kit)/signup/oauth/authorize/route.ts',\n 'app/auth/index-html.ts',\n 'app/auth/libs/index.ts',\n 'app/auth/libs/auth-config.ts',\n 'app/auth/libs/casdoor-config.ts',\n 'app/auth/libs/session-token.ts',\n 'app/auth/libs/oauth-state.ts',\n 'app/auth/libs/page-proxy.ts',\n 'app/auth/libs/api-proxy.ts',\n 'app/auth/libs/casdoor-oauth.ts',\n 'app/auth/libs/nextauth-route.ts',\n 'app/auth/libs',\n 'lib/auth-kit/index.ts',\n 'lib/auth-kit/index-html.ts',\n 'lib/auth-kit',\n 'lib/casdoor-entry.ts',\n 'lib/auth.ts',\n 'lib/public-origin.ts',\n 'lib/request-security.ts',\n 'lib/auth-redirect.ts',\n] as const;\n\nfunction logCreated(filePath: string) {\n console.log(`+ ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction logUpdated(filePath: string) {\n console.log(`~ ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction logRemoved(filePath: string) {\n console.log(`- ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction syncManagedEnvFiles() {\n for (const file of AUTH_KIT_ENV_FILES) {\n const filePath = path.join(projectRoot, file);\n const existed = exists(filePath);\n const current = existed ? read(filePath) : '';\n const next = envTemplate(file, current);\n if (!existed || current !== next) {\n writeTextFile(filePath, next);\n if (!existed) {\n logCreated(filePath);\n } else {\n logUpdated(filePath);\n }\n }\n }\n}\n\nfunction syncManagedSkillFile() {\n const filePath = path.join(projectRoot, skillTarget);\n try {\n const sourcePath = canonicalSkillPaths.find((candidate) => fs.existsSync(candidate));\n if (!sourcePath) {\n throw new Error(`Unable to locate canonical skill directory. Checked: ${canonicalSkillPaths.join(', ')}`);\n }\n removePath(filePath);\n fs.mkdirSync(filePath, { recursive: true });\n logCreated(filePath);\n for (const entry of fs.readdirSync(sourcePath, { withFileTypes: true })) {\n const sourceEntry = path.join(sourcePath, entry.name);\n const targetEntry = path.join(filePath, entry.name);\n if (entry.isDirectory()) {\n fs.cpSync(sourceEntry, targetEntry, { recursive: true });\n console.log(`+ ${path.relative(projectRoot, targetEntry)}/`);\n continue;\n }\n fs.copyFileSync(sourceEntry, targetEntry);\n console.log(`+ ${path.relative(projectRoot, targetEntry)}`);\n }\n } catch (error) {\n console.warn(`Skipped skill sync for ${skillTarget}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport async function initProject() {\n for (const [rel, factory] of targets) {\n const filePath = path.join(projectRoot, rel);\n if (!exists(filePath)) {\n writeGeneratedFile(filePath, factory());\n logCreated(filePath);\n }\n }\n\n syncManagedEnvFiles();\n syncManagedSkillFile();\n console.log('Initialized casdoor-next-auth-kit managed files.');\n}\n\nexport async function updateProject() {\n for (const rel of deprecatedTargets) {\n const filePath = path.join(projectRoot, rel);\n if (exists(filePath)) {\n removePath(filePath);\n logRemoved(filePath);\n }\n }\n\n for (const [rel, factory] of targets) {\n const filePath = path.join(projectRoot, rel);\n const next = '// generated by @foldspace-fe/casdoor-next-auth-kit\\n' + factory();\n if (!exists(filePath)) {\n writeGeneratedFile(filePath, factory());\n logCreated(filePath);\n continue;\n }\n\n const current = read(filePath);\n const updated = preserveCustomBlock(current, next);\n if (current !== updated) {\n writeTextFile(filePath, updated);\n logUpdated(filePath);\n }\n }\n\n syncManagedEnvFiles();\n syncManagedSkillFile();\n console.log('Updated managed route shells, env files, and skill file.');\n}\n\nexport async function checkProject() {\n const missingRoutes = targets.filter(([rel]) => !exists(path.join(projectRoot, rel))).map(([rel]) => rel);\n const missingEnv = AUTH_KIT_ENV_FILES.filter((file) => {\n const filePath = path.join(projectRoot, file);\n if (!exists(filePath)) {\n return true;\n }\n return getMissingManagedEnvKeys(read(filePath)).length > 0;\n });\n const skillDir = path.join(projectRoot, skillTarget);\n const missingSkill = exists(path.join(skillDir, 'SKILL.md')) ? [] : [path.join(skillTarget, 'SKILL.md')];\n const missing = [...missingRoutes, ...missingEnv, ...missingSkill];\n\n if (missing.length > 0) {\n console.error('Missing generated files:');\n for (const rel of missing) {\n console.error('- ' + rel);\n }\n process.exitCode = 1;\n return;\n }\n\n console.log('All managed files are present.');\n}\n"," import fs from 'node:fs';\n import path from 'node:path';\n\n export const generatedHeader = '// generated by @foldspace-fe/casdoor-next-auth-kit\\n';\n export const customBegin = '// @foldspace-fe/casdoor-next-auth-kit:begin custom';\n export const customEnd = '// @foldspace-fe/casdoor-next-auth-kit:end custom';\n\nexport function ensureDir(filePath: string) {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nexport function writeGeneratedFile(filePath: string, content: string) {\n ensureDir(filePath);\n fs.writeFileSync(filePath, generatedHeader + content, 'utf8');\n}\n\nexport function writeTextFile(filePath: string, content: string) {\n ensureDir(filePath);\n fs.writeFileSync(filePath, content, 'utf8');\n}\n\nexport function exists(filePath: string) {\n return fs.existsSync(filePath);\n}\n\n export function read(filePath: string) {\n return fs.readFileSync(filePath, 'utf8');\n }\n\nexport function preserveCustomBlock(existing: string, next: string) {\n const begin = existing.indexOf(customBegin);\n const end = existing.indexOf(customEnd);\n if (begin === -1 || end === -1 || end <= begin) return next;\n const custom = existing.slice(begin, end + customEnd.length);\n const targetBegin = next.indexOf(customBegin);\n const targetEnd = next.indexOf(customEnd);\n if (targetBegin === -1 || targetEnd === -1 || targetEnd <= targetBegin) return next;\n return next.slice(0, targetBegin) + custom + next.slice(targetEnd + customEnd.length);\n}\n\nexport function removePath(filePath: string) {\n fs.rmSync(filePath, { force: true, recursive: true });\n}\n"," import { customBegin, customEnd } from './fs';\n import { buildAuthPrismaSchemaTemplate } from '../prisma/schema-template';\n import { AUTH_KIT_ENV_FILES, buildManagedEnvTemplate } from '../core/env';\n\nexport function authLoginRouteTemplate() {\n return `import { loginHandler } from '../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = loginHandler;\n`;\n}\n\nexport function authSignupRouteTemplate() {\n return `import { signupHandler } from '../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = signupHandler;\n`;\n}\n\nexport function authorizeRouteTemplate() {\n return `import { authorizeHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = authorizeHandler;\n`;\n}\n\nexport function signupAuthorizeRouteTemplate() {\n return `import { authorizeHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = authorizeHandler;\n`;\n}\n\nexport function callbackRouteTemplate() {\n return `import { callbackHandler } from '../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = callbackHandler;\n`;\n}\n\nexport function logoutRouteTemplate() {\n return `import { logoutHandler } from '../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = logoutHandler;\n`;\n}\n\nexport function authConfigTemplate() {\n return `import {\n createCallbackHandler,\n createCasdoorApiProxyHandler,\n createCasdoorCommerceProxyHandler,\n createAuthorizeRouteHandler,\n createLoginRouteHandler,\n createLogoutHandler,\n createNextAuthOptions,\n createNextAuthRouteHandler,\n createSignupRouteHandler,\n type AuthBusinessAdapter,\n type AuthKitConfig,\n type AuthPersistenceAdapter,\n type AuthUser,\n} from '@foldspace-fe/casdoor-next-auth-kit';\nimport { db } from '@/lib/db';\nimport { isGlobalAdminEmail } from '@/lib/auth-roles';\nimport { syncUserRecord } from '@/lib/user-record';\n\nexport function createAuthKitConfig(): AuthKitConfig {\n return {\n appUrl: process.env.APP_URL || process.env.NEXTAUTH_URL || '',\n nextauthSecret: process.env.NEXTAUTH_SECRET || 'dev-nextauth-secret',\n casdoor: {\n serverUrl: process.env.NEXT_PUBLIC_CASDOOR_SERVER_URL || process.env.CASDOOR_SERVER_URL || '',\n clientId: process.env.NEXT_PUBLIC_CASDOOR_CLIENT_ID || process.env.CASDOOR_CLIENT_ID || '',\n clientSecret: process.env.CASDOOR_CLIENT_SECRET || '',\n appName: process.env.NEXT_PUBLIC_CASDOOR_APP_NAME || '',\n organizationName: process.env.NEXT_PUBLIC_CASDOOR_ORGANIZATION_NAME || '',\n redirectPath: process.env.NEXT_PUBLIC_CASDOOR_REDIRECT_PATH || '/callback',\n signinPath: process.env.NEXT_PUBLIC_CASDOOR_SIGNIN_PATH || '/login/oauth/authorize',\n },\n };\n}\n\nconst authKitConfig = createAuthKitConfig();\n\nconst adapter: AuthBusinessAdapter = {\n isAdminEmail: isGlobalAdminEmail,\n};\n\nconst persistence: AuthPersistenceAdapter = {\n async syncAuthUser(user) {\n await syncUserRecord(user);\n },\n async findAuthUser({ id, email }) {\n const user = id\n ? await db.user.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n email: true,\n image: true,\n tokenBalance: true,\n isVip: true,\n isAdmin: true,\n },\n })\n : email\n ? await db.user.findFirst({\n where: { email },\n select: {\n id: true,\n name: true,\n email: true,\n image: true,\n tokenBalance: true,\n isVip: true,\n isAdmin: true,\n },\n })\n : null;\n\n if (!user) {\n return null;\n }\n\n return {\n id: user.id,\n name: user.name,\n email: user.email,\n image: user.image,\n tokenBalance: Number(user.tokenBalance ?? 2580),\n isVip: Boolean(user.isVip ?? true),\n isAdmin: Boolean(user.isAdmin) || isGlobalAdminEmail(user.email),\n } satisfies AuthUser;\n },\n};\n\nexport const loginHandler = createLoginRouteHandler(authKitConfig);\nexport const signupHandler = createSignupRouteHandler(authKitConfig);\nexport const authorizeHandler = createAuthorizeRouteHandler(authKitConfig);\nexport const callbackHandler = createCallbackHandler({\n config: authKitConfig,\n adapter,\n persistence,\n});\nexport const logoutHandler = createLogoutHandler(authKitConfig);\nexport const authOptions = createNextAuthOptions({\n config: authKitConfig,\n adapter,\n persistence,\n});\nexport const nextAuthHandlers = createNextAuthRouteHandler({\n config: authKitConfig,\n adapter,\n persistence,\n});\nexport const apiProxyHandler = createCasdoorApiProxyHandler(authKitConfig, '/auth/api', '/api');\nexport const commerceProxyHandler = createCasdoorCommerceProxyHandler(authKitConfig, '/auth/api/commerce', '/api/commerce');\n`;\n}\n\nexport function nextAuthRouteTemplate() {\n return `import { nextAuthHandlers } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = nextAuthHandlers.GET;\nexport const POST = nextAuthHandlers.POST;\n`;\n}\n\n export function authIndexHtmlTemplate() {\n return `export { AUTH_INDEX_HTML, createAuthIndexHtml } from '@foldspace-fe/casdoor-next-auth-kit';\n`;\n }\n\n export function prismaSchemaTemplate() {\n return buildAuthPrismaSchemaTemplate();\n }\n\nexport function apiProxyRouteTemplate() {\n return `import { apiProxyHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = apiProxyHandler;\nexport const HEAD = apiProxyHandler;\nexport const POST = apiProxyHandler;\nexport const PUT = apiProxyHandler;\nexport const PATCH = apiProxyHandler;\nexport const DELETE = apiProxyHandler;\nexport const OPTIONS = apiProxyHandler;\n`;\n}\n\nexport function commerceProxyRouteTemplate() {\n return `import { commerceProxyHandler } from '../../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = commerceProxyHandler;\nexport const HEAD = commerceProxyHandler;\nexport const POST = commerceProxyHandler;\nexport const PUT = commerceProxyHandler;\nexport const PATCH = commerceProxyHandler;\nexport const DELETE = commerceProxyHandler;\nexport const OPTIONS = commerceProxyHandler;\n`;\n}\n\n export function envTemplate(file: typeof AUTH_KIT_ENV_FILES[number], existingContent = '') {\n return buildManagedEnvTemplate(file, existingContent);\n }\n","import { initProject, checkProject, updateProject } from './operations';\n\nexport async function runCli(argv: string[]) {\n const command = argv[0] ?? 'help';\n if (command === 'init') return initProject();\n if (command === 'update') return updateProject();\n if (command === 'check') return checkProject();\n console.log('Usage: npx @foldspace-fe/casdoor-next-auth-kit <init|update|check>');\n}\n","import { runCli } from './cli/index';\n\nrunCli(process.argv.slice(2)).catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","path","fs"]}
1
+ {"version":3,"sources":["../package.json","../src/cli/operations.ts","../src/cli/fs.ts","../src/cli/templates.ts","../src/cli/index.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@foldspace-fe/casdoor-next-auth-kit\",\n \"version\": \"0.1.0\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/foldspace-stack/casdoor-next-auth-kit\"\n },\n \"homepage\": \"https://github.com/foldspace-stack/casdoor-next-auth-kit#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/foldspace-stack/casdoor-next-auth-kit/issues\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./casdoor\": {\n \"types\": \"./dist/casdoor/index.d.ts\",\n \"default\": \"./dist/casdoor/index.js\"\n },\n \"./next\": {\n \"types\": \"./dist/next/index.d.ts\",\n \"default\": \"./dist/next/index.js\"\n },\n \"./billing\": {\n \"types\": \"./dist/billing/index.d.ts\",\n \"default\": \"./dist/billing/index.js\"\n },\n \"./react\": {\n \"types\": \"./dist/react/index.d.ts\",\n \"default\": \"./dist/react/index.js\"\n }\n },\n \"bin\": {\n \"casdoor-next-auth-kit\": \"./dist/cli.js\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"files\": [\"dist\", \"README.md\"],\n \"scripts\": {\n \"build\": \"tsup && node ./scripts/copy-skill.mjs\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"dev\": \"tsup --watch\"\n },\n \"peerDependencies\": {\n \"next\": \">=16\",\n \"next-auth\": \"^4.24.0\",\n \"react\": \">=19\",\n \"react-dom\": \">=19\"\n },\n \"dependencies\": {\n \"jose\": \"^6.1.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"@types/react\": \"^19.2.0\",\n \"@types/react-dom\": \"^19.2.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.6.3\"\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { AUTH_KIT_ENV_FILES, getMissingManagedEnvKeys } from '../core/env';\nimport { exists, preserveCustomBlock, read, removePath, writeGeneratedFile, writeTextFile } from './fs';\nimport {\n apiProxyRouteTemplate,\n authConfigTemplate,\n authIndexHtmlTemplate,\n authLoginRouteTemplate,\n authSignupRouteTemplate,\n authorizeRouteTemplate,\n callbackRouteTemplate,\n commerceProxyRouteTemplate,\n envTemplate,\n logoutRouteTemplate,\n nextAuthRouteTemplate,\n prismaSchemaTemplate,\n signupAuthorizeRouteTemplate,\n} from './templates';\n\nconst projectRoot = process.cwd();\nconst distRoot = path.dirname(fileURLToPath(import.meta.url));\nconst canonicalSkillPaths = [\n path.join(distRoot, 'skills/casdoor-next-auth-kit'),\n path.resolve(distRoot, '..', '..', '..', 'skills/casdoor-next-auth-kit'),\n];\nconst skillTarget = '.agents/skills/casdoor-next-auth-kit';\n\nconst targets = [\n ['app/(auth-kit)/auth-config.ts', authConfigTemplate],\n ['app/(auth-kit)/auth/login/route.ts', authLoginRouteTemplate],\n ['app/(auth-kit)/auth/signup/route.ts', authSignupRouteTemplate],\n ['app/(auth-kit)/login/oauth/authorize/route.ts', authorizeRouteTemplate],\n ['app/(auth-kit)/signup/oauth/authorize/route.ts', signupAuthorizeRouteTemplate],\n ['app/(auth-kit)/auth/api/[...path]/route.ts', apiProxyRouteTemplate],\n ['app/(auth-kit)/api/auth/[...nextauth]/route.ts', nextAuthRouteTemplate],\n ['app/(auth-kit)/callback/route.ts', callbackRouteTemplate],\n ['app/(auth-kit)/logout/route.ts', logoutRouteTemplate],\n ['app/(auth-kit)/auth/api/commerce/[...path]/route.ts', commerceProxyRouteTemplate],\n ['app/(auth-kit)/index-html.ts', authIndexHtmlTemplate],\n ['prisma/auth-kit.prisma', prismaSchemaTemplate],\n] as const;\n\nconst deprecatedTargets = [\n 'app/(auth-kit)/api/casdoor/[...path]/route.ts',\n 'app/(auth-kit)/api/casdoor/commerce/[...path]/route.ts',\n 'app/(auth-kit)/auth/api/casdoor/[...path]/route.ts',\n 'app/(auth-kit)/auth/api/casdoor/commerce/[...path]/route.ts',\n 'app/(auth-kit)/login/route.ts',\n 'app/(auth-kit)/signup/route.ts',\n 'app/(auth-kit)/signup/oauth/authorize/route.ts',\n 'app/auth/index-html.ts',\n 'app/auth/libs/index.ts',\n 'app/auth/libs/auth-config.ts',\n 'app/auth/libs/casdoor-config.ts',\n 'app/auth/libs/session-token.ts',\n 'app/auth/libs/oauth-state.ts',\n 'app/auth/libs/page-proxy.ts',\n 'app/auth/libs/api-proxy.ts',\n 'app/auth/libs/casdoor-oauth.ts',\n 'app/auth/libs/nextauth-route.ts',\n 'app/auth/libs',\n 'lib/auth-kit/index.ts',\n 'lib/auth-kit/index-html.ts',\n 'lib/auth-kit',\n 'lib/casdoor-entry.ts',\n 'lib/auth.ts',\n 'lib/public-origin.ts',\n 'lib/request-security.ts',\n 'lib/auth-redirect.ts',\n] as const;\n\nfunction logCreated(filePath: string) {\n console.log(`+ ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction logUpdated(filePath: string) {\n console.log(`~ ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction logRemoved(filePath: string) {\n console.log(`- ${path.relative(projectRoot, filePath)}`);\n}\n\nfunction syncManagedEnvFiles() {\n for (const file of AUTH_KIT_ENV_FILES) {\n const filePath = path.join(projectRoot, file);\n const existed = exists(filePath);\n const current = existed ? read(filePath) : '';\n const next = envTemplate(file, current);\n if (!existed || current !== next) {\n writeTextFile(filePath, next);\n if (!existed) {\n logCreated(filePath);\n } else {\n logUpdated(filePath);\n }\n }\n }\n}\n\nfunction syncManagedSkillFile() {\n const filePath = path.join(projectRoot, skillTarget);\n try {\n const sourcePath = canonicalSkillPaths.find((candidate) => fs.existsSync(candidate));\n if (!sourcePath) {\n throw new Error(`Unable to locate canonical skill directory. Checked: ${canonicalSkillPaths.join(', ')}`);\n }\n removePath(filePath);\n fs.mkdirSync(filePath, { recursive: true });\n logCreated(filePath);\n for (const entry of fs.readdirSync(sourcePath, { withFileTypes: true })) {\n const sourceEntry = path.join(sourcePath, entry.name);\n const targetEntry = path.join(filePath, entry.name);\n if (entry.isDirectory()) {\n fs.cpSync(sourceEntry, targetEntry, { recursive: true });\n console.log(`+ ${path.relative(projectRoot, targetEntry)}/`);\n continue;\n }\n fs.copyFileSync(sourceEntry, targetEntry);\n console.log(`+ ${path.relative(projectRoot, targetEntry)}`);\n }\n } catch (error) {\n console.warn(`Skipped skill sync for ${skillTarget}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport async function initProject() {\n for (const [rel, factory] of targets) {\n const filePath = path.join(projectRoot, rel);\n if (!exists(filePath)) {\n writeGeneratedFile(filePath, factory());\n logCreated(filePath);\n }\n }\n\n syncManagedEnvFiles();\n syncManagedSkillFile();\n console.log('Initialized casdoor-next-auth-kit managed files.');\n}\n\nexport async function updateProject() {\n for (const rel of deprecatedTargets) {\n const filePath = path.join(projectRoot, rel);\n if (exists(filePath)) {\n removePath(filePath);\n logRemoved(filePath);\n }\n }\n\n for (const [rel, factory] of targets) {\n const filePath = path.join(projectRoot, rel);\n const next = '// generated by @foldspace-fe/casdoor-next-auth-kit\\n' + factory();\n if (!exists(filePath)) {\n writeGeneratedFile(filePath, factory());\n logCreated(filePath);\n continue;\n }\n\n const current = read(filePath);\n const updated = preserveCustomBlock(current, next);\n if (current !== updated) {\n writeTextFile(filePath, updated);\n logUpdated(filePath);\n }\n }\n\n syncManagedEnvFiles();\n syncManagedSkillFile();\n console.log('Updated managed route shells, env files, and skill file.');\n}\n\nexport async function checkProject() {\n const missingRoutes = targets.filter(([rel]) => !exists(path.join(projectRoot, rel))).map(([rel]) => rel);\n const missingEnv = AUTH_KIT_ENV_FILES.filter((file) => {\n const filePath = path.join(projectRoot, file);\n if (!exists(filePath)) {\n return true;\n }\n return getMissingManagedEnvKeys(read(filePath)).length > 0;\n });\n const skillDir = path.join(projectRoot, skillTarget);\n const missingSkill = exists(path.join(skillDir, 'SKILL.md')) ? [] : [path.join(skillTarget, 'SKILL.md')];\n const missing = [...missingRoutes, ...missingEnv, ...missingSkill];\n\n if (missing.length > 0) {\n console.error('Missing generated files:');\n for (const rel of missing) {\n console.error('- ' + rel);\n }\n process.exitCode = 1;\n return;\n }\n\n console.log('All managed files are present.');\n}\n"," import fs from 'node:fs';\n import path from 'node:path';\n\n export const generatedHeader = '// generated by @foldspace-fe/casdoor-next-auth-kit\\n';\n export const customBegin = '// @foldspace-fe/casdoor-next-auth-kit:begin custom';\n export const customEnd = '// @foldspace-fe/casdoor-next-auth-kit:end custom';\n\nexport function ensureDir(filePath: string) {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nexport function writeGeneratedFile(filePath: string, content: string) {\n ensureDir(filePath);\n fs.writeFileSync(filePath, generatedHeader + content, 'utf8');\n}\n\nexport function writeTextFile(filePath: string, content: string) {\n ensureDir(filePath);\n fs.writeFileSync(filePath, content, 'utf8');\n}\n\nexport function exists(filePath: string) {\n return fs.existsSync(filePath);\n}\n\n export function read(filePath: string) {\n return fs.readFileSync(filePath, 'utf8');\n }\n\nexport function preserveCustomBlock(existing: string, next: string) {\n const begin = existing.indexOf(customBegin);\n const end = existing.indexOf(customEnd);\n if (begin === -1 || end === -1 || end <= begin) return next;\n const custom = existing.slice(begin, end + customEnd.length);\n const targetBegin = next.indexOf(customBegin);\n const targetEnd = next.indexOf(customEnd);\n if (targetBegin === -1 || targetEnd === -1 || targetEnd <= targetBegin) return next;\n return next.slice(0, targetBegin) + custom + next.slice(targetEnd + customEnd.length);\n}\n\nexport function removePath(filePath: string) {\n fs.rmSync(filePath, { force: true, recursive: true });\n}\n"," import { customBegin, customEnd } from './fs';\n import { buildAuthPrismaSchemaTemplate } from '../prisma/schema-template';\n import { AUTH_KIT_ENV_FILES, buildManagedEnvTemplate } from '../core/env';\n\nexport function authLoginRouteTemplate() {\n return `import { loginHandler } from '../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = loginHandler;\n`;\n}\n\nexport function authSignupRouteTemplate() {\n return `import { signupHandler } from '../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = signupHandler;\n`;\n}\n\nexport function authorizeRouteTemplate() {\n return `import { authorizeHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = authorizeHandler;\n`;\n}\n\nexport function signupAuthorizeRouteTemplate() {\n return `import { authorizeHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = authorizeHandler;\n`;\n}\n\nexport function callbackRouteTemplate() {\n return `import { callbackHandler } from '../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = callbackHandler;\n`;\n}\n\nexport function logoutRouteTemplate() {\n return `import { logoutHandler } from '../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = logoutHandler;\n`;\n}\n\nexport function authConfigTemplate() {\n return `import {\n createCallbackHandler,\n createCasdoorApiProxyHandler,\n createCasdoorCommerceProxyHandler,\n createAuthorizeRouteHandler,\n createLoginRouteHandler,\n createLogoutHandler,\n createNextAuthOptions,\n createSignupRouteHandler,\n type AuthBusinessAdapter,\n type AuthKitConfig,\n type AuthPersistenceAdapter,\n type AuthUser,\n} from '@foldspace-fe/casdoor-next-auth-kit';\nimport { db } from '@/lib/db';\nimport { isGlobalAdminEmail } from '@/lib/auth-roles';\nimport { syncUserRecord } from '@/lib/user-record';\n\nexport function createAuthKitConfig(): AuthKitConfig {\n return {\n appUrl: process.env.APP_URL || process.env.NEXTAUTH_URL || '',\n nextauthSecret: process.env.NEXTAUTH_SECRET || 'dev-nextauth-secret',\n casdoor: {\n serverUrl: process.env.NEXT_PUBLIC_CASDOOR_SERVER_URL || process.env.CASDOOR_SERVER_URL || '',\n clientId: process.env.NEXT_PUBLIC_CASDOOR_CLIENT_ID || process.env.CASDOOR_CLIENT_ID || '',\n clientSecret: process.env.CASDOOR_CLIENT_SECRET || '',\n appName: process.env.NEXT_PUBLIC_CASDOOR_APP_NAME || '',\n organizationName: process.env.NEXT_PUBLIC_CASDOOR_ORGANIZATION_NAME || '',\n redirectPath: process.env.NEXT_PUBLIC_CASDOOR_REDIRECT_PATH || '/callback',\n signinPath: process.env.NEXT_PUBLIC_CASDOOR_SIGNIN_PATH || '/login/oauth/authorize',\n },\n };\n}\n\nconst authKitConfig = createAuthKitConfig();\n\nconst adapter: AuthBusinessAdapter = {\n isAdminEmail: isGlobalAdminEmail,\n};\n\nconst persistence: AuthPersistenceAdapter = {\n async syncAuthUser(user) {\n await syncUserRecord(user);\n },\n async findAuthUser({ id, email }) {\n const user = id\n ? await db.user.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n email: true,\n image: true,\n tokenBalance: true,\n isVip: true,\n isAdmin: true,\n },\n })\n : email\n ? await db.user.findFirst({\n where: { email },\n select: {\n id: true,\n name: true,\n email: true,\n image: true,\n tokenBalance: true,\n isVip: true,\n isAdmin: true,\n },\n })\n : null;\n\n if (!user) {\n return null;\n }\n\n return {\n id: user.id,\n name: user.name,\n email: user.email,\n image: user.image,\n tokenBalance: Number(user.tokenBalance ?? 2580),\n isVip: Boolean(user.isVip ?? true),\n isAdmin: Boolean(user.isAdmin) || isGlobalAdminEmail(user.email),\n } satisfies AuthUser;\n },\n};\n\nexport const loginHandler = createLoginRouteHandler(authKitConfig);\nexport const signupHandler = createSignupRouteHandler(authKitConfig);\nexport const authorizeHandler = createAuthorizeRouteHandler(authKitConfig);\nexport const callbackHandler = createCallbackHandler({\n config: authKitConfig,\n adapter,\n persistence,\n});\nexport const logoutHandler = createLogoutHandler(authKitConfig);\nexport const authOptions = createNextAuthOptions({\n config: authKitConfig,\n adapter,\n persistence,\n});\nexport const apiProxyHandler = createCasdoorApiProxyHandler(authKitConfig, '/auth/api', '/api');\nexport const commerceProxyHandler = createCasdoorCommerceProxyHandler(authKitConfig, '/auth/api/commerce', '/api/commerce');\n`;\n}\n\nexport function nextAuthRouteTemplate() {\n return `import NextAuth from 'next-auth';\nimport { createNextAuthOptions } from '@foldspace-fe/casdoor-next-auth-kit';\nimport { adapter, authKitConfig, persistence } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\nexport const runtime = 'nodejs';\n\nconst handler = NextAuth(\n createNextAuthOptions({\n config: authKitConfig,\n adapter,\n persistence,\n }),\n);\n\nexport const GET = handler;\nexport const POST = handler;\n`;\n}\n\n export function authIndexHtmlTemplate() {\n return `export { AUTH_INDEX_HTML, createAuthIndexHtml } from '@foldspace-fe/casdoor-next-auth-kit';\n`;\n }\n\n export function prismaSchemaTemplate() {\n return buildAuthPrismaSchemaTemplate();\n }\n\nexport function apiProxyRouteTemplate() {\n return `import { apiProxyHandler } from '../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = apiProxyHandler;\nexport const HEAD = apiProxyHandler;\nexport const POST = apiProxyHandler;\nexport const PUT = apiProxyHandler;\nexport const PATCH = apiProxyHandler;\nexport const DELETE = apiProxyHandler;\nexport const OPTIONS = apiProxyHandler;\n`;\n}\n\nexport function commerceProxyRouteTemplate() {\n return `import { commerceProxyHandler } from '../../../../auth-config';\n\nexport const dynamic = 'force-dynamic';\n\nexport const GET = commerceProxyHandler;\nexport const HEAD = commerceProxyHandler;\nexport const POST = commerceProxyHandler;\nexport const PUT = commerceProxyHandler;\nexport const PATCH = commerceProxyHandler;\nexport const DELETE = commerceProxyHandler;\nexport const OPTIONS = commerceProxyHandler;\n`;\n}\n\n export function envTemplate(file: typeof AUTH_KIT_ENV_FILES[number], existingContent = '') {\n return buildManagedEnvTemplate(file, existingContent);\n }\n","import packageJson from '../../package.json';\n\nimport { initProject, checkProject, updateProject } from './operations';\n\nfunction printUsage() {\n console.log('Usage: npx @foldspace-fe/casdoor-next-auth-kit@latest <init|update|check>');\n console.log(' npx @foldspace-fe/casdoor-next-auth-kit@latest --help');\n console.log(' npx @foldspace-fe/casdoor-next-auth-kit@latest --version');\n}\n\nexport async function runCli(argv: string[]) {\n const command = argv[0] ?? 'help';\n if (command === '--help' || command === '-h' || command === 'help') {\n printUsage();\n return;\n }\n if (command === '--version' || command === '-v') {\n console.log(packageJson.version);\n return;\n }\n if (command === 'init') return initProject();\n if (command === 'update') return updateProject();\n if (command === 'check') return checkProject();\n printUsage();\n}\n","import { runCli } from './cli/index';\n\nrunCli(process.argv.slice(2)).catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","path","fs"]}
@@ -61,7 +61,7 @@ function useAuthActions(options = {}) {
61
61
  loginHref: buildAuthJumpHref("login", redirect ?? void 0),
62
62
  signupHref: buildAuthJumpHref("signup", redirect ?? void 0),
63
63
  logoutHref: "/logout",
64
- accountHref: user.isAdmin ? "/admin" : "/user/account",
64
+ accountHref: "/user/account",
65
65
  adminHref: "/admin"
66
66
  };
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.ts","../../src/billing/react.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { Session } from 'next-auth';\nimport { SessionProvider } from 'next-auth/react';\n\nexport function AuthProvider({\n children,\n session,\n}: {\n children: ReactNode;\n session?: Session | null;\n}) {\n return <SessionProvider session={session}>{children}</SessionProvider>;\n}\n","'use client';\n\nimport { useSession } from 'next-auth/react';\nimport { buildAuthJumpHref } from '../core/redirect';\nimport type { AuthSession } from '../next/options';\n\nexport type AuthRole = 'guest' | 'user' | 'admin';\n\nexport interface AuthUserSummary {\n id: string | null;\n name: string;\n email: string | null;\n image: string | null;\n isAuthenticated: boolean;\n isAdmin: boolean;\n tokenBalance: number;\n isVip: boolean;\n role: AuthRole;\n}\n\nexport interface AuthActions {\n loginHref: string;\n signupHref: string;\n logoutHref: string;\n accountHref: string;\n adminHref: string;\n}\n\nexport interface AuthActionsOptions {\n redirect?: string | null;\n}\n\nfunction getUserSummary(session: AuthSession | null | undefined): AuthUserSummary {\n const user = session?.user;\n const name = user?.name || '登录';\n const isAuthenticated = Boolean(user);\n const isAdmin = Boolean(user?.isAdmin);\n const role: AuthRole = !isAuthenticated ? 'guest' : isAdmin ? 'admin' : 'user';\n\n return {\n id: user?.id ?? null,\n name,\n email: user?.email ?? null,\n image: user?.image ?? null,\n isAuthenticated,\n isAdmin,\n tokenBalance: Number(user?.tokenBalance ?? 2580),\n isVip: Boolean(user?.isVip ?? true),\n role,\n };\n}\n\nexport function useAuthSession() {\n return useSession() as ReturnType<typeof useSession> & {\n data: AuthSession | null | undefined;\n };\n}\n\nexport function useAuthUser(): AuthUserSummary {\n const { data: session } = useAuthSession();\n return getUserSummary(session ?? null);\n}\n\nexport function useAuthRole(): AuthRole {\n return useAuthUser().role;\n}\n\nexport function useAuthActions(options: AuthActionsOptions = {}): AuthActions {\n const user = useAuthUser();\n const redirect = options.redirect ?? null;\n\n return {\n loginHref: buildAuthJumpHref('login', redirect ?? undefined),\n signupHref: buildAuthJumpHref('signup', redirect ?? undefined),\n logoutHref: '/logout',\n accountHref: user.isAdmin ? '/admin' : '/user/account',\n adminHref: '/admin',\n };\n}\n","'use client';\n\nimport {\n type Context,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n buildBillingActionPayload,\n deriveBillingCreditsState,\n deriveBillingEntitlements,\n filterProductsByKind,\n normalizeBillingPurchaseStatus,\n normalizeBillingCatalogConfig,\n normalizeBillingRuntimeConfig,\n resolveBillingItem,\n resolveBillingProductSnapshot,\n resolveBillingSubscriptionProduct,\n} from './runtime';\nimport type {\n BillingActionExecutor,\n BillingActionKind,\n BillingActionPayload,\n BillingApiClient,\n BillingCatalogConfig,\n BillingCoreContextValue,\n BillingCreditsContextValue,\n BillingCreditsState,\n BillingDefaults,\n BillingEntitlementState,\n BillingLoaders,\n BillingOrderHistoryItem,\n BillingPaymentHistoryItem,\n BillingItem,\n BillingProductState,\n BillingProductContextValue,\n BillingProductSnapshot,\n BillingPurchaseStatus,\n BillingRuntimeConfig,\n BillingStatusState,\n BillingSubscriptionContextValue,\n BillingSubscriptionHistoryItem,\n BillingSubscriptionPurchaseConfig,\n BillingSubscriptionState,\n BillingProductPurchaseConfig,\n} from './types';\n\nexport interface BillingProviderProps {\n children: ReactNode;\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n purchaseStatus?: BillingPurchaseStatus;\n autoRefresh?: boolean;\n}\n\nexport type BillingCoreProviderProps = BillingProviderProps;\nexport interface BillingSubscriptionProviderProps {\n children: ReactNode;\n availablePlans?: BillingItem[];\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n}\n\nexport interface BillingProductProviderProps {\n children: ReactNode;\n availableProducts?: BillingItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n status?: BillingStatusState;\n}\n\nexport interface BillingCreditsProviderProps {\n children: ReactNode;\n credits?: BillingCreditsState;\n status?: BillingStatusState;\n}\n\nexport interface BillingPipelineOptions {\n onBeforeAction?: (payload: BillingActionPayload) => Promise<BillingActionPayload>;\n onAfterAction?: (result: { redirectTo?: string; nextAction?: string }) => Promise<void>;\n onError?: (error: unknown) => Promise<void>;\n}\n\nconst BillingCoreContext = createContext<BillingCoreContextValue | null>(null);\nconst BillingSubscriptionContext = createContext<BillingSubscriptionContextValue | null>(null);\nconst BillingProductContext = createContext<BillingProductContextValue | null>(null);\nconst BillingCreditsContext = createContext<BillingCreditsContextValue | null>(null);\n\nfunction useOptionalContext<T>(context: Context<T | null>): T | null {\n return useContext(context);\n}\n\nfunction useRequiredCoreContext(): BillingCoreContextValue {\n const context = useContext(BillingCoreContext);\n if (!context) {\n throw new Error('Billing hooks must be used inside BillingProvider or BillingCoreProvider.');\n }\n return context;\n}\n\nfunction choose<T>(primary: T | undefined, fallback: T | undefined): T | undefined {\n return primary ?? fallback;\n}\n\nfunction getLatestOrder(orders: BillingOrderHistoryItem[] | undefined): BillingOrderHistoryItem | undefined {\n return [...(orders ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction getLatestPayment(payments: BillingPaymentHistoryItem[] | undefined): BillingPaymentHistoryItem | undefined {\n return [...(payments ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction normalizeRuntimeConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingRuntimeConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingRuntimeConfig(config);\n}\n\nfunction normalizeCatalogConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingCatalogConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingCatalogConfig(config);\n}\n\nfunction buildCoreValue(input: {\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n runtimeCatalog?: BillingCatalogConfig;\n runtimeConfigLoading: boolean;\n runtimeConfigError: string | null;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n purchaseStatus?: BillingPurchaseStatus;\n status: BillingStatusState;\n refresh: () => Promise<void>;\n runAction: (payload: BillingActionPayload) => Promise<{\n redirectTo?: string;\n nextAction?: string;\n status?: 'pending' | 'succeeded' | 'failed';\n }>;\n setRuntimeConfig: (config?: BillingRuntimeConfig) => void;\n setSubscription: (value?: BillingSubscriptionState) => void;\n setSubscriptionHistory: (value?: BillingSubscriptionHistoryItem[]) => void;\n setProducts: (value?: BillingProductState[]) => void;\n setOrderHistory: (value?: BillingOrderHistoryItem[]) => void;\n setPaymentHistory: (value?: BillingPaymentHistoryItem[]) => void;\n setCredits: (value?: BillingCreditsState) => void;\n setEntitlements: (value?: BillingEntitlementState) => void;\n setPurchaseStatus: (status?: BillingPurchaseStatus) => void;\n setStatus: (status: BillingStatusState | ((current: BillingStatusState) => BillingStatusState)) => void;\n}): BillingCoreContextValue {\n return {\n apiClient: input.apiClient,\n loaders: input.loaders,\n runtimeConfigLoader: input.runtimeConfigLoader,\n actionExecutor: input.actionExecutor,\n defaults: input.defaults,\n runtimeConfig: input.runtimeConfig,\n runtimeCatalog: input.runtimeCatalog,\n runtimeConfigLoading: input.runtimeConfigLoading,\n runtimeConfigError: input.runtimeConfigError,\n subscription: input.subscription,\n subscriptionHistory: input.subscriptionHistory,\n products: input.products,\n orderHistory: input.orderHistory,\n paymentHistory: input.paymentHistory,\n credits: input.credits,\n entitlements: input.entitlements,\n purchaseStatus: input.purchaseStatus,\n status: input.status,\n refresh: input.refresh,\n runAction: input.runAction,\n setRuntimeConfig: input.setRuntimeConfig,\n setSubscription: input.setSubscription,\n setSubscriptionHistory: input.setSubscriptionHistory,\n setProducts: input.setProducts,\n setOrderHistory: input.setOrderHistory,\n setPaymentHistory: input.setPaymentHistory,\n setCredits: input.setCredits,\n setEntitlements: input.setEntitlements,\n setPurchaseStatus: input.setPurchaseStatus,\n setStatus: input.setStatus,\n };\n}\n\nexport function BillingProvider({\n children,\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig: runtimeConfigProp,\n subscription: subscriptionProp,\n subscriptionHistory: subscriptionHistoryProp,\n products: productsProp,\n orderHistory: orderHistoryProp,\n paymentHistory: paymentHistoryProp,\n credits: creditsProp,\n entitlements: entitlementsProp,\n status: statusProp,\n purchaseStatus: purchaseStatusProp,\n autoRefresh = true,\n}: BillingProviderProps) {\n const [runtimeConfig, setRuntimeConfig] = useState<BillingRuntimeConfig | undefined>(normalizeRuntimeConfigInput(runtimeConfigProp));\n const [runtimeCatalog, setRuntimeCatalog] = useState<BillingCatalogConfig | undefined>(normalizeCatalogConfigInput(runtimeConfigProp));\n const [runtimeConfigLoading, setRuntimeConfigLoading] = useState(false);\n const [runtimeConfigError, setRuntimeConfigError] = useState<string | null>(null);\n const [subscription, setSubscription] = useState<BillingSubscriptionState | undefined>(subscriptionProp);\n const [subscriptionHistory, setSubscriptionHistory] = useState<BillingSubscriptionHistoryItem[] | undefined>(subscriptionHistoryProp);\n const [products, setProducts] = useState<BillingProductState[] | undefined>(productsProp);\n const [orderHistory, setOrderHistory] = useState<BillingOrderHistoryItem[] | undefined>(orderHistoryProp);\n const [paymentHistory, setPaymentHistory] = useState<BillingPaymentHistoryItem[] | undefined>(paymentHistoryProp);\n const [credits, setCredits] = useState<BillingCreditsState | undefined>(creditsProp);\n const [entitlements, setEntitlements] = useState<BillingEntitlementState | undefined>(entitlementsProp);\n const [purchaseStatus, setPurchaseStatus] = useState<BillingPurchaseStatus | undefined>(purchaseStatusProp);\n const [status, setStatus] = useState<BillingStatusState>(\n statusProp ?? { loading: false, refreshing: false, error: null },\n );\n\n useEffect(() => {\n if (runtimeConfigProp) {\n setRuntimeConfig(normalizeRuntimeConfigInput(runtimeConfigProp));\n setRuntimeCatalog(normalizeCatalogConfigInput(runtimeConfigProp));\n }\n }, [runtimeConfigProp]);\n\n useEffect(() => {\n if (subscriptionProp) setSubscription(subscriptionProp);\n }, [subscriptionProp]);\n\n useEffect(() => {\n if (subscriptionHistoryProp) setSubscriptionHistory(subscriptionHistoryProp);\n }, [subscriptionHistoryProp]);\n\n useEffect(() => {\n if (productsProp) setProducts(productsProp);\n }, [productsProp]);\n\n useEffect(() => {\n if (orderHistoryProp) setOrderHistory(orderHistoryProp);\n }, [orderHistoryProp]);\n\n useEffect(() => {\n if (paymentHistoryProp) setPaymentHistory(paymentHistoryProp);\n }, [paymentHistoryProp]);\n\n useEffect(() => {\n if (creditsProp) setCredits(creditsProp);\n }, [creditsProp]);\n\n useEffect(() => {\n if (entitlementsProp) setEntitlements(entitlementsProp);\n }, [entitlementsProp]);\n\n useEffect(() => {\n if (purchaseStatusProp) setPurchaseStatus(purchaseStatusProp);\n }, [purchaseStatusProp]);\n\n useEffect(() => {\n if (statusProp) setStatus(statusProp);\n }, [statusProp]);\n\n const refresh = useCallback(async () => {\n const catalogKey = runtimeCatalog?.catalogKey ?? runtimeConfig?.catalogKey ?? 'default';\n const runtimeLoader = runtimeConfigLoader ?? apiClient.fetchRuntimeConfig;\n const resolvedLoaders = loaders ?? {};\n const subscriptionLoader = resolvedLoaders.subscriptionLoader ?? apiClient.fetchSubscription;\n const subscriptionHistoryLoader = resolvedLoaders.subscriptionHistoryLoader ?? apiClient.fetchSubscriptionHistory;\n const productsLoader = resolvedLoaders.productsLoader ?? apiClient.fetchProducts;\n const orderHistoryLoader = resolvedLoaders.orderHistoryLoader ?? apiClient.fetchOrderHistory;\n const paymentHistoryLoader = resolvedLoaders.paymentHistoryLoader ?? apiClient.fetchPaymentHistory;\n const purchaseStatusLoader = resolvedLoaders.purchaseStatusLoader ?? apiClient.fetchPurchaseStatus;\n const creditsLoader = resolvedLoaders.creditsLoader ?? apiClient.fetchCredits;\n const entitlementsLoader = resolvedLoaders.entitlementsLoader ?? apiClient.fetchEntitlements;\n\n setRuntimeConfigLoading(true);\n setRuntimeConfigError(null);\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const nextRuntimeCatalog = normalizeCatalogConfigInput(await runtimeLoader(catalogKey));\n const nextRuntimeConfig = nextRuntimeCatalog ? normalizeRuntimeConfigInput(nextRuntimeCatalog) : undefined;\n if (nextRuntimeConfig) {\n setRuntimeCatalog(nextRuntimeCatalog);\n setRuntimeConfig(nextRuntimeConfig);\n }\n\n const nextCatalogKey = nextRuntimeConfig?.catalogKey ?? nextRuntimeCatalog?.catalogKey ?? catalogKey;\n\n const [\n nextSubscription,\n nextSubscriptionHistory,\n nextProducts,\n nextOrderHistory,\n nextPaymentHistory,\n nextCredits,\n nextEntitlements,\n ] = await Promise.all([\n subscriptionLoader({ catalogKey: nextCatalogKey }),\n subscriptionHistoryLoader({ catalogKey: nextCatalogKey }),\n productsLoader({ catalogKey: nextCatalogKey }),\n orderHistoryLoader({ catalogKey: nextCatalogKey }),\n paymentHistoryLoader({ catalogKey: nextCatalogKey }),\n creditsLoader({ catalogKey: nextCatalogKey }),\n entitlementsLoader({ catalogKey: nextCatalogKey }),\n ]);\n\n const subscriptionWithProduct = nextSubscription\n ? {\n ...nextSubscription,\n product: resolveBillingSubscriptionProduct(nextSubscription, nextRuntimeConfig ?? runtimeConfig),\n }\n : undefined;\n const normalizedCredits = deriveBillingCreditsState(nextCredits, nextProducts, nextRuntimeConfig?.conversionRules ?? runtimeConfig?.conversionRules);\n const normalizedEntitlements = nextEntitlements ?? deriveBillingEntitlements(subscriptionWithProduct, nextProducts, normalizedCredits, nextRuntimeConfig ?? runtimeConfig);\n const latestOrder = getLatestOrder(nextOrderHistory);\n const latestPayment = getLatestPayment(nextPaymentHistory);\n const fetchedPurchaseStatus = await purchaseStatusLoader({\n orderId: latestOrder?.orderId,\n paymentId: latestPayment?.paymentId,\n transactionId: latestPayment?.transactionId ?? latestOrder?.transactionId,\n }).catch(() => undefined);\n const normalizedPurchaseStatus = normalizeBillingPurchaseStatus(\n fetchedPurchaseStatus,\n latestOrder,\n latestPayment,\n );\n\n setSubscription(subscriptionWithProduct);\n setSubscriptionHistory(nextSubscriptionHistory);\n setProducts(nextProducts);\n setOrderHistory(nextOrderHistory);\n setPaymentHistory(nextPaymentHistory);\n setCredits(normalizedCredits);\n setEntitlements(normalizedEntitlements);\n setPurchaseStatus(normalizedPurchaseStatus);\n setStatus({ loading: false, refreshing: false, error: null, lastFetchedAt: new Date().toISOString() });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setRuntimeConfigError(message);\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n } finally {\n setRuntimeConfigLoading(false);\n }\n }, [apiClient, loaders, runtimeConfig, runtimeConfigLoader, runtimeCatalog]);\n\n const runAction = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = buildBillingActionPayload(payload, runtimeConfig);\n const executor = actionExecutor ?? ((input: BillingActionPayload) => apiClient.createAction(input));\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'pending',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const result = await executor(prepared);\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: result.status === 'failed' ? 'failed' : result.status === 'succeeded' ? 'paid' : 'pending',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n if (result.redirectTo || result.nextAction) {\n // host handles the redirect/next action, we only persist the result\n }\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'failed',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n throw error;\n }\n },\n [actionExecutor, apiClient, refresh, runtimeConfig],\n );\n\n useEffect(() => {\n if (!autoRefresh) return;\n if (runtimeConfigLoading) return;\n if (!runtimeConfig && !runtimeConfigError) {\n void refresh();\n }\n }, [autoRefresh, refresh, runtimeConfig, runtimeConfigError, runtimeConfigLoading]);\n\n const coreValue = useMemo(\n () =>\n buildCoreValue({\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig,\n runtimeCatalog,\n runtimeConfigLoading,\n runtimeConfigError,\n subscription,\n subscriptionHistory,\n products,\n orderHistory,\n paymentHistory,\n credits,\n entitlements,\n purchaseStatus,\n status,\n refresh,\n runAction,\n setRuntimeConfig,\n setSubscription,\n setSubscriptionHistory,\n setProducts,\n setOrderHistory,\n setPaymentHistory,\n setCredits,\n setEntitlements,\n setPurchaseStatus,\n setStatus,\n }),\n [\n actionExecutor,\n apiClient,\n credits,\n defaults,\n entitlements,\n orderHistory,\n paymentHistory,\n products,\n purchaseStatus,\n refresh,\n runAction,\n runtimeConfig,\n runtimeConfigError,\n runtimeConfigLoader,\n runtimeConfigLoading,\n runtimeCatalog,\n loaders,\n status,\n subscription,\n subscriptionHistory,\n ],\n );\n\n return (\n <BillingCoreContext.Provider value={coreValue}>\n <SubscriptionProvider subscription={subscription} subscriptionHistory={subscriptionHistory} entitlements={entitlements} status={status}>\n <ProductProvider products={products} orderHistory={orderHistory} paymentHistory={paymentHistory} status={status}>\n <CreditsProvider credits={credits} status={status}>{children}</CreditsProvider>\n </ProductProvider>\n </SubscriptionProvider>\n </BillingCoreContext.Provider>\n );\n}\n\nexport function BillingCoreProvider(props: BillingCoreProviderProps) {\n return <BillingProvider {...props} />;\n}\n\nexport function SubscriptionProvider({\n children,\n availablePlans,\n subscription,\n subscriptionHistory,\n entitlements,\n status,\n}: BillingSubscriptionProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingSubscriptionContextValue>(\n () => ({\n availablePlans: choose(availablePlans, core?.runtimeConfig?.items?.filter((item) => item.kind === 'subscription')),\n subscription: choose(subscription, core?.subscription),\n subscriptionHistory: choose(subscriptionHistory, core?.subscriptionHistory),\n entitlements: choose(entitlements, core?.entitlements),\n status: choose(status, core?.status),\n }),\n [availablePlans, core?.entitlements, core?.runtimeConfig?.items, core?.status, core?.subscription, core?.subscriptionHistory, entitlements, status, subscription, subscriptionHistory],\n );\n\n return <BillingSubscriptionContext.Provider value={value}>{children}</BillingSubscriptionContext.Provider>;\n}\n\nexport function ProductProvider({\n children,\n availableProducts,\n products,\n orderHistory,\n paymentHistory,\n status,\n}: BillingProductProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingProductContextValue>(\n () => ({\n availableProducts: choose(availableProducts, core?.runtimeConfig?.items?.filter((item) => item.kind === 'product' || item.kind === 'credits')),\n products: choose(products, core?.products),\n orderHistory: choose(orderHistory, core?.orderHistory),\n paymentHistory: choose(paymentHistory, core?.paymentHistory),\n status: choose(status, core?.status),\n }),\n [availableProducts, core?.orderHistory, core?.paymentHistory, core?.products, core?.runtimeConfig?.items, core?.status, orderHistory, paymentHistory, products, status],\n );\n\n return <BillingProductContext.Provider value={value}>{children}</BillingProductContext.Provider>;\n}\n\nexport function CreditsProvider({ children, credits, status }: BillingCreditsProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingCreditsContextValue>(\n () => ({\n credits: choose(credits, core?.credits),\n status: choose(status, core?.status),\n }),\n [credits, core?.credits, core?.status, status],\n );\n\n return <BillingCreditsContext.Provider value={value}>{children}</BillingCreditsContext.Provider>;\n}\n\nexport interface BillingCatalogState {\n catalog?: BillingRuntimeConfig | BillingCatalogConfig;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingContext(): BillingCoreContextValue {\n return useRequiredCoreContext();\n}\n\nexport function useBillingCatalog(): BillingCatalogState {\n const core = useRequiredCoreContext();\n return useMemo(\n () => ({\n catalog: core.runtimeCatalog ?? core.runtimeConfig,\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeCatalog, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading],\n );\n}\n\nexport interface BillingItemState {\n item?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingItem(itemKey: string): BillingItemState {\n const core = useRequiredCoreContext();\n return useMemo(() => {\n const item = resolveBillingItem(core.runtimeConfig?.items, itemKey);\n return {\n item: resolveBillingProductSnapshot(item),\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n };\n }, [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, itemKey]);\n}\n\nexport interface BillingProductsState {\n products: BillingProductState[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProducts(options: { userId?: string; catalogKey?: string; kind?: 'product' | 'credits' } = {}): BillingProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const products = choose(productContext?.products, core.products) ?? [];\n return useMemo(\n () => ({\n products: filterProductsByKind(products, options.kind),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, options.kind, products],\n );\n}\n\nexport interface BillingAvailablePlansState {\n plans: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailablePlans(): BillingAvailablePlansState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const plans = choose(subscriptionContext?.availablePlans, core.runtimeConfig?.items?.filter((item) => item.kind === 'subscription')) ?? [];\n return useMemo(\n () => ({\n plans,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, plans],\n );\n}\n\nexport interface BillingAvailableProductsState {\n items: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailableProducts(): BillingAvailableProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const items = choose(productContext?.availableProducts, core.runtimeConfig?.items?.filter((item) => item.kind === 'product' || item.kind === 'credits')) ?? [];\n return useMemo(\n () => ({\n items,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, items],\n );\n}\n\nexport interface BillingOrderHistoryState {\n orders: BillingOrderHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingOrderHistory(_options: { userId?: string; catalogKey?: string; productKey?: string } = {}): BillingOrderHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const orders = choose(productContext?.orderHistory, core.orderHistory) ?? [];\n return useMemo(\n () => ({\n orders,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, orders],\n );\n}\n\nexport interface BillingPaymentHistoryState {\n payments: BillingPaymentHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPaymentHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingPaymentHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const payments = choose(productContext?.paymentHistory, core.paymentHistory) ?? [];\n return useMemo(\n () => ({\n payments,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, payments],\n );\n}\n\nexport interface BillingSubscriptionStateView {\n subscription?: BillingSubscriptionState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscription(): BillingSubscriptionStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n return useMemo(\n () => ({\n subscription: choose(subscriptionContext?.subscription, core.subscription),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, core.subscription, subscriptionContext?.subscription],\n );\n}\n\nexport interface BillingSubscriptionProductState {\n product?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionProduct(): BillingSubscriptionProductState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const subscription = choose(subscriptionContext?.subscription, core.subscription);\n return useMemo(\n () => ({\n product: subscription?.product ?? resolveBillingSubscriptionProduct(subscription, core.runtimeConfig),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, subscription],\n );\n}\n\nexport interface BillingSubscriptionHistoryState {\n history: BillingSubscriptionHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingSubscriptionHistoryState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const history = choose(subscriptionContext?.subscriptionHistory, core.subscriptionHistory) ?? [];\n return useMemo(\n () => ({\n history,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, history],\n );\n}\n\nexport interface BillingCreditsStateView {\n credits?: BillingCreditsState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingCredits(): BillingCreditsStateView {\n const core = useRequiredCoreContext();\n const creditsContext = useOptionalContext(BillingCreditsContext);\n const credits = choose(creditsContext?.credits, core.credits) ?? deriveBillingCreditsState(undefined, core.products, core.runtimeConfig?.conversionRules);\n return useMemo(\n () => ({\n credits,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.conversionRules, core.runtimeConfigError, core.runtimeConfigLoading, core.products, core.status.error, core.status.loading, credits],\n );\n}\n\nexport interface BillingEntitlementsStateView {\n entitlements?: BillingEntitlementState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingEntitlements(): BillingEntitlementsStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const entitlements =\n choose(subscriptionContext?.entitlements, core.entitlements) ??\n deriveBillingEntitlements(subscriptionContext?.subscription ?? core.subscription, core.products, core.credits, core.runtimeConfig);\n return useMemo(\n () => ({\n entitlements,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.credits, core.products, core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, entitlements, subscriptionContext?.subscription, core.subscription],\n );\n}\n\nexport interface BillingPurchaseStatusView {\n purchaseStatus?: BillingPurchaseStatus;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPurchaseStatus(): BillingPurchaseStatusView {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const order = getLatestOrder(choose(productContext?.orderHistory, core.orderHistory));\n const payment = getLatestPayment(choose(productContext?.paymentHistory, core.paymentHistory));\n const purchaseStatus = core.purchaseStatus ?? normalizeBillingPurchaseStatus(undefined, order, payment);\n return useMemo(\n () => ({\n purchaseStatus,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.purchaseStatus, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, order, payment, purchaseStatus],\n );\n}\n\nexport interface BillingStatusView {\n status: BillingStatusState;\n}\n\nexport function useBillingStatus(): BillingStatusView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ status: core.status }), [core.status]);\n}\n\nexport interface BillingRefreshView {\n refresh: () => Promise<void>;\n}\n\nexport function useBillingRefresh(): BillingRefreshView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ refresh: core.refresh }), [core.refresh]);\n}\n\nexport interface BillingPipelineResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n purchaseStatus?: BillingPurchaseStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPipeline(options: BillingPipelineOptions = {}): BillingPipelineResult {\n const core = useRequiredCoreContext();\n const purchaseStatusView = useBillingPurchaseStatus();\n\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = options.onBeforeAction ? await options.onBeforeAction(payload) : payload;\n try {\n const result = await core.runAction(prepared);\n if (options.onAfterAction) {\n await options.onAfterAction({ redirectTo: result.redirectTo, nextAction: result.nextAction });\n }\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n }\n throw error;\n }\n },\n [core, options],\n );\n\n return useMemo(\n () => ({\n run,\n loading: core.status.loading || core.runtimeConfigLoading,\n error: core.status.error ?? core.runtimeConfigError,\n purchaseStatus: purchaseStatusView.purchaseStatus,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, purchaseStatusView.purchaseStatus, run],\n );\n}\n\nexport interface BillingActionHookResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n}\n\nfunction useBillingActionRunner(kind: BillingActionKind, defaults?: Partial<BillingActionPayload>): BillingActionHookResult {\n const pipeline = useBillingPipeline();\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n await pipeline.run({\n ...defaults,\n ...payload,\n kind,\n });\n },\n [defaults, kind, pipeline],\n );\n\n return useMemo(\n () => ({\n run,\n loading: pipeline.loading,\n error: pipeline.error,\n }),\n [pipeline.error, pipeline.loading, run],\n );\n}\n\nexport function useSubscribePlan(): BillingActionHookResult {\n return useBillingActionRunner('subscribe');\n}\n\nexport function useManageSubscription(): BillingActionHookResult {\n return useBillingActionRunner('manage');\n}\n\nexport function useUpgradePlan(): BillingActionHookResult {\n return useBillingActionRunner('upgrade');\n}\n\nexport function useCancelSubscription(): BillingActionHookResult {\n return useBillingActionRunner('cancel');\n}\n\nexport function usePurchaseCredits(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport function usePurchaseProduct(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport interface BillingProductStateView {\n product?: BillingProductState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProduct(productKey: string): BillingProductStateView {\n const productsState = useBillingProducts();\n const product = productsState.products.find((item) => item.productKey === productKey);\n return useMemo(\n () => ({\n product,\n loading: productsState.loading,\n error: productsState.error,\n refresh: productsState.refresh,\n }),\n [product, productsState.error, productsState.loading, productsState.refresh],\n );\n}\n\nexport function useBillingCatalogConfig(): BillingCatalogState {\n return useBillingCatalog();\n}\n"],"mappings":"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","names":["jsx"]}
1
+ {"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.ts","../../src/billing/react.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { Session } from 'next-auth';\nimport { SessionProvider } from 'next-auth/react';\n\nexport function AuthProvider({\n children,\n session,\n}: {\n children: ReactNode;\n session?: Session | null;\n}) {\n return <SessionProvider session={session}>{children}</SessionProvider>;\n}\n","'use client';\n\nimport { useSession } from 'next-auth/react';\nimport { buildAuthJumpHref } from '../core/redirect';\nimport type { AuthSession } from '../next/options';\n\nexport type AuthRole = 'guest' | 'user' | 'admin';\n\nexport interface AuthUserSummary {\n id: string | null;\n name: string;\n email: string | null;\n image: string | null;\n isAuthenticated: boolean;\n isAdmin: boolean;\n tokenBalance: number;\n isVip: boolean;\n role: AuthRole;\n}\n\nexport interface AuthActions {\n loginHref: string;\n signupHref: string;\n logoutHref: string;\n accountHref: string;\n adminHref: string;\n}\n\nexport interface AuthActionsOptions {\n redirect?: string | null;\n}\n\nfunction getUserSummary(session: AuthSession | null | undefined): AuthUserSummary {\n const user = session?.user;\n const name = user?.name || '登录';\n const isAuthenticated = Boolean(user);\n const isAdmin = Boolean(user?.isAdmin);\n const role: AuthRole = !isAuthenticated ? 'guest' : isAdmin ? 'admin' : 'user';\n\n return {\n id: user?.id ?? null,\n name,\n email: user?.email ?? null,\n image: user?.image ?? null,\n isAuthenticated,\n isAdmin,\n tokenBalance: Number(user?.tokenBalance ?? 2580),\n isVip: Boolean(user?.isVip ?? true),\n role,\n };\n}\n\nexport function useAuthSession() {\n return useSession() as ReturnType<typeof useSession> & {\n data: AuthSession | null | undefined;\n };\n}\n\nexport function useAuthUser(): AuthUserSummary {\n const { data: session } = useAuthSession();\n return getUserSummary(session ?? null);\n}\n\nexport function useAuthRole(): AuthRole {\n return useAuthUser().role;\n}\n\nexport function useAuthActions(options: AuthActionsOptions = {}): AuthActions {\n const user = useAuthUser();\n const redirect = options.redirect ?? null;\n\n return {\n loginHref: buildAuthJumpHref('login', redirect ?? undefined),\n signupHref: buildAuthJumpHref('signup', redirect ?? undefined),\n logoutHref: '/logout',\n accountHref: '/user/account',\n adminHref: '/admin',\n };\n}\n","'use client';\n\nimport {\n type Context,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n buildBillingActionPayload,\n deriveBillingCreditsState,\n deriveBillingEntitlements,\n filterProductsByKind,\n normalizeBillingPurchaseStatus,\n normalizeBillingCatalogConfig,\n normalizeBillingRuntimeConfig,\n resolveBillingItem,\n resolveBillingProductSnapshot,\n resolveBillingSubscriptionProduct,\n} from './runtime';\nimport type {\n BillingActionExecutor,\n BillingActionKind,\n BillingActionPayload,\n BillingApiClient,\n BillingCatalogConfig,\n BillingCoreContextValue,\n BillingCreditsContextValue,\n BillingCreditsState,\n BillingDefaults,\n BillingEntitlementState,\n BillingLoaders,\n BillingOrderHistoryItem,\n BillingPaymentHistoryItem,\n BillingItem,\n BillingProductState,\n BillingProductContextValue,\n BillingProductSnapshot,\n BillingPurchaseStatus,\n BillingRuntimeConfig,\n BillingStatusState,\n BillingSubscriptionContextValue,\n BillingSubscriptionHistoryItem,\n BillingSubscriptionPurchaseConfig,\n BillingSubscriptionState,\n BillingProductPurchaseConfig,\n} from './types';\n\nexport interface BillingProviderProps {\n children: ReactNode;\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n purchaseStatus?: BillingPurchaseStatus;\n autoRefresh?: boolean;\n}\n\nexport type BillingCoreProviderProps = BillingProviderProps;\nexport interface BillingSubscriptionProviderProps {\n children: ReactNode;\n availablePlans?: BillingItem[];\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n}\n\nexport interface BillingProductProviderProps {\n children: ReactNode;\n availableProducts?: BillingItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n status?: BillingStatusState;\n}\n\nexport interface BillingCreditsProviderProps {\n children: ReactNode;\n credits?: BillingCreditsState;\n status?: BillingStatusState;\n}\n\nexport interface BillingPipelineOptions {\n onBeforeAction?: (payload: BillingActionPayload) => Promise<BillingActionPayload>;\n onAfterAction?: (result: { redirectTo?: string; nextAction?: string }) => Promise<void>;\n onError?: (error: unknown) => Promise<void>;\n}\n\nconst BillingCoreContext = createContext<BillingCoreContextValue | null>(null);\nconst BillingSubscriptionContext = createContext<BillingSubscriptionContextValue | null>(null);\nconst BillingProductContext = createContext<BillingProductContextValue | null>(null);\nconst BillingCreditsContext = createContext<BillingCreditsContextValue | null>(null);\n\nfunction useOptionalContext<T>(context: Context<T | null>): T | null {\n return useContext(context);\n}\n\nfunction useRequiredCoreContext(): BillingCoreContextValue {\n const context = useContext(BillingCoreContext);\n if (!context) {\n throw new Error('Billing hooks must be used inside BillingProvider or BillingCoreProvider.');\n }\n return context;\n}\n\nfunction choose<T>(primary: T | undefined, fallback: T | undefined): T | undefined {\n return primary ?? fallback;\n}\n\nfunction getLatestOrder(orders: BillingOrderHistoryItem[] | undefined): BillingOrderHistoryItem | undefined {\n return [...(orders ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction getLatestPayment(payments: BillingPaymentHistoryItem[] | undefined): BillingPaymentHistoryItem | undefined {\n return [...(payments ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction normalizeRuntimeConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingRuntimeConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingRuntimeConfig(config);\n}\n\nfunction normalizeCatalogConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingCatalogConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingCatalogConfig(config);\n}\n\nfunction buildCoreValue(input: {\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n runtimeCatalog?: BillingCatalogConfig;\n runtimeConfigLoading: boolean;\n runtimeConfigError: string | null;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n purchaseStatus?: BillingPurchaseStatus;\n status: BillingStatusState;\n refresh: () => Promise<void>;\n runAction: (payload: BillingActionPayload) => Promise<{\n redirectTo?: string;\n nextAction?: string;\n status?: 'pending' | 'succeeded' | 'failed';\n }>;\n setRuntimeConfig: (config?: BillingRuntimeConfig) => void;\n setSubscription: (value?: BillingSubscriptionState) => void;\n setSubscriptionHistory: (value?: BillingSubscriptionHistoryItem[]) => void;\n setProducts: (value?: BillingProductState[]) => void;\n setOrderHistory: (value?: BillingOrderHistoryItem[]) => void;\n setPaymentHistory: (value?: BillingPaymentHistoryItem[]) => void;\n setCredits: (value?: BillingCreditsState) => void;\n setEntitlements: (value?: BillingEntitlementState) => void;\n setPurchaseStatus: (status?: BillingPurchaseStatus) => void;\n setStatus: (status: BillingStatusState | ((current: BillingStatusState) => BillingStatusState)) => void;\n}): BillingCoreContextValue {\n return {\n apiClient: input.apiClient,\n loaders: input.loaders,\n runtimeConfigLoader: input.runtimeConfigLoader,\n actionExecutor: input.actionExecutor,\n defaults: input.defaults,\n runtimeConfig: input.runtimeConfig,\n runtimeCatalog: input.runtimeCatalog,\n runtimeConfigLoading: input.runtimeConfigLoading,\n runtimeConfigError: input.runtimeConfigError,\n subscription: input.subscription,\n subscriptionHistory: input.subscriptionHistory,\n products: input.products,\n orderHistory: input.orderHistory,\n paymentHistory: input.paymentHistory,\n credits: input.credits,\n entitlements: input.entitlements,\n purchaseStatus: input.purchaseStatus,\n status: input.status,\n refresh: input.refresh,\n runAction: input.runAction,\n setRuntimeConfig: input.setRuntimeConfig,\n setSubscription: input.setSubscription,\n setSubscriptionHistory: input.setSubscriptionHistory,\n setProducts: input.setProducts,\n setOrderHistory: input.setOrderHistory,\n setPaymentHistory: input.setPaymentHistory,\n setCredits: input.setCredits,\n setEntitlements: input.setEntitlements,\n setPurchaseStatus: input.setPurchaseStatus,\n setStatus: input.setStatus,\n };\n}\n\nexport function BillingProvider({\n children,\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig: runtimeConfigProp,\n subscription: subscriptionProp,\n subscriptionHistory: subscriptionHistoryProp,\n products: productsProp,\n orderHistory: orderHistoryProp,\n paymentHistory: paymentHistoryProp,\n credits: creditsProp,\n entitlements: entitlementsProp,\n status: statusProp,\n purchaseStatus: purchaseStatusProp,\n autoRefresh = true,\n}: BillingProviderProps) {\n const [runtimeConfig, setRuntimeConfig] = useState<BillingRuntimeConfig | undefined>(normalizeRuntimeConfigInput(runtimeConfigProp));\n const [runtimeCatalog, setRuntimeCatalog] = useState<BillingCatalogConfig | undefined>(normalizeCatalogConfigInput(runtimeConfigProp));\n const [runtimeConfigLoading, setRuntimeConfigLoading] = useState(false);\n const [runtimeConfigError, setRuntimeConfigError] = useState<string | null>(null);\n const [subscription, setSubscription] = useState<BillingSubscriptionState | undefined>(subscriptionProp);\n const [subscriptionHistory, setSubscriptionHistory] = useState<BillingSubscriptionHistoryItem[] | undefined>(subscriptionHistoryProp);\n const [products, setProducts] = useState<BillingProductState[] | undefined>(productsProp);\n const [orderHistory, setOrderHistory] = useState<BillingOrderHistoryItem[] | undefined>(orderHistoryProp);\n const [paymentHistory, setPaymentHistory] = useState<BillingPaymentHistoryItem[] | undefined>(paymentHistoryProp);\n const [credits, setCredits] = useState<BillingCreditsState | undefined>(creditsProp);\n const [entitlements, setEntitlements] = useState<BillingEntitlementState | undefined>(entitlementsProp);\n const [purchaseStatus, setPurchaseStatus] = useState<BillingPurchaseStatus | undefined>(purchaseStatusProp);\n const [status, setStatus] = useState<BillingStatusState>(\n statusProp ?? { loading: false, refreshing: false, error: null },\n );\n\n useEffect(() => {\n if (runtimeConfigProp) {\n setRuntimeConfig(normalizeRuntimeConfigInput(runtimeConfigProp));\n setRuntimeCatalog(normalizeCatalogConfigInput(runtimeConfigProp));\n }\n }, [runtimeConfigProp]);\n\n useEffect(() => {\n if (subscriptionProp) setSubscription(subscriptionProp);\n }, [subscriptionProp]);\n\n useEffect(() => {\n if (subscriptionHistoryProp) setSubscriptionHistory(subscriptionHistoryProp);\n }, [subscriptionHistoryProp]);\n\n useEffect(() => {\n if (productsProp) setProducts(productsProp);\n }, [productsProp]);\n\n useEffect(() => {\n if (orderHistoryProp) setOrderHistory(orderHistoryProp);\n }, [orderHistoryProp]);\n\n useEffect(() => {\n if (paymentHistoryProp) setPaymentHistory(paymentHistoryProp);\n }, [paymentHistoryProp]);\n\n useEffect(() => {\n if (creditsProp) setCredits(creditsProp);\n }, [creditsProp]);\n\n useEffect(() => {\n if (entitlementsProp) setEntitlements(entitlementsProp);\n }, [entitlementsProp]);\n\n useEffect(() => {\n if (purchaseStatusProp) setPurchaseStatus(purchaseStatusProp);\n }, [purchaseStatusProp]);\n\n useEffect(() => {\n if (statusProp) setStatus(statusProp);\n }, [statusProp]);\n\n const refresh = useCallback(async () => {\n const catalogKey = runtimeCatalog?.catalogKey ?? runtimeConfig?.catalogKey ?? 'default';\n const runtimeLoader = runtimeConfigLoader ?? apiClient.fetchRuntimeConfig;\n const resolvedLoaders = loaders ?? {};\n const subscriptionLoader = resolvedLoaders.subscriptionLoader ?? apiClient.fetchSubscription;\n const subscriptionHistoryLoader = resolvedLoaders.subscriptionHistoryLoader ?? apiClient.fetchSubscriptionHistory;\n const productsLoader = resolvedLoaders.productsLoader ?? apiClient.fetchProducts;\n const orderHistoryLoader = resolvedLoaders.orderHistoryLoader ?? apiClient.fetchOrderHistory;\n const paymentHistoryLoader = resolvedLoaders.paymentHistoryLoader ?? apiClient.fetchPaymentHistory;\n const purchaseStatusLoader = resolvedLoaders.purchaseStatusLoader ?? apiClient.fetchPurchaseStatus;\n const creditsLoader = resolvedLoaders.creditsLoader ?? apiClient.fetchCredits;\n const entitlementsLoader = resolvedLoaders.entitlementsLoader ?? apiClient.fetchEntitlements;\n\n setRuntimeConfigLoading(true);\n setRuntimeConfigError(null);\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const nextRuntimeCatalog = normalizeCatalogConfigInput(await runtimeLoader(catalogKey));\n const nextRuntimeConfig = nextRuntimeCatalog ? normalizeRuntimeConfigInput(nextRuntimeCatalog) : undefined;\n if (nextRuntimeConfig) {\n setRuntimeCatalog(nextRuntimeCatalog);\n setRuntimeConfig(nextRuntimeConfig);\n }\n\n const nextCatalogKey = nextRuntimeConfig?.catalogKey ?? nextRuntimeCatalog?.catalogKey ?? catalogKey;\n\n const [\n nextSubscription,\n nextSubscriptionHistory,\n nextProducts,\n nextOrderHistory,\n nextPaymentHistory,\n nextCredits,\n nextEntitlements,\n ] = await Promise.all([\n subscriptionLoader({ catalogKey: nextCatalogKey }),\n subscriptionHistoryLoader({ catalogKey: nextCatalogKey }),\n productsLoader({ catalogKey: nextCatalogKey }),\n orderHistoryLoader({ catalogKey: nextCatalogKey }),\n paymentHistoryLoader({ catalogKey: nextCatalogKey }),\n creditsLoader({ catalogKey: nextCatalogKey }),\n entitlementsLoader({ catalogKey: nextCatalogKey }),\n ]);\n\n const subscriptionWithProduct = nextSubscription\n ? {\n ...nextSubscription,\n product: resolveBillingSubscriptionProduct(nextSubscription, nextRuntimeConfig ?? runtimeConfig),\n }\n : undefined;\n const normalizedCredits = deriveBillingCreditsState(nextCredits, nextProducts, nextRuntimeConfig?.conversionRules ?? runtimeConfig?.conversionRules);\n const normalizedEntitlements = nextEntitlements ?? deriveBillingEntitlements(subscriptionWithProduct, nextProducts, normalizedCredits, nextRuntimeConfig ?? runtimeConfig);\n const latestOrder = getLatestOrder(nextOrderHistory);\n const latestPayment = getLatestPayment(nextPaymentHistory);\n const fetchedPurchaseStatus = await purchaseStatusLoader({\n orderId: latestOrder?.orderId,\n paymentId: latestPayment?.paymentId,\n transactionId: latestPayment?.transactionId ?? latestOrder?.transactionId,\n }).catch(() => undefined);\n const normalizedPurchaseStatus = normalizeBillingPurchaseStatus(\n fetchedPurchaseStatus,\n latestOrder,\n latestPayment,\n );\n\n setSubscription(subscriptionWithProduct);\n setSubscriptionHistory(nextSubscriptionHistory);\n setProducts(nextProducts);\n setOrderHistory(nextOrderHistory);\n setPaymentHistory(nextPaymentHistory);\n setCredits(normalizedCredits);\n setEntitlements(normalizedEntitlements);\n setPurchaseStatus(normalizedPurchaseStatus);\n setStatus({ loading: false, refreshing: false, error: null, lastFetchedAt: new Date().toISOString() });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setRuntimeConfigError(message);\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n } finally {\n setRuntimeConfigLoading(false);\n }\n }, [apiClient, loaders, runtimeConfig, runtimeConfigLoader, runtimeCatalog]);\n\n const runAction = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = buildBillingActionPayload(payload, runtimeConfig);\n const executor = actionExecutor ?? ((input: BillingActionPayload) => apiClient.createAction(input));\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'pending',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const result = await executor(prepared);\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: result.status === 'failed' ? 'failed' : result.status === 'succeeded' ? 'paid' : 'pending',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n if (result.redirectTo || result.nextAction) {\n // host handles the redirect/next action, we only persist the result\n }\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'failed',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n throw error;\n }\n },\n [actionExecutor, apiClient, refresh, runtimeConfig],\n );\n\n useEffect(() => {\n if (!autoRefresh) return;\n if (runtimeConfigLoading) return;\n if (!runtimeConfig && !runtimeConfigError) {\n void refresh();\n }\n }, [autoRefresh, refresh, runtimeConfig, runtimeConfigError, runtimeConfigLoading]);\n\n const coreValue = useMemo(\n () =>\n buildCoreValue({\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig,\n runtimeCatalog,\n runtimeConfigLoading,\n runtimeConfigError,\n subscription,\n subscriptionHistory,\n products,\n orderHistory,\n paymentHistory,\n credits,\n entitlements,\n purchaseStatus,\n status,\n refresh,\n runAction,\n setRuntimeConfig,\n setSubscription,\n setSubscriptionHistory,\n setProducts,\n setOrderHistory,\n setPaymentHistory,\n setCredits,\n setEntitlements,\n setPurchaseStatus,\n setStatus,\n }),\n [\n actionExecutor,\n apiClient,\n credits,\n defaults,\n entitlements,\n orderHistory,\n paymentHistory,\n products,\n purchaseStatus,\n refresh,\n runAction,\n runtimeConfig,\n runtimeConfigError,\n runtimeConfigLoader,\n runtimeConfigLoading,\n runtimeCatalog,\n loaders,\n status,\n subscription,\n subscriptionHistory,\n ],\n );\n\n return (\n <BillingCoreContext.Provider value={coreValue}>\n <SubscriptionProvider subscription={subscription} subscriptionHistory={subscriptionHistory} entitlements={entitlements} status={status}>\n <ProductProvider products={products} orderHistory={orderHistory} paymentHistory={paymentHistory} status={status}>\n <CreditsProvider credits={credits} status={status}>{children}</CreditsProvider>\n </ProductProvider>\n </SubscriptionProvider>\n </BillingCoreContext.Provider>\n );\n}\n\nexport function BillingCoreProvider(props: BillingCoreProviderProps) {\n return <BillingProvider {...props} />;\n}\n\nexport function SubscriptionProvider({\n children,\n availablePlans,\n subscription,\n subscriptionHistory,\n entitlements,\n status,\n}: BillingSubscriptionProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingSubscriptionContextValue>(\n () => ({\n availablePlans: choose(availablePlans, core?.runtimeConfig?.items?.filter((item) => item.kind === 'subscription')),\n subscription: choose(subscription, core?.subscription),\n subscriptionHistory: choose(subscriptionHistory, core?.subscriptionHistory),\n entitlements: choose(entitlements, core?.entitlements),\n status: choose(status, core?.status),\n }),\n [availablePlans, core?.entitlements, core?.runtimeConfig?.items, core?.status, core?.subscription, core?.subscriptionHistory, entitlements, status, subscription, subscriptionHistory],\n );\n\n return <BillingSubscriptionContext.Provider value={value}>{children}</BillingSubscriptionContext.Provider>;\n}\n\nexport function ProductProvider({\n children,\n availableProducts,\n products,\n orderHistory,\n paymentHistory,\n status,\n}: BillingProductProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingProductContextValue>(\n () => ({\n availableProducts: choose(availableProducts, core?.runtimeConfig?.items?.filter((item) => item.kind === 'product' || item.kind === 'credits')),\n products: choose(products, core?.products),\n orderHistory: choose(orderHistory, core?.orderHistory),\n paymentHistory: choose(paymentHistory, core?.paymentHistory),\n status: choose(status, core?.status),\n }),\n [availableProducts, core?.orderHistory, core?.paymentHistory, core?.products, core?.runtimeConfig?.items, core?.status, orderHistory, paymentHistory, products, status],\n );\n\n return <BillingProductContext.Provider value={value}>{children}</BillingProductContext.Provider>;\n}\n\nexport function CreditsProvider({ children, credits, status }: BillingCreditsProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingCreditsContextValue>(\n () => ({\n credits: choose(credits, core?.credits),\n status: choose(status, core?.status),\n }),\n [credits, core?.credits, core?.status, status],\n );\n\n return <BillingCreditsContext.Provider value={value}>{children}</BillingCreditsContext.Provider>;\n}\n\nexport interface BillingCatalogState {\n catalog?: BillingRuntimeConfig | BillingCatalogConfig;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingContext(): BillingCoreContextValue {\n return useRequiredCoreContext();\n}\n\nexport function useBillingCatalog(): BillingCatalogState {\n const core = useRequiredCoreContext();\n return useMemo(\n () => ({\n catalog: core.runtimeCatalog ?? core.runtimeConfig,\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeCatalog, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading],\n );\n}\n\nexport interface BillingItemState {\n item?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingItem(itemKey: string): BillingItemState {\n const core = useRequiredCoreContext();\n return useMemo(() => {\n const item = resolveBillingItem(core.runtimeConfig?.items, itemKey);\n return {\n item: resolveBillingProductSnapshot(item),\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n };\n }, [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, itemKey]);\n}\n\nexport interface BillingProductsState {\n products: BillingProductState[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProducts(options: { userId?: string; catalogKey?: string; kind?: 'product' | 'credits' } = {}): BillingProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const products = choose(productContext?.products, core.products) ?? [];\n return useMemo(\n () => ({\n products: filterProductsByKind(products, options.kind),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, options.kind, products],\n );\n}\n\nexport interface BillingAvailablePlansState {\n plans: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailablePlans(): BillingAvailablePlansState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const plans = choose(subscriptionContext?.availablePlans, core.runtimeConfig?.items?.filter((item) => item.kind === 'subscription')) ?? [];\n return useMemo(\n () => ({\n plans,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, plans],\n );\n}\n\nexport interface BillingAvailableProductsState {\n items: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailableProducts(): BillingAvailableProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const items = choose(productContext?.availableProducts, core.runtimeConfig?.items?.filter((item) => item.kind === 'product' || item.kind === 'credits')) ?? [];\n return useMemo(\n () => ({\n items,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, items],\n );\n}\n\nexport interface BillingOrderHistoryState {\n orders: BillingOrderHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingOrderHistory(_options: { userId?: string; catalogKey?: string; productKey?: string } = {}): BillingOrderHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const orders = choose(productContext?.orderHistory, core.orderHistory) ?? [];\n return useMemo(\n () => ({\n orders,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, orders],\n );\n}\n\nexport interface BillingPaymentHistoryState {\n payments: BillingPaymentHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPaymentHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingPaymentHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const payments = choose(productContext?.paymentHistory, core.paymentHistory) ?? [];\n return useMemo(\n () => ({\n payments,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, payments],\n );\n}\n\nexport interface BillingSubscriptionStateView {\n subscription?: BillingSubscriptionState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscription(): BillingSubscriptionStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n return useMemo(\n () => ({\n subscription: choose(subscriptionContext?.subscription, core.subscription),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, core.subscription, subscriptionContext?.subscription],\n );\n}\n\nexport interface BillingSubscriptionProductState {\n product?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionProduct(): BillingSubscriptionProductState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const subscription = choose(subscriptionContext?.subscription, core.subscription);\n return useMemo(\n () => ({\n product: subscription?.product ?? resolveBillingSubscriptionProduct(subscription, core.runtimeConfig),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, subscription],\n );\n}\n\nexport interface BillingSubscriptionHistoryState {\n history: BillingSubscriptionHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingSubscriptionHistoryState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const history = choose(subscriptionContext?.subscriptionHistory, core.subscriptionHistory) ?? [];\n return useMemo(\n () => ({\n history,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, history],\n );\n}\n\nexport interface BillingCreditsStateView {\n credits?: BillingCreditsState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingCredits(): BillingCreditsStateView {\n const core = useRequiredCoreContext();\n const creditsContext = useOptionalContext(BillingCreditsContext);\n const credits = choose(creditsContext?.credits, core.credits) ?? deriveBillingCreditsState(undefined, core.products, core.runtimeConfig?.conversionRules);\n return useMemo(\n () => ({\n credits,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.conversionRules, core.runtimeConfigError, core.runtimeConfigLoading, core.products, core.status.error, core.status.loading, credits],\n );\n}\n\nexport interface BillingEntitlementsStateView {\n entitlements?: BillingEntitlementState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingEntitlements(): BillingEntitlementsStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const entitlements =\n choose(subscriptionContext?.entitlements, core.entitlements) ??\n deriveBillingEntitlements(subscriptionContext?.subscription ?? core.subscription, core.products, core.credits, core.runtimeConfig);\n return useMemo(\n () => ({\n entitlements,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.credits, core.products, core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, entitlements, subscriptionContext?.subscription, core.subscription],\n );\n}\n\nexport interface BillingPurchaseStatusView {\n purchaseStatus?: BillingPurchaseStatus;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPurchaseStatus(): BillingPurchaseStatusView {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const order = getLatestOrder(choose(productContext?.orderHistory, core.orderHistory));\n const payment = getLatestPayment(choose(productContext?.paymentHistory, core.paymentHistory));\n const purchaseStatus = core.purchaseStatus ?? normalizeBillingPurchaseStatus(undefined, order, payment);\n return useMemo(\n () => ({\n purchaseStatus,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.purchaseStatus, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, order, payment, purchaseStatus],\n );\n}\n\nexport interface BillingStatusView {\n status: BillingStatusState;\n}\n\nexport function useBillingStatus(): BillingStatusView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ status: core.status }), [core.status]);\n}\n\nexport interface BillingRefreshView {\n refresh: () => Promise<void>;\n}\n\nexport function useBillingRefresh(): BillingRefreshView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ refresh: core.refresh }), [core.refresh]);\n}\n\nexport interface BillingPipelineResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n purchaseStatus?: BillingPurchaseStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPipeline(options: BillingPipelineOptions = {}): BillingPipelineResult {\n const core = useRequiredCoreContext();\n const purchaseStatusView = useBillingPurchaseStatus();\n\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = options.onBeforeAction ? await options.onBeforeAction(payload) : payload;\n try {\n const result = await core.runAction(prepared);\n if (options.onAfterAction) {\n await options.onAfterAction({ redirectTo: result.redirectTo, nextAction: result.nextAction });\n }\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n }\n throw error;\n }\n },\n [core, options],\n );\n\n return useMemo(\n () => ({\n run,\n loading: core.status.loading || core.runtimeConfigLoading,\n error: core.status.error ?? core.runtimeConfigError,\n purchaseStatus: purchaseStatusView.purchaseStatus,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, purchaseStatusView.purchaseStatus, run],\n );\n}\n\nexport interface BillingActionHookResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n}\n\nfunction useBillingActionRunner(kind: BillingActionKind, defaults?: Partial<BillingActionPayload>): BillingActionHookResult {\n const pipeline = useBillingPipeline();\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n await pipeline.run({\n ...defaults,\n ...payload,\n kind,\n });\n },\n [defaults, kind, pipeline],\n );\n\n return useMemo(\n () => ({\n run,\n loading: pipeline.loading,\n error: pipeline.error,\n }),\n [pipeline.error, pipeline.loading, run],\n );\n}\n\nexport function useSubscribePlan(): BillingActionHookResult {\n return useBillingActionRunner('subscribe');\n}\n\nexport function useManageSubscription(): BillingActionHookResult {\n return useBillingActionRunner('manage');\n}\n\nexport function useUpgradePlan(): BillingActionHookResult {\n return useBillingActionRunner('upgrade');\n}\n\nexport function useCancelSubscription(): BillingActionHookResult {\n return useBillingActionRunner('cancel');\n}\n\nexport function usePurchaseCredits(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport function usePurchaseProduct(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport interface BillingProductStateView {\n product?: BillingProductState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProduct(productKey: string): BillingProductStateView {\n const productsState = useBillingProducts();\n const product = productsState.products.find((item) => item.productKey === productKey);\n return useMemo(\n () => ({\n product,\n loading: productsState.loading,\n error: productsState.error,\n refresh: productsState.refresh,\n }),\n [product, productsState.error, productsState.loading, productsState.refresh],\n );\n}\n\nexport function useBillingCatalogConfig(): BillingCatalogState {\n return useBillingCatalog();\n}\n"],"mappings":"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","names":["jsx"]}
@@ -20,9 +20,9 @@ metadata:
20
20
  ## 支持的命令
21
21
 
22
22
  ```bash
23
- npx @foldspace-fe/casdoor-next-auth-kit init # 初始化:安装 skill、生成路由壳、配置 Next.js
24
- npx @foldspace-fe/casdoor-next-auth-kit update # 更新:重新生成路由壳、同步 skill 文件
25
- npx @foldspace-fe/casdoor-next-auth-kit check # 检查:验证宿主项目配置与生成物是否一致
23
+ npx @foldspace-fe/casdoor-next-auth-kit@latest init # 初始化:安装 skill、生成路由壳、配置 Next.js
24
+ npx @foldspace-fe/casdoor-next-auth-kit@latest update # 更新:重新生成路由壳、同步 skill 文件
25
+ npx @foldspace-fe/casdoor-next-auth-kit@latest check # 检查:验证宿主项目配置与生成物是否一致
26
26
  ```
27
27
 
28
28
  `init` 会将整个 skill 目录复制到宿主项目的 `.agents/skills/` 目录,并在宿主项目中生成路由壳文件。`update` 用于套件升级后同步变更。`check` 用于 CI 或手动验证,确保宿主项目未偏离套件的预期状态。
@@ -32,16 +32,16 @@ npx @foldspace-fe/casdoor-next-auth-kit check # 检查:验证宿主项目
32
32
  在宿主项目根目录执行下面的命令,不要在源码仓库内对宿主目录做手工 copy:
33
33
 
34
34
  ```bash
35
- npx @foldspace-fe/casdoor-next-auth-kit init
36
- npx @foldspace-fe/casdoor-next-auth-kit update
37
- npx @foldspace-fe/casdoor-next-auth-kit check
35
+ npx @foldspace-fe/casdoor-next-auth-kit@latest init
36
+ npx @foldspace-fe/casdoor-next-auth-kit@latest update
37
+ npx @foldspace-fe/casdoor-next-auth-kit@latest check
38
38
  ```
39
39
 
40
40
  - `init` 适合第一次接入宿主项目,缺少受管路由壳、`.env*`、`prisma/auth-kit.prisma` 或 skill 副本时使用
41
41
  - `update` 适合本仓库源码变更后,或宿主项目安装到新版本后使用
42
42
  - `check` 不会改文件,只做一致性校验,适合在 CI 或手动排查时执行
43
43
 
44
- 如果宿主项目使用的是本地 `file:` 依赖或工作区链接,先在本仓库执行 `pnpm build`,再回到宿主项目执行 `pnpm install` 或 `npx @foldspace-fe/casdoor-next-auth-kit update`,否则可能看到旧产物。
44
+ 如果宿主项目使用的是本地 `file:` 依赖或工作区链接,先在本仓库执行 `pnpm build`,再回到宿主项目执行 `pnpm install` 或 `npx @foldspace-fe/casdoor-next-auth-kit@latest update`,否则可能看到旧产物。
45
45
 
46
46
  ## 套件提供的功能
47
47
 
@@ -100,13 +100,13 @@ npx @foldspace-fe/casdoor-next-auth-kit check
100
100
 
101
101
  ### 更新成功的排查方法
102
102
 
103
- 当你执行 `npx @foldspace-fe/casdoor-next-auth-kit update` 后,可以按下面顺序确认是否真的生效:
103
+ 当你执行 `npx @foldspace-fe/casdoor-next-auth-kit@latest update` 后,可以按下面顺序确认是否真的生效:
104
104
 
105
105
  1. 先看终端输出
106
106
  - 成功更新时,CLI 会输出 `Updated managed route shells, env files, and skill file.`
107
107
  - 如果有文件变化,会额外打印 `+`、`~` 或 `-` 的路径列表
108
108
  2. 再运行一致性检查
109
- - `npx @foldspace-fe/casdoor-next-auth-kit check`
109
+ - `npx @foldspace-fe/casdoor-next-auth-kit@latest check`
110
110
  - 成功时应输出 `All managed files are present.`
111
111
  3. 核对受管文件是否已经刷新
112
112
  - `app/(auth-kit)/...`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foldspace-fe/casdoor-next-auth-kit",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {