sa2kit 3.3.0 → 3.4.0

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.
@@ -49,6 +49,29 @@ var aliyunCdnSchema = z.object({
49
49
  accessKeyId: z.string().optional(),
50
50
  accessKeySecret: z.string().optional()
51
51
  });
52
+ var huarongdaoLevelSchema = z.object({
53
+ id: z.coerce.number(),
54
+ label: z.string(),
55
+ rows: z.coerce.number(),
56
+ cols: z.coerce.number(),
57
+ shuffleSteps: z.coerce.number(),
58
+ sourceImageUrl: z.string().optional().default("")
59
+ });
60
+ var businessSchema = z.object({
61
+ /** 首页 Hero / 导航 / 时间线等(profile-v1 Home 模块) */
62
+ homePage: z.record(z.string(), z.unknown()).optional(),
63
+ huarongdao: z.object({
64
+ theme: z.enum(["miku", "sakura"]).optional(),
65
+ levels: z.array(huarongdaoLevelSchema).optional(),
66
+ bgmTracks: z.array(z.string()).optional()
67
+ }).optional(),
68
+ qiniu: z.object({
69
+ accessKey: z.string().optional(),
70
+ secretKey: z.string().optional(),
71
+ bucketName: z.string().optional(),
72
+ domain: z.string().optional()
73
+ }).optional()
74
+ }).optional();
52
75
  var appConfigSchema = z.object({
53
76
  app: z.object({
54
77
  name: z.string().min(1),
@@ -59,7 +82,8 @@ var appConfigSchema = z.object({
59
82
  storage: z.object({
60
83
  aliyunOss: aliyunOssSchema.optional(),
61
84
  aliyunCdn: aliyunCdnSchema.optional()
62
- }).optional()
85
+ }).optional(),
86
+ business: businessSchema
63
87
  });
64
88
  var FILE_BY_ENV = {
65
89
  local: "config/app.config.local.yaml",
@@ -397,5 +421,5 @@ function resolveAuthConfigFromAppConfig(config, overrides) {
397
421
  }
398
422
 
399
423
  export { SOPS_ENCRYPTED_PATH, appConfigSchema, applyAppConfigToProcessEnv, checkAppConfigFromFile, createAliyunPnvsSmsProvider, createConsoleSmsProvider, diagnoseAppConfig, getAppConfig, isNextBuildPhaseWithoutRuntimeEnv, loadAppConfig, logConfigDoctorReport, readAppConfigFile, resetAppConfigCache, resolveAppConfigEnv, resolveAppConfigPath, resolveAuthConfigFromAppConfig };
400
- //# sourceMappingURL=chunk-LGVPFYPR.mjs.map
401
- //# sourceMappingURL=chunk-LGVPFYPR.mjs.map
424
+ //# sourceMappingURL=chunk-4H3SGG3T.mjs.map
425
+ //# sourceMappingURL=chunk-4H3SGG3T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/config/bootstrap/schema.ts","../src/common/config/bootstrap/paths.ts","../src/common/config/bootstrap/apply-to-process-env.ts","../src/common/config/bootstrap/doctor.ts","../src/common/config/bootstrap/load-app-config.ts","../src/common/auth/server/sms/providers/aliyun-pnvs.ts","../src/common/auth/server/sms/providers/console.ts","../src/common/config/bootstrap/resolve-auth-from-config.ts"],"names":["parseYaml"],"mappings":"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","file":"chunk-4H3SGG3T.mjs","sourcesContent":["import { z } from 'zod';\n\nconst aliyunSmsSchema = z.object({\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n signName: z.string().optional(),\n templateCode: z.string().optional(),\n countryCode: z.string().optional(),\n codeValidMinutes: z.coerce.number().int().positive().optional(),\n endpoint: z.string().url().optional(),\n});\n\nconst authSchema = z.object({\n secret: z.string().min(32, 'auth.secret 至少 32 字符'),\n url: z.string().url('auth.url 须为合法 URL'),\n publicUrl: z.string().url('auth.publicUrl 须为合法 URL'),\n trustedOrigins: z.array(z.string().url()).optional(),\n logOtpInDev: z.boolean().optional(),\n sms: z\n .object({\n provider: z.enum(['console', 'aliyun-pnvs', 'none']).optional(),\n aliyun: aliyunSmsSchema.optional(),\n })\n .optional(),\n email: z\n .object({\n provider: z.string().optional(),\n })\n .optional(),\n});\n\nconst databaseSchema = z.object({\n url: z.string().min(1, 'database.url 不能为空'),\n poolSize: z.coerce.number().int().positive().max(100).optional(),\n timeout: z.coerce.number().int().positive().max(30000).optional(),\n sslMode: z.enum(['disable', 'prefer', 'require']).optional(),\n});\n\nconst aliyunOssSchema = z.object({\n enabled: z.boolean().optional(),\n region: z.string().optional(),\n bucket: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n customDomain: z.string().optional(),\n secure: z.boolean().optional(),\n internal: z.boolean().optional(),\n});\n\nconst aliyunCdnSchema = z.object({\n enabled: z.boolean().optional(),\n domain: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n});\n\nconst huarongdaoLevelSchema = z.object({\n id: z.coerce.number(),\n label: z.string(),\n rows: z.coerce.number(),\n cols: z.coerce.number(),\n shuffleSteps: z.coerce.number(),\n sourceImageUrl: z.string().optional().default(''),\n});\n\nconst businessSchema = z\n .object({\n /** 首页 Hero / 导航 / 时间线等(profile-v1 Home 模块) */\n homePage: z.record(z.string(), z.unknown()).optional(),\n huarongdao: z\n .object({\n theme: z.enum(['miku', 'sakura']).optional(),\n levels: z.array(huarongdaoLevelSchema).optional(),\n bgmTracks: z.array(z.string()).optional(),\n })\n .optional(),\n qiniu: z\n .object({\n accessKey: z.string().optional(),\n secretKey: z.string().optional(),\n bucketName: z.string().optional(),\n domain: z.string().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const appConfigSchema = z.object({\n app: z.object({\n name: z.string().min(1),\n env: z.enum(['development', 'production', 'test']).optional(),\n }),\n database: databaseSchema,\n auth: authSchema,\n storage: z\n .object({\n aliyunOss: aliyunOssSchema.optional(),\n aliyunCdn: aliyunCdnSchema.optional(),\n })\n .optional(),\n business: businessSchema,\n});\n\nexport type AppConfig = z.infer<typeof appConfigSchema>;\nexport type AppConfigInput = z.input<typeof appConfigSchema>;\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport type AppConfigEnvName = 'local' | 'production' | 'test';\n\nexport type ResolveAppConfigPathOptions = {\n cwd?: string;\n env?: AppConfigEnvName;\n explicitPath?: string;\n};\n\nconst FILE_BY_ENV: Record<AppConfigEnvName, string> = {\n local: 'config/app.config.local.yaml',\n production: 'config/app.config.production.yaml',\n test: 'config/app.config.test.yaml',\n};\n\n/** SOPS 密文默认路径(解密前由运维/脚本处理,应用运行时读明文 production.yaml) */\nexport const SOPS_ENCRYPTED_PATH = 'config/production.enc.yaml';\n\nexport function resolveAppConfigEnv(): AppConfigEnvName {\n const fromEnv = process.env.APP_CONFIG_ENV?.trim();\n if (fromEnv === 'local' || fromEnv === 'production' || fromEnv === 'test') {\n return fromEnv;\n }\n if (process.env.NODE_ENV === 'production') return 'production';\n if (process.env.NODE_ENV === 'test') return 'test';\n return 'local';\n}\n\nexport function isNextBuildPhaseWithoutRuntimeEnv(): boolean {\n return (\n process.env.NEXT_PHASE === 'phase-production-build' ||\n process.env.NEXT_PHASE === 'phase-export'\n );\n}\n\nexport function resolveAppConfigPath(options: ResolveAppConfigPathOptions = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n if (options.explicitPath) {\n return resolve(cwd, options.explicitPath);\n }\n\n const fromEnv = process.env.APP_CONFIG_PATH?.trim();\n if (fromEnv) {\n return resolve(cwd, fromEnv);\n }\n\n const envName = options.env ?? resolveAppConfigEnv();\n const candidate = resolve(cwd, FILE_BY_ENV[envName]);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const examplePath = resolve(cwd, 'config/app.config.example.yaml');\n if (isNextBuildPhaseWithoutRuntimeEnv() && existsSync(examplePath)) {\n return examplePath;\n }\n\n // 开发回退:local 不存在时尝试 production(CI / 解密后路径)\n if (envName === 'local') {\n const productionFallback = resolve(cwd, FILE_BY_ENV.production);\n if (existsSync(productionFallback)) {\n return productionFallback;\n }\n }\n\n return candidate;\n}\n","import type { AppConfig } from './schema';\n\n/**\n * 将 AppConfig 同步到 process.env,兼容仍读取扁平 env 的 sa2kit 模块(ossFile、legacy 脚本)。\n * 仅在进程内调用一次;已有非空 env 不被覆盖。\n */\nexport function applyAppConfigToProcessEnv(config: AppConfig): void {\n const set = (key: string, value: string | undefined) => {\n if (!value || (process.env[key] && process.env[key]!.length > 0)) return;\n process.env[key] = value;\n };\n\n set('DATABASE_URL', config.database.url);\n if (config.database.poolSize !== undefined) {\n set('DATABASE_POOL_SIZE', String(config.database.poolSize));\n }\n if (config.database.timeout !== undefined) {\n set('DATABASE_TIMEOUT', String(config.database.timeout));\n }\n if (config.database.sslMode) {\n set('DATABASE_SSL_MODE', config.database.sslMode);\n }\n\n set('BETTER_AUTH_SECRET', config.auth.secret);\n set('BETTER_AUTH_URL', config.auth.url);\n set('NEXT_PUBLIC_APP_URL', config.auth.publicUrl);\n\n if (config.auth.trustedOrigins?.length) {\n set('BETTER_AUTH_TRUSTED_ORIGINS', config.auth.trustedOrigins.join(','));\n }\n\n const smsProvider = config.auth.sms?.provider;\n if (smsProvider) {\n set('SA2KIT_SMS_PROVIDER', smsProvider);\n }\n\n const aliyunSms = config.auth.sms?.aliyun;\n if (aliyunSms) {\n set('ALIYUN_SMS_ACCESS_KEY_ID', aliyunSms.accessKeyId);\n set('ALIYUN_SMS_ACCESS_KEY_SECRET', aliyunSms.accessKeySecret);\n set('ALIYUN_SMS_SIGN_NAME', aliyunSms.signName);\n set('ALIYUN_SMS_TEMPLATE_CODE', aliyunSms.templateCode);\n set('ALIYUN_SMS_COUNTRY_CODE', aliyunSms.countryCode);\n if (aliyunSms.codeValidMinutes !== undefined) {\n set('ALIYUN_SMS_CODE_VALID_MINUTES', String(aliyunSms.codeValidMinutes));\n }\n set('ALIYUN_SMS_ENDPOINT', aliyunSms.endpoint);\n }\n\n if (config.auth.email?.provider) {\n set('SA2KIT_EMAIL_PROVIDER', config.auth.email.provider);\n }\n\n if (config.auth.logOtpInDev !== undefined) {\n set('SA2KIT_AUTH_LOG_OTP', config.auth.logOtpInDev ? '1' : '0');\n }\n\n const oss = config.storage?.aliyunOss;\n if (oss) {\n if (oss.region) set('ALIYUN_OSS_REGION', oss.region);\n if (oss.bucket) set('ALIYUN_OSS_BUCKET', oss.bucket);\n if (oss.accessKeyId) set('ALIYUN_OSS_ACCESS_KEY_ID', oss.accessKeyId);\n if (oss.accessKeySecret) set('ALIYUN_OSS_ACCESS_KEY_SECRET', oss.accessKeySecret);\n if (oss.customDomain) set('ALIYUN_OSS_CUSTOM_DOMAIN', oss.customDomain);\n if (oss.secure !== undefined) set('ALIYUN_OSS_SECURE', oss.secure ? 'true' : 'false');\n if (oss.internal !== undefined) set('ALIYUN_OSS_INTERNAL', oss.internal ? 'true' : 'false');\n }\n\n const cdn = config.storage?.aliyunCdn;\n if (cdn) {\n if (cdn.domain) set('ALIYUN_CDN_DOMAIN', cdn.domain);\n if (cdn.accessKeyId) set('ALIYUN_CDN_ACCESS_KEY_ID', cdn.accessKeyId);\n if (cdn.accessKeySecret) set('ALIYUN_CDN_ACCESS_KEY_SECRET', cdn.accessKeySecret);\n }\n}\n","import type { AppConfig } from './schema';\n\nexport type ConfigDoctorIssueLevel = 'error' | 'warning' | 'info';\n\nexport type ConfigDoctorIssue = {\n level: ConfigDoctorIssueLevel;\n featureId: string;\n featureName: string;\n message: string;\n hints?: string[];\n};\n\nexport type ConfigDoctorReport = {\n ok: boolean;\n issues: ConfigDoctorIssue[];\n enabledFeatures: string[];\n};\n\nfunction isSet(value: string | undefined): boolean {\n return Boolean(value && value.trim().length > 0);\n}\n\nexport function diagnoseAppConfig(config: AppConfig): ConfigDoctorReport {\n const issues: ConfigDoctorIssue[] = [];\n const enabledFeatures: string[] = ['app', 'database', 'auth-core'];\n\n const env = config.app.env ?? process.env.NODE_ENV ?? 'development';\n const isProd = env === 'production';\n\n // Auth SMS\n const smsProvider = config.auth.sms?.provider ?? (isProd ? undefined : 'console');\n if (smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n const missing = [\n !isSet(aliyun?.accessKeyId) && 'auth.sms.aliyun.accessKeyId',\n !isSet(aliyun?.accessKeySecret) && 'auth.sms.aliyun.accessKeySecret',\n !isSet(aliyun?.signName) && 'auth.sms.aliyun.signName',\n !isSet(aliyun?.templateCode) && 'auth.sms.aliyun.templateCode',\n ].filter(Boolean) as string[];\n\n if (missing.length === 0) {\n enabledFeatures.push('auth-sms');\n } else {\n issues.push({\n level: 'error',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: `sms.provider=aliyun-pnvs 但缺少:${missing.join(', ')}`,\n });\n }\n } else if (smsProvider === 'console') {\n enabledFeatures.push('auth-sms');\n if (isProd) {\n issues.push({\n level: 'warning',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: '生产环境使用 console SMS,验证码仅输出到日志。',\n hints: ['生产请改为 aliyun-pnvs 并填写 auth.sms.aliyun.*'],\n });\n }\n } else {\n issues.push({\n level: isProd ? 'warning' : 'info',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: isProd\n ? '未配置短信 provider,用户收不到验证码。'\n : '未配置短信;开发可设 auth.sms.provider: console',\n hints: ['开发:auth.sms.provider: console', '生产:auth.sms.provider: aliyun-pnvs'],\n });\n }\n\n // OSS\n const oss = config.storage?.aliyunOss;\n const ossComplete =\n oss?.enabled !== false &&\n isSet(oss?.region) &&\n isSet(oss?.bucket) &&\n isSet(oss?.accessKeyId) &&\n isSet(oss?.accessKeySecret);\n\n if (ossComplete) {\n enabledFeatures.push('storage-oss');\n } else if (oss?.enabled === true) {\n issues.push({\n level: 'error',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: 'storage.aliyunOss.enabled 为 true 但配置不完整。',\n });\n } else {\n issues.push({\n level: 'info',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: '未启用完整 OSS 配置,文件上传将回退本地存储(若模块允许)。',\n });\n }\n\n const ok = !issues.some((i) => i.level === 'error');\n return { ok, issues, enabledFeatures };\n}\n\nlet loggedOnce = false;\n\nexport function logConfigDoctorReport(report: ConfigDoctorReport, options?: { force?: boolean }): void {\n if (loggedOnce && !options?.force) return;\n loggedOnce = true;\n\n const lines: string[] = ['[sa2kit/config] 配置检查'];\n for (const issue of report.issues) {\n const prefix = issue.level === 'error' ? '✗' : issue.level === 'warning' ? '⚠' : '○';\n lines.push(`${prefix} ${issue.featureName}: ${issue.message}`);\n for (const hint of issue.hints ?? []) {\n lines.push(` → ${hint}`);\n }\n }\n if (report.issues.length === 0) {\n lines.push('✓ 配置项检查通过');\n }\n lines.push(` 已启用: ${report.enabledFeatures.join(', ')}`);\n console.info(lines.join('\\n'));\n}\n","import { readFileSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { applyAppConfigToProcessEnv } from './apply-to-process-env';\nimport { diagnoseAppConfig, logConfigDoctorReport, type ConfigDoctorReport } from './doctor';\nimport { resolveAppConfigPath, type ResolveAppConfigPathOptions } from './paths';\nimport { appConfigSchema, type AppConfig } from './schema';\n\nexport type LoadAppConfigOptions = ResolveAppConfigPathOptions & {\n /** 是否写入 process.env(默认 true) */\n applyToProcessEnv?: boolean;\n /** 是否打印 doctor 报告(默认 true) */\n logDoctor?: boolean;\n};\n\nlet cachedConfig: AppConfig | undefined;\nlet cachedPath: string | undefined;\n\nexport function readAppConfigFile(filePath: string): AppConfig {\n const raw = readFileSync(filePath, 'utf8');\n const parsed = parseYaml(raw);\n const result = appConfigSchema.safeParse(parsed);\n\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n throw new Error(`AppConfig 校验失败 (${filePath}):\\n${details}`);\n }\n\n return result.data;\n}\n\nexport function loadAppConfig(options: LoadAppConfigOptions = {}): AppConfig {\n const filePath = resolveAppConfigPath(options);\n\n if (cachedConfig && cachedPath === filePath) {\n return cachedConfig;\n }\n\n const config = readAppConfigFile(filePath);\n cachedPath = filePath;\n cachedConfig = config;\n\n if (options.applyToProcessEnv !== false) {\n applyAppConfigToProcessEnv(config);\n }\n\n if (options.logDoctor !== false) {\n logConfigDoctorReport(diagnoseAppConfig(config));\n }\n\n return config;\n}\n\nexport function getAppConfig(): AppConfig {\n if (!cachedConfig) {\n return loadAppConfig();\n }\n return cachedConfig;\n}\n\nexport function resetAppConfigCache(): void {\n cachedConfig = undefined;\n cachedPath = undefined;\n}\n\nexport function checkAppConfigFromFile(\n filePath: string,\n): { config: AppConfig; report: ConfigDoctorReport } {\n const config = readAppConfigFile(filePath);\n return { config, report: diagnoseAppConfig(config) };\n}\n","import type { AliyunPnvsSmsConfig, Sa2kitSmsProvider } from '../types';\n\ntype PopCoreClient = {\n request(\n action: string,\n params: Record<string, string>,\n options?: { method?: string },\n ): Promise<{ Code?: string; Success?: boolean; Message?: string }>;\n};\n\nasync function loadPopCore(): Promise<new (config: Record<string, string>) => PopCoreClient> {\n try {\n const mod = await import('@alicloud/pop-core');\n return (mod.default ?? mod) as unknown as new (config: Record<string, string>) => PopCoreClient;\n } catch {\n throw new Error(\n '启用 SA2KIT_SMS_PROVIDER=aliyun-pnvs 需要安装 @alicloud/pop-core:pnpm add @alicloud/pop-core',\n );\n }\n}\n\nexport function createAliyunPnvsSmsProvider(config: AliyunPnvsSmsConfig): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n const Core = await loadPopCore();\n const client = new Core({\n accessKeyId: config.accessKeyId,\n accessKeySecret: config.accessKeySecret,\n endpoint: config.endpoint ?? 'https://dypnsapi.aliyuncs.com',\n apiVersion: '2017-05-25',\n });\n\n const minutes = String(config.codeValidMinutes ?? 5);\n const result = await client.request(\n 'SendSmsVerifyCode',\n {\n PhoneNumber: phoneNumber,\n CountryCode: config.countryCode ?? '86',\n SignName: config.signName,\n TemplateCode: config.templateCode,\n TemplateParam: JSON.stringify({ code, min: minutes }),\n },\n { method: 'POST' },\n );\n\n if (result.Code !== 'OK' && result.Success !== true) {\n throw new Error(\n `阿里云短信认证发送失败: ${result.Message ?? result.Code ?? 'unknown error'}`,\n );\n }\n },\n };\n}\n","import type { Sa2kitSmsProvider } from '../types';\n\nexport function createConsoleSmsProvider(): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n console.info(`[sa2kit/auth][sms][console] ${phoneNumber} => ${code}`);\n },\n };\n}\n","import type { Sa2kitAuthConfig } from '../../auth/server/types';\nimport type { AppConfig } from './schema';\nimport { createAliyunPnvsSmsProvider } from '../../auth/server/sms/providers/aliyun-pnvs';\nimport { createConsoleSmsProvider } from '../../auth/server/sms/providers/console';\n\nfunction parseTrustedOrigins(config: AppConfig): string[] {\n const baseURL = config.auth.url;\n const defaults = [baseURL, 'http://localhost:3000', 'http://127.0.0.1:3000'];\n const extra = config.auth.trustedOrigins ?? [];\n return [...defaults, ...extra].filter((origin, index, list) => list.indexOf(origin) === index);\n}\n\nexport function resolveAuthConfigFromAppConfig(\n config: AppConfig,\n overrides: Partial<Sa2kitAuthConfig> & Pick<Sa2kitAuthConfig, 'db'>,\n): Sa2kitAuthConfig {\n const smsProvider = config.auth.sms?.provider ?? 'console';\n let sms = overrides.sms;\n\n if (!sms && smsProvider === 'console') {\n const consoleProvider = createConsoleSmsProvider();\n sms = { sendOTP: consoleProvider.sendOTP.bind(consoleProvider) };\n }\n\n if (!sms && smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n if (\n aliyun?.accessKeyId &&\n aliyun.accessKeySecret &&\n aliyun.signName &&\n aliyun.templateCode\n ) {\n const provider = createAliyunPnvsSmsProvider({\n accessKeyId: aliyun.accessKeyId,\n accessKeySecret: aliyun.accessKeySecret,\n signName: aliyun.signName,\n templateCode: aliyun.templateCode,\n countryCode: aliyun.countryCode ?? '86',\n codeValidMinutes: aliyun.codeValidMinutes ?? 5,\n endpoint: aliyun.endpoint,\n });\n sms = { sendOTP: provider.sendOTP.bind(provider) };\n }\n }\n\n const isProd = (config.app.env ?? process.env.NODE_ENV) === 'production';\n\n return {\n db: overrides.db,\n baseURL: overrides.baseURL ?? config.auth.url,\n secret: overrides.secret ?? config.auth.secret,\n trustedOrigins: overrides.trustedOrigins ?? parseTrustedOrigins(config),\n basePath: overrides.basePath,\n sms: overrides.sms ?? sms,\n email: overrides.email,\n phoneNumberValidator: overrides.phoneNumberValidator,\n logOtpInDev:\n overrides.logOtpInDev ??\n config.auth.logOtpInDev ??\n (!isProd || process.env.SA2KIT_AUTH_LOG_OTP === '1'),\n };\n}\n"]}
@@ -51,6 +51,29 @@ var aliyunCdnSchema = zod.z.object({
51
51
  accessKeyId: zod.z.string().optional(),
52
52
  accessKeySecret: zod.z.string().optional()
53
53
  });
54
+ var huarongdaoLevelSchema = zod.z.object({
55
+ id: zod.z.coerce.number(),
56
+ label: zod.z.string(),
57
+ rows: zod.z.coerce.number(),
58
+ cols: zod.z.coerce.number(),
59
+ shuffleSteps: zod.z.coerce.number(),
60
+ sourceImageUrl: zod.z.string().optional().default("")
61
+ });
62
+ var businessSchema = zod.z.object({
63
+ /** 首页 Hero / 导航 / 时间线等(profile-v1 Home 模块) */
64
+ homePage: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
65
+ huarongdao: zod.z.object({
66
+ theme: zod.z.enum(["miku", "sakura"]).optional(),
67
+ levels: zod.z.array(huarongdaoLevelSchema).optional(),
68
+ bgmTracks: zod.z.array(zod.z.string()).optional()
69
+ }).optional(),
70
+ qiniu: zod.z.object({
71
+ accessKey: zod.z.string().optional(),
72
+ secretKey: zod.z.string().optional(),
73
+ bucketName: zod.z.string().optional(),
74
+ domain: zod.z.string().optional()
75
+ }).optional()
76
+ }).optional();
54
77
  var appConfigSchema = zod.z.object({
55
78
  app: zod.z.object({
56
79
  name: zod.z.string().min(1),
@@ -61,7 +84,8 @@ var appConfigSchema = zod.z.object({
61
84
  storage: zod.z.object({
62
85
  aliyunOss: aliyunOssSchema.optional(),
63
86
  aliyunCdn: aliyunCdnSchema.optional()
64
- }).optional()
87
+ }).optional(),
88
+ business: businessSchema
65
89
  });
66
90
  var FILE_BY_ENV = {
67
91
  local: "config/app.config.local.yaml",
@@ -414,5 +438,5 @@ exports.resetAppConfigCache = resetAppConfigCache;
414
438
  exports.resolveAppConfigEnv = resolveAppConfigEnv;
415
439
  exports.resolveAppConfigPath = resolveAppConfigPath;
416
440
  exports.resolveAuthConfigFromAppConfig = resolveAuthConfigFromAppConfig;
417
- //# sourceMappingURL=chunk-5H2FICSO.js.map
418
- //# sourceMappingURL=chunk-5H2FICSO.js.map
441
+ //# sourceMappingURL=chunk-LBMUIWJR.js.map
442
+ //# sourceMappingURL=chunk-LBMUIWJR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/config/bootstrap/schema.ts","../src/common/config/bootstrap/paths.ts","../src/common/config/bootstrap/apply-to-process-env.ts","../src/common/config/bootstrap/doctor.ts","../src/common/config/bootstrap/load-app-config.ts","../src/common/auth/server/sms/providers/aliyun-pnvs.ts","../src/common/auth/server/sms/providers/console.ts","../src/common/config/bootstrap/resolve-auth-from-config.ts"],"names":["z","resolve","existsSync","readFileSync","parseYaml"],"mappings":"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","file":"chunk-LBMUIWJR.js","sourcesContent":["import { z } from 'zod';\n\nconst aliyunSmsSchema = z.object({\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n signName: z.string().optional(),\n templateCode: z.string().optional(),\n countryCode: z.string().optional(),\n codeValidMinutes: z.coerce.number().int().positive().optional(),\n endpoint: z.string().url().optional(),\n});\n\nconst authSchema = z.object({\n secret: z.string().min(32, 'auth.secret 至少 32 字符'),\n url: z.string().url('auth.url 须为合法 URL'),\n publicUrl: z.string().url('auth.publicUrl 须为合法 URL'),\n trustedOrigins: z.array(z.string().url()).optional(),\n logOtpInDev: z.boolean().optional(),\n sms: z\n .object({\n provider: z.enum(['console', 'aliyun-pnvs', 'none']).optional(),\n aliyun: aliyunSmsSchema.optional(),\n })\n .optional(),\n email: z\n .object({\n provider: z.string().optional(),\n })\n .optional(),\n});\n\nconst databaseSchema = z.object({\n url: z.string().min(1, 'database.url 不能为空'),\n poolSize: z.coerce.number().int().positive().max(100).optional(),\n timeout: z.coerce.number().int().positive().max(30000).optional(),\n sslMode: z.enum(['disable', 'prefer', 'require']).optional(),\n});\n\nconst aliyunOssSchema = z.object({\n enabled: z.boolean().optional(),\n region: z.string().optional(),\n bucket: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n customDomain: z.string().optional(),\n secure: z.boolean().optional(),\n internal: z.boolean().optional(),\n});\n\nconst aliyunCdnSchema = z.object({\n enabled: z.boolean().optional(),\n domain: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n});\n\nconst huarongdaoLevelSchema = z.object({\n id: z.coerce.number(),\n label: z.string(),\n rows: z.coerce.number(),\n cols: z.coerce.number(),\n shuffleSteps: z.coerce.number(),\n sourceImageUrl: z.string().optional().default(''),\n});\n\nconst businessSchema = z\n .object({\n /** 首页 Hero / 导航 / 时间线等(profile-v1 Home 模块) */\n homePage: z.record(z.string(), z.unknown()).optional(),\n huarongdao: z\n .object({\n theme: z.enum(['miku', 'sakura']).optional(),\n levels: z.array(huarongdaoLevelSchema).optional(),\n bgmTracks: z.array(z.string()).optional(),\n })\n .optional(),\n qiniu: z\n .object({\n accessKey: z.string().optional(),\n secretKey: z.string().optional(),\n bucketName: z.string().optional(),\n domain: z.string().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const appConfigSchema = z.object({\n app: z.object({\n name: z.string().min(1),\n env: z.enum(['development', 'production', 'test']).optional(),\n }),\n database: databaseSchema,\n auth: authSchema,\n storage: z\n .object({\n aliyunOss: aliyunOssSchema.optional(),\n aliyunCdn: aliyunCdnSchema.optional(),\n })\n .optional(),\n business: businessSchema,\n});\n\nexport type AppConfig = z.infer<typeof appConfigSchema>;\nexport type AppConfigInput = z.input<typeof appConfigSchema>;\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport type AppConfigEnvName = 'local' | 'production' | 'test';\n\nexport type ResolveAppConfigPathOptions = {\n cwd?: string;\n env?: AppConfigEnvName;\n explicitPath?: string;\n};\n\nconst FILE_BY_ENV: Record<AppConfigEnvName, string> = {\n local: 'config/app.config.local.yaml',\n production: 'config/app.config.production.yaml',\n test: 'config/app.config.test.yaml',\n};\n\n/** SOPS 密文默认路径(解密前由运维/脚本处理,应用运行时读明文 production.yaml) */\nexport const SOPS_ENCRYPTED_PATH = 'config/production.enc.yaml';\n\nexport function resolveAppConfigEnv(): AppConfigEnvName {\n const fromEnv = process.env.APP_CONFIG_ENV?.trim();\n if (fromEnv === 'local' || fromEnv === 'production' || fromEnv === 'test') {\n return fromEnv;\n }\n if (process.env.NODE_ENV === 'production') return 'production';\n if (process.env.NODE_ENV === 'test') return 'test';\n return 'local';\n}\n\nexport function isNextBuildPhaseWithoutRuntimeEnv(): boolean {\n return (\n process.env.NEXT_PHASE === 'phase-production-build' ||\n process.env.NEXT_PHASE === 'phase-export'\n );\n}\n\nexport function resolveAppConfigPath(options: ResolveAppConfigPathOptions = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n if (options.explicitPath) {\n return resolve(cwd, options.explicitPath);\n }\n\n const fromEnv = process.env.APP_CONFIG_PATH?.trim();\n if (fromEnv) {\n return resolve(cwd, fromEnv);\n }\n\n const envName = options.env ?? resolveAppConfigEnv();\n const candidate = resolve(cwd, FILE_BY_ENV[envName]);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const examplePath = resolve(cwd, 'config/app.config.example.yaml');\n if (isNextBuildPhaseWithoutRuntimeEnv() && existsSync(examplePath)) {\n return examplePath;\n }\n\n // 开发回退:local 不存在时尝试 production(CI / 解密后路径)\n if (envName === 'local') {\n const productionFallback = resolve(cwd, FILE_BY_ENV.production);\n if (existsSync(productionFallback)) {\n return productionFallback;\n }\n }\n\n return candidate;\n}\n","import type { AppConfig } from './schema';\n\n/**\n * 将 AppConfig 同步到 process.env,兼容仍读取扁平 env 的 sa2kit 模块(ossFile、legacy 脚本)。\n * 仅在进程内调用一次;已有非空 env 不被覆盖。\n */\nexport function applyAppConfigToProcessEnv(config: AppConfig): void {\n const set = (key: string, value: string | undefined) => {\n if (!value || (process.env[key] && process.env[key]!.length > 0)) return;\n process.env[key] = value;\n };\n\n set('DATABASE_URL', config.database.url);\n if (config.database.poolSize !== undefined) {\n set('DATABASE_POOL_SIZE', String(config.database.poolSize));\n }\n if (config.database.timeout !== undefined) {\n set('DATABASE_TIMEOUT', String(config.database.timeout));\n }\n if (config.database.sslMode) {\n set('DATABASE_SSL_MODE', config.database.sslMode);\n }\n\n set('BETTER_AUTH_SECRET', config.auth.secret);\n set('BETTER_AUTH_URL', config.auth.url);\n set('NEXT_PUBLIC_APP_URL', config.auth.publicUrl);\n\n if (config.auth.trustedOrigins?.length) {\n set('BETTER_AUTH_TRUSTED_ORIGINS', config.auth.trustedOrigins.join(','));\n }\n\n const smsProvider = config.auth.sms?.provider;\n if (smsProvider) {\n set('SA2KIT_SMS_PROVIDER', smsProvider);\n }\n\n const aliyunSms = config.auth.sms?.aliyun;\n if (aliyunSms) {\n set('ALIYUN_SMS_ACCESS_KEY_ID', aliyunSms.accessKeyId);\n set('ALIYUN_SMS_ACCESS_KEY_SECRET', aliyunSms.accessKeySecret);\n set('ALIYUN_SMS_SIGN_NAME', aliyunSms.signName);\n set('ALIYUN_SMS_TEMPLATE_CODE', aliyunSms.templateCode);\n set('ALIYUN_SMS_COUNTRY_CODE', aliyunSms.countryCode);\n if (aliyunSms.codeValidMinutes !== undefined) {\n set('ALIYUN_SMS_CODE_VALID_MINUTES', String(aliyunSms.codeValidMinutes));\n }\n set('ALIYUN_SMS_ENDPOINT', aliyunSms.endpoint);\n }\n\n if (config.auth.email?.provider) {\n set('SA2KIT_EMAIL_PROVIDER', config.auth.email.provider);\n }\n\n if (config.auth.logOtpInDev !== undefined) {\n set('SA2KIT_AUTH_LOG_OTP', config.auth.logOtpInDev ? '1' : '0');\n }\n\n const oss = config.storage?.aliyunOss;\n if (oss) {\n if (oss.region) set('ALIYUN_OSS_REGION', oss.region);\n if (oss.bucket) set('ALIYUN_OSS_BUCKET', oss.bucket);\n if (oss.accessKeyId) set('ALIYUN_OSS_ACCESS_KEY_ID', oss.accessKeyId);\n if (oss.accessKeySecret) set('ALIYUN_OSS_ACCESS_KEY_SECRET', oss.accessKeySecret);\n if (oss.customDomain) set('ALIYUN_OSS_CUSTOM_DOMAIN', oss.customDomain);\n if (oss.secure !== undefined) set('ALIYUN_OSS_SECURE', oss.secure ? 'true' : 'false');\n if (oss.internal !== undefined) set('ALIYUN_OSS_INTERNAL', oss.internal ? 'true' : 'false');\n }\n\n const cdn = config.storage?.aliyunCdn;\n if (cdn) {\n if (cdn.domain) set('ALIYUN_CDN_DOMAIN', cdn.domain);\n if (cdn.accessKeyId) set('ALIYUN_CDN_ACCESS_KEY_ID', cdn.accessKeyId);\n if (cdn.accessKeySecret) set('ALIYUN_CDN_ACCESS_KEY_SECRET', cdn.accessKeySecret);\n }\n}\n","import type { AppConfig } from './schema';\n\nexport type ConfigDoctorIssueLevel = 'error' | 'warning' | 'info';\n\nexport type ConfigDoctorIssue = {\n level: ConfigDoctorIssueLevel;\n featureId: string;\n featureName: string;\n message: string;\n hints?: string[];\n};\n\nexport type ConfigDoctorReport = {\n ok: boolean;\n issues: ConfigDoctorIssue[];\n enabledFeatures: string[];\n};\n\nfunction isSet(value: string | undefined): boolean {\n return Boolean(value && value.trim().length > 0);\n}\n\nexport function diagnoseAppConfig(config: AppConfig): ConfigDoctorReport {\n const issues: ConfigDoctorIssue[] = [];\n const enabledFeatures: string[] = ['app', 'database', 'auth-core'];\n\n const env = config.app.env ?? process.env.NODE_ENV ?? 'development';\n const isProd = env === 'production';\n\n // Auth SMS\n const smsProvider = config.auth.sms?.provider ?? (isProd ? undefined : 'console');\n if (smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n const missing = [\n !isSet(aliyun?.accessKeyId) && 'auth.sms.aliyun.accessKeyId',\n !isSet(aliyun?.accessKeySecret) && 'auth.sms.aliyun.accessKeySecret',\n !isSet(aliyun?.signName) && 'auth.sms.aliyun.signName',\n !isSet(aliyun?.templateCode) && 'auth.sms.aliyun.templateCode',\n ].filter(Boolean) as string[];\n\n if (missing.length === 0) {\n enabledFeatures.push('auth-sms');\n } else {\n issues.push({\n level: 'error',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: `sms.provider=aliyun-pnvs 但缺少:${missing.join(', ')}`,\n });\n }\n } else if (smsProvider === 'console') {\n enabledFeatures.push('auth-sms');\n if (isProd) {\n issues.push({\n level: 'warning',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: '生产环境使用 console SMS,验证码仅输出到日志。',\n hints: ['生产请改为 aliyun-pnvs 并填写 auth.sms.aliyun.*'],\n });\n }\n } else {\n issues.push({\n level: isProd ? 'warning' : 'info',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: isProd\n ? '未配置短信 provider,用户收不到验证码。'\n : '未配置短信;开发可设 auth.sms.provider: console',\n hints: ['开发:auth.sms.provider: console', '生产:auth.sms.provider: aliyun-pnvs'],\n });\n }\n\n // OSS\n const oss = config.storage?.aliyunOss;\n const ossComplete =\n oss?.enabled !== false &&\n isSet(oss?.region) &&\n isSet(oss?.bucket) &&\n isSet(oss?.accessKeyId) &&\n isSet(oss?.accessKeySecret);\n\n if (ossComplete) {\n enabledFeatures.push('storage-oss');\n } else if (oss?.enabled === true) {\n issues.push({\n level: 'error',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: 'storage.aliyunOss.enabled 为 true 但配置不完整。',\n });\n } else {\n issues.push({\n level: 'info',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: '未启用完整 OSS 配置,文件上传将回退本地存储(若模块允许)。',\n });\n }\n\n const ok = !issues.some((i) => i.level === 'error');\n return { ok, issues, enabledFeatures };\n}\n\nlet loggedOnce = false;\n\nexport function logConfigDoctorReport(report: ConfigDoctorReport, options?: { force?: boolean }): void {\n if (loggedOnce && !options?.force) return;\n loggedOnce = true;\n\n const lines: string[] = ['[sa2kit/config] 配置检查'];\n for (const issue of report.issues) {\n const prefix = issue.level === 'error' ? '✗' : issue.level === 'warning' ? '⚠' : '○';\n lines.push(`${prefix} ${issue.featureName}: ${issue.message}`);\n for (const hint of issue.hints ?? []) {\n lines.push(` → ${hint}`);\n }\n }\n if (report.issues.length === 0) {\n lines.push('✓ 配置项检查通过');\n }\n lines.push(` 已启用: ${report.enabledFeatures.join(', ')}`);\n console.info(lines.join('\\n'));\n}\n","import { readFileSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { applyAppConfigToProcessEnv } from './apply-to-process-env';\nimport { diagnoseAppConfig, logConfigDoctorReport, type ConfigDoctorReport } from './doctor';\nimport { resolveAppConfigPath, type ResolveAppConfigPathOptions } from './paths';\nimport { appConfigSchema, type AppConfig } from './schema';\n\nexport type LoadAppConfigOptions = ResolveAppConfigPathOptions & {\n /** 是否写入 process.env(默认 true) */\n applyToProcessEnv?: boolean;\n /** 是否打印 doctor 报告(默认 true) */\n logDoctor?: boolean;\n};\n\nlet cachedConfig: AppConfig | undefined;\nlet cachedPath: string | undefined;\n\nexport function readAppConfigFile(filePath: string): AppConfig {\n const raw = readFileSync(filePath, 'utf8');\n const parsed = parseYaml(raw);\n const result = appConfigSchema.safeParse(parsed);\n\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n throw new Error(`AppConfig 校验失败 (${filePath}):\\n${details}`);\n }\n\n return result.data;\n}\n\nexport function loadAppConfig(options: LoadAppConfigOptions = {}): AppConfig {\n const filePath = resolveAppConfigPath(options);\n\n if (cachedConfig && cachedPath === filePath) {\n return cachedConfig;\n }\n\n const config = readAppConfigFile(filePath);\n cachedPath = filePath;\n cachedConfig = config;\n\n if (options.applyToProcessEnv !== false) {\n applyAppConfigToProcessEnv(config);\n }\n\n if (options.logDoctor !== false) {\n logConfigDoctorReport(diagnoseAppConfig(config));\n }\n\n return config;\n}\n\nexport function getAppConfig(): AppConfig {\n if (!cachedConfig) {\n return loadAppConfig();\n }\n return cachedConfig;\n}\n\nexport function resetAppConfigCache(): void {\n cachedConfig = undefined;\n cachedPath = undefined;\n}\n\nexport function checkAppConfigFromFile(\n filePath: string,\n): { config: AppConfig; report: ConfigDoctorReport } {\n const config = readAppConfigFile(filePath);\n return { config, report: diagnoseAppConfig(config) };\n}\n","import type { AliyunPnvsSmsConfig, Sa2kitSmsProvider } from '../types';\n\ntype PopCoreClient = {\n request(\n action: string,\n params: Record<string, string>,\n options?: { method?: string },\n ): Promise<{ Code?: string; Success?: boolean; Message?: string }>;\n};\n\nasync function loadPopCore(): Promise<new (config: Record<string, string>) => PopCoreClient> {\n try {\n const mod = await import('@alicloud/pop-core');\n return (mod.default ?? mod) as unknown as new (config: Record<string, string>) => PopCoreClient;\n } catch {\n throw new Error(\n '启用 SA2KIT_SMS_PROVIDER=aliyun-pnvs 需要安装 @alicloud/pop-core:pnpm add @alicloud/pop-core',\n );\n }\n}\n\nexport function createAliyunPnvsSmsProvider(config: AliyunPnvsSmsConfig): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n const Core = await loadPopCore();\n const client = new Core({\n accessKeyId: config.accessKeyId,\n accessKeySecret: config.accessKeySecret,\n endpoint: config.endpoint ?? 'https://dypnsapi.aliyuncs.com',\n apiVersion: '2017-05-25',\n });\n\n const minutes = String(config.codeValidMinutes ?? 5);\n const result = await client.request(\n 'SendSmsVerifyCode',\n {\n PhoneNumber: phoneNumber,\n CountryCode: config.countryCode ?? '86',\n SignName: config.signName,\n TemplateCode: config.templateCode,\n TemplateParam: JSON.stringify({ code, min: minutes }),\n },\n { method: 'POST' },\n );\n\n if (result.Code !== 'OK' && result.Success !== true) {\n throw new Error(\n `阿里云短信认证发送失败: ${result.Message ?? result.Code ?? 'unknown error'}`,\n );\n }\n },\n };\n}\n","import type { Sa2kitSmsProvider } from '../types';\n\nexport function createConsoleSmsProvider(): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n console.info(`[sa2kit/auth][sms][console] ${phoneNumber} => ${code}`);\n },\n };\n}\n","import type { Sa2kitAuthConfig } from '../../auth/server/types';\nimport type { AppConfig } from './schema';\nimport { createAliyunPnvsSmsProvider } from '../../auth/server/sms/providers/aliyun-pnvs';\nimport { createConsoleSmsProvider } from '../../auth/server/sms/providers/console';\n\nfunction parseTrustedOrigins(config: AppConfig): string[] {\n const baseURL = config.auth.url;\n const defaults = [baseURL, 'http://localhost:3000', 'http://127.0.0.1:3000'];\n const extra = config.auth.trustedOrigins ?? [];\n return [...defaults, ...extra].filter((origin, index, list) => list.indexOf(origin) === index);\n}\n\nexport function resolveAuthConfigFromAppConfig(\n config: AppConfig,\n overrides: Partial<Sa2kitAuthConfig> & Pick<Sa2kitAuthConfig, 'db'>,\n): Sa2kitAuthConfig {\n const smsProvider = config.auth.sms?.provider ?? 'console';\n let sms = overrides.sms;\n\n if (!sms && smsProvider === 'console') {\n const consoleProvider = createConsoleSmsProvider();\n sms = { sendOTP: consoleProvider.sendOTP.bind(consoleProvider) };\n }\n\n if (!sms && smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n if (\n aliyun?.accessKeyId &&\n aliyun.accessKeySecret &&\n aliyun.signName &&\n aliyun.templateCode\n ) {\n const provider = createAliyunPnvsSmsProvider({\n accessKeyId: aliyun.accessKeyId,\n accessKeySecret: aliyun.accessKeySecret,\n signName: aliyun.signName,\n templateCode: aliyun.templateCode,\n countryCode: aliyun.countryCode ?? '86',\n codeValidMinutes: aliyun.codeValidMinutes ?? 5,\n endpoint: aliyun.endpoint,\n });\n sms = { sendOTP: provider.sendOTP.bind(provider) };\n }\n }\n\n const isProd = (config.app.env ?? process.env.NODE_ENV) === 'production';\n\n return {\n db: overrides.db,\n baseURL: overrides.baseURL ?? config.auth.url,\n secret: overrides.secret ?? config.auth.secret,\n trustedOrigins: overrides.trustedOrigins ?? parseTrustedOrigins(config),\n basePath: overrides.basePath,\n sms: overrides.sms ?? sms,\n email: overrides.email,\n phoneNumberValidator: overrides.phoneNumberValidator,\n logOtpInDev:\n overrides.logOtpInDev ??\n config.auth.logOtpInDev ??\n (!isProd || process.env.SA2KIT_AUTH_LOG_OTP === '1'),\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5H2FICSO_js = require('../../../chunk-5H2FICSO.js');
3
+ var chunkLBMUIWJR_js = require('../../../chunk-LBMUIWJR.js');
4
4
  var chunkLGHUCQIU_js = require('../../../chunk-LGHUCQIU.js');
5
5
  require('../../../chunk-NSBPE2FW.js');
6
6
  var betterAuth = require('better-auth');
@@ -342,7 +342,7 @@ function createSmsProviderFromEnv(options) {
342
342
  const providerId = resolveSmsProviderId(options?.providerId);
343
343
  if (!providerId || providerId === "none") return void 0;
344
344
  if (providerId === "console") {
345
- return chunk5H2FICSO_js.createConsoleSmsProvider();
345
+ return chunkLBMUIWJR_js.createConsoleSmsProvider();
346
346
  }
347
347
  if (providerId === "aliyun-pnvs") {
348
348
  const accessKeyId = readEnv("ALIYUN_SMS_ACCESS_KEY_ID");
@@ -355,7 +355,7 @@ function createSmsProviderFromEnv(options) {
355
355
  );
356
356
  }
357
357
  const codeValidMinutes = Number.parseInt(readEnv("ALIYUN_SMS_CODE_VALID_MINUTES") ?? "5", 10);
358
- return chunk5H2FICSO_js.createAliyunPnvsSmsProvider({
358
+ return chunkLBMUIWJR_js.createAliyunPnvsSmsProvider({
359
359
  accessKeyId,
360
360
  accessKeySecret,
361
361
  signName,
@@ -629,11 +629,11 @@ function createSa2kitAuthFromEnv(input, options) {
629
629
 
630
630
  // src/common/auth/server/create-auth-from-app-config.ts
631
631
  function createSa2kitAuthFromAppConfig(input, options) {
632
- const appConfig = options?.configPath ? chunk5H2FICSO_js.loadAppConfig({ explicitPath: options.configPath, logDoctor: false }) : chunk5H2FICSO_js.getAppConfig();
632
+ const appConfig = options?.configPath ? chunkLBMUIWJR_js.loadAppConfig({ explicitPath: options.configPath, logDoctor: false }) : chunkLBMUIWJR_js.getAppConfig();
633
633
  if (options?.logDoctor !== false) {
634
- chunk5H2FICSO_js.logConfigDoctorReport(chunk5H2FICSO_js.diagnoseAppConfig(appConfig));
634
+ chunkLBMUIWJR_js.logConfigDoctorReport(chunkLBMUIWJR_js.diagnoseAppConfig(appConfig));
635
635
  }
636
- const authConfig = chunk5H2FICSO_js.resolveAuthConfigFromAppConfig(appConfig, input);
636
+ const authConfig = chunkLBMUIWJR_js.resolveAuthConfigFromAppConfig(appConfig, input);
637
637
  return createSa2kitAuth(authConfig);
638
638
  }
639
639
  function mountNextAuthHandler(auth) {
@@ -685,11 +685,11 @@ function createSessionValidator(auth) {
685
685
 
686
686
  Object.defineProperty(exports, "createAliyunPnvsSmsProvider", {
687
687
  enumerable: true,
688
- get: function () { return chunk5H2FICSO_js.createAliyunPnvsSmsProvider; }
688
+ get: function () { return chunkLBMUIWJR_js.createAliyunPnvsSmsProvider; }
689
689
  });
690
690
  Object.defineProperty(exports, "createConsoleSmsProvider", {
691
691
  enumerable: true,
692
- get: function () { return chunk5H2FICSO_js.createConsoleSmsProvider; }
692
+ get: function () { return chunkLBMUIWJR_js.createConsoleSmsProvider; }
693
693
  });
694
694
  Object.defineProperty(exports, "account", {
695
695
  enumerable: true,
@@ -1,5 +1,5 @@
1
- import { createConsoleSmsProvider, createAliyunPnvsSmsProvider, loadAppConfig, getAppConfig, logConfigDoctorReport, diagnoseAppConfig, resolveAuthConfigFromAppConfig } from '../../../chunk-LGVPFYPR.mjs';
2
- export { createAliyunPnvsSmsProvider, createConsoleSmsProvider } from '../../../chunk-LGVPFYPR.mjs';
1
+ import { createConsoleSmsProvider, createAliyunPnvsSmsProvider, loadAppConfig, getAppConfig, logConfigDoctorReport, diagnoseAppConfig, resolveAuthConfigFromAppConfig } from '../../../chunk-4H3SGG3T.mjs';
2
+ export { createAliyunPnvsSmsProvider, createConsoleSmsProvider } from '../../../chunk-4H3SGG3T.mjs';
3
3
  import { account, authDrizzleSchema } from '../../../chunk-EBHPTFG6.mjs';
4
4
  export { account, accountRelations, authDrizzleSchema, session, sessionRelations, user, userRelations, userRole, verification, verifications } from '../../../chunk-EBHPTFG6.mjs';
5
5
  import '../../../chunk-MAI35PU6.mjs';
@@ -64,6 +64,30 @@ declare const appConfigSchema: z.ZodObject<{
64
64
  accessKeySecret: z.ZodOptional<z.ZodString>;
65
65
  }, z.core.$strip>>;
66
66
  }, z.core.$strip>>;
67
+ business: z.ZodOptional<z.ZodObject<{
68
+ homePage: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
69
+ huarongdao: z.ZodOptional<z.ZodObject<{
70
+ theme: z.ZodOptional<z.ZodEnum<{
71
+ miku: "miku";
72
+ sakura: "sakura";
73
+ }>>;
74
+ levels: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
+ id: z.ZodCoercedNumber<unknown>;
76
+ label: z.ZodString;
77
+ rows: z.ZodCoercedNumber<unknown>;
78
+ cols: z.ZodCoercedNumber<unknown>;
79
+ shuffleSteps: z.ZodCoercedNumber<unknown>;
80
+ sourceImageUrl: z.ZodDefault<z.ZodOptional<z.ZodString>>;
81
+ }, z.core.$strip>>>;
82
+ bgmTracks: z.ZodOptional<z.ZodArray<z.ZodString>>;
83
+ }, z.core.$strip>>;
84
+ qiniu: z.ZodOptional<z.ZodObject<{
85
+ accessKey: z.ZodOptional<z.ZodString>;
86
+ secretKey: z.ZodOptional<z.ZodString>;
87
+ bucketName: z.ZodOptional<z.ZodString>;
88
+ domain: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$strip>>;
90
+ }, z.core.$strip>>;
67
91
  }, z.core.$strip>;
68
92
  type AppConfig = z.infer<typeof appConfigSchema>;
69
93
  type AppConfigInput = z.input<typeof appConfigSchema>;
@@ -64,6 +64,30 @@ declare const appConfigSchema: z.ZodObject<{
64
64
  accessKeySecret: z.ZodOptional<z.ZodString>;
65
65
  }, z.core.$strip>>;
66
66
  }, z.core.$strip>>;
67
+ business: z.ZodOptional<z.ZodObject<{
68
+ homePage: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
69
+ huarongdao: z.ZodOptional<z.ZodObject<{
70
+ theme: z.ZodOptional<z.ZodEnum<{
71
+ miku: "miku";
72
+ sakura: "sakura";
73
+ }>>;
74
+ levels: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
+ id: z.ZodCoercedNumber<unknown>;
76
+ label: z.ZodString;
77
+ rows: z.ZodCoercedNumber<unknown>;
78
+ cols: z.ZodCoercedNumber<unknown>;
79
+ shuffleSteps: z.ZodCoercedNumber<unknown>;
80
+ sourceImageUrl: z.ZodDefault<z.ZodOptional<z.ZodString>>;
81
+ }, z.core.$strip>>>;
82
+ bgmTracks: z.ZodOptional<z.ZodArray<z.ZodString>>;
83
+ }, z.core.$strip>>;
84
+ qiniu: z.ZodOptional<z.ZodObject<{
85
+ accessKey: z.ZodOptional<z.ZodString>;
86
+ secretKey: z.ZodOptional<z.ZodString>;
87
+ bucketName: z.ZodOptional<z.ZodString>;
88
+ domain: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$strip>>;
90
+ }, z.core.$strip>>;
67
91
  }, z.core.$strip>;
68
92
  type AppConfig = z.infer<typeof appConfigSchema>;
69
93
  type AppConfigInput = z.input<typeof appConfigSchema>;
@@ -1,65 +1,65 @@
1
1
  'use strict';
2
2
 
3
- var chunk5H2FICSO_js = require('../../../chunk-5H2FICSO.js');
3
+ var chunkLBMUIWJR_js = require('../../../chunk-LBMUIWJR.js');
4
4
  require('../../../chunk-NSBPE2FW.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "SOPS_ENCRYPTED_PATH", {
9
9
  enumerable: true,
10
- get: function () { return chunk5H2FICSO_js.SOPS_ENCRYPTED_PATH; }
10
+ get: function () { return chunkLBMUIWJR_js.SOPS_ENCRYPTED_PATH; }
11
11
  });
12
12
  Object.defineProperty(exports, "appConfigSchema", {
13
13
  enumerable: true,
14
- get: function () { return chunk5H2FICSO_js.appConfigSchema; }
14
+ get: function () { return chunkLBMUIWJR_js.appConfigSchema; }
15
15
  });
16
16
  Object.defineProperty(exports, "applyAppConfigToProcessEnv", {
17
17
  enumerable: true,
18
- get: function () { return chunk5H2FICSO_js.applyAppConfigToProcessEnv; }
18
+ get: function () { return chunkLBMUIWJR_js.applyAppConfigToProcessEnv; }
19
19
  });
20
20
  Object.defineProperty(exports, "checkAppConfigFromFile", {
21
21
  enumerable: true,
22
- get: function () { return chunk5H2FICSO_js.checkAppConfigFromFile; }
22
+ get: function () { return chunkLBMUIWJR_js.checkAppConfigFromFile; }
23
23
  });
24
24
  Object.defineProperty(exports, "diagnoseAppConfig", {
25
25
  enumerable: true,
26
- get: function () { return chunk5H2FICSO_js.diagnoseAppConfig; }
26
+ get: function () { return chunkLBMUIWJR_js.diagnoseAppConfig; }
27
27
  });
28
28
  Object.defineProperty(exports, "getAppConfig", {
29
29
  enumerable: true,
30
- get: function () { return chunk5H2FICSO_js.getAppConfig; }
30
+ get: function () { return chunkLBMUIWJR_js.getAppConfig; }
31
31
  });
32
32
  Object.defineProperty(exports, "isNextBuildPhaseWithoutRuntimeEnv", {
33
33
  enumerable: true,
34
- get: function () { return chunk5H2FICSO_js.isNextBuildPhaseWithoutRuntimeEnv; }
34
+ get: function () { return chunkLBMUIWJR_js.isNextBuildPhaseWithoutRuntimeEnv; }
35
35
  });
36
36
  Object.defineProperty(exports, "loadAppConfig", {
37
37
  enumerable: true,
38
- get: function () { return chunk5H2FICSO_js.loadAppConfig; }
38
+ get: function () { return chunkLBMUIWJR_js.loadAppConfig; }
39
39
  });
40
40
  Object.defineProperty(exports, "logConfigDoctorReport", {
41
41
  enumerable: true,
42
- get: function () { return chunk5H2FICSO_js.logConfigDoctorReport; }
42
+ get: function () { return chunkLBMUIWJR_js.logConfigDoctorReport; }
43
43
  });
44
44
  Object.defineProperty(exports, "readAppConfigFile", {
45
45
  enumerable: true,
46
- get: function () { return chunk5H2FICSO_js.readAppConfigFile; }
46
+ get: function () { return chunkLBMUIWJR_js.readAppConfigFile; }
47
47
  });
48
48
  Object.defineProperty(exports, "resetAppConfigCache", {
49
49
  enumerable: true,
50
- get: function () { return chunk5H2FICSO_js.resetAppConfigCache; }
50
+ get: function () { return chunkLBMUIWJR_js.resetAppConfigCache; }
51
51
  });
52
52
  Object.defineProperty(exports, "resolveAppConfigEnv", {
53
53
  enumerable: true,
54
- get: function () { return chunk5H2FICSO_js.resolveAppConfigEnv; }
54
+ get: function () { return chunkLBMUIWJR_js.resolveAppConfigEnv; }
55
55
  });
56
56
  Object.defineProperty(exports, "resolveAppConfigPath", {
57
57
  enumerable: true,
58
- get: function () { return chunk5H2FICSO_js.resolveAppConfigPath; }
58
+ get: function () { return chunkLBMUIWJR_js.resolveAppConfigPath; }
59
59
  });
60
60
  Object.defineProperty(exports, "resolveAuthConfigFromAppConfig", {
61
61
  enumerable: true,
62
- get: function () { return chunk5H2FICSO_js.resolveAuthConfigFromAppConfig; }
62
+ get: function () { return chunkLBMUIWJR_js.resolveAuthConfigFromAppConfig; }
63
63
  });
64
64
  //# sourceMappingURL=index.js.map
65
65
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { SOPS_ENCRYPTED_PATH, appConfigSchema, applyAppConfigToProcessEnv, checkAppConfigFromFile, diagnoseAppConfig, getAppConfig, isNextBuildPhaseWithoutRuntimeEnv, loadAppConfig, logConfigDoctorReport, readAppConfigFile, resetAppConfigCache, resolveAppConfigEnv, resolveAppConfigPath, resolveAuthConfigFromAppConfig } from '../../../chunk-LGVPFYPR.mjs';
1
+ export { SOPS_ENCRYPTED_PATH, appConfigSchema, applyAppConfigToProcessEnv, checkAppConfigFromFile, diagnoseAppConfig, getAppConfig, isNextBuildPhaseWithoutRuntimeEnv, loadAppConfig, logConfigDoctorReport, readAppConfigFile, resetAppConfigCache, resolveAppConfigEnv, resolveAppConfigPath, resolveAuthConfigFromAppConfig } from '../../../chunk-4H3SGG3T.mjs';
2
2
  import '../../../chunk-MAI35PU6.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5H2FICSO_js = require('../../../chunk-5H2FICSO.js');
3
+ var chunkLBMUIWJR_js = require('../../../chunk-LBMUIWJR.js');
4
4
  require('../../../chunk-NSBPE2FW.js');
5
5
  var pgCore = require('drizzle-orm/pg-core');
6
6
  var drizzleOrm = require('drizzle-orm');
@@ -1157,55 +1157,55 @@ function getDatabaseConfigForDisplay() {
1157
1157
 
1158
1158
  Object.defineProperty(exports, "SOPS_ENCRYPTED_PATH", {
1159
1159
  enumerable: true,
1160
- get: function () { return chunk5H2FICSO_js.SOPS_ENCRYPTED_PATH; }
1160
+ get: function () { return chunkLBMUIWJR_js.SOPS_ENCRYPTED_PATH; }
1161
1161
  });
1162
1162
  Object.defineProperty(exports, "appConfigSchema", {
1163
1163
  enumerable: true,
1164
- get: function () { return chunk5H2FICSO_js.appConfigSchema; }
1164
+ get: function () { return chunkLBMUIWJR_js.appConfigSchema; }
1165
1165
  });
1166
1166
  Object.defineProperty(exports, "applyAppConfigToProcessEnv", {
1167
1167
  enumerable: true,
1168
- get: function () { return chunk5H2FICSO_js.applyAppConfigToProcessEnv; }
1168
+ get: function () { return chunkLBMUIWJR_js.applyAppConfigToProcessEnv; }
1169
1169
  });
1170
1170
  Object.defineProperty(exports, "checkAppConfigFromFile", {
1171
1171
  enumerable: true,
1172
- get: function () { return chunk5H2FICSO_js.checkAppConfigFromFile; }
1172
+ get: function () { return chunkLBMUIWJR_js.checkAppConfigFromFile; }
1173
1173
  });
1174
1174
  Object.defineProperty(exports, "diagnoseAppConfig", {
1175
1175
  enumerable: true,
1176
- get: function () { return chunk5H2FICSO_js.diagnoseAppConfig; }
1176
+ get: function () { return chunkLBMUIWJR_js.diagnoseAppConfig; }
1177
1177
  });
1178
1178
  Object.defineProperty(exports, "getAppConfig", {
1179
1179
  enumerable: true,
1180
- get: function () { return chunk5H2FICSO_js.getAppConfig; }
1180
+ get: function () { return chunkLBMUIWJR_js.getAppConfig; }
1181
1181
  });
1182
1182
  Object.defineProperty(exports, "loadAppConfig", {
1183
1183
  enumerable: true,
1184
- get: function () { return chunk5H2FICSO_js.loadAppConfig; }
1184
+ get: function () { return chunkLBMUIWJR_js.loadAppConfig; }
1185
1185
  });
1186
1186
  Object.defineProperty(exports, "logConfigDoctorReport", {
1187
1187
  enumerable: true,
1188
- get: function () { return chunk5H2FICSO_js.logConfigDoctorReport; }
1188
+ get: function () { return chunkLBMUIWJR_js.logConfigDoctorReport; }
1189
1189
  });
1190
1190
  Object.defineProperty(exports, "readAppConfigFile", {
1191
1191
  enumerable: true,
1192
- get: function () { return chunk5H2FICSO_js.readAppConfigFile; }
1192
+ get: function () { return chunkLBMUIWJR_js.readAppConfigFile; }
1193
1193
  });
1194
1194
  Object.defineProperty(exports, "resetAppConfigCache", {
1195
1195
  enumerable: true,
1196
- get: function () { return chunk5H2FICSO_js.resetAppConfigCache; }
1196
+ get: function () { return chunkLBMUIWJR_js.resetAppConfigCache; }
1197
1197
  });
1198
1198
  Object.defineProperty(exports, "resolveAppConfigEnv", {
1199
1199
  enumerable: true,
1200
- get: function () { return chunk5H2FICSO_js.resolveAppConfigEnv; }
1200
+ get: function () { return chunkLBMUIWJR_js.resolveAppConfigEnv; }
1201
1201
  });
1202
1202
  Object.defineProperty(exports, "resolveAppConfigPath", {
1203
1203
  enumerable: true,
1204
- get: function () { return chunk5H2FICSO_js.resolveAppConfigPath; }
1204
+ get: function () { return chunkLBMUIWJR_js.resolveAppConfigPath; }
1205
1205
  });
1206
1206
  Object.defineProperty(exports, "resolveAuthConfigFromAppConfig", {
1207
1207
  enumerable: true,
1208
- get: function () { return chunk5H2FICSO_js.resolveAuthConfigFromAppConfig; }
1208
+ get: function () { return chunkLBMUIWJR_js.resolveAuthConfigFromAppConfig; }
1209
1209
  });
1210
1210
  exports.ConfigCategory = ConfigCategory;
1211
1211
  exports.ConfigEngine = ConfigEngine;
@@ -1,4 +1,4 @@
1
- export { SOPS_ENCRYPTED_PATH, appConfigSchema, applyAppConfigToProcessEnv, checkAppConfigFromFile, diagnoseAppConfig, getAppConfig, loadAppConfig, logConfigDoctorReport, readAppConfigFile, resetAppConfigCache, resolveAppConfigEnv, resolveAppConfigPath, resolveAuthConfigFromAppConfig } from '../../../chunk-LGVPFYPR.mjs';
1
+ export { SOPS_ENCRYPTED_PATH, appConfigSchema, applyAppConfigToProcessEnv, checkAppConfigFromFile, diagnoseAppConfig, getAppConfig, loadAppConfig, logConfigDoctorReport, readAppConfigFile, resetAppConfigCache, resolveAppConfigEnv, resolveAppConfigPath, resolveAuthConfigFromAppConfig } from '../../../chunk-4H3SGG3T.mjs';
2
2
  import '../../../chunk-MAI35PU6.mjs';
3
3
  import { pgTable, timestamp, text, jsonb, uniqueIndex, boolean, integer, index } from 'drizzle-orm/pg-core';
4
4
  import { sql, eq } from 'drizzle-orm';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sa2kit",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "SA2Kit 2.0 — common API 稳定;business 实验田模块逐步迁出 profile-v1",
5
5
  "keywords": [
6
6
  "react",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/config/bootstrap/schema.ts","../src/common/config/bootstrap/paths.ts","../src/common/config/bootstrap/apply-to-process-env.ts","../src/common/config/bootstrap/doctor.ts","../src/common/config/bootstrap/load-app-config.ts","../src/common/auth/server/sms/providers/aliyun-pnvs.ts","../src/common/auth/server/sms/providers/console.ts","../src/common/config/bootstrap/resolve-auth-from-config.ts"],"names":["z","resolve","existsSync","readFileSync","parseYaml"],"mappings":"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","file":"chunk-5H2FICSO.js","sourcesContent":["import { z } from 'zod';\n\nconst aliyunSmsSchema = z.object({\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n signName: z.string().optional(),\n templateCode: z.string().optional(),\n countryCode: z.string().optional(),\n codeValidMinutes: z.coerce.number().int().positive().optional(),\n endpoint: z.string().url().optional(),\n});\n\nconst authSchema = z.object({\n secret: z.string().min(32, 'auth.secret 至少 32 字符'),\n url: z.string().url('auth.url 须为合法 URL'),\n publicUrl: z.string().url('auth.publicUrl 须为合法 URL'),\n trustedOrigins: z.array(z.string().url()).optional(),\n logOtpInDev: z.boolean().optional(),\n sms: z\n .object({\n provider: z.enum(['console', 'aliyun-pnvs', 'none']).optional(),\n aliyun: aliyunSmsSchema.optional(),\n })\n .optional(),\n email: z\n .object({\n provider: z.string().optional(),\n })\n .optional(),\n});\n\nconst databaseSchema = z.object({\n url: z.string().min(1, 'database.url 不能为空'),\n poolSize: z.coerce.number().int().positive().max(100).optional(),\n timeout: z.coerce.number().int().positive().max(30000).optional(),\n sslMode: z.enum(['disable', 'prefer', 'require']).optional(),\n});\n\nconst aliyunOssSchema = z.object({\n enabled: z.boolean().optional(),\n region: z.string().optional(),\n bucket: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n customDomain: z.string().optional(),\n secure: z.boolean().optional(),\n internal: z.boolean().optional(),\n});\n\nconst aliyunCdnSchema = z.object({\n enabled: z.boolean().optional(),\n domain: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n});\n\nexport const appConfigSchema = z.object({\n app: z.object({\n name: z.string().min(1),\n env: z.enum(['development', 'production', 'test']).optional(),\n }),\n database: databaseSchema,\n auth: authSchema,\n storage: z\n .object({\n aliyunOss: aliyunOssSchema.optional(),\n aliyunCdn: aliyunCdnSchema.optional(),\n })\n .optional(),\n});\n\nexport type AppConfig = z.infer<typeof appConfigSchema>;\nexport type AppConfigInput = z.input<typeof appConfigSchema>;\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport type AppConfigEnvName = 'local' | 'production' | 'test';\n\nexport type ResolveAppConfigPathOptions = {\n cwd?: string;\n env?: AppConfigEnvName;\n explicitPath?: string;\n};\n\nconst FILE_BY_ENV: Record<AppConfigEnvName, string> = {\n local: 'config/app.config.local.yaml',\n production: 'config/app.config.production.yaml',\n test: 'config/app.config.test.yaml',\n};\n\n/** SOPS 密文默认路径(解密前由运维/脚本处理,应用运行时读明文 production.yaml) */\nexport const SOPS_ENCRYPTED_PATH = 'config/production.enc.yaml';\n\nexport function resolveAppConfigEnv(): AppConfigEnvName {\n const fromEnv = process.env.APP_CONFIG_ENV?.trim();\n if (fromEnv === 'local' || fromEnv === 'production' || fromEnv === 'test') {\n return fromEnv;\n }\n if (process.env.NODE_ENV === 'production') return 'production';\n if (process.env.NODE_ENV === 'test') return 'test';\n return 'local';\n}\n\nexport function isNextBuildPhaseWithoutRuntimeEnv(): boolean {\n return (\n process.env.NEXT_PHASE === 'phase-production-build' ||\n process.env.NEXT_PHASE === 'phase-export'\n );\n}\n\nexport function resolveAppConfigPath(options: ResolveAppConfigPathOptions = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n if (options.explicitPath) {\n return resolve(cwd, options.explicitPath);\n }\n\n const fromEnv = process.env.APP_CONFIG_PATH?.trim();\n if (fromEnv) {\n return resolve(cwd, fromEnv);\n }\n\n const envName = options.env ?? resolveAppConfigEnv();\n const candidate = resolve(cwd, FILE_BY_ENV[envName]);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const examplePath = resolve(cwd, 'config/app.config.example.yaml');\n if (isNextBuildPhaseWithoutRuntimeEnv() && existsSync(examplePath)) {\n return examplePath;\n }\n\n // 开发回退:local 不存在时尝试 production(CI / 解密后路径)\n if (envName === 'local') {\n const productionFallback = resolve(cwd, FILE_BY_ENV.production);\n if (existsSync(productionFallback)) {\n return productionFallback;\n }\n }\n\n return candidate;\n}\n","import type { AppConfig } from './schema';\n\n/**\n * 将 AppConfig 同步到 process.env,兼容仍读取扁平 env 的 sa2kit 模块(ossFile、legacy 脚本)。\n * 仅在进程内调用一次;已有非空 env 不被覆盖。\n */\nexport function applyAppConfigToProcessEnv(config: AppConfig): void {\n const set = (key: string, value: string | undefined) => {\n if (!value || (process.env[key] && process.env[key]!.length > 0)) return;\n process.env[key] = value;\n };\n\n set('DATABASE_URL', config.database.url);\n if (config.database.poolSize !== undefined) {\n set('DATABASE_POOL_SIZE', String(config.database.poolSize));\n }\n if (config.database.timeout !== undefined) {\n set('DATABASE_TIMEOUT', String(config.database.timeout));\n }\n if (config.database.sslMode) {\n set('DATABASE_SSL_MODE', config.database.sslMode);\n }\n\n set('BETTER_AUTH_SECRET', config.auth.secret);\n set('BETTER_AUTH_URL', config.auth.url);\n set('NEXT_PUBLIC_APP_URL', config.auth.publicUrl);\n\n if (config.auth.trustedOrigins?.length) {\n set('BETTER_AUTH_TRUSTED_ORIGINS', config.auth.trustedOrigins.join(','));\n }\n\n const smsProvider = config.auth.sms?.provider;\n if (smsProvider) {\n set('SA2KIT_SMS_PROVIDER', smsProvider);\n }\n\n const aliyunSms = config.auth.sms?.aliyun;\n if (aliyunSms) {\n set('ALIYUN_SMS_ACCESS_KEY_ID', aliyunSms.accessKeyId);\n set('ALIYUN_SMS_ACCESS_KEY_SECRET', aliyunSms.accessKeySecret);\n set('ALIYUN_SMS_SIGN_NAME', aliyunSms.signName);\n set('ALIYUN_SMS_TEMPLATE_CODE', aliyunSms.templateCode);\n set('ALIYUN_SMS_COUNTRY_CODE', aliyunSms.countryCode);\n if (aliyunSms.codeValidMinutes !== undefined) {\n set('ALIYUN_SMS_CODE_VALID_MINUTES', String(aliyunSms.codeValidMinutes));\n }\n set('ALIYUN_SMS_ENDPOINT', aliyunSms.endpoint);\n }\n\n if (config.auth.email?.provider) {\n set('SA2KIT_EMAIL_PROVIDER', config.auth.email.provider);\n }\n\n if (config.auth.logOtpInDev !== undefined) {\n set('SA2KIT_AUTH_LOG_OTP', config.auth.logOtpInDev ? '1' : '0');\n }\n\n const oss = config.storage?.aliyunOss;\n if (oss) {\n if (oss.region) set('ALIYUN_OSS_REGION', oss.region);\n if (oss.bucket) set('ALIYUN_OSS_BUCKET', oss.bucket);\n if (oss.accessKeyId) set('ALIYUN_OSS_ACCESS_KEY_ID', oss.accessKeyId);\n if (oss.accessKeySecret) set('ALIYUN_OSS_ACCESS_KEY_SECRET', oss.accessKeySecret);\n if (oss.customDomain) set('ALIYUN_OSS_CUSTOM_DOMAIN', oss.customDomain);\n if (oss.secure !== undefined) set('ALIYUN_OSS_SECURE', oss.secure ? 'true' : 'false');\n if (oss.internal !== undefined) set('ALIYUN_OSS_INTERNAL', oss.internal ? 'true' : 'false');\n }\n\n const cdn = config.storage?.aliyunCdn;\n if (cdn) {\n if (cdn.domain) set('ALIYUN_CDN_DOMAIN', cdn.domain);\n if (cdn.accessKeyId) set('ALIYUN_CDN_ACCESS_KEY_ID', cdn.accessKeyId);\n if (cdn.accessKeySecret) set('ALIYUN_CDN_ACCESS_KEY_SECRET', cdn.accessKeySecret);\n }\n}\n","import type { AppConfig } from './schema';\n\nexport type ConfigDoctorIssueLevel = 'error' | 'warning' | 'info';\n\nexport type ConfigDoctorIssue = {\n level: ConfigDoctorIssueLevel;\n featureId: string;\n featureName: string;\n message: string;\n hints?: string[];\n};\n\nexport type ConfigDoctorReport = {\n ok: boolean;\n issues: ConfigDoctorIssue[];\n enabledFeatures: string[];\n};\n\nfunction isSet(value: string | undefined): boolean {\n return Boolean(value && value.trim().length > 0);\n}\n\nexport function diagnoseAppConfig(config: AppConfig): ConfigDoctorReport {\n const issues: ConfigDoctorIssue[] = [];\n const enabledFeatures: string[] = ['app', 'database', 'auth-core'];\n\n const env = config.app.env ?? process.env.NODE_ENV ?? 'development';\n const isProd = env === 'production';\n\n // Auth SMS\n const smsProvider = config.auth.sms?.provider ?? (isProd ? undefined : 'console');\n if (smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n const missing = [\n !isSet(aliyun?.accessKeyId) && 'auth.sms.aliyun.accessKeyId',\n !isSet(aliyun?.accessKeySecret) && 'auth.sms.aliyun.accessKeySecret',\n !isSet(aliyun?.signName) && 'auth.sms.aliyun.signName',\n !isSet(aliyun?.templateCode) && 'auth.sms.aliyun.templateCode',\n ].filter(Boolean) as string[];\n\n if (missing.length === 0) {\n enabledFeatures.push('auth-sms');\n } else {\n issues.push({\n level: 'error',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: `sms.provider=aliyun-pnvs 但缺少:${missing.join(', ')}`,\n });\n }\n } else if (smsProvider === 'console') {\n enabledFeatures.push('auth-sms');\n if (isProd) {\n issues.push({\n level: 'warning',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: '生产环境使用 console SMS,验证码仅输出到日志。',\n hints: ['生产请改为 aliyun-pnvs 并填写 auth.sms.aliyun.*'],\n });\n }\n } else {\n issues.push({\n level: isProd ? 'warning' : 'info',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: isProd\n ? '未配置短信 provider,用户收不到验证码。'\n : '未配置短信;开发可设 auth.sms.provider: console',\n hints: ['开发:auth.sms.provider: console', '生产:auth.sms.provider: aliyun-pnvs'],\n });\n }\n\n // OSS\n const oss = config.storage?.aliyunOss;\n const ossComplete =\n oss?.enabled !== false &&\n isSet(oss?.region) &&\n isSet(oss?.bucket) &&\n isSet(oss?.accessKeyId) &&\n isSet(oss?.accessKeySecret);\n\n if (ossComplete) {\n enabledFeatures.push('storage-oss');\n } else if (oss?.enabled === true) {\n issues.push({\n level: 'error',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: 'storage.aliyunOss.enabled 为 true 但配置不完整。',\n });\n } else {\n issues.push({\n level: 'info',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: '未启用完整 OSS 配置,文件上传将回退本地存储(若模块允许)。',\n });\n }\n\n const ok = !issues.some((i) => i.level === 'error');\n return { ok, issues, enabledFeatures };\n}\n\nlet loggedOnce = false;\n\nexport function logConfigDoctorReport(report: ConfigDoctorReport, options?: { force?: boolean }): void {\n if (loggedOnce && !options?.force) return;\n loggedOnce = true;\n\n const lines: string[] = ['[sa2kit/config] 配置检查'];\n for (const issue of report.issues) {\n const prefix = issue.level === 'error' ? '✗' : issue.level === 'warning' ? '⚠' : '○';\n lines.push(`${prefix} ${issue.featureName}: ${issue.message}`);\n for (const hint of issue.hints ?? []) {\n lines.push(` → ${hint}`);\n }\n }\n if (report.issues.length === 0) {\n lines.push('✓ 配置项检查通过');\n }\n lines.push(` 已启用: ${report.enabledFeatures.join(', ')}`);\n console.info(lines.join('\\n'));\n}\n","import { readFileSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { applyAppConfigToProcessEnv } from './apply-to-process-env';\nimport { diagnoseAppConfig, logConfigDoctorReport, type ConfigDoctorReport } from './doctor';\nimport { resolveAppConfigPath, type ResolveAppConfigPathOptions } from './paths';\nimport { appConfigSchema, type AppConfig } from './schema';\n\nexport type LoadAppConfigOptions = ResolveAppConfigPathOptions & {\n /** 是否写入 process.env(默认 true) */\n applyToProcessEnv?: boolean;\n /** 是否打印 doctor 报告(默认 true) */\n logDoctor?: boolean;\n};\n\nlet cachedConfig: AppConfig | undefined;\nlet cachedPath: string | undefined;\n\nexport function readAppConfigFile(filePath: string): AppConfig {\n const raw = readFileSync(filePath, 'utf8');\n const parsed = parseYaml(raw);\n const result = appConfigSchema.safeParse(parsed);\n\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n throw new Error(`AppConfig 校验失败 (${filePath}):\\n${details}`);\n }\n\n return result.data;\n}\n\nexport function loadAppConfig(options: LoadAppConfigOptions = {}): AppConfig {\n const filePath = resolveAppConfigPath(options);\n\n if (cachedConfig && cachedPath === filePath) {\n return cachedConfig;\n }\n\n const config = readAppConfigFile(filePath);\n cachedPath = filePath;\n cachedConfig = config;\n\n if (options.applyToProcessEnv !== false) {\n applyAppConfigToProcessEnv(config);\n }\n\n if (options.logDoctor !== false) {\n logConfigDoctorReport(diagnoseAppConfig(config));\n }\n\n return config;\n}\n\nexport function getAppConfig(): AppConfig {\n if (!cachedConfig) {\n return loadAppConfig();\n }\n return cachedConfig;\n}\n\nexport function resetAppConfigCache(): void {\n cachedConfig = undefined;\n cachedPath = undefined;\n}\n\nexport function checkAppConfigFromFile(\n filePath: string,\n): { config: AppConfig; report: ConfigDoctorReport } {\n const config = readAppConfigFile(filePath);\n return { config, report: diagnoseAppConfig(config) };\n}\n","import type { AliyunPnvsSmsConfig, Sa2kitSmsProvider } from '../types';\n\ntype PopCoreClient = {\n request(\n action: string,\n params: Record<string, string>,\n options?: { method?: string },\n ): Promise<{ Code?: string; Success?: boolean; Message?: string }>;\n};\n\nasync function loadPopCore(): Promise<new (config: Record<string, string>) => PopCoreClient> {\n try {\n const mod = await import('@alicloud/pop-core');\n return (mod.default ?? mod) as unknown as new (config: Record<string, string>) => PopCoreClient;\n } catch {\n throw new Error(\n '启用 SA2KIT_SMS_PROVIDER=aliyun-pnvs 需要安装 @alicloud/pop-core:pnpm add @alicloud/pop-core',\n );\n }\n}\n\nexport function createAliyunPnvsSmsProvider(config: AliyunPnvsSmsConfig): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n const Core = await loadPopCore();\n const client = new Core({\n accessKeyId: config.accessKeyId,\n accessKeySecret: config.accessKeySecret,\n endpoint: config.endpoint ?? 'https://dypnsapi.aliyuncs.com',\n apiVersion: '2017-05-25',\n });\n\n const minutes = String(config.codeValidMinutes ?? 5);\n const result = await client.request(\n 'SendSmsVerifyCode',\n {\n PhoneNumber: phoneNumber,\n CountryCode: config.countryCode ?? '86',\n SignName: config.signName,\n TemplateCode: config.templateCode,\n TemplateParam: JSON.stringify({ code, min: minutes }),\n },\n { method: 'POST' },\n );\n\n if (result.Code !== 'OK' && result.Success !== true) {\n throw new Error(\n `阿里云短信认证发送失败: ${result.Message ?? result.Code ?? 'unknown error'}`,\n );\n }\n },\n };\n}\n","import type { Sa2kitSmsProvider } from '../types';\n\nexport function createConsoleSmsProvider(): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n console.info(`[sa2kit/auth][sms][console] ${phoneNumber} => ${code}`);\n },\n };\n}\n","import type { Sa2kitAuthConfig } from '../../auth/server/types';\nimport type { AppConfig } from './schema';\nimport { createAliyunPnvsSmsProvider } from '../../auth/server/sms/providers/aliyun-pnvs';\nimport { createConsoleSmsProvider } from '../../auth/server/sms/providers/console';\n\nfunction parseTrustedOrigins(config: AppConfig): string[] {\n const baseURL = config.auth.url;\n const defaults = [baseURL, 'http://localhost:3000', 'http://127.0.0.1:3000'];\n const extra = config.auth.trustedOrigins ?? [];\n return [...defaults, ...extra].filter((origin, index, list) => list.indexOf(origin) === index);\n}\n\nexport function resolveAuthConfigFromAppConfig(\n config: AppConfig,\n overrides: Partial<Sa2kitAuthConfig> & Pick<Sa2kitAuthConfig, 'db'>,\n): Sa2kitAuthConfig {\n const smsProvider = config.auth.sms?.provider ?? 'console';\n let sms = overrides.sms;\n\n if (!sms && smsProvider === 'console') {\n const consoleProvider = createConsoleSmsProvider();\n sms = { sendOTP: consoleProvider.sendOTP.bind(consoleProvider) };\n }\n\n if (!sms && smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n if (\n aliyun?.accessKeyId &&\n aliyun.accessKeySecret &&\n aliyun.signName &&\n aliyun.templateCode\n ) {\n const provider = createAliyunPnvsSmsProvider({\n accessKeyId: aliyun.accessKeyId,\n accessKeySecret: aliyun.accessKeySecret,\n signName: aliyun.signName,\n templateCode: aliyun.templateCode,\n countryCode: aliyun.countryCode ?? '86',\n codeValidMinutes: aliyun.codeValidMinutes ?? 5,\n endpoint: aliyun.endpoint,\n });\n sms = { sendOTP: provider.sendOTP.bind(provider) };\n }\n }\n\n const isProd = (config.app.env ?? process.env.NODE_ENV) === 'production';\n\n return {\n db: overrides.db,\n baseURL: overrides.baseURL ?? config.auth.url,\n secret: overrides.secret ?? config.auth.secret,\n trustedOrigins: overrides.trustedOrigins ?? parseTrustedOrigins(config),\n basePath: overrides.basePath,\n sms: overrides.sms ?? sms,\n email: overrides.email,\n phoneNumberValidator: overrides.phoneNumberValidator,\n logOtpInDev:\n overrides.logOtpInDev ??\n config.auth.logOtpInDev ??\n (!isProd || process.env.SA2KIT_AUTH_LOG_OTP === '1'),\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/config/bootstrap/schema.ts","../src/common/config/bootstrap/paths.ts","../src/common/config/bootstrap/apply-to-process-env.ts","../src/common/config/bootstrap/doctor.ts","../src/common/config/bootstrap/load-app-config.ts","../src/common/auth/server/sms/providers/aliyun-pnvs.ts","../src/common/auth/server/sms/providers/console.ts","../src/common/config/bootstrap/resolve-auth-from-config.ts"],"names":["parseYaml"],"mappings":"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","file":"chunk-LGVPFYPR.mjs","sourcesContent":["import { z } from 'zod';\n\nconst aliyunSmsSchema = z.object({\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n signName: z.string().optional(),\n templateCode: z.string().optional(),\n countryCode: z.string().optional(),\n codeValidMinutes: z.coerce.number().int().positive().optional(),\n endpoint: z.string().url().optional(),\n});\n\nconst authSchema = z.object({\n secret: z.string().min(32, 'auth.secret 至少 32 字符'),\n url: z.string().url('auth.url 须为合法 URL'),\n publicUrl: z.string().url('auth.publicUrl 须为合法 URL'),\n trustedOrigins: z.array(z.string().url()).optional(),\n logOtpInDev: z.boolean().optional(),\n sms: z\n .object({\n provider: z.enum(['console', 'aliyun-pnvs', 'none']).optional(),\n aliyun: aliyunSmsSchema.optional(),\n })\n .optional(),\n email: z\n .object({\n provider: z.string().optional(),\n })\n .optional(),\n});\n\nconst databaseSchema = z.object({\n url: z.string().min(1, 'database.url 不能为空'),\n poolSize: z.coerce.number().int().positive().max(100).optional(),\n timeout: z.coerce.number().int().positive().max(30000).optional(),\n sslMode: z.enum(['disable', 'prefer', 'require']).optional(),\n});\n\nconst aliyunOssSchema = z.object({\n enabled: z.boolean().optional(),\n region: z.string().optional(),\n bucket: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n customDomain: z.string().optional(),\n secure: z.boolean().optional(),\n internal: z.boolean().optional(),\n});\n\nconst aliyunCdnSchema = z.object({\n enabled: z.boolean().optional(),\n domain: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n});\n\nexport const appConfigSchema = z.object({\n app: z.object({\n name: z.string().min(1),\n env: z.enum(['development', 'production', 'test']).optional(),\n }),\n database: databaseSchema,\n auth: authSchema,\n storage: z\n .object({\n aliyunOss: aliyunOssSchema.optional(),\n aliyunCdn: aliyunCdnSchema.optional(),\n })\n .optional(),\n});\n\nexport type AppConfig = z.infer<typeof appConfigSchema>;\nexport type AppConfigInput = z.input<typeof appConfigSchema>;\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport type AppConfigEnvName = 'local' | 'production' | 'test';\n\nexport type ResolveAppConfigPathOptions = {\n cwd?: string;\n env?: AppConfigEnvName;\n explicitPath?: string;\n};\n\nconst FILE_BY_ENV: Record<AppConfigEnvName, string> = {\n local: 'config/app.config.local.yaml',\n production: 'config/app.config.production.yaml',\n test: 'config/app.config.test.yaml',\n};\n\n/** SOPS 密文默认路径(解密前由运维/脚本处理,应用运行时读明文 production.yaml) */\nexport const SOPS_ENCRYPTED_PATH = 'config/production.enc.yaml';\n\nexport function resolveAppConfigEnv(): AppConfigEnvName {\n const fromEnv = process.env.APP_CONFIG_ENV?.trim();\n if (fromEnv === 'local' || fromEnv === 'production' || fromEnv === 'test') {\n return fromEnv;\n }\n if (process.env.NODE_ENV === 'production') return 'production';\n if (process.env.NODE_ENV === 'test') return 'test';\n return 'local';\n}\n\nexport function isNextBuildPhaseWithoutRuntimeEnv(): boolean {\n return (\n process.env.NEXT_PHASE === 'phase-production-build' ||\n process.env.NEXT_PHASE === 'phase-export'\n );\n}\n\nexport function resolveAppConfigPath(options: ResolveAppConfigPathOptions = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n if (options.explicitPath) {\n return resolve(cwd, options.explicitPath);\n }\n\n const fromEnv = process.env.APP_CONFIG_PATH?.trim();\n if (fromEnv) {\n return resolve(cwd, fromEnv);\n }\n\n const envName = options.env ?? resolveAppConfigEnv();\n const candidate = resolve(cwd, FILE_BY_ENV[envName]);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const examplePath = resolve(cwd, 'config/app.config.example.yaml');\n if (isNextBuildPhaseWithoutRuntimeEnv() && existsSync(examplePath)) {\n return examplePath;\n }\n\n // 开发回退:local 不存在时尝试 production(CI / 解密后路径)\n if (envName === 'local') {\n const productionFallback = resolve(cwd, FILE_BY_ENV.production);\n if (existsSync(productionFallback)) {\n return productionFallback;\n }\n }\n\n return candidate;\n}\n","import type { AppConfig } from './schema';\n\n/**\n * 将 AppConfig 同步到 process.env,兼容仍读取扁平 env 的 sa2kit 模块(ossFile、legacy 脚本)。\n * 仅在进程内调用一次;已有非空 env 不被覆盖。\n */\nexport function applyAppConfigToProcessEnv(config: AppConfig): void {\n const set = (key: string, value: string | undefined) => {\n if (!value || (process.env[key] && process.env[key]!.length > 0)) return;\n process.env[key] = value;\n };\n\n set('DATABASE_URL', config.database.url);\n if (config.database.poolSize !== undefined) {\n set('DATABASE_POOL_SIZE', String(config.database.poolSize));\n }\n if (config.database.timeout !== undefined) {\n set('DATABASE_TIMEOUT', String(config.database.timeout));\n }\n if (config.database.sslMode) {\n set('DATABASE_SSL_MODE', config.database.sslMode);\n }\n\n set('BETTER_AUTH_SECRET', config.auth.secret);\n set('BETTER_AUTH_URL', config.auth.url);\n set('NEXT_PUBLIC_APP_URL', config.auth.publicUrl);\n\n if (config.auth.trustedOrigins?.length) {\n set('BETTER_AUTH_TRUSTED_ORIGINS', config.auth.trustedOrigins.join(','));\n }\n\n const smsProvider = config.auth.sms?.provider;\n if (smsProvider) {\n set('SA2KIT_SMS_PROVIDER', smsProvider);\n }\n\n const aliyunSms = config.auth.sms?.aliyun;\n if (aliyunSms) {\n set('ALIYUN_SMS_ACCESS_KEY_ID', aliyunSms.accessKeyId);\n set('ALIYUN_SMS_ACCESS_KEY_SECRET', aliyunSms.accessKeySecret);\n set('ALIYUN_SMS_SIGN_NAME', aliyunSms.signName);\n set('ALIYUN_SMS_TEMPLATE_CODE', aliyunSms.templateCode);\n set('ALIYUN_SMS_COUNTRY_CODE', aliyunSms.countryCode);\n if (aliyunSms.codeValidMinutes !== undefined) {\n set('ALIYUN_SMS_CODE_VALID_MINUTES', String(aliyunSms.codeValidMinutes));\n }\n set('ALIYUN_SMS_ENDPOINT', aliyunSms.endpoint);\n }\n\n if (config.auth.email?.provider) {\n set('SA2KIT_EMAIL_PROVIDER', config.auth.email.provider);\n }\n\n if (config.auth.logOtpInDev !== undefined) {\n set('SA2KIT_AUTH_LOG_OTP', config.auth.logOtpInDev ? '1' : '0');\n }\n\n const oss = config.storage?.aliyunOss;\n if (oss) {\n if (oss.region) set('ALIYUN_OSS_REGION', oss.region);\n if (oss.bucket) set('ALIYUN_OSS_BUCKET', oss.bucket);\n if (oss.accessKeyId) set('ALIYUN_OSS_ACCESS_KEY_ID', oss.accessKeyId);\n if (oss.accessKeySecret) set('ALIYUN_OSS_ACCESS_KEY_SECRET', oss.accessKeySecret);\n if (oss.customDomain) set('ALIYUN_OSS_CUSTOM_DOMAIN', oss.customDomain);\n if (oss.secure !== undefined) set('ALIYUN_OSS_SECURE', oss.secure ? 'true' : 'false');\n if (oss.internal !== undefined) set('ALIYUN_OSS_INTERNAL', oss.internal ? 'true' : 'false');\n }\n\n const cdn = config.storage?.aliyunCdn;\n if (cdn) {\n if (cdn.domain) set('ALIYUN_CDN_DOMAIN', cdn.domain);\n if (cdn.accessKeyId) set('ALIYUN_CDN_ACCESS_KEY_ID', cdn.accessKeyId);\n if (cdn.accessKeySecret) set('ALIYUN_CDN_ACCESS_KEY_SECRET', cdn.accessKeySecret);\n }\n}\n","import type { AppConfig } from './schema';\n\nexport type ConfigDoctorIssueLevel = 'error' | 'warning' | 'info';\n\nexport type ConfigDoctorIssue = {\n level: ConfigDoctorIssueLevel;\n featureId: string;\n featureName: string;\n message: string;\n hints?: string[];\n};\n\nexport type ConfigDoctorReport = {\n ok: boolean;\n issues: ConfigDoctorIssue[];\n enabledFeatures: string[];\n};\n\nfunction isSet(value: string | undefined): boolean {\n return Boolean(value && value.trim().length > 0);\n}\n\nexport function diagnoseAppConfig(config: AppConfig): ConfigDoctorReport {\n const issues: ConfigDoctorIssue[] = [];\n const enabledFeatures: string[] = ['app', 'database', 'auth-core'];\n\n const env = config.app.env ?? process.env.NODE_ENV ?? 'development';\n const isProd = env === 'production';\n\n // Auth SMS\n const smsProvider = config.auth.sms?.provider ?? (isProd ? undefined : 'console');\n if (smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n const missing = [\n !isSet(aliyun?.accessKeyId) && 'auth.sms.aliyun.accessKeyId',\n !isSet(aliyun?.accessKeySecret) && 'auth.sms.aliyun.accessKeySecret',\n !isSet(aliyun?.signName) && 'auth.sms.aliyun.signName',\n !isSet(aliyun?.templateCode) && 'auth.sms.aliyun.templateCode',\n ].filter(Boolean) as string[];\n\n if (missing.length === 0) {\n enabledFeatures.push('auth-sms');\n } else {\n issues.push({\n level: 'error',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: `sms.provider=aliyun-pnvs 但缺少:${missing.join(', ')}`,\n });\n }\n } else if (smsProvider === 'console') {\n enabledFeatures.push('auth-sms');\n if (isProd) {\n issues.push({\n level: 'warning',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: '生产环境使用 console SMS,验证码仅输出到日志。',\n hints: ['生产请改为 aliyun-pnvs 并填写 auth.sms.aliyun.*'],\n });\n }\n } else {\n issues.push({\n level: isProd ? 'warning' : 'info',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: isProd\n ? '未配置短信 provider,用户收不到验证码。'\n : '未配置短信;开发可设 auth.sms.provider: console',\n hints: ['开发:auth.sms.provider: console', '生产:auth.sms.provider: aliyun-pnvs'],\n });\n }\n\n // OSS\n const oss = config.storage?.aliyunOss;\n const ossComplete =\n oss?.enabled !== false &&\n isSet(oss?.region) &&\n isSet(oss?.bucket) &&\n isSet(oss?.accessKeyId) &&\n isSet(oss?.accessKeySecret);\n\n if (ossComplete) {\n enabledFeatures.push('storage-oss');\n } else if (oss?.enabled === true) {\n issues.push({\n level: 'error',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: 'storage.aliyunOss.enabled 为 true 但配置不完整。',\n });\n } else {\n issues.push({\n level: 'info',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: '未启用完整 OSS 配置,文件上传将回退本地存储(若模块允许)。',\n });\n }\n\n const ok = !issues.some((i) => i.level === 'error');\n return { ok, issues, enabledFeatures };\n}\n\nlet loggedOnce = false;\n\nexport function logConfigDoctorReport(report: ConfigDoctorReport, options?: { force?: boolean }): void {\n if (loggedOnce && !options?.force) return;\n loggedOnce = true;\n\n const lines: string[] = ['[sa2kit/config] 配置检查'];\n for (const issue of report.issues) {\n const prefix = issue.level === 'error' ? '✗' : issue.level === 'warning' ? '⚠' : '○';\n lines.push(`${prefix} ${issue.featureName}: ${issue.message}`);\n for (const hint of issue.hints ?? []) {\n lines.push(` → ${hint}`);\n }\n }\n if (report.issues.length === 0) {\n lines.push('✓ 配置项检查通过');\n }\n lines.push(` 已启用: ${report.enabledFeatures.join(', ')}`);\n console.info(lines.join('\\n'));\n}\n","import { readFileSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { applyAppConfigToProcessEnv } from './apply-to-process-env';\nimport { diagnoseAppConfig, logConfigDoctorReport, type ConfigDoctorReport } from './doctor';\nimport { resolveAppConfigPath, type ResolveAppConfigPathOptions } from './paths';\nimport { appConfigSchema, type AppConfig } from './schema';\n\nexport type LoadAppConfigOptions = ResolveAppConfigPathOptions & {\n /** 是否写入 process.env(默认 true) */\n applyToProcessEnv?: boolean;\n /** 是否打印 doctor 报告(默认 true) */\n logDoctor?: boolean;\n};\n\nlet cachedConfig: AppConfig | undefined;\nlet cachedPath: string | undefined;\n\nexport function readAppConfigFile(filePath: string): AppConfig {\n const raw = readFileSync(filePath, 'utf8');\n const parsed = parseYaml(raw);\n const result = appConfigSchema.safeParse(parsed);\n\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n throw new Error(`AppConfig 校验失败 (${filePath}):\\n${details}`);\n }\n\n return result.data;\n}\n\nexport function loadAppConfig(options: LoadAppConfigOptions = {}): AppConfig {\n const filePath = resolveAppConfigPath(options);\n\n if (cachedConfig && cachedPath === filePath) {\n return cachedConfig;\n }\n\n const config = readAppConfigFile(filePath);\n cachedPath = filePath;\n cachedConfig = config;\n\n if (options.applyToProcessEnv !== false) {\n applyAppConfigToProcessEnv(config);\n }\n\n if (options.logDoctor !== false) {\n logConfigDoctorReport(diagnoseAppConfig(config));\n }\n\n return config;\n}\n\nexport function getAppConfig(): AppConfig {\n if (!cachedConfig) {\n return loadAppConfig();\n }\n return cachedConfig;\n}\n\nexport function resetAppConfigCache(): void {\n cachedConfig = undefined;\n cachedPath = undefined;\n}\n\nexport function checkAppConfigFromFile(\n filePath: string,\n): { config: AppConfig; report: ConfigDoctorReport } {\n const config = readAppConfigFile(filePath);\n return { config, report: diagnoseAppConfig(config) };\n}\n","import type { AliyunPnvsSmsConfig, Sa2kitSmsProvider } from '../types';\n\ntype PopCoreClient = {\n request(\n action: string,\n params: Record<string, string>,\n options?: { method?: string },\n ): Promise<{ Code?: string; Success?: boolean; Message?: string }>;\n};\n\nasync function loadPopCore(): Promise<new (config: Record<string, string>) => PopCoreClient> {\n try {\n const mod = await import('@alicloud/pop-core');\n return (mod.default ?? mod) as unknown as new (config: Record<string, string>) => PopCoreClient;\n } catch {\n throw new Error(\n '启用 SA2KIT_SMS_PROVIDER=aliyun-pnvs 需要安装 @alicloud/pop-core:pnpm add @alicloud/pop-core',\n );\n }\n}\n\nexport function createAliyunPnvsSmsProvider(config: AliyunPnvsSmsConfig): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n const Core = await loadPopCore();\n const client = new Core({\n accessKeyId: config.accessKeyId,\n accessKeySecret: config.accessKeySecret,\n endpoint: config.endpoint ?? 'https://dypnsapi.aliyuncs.com',\n apiVersion: '2017-05-25',\n });\n\n const minutes = String(config.codeValidMinutes ?? 5);\n const result = await client.request(\n 'SendSmsVerifyCode',\n {\n PhoneNumber: phoneNumber,\n CountryCode: config.countryCode ?? '86',\n SignName: config.signName,\n TemplateCode: config.templateCode,\n TemplateParam: JSON.stringify({ code, min: minutes }),\n },\n { method: 'POST' },\n );\n\n if (result.Code !== 'OK' && result.Success !== true) {\n throw new Error(\n `阿里云短信认证发送失败: ${result.Message ?? result.Code ?? 'unknown error'}`,\n );\n }\n },\n };\n}\n","import type { Sa2kitSmsProvider } from '../types';\n\nexport function createConsoleSmsProvider(): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n console.info(`[sa2kit/auth][sms][console] ${phoneNumber} => ${code}`);\n },\n };\n}\n","import type { Sa2kitAuthConfig } from '../../auth/server/types';\nimport type { AppConfig } from './schema';\nimport { createAliyunPnvsSmsProvider } from '../../auth/server/sms/providers/aliyun-pnvs';\nimport { createConsoleSmsProvider } from '../../auth/server/sms/providers/console';\n\nfunction parseTrustedOrigins(config: AppConfig): string[] {\n const baseURL = config.auth.url;\n const defaults = [baseURL, 'http://localhost:3000', 'http://127.0.0.1:3000'];\n const extra = config.auth.trustedOrigins ?? [];\n return [...defaults, ...extra].filter((origin, index, list) => list.indexOf(origin) === index);\n}\n\nexport function resolveAuthConfigFromAppConfig(\n config: AppConfig,\n overrides: Partial<Sa2kitAuthConfig> & Pick<Sa2kitAuthConfig, 'db'>,\n): Sa2kitAuthConfig {\n const smsProvider = config.auth.sms?.provider ?? 'console';\n let sms = overrides.sms;\n\n if (!sms && smsProvider === 'console') {\n const consoleProvider = createConsoleSmsProvider();\n sms = { sendOTP: consoleProvider.sendOTP.bind(consoleProvider) };\n }\n\n if (!sms && smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n if (\n aliyun?.accessKeyId &&\n aliyun.accessKeySecret &&\n aliyun.signName &&\n aliyun.templateCode\n ) {\n const provider = createAliyunPnvsSmsProvider({\n accessKeyId: aliyun.accessKeyId,\n accessKeySecret: aliyun.accessKeySecret,\n signName: aliyun.signName,\n templateCode: aliyun.templateCode,\n countryCode: aliyun.countryCode ?? '86',\n codeValidMinutes: aliyun.codeValidMinutes ?? 5,\n endpoint: aliyun.endpoint,\n });\n sms = { sendOTP: provider.sendOTP.bind(provider) };\n }\n }\n\n const isProd = (config.app.env ?? process.env.NODE_ENV) === 'production';\n\n return {\n db: overrides.db,\n baseURL: overrides.baseURL ?? config.auth.url,\n secret: overrides.secret ?? config.auth.secret,\n trustedOrigins: overrides.trustedOrigins ?? parseTrustedOrigins(config),\n basePath: overrides.basePath,\n sms: overrides.sms ?? sms,\n email: overrides.email,\n phoneNumberValidator: overrides.phoneNumberValidator,\n logOtpInDev:\n overrides.logOtpInDev ??\n config.auth.logOtpInDev ??\n (!isProd || process.env.SA2KIT_AUTH_LOG_OTP === '1'),\n };\n}\n"]}