@geenius/adapters 0.1.0 → 0.3.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.
- package/README.md +79 -42
- package/package.json +23 -4
- package/packages/convex/README.md +1 -1
- package/packages/convex/dist/index.cjs +300 -0
- package/packages/convex/dist/index.cjs.map +1 -0
- package/packages/convex/dist/index.d.cts +231 -0
- package/packages/convex/dist/index.d.ts +231 -0
- package/packages/convex/dist/index.js +263 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/README.md +1 -1
- package/packages/react/dist/index.d.mts +106 -0
- package/packages/react/dist/index.d.ts +106 -0
- package/packages/react/dist/index.js +611 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react/dist/index.mjs +570 -0
- package/packages/react/dist/index.mjs.map +1 -0
- package/packages/react-css/README.md +1 -1
- package/packages/react-css/dist/index.cjs +515 -0
- package/packages/react-css/dist/index.cjs.map +1 -0
- package/packages/react-css/dist/index.d.cts +105 -0
- package/packages/react-css/dist/index.d.ts +105 -0
- package/packages/react-css/dist/index.js +467 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/README.md +1 -1
- package/packages/shared/dist/index.d.mts +625 -0
- package/packages/shared/dist/index.d.ts +625 -0
- package/packages/shared/dist/index.js +1567 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/index.mjs +1489 -0
- package/packages/shared/dist/index.mjs.map +1 -0
- package/packages/solidjs/README.md +1 -1
- package/packages/solidjs/dist/index.d.mts +97 -0
- package/packages/solidjs/dist/index.d.ts +97 -0
- package/packages/solidjs/dist/index.js +250 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs/dist/index.mjs +202 -0
- package/packages/solidjs/dist/index.mjs.map +1 -0
- package/packages/solidjs-css/README.md +1 -1
- package/packages/solidjs-css/dist/index.cjs +343 -0
- package/packages/solidjs-css/dist/index.cjs.map +1 -0
- package/packages/solidjs-css/dist/index.d.cts +67 -0
- package/packages/solidjs-css/dist/index.d.ts +67 -0
- package/packages/solidjs-css/dist/index.js +326 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/package.json +0 -42
- package/packages/convex/src/adapter.ts +0 -39
- package/packages/convex/src/index.ts +0 -19
- package/packages/convex/src/mutations.ts +0 -142
- package/packages/convex/src/queries.ts +0 -106
- package/packages/convex/src/schema.ts +0 -54
- package/packages/convex/src/types.ts +0 -20
- package/packages/convex/tsconfig.json +0 -11
- package/packages/convex/tsup.config.ts +0 -10
- package/packages/react/package.json +0 -45
- package/packages/react/src/components/AdapterCard.tsx +0 -49
- package/packages/react/src/components/AdapterConfigForm.tsx +0 -118
- package/packages/react/src/components/AdapterList.tsx +0 -84
- package/packages/react/src/components/AdapterStatusBadge.tsx +0 -30
- package/packages/react/src/components/index.ts +0 -4
- package/packages/react/src/hooks/index.ts +0 -75
- package/packages/react/src/index.tsx +0 -44
- package/packages/react/src/pages/AdapterDetailPage.tsx +0 -133
- package/packages/react/src/pages/AdaptersPage.tsx +0 -111
- package/packages/react/src/pages/index.ts +0 -2
- package/packages/react/src/provider/AdapterProvider.tsx +0 -115
- package/packages/react/src/provider/index.ts +0 -2
- package/packages/react/tsconfig.json +0 -18
- package/packages/react/tsup.config.ts +0 -10
- package/packages/react-css/package.json +0 -44
- package/packages/react-css/src/adapters.css +0 -1576
- package/packages/react-css/src/components/AdapterCard.tsx +0 -34
- package/packages/react-css/src/components/AdapterConfigForm.tsx +0 -63
- package/packages/react-css/src/components/AdapterList.tsx +0 -40
- package/packages/react-css/src/components/AdapterStatusBadge.tsx +0 -21
- package/packages/react-css/src/components/index.ts +0 -4
- package/packages/react-css/src/hooks/index.ts +0 -75
- package/packages/react-css/src/index.tsx +0 -25
- package/packages/react-css/src/pages/AdapterDetailPage.tsx +0 -133
- package/packages/react-css/src/pages/AdaptersPage.tsx +0 -111
- package/packages/react-css/src/pages/index.ts +0 -2
- package/packages/react-css/src/provider/AdapterProvider.tsx +0 -115
- package/packages/react-css/src/provider/index.ts +0 -2
- package/packages/react-css/src/styles.css +0 -494
- package/packages/react-css/tsconfig.json +0 -19
- package/packages/react-css/tsup.config.ts +0 -2
- package/packages/shared/package.json +0 -39
- package/packages/shared/src/__tests__/adapters.test.ts +0 -545
- package/packages/shared/src/admin/index.ts +0 -2
- package/packages/shared/src/admin/interface.ts +0 -34
- package/packages/shared/src/admin/localStorage.ts +0 -109
- package/packages/shared/src/ai/anthropic.ts +0 -123
- package/packages/shared/src/ai/cloudflare-gateway.ts +0 -130
- package/packages/shared/src/ai/gemini.ts +0 -181
- package/packages/shared/src/ai/index.ts +0 -14
- package/packages/shared/src/ai/interface.ts +0 -11
- package/packages/shared/src/ai/localStorage.ts +0 -78
- package/packages/shared/src/ai/ollama.ts +0 -143
- package/packages/shared/src/ai/openai.ts +0 -120
- package/packages/shared/src/ai/vercel-ai.ts +0 -101
- package/packages/shared/src/auth/better-auth.ts +0 -118
- package/packages/shared/src/auth/clerk.ts +0 -151
- package/packages/shared/src/auth/convex-auth.ts +0 -125
- package/packages/shared/src/auth/index.ts +0 -10
- package/packages/shared/src/auth/interface.ts +0 -17
- package/packages/shared/src/auth/localStorage.ts +0 -125
- package/packages/shared/src/auth/supabase-auth.ts +0 -136
- package/packages/shared/src/config.ts +0 -57
- package/packages/shared/src/constants.ts +0 -122
- package/packages/shared/src/db/convex.ts +0 -146
- package/packages/shared/src/db/index.ts +0 -10
- package/packages/shared/src/db/interface.ts +0 -13
- package/packages/shared/src/db/localStorage.ts +0 -91
- package/packages/shared/src/db/mongodb.ts +0 -125
- package/packages/shared/src/db/neon.ts +0 -171
- package/packages/shared/src/db/supabase.ts +0 -158
- package/packages/shared/src/index.ts +0 -117
- package/packages/shared/src/payments/index.ts +0 -4
- package/packages/shared/src/payments/interface.ts +0 -11
- package/packages/shared/src/payments/localStorage.ts +0 -81
- package/packages/shared/src/payments/stripe.ts +0 -177
- package/packages/shared/src/storage/convex.ts +0 -113
- package/packages/shared/src/storage/index.ts +0 -14
- package/packages/shared/src/storage/interface.ts +0 -11
- package/packages/shared/src/storage/localStorage.ts +0 -95
- package/packages/shared/src/storage/minio.ts +0 -47
- package/packages/shared/src/storage/r2.ts +0 -123
- package/packages/shared/src/storage/s3.ts +0 -128
- package/packages/shared/src/storage/supabase-storage.ts +0 -116
- package/packages/shared/src/storage/uploadthing.ts +0 -126
- package/packages/shared/src/styles/adapters.css +0 -494
- package/packages/shared/src/tier-gate.ts +0 -119
- package/packages/shared/src/types.ts +0 -162
- package/packages/shared/tsconfig.json +0 -18
- package/packages/shared/tsup.config.ts +0 -9
- package/packages/shared/vitest.config.ts +0 -14
- package/packages/solidjs/package.json +0 -44
- package/packages/solidjs/src/components/AdapterCard.tsx +0 -24
- package/packages/solidjs/src/components/AdapterConfigForm.tsx +0 -54
- package/packages/solidjs/src/components/AdapterList.tsx +0 -28
- package/packages/solidjs/src/components/AdapterStatusBadge.tsx +0 -20
- package/packages/solidjs/src/components/index.ts +0 -4
- package/packages/solidjs/src/index.tsx +0 -17
- package/packages/solidjs/src/pages/AdapterDetailPage.tsx +0 -38
- package/packages/solidjs/src/pages/AdaptersPage.tsx +0 -39
- package/packages/solidjs/src/pages/index.ts +0 -2
- package/packages/solidjs/src/primitives/index.ts +0 -78
- package/packages/solidjs/src/provider/AdapterProvider.tsx +0 -62
- package/packages/solidjs/src/provider/index.ts +0 -2
- package/packages/solidjs/tsconfig.json +0 -20
- package/packages/solidjs/tsup.config.ts +0 -10
- package/packages/solidjs-css/package.json +0 -43
- package/packages/solidjs-css/src/adapters.css +0 -1576
- package/packages/solidjs-css/src/components/AdapterCard.tsx +0 -43
- package/packages/solidjs-css/src/components/AdapterConfigForm.tsx +0 -119
- package/packages/solidjs-css/src/components/AdapterList.tsx +0 -68
- package/packages/solidjs-css/src/components/AdapterStatusBadge.tsx +0 -24
- package/packages/solidjs-css/src/components/index.ts +0 -8
- package/packages/solidjs-css/src/index.tsx +0 -30
- package/packages/solidjs-css/src/pages/AdapterDetailPage.tsx +0 -107
- package/packages/solidjs-css/src/pages/AdaptersPage.tsx +0 -94
- package/packages/solidjs-css/src/pages/index.ts +0 -4
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/src/provider/AdapterProvider.tsx +0 -61
- package/packages/solidjs-css/src/provider/index.ts +0 -2
- package/packages/solidjs-css/tsconfig.json +0 -20
- package/packages/solidjs-css/tsup.config.ts +0 -2
- package/pnpm-workspace.yaml +0 -2
- package/tsconfig.json +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/retry.ts","../src/config.ts","../src/resolve.ts","../src/constants.ts","../src/auth/localStorage.ts","../src/db/memory.ts","../src/db/localStorage.ts","../src/db/convex.ts","../src/db/neon.ts","../src/db/supabase.ts","../src/db/mongodb.ts","../src/db/cloudflareKV.ts","../src/payments/localStorage.ts","../src/ai/localStorage.ts","../src/storage/localStorage.ts","../src/admin/localStorage.ts","../src/tier-gate.ts"],"sourcesContent":["// @geenius/adapters — Typed error classes\n\n// ─── Error Codes ────────────────────────────────────────────────────────────\n\nexport type DbErrorCode = 'NOT_FOUND' | 'CONSTRAINT_VIOLATION' | 'QUERY_ERROR' | 'CONNECTION_ERROR' | 'COLLECTION_NOT_CONFIGURED'\nexport type AuthErrorCode = 'INVALID_CREDENTIALS' | 'USER_EXISTS' | 'SESSION_EXPIRED' | 'UNAUTHORIZED' | 'OAUTH_ERROR' | 'SERVICE_ERROR'\nexport type AiErrorCode = 'MODEL_ERROR' | 'RATE_LIMIT' | 'CONTEXT_LENGTH' | 'SERVICE_ERROR' | 'EMBEDDING_ERROR'\nexport type StorageErrorCode = 'NOT_FOUND' | 'UPLOAD_FAILED' | 'DOWNLOAD_FAILED' | 'QUOTA_EXCEEDED' | 'INVALID_KEY' | 'SERVICE_ERROR'\nexport type PaymentsErrorCode = 'INVALID_PLAN' | 'CHECKOUT_FAILED' | 'SUBSCRIPTION_NOT_FOUND' | 'CANCEL_FAILED' | 'SERVICE_ERROR' | 'NOT_AVAILABLE'\nexport type AdminErrorCode = 'USER_NOT_FOUND' | 'OPERATION_FAILED' | 'SERVICE_ERROR'\n\n// ─── Base Error ─────────────────────────────────────────────────────────────\n\nexport class AdapterError extends Error {\n constructor(\n message: string,\n public readonly domain: string,\n public readonly code: string,\n public readonly cause?: unknown,\n ) {\n super(message)\n this.name = 'AdapterError'\n }\n}\n\n// ─── Domain Errors ──────────────────────────────────────────────────────────\n\nexport class DbError extends AdapterError {\n constructor(message: string, code: DbErrorCode, cause?: unknown) {\n super(message, 'db', code, cause)\n this.name = 'DbError'\n }\n}\n\nexport class AuthError extends AdapterError {\n constructor(message: string, code: AuthErrorCode, cause?: unknown) {\n super(message, 'auth', code, cause)\n this.name = 'AuthError'\n }\n}\n\nexport class AiError extends AdapterError {\n constructor(message: string, code: AiErrorCode, cause?: unknown) {\n super(message, 'ai', code, cause)\n this.name = 'AiError'\n }\n}\n\nexport class StorageError extends AdapterError {\n constructor(message: string, code: StorageErrorCode, cause?: unknown) {\n super(message, 'storage', code, cause)\n this.name = 'StorageError'\n }\n}\n\nexport class PaymentsError extends AdapterError {\n constructor(message: string, code: PaymentsErrorCode, cause?: unknown) {\n super(message, 'payments', code, cause)\n this.name = 'PaymentsError'\n }\n}\n\nexport class AdminError extends AdapterError {\n constructor(message: string, code: AdminErrorCode, cause?: unknown) {\n super(message, 'admin', code, cause)\n this.name = 'AdminError'\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nexport function isAdapterError(error: unknown): error is AdapterError {\n return error instanceof AdapterError\n}\n\nexport function isRetryable(error: unknown): boolean {\n if (!isAdapterError(error)) return false\n const retryableCodes = new Set(['RATE_LIMIT', 'CONNECTION_ERROR', 'SERVICE_ERROR'])\n return retryableCodes.has(error.code)\n}\n","// @geenius/adapters — Retry utility with exponential backoff\n\nimport { isRetryable } from './errors'\n\nexport interface RetryOptions {\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number\n /** Initial delay in milliseconds (default: 500) */\n delayMs?: number\n /** Backoff multiplier (default: 2) */\n backoffMultiplier?: number\n /** Custom predicate to determine if error is retryable (default: isRetryable) */\n shouldRetry?: (error: unknown) => boolean\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxAttempts = 3,\n delayMs = 500,\n backoffMultiplier = 2,\n shouldRetry = isRetryable,\n } = options\n\n let lastError: unknown\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n if (attempt === maxAttempts || !shouldRetry(error)) {\n throw error\n }\n const delay = delayMs * Math.pow(backoffMultiplier, attempt - 1)\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n throw lastError\n}\n","// @geenius/adapters-shared — Configuration singleton\n\nimport type { AdapterConfig, AdapterDomain } from './types'\n\nlet _config: AdapterConfig | null = null\n\n/**\n * Configure the adapter system.\n * Call once at app startup before using any adapter hooks.\n *\n * @example\n * ```ts\n * configureAdapters({\n * db: { provider: 'convex' },\n * auth: { provider: 'better-auth' },\n * ai: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY },\n * storage: { provider: 'r2' },\n * payments: { provider: 'stripe' },\n * })\n * ```\n */\nexport function configureAdapters(config: AdapterConfig): void {\n _config = config\n}\n\n/**\n * Get the current adapter configuration.\n * Throws if configureAdapters() has not been called.\n */\nexport function getAdapterConfig(): AdapterConfig {\n if (!_config) {\n throw new Error('Adapters not configured. Call configureAdapters() first.')\n }\n return _config\n}\n\n/**\n * Check if adapters have been configured.\n */\nexport function isAdaptersConfigured(): boolean {\n return _config !== null\n}\n\n/**\n * Reset adapter configuration (useful for testing).\n */\nexport function resetAdapterConfig(): void {\n _config = null\n}\n\n/**\n * Get config for a specific adapter domain.\n */\nexport function getDomainConfig(domain: AdapterDomain) {\n const config = getAdapterConfig()\n return config[domain] ?? null\n}\n","// @geenius/adapters — Config-to-adapter resolver\n//\n// Bridges configureAdapters() with the individual create* factory functions.\n// Call resolveAdapter('ai') to get the adapter for a domain based on config.\n\nimport type { AdapterDomain, DomainAdapterConfig } from './types'\nimport type { AuthAdapter } from './auth/interface'\nimport type { DbAdapter } from './db/interface'\nimport type { AiAdapter } from './ai/interface'\nimport type { FileStorageAdapter } from './storage/interface'\nimport type { PaymentsAdapter } from './payments/interface'\nimport type { AdminAdapter } from './admin/interface'\nimport { getDomainConfig } from './config'\n\ntype AdapterForDomain<D extends AdapterDomain> =\n D extends 'auth' ? AuthAdapter :\n D extends 'db' ? DbAdapter :\n D extends 'ai' ? AiAdapter :\n D extends 'storage' ? FileStorageAdapter :\n D extends 'payments' ? PaymentsAdapter :\n D extends 'admin' ? AdminAdapter :\n never\n\ntype AdapterResolver<D extends AdapterDomain> = (config: DomainAdapterConfig) => AdapterForDomain<D>\n\nconst resolvers = new Map<string, AdapterResolver<AdapterDomain>>()\n\n/**\n * Register a factory function for a specific domain + provider combination.\n *\n * @example\n * ```ts\n * import { registerResolver, createConvexDbAdapter } from '@geenius/adapters-shared'\n *\n * registerResolver('db', 'convex', (config) =>\n * createConvexDbAdapter({ client: convex, functions: myFunctions })\n * )\n * ```\n */\nexport function registerResolver<D extends AdapterDomain>(\n domain: D,\n provider: string,\n resolver: (config: DomainAdapterConfig) => AdapterForDomain<D>,\n): void {\n resolvers.set(`${domain}:${provider}`, resolver as AdapterResolver<AdapterDomain>)\n}\n\n/**\n * Resolve an adapter for a given domain using the current config.\n * Requires that configureAdapters() has been called and a resolver\n * has been registered for the domain's provider.\n *\n * @example\n * ```ts\n * configureAdapters({ db: { provider: 'convex' } })\n * const db = resolveAdapter('db') // returns the registered Convex adapter\n * ```\n */\nexport function resolveAdapter<D extends AdapterDomain>(domain: D): AdapterForDomain<D> {\n const config = getDomainConfig(domain)\n if (!config) {\n throw new Error(`No configuration found for adapter domain: ${domain}`)\n }\n\n const key = `${domain}:${config.provider}`\n const resolver = resolvers.get(key)\n if (!resolver) {\n throw new Error(\n `No resolver registered for ${domain}:${config.provider}. ` +\n `Call registerResolver('${domain}', '${config.provider}', factory) first.`,\n )\n }\n\n return resolver(config) as AdapterForDomain<D>\n}\n\n/**\n * Check if a resolver is registered for a domain + provider.\n */\nexport function hasResolver(domain: AdapterDomain, provider: string): boolean {\n return resolvers.has(`${domain}:${provider}`)\n}\n\n/**\n * Clear all registered resolvers (useful for testing).\n */\nexport function clearResolvers(): void {\n resolvers.clear()\n}\n","// @geenius/adapters-shared — Constants & defaults\n\nimport type { AdapterDomain } from './types'\n\n// ─── Adapter Domains ─────────────────────────────────────────────────────────\n\nexport const ADAPTER_DOMAINS: readonly AdapterDomain[] = [\n 'db', 'auth', 'payments', 'ai', 'storage', 'admin',\n] as const\n\n// ─── Provider Names per Domain ───────────────────────────────────────────────\n\nexport const DB_PROVIDERS = ['localStorage', 'convex', 'supabase', 'neon', 'mongodb'] as const\nexport const AUTH_PROVIDERS = ['localStorage', 'better-auth', 'convex-auth', 'clerk', 'supabase-auth'] as const\nexport const AI_PROVIDERS = ['localStorage', 'openai', 'anthropic', 'gemini', 'ollama', 'cloudflare-ai-gateway', 'vercel-ai-sdk'] as const\nexport const STORAGE_PROVIDERS = ['localStorage', 'r2', 's3', 'uploadthing', 'supabase-storage', 'convex-storage', 'minio'] as const\nexport const PAYMENT_PROVIDERS = ['localStorage', 'stripe', 'noop'] as const\nexport const ADMIN_PROVIDERS = ['localStorage'] as const\n\nexport type DbProviderName = (typeof DB_PROVIDERS)[number]\nexport type AuthProviderName = (typeof AUTH_PROVIDERS)[number]\nexport type AiProviderName = (typeof AI_PROVIDERS)[number]\nexport type StorageProviderName = (typeof STORAGE_PROVIDERS)[number]\nexport type PaymentProviderName = (typeof PAYMENT_PROVIDERS)[number]\nexport type AdminProviderName = (typeof ADMIN_PROVIDERS)[number]\n\n// ─── Status Types ────────────────────────────────────────────────────────────\n\nexport const ADAPTER_STATUSES = ['connected', 'disconnected', 'error', 'initializing'] as const\nexport type AdapterStatus = (typeof ADAPTER_STATUSES)[number]\n\n// ─── Domain Labels ───────────────────────────────────────────────────────────\n\nexport const DOMAIN_LABELS: Record<AdapterDomain, string> = {\n db: 'Database',\n auth: 'Authentication',\n payments: 'Payments',\n ai: 'AI & LLM',\n storage: 'File Storage',\n admin: 'Admin Panel',\n}\n\nexport const DOMAIN_ICONS: Record<AdapterDomain, string> = {\n db: '🗄️',\n auth: '🔐',\n payments: '💳',\n ai: '🤖',\n storage: '📁',\n admin: '⚙️',\n}\n\nexport const DOMAIN_DESCRIPTIONS: Record<AdapterDomain, string> = {\n db: 'Connect to your preferred database backend for data persistence.',\n auth: 'User authentication, sessions, and identity management.',\n payments: 'Subscriptions, checkout, and billing management.',\n ai: 'AI completions, chat, and embeddings via any LLM provider.',\n storage: 'Upload, download, and manage files with any storage provider.',\n admin: 'Admin dashboard metrics and user management.',\n}\n\n// ─── Provider Metadata ───────────────────────────────────────────────────────\n\nexport interface ProviderMeta {\n id: string\n name: string\n domain: AdapterDomain\n description: string\n /** Minimum tier required to use this provider */\n tier: 'pronto' | 'lancio' | 'studio'\n docUrl?: string\n}\n\nexport const PROVIDER_REGISTRY: ProviderMeta[] = [\n // DB\n { id: 'localStorage', name: 'localStorage', domain: 'db', description: 'In-browser mock storage for prototyping', tier: 'pronto' },\n { id: 'convex', name: 'Convex', domain: 'db', description: 'Real-time cloud database with sub-50ms reactivity', tier: 'lancio' },\n { id: 'supabase', name: 'Supabase', domain: 'db', description: 'PostgreSQL + Auth + Storage', tier: 'lancio' },\n { id: 'neon', name: 'Neon', domain: 'db', description: 'Serverless PostgreSQL', tier: 'lancio' },\n { id: 'mongodb', name: 'MongoDB', domain: 'db', description: 'Document database via Prisma ORM', tier: 'lancio' },\n // Auth\n { id: 'localStorage', name: 'localStorage', domain: 'auth', description: 'Mock auth for prototyping', tier: 'pronto' },\n { id: 'better-auth', name: 'Better Auth', domain: 'auth', description: 'Self-hosted auth with OAuth + MFA', tier: 'lancio' },\n { id: 'convex-auth', name: 'Convex Auth', domain: 'auth', description: 'Built-in Convex sessions', tier: 'lancio' },\n { id: 'clerk', name: 'Clerk', domain: 'auth', description: 'SaaS auth with pre-built UI', tier: 'lancio' },\n { id: 'supabase-auth', name: 'Supabase Auth', domain: 'auth', description: 'Built-in Supabase auth', tier: 'lancio' },\n // AI\n { id: 'localStorage', name: 'localStorage', domain: 'ai', description: 'Mock AI for prototyping', tier: 'pronto' },\n { id: 'openai', name: 'OpenAI', domain: 'ai', description: 'GPT models with streaming + embeddings', tier: 'lancio' },\n { id: 'anthropic', name: 'Anthropic', domain: 'ai', description: 'Claude models with streaming', tier: 'lancio' },\n { id: 'gemini', name: 'Google Gemini', domain: 'ai', description: 'Gemini models, zero npm deps', tier: 'lancio' },\n { id: 'ollama', name: 'Ollama', domain: 'ai', description: 'Local LLMs, zero npm deps', tier: 'lancio' },\n { id: 'cloudflare-ai-gateway', name: 'CF AI Gateway', domain: 'ai', description: 'Caching/rate-limiting proxy', tier: 'studio' },\n { id: 'vercel-ai-sdk', name: 'Vercel AI SDK', domain: 'ai', description: 'generateText/embed wrappers', tier: 'studio' },\n // Storage\n { id: 'localStorage', name: 'localStorage', domain: 'storage', description: 'Base64 in-browser storage', tier: 'pronto' },\n { id: 'r2', name: 'Cloudflare R2', domain: 'storage', description: 'S3-compatible, zero egress', tier: 'lancio' },\n { id: 's3', name: 'AWS S3', domain: 'storage', description: 'IAM roles + CloudFront CDN', tier: 'lancio' },\n { id: 'uploadthing', name: 'Uploadthing', domain: 'storage', description: 'REST API file upload SaaS', tier: 'lancio' },\n { id: 'supabase-storage', name: 'Supabase Storage', domain: 'storage', description: 'Native Supabase storage', tier: 'lancio' },\n { id: 'convex-storage', name: 'Convex Storage', domain: 'storage', description: 'Convex built-in file storage', tier: 'lancio' },\n { id: 'minio', name: 'Minio', domain: 'storage', description: 'Self-hosted S3-compatible', tier: 'studio' },\n // Payments\n { id: 'localStorage', name: 'localStorage', domain: 'payments', description: 'Mock billing for prototyping', tier: 'pronto' },\n { id: 'stripe', name: 'Stripe', domain: 'payments', description: 'Full billing, subscriptions, checkout', tier: 'lancio' },\n { id: 'noop', name: 'Noop', domain: 'payments', description: 'No-op adapter — always returns success', tier: 'pronto' },\n // Admin\n { id: 'localStorage', name: 'localStorage', domain: 'admin', description: 'Mock admin for prototyping', tier: 'pronto' },\n]\n\n/**\n * Get all providers for a specific domain.\n */\nexport function getProvidersForDomain(domain: AdapterDomain): ProviderMeta[] {\n return PROVIDER_REGISTRY.filter((p) => p.domain === domain)\n}\n\n/**\n * Get a specific provider by id and domain.\n */\nexport function getProviderMeta(domain: AdapterDomain, providerId: string): ProviderMeta | undefined {\n return PROVIDER_REGISTRY.find((p) => p.domain === domain && p.id === providerId)\n}\n","// @geenius/adapters — localStorage Auth implementation\n\nimport type { AuthUser, AuthSession } from '../types'\nimport type { AuthAdapter } from './interface'\nimport { AuthError } from '../errors'\n\ninterface StoredUser extends AuthUser {\n passwordHash: string\n email: string\n}\n\nconst USERS_KEY = 'geenius_users'\nconst SESSION_KEY = 'geenius_session'\n\nfunction getUsers(): StoredUser[] {\n try { return JSON.parse(localStorage.getItem(USERS_KEY) || '[]') } catch { return [] }\n}\n\nfunction saveUsers(users: StoredUser[]) {\n localStorage.setItem(USERS_KEY, JSON.stringify(users))\n}\n\n// NOTE: This is intentionally a weak hash — it is a mock implementation for\n// prototyping only (Pronto tier). Real auth adapters use proper password\n// hashing on the server side.\nfunction simpleHash(str: string): string {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash) + str.charCodeAt(i)\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nfunction createSession(userId: string): AuthSession {\n const session: AuthSession = {\n userId,\n token: crypto.randomUUID(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n localStorage.setItem(SESSION_KEY, JSON.stringify(session))\n return session\n}\n\nexport function createLocalStorageAuthAdapter(): AuthAdapter {\n return {\n async signInWithOAuth(provider, options) {\n // Mock OAuth flow — create a synthetic user and return a fake redirect URL.\n // In real adapters this would redirect to the provider's authorization endpoint.\n const mockEmail = `oauth-${provider}-user@example.com`\n const users = getUsers()\n let user = users.find(u => u.email === mockEmail)\n if (!user) {\n user = {\n id: crypto.randomUUID(),\n email: mockEmail,\n name: `${provider.charAt(0).toUpperCase() + provider.slice(1)} User`,\n createdAt: new Date().toISOString(),\n passwordHash: '',\n }\n users.push(user)\n saveUsers(users)\n }\n createSession(user.id)\n const redirectUrl = options?.redirectUrl || '/'\n return { url: redirectUrl }\n },\n\n async signUp(email, password, name) {\n const users = getUsers()\n if (users.find(u => u.email === email)) throw new AuthError('User already exists', 'USER_EXISTS')\n const user: StoredUser = {\n id: crypto.randomUUID(),\n email,\n name: name || email.split('@')[0],\n createdAt: new Date().toISOString(),\n passwordHash: simpleHash(password),\n }\n users.push(user)\n saveUsers(users)\n return createSession(user.id)\n },\n\n async signIn(email, password) {\n const user = getUsers().find(u => u.email === email)\n if (!user || user.passwordHash !== simpleHash(password)) {\n throw new AuthError('Invalid email or password', 'INVALID_CREDENTIALS')\n }\n return createSession(user.id)\n },\n\n async signOut() {\n localStorage.removeItem(SESSION_KEY)\n },\n\n async getSession() {\n try {\n const raw = localStorage.getItem(SESSION_KEY)\n if (!raw) return null\n const s = JSON.parse(raw) as AuthSession\n if (!s || !s.expiresAt) return null\n if (new Date(s.expiresAt) < new Date()) {\n localStorage.removeItem(SESSION_KEY)\n return null\n }\n return s\n } catch { return null }\n },\n\n async getUser() {\n const session = await this.getSession()\n if (!session) return null\n const stored = getUsers().find(u => u.id === session.userId)\n if (!stored) return null\n const { passwordHash: _, ...user } = stored\n return user\n },\n\n async updateUser(updates) {\n const session = await this.getSession()\n if (!session) return null\n const users = getUsers()\n const idx = users.findIndex(u => u.id === session.userId)\n if (idx === -1) return null\n Object.assign(users[idx], updates)\n saveUsers(users)\n const { passwordHash: _, ...user } = users[idx]\n return user\n },\n }\n}\n","// @geenius/adapters — InMemory DB implementation\n\nimport type { ListOptions, QueryFilter, QueryCondition } from '../types'\nimport type { DbAdapter } from './interface'\n\nfunction matchesCondition(item: Record<string, unknown>, cond: QueryCondition): boolean {\n const val = item[cond.field]\n switch (cond.operator) {\n case 'eq': return val === cond.value\n case 'neq': return val !== cond.value\n case 'gt': return (val as number) > (cond.value as number)\n case 'gte': return (val as number) >= (cond.value as number)\n case 'lt': return (val as number) < (cond.value as number)\n case 'lte': return (val as number) <= (cond.value as number)\n case 'in': return Array.isArray(cond.value) && cond.value.includes(val)\n case 'contains': return typeof val === 'string' && val.includes(cond.value as string)\n default: return false\n }\n}\n\nfunction matchesFilter(item: Record<string, unknown>, filter: QueryFilter): boolean {\n return filter.every(cond => matchesCondition(item, cond))\n}\n\nexport function createMemoryDbAdapter(): DbAdapter {\n const store = new Map<string, Record<string, unknown>[]>()\n\n function getCollection(collection: string): Record<string, unknown>[] {\n return store.get(collection) || []\n }\n\n function saveCollection(collection: string, data: Record<string, unknown>[]) {\n store.set(collection, data)\n }\n\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const items = getCollection(collection)\n const item = { ...data, id: crypto.randomUUID() }\n items.push(item)\n saveCollection(collection, items)\n return item as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const found = getCollection(collection).find(item => item.id === id)\n return (found as T | undefined) ?? null\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const items = getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return null\n Object.assign(items[idx], data)\n saveCollection(collection, items)\n return items[idx] as T | null\n },\n\n async delete(collection: string, id: string) {\n const items = getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return false\n items.splice(idx, 1)\n saveCollection(collection, items)\n return true\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n let items = getCollection(collection)\n if (options?.orderBy) {\n const dir = options.order === 'desc' ? -1 : 1\n items.sort((a, b) => {\n const av = a[options.orderBy!] as string | number, bv = b[options.orderBy!] as string | number\n return av < bv ? -dir : av > bv ? dir : 0\n })\n }\n if (options?.offset) items = items.slice(options.offset)\n if (options?.limit) items = items.slice(0, options.limit)\n return items as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n return getCollection(collection).filter(item => matchesFilter(item, filter)) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const items = getCollection(collection)\n if (!filter || filter.length === 0) return items.length\n return items.filter(item => matchesFilter(item, filter)).length\n },\n }\n}\n","// @geenius/adapters — localStorage DB implementation\n\nimport type { ListOptions, QueryFilter, QueryCondition } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\nconst DB_PREFIX = 'geenius_db_'\n\nfunction getCollection(collection: string): Record<string, unknown>[] {\n try { return JSON.parse(localStorage.getItem(DB_PREFIX + collection) || '[]') } catch { return [] }\n}\n\nfunction saveCollection(collection: string, data: Record<string, unknown>[]) {\n localStorage.setItem(DB_PREFIX + collection, JSON.stringify(data))\n}\n\nfunction matchesCondition(item: Record<string, unknown>, cond: QueryCondition): boolean {\n const val = item[cond.field]\n switch (cond.operator) {\n case 'eq': return val === cond.value\n case 'neq': return val !== cond.value\n case 'gt': return (val as number) > (cond.value as number)\n case 'gte': return (val as number) >= (cond.value as number)\n case 'lt': return (val as number) < (cond.value as number)\n case 'lte': return (val as number) <= (cond.value as number)\n case 'in': return Array.isArray(cond.value) && cond.value.includes(val)\n case 'contains': return typeof val === 'string' && val.includes(cond.value as string)\n default: return false\n }\n}\n\nfunction matchesFilter(item: Record<string, unknown>, filter: QueryFilter): boolean {\n return filter.every(cond => matchesCondition(item, cond))\n}\n\nimport { createMemoryDbAdapter } from './memory'\n\nexport function createLocalStorageDbAdapter(): DbAdapter {\n if (typeof window === 'undefined') {\n return createMemoryDbAdapter()\n }\n\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const items = getCollection(collection)\n const item = { ...data, id: crypto.randomUUID() }\n items.push(item)\n saveCollection(collection, items)\n return item as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const found = getCollection(collection).find(item => item.id === id)\n return (found as T | undefined) ?? null\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const items = getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return null\n Object.assign(items[idx], data)\n saveCollection(collection, items)\n return items[idx] as T | null\n },\n\n async delete(collection: string, id: string) {\n const items = getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return false\n items.splice(idx, 1)\n saveCollection(collection, items)\n return true\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n let items = getCollection(collection)\n if (options?.orderBy) {\n const dir = options.order === 'desc' ? -1 : 1\n items.sort((a, b) => {\n const av = a[options.orderBy!] as string | number, bv = b[options.orderBy!] as string | number\n return av < bv ? -dir : av > bv ? dir : 0\n })\n }\n if (options?.offset) items = items.slice(options.offset)\n if (options?.limit) items = items.slice(0, options.limit)\n return items as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n return getCollection(collection).filter(item => matchesFilter(item, filter)) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const items = getCollection(collection)\n if (!filter || filter.length === 0) return items.length\n return items.filter(item => matchesFilter(item, filter)).length\n },\n }\n}\n","// @geenius/adapters — Convex DB implementation (MVP tier)\n// Wraps the Convex client to conform to DbAdapter interface.\n// Requires: convex\n\nimport type { ListOptions, QueryFilter } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\ninterface ConvexClient {\n query: (fn: unknown, args?: Record<string, unknown>) => Promise<unknown>\n mutation: (fn: unknown, args?: Record<string, unknown>) => Promise<unknown>\n}\n\nexport interface ConvexDbAdapterOptions {\n /** Pre-configured Convex client */\n client: ConvexClient\n /** Map of collection names to Convex function references */\n functions: {\n [collection: string]: {\n create?: unknown\n get?: unknown\n update?: unknown\n delete?: unknown\n list?: unknown\n query?: unknown\n count?: unknown\n }\n }\n}\n\n/**\n * Creates a Convex-backed DbAdapter.\n *\n * Since Convex uses predefined queries/mutations rather than arbitrary SQL,\n * you must provide function references for each collection. The adapter maps\n * generic CRUD calls to these Convex functions.\n *\n * @example\n * ```ts\n * import { api } from '../convex/_generated/api'\n *\n * const db = createConvexDbAdapter({\n * client: convex,\n * functions: {\n * tasks: {\n * create: api.tasks.create,\n * get: api.tasks.get,\n * list: api.tasks.list,\n * update: api.tasks.update,\n * delete: api.tasks.remove,\n * },\n * },\n * })\n * ```\n */\nexport function createConvexDbAdapter(options: ConvexDbAdapterOptions): DbAdapter {\n const { client, functions } = options\n\n function getFns(collection: string) {\n const fns = functions[collection]\n if (!fns) throw new DbError(`No Convex functions configured for collection: ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n return fns\n }\n\n function matchesFilter(item: Record<string, unknown>, filter: QueryFilter): boolean {\n return filter.every((cond) => {\n const val = item[cond.field]\n switch (cond.operator) {\n case 'eq': return val === cond.value\n case 'neq': return val !== cond.value\n case 'gt': return (val as number) > (cond.value as number)\n case 'gte': return (val as number) >= (cond.value as number)\n case 'lt': return (val as number) < (cond.value as number)\n case 'lte': return (val as number) <= (cond.value as number)\n case 'in': return Array.isArray(cond.value) && cond.value.includes(val)\n case 'contains': return typeof val === 'string' && val.includes(cond.value as string)\n default: return false\n }\n })\n }\n\n // Convex query/mutation results are loosely typed — the actual shape depends\n // on user-defined Convex functions. We cast at the boundary.\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const fns = getFns(collection)\n if (!fns.create) throw new DbError(`No create function for ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n const id = await client.mutation(fns.create, data as Record<string, unknown>)\n return { ...data, id } as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const fns = getFns(collection)\n if (!fns.get) throw new DbError(`No get function for ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n const doc = await client.query(fns.get, { id }) as Record<string, unknown> | null\n if (!doc) return null\n return { ...doc, id: (doc._id as string) || id } as T\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const fns = getFns(collection)\n if (!fns.update) throw new DbError(`No update function for ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n await client.mutation(fns.update, { id, ...data } as Record<string, unknown>)\n return this.get<T>(collection, id)\n },\n\n async delete(collection: string, id: string) {\n const fns = getFns(collection)\n if (!fns.delete) throw new DbError(`No delete function for ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n try {\n await client.mutation(fns.delete, { id })\n return true\n } catch (err) {\n throw new DbError(`Delete from \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n const fns = getFns(collection)\n if (!fns.list) throw new DbError(`No list function for ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n const docs = await client.query(fns.list, {\n limit: options?.limit,\n offset: options?.offset,\n orderBy: options?.orderBy,\n order: options?.order,\n }) as Record<string, unknown>[]\n return (docs || []).map((d) => ({ ...d, id: (d._id as string) || d.id })) as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n const fns = getFns(collection)\n if (!fns.query) {\n // Fallback: list all and filter client-side\n const all = await this.list<Record<string, unknown>>(collection)\n return all.filter((item) => matchesFilter(item, filter)) as T[]\n }\n const docs = await client.query(fns.query, { filter }) as Record<string, unknown>[]\n return (docs || []).map((d) => ({ ...d, id: (d._id as string) || d.id })) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const fns = getFns(collection)\n if (fns.count) {\n return client.query(fns.count, filter ? { filter } : undefined) as Promise<number>\n }\n // Fallback: count via list/query\n const items = filter ? await this.query(collection, filter) : await this.list(collection)\n return items.length\n },\n }\n}\n","// @geenius/adapters — Neon/Drizzle DB implementation (MVP tier)\n// Wraps a Drizzle ORM instance over Neon Postgres to conform to DbAdapter.\n// Requires: drizzle-orm, @neondatabase/serverless\n//\n// The adapter accepts pre-built Drizzle operator functions via the options\n// to avoid importing drizzle-orm at build time (it's an optional peer dep).\n\nimport type { ListOptions, QueryFilter } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\ninterface DrizzleTable {\n [key: string]: unknown\n}\n\ninterface DrizzleClient {\n select: (fields?: Record<string, unknown>) => unknown\n insert: (table: unknown) => unknown\n update: (table: unknown) => unknown\n delete: (table: unknown) => unknown\n}\n\n/** Drizzle operator functions — injected by the consumer */\nexport interface DrizzleOperators {\n eq: (col: unknown, value: unknown) => unknown\n ne: (col: unknown, value: unknown) => unknown\n gt: (col: unknown, value: unknown) => unknown\n gte: (col: unknown, value: unknown) => unknown\n lt: (col: unknown, value: unknown) => unknown\n lte: (col: unknown, value: unknown) => unknown\n inArray: (col: unknown, values: unknown[]) => unknown\n like: (col: unknown, pattern: string) => unknown\n and: (...conditions: unknown[]) => unknown\n asc: (col: unknown) => unknown\n desc: (col: unknown) => unknown\n sql: unknown\n count: (col?: unknown) => unknown\n}\n\nexport interface NeonDbAdapterOptions {\n /** Pre-configured Drizzle client instance */\n client: DrizzleClient\n /** Map of collection names to Drizzle table schema objects */\n tables: Record<string, DrizzleTable>\n /** Drizzle operator functions (import from 'drizzle-orm') */\n operators: DrizzleOperators\n}\n\n/**\n * Creates a Neon-backed DbAdapter using Drizzle ORM.\n *\n * @example\n * ```ts\n * import { drizzle } from 'drizzle-orm/neon-http'\n * import { neon } from '@neondatabase/serverless'\n * import { eq, ne, gt, gte, lt, lte, inArray, like, and, asc, desc, sql, count } from 'drizzle-orm'\n * import * as schema from './schema'\n *\n * const db = drizzle(neon(process.env.DATABASE_URL!))\n *\n * const adapter = createNeonDbAdapter({\n * client: db,\n * tables: { tasks: schema.tasks },\n * operators: { eq, ne, gt, gte, lt, lte, inArray, like, and, asc, desc, sql, count },\n * })\n * ```\n */\nexport function createNeonDbAdapter(options: NeonDbAdapterOptions): DbAdapter {\n const { client, tables, operators: ops } = options\n\n function getTable(collection: string) {\n const table = tables[collection]\n if (!table) throw new DbError(`No table configured for collection: ${collection}`, 'COLLECTION_NOT_CONFIGURED')\n return table\n }\n\n function buildConditions(table: DrizzleTable, filter: QueryFilter): unknown[] {\n return filter.map((cond) => {\n const col = table[cond.field]\n if (!col) throw new DbError(`Column ${cond.field} not found in table`, 'QUERY_ERROR')\n\n switch (cond.operator) {\n case 'eq': return ops.eq(col, cond.value)\n case 'neq': return ops.ne(col, cond.value)\n case 'gt': return ops.gt(col, cond.value)\n case 'gte': return ops.gte(col, cond.value)\n case 'lt': return ops.lt(col, cond.value)\n case 'lte': return ops.lte(col, cond.value)\n case 'in': return ops.inArray(col, cond.value as unknown[])\n case 'contains': return ops.like(col, `%${cond.value}%`)\n default: throw new DbError(`Unsupported operator: ${cond.operator}`, 'QUERY_ERROR')\n }\n })\n }\n\n // Drizzle query builder uses method chaining — typed as `any` at the chain\n // boundary because Drizzle's internal types are complex generics that can't\n // be captured without importing the full drizzle-orm type system.\n /* eslint-disable @typescript-eslint/no-explicit-any */\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const table = getTable(collection)\n try {\n const [result] = await (client.insert(table) as any).values(data).returning()\n return result as T & { id: string }\n } catch (err) {\n throw new DbError(`Insert into \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n },\n\n async get<T>(collection: string, id: string) {\n const table = getTable(collection)\n try {\n const [result] = await (client.select() as any).from(table).where(ops.eq(table.id, id)).limit(1)\n return (result as T | undefined) ?? null\n } catch (err) {\n throw new DbError(`Get from \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const table = getTable(collection)\n try {\n const [result] = await (client.update(table) as any).set(data).where(ops.eq(table.id, id)).returning()\n return (result as T | undefined) ?? null\n } catch (err) {\n throw new DbError(`Update in \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n },\n\n async delete(collection: string, id: string) {\n const table = getTable(collection)\n try {\n const result = await (client.delete(table) as any).where(ops.eq(table.id, id)).returning()\n return Array.isArray(result) && result.length > 0\n } catch (err) {\n throw new DbError(`Delete from \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n const table = getTable(collection)\n let query = (client.select() as any).from(table)\n\n if (options?.orderBy) {\n const col = table[options.orderBy]\n if (col) {\n query = query.orderBy(options.order === 'desc' ? ops.desc(col) : ops.asc(col))\n }\n }\n if (options?.limit) query = query.limit(options.limit)\n if (options?.offset) query = query.offset(options.offset)\n\n return query as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n const table = getTable(collection)\n\n if (filter.length === 0) {\n return (client.select() as any).from(table) as T[]\n }\n\n const conditions = buildConditions(table, filter)\n\n return (client.select() as any)\n .from(table)\n .where(ops.and(...conditions)) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const table = getTable(collection)\n\n if (!filter || filter.length === 0) {\n const [result] = await (client.select({ count: ops.count() }) as any).from(table)\n return Number(result?.count ?? 0)\n }\n\n const conditions = buildConditions(table, filter)\n const [result] = await (client.select({ count: ops.count() }) as any)\n .from(table)\n .where(ops.and(...conditions))\n return Number(result?.count ?? 0)\n },\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","// @geenius/adapters — Supabase DB implementation (MVP tier)\n// Wraps the Supabase client to conform to DbAdapter interface.\n// Requires: @supabase/supabase-js\n\nimport type { ListOptions, QueryFilter } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\ninterface SupabaseClient {\n from: (table: string) => SupabaseQueryBuilder\n}\n\ninterface SupabaseQueryBuilder {\n select: (columns?: string) => SupabaseQueryBuilder\n insert: (data: Record<string, unknown>) => SupabaseQueryBuilder\n update: (data: Record<string, unknown>) => SupabaseQueryBuilder\n delete: () => SupabaseQueryBuilder\n eq: (column: string, value: unknown) => SupabaseQueryBuilder\n neq: (column: string, value: unknown) => SupabaseQueryBuilder\n gt: (column: string, value: unknown) => SupabaseQueryBuilder\n gte: (column: string, value: unknown) => SupabaseQueryBuilder\n lt: (column: string, value: unknown) => SupabaseQueryBuilder\n lte: (column: string, value: unknown) => SupabaseQueryBuilder\n in: (column: string, values: unknown[]) => SupabaseQueryBuilder\n ilike: (column: string, pattern: string) => SupabaseQueryBuilder\n order: (column: string, options?: { ascending?: boolean }) => SupabaseQueryBuilder\n range: (from: number, to: number) => SupabaseQueryBuilder\n limit: (count: number) => SupabaseQueryBuilder\n single: () => SupabaseQueryBuilder\n then: (resolve: (value: { data: unknown; error: { message: string } | null }) => void) => Promise<unknown>\n}\n\nexport interface SupabaseDbAdapterOptions {\n /** Pre-configured Supabase client instance */\n client: SupabaseClient\n /** Optional table name mapping: { collectionName: 'actual_table_name' } */\n tableNames?: Record<string, string>\n}\n\n/**\n * Creates a Supabase-backed DbAdapter.\n *\n * @example\n * ```ts\n * import { createClient } from '@supabase/supabase-js'\n *\n * const supabase = createClient(url, key)\n * const db = createSupabaseDbAdapter({ client: supabase })\n * ```\n */\nexport function createSupabaseDbAdapter(options: SupabaseDbAdapterOptions): DbAdapter {\n const { client, tableNames = {} } = options\n\n function tableName(collection: string): string {\n return tableNames[collection] || collection\n }\n\n // Supabase query builder returns { data, error } — the builder chain is\n // thenable, so we await it directly. The intermediate chain types don't\n // carry our generic T, so we cast at the result boundary.\n /* eslint-disable @typescript-eslint/no-explicit-any */\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const { data: result, error } = await (client\n .from(tableName(collection))\n .insert(data as Record<string, unknown>)\n .select()\n .single() as any)\n\n if (error) throw new DbError(`Insert into \"${collection}\" failed: ${error.message}`, 'QUERY_ERROR', error)\n return result as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const { data, error } = await (client\n .from(tableName(collection))\n .select()\n .eq('id', id)\n .single() as any)\n\n if (error) return null\n return data as T\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const { data: result, error } = await (client\n .from(tableName(collection))\n .update(data as Record<string, unknown>)\n .eq('id', id)\n .select()\n .single() as any)\n\n if (error) return null\n return result as T\n },\n\n async delete(collection: string, id: string) {\n const { error } = await (client\n .from(tableName(collection))\n .delete()\n .eq('id', id) as any)\n\n return !error\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n let query: any = client.from(tableName(collection)).select()\n\n if (options?.orderBy) {\n query = query.order(options.orderBy, {\n ascending: options.order !== 'desc',\n })\n }\n\n if (options?.offset !== undefined && options?.limit !== undefined) {\n query = query.range(options.offset, options.offset + options.limit - 1)\n } else if (options?.limit) {\n query = query.limit(options.limit)\n }\n\n const { data, error } = await query\n if (error) throw new DbError(`List \"${collection}\" failed: ${error.message}`, 'QUERY_ERROR', error)\n return (data || []) as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n let query: any = client.from(tableName(collection)).select()\n\n for (const cond of filter) {\n switch (cond.operator) {\n case 'eq': query = query.eq(cond.field, cond.value); break\n case 'neq': query = query.neq(cond.field, cond.value); break\n case 'gt': query = query.gt(cond.field, cond.value); break\n case 'gte': query = query.gte(cond.field, cond.value); break\n case 'lt': query = query.lt(cond.field, cond.value); break\n case 'lte': query = query.lte(cond.field, cond.value); break\n case 'in': query = query.in(cond.field, cond.value as unknown[]); break\n case 'contains': query = query.ilike(cond.field, `%${cond.value}%`); break\n }\n }\n\n const { data, error } = await query\n if (error) throw new DbError(`Query \"${collection}\" failed: ${error.message}`, 'QUERY_ERROR', error)\n return (data || []) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n if (!filter || filter.length === 0) {\n const { data } = await (client\n .from(tableName(collection))\n .select('id') as any)\n return data?.length ?? 0\n }\n\n const items = await this.query(collection, filter)\n return items.length\n },\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","// @geenius/adapters — MongoDB implementation (MVP tier)\n// Wraps the MongoDB Node.js driver to conform to DbAdapter interface.\n// Requires: mongodb\n\nimport type { ListOptions, QueryFilter } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\ninterface MongoCollection {\n insertOne: (doc: Record<string, unknown>) => Promise<{ insertedId: unknown }>\n findOne: (filter: Record<string, unknown>) => Promise<Record<string, unknown> | null>\n updateOne: (filter: Record<string, unknown>, update: Record<string, unknown>) => Promise<unknown>\n deleteOne: (filter: Record<string, unknown>) => Promise<{ deletedCount: number }>\n find: (filter?: Record<string, unknown>) => MongoCursor\n countDocuments: (filter?: Record<string, unknown>) => Promise<number>\n}\n\ninterface MongoCursor {\n sort: (sort: Record<string, number>) => MongoCursor\n skip: (n: number) => MongoCursor\n limit: (n: number) => MongoCursor\n toArray: () => Promise<Record<string, unknown>[]>\n}\n\ninterface MongoDb {\n collection: (name: string) => MongoCollection\n}\n\nexport interface MongoDbAdapterOptions {\n /** Pre-configured MongoDB database instance */\n db: MongoDb\n /** Optional collection name mapping */\n collectionNames?: Record<string, string>\n}\n\n/**\n * Creates a MongoDB-backed DbAdapter.\n *\n * @example\n * ```ts\n * import { MongoClient } from 'mongodb'\n *\n * const client = new MongoClient(process.env.MONGODB_URI!)\n * const db = client.db('myapp')\n * const adapter = createMongoDbAdapter({ db })\n * ```\n */\nexport function createMongoDbAdapter(options: MongoDbAdapterOptions): DbAdapter {\n const { db, collectionNames = {} } = options\n\n function col(collection: string): MongoCollection {\n return db.collection(collectionNames[collection] || collection)\n }\n\n function buildMongoFilter(filter: QueryFilter): Record<string, unknown> {\n const mongoFilter: Record<string, unknown> = {}\n\n for (const cond of filter) {\n switch (cond.operator) {\n case 'eq': mongoFilter[cond.field] = cond.value; break\n case 'neq': mongoFilter[cond.field] = { $ne: cond.value }; break\n case 'gt': mongoFilter[cond.field] = { $gt: cond.value }; break\n case 'gte': mongoFilter[cond.field] = { $gte: cond.value }; break\n case 'lt': mongoFilter[cond.field] = { $lt: cond.value }; break\n case 'lte': mongoFilter[cond.field] = { $lte: cond.value }; break\n case 'in': mongoFilter[cond.field] = { $in: cond.value }; break\n case 'contains':\n mongoFilter[cond.field] = { $regex: cond.value, $options: 'i' }\n break\n }\n }\n\n return mongoFilter\n }\n\n function stripMongoId(doc: Record<string, unknown>): Record<string, unknown> {\n const { _id, ...rest } = doc\n return rest\n }\n\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const id = crypto.randomUUID()\n const doc = { ...data, id }\n try {\n await col(collection).insertOne(doc)\n } catch (err) {\n throw new DbError(`Insert into \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n return doc as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const doc = await col(collection).findOne({ id })\n if (!doc) return null\n return stripMongoId(doc) as T\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n try {\n await col(collection).updateOne({ id }, { $set: data })\n } catch (err) {\n throw new DbError(`Update in \"${collection}\" failed`, 'QUERY_ERROR', err)\n }\n return this.get<T>(collection, id)\n },\n\n async delete(collection: string, id: string) {\n const result = await col(collection).deleteOne({ id })\n return result.deletedCount > 0\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n let cursor = col(collection).find()\n\n if (options?.orderBy) {\n cursor = cursor.sort({ [options.orderBy]: options.order === 'desc' ? -1 : 1 })\n }\n if (options?.offset) cursor = cursor.skip(options.offset)\n if (options?.limit) cursor = cursor.limit(options.limit)\n\n const docs = await cursor.toArray()\n return docs.map(stripMongoId) as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n const mongoFilter = buildMongoFilter(filter)\n const docs = await col(collection).find(mongoFilter).toArray()\n return docs.map(stripMongoId) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const mongoFilter = filter ? buildMongoFilter(filter) : {}\n return col(collection).countDocuments(mongoFilter)\n },\n }\n}\n","// @geenius/adapters — Cloudflare KV DB implementation\n\nimport type { ListOptions, QueryFilter, QueryCondition } from '../types'\nimport type { DbAdapter } from './interface'\nimport { DbError } from '../errors'\n\n// Generic typing for the global KVNamespace if @cloudflare/workers-types isn't explicitly imported\nexport interface KVNamespaceLike {\n get(key: string, type: 'json'): Promise<unknown>\n put(key: string, value: string): Promise<void>\n}\n\nconst DB_PREFIX = 'geenius_db_'\n\nfunction matchesCondition(item: Record<string, unknown>, cond: QueryCondition): boolean {\n const val = item[cond.field]\n switch (cond.operator) {\n case 'eq': return val === cond.value\n case 'neq': return val !== cond.value\n case 'gt': return (val as number) > (cond.value as number)\n case 'gte': return (val as number) >= (cond.value as number)\n case 'lt': return (val as number) < (cond.value as number)\n case 'lte': return (val as number) <= (cond.value as number)\n case 'in': return Array.isArray(cond.value) && cond.value.includes(val)\n case 'contains': return typeof val === 'string' && val.includes(cond.value as string)\n default: return false\n }\n}\n\nfunction matchesFilter(item: Record<string, unknown>, filter: QueryFilter): boolean {\n return filter.every(cond => matchesCondition(item, cond))\n}\n\nexport function createCloudflareKVDbAdapter(kv: KVNamespaceLike): DbAdapter {\n async function getCollection(collection: string): Promise<Record<string, unknown>[]> {\n try {\n const data = await kv.get(DB_PREFIX + collection, 'json')\n return (data as Record<string, unknown>[]) || []\n } catch (err) {\n throw new DbError(`Failed to read collection \"${collection}\" from KV`, 'CONNECTION_ERROR', err)\n }\n }\n\n async function saveCollection(collection: string, data: Record<string, unknown>[]): Promise<void> {\n try {\n await kv.put(DB_PREFIX + collection, JSON.stringify(data))\n } catch (err) {\n throw new DbError(`Failed to write collection \"${collection}\" to KV`, 'CONNECTION_ERROR', err)\n }\n }\n\n return {\n async create<T extends Record<string, unknown>>(collection: string, data: Omit<T, 'id'>) {\n const items = await getCollection(collection)\n const item = { ...data, id: crypto.randomUUID() }\n items.push(item)\n await saveCollection(collection, items)\n return item as T & { id: string }\n },\n\n async get<T>(collection: string, id: string) {\n const items = await getCollection(collection)\n const found = items.find(item => item.id === id)\n return (found as T | undefined) ?? null\n },\n\n async update<T extends Record<string, unknown>>(collection: string, id: string, data: Partial<T>) {\n const items = await getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return null\n Object.assign(items[idx], data)\n await saveCollection(collection, items)\n return items[idx] as T | null\n },\n\n async delete(collection: string, id: string) {\n const items = await getCollection(collection)\n const idx = items.findIndex(item => item.id === id)\n if (idx === -1) return false\n items.splice(idx, 1)\n await saveCollection(collection, items)\n return true\n },\n\n async list<T>(collection: string, options?: ListOptions) {\n let items = await getCollection(collection)\n if (options?.orderBy) {\n const dir = options.order === 'desc' ? -1 : 1\n items.sort((a, b) => {\n const av = a[options.orderBy!] as string | number, bv = b[options.orderBy!] as string | number\n return av < bv ? -dir : av > bv ? dir : 0\n })\n }\n if (options?.offset) items = items.slice(options.offset)\n if (options?.limit) items = items.slice(0, options.limit)\n return items as T[]\n },\n\n async query<T>(collection: string, filter: QueryFilter) {\n const items = await getCollection(collection)\n return items.filter(item => matchesFilter(item, filter)) as T[]\n },\n\n async count(collection: string, filter?: QueryFilter) {\n const items = await getCollection(collection)\n if (!filter || filter.length === 0) return items.length\n return items.filter(item => matchesFilter(item, filter)).length\n },\n }\n}\n","// @geenius/adapters — localStorage Payments implementation (MVP tier mock)\n\nimport type { Plan, Subscription, CheckoutParams, CheckoutResult } from '../types'\nimport type { PaymentsAdapter } from './interface'\n\nconst SUBS_KEY = 'geenius_subscriptions'\nconst PLANS_KEY = 'geenius_plans'\n\nconst DEFAULT_PLANS: Plan[] = [\n { id: 'free', name: 'Free', price: 0, currency: 'USD', interval: 'month', features: ['Basic features', '1 project', 'Community support'] },\n { id: 'pro', name: 'Pro', price: 29, currency: 'USD', interval: 'month', features: ['All Free features', 'Unlimited projects', 'Priority support', 'AI features'] },\n { id: 'team', name: 'Team', price: 79, currency: 'USD', interval: 'month', features: ['All Pro features', 'Team management', 'Admin dashboard', 'Custom integrations'] },\n]\n\nfunction getSubs(): Subscription[] {\n try { return JSON.parse(localStorage.getItem(SUBS_KEY) || '[]') } catch { return [] }\n}\nfunction saveSubs(subs: Subscription[]) { localStorage.setItem(SUBS_KEY, JSON.stringify(subs)) }\n\nexport function createLocalStoragePaymentsAdapter(): PaymentsAdapter {\n // Seed default plans\n if (!localStorage.getItem(PLANS_KEY)) {\n localStorage.setItem(PLANS_KEY, JSON.stringify(DEFAULT_PLANS))\n }\n\n return {\n async createCheckout(params: CheckoutParams) {\n // Mock: instantly create a subscription\n const subs = getSubs()\n const sub: Subscription = {\n id: crypto.randomUUID(),\n userId: params.userId,\n planId: params.planId,\n status: 'active',\n currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n cancelAtPeriodEnd: false,\n }\n subs.push(sub)\n saveSubs(subs)\n return { url: params.successUrl || '/', sessionId: sub.id } as CheckoutResult\n },\n\n async getSubscription(userId) {\n const sub = getSubs().find(s => s.userId === userId && s.status === 'active')\n return sub ?? null\n },\n\n async cancelSubscription(subscriptionId) {\n const subs = getSubs()\n const idx = subs.findIndex(s => s.id === subscriptionId)\n if (idx !== -1) {\n subs[idx].cancelAtPeriodEnd = true\n subs[idx].status = 'cancelled'\n saveSubs(subs)\n }\n },\n\n async getPlans() {\n try { return JSON.parse(localStorage.getItem(PLANS_KEY) || '[]') } catch { return DEFAULT_PLANS }\n },\n\n async isFeatureEnabled(userId, feature) {\n const sub = await this.getSubscription(userId)\n if (!sub) return false\n const plans: Plan[] = await this.getPlans()\n const plan = plans.find(p => p.id === sub.planId)\n return plan?.features.includes(feature) ?? false\n },\n }\n}\n\n// No-op adapter for Pronto tier (payments completely disabled)\nexport function createNoopPaymentsAdapter(): PaymentsAdapter {\n return {\n async createCheckout() { throw new Error('Payments not available in Pronto tier. Upgrade to Lancio.') },\n async getSubscription() { return null },\n async cancelSubscription() {},\n async getPlans() { return [] },\n async isFeatureEnabled() { return false },\n }\n}\n","// @geenius/adapters — localStorage AI implementation (canned responses)\n\nimport type { ChatMessage, ChatResponse, AiOptions } from '../types'\nimport type { AiAdapter } from './interface'\n\nconst HISTORY_KEY = 'geenius_ai_history'\n\nconst CANNED_RESPONSES = [\n \"That's an interesting question! In the Pronto tier, AI responses are simulated. Upgrade to MVP for real AI.\",\n \"I'm a mock AI assistant. I can demonstrate the chat interface, but for real responses you'll need the MVP tier.\",\n \"Great question! This is a localStorage-based AI mock. The real AI adapter connects to OpenAI/Anthropic APIs.\",\n \"I appreciate your input! This demo shows how the AI interface works. Upgrade for actual AI capabilities.\",\n \"Interesting! While I can't provide real AI analysis in Pronto, this shows the adapter pattern in action.\",\n]\n\nfunction getCannedResponse(messages: ChatMessage[]): string {\n const lastMsg = messages[messages.length - 1]?.content || ''\n // Deterministic but varied: hash the message to pick a response\n let hash = 0\n for (let i = 0; i < lastMsg.length; i++) { hash = ((hash << 5) - hash) + lastMsg.charCodeAt(i); hash |= 0 }\n return CANNED_RESPONSES[Math.abs(hash) % CANNED_RESPONSES.length]\n}\n\nfunction saveToHistory(messages: ChatMessage[], response: string) {\n try {\n const history = JSON.parse(localStorage.getItem(HISTORY_KEY) || '[]')\n history.push({ timestamp: new Date().toISOString(), messages, response })\n // Keep last 50 conversations\n if (history.length > 50) history.splice(0, history.length - 50)\n localStorage.setItem(HISTORY_KEY, JSON.stringify(history))\n } catch { /* ignore storage errors */ }\n}\n\nexport function createLocalStorageAiAdapter(): AiAdapter {\n return {\n async chat(messages: ChatMessage[], _options?: AiOptions): Promise<ChatResponse> {\n // Simulate network delay\n await new Promise(r => setTimeout(r, 300 + Math.random() * 700))\n const content = getCannedResponse(messages)\n saveToHistory(messages, content)\n return {\n content,\n finishReason: 'stop',\n usage: { promptTokens: 10, completionTokens: 20, totalTokens: 30 },\n }\n },\n\n async complete(prompt: string, options?: AiOptions): Promise<string> {\n const response = await this.chat([{ role: 'user', content: prompt }], options)\n return response.content\n },\n\n async embed(text: string | string[]): Promise<number[][]> {\n const inputs = Array.isArray(text) ? text : [text]\n // Return mock 8-dimensional embeddings (deterministic from text)\n return inputs.map(t => {\n const vec: number[] = []\n for (let i = 0; i < 8; i++) {\n let h = i * 31\n for (let j = 0; j < t.length; j++) { h = ((h << 5) - h) + t.charCodeAt(j); h |= 0 }\n vec.push(Math.sin(h) * 0.5 + 0.5)\n }\n return vec\n })\n },\n\n async *stream(messages: ChatMessage[], _options?: AiOptions): AsyncIterable<string> {\n // Simulate streaming by yielding the canned response word-by-word\n const content = getCannedResponse(messages)\n saveToHistory(messages, content)\n const words = content.split(' ')\n for (const word of words) {\n await new Promise(r => setTimeout(r, 40 + Math.random() * 60))\n yield word + ' '\n }\n },\n }\n}\n","// @geenius/adapters — localStorage File Storage implementation (base64 blobs)\n\nimport type { StoredFile } from '../types'\nimport type { FileStorageAdapter } from './interface'\n\nconst FILES_KEY = 'geenius_files'\nconst BLOBS_PREFIX = 'geenius_blob_'\n\ninterface StoredFileEntry extends StoredFile {\n blobKey: string\n}\n\nfunction getFiles(): StoredFileEntry[] {\n try { return JSON.parse(localStorage.getItem(FILES_KEY) || '[]') } catch { return [] }\n}\nfunction saveFiles(files: StoredFileEntry[]) { localStorage.setItem(FILES_KEY, JSON.stringify(files)) }\n\nfunction blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(blob)\n })\n}\n\nfunction base64ToBlob(dataUrl: string): Blob {\n const [meta, data] = dataUrl.split(',')\n const mime = meta.match(/:(.*?);/)?.[1] || 'application/octet-stream'\n const bytes = atob(data)\n const buffer = new Uint8Array(bytes.length)\n for (let i = 0; i < bytes.length; i++) buffer[i] = bytes.charCodeAt(i)\n return new Blob([buffer], { type: mime })\n}\n\nexport function createLocalStorageFileAdapter(): FileStorageAdapter {\n return {\n async upload(file, path, name?) {\n const base64 = await blobToBase64(file)\n const id = crypto.randomUUID()\n const blobKey = BLOBS_PREFIX + id\n\n // Store the blob data separately (can be large)\n localStorage.setItem(blobKey, base64)\n\n const entry: StoredFileEntry = {\n id,\n name: name || (file instanceof File ? file.name : `file-${id.slice(0, 8)}`),\n path,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n url: `local://${id}`,\n createdAt: new Date().toISOString(),\n blobKey,\n }\n const files = getFiles()\n files.push(entry)\n saveFiles(files)\n\n const { blobKey: _, ...storedFile } = entry\n return storedFile\n },\n\n async download(fileId) {\n const entry = getFiles().find(f => f.id === fileId)\n if (!entry) throw new Error(`File not found: ${fileId}`)\n const base64 = localStorage.getItem(entry.blobKey)\n if (!base64) throw new Error(`Blob data missing for file: ${fileId}`)\n return base64ToBlob(base64)\n },\n\n async delete(fileId) {\n const files = getFiles()\n const idx = files.findIndex(f => f.id === fileId)\n if (idx === -1) return false\n localStorage.removeItem(files[idx].blobKey)\n files.splice(idx, 1)\n saveFiles(files)\n return true\n },\n\n async list(prefix?) {\n let files = getFiles()\n if (prefix) files = files.filter(f => f.path.startsWith(prefix))\n return files.map(({ blobKey: _, ...f }) => f)\n },\n\n async getUrl(fileId) {\n const entry = getFiles().find(f => f.id === fileId)\n if (!entry) throw new Error(`File not found: ${fileId}`)\n const base64 = localStorage.getItem(entry.blobKey)\n return base64 || entry.url\n },\n }\n}\n","// @geenius/adapters — localStorage admin implementation (Pronto/MVP tier)\n\nimport type { AdminAdapter, AdminMetrics, ManagedUser } from './interface'\n\nconst USERS_KEY = 'geenius_auth_users'\n\nexport function createLocalStorageAdminAdapter(): AdminAdapter {\n function getUsers(): ManagedUser[] {\n try {\n const data = localStorage.getItem(USERS_KEY)\n if (!data) return []\n const raw = JSON.parse(data) as Record<string, any>\n return Object.values(raw).map((u: any) => ({\n id: u.id,\n email: u.email,\n name: u.name,\n image: u.image,\n role: u.role || 'user',\n isActive: true,\n isBanned: u.isBanned || false,\n plan: u.plan || 'free',\n createdAt: u.createdAt,\n lastLoginAt: u.lastLoginAt,\n }))\n } catch {\n return []\n }\n }\n\n return {\n async listUsers(options?) {\n let users = getUsers()\n\n if (options?.search) {\n const q = options.search.toLowerCase()\n users = users.filter(\n (u) =>\n u.email?.toLowerCase().includes(q) ||\n u.name?.toLowerCase().includes(q)\n )\n }\n\n const offset = options?.offset || 0\n const limit = options?.limit || 50\n return users.slice(offset, offset + limit)\n },\n\n async getUser(id) {\n const users = getUsers()\n return users.find((u) => u.id === id) || null\n },\n\n async banUser(id) {\n try {\n const data = JSON.parse(localStorage.getItem(USERS_KEY) || '{}')\n if (data[id]) {\n data[id].isBanned = true\n localStorage.setItem(USERS_KEY, JSON.stringify(data))\n return true\n }\n return false\n } catch {\n return false\n }\n },\n\n async unbanUser(id) {\n try {\n const data = JSON.parse(localStorage.getItem(USERS_KEY) || '{}')\n if (data[id]) {\n data[id].isBanned = false\n localStorage.setItem(USERS_KEY, JSON.stringify(data))\n return true\n }\n return false\n } catch {\n return false\n }\n },\n\n async deleteUser(id) {\n try {\n const data = JSON.parse(localStorage.getItem(USERS_KEY) || '{}')\n if (data[id]) {\n delete data[id]\n localStorage.setItem(USERS_KEY, JSON.stringify(data))\n return true\n }\n return false\n } catch {\n return false\n }\n },\n\n async getMetrics(): Promise<AdminMetrics> {\n const users = getUsers()\n const today = new Date().toISOString().split('T')[0]\n const newToday = users.filter(\n (u) => u.createdAt && u.createdAt.startsWith(today)\n ).length\n\n return {\n totalUsers: users.length,\n activeUsers: users.filter((u) => u.isActive && !u.isBanned).length,\n newUsersToday: newToday,\n }\n },\n }\n}\n","// @geenius/adapters — Tier gating utility\n// Defines which features/components are available per tier.\n// Used by the CLI (geenius add) and runtime (conditional rendering).\n\nexport type ProjectTier = 'pronto' | 'lancio' | 'studio'\n\n/** Feature access rules per tier */\nexport interface TierGateConfig {\n /** Features available in each tier (cumulative — higher tiers include lower) */\n features: Record<ProjectTier, string[]>\n /** UI component packages available per tier */\n packages: Record<ProjectTier, string[]>\n}\n\nexport const DEFAULT_TIER_GATE: TierGateConfig = {\n features: {\n pronto: [\n 'auth', 'i18n', 'ai-chat',\n ],\n lancio: [\n 'auth', 'i18n', 'ai-chat',\n 'admin', 'payments', 'blog', 'file-storage',\n 'ai-workflow', 'ai-embeddings',\n ],\n studio: [\n 'auth', 'i18n', 'ai-chat',\n 'admin', 'payments', 'blog', 'file-storage',\n 'ai-workflow', 'ai-embeddings',\n 'ai-magic', 'analytics', 'emails', 'teams', 'feature-flags',\n 'docs', 'monitoring', 'notifications',\n 'jobs', 'changelog', 'roadmap', 'waitlist',\n 'seo', 'onboarding', 'feedback', 'pricing', 'search',\n ],\n },\n packages: {\n pronto: [\n '@geenius/adapters',\n '@geenius/auth',\n '@geenius/i18n',\n '@geenius/config',\n '@geenius/tools',\n '@geenius/ui',\n ],\n lancio: [\n '@geenius/adapters',\n '@geenius/auth',\n '@geenius/i18n',\n '@geenius/config',\n '@geenius/tools',\n '@geenius/ui',\n '@geenius/admin',\n '@geenius/payments',\n '@geenius/stripe',\n '@geenius/blog',\n '@geenius/file-storage',\n '@geenius/ai',\n ],\n studio: [\n '@geenius/adapters',\n '@geenius/auth',\n '@geenius/i18n',\n '@geenius/config',\n '@geenius/tools',\n '@geenius/ui',\n '@geenius/admin',\n '@geenius/payments',\n '@geenius/stripe',\n '@geenius/blog',\n '@geenius/file-storage',\n '@geenius/ai',\n '@geenius/ai-magic',\n '@geenius/ai-workflow',\n '@geenius/analytics',\n '@geenius/emails',\n '@geenius/teams',\n '@geenius/feature-flags',\n '@geenius/docs',\n '@geenius/monitoring',\n '@geenius/notifications',\n '@geenius/jobs',\n '@geenius/changelog',\n '@geenius/roadmap',\n '@geenius/waitlist',\n '@geenius/seo',\n '@geenius/onboarding',\n '@geenius/feedback',\n '@geenius/pricing',\n '@geenius/search',\n '@geenius/agent',\n ],\n },\n}\n\n/** Check if a feature is available for a given tier */\nexport function isFeatureAvailable(feature: string, tier: ProjectTier): boolean {\n return DEFAULT_TIER_GATE.features[tier]?.includes(feature) ?? false\n}\n\n/** Check if a package is available for a given tier */\nexport function isPackageAvailable(pkg: string, tier: ProjectTier): boolean {\n return DEFAULT_TIER_GATE.packages[tier]?.includes(pkg) ?? false\n}\n\n/** Get all features available for a tier */\nexport function getAvailableFeatures(tier: ProjectTier): string[] {\n return DEFAULT_TIER_GATE.features[tier] || []\n}\n\n/** Get all packages available for a tier */\nexport function getAvailablePackages(tier: ProjectTier): string[] {\n return DEFAULT_TIER_GATE.packages[tier] || []\n}\n\n/** Get the features that would be unlocked by upgrading to a higher tier */\nexport function getUpgradeFeatures(currentTier: ProjectTier, targetTier: ProjectTier): string[] {\n const current = new Set(DEFAULT_TIER_GATE.features[currentTier] || [])\n const target = DEFAULT_TIER_GATE.features[targetTier] || []\n return target.filter((f) => !current.has(f))\n}\n"],"mappings":"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","names":["getCollection","saveCollection","matchesCondition","matchesFilter","matchesFilter","options","options","result","options","options","DB_PREFIX","matchesCondition","matchesFilter","getCollection","saveCollection","USERS_KEY","getUsers"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/adapters-solidjs\n\n> Geenius Adapters — SolidJS primitives and providers\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/adapters-solidjs\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/adapters-solidjs';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { DbAdapter, AuthAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter, AdapterDomain, AdapterStatusInfo, AdapterStatusType, DomainAdapterConfig } from '@geenius/adapters-shared';
|
|
2
|
+
export { ADAPTER_DOMAINS, AdapterConfig, AdapterDomain, AdapterStatusInfo, AdapterStatusType, AdminAdapter, AiAdapter, AuthAdapter, DOMAIN_DESCRIPTIONS, DOMAIN_ICONS, DOMAIN_LABELS, DbAdapter, FileStorageAdapter, OAuthProvider, PaymentsAdapter, configureAdapters, getAdapterConfig } from '@geenius/adapters-shared';
|
|
3
|
+
import * as solid_js from 'solid-js';
|
|
4
|
+
import { JSX } from 'solid-js';
|
|
5
|
+
|
|
6
|
+
interface AdapterSet {
|
|
7
|
+
db?: DbAdapter;
|
|
8
|
+
auth?: AuthAdapter;
|
|
9
|
+
payments?: PaymentsAdapter;
|
|
10
|
+
ai?: AiAdapter;
|
|
11
|
+
storage?: FileStorageAdapter;
|
|
12
|
+
admin?: AdminAdapter;
|
|
13
|
+
}
|
|
14
|
+
interface AdapterContextValue {
|
|
15
|
+
adapters: AdapterSet;
|
|
16
|
+
statuses: Record<AdapterDomain, AdapterStatusInfo>;
|
|
17
|
+
getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>;
|
|
18
|
+
isReady: (domain: AdapterDomain) => boolean;
|
|
19
|
+
isLoading: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface AdapterProviderProps {
|
|
22
|
+
adapters: AdapterSet;
|
|
23
|
+
children: JSX.Element;
|
|
24
|
+
}
|
|
25
|
+
declare function AdapterProvider(props: AdapterProviderProps): JSX.Element;
|
|
26
|
+
declare function useAdapterContext(): AdapterContextValue;
|
|
27
|
+
|
|
28
|
+
/** Access the database adapter */
|
|
29
|
+
declare function createDb(): DbAdapter;
|
|
30
|
+
/** Access the auth adapter */
|
|
31
|
+
declare function createAuth(): AuthAdapter;
|
|
32
|
+
/** Access the payments adapter */
|
|
33
|
+
declare function createPayments(): PaymentsAdapter;
|
|
34
|
+
/** Access the AI adapter */
|
|
35
|
+
declare function createAi(): AiAdapter;
|
|
36
|
+
/** Access the file storage adapter */
|
|
37
|
+
declare function createStorage(): FileStorageAdapter;
|
|
38
|
+
/** Access the admin adapter */
|
|
39
|
+
declare function createAdmin(): AdminAdapter;
|
|
40
|
+
/** Access all adapter statuses */
|
|
41
|
+
declare function createAdapterStatuses(): Record<AdapterDomain, AdapterStatusInfo>;
|
|
42
|
+
/** Access status for a specific domain */
|
|
43
|
+
declare function createAdapterStatus(domain: AdapterDomain): solid_js.Accessor<AdapterStatusInfo>;
|
|
44
|
+
/** Check if adapter is ready */
|
|
45
|
+
declare function createIsAdapterReady(domain: AdapterDomain): solid_js.Accessor<boolean>;
|
|
46
|
+
/** Access full adapters object */
|
|
47
|
+
declare function createAdapters(): {
|
|
48
|
+
db: DbAdapter | undefined;
|
|
49
|
+
auth: AuthAdapter | undefined;
|
|
50
|
+
payments: PaymentsAdapter | undefined;
|
|
51
|
+
ai: AiAdapter | undefined;
|
|
52
|
+
storage: FileStorageAdapter | undefined;
|
|
53
|
+
admin: AdminAdapter | undefined;
|
|
54
|
+
statuses: Record<AdapterDomain, AdapterStatusInfo>;
|
|
55
|
+
isLoading: boolean;
|
|
56
|
+
isReady: (domain: AdapterDomain) => boolean;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
declare function AdapterStatusBadge(props: {
|
|
60
|
+
status: AdapterStatusType;
|
|
61
|
+
showLabel?: boolean;
|
|
62
|
+
class?: string;
|
|
63
|
+
}): solid_js.JSX.Element;
|
|
64
|
+
|
|
65
|
+
declare function AdapterCard(props: {
|
|
66
|
+
domain: AdapterDomain;
|
|
67
|
+
status: AdapterStatusInfo;
|
|
68
|
+
onClick?: () => void;
|
|
69
|
+
class?: string;
|
|
70
|
+
}): solid_js.JSX.Element;
|
|
71
|
+
|
|
72
|
+
declare function AdapterList(props: {
|
|
73
|
+
onSelect?: (d: AdapterDomain) => void;
|
|
74
|
+
filterStatus?: AdapterStatusType;
|
|
75
|
+
class?: string;
|
|
76
|
+
}): solid_js.JSX.Element;
|
|
77
|
+
|
|
78
|
+
declare function AdapterConfigForm(props: {
|
|
79
|
+
domain: AdapterDomain;
|
|
80
|
+
initialConfig?: DomainAdapterConfig;
|
|
81
|
+
onSave: (c: DomainAdapterConfig) => Promise<void> | void;
|
|
82
|
+
onCancel?: () => void;
|
|
83
|
+
class?: string;
|
|
84
|
+
}): solid_js.JSX.Element;
|
|
85
|
+
|
|
86
|
+
declare function AdaptersPage(props: {
|
|
87
|
+
onNavigateDetail?: (d: AdapterDomain) => void;
|
|
88
|
+
class?: string;
|
|
89
|
+
}): solid_js.JSX.Element;
|
|
90
|
+
|
|
91
|
+
declare function AdapterDetailPage(props: {
|
|
92
|
+
domain: AdapterDomain;
|
|
93
|
+
onBack?: () => void;
|
|
94
|
+
class?: string;
|
|
95
|
+
}): solid_js.JSX.Element;
|
|
96
|
+
|
|
97
|
+
export { AdapterCard, AdapterConfigForm, type AdapterContextValue, AdapterDetailPage, AdapterList, AdapterProvider, type AdapterProviderProps, type AdapterSet, AdapterStatusBadge, AdaptersPage, createAdapterStatus, createAdapterStatuses, createAdapters, createAdmin, createAi, createAuth, createDb, createIsAdapterReady, createPayments, createStorage, useAdapterContext };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { DbAdapter, AuthAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter, AdapterDomain, AdapterStatusInfo, AdapterStatusType, DomainAdapterConfig } from '@geenius/adapters-shared';
|
|
2
|
+
export { ADAPTER_DOMAINS, AdapterConfig, AdapterDomain, AdapterStatusInfo, AdapterStatusType, AdminAdapter, AiAdapter, AuthAdapter, DOMAIN_DESCRIPTIONS, DOMAIN_ICONS, DOMAIN_LABELS, DbAdapter, FileStorageAdapter, OAuthProvider, PaymentsAdapter, configureAdapters, getAdapterConfig } from '@geenius/adapters-shared';
|
|
3
|
+
import * as solid_js from 'solid-js';
|
|
4
|
+
import { JSX } from 'solid-js';
|
|
5
|
+
|
|
6
|
+
interface AdapterSet {
|
|
7
|
+
db?: DbAdapter;
|
|
8
|
+
auth?: AuthAdapter;
|
|
9
|
+
payments?: PaymentsAdapter;
|
|
10
|
+
ai?: AiAdapter;
|
|
11
|
+
storage?: FileStorageAdapter;
|
|
12
|
+
admin?: AdminAdapter;
|
|
13
|
+
}
|
|
14
|
+
interface AdapterContextValue {
|
|
15
|
+
adapters: AdapterSet;
|
|
16
|
+
statuses: Record<AdapterDomain, AdapterStatusInfo>;
|
|
17
|
+
getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>;
|
|
18
|
+
isReady: (domain: AdapterDomain) => boolean;
|
|
19
|
+
isLoading: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface AdapterProviderProps {
|
|
22
|
+
adapters: AdapterSet;
|
|
23
|
+
children: JSX.Element;
|
|
24
|
+
}
|
|
25
|
+
declare function AdapterProvider(props: AdapterProviderProps): JSX.Element;
|
|
26
|
+
declare function useAdapterContext(): AdapterContextValue;
|
|
27
|
+
|
|
28
|
+
/** Access the database adapter */
|
|
29
|
+
declare function createDb(): DbAdapter;
|
|
30
|
+
/** Access the auth adapter */
|
|
31
|
+
declare function createAuth(): AuthAdapter;
|
|
32
|
+
/** Access the payments adapter */
|
|
33
|
+
declare function createPayments(): PaymentsAdapter;
|
|
34
|
+
/** Access the AI adapter */
|
|
35
|
+
declare function createAi(): AiAdapter;
|
|
36
|
+
/** Access the file storage adapter */
|
|
37
|
+
declare function createStorage(): FileStorageAdapter;
|
|
38
|
+
/** Access the admin adapter */
|
|
39
|
+
declare function createAdmin(): AdminAdapter;
|
|
40
|
+
/** Access all adapter statuses */
|
|
41
|
+
declare function createAdapterStatuses(): Record<AdapterDomain, AdapterStatusInfo>;
|
|
42
|
+
/** Access status for a specific domain */
|
|
43
|
+
declare function createAdapterStatus(domain: AdapterDomain): solid_js.Accessor<AdapterStatusInfo>;
|
|
44
|
+
/** Check if adapter is ready */
|
|
45
|
+
declare function createIsAdapterReady(domain: AdapterDomain): solid_js.Accessor<boolean>;
|
|
46
|
+
/** Access full adapters object */
|
|
47
|
+
declare function createAdapters(): {
|
|
48
|
+
db: DbAdapter | undefined;
|
|
49
|
+
auth: AuthAdapter | undefined;
|
|
50
|
+
payments: PaymentsAdapter | undefined;
|
|
51
|
+
ai: AiAdapter | undefined;
|
|
52
|
+
storage: FileStorageAdapter | undefined;
|
|
53
|
+
admin: AdminAdapter | undefined;
|
|
54
|
+
statuses: Record<AdapterDomain, AdapterStatusInfo>;
|
|
55
|
+
isLoading: boolean;
|
|
56
|
+
isReady: (domain: AdapterDomain) => boolean;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
declare function AdapterStatusBadge(props: {
|
|
60
|
+
status: AdapterStatusType;
|
|
61
|
+
showLabel?: boolean;
|
|
62
|
+
class?: string;
|
|
63
|
+
}): solid_js.JSX.Element;
|
|
64
|
+
|
|
65
|
+
declare function AdapterCard(props: {
|
|
66
|
+
domain: AdapterDomain;
|
|
67
|
+
status: AdapterStatusInfo;
|
|
68
|
+
onClick?: () => void;
|
|
69
|
+
class?: string;
|
|
70
|
+
}): solid_js.JSX.Element;
|
|
71
|
+
|
|
72
|
+
declare function AdapterList(props: {
|
|
73
|
+
onSelect?: (d: AdapterDomain) => void;
|
|
74
|
+
filterStatus?: AdapterStatusType;
|
|
75
|
+
class?: string;
|
|
76
|
+
}): solid_js.JSX.Element;
|
|
77
|
+
|
|
78
|
+
declare function AdapterConfigForm(props: {
|
|
79
|
+
domain: AdapterDomain;
|
|
80
|
+
initialConfig?: DomainAdapterConfig;
|
|
81
|
+
onSave: (c: DomainAdapterConfig) => Promise<void> | void;
|
|
82
|
+
onCancel?: () => void;
|
|
83
|
+
class?: string;
|
|
84
|
+
}): solid_js.JSX.Element;
|
|
85
|
+
|
|
86
|
+
declare function AdaptersPage(props: {
|
|
87
|
+
onNavigateDetail?: (d: AdapterDomain) => void;
|
|
88
|
+
class?: string;
|
|
89
|
+
}): solid_js.JSX.Element;
|
|
90
|
+
|
|
91
|
+
declare function AdapterDetailPage(props: {
|
|
92
|
+
domain: AdapterDomain;
|
|
93
|
+
onBack?: () => void;
|
|
94
|
+
class?: string;
|
|
95
|
+
}): solid_js.JSX.Element;
|
|
96
|
+
|
|
97
|
+
export { AdapterCard, AdapterConfigForm, type AdapterContextValue, AdapterDetailPage, AdapterList, AdapterProvider, type AdapterProviderProps, type AdapterSet, AdapterStatusBadge, AdaptersPage, createAdapterStatus, createAdapterStatuses, createAdapters, createAdmin, createAi, createAuth, createDb, createIsAdapterReady, createPayments, createStorage, useAdapterContext };
|