@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/index.tsx","../src/provider/AdapterProvider.tsx","../src/primitives/index.ts","../src/components/AdapterStatusBadge.tsx","../src/components/AdapterCard.tsx","../src/components/AdapterList.tsx","../src/components/AdapterConfigForm.tsx","../src/pages/AdaptersPage.tsx","../src/pages/AdapterDetailPage.tsx"],"sourcesContent":["// @geenius/adapters-solidjs — Barrel export\n\nexport type {\n AuthAdapter, OAuthProvider, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter,\n AdminAdapter, AdapterDomain, AdapterConfig, AdapterStatusType, AdapterStatusInfo,\n} from '@geenius/adapters-shared'\n\nexport { ADAPTER_DOMAINS, DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS, configureAdapters, getAdapterConfig } from '@geenius/adapters-shared'\n\nexport { AdapterProvider, useAdapterContext } from './provider'\nexport type { AdapterProviderProps, AdapterSet, AdapterContextValue } from './provider'\n\nexport { createDb, createAuth, createPayments, createAi, createStorage, createAdmin, createAdapters, createAdapterStatuses, createAdapterStatus, createIsAdapterReady } from './primitives'\n\nexport { AdapterStatusBadge, AdapterCard, AdapterList, AdapterConfigForm } from './components'\n\nexport { AdaptersPage, AdapterDetailPage } from './pages'\n","// @geenius/adapters-solidjs — AdapterProvider\n\nimport { createContext, useContext } from 'solid-js'\nimport { createStore } from 'solid-js/store'\nimport type { JSX } from 'solid-js'\nimport type {\n AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter,\n AdapterDomain, AdapterStatusInfo,\n} from '@geenius/adapters-shared'\nimport { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius/adapters-shared'\n\nexport interface AdapterSet {\n db?: DbAdapter\n auth?: AuthAdapter\n payments?: PaymentsAdapter\n ai?: AiAdapter\n storage?: FileStorageAdapter\n admin?: AdminAdapter\n}\n\nexport interface AdapterContextValue {\n adapters: AdapterSet\n statuses: Record<AdapterDomain, AdapterStatusInfo>\n getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>\n isReady: (domain: AdapterDomain) => boolean\n isLoading: boolean\n}\n\nconst AdapterContext = createContext<AdapterContextValue>()\n\nexport interface AdapterProviderProps {\n adapters: AdapterSet\n children: JSX.Element\n}\n\nexport function AdapterProvider(props: AdapterProviderProps) {\n const initStatuses = {} as Record<AdapterDomain, AdapterStatusInfo>\n for (const d of ADAPTER_DOMAINS) {\n const adapter = props.adapters[d as keyof AdapterSet]\n initStatuses[d] = { domain: d, provider: adapter ? 'configured' : 'none', status: adapter ? 'connected' : 'disconnected', lastCheckedAt: Date.now() }\n }\n\n const [statuses] = createStore(initStatuses)\n\n const getAdapter = <K extends keyof AdapterSet>(domain: K): NonNullable<AdapterSet[K]> => {\n const adapter = props.adapters[domain]\n if (!adapter) throw new Error(`${DOMAIN_LABELS[domain as AdapterDomain] ?? domain} adapter not configured`)\n return adapter as NonNullable<AdapterSet[K]>\n }\n\n const isReady = (domain: AdapterDomain) => !!props.adapters[domain as keyof AdapterSet] && statuses[domain]?.status === 'connected'\n\n const value: AdapterContextValue = { adapters: props.adapters, statuses, getAdapter, isReady, isLoading: false }\n\n return <AdapterContext.Provider value={value}>{props.children}</AdapterContext.Provider>\n}\n\nexport function useAdapterContext(): AdapterContextValue {\n const ctx = useContext(AdapterContext)\n if (!ctx) throw new Error('useAdapterContext must be used within <AdapterProvider>')\n return ctx\n}\n","// @geenius/adapters-solidjs — Primitives\n\nimport { createMemo } from 'solid-js'\nimport { useAdapterContext } from '../provider/AdapterProvider'\nimport type {\n AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter,\n AdapterDomain, AdapterStatusInfo,\n} from '@geenius/adapters-shared'\n\n/** Access the database adapter */\nexport function createDb() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('db')\n}\n\n/** Access the auth adapter */\nexport function createAuth() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('auth')\n}\n\n/** Access the payments adapter */\nexport function createPayments() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('payments')\n}\n\n/** Access the AI adapter */\nexport function createAi() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('ai')\n}\n\n/** Access the file storage adapter */\nexport function createStorage() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('storage')\n}\n\n/** Access the admin adapter */\nexport function createAdmin() {\n const ctx = useAdapterContext()\n return ctx.getAdapter('admin')\n}\n\n/** Access all adapter statuses */\nexport function createAdapterStatuses() {\n const ctx = useAdapterContext()\n return ctx.statuses\n}\n\n/** Access status for a specific domain */\nexport function createAdapterStatus(domain: AdapterDomain) {\n const ctx = useAdapterContext()\n return createMemo(() => ctx.statuses[domain])\n}\n\n/** Check if adapter is ready */\nexport function createIsAdapterReady(domain: AdapterDomain) {\n const ctx = useAdapterContext()\n return createMemo(() => ctx.isReady(domain))\n}\n\n/** Access full adapters object */\nexport function createAdapters() {\n const ctx = useAdapterContext()\n return {\n db: ctx.adapters.db,\n auth: ctx.adapters.auth,\n payments: ctx.adapters.payments,\n ai: ctx.adapters.ai,\n storage: ctx.adapters.storage,\n admin: ctx.adapters.admin,\n statuses: ctx.statuses,\n isLoading: ctx.isLoading,\n isReady: ctx.isReady,\n }\n}\n","// @geenius/adapters-solidjs — AdapterStatusBadge\nimport type { AdapterStatusType } from '@geenius/adapters-shared'\n\nconst LABELS: Record<AdapterStatusType, string> = { connected: 'Connected', disconnected: 'Disconnected', error: 'Error', initializing: 'Initializing' }\nconst STYLES: Record<AdapterStatusType, { bg: string; text: string; dot: string }> = {\n connected: { bg: 'bg-emerald-500/10', text: 'text-emerald-400', dot: 'bg-emerald-400' },\n disconnected: { bg: 'bg-white/5', text: 'text-white/40', dot: 'bg-white/30' },\n error: { bg: 'bg-red-500/10', text: 'text-red-400', dot: 'bg-red-400' },\n initializing: { bg: 'bg-amber-500/10', text: 'text-amber-400', dot: 'bg-amber-400' },\n}\n\nexport function AdapterStatusBadge(props: { status: AdapterStatusType; showLabel?: boolean; class?: string }) {\n const s = () => STYLES[props.status]\n return (\n <span class={`inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 ${s().bg} ${props.class ?? ''}`}>\n <span class={`h-1.5 w-1.5 rounded-full ${s().dot} ${props.status === 'initializing' ? 'animate-pulse' : ''}`} />\n {props.showLabel !== false && <span class={`text-[0.625rem] font-semibold uppercase tracking-wider ${s().text}`}>{LABELS[props.status]}</span>}\n </span>\n )\n}\n","// @geenius/adapters-solidjs — AdapterCard\nimport { Show } from 'solid-js'\nimport type { AdapterDomain, AdapterStatusInfo } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS } from '@geenius/adapters-shared'\nimport { AdapterStatusBadge } from './AdapterStatusBadge'\n\nexport function AdapterCard(props: { domain: AdapterDomain; status: AdapterStatusInfo; onClick?: () => void; class?: string }) {\n return (\n <button type=\"button\" onClick={props.onClick} class={`group flex w-full items-start gap-4 rounded-2xl border border-white/10 bg-white/[0.03] p-5 text-left backdrop-blur-sm transition-all hover:border-white/15 hover:bg-white/[0.05] ${props.class ?? ''}`}>\n <div class=\"flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-xl bg-white/5 text-2xl transition-transform group-hover:scale-105\">{DOMAIN_ICONS[props.domain]}</div>\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex items-center justify-between gap-2\"><h3 class=\"truncate text-sm font-bold text-white/90\">{DOMAIN_LABELS[props.domain]}</h3><AdapterStatusBadge status={props.status.status} /></div>\n <p class=\"mt-0.5 text-xs text-white/40 line-clamp-2\">{DOMAIN_DESCRIPTIONS[props.domain]}</p>\n <Show when={props.status.provider && props.status.provider !== 'none'}>\n <div class=\"mt-2 flex items-center gap-2\">\n <span class=\"rounded-md bg-white/5 px-2 py-0.5 text-[0.625rem] font-semibold text-white/50\">{props.status.provider}</span>\n <Show when={props.status.latency}><span class=\"text-[0.625rem] text-white/30\">{props.status.latency}ms</span></Show>\n </div>\n </Show>\n <Show when={props.status.error}><p class=\"mt-1.5 truncate text-[0.625rem] text-red-400/80\">{props.status.error}</p></Show>\n </div>\n </button>\n )\n}\n","// @geenius/adapters-solidjs — AdapterList\nimport { createSignal, createMemo, Show, For } from 'solid-js'\nimport { createAdapters } from '../primitives'\nimport { AdapterCard } from './AdapterCard'\nimport { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius/adapters-shared'\nimport type { AdapterDomain, AdapterStatusType } from '@geenius/adapters-shared'\n\nexport function AdapterList(props: { onSelect?: (d: AdapterDomain) => void; filterStatus?: AdapterStatusType; class?: string }) {\n const ctx = createAdapters()\n const [search, setSearch] = createSignal('')\n\n const filtered = createMemo(() => {\n let domains = [...ADAPTER_DOMAINS]\n const q = search().toLowerCase()\n if (q) domains = domains.filter(d => DOMAIN_LABELS[d].toLowerCase().includes(q) || d.includes(q))\n if (props.filterStatus) domains = domains.filter(d => ctx.statuses[d]?.status === props.filterStatus)\n return domains\n })\n\n return (\n <div class={props.class ?? ''}>\n <input type=\"text\" value={search()} onInput={e => setSearch(e.currentTarget.value)} placeholder=\"Search adapters...\" class=\"w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-2.5 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none mb-4\" />\n <Show when={filtered().length > 0} fallback={<div class=\"rounded-xl border border-white/5 bg-white/[0.01] p-8 text-center\"><p class=\"text-sm text-white/40\">No adapters match</p></div>}>\n <div class=\"grid gap-3 sm:grid-cols-2\"><For each={filtered()}>{d => <AdapterCard domain={d} status={ctx.statuses[d]} onClick={() => props.onSelect?.(d)} />}</For></div>\n </Show>\n </div>\n )\n}\n","// @geenius/adapters-solidjs — AdapterConfigForm\nimport { createSignal, For, Show } from 'solid-js'\nimport type { AdapterDomain, DomainAdapterConfig } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, getProvidersForDomain } from '@geenius/adapters-shared'\n\nexport function AdapterConfigForm(props: { domain: AdapterDomain; initialConfig?: DomainAdapterConfig; onSave: (c: DomainAdapterConfig) => Promise<void> | void; onCancel?: () => void; class?: string }) {\n const providers = getProvidersForDomain(props.domain)\n const [provider, setProvider] = createSignal(props.initialConfig?.provider ?? providers[0]?.id ?? '')\n const [apiKey, setApiKey] = createSignal(props.initialConfig?.apiKey ?? '')\n const [baseUrl, setBaseUrl] = createSignal(props.initialConfig?.baseUrl ?? '')\n const [isSaving, setIsSaving] = createSignal(false)\n const [error, setError] = createSignal<string | null>(null)\n\n const needsApiKey = () => !['localStorage', 'noop'].includes(provider())\n const needsBaseUrl = () => ['ollama', 'minio', 'neon', 'supabase'].includes(provider())\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault(); setError(null)\n if (!provider()) { setError('Select a provider'); return }\n setIsSaving(true)\n try { await props.onSave({ provider: provider(), apiKey: apiKey() || undefined, baseUrl: baseUrl() || undefined }) }\n catch (e) { setError(e instanceof Error ? e.message : 'Failed') }\n finally { setIsSaving(false) }\n }\n\n return (\n <form onSubmit={handleSubmit} class={`space-y-5 rounded-2xl border border-white/10 bg-white/[0.03] p-6 backdrop-blur-sm ${props.class ?? ''}`}>\n <div><h3 class=\"text-lg font-bold text-white/90\">Configure {DOMAIN_LABELS[props.domain]}</h3></div>\n <Show when={error()}><div class=\"rounded-lg border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-400\">{error()}</div></Show>\n <div>\n <span class=\"mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40\">Provider</span>\n <div class=\"grid gap-2 sm:grid-cols-2\">\n <For each={providers}>{p => (\n <button type=\"button\" onClick={() => setProvider(p.id)} class={`flex flex-col rounded-xl border p-3 text-left transition-all ${provider() === p.id ? 'border-indigo-500/30 bg-indigo-500/10' : 'border-white/10 bg-white/[0.02] hover:bg-white/[0.04]'}`}>\n <span class=\"text-xs font-semibold text-white/80\">{p.name}</span>\n <span class=\"mt-0.5 text-[0.625rem] text-white/40\">{p.description}</span>\n <span class={`mt-1 self-start rounded px-1.5 py-0.5 text-[0.5625rem] font-bold uppercase ${p.tier === 'pronto' ? 'bg-emerald-500/10 text-emerald-400' : 'bg-purple-500/10 text-purple-400'}`}>{p.tier}</span>\n </button>\n )}</For>\n </div>\n </div>\n <Show when={needsApiKey()}>\n <div><label class=\"mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40\">API Key</label><input type=\"password\" value={apiKey()} onInput={e => setApiKey(e.currentTarget.value)} class=\"w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-3 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none\" placeholder=\"API key\" /></div>\n </Show>\n <Show when={needsBaseUrl()}>\n <div><label class=\"mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40\">Base URL</label><input type=\"url\" value={baseUrl()} onInput={e => setBaseUrl(e.currentTarget.value)} class=\"w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-3 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none\" placeholder=\"https://...\" /></div>\n </Show>\n <div class=\"flex justify-end gap-3 pt-2\">\n <Show when={props.onCancel}><button type=\"button\" onClick={props.onCancel} class=\"rounded-xl px-5 py-2.5 text-sm font-semibold text-white/50 hover:text-white/70\">Cancel</button></Show>\n <button type=\"submit\" disabled={isSaving() || !provider()} class=\"rounded-xl bg-indigo-500 px-6 py-2.5 text-sm font-semibold text-white hover:bg-indigo-400 disabled:opacity-50\">{isSaving() ? 'Saving…' : 'Save'}</button>\n </div>\n </form>\n )\n}\n","// @geenius/adapters-solidjs — AdaptersPage\nimport { createSignal, For } from 'solid-js'\nimport { createAdapters } from '../primitives'\nimport { AdapterList } from '../components/AdapterList'\nimport { AdapterConfigForm } from '../components/AdapterConfigForm'\nimport { AdapterStatusBadge } from '../components/AdapterStatusBadge'\nimport { ADAPTER_DOMAINS, ADAPTER_STATUSES } from '@geenius/adapters-shared'\nimport type { AdapterDomain, AdapterStatusType } from '@geenius/adapters-shared'\n\nexport function AdaptersPage(props: { onNavigateDetail?: (d: AdapterDomain) => void; class?: string }) {\n const ctx = createAdapters()\n const [selectedDomain, setSelectedDomain] = createSignal<AdapterDomain | null>(null)\n const [filterStatus, setFilterStatus] = createSignal<AdapterStatusType | undefined>()\n const connected = () => ADAPTER_DOMAINS.filter(d => ctx.statuses[d]?.status === 'connected').length\n const errors = () => ADAPTER_DOMAINS.filter(d => ctx.statuses[d]?.status === 'error').length\n\n return (\n <div class={`max-w-4xl mx-auto space-y-8 ${props.class ?? ''}`}>\n <div><h1 class=\"text-2xl font-extrabold text-white/95 tracking-tight\">Adapters</h1><p class=\"mt-1 text-sm text-white/40\">Manage infrastructure adapters.</p></div>\n <div class=\"grid gap-3 sm:grid-cols-3\">\n <div class=\"rounded-2xl border border-white/10 bg-white/[0.03] p-4\"><p class=\"text-xs font-semibold uppercase text-white/30\">Total</p><p class=\"mt-1 text-2xl font-extrabold text-white/90\">{ADAPTER_DOMAINS.length}</p></div>\n <div class=\"rounded-2xl border border-emerald-500/10 bg-emerald-500/[0.03] p-4\"><p class=\"text-xs font-semibold uppercase text-emerald-400/60\">Connected</p><p class=\"mt-1 text-2xl font-extrabold text-emerald-400\">{connected()}</p></div>\n {errors() > 0 && <div class=\"rounded-2xl border border-red-500/10 bg-red-500/[0.03] p-4\"><p class=\"text-xs font-semibold uppercase text-red-400/60\">Errors</p><p class=\"mt-1 text-2xl font-extrabold text-red-400\">{errors()}</p></div>}\n </div>\n <div class=\"flex items-center gap-2\">\n <button onClick={() => setFilterStatus(undefined)} class={`rounded-lg px-3 py-1.5 text-xs font-semibold ${!filterStatus() ? 'bg-white/10 text-white/80' : 'text-white/30'}`}>All</button>\n <For each={[...ADAPTER_STATUSES]}>{s => <button onClick={() => setFilterStatus(s)} class={`flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-xs font-semibold ${filterStatus() === s ? 'bg-white/10 text-white/80' : 'text-white/30'}`}><AdapterStatusBadge status={s} showLabel={false} />{s}</button>}</For>\n </div>\n <AdapterList onSelect={d => props.onNavigateDetail ? props.onNavigateDetail(d) : setSelectedDomain(d)} filterStatus={filterStatus()} />\n {selectedDomain() && (\n <div class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\" onClick={() => setSelectedDomain(null)}>\n <div class=\"max-w-lg w-full mx-4\" onClick={e => e.stopPropagation()}>\n <AdapterConfigForm domain={selectedDomain()!} onSave={async () => { setSelectedDomain(null) }} onCancel={() => setSelectedDomain(null)} />\n </div>\n </div>\n )}\n </div>\n )\n}\n","// @geenius/adapters-solidjs — AdapterDetailPage\nimport { createSignal, Show, For } from 'solid-js'\nimport { createAdapters, createAdapterStatus } from '../primitives'\nimport { AdapterStatusBadge } from '../components/AdapterStatusBadge'\nimport { AdapterConfigForm } from '../components/AdapterConfigForm'\nimport type { AdapterDomain } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS, getProvidersForDomain } from '@geenius/adapters-shared'\n\nexport function AdapterDetailPage(props: { domain: AdapterDomain; onBack?: () => void; class?: string }) {\n const status = createAdapterStatus(props.domain)\n const providers = getProvidersForDomain(props.domain)\n const [isEditing, setIsEditing] = createSignal(false)\n\n return (\n <div class={`max-w-3xl mx-auto space-y-8 ${props.class ?? ''}`}>\n <Show when={props.onBack}><button onClick={props.onBack} class=\"text-sm text-white/30 hover:text-white/60\">← Back</button></Show>\n <div class=\"flex items-start gap-5\">\n <div class=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-white/5 text-3xl\">{DOMAIN_ICONS[props.domain]}</div>\n <div class=\"flex-1\"><div class=\"flex items-center gap-3\"><h1 class=\"text-2xl font-extrabold text-white/95\">{DOMAIN_LABELS[props.domain]}</h1><AdapterStatusBadge status={status().status} /></div><p class=\"mt-1 text-sm text-white/40\">{DOMAIN_DESCRIPTIONS[props.domain]}</p></div>\n </div>\n <div class=\"rounded-2xl border border-white/10 bg-white/[0.03] p-6\">\n <h2 class=\"text-xs font-semibold uppercase text-white/30 mb-4\">Status</h2>\n <div class=\"grid gap-4 sm:grid-cols-3\">\n <div><p class=\"text-[0.625rem] text-white/30 uppercase\">Provider</p><p class=\"mt-0.5 text-sm font-semibold text-white/80\">{status().provider !== 'none' ? status().provider : '—'}</p></div>\n <div><p class=\"text-[0.625rem] text-white/30 uppercase\">Status</p><AdapterStatusBadge status={status().status} /></div>\n <div><p class=\"text-[0.625rem] text-white/30 uppercase\">Last Checked</p><p class=\"mt-0.5 text-sm text-white/60\">{status().lastCheckedAt ? new Date(status().lastCheckedAt!).toLocaleTimeString() : '—'}</p></div>\n </div>\n </div>\n <div class=\"rounded-2xl border border-white/10 bg-white/[0.03] p-6\">\n <h2 class=\"text-xs font-semibold uppercase text-white/30 mb-4\">Available Providers ({providers.length})</h2>\n <div class=\"divide-y divide-white/5\"><For each={providers}>{p => <div class=\"flex items-center justify-between py-3\"><div><p class=\"text-sm font-semibold text-white/80\">{p.name}</p><p class=\"text-xs text-white/30\">{p.description}</p></div><span class={`rounded px-2 py-0.5 text-[0.625rem] font-bold uppercase ${p.tier === 'pronto' ? 'bg-emerald-500/10 text-emerald-400' : 'bg-blue-500/10 text-blue-400'}`}>{p.tier}</span></div>}</For></div>\n </div>\n <Show when={isEditing()} fallback={<button onClick={() => setIsEditing(true)} class=\"w-full rounded-2xl border border-dashed border-white/10 bg-white/[0.01] p-6 text-center text-sm text-white/30 hover:border-white/20\">⚙️ Configure</button>}>\n <AdapterConfigForm domain={props.domain} onSave={async () => { setIsEditing(false) }} onCancel={() => setIsEditing(false)} />\n </Show>\n </div>\n )\n}\n"],"mappings":"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","names":["ADAPTER_DOMAINS","DOMAIN_LABELS","DOMAIN_ICONS","DOMAIN_DESCRIPTIONS","DOMAIN_LABELS","DOMAIN_LABELS","createMemo","Show","ADAPTER_DOMAINS","DOMAIN_LABELS","createMemo","Show","createSignal","For","Show","DOMAIN_LABELS","e","createSignal","For","ADAPTER_DOMAINS","createSignal","For","createSignal","Show","For","DOMAIN_LABELS","DOMAIN_ICONS","DOMAIN_DESCRIPTIONS","getProvidersForDomain","createSignal","Show","For"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/adapters-solidjs-css\n\n> Geenius Adapters — SolidJS providers and accessors (vanilla CSS variant)\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-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/adapters-solidjs-css';\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,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.tsx
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
ADAPTER_DOMAINS: () => import_adapters_shared7.ADAPTER_DOMAINS,
|
|
25
|
+
AdapterCard: () => AdapterCard,
|
|
26
|
+
AdapterConfigForm: () => AdapterConfigForm,
|
|
27
|
+
AdapterDetailPage: () => AdapterDetailPage,
|
|
28
|
+
AdapterList: () => AdapterList,
|
|
29
|
+
AdapterProvider: () => AdapterProvider,
|
|
30
|
+
AdapterStatusBadge: () => AdapterStatusBadge,
|
|
31
|
+
AdaptersPage: () => AdaptersPage,
|
|
32
|
+
DOMAIN_DESCRIPTIONS: () => import_adapters_shared7.DOMAIN_DESCRIPTIONS,
|
|
33
|
+
DOMAIN_ICONS: () => import_adapters_shared7.DOMAIN_ICONS,
|
|
34
|
+
DOMAIN_LABELS: () => import_adapters_shared7.DOMAIN_LABELS,
|
|
35
|
+
configureAdapters: () => import_adapters_shared7.configureAdapters,
|
|
36
|
+
createAdapterStatus: () => primitives_exports.createAdapterStatus,
|
|
37
|
+
createAdapterStatuses: () => primitives_exports.createAdapterStatuses,
|
|
38
|
+
createAdapters: () => primitives_exports.createAdapters,
|
|
39
|
+
createAdmin: () => primitives_exports.createAdmin,
|
|
40
|
+
createAi: () => primitives_exports.createAi,
|
|
41
|
+
createAuth: () => primitives_exports.createAuth,
|
|
42
|
+
createDb: () => primitives_exports.createDb,
|
|
43
|
+
createIsAdapterReady: () => primitives_exports.createIsAdapterReady,
|
|
44
|
+
createPayments: () => primitives_exports.createPayments,
|
|
45
|
+
createStorage: () => primitives_exports.createStorage,
|
|
46
|
+
getAdapterConfig: () => import_adapters_shared7.getAdapterConfig,
|
|
47
|
+
useAdapterContext: () => useAdapterContext
|
|
48
|
+
});
|
|
49
|
+
module.exports = __toCommonJS(index_exports);
|
|
50
|
+
var import_adapters_shared7 = require("@geenius/adapters-shared");
|
|
51
|
+
|
|
52
|
+
// src/provider/AdapterProvider.tsx
|
|
53
|
+
var import_solid_js = require("solid-js");
|
|
54
|
+
var import_store = require("solid-js/store");
|
|
55
|
+
var import_adapters_shared = require("@geenius/adapters-shared");
|
|
56
|
+
var AdapterContext = (0, import_solid_js.createContext)();
|
|
57
|
+
function AdapterProvider(props) {
|
|
58
|
+
const init = {};
|
|
59
|
+
for (const d of import_adapters_shared.ADAPTER_DOMAINS) {
|
|
60
|
+
const a = props.adapters[d];
|
|
61
|
+
init[d] = { domain: d, provider: a ? "configured" : "none", status: a ? "connected" : "disconnected", lastCheckedAt: Date.now() };
|
|
62
|
+
}
|
|
63
|
+
const [statuses] = (0, import_store.createStore)(init);
|
|
64
|
+
const getAdapter = (domain) => {
|
|
65
|
+
const adapter = props.adapters[domain];
|
|
66
|
+
if (!adapter) throw new Error(`${import_adapters_shared.DOMAIN_LABELS[domain] ?? domain} adapter not configured`);
|
|
67
|
+
return adapter;
|
|
68
|
+
};
|
|
69
|
+
const isReady = (domain) => !!props.adapters[domain] && statuses[domain]?.status === "connected";
|
|
70
|
+
const value = { adapters: props.adapters, statuses, getAdapter, isReady, isLoading: false };
|
|
71
|
+
return /* @__PURE__ */ React.createElement(AdapterContext.Provider, { value }, props.children);
|
|
72
|
+
}
|
|
73
|
+
function useAdapterContext() {
|
|
74
|
+
const ctx = (0, import_solid_js.useContext)(AdapterContext);
|
|
75
|
+
if (!ctx) throw new Error("useAdapterContext must be used within <AdapterProvider>");
|
|
76
|
+
return ctx;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/primitives/index.ts
|
|
80
|
+
var primitives_exports = {};
|
|
81
|
+
__reExport(primitives_exports, require("@geenius/adapters-solidjs"));
|
|
82
|
+
|
|
83
|
+
// src/components/AdapterStatusBadge.tsx
|
|
84
|
+
var LABELS = {
|
|
85
|
+
connected: "Connected",
|
|
86
|
+
disconnected: "Disconnected",
|
|
87
|
+
error: "Error",
|
|
88
|
+
initializing: "Initializing"
|
|
89
|
+
};
|
|
90
|
+
function AdapterStatusBadge(props) {
|
|
91
|
+
return /* @__PURE__ */ React.createElement("span", { class: `adapter-badge adapter-badge--${props.status}` }, /* @__PURE__ */ React.createElement("span", { class: "adapter-badge__dot" }), props.showLabel !== false && /* @__PURE__ */ React.createElement("span", null, LABELS[props.status]));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/components/AdapterCard.tsx
|
|
95
|
+
var import_solid_js2 = require("solid-js");
|
|
96
|
+
var import_adapters_shared2 = require("@geenius/adapters-shared");
|
|
97
|
+
function AdapterCard(props) {
|
|
98
|
+
return /* @__PURE__ */ React.createElement(
|
|
99
|
+
"button",
|
|
100
|
+
{
|
|
101
|
+
type: "button",
|
|
102
|
+
onClick: () => props.onClick?.(),
|
|
103
|
+
class: "adapter-card",
|
|
104
|
+
"aria-label": `${import_adapters_shared2.DOMAIN_LABELS[props.domain]} adapter \u2014 ${props.status.status}`
|
|
105
|
+
},
|
|
106
|
+
/* @__PURE__ */ React.createElement("div", { class: "adapter-card__icon" }, import_adapters_shared2.DOMAIN_ICONS[props.domain]),
|
|
107
|
+
/* @__PURE__ */ React.createElement("div", { class: "adapter-card__body" }, /* @__PURE__ */ React.createElement("div", { class: "adapter-card__header" }, /* @__PURE__ */ React.createElement("h3", { class: "adapter-card__name" }, import_adapters_shared2.DOMAIN_LABELS[props.domain]), /* @__PURE__ */ React.createElement(AdapterStatusBadge, { status: props.status.status })), /* @__PURE__ */ React.createElement("p", { class: "adapter-card__desc" }, import_adapters_shared2.DOMAIN_DESCRIPTIONS[props.domain]), /* @__PURE__ */ React.createElement(import_solid_js2.Show, { when: props.status.provider && props.status.provider !== "none" }, /* @__PURE__ */ React.createElement("div", { class: "adapter-card__meta" }, /* @__PURE__ */ React.createElement("span", { class: "adapter-card__provider" }, props.status.provider), /* @__PURE__ */ React.createElement(import_solid_js2.Show, { when: props.status.latency }, /* @__PURE__ */ React.createElement("span", { class: "adapter-card__latency" }, props.status.latency, "ms")))), /* @__PURE__ */ React.createElement(import_solid_js2.Show, { when: props.status.error }, /* @__PURE__ */ React.createElement("p", { class: "adapter-card__error" }, props.status.error)))
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/components/AdapterList.tsx
|
|
112
|
+
var import_solid_js3 = require("solid-js");
|
|
113
|
+
var import_adapters_shared3 = require("@geenius/adapters-shared");
|
|
114
|
+
function AdapterList(props) {
|
|
115
|
+
const ctx = (0, primitives_exports.createAdapters)();
|
|
116
|
+
const [search, setSearch] = (0, import_solid_js3.createSignal)("");
|
|
117
|
+
const filtered = (0, import_solid_js3.createMemo)(() => {
|
|
118
|
+
let domains = [...import_adapters_shared3.ADAPTER_DOMAINS];
|
|
119
|
+
const q = search().toLowerCase();
|
|
120
|
+
if (q) {
|
|
121
|
+
domains = domains.filter((d) => {
|
|
122
|
+
return import_adapters_shared3.DOMAIN_LABELS[d].toLowerCase().includes(q) || d.includes(q) || (ctx.statuses[d]?.provider?.toLowerCase().includes(q) ?? false);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (props.filterStatus) {
|
|
126
|
+
domains = domains.filter((d) => ctx.statuses[d]?.status === props.filterStatus);
|
|
127
|
+
}
|
|
128
|
+
return domains;
|
|
129
|
+
});
|
|
130
|
+
return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
|
|
131
|
+
"input",
|
|
132
|
+
{
|
|
133
|
+
type: "text",
|
|
134
|
+
value: search(),
|
|
135
|
+
onInput: (e) => setSearch(e.currentTarget.value),
|
|
136
|
+
placeholder: "Search adapters...",
|
|
137
|
+
class: "adapter-search",
|
|
138
|
+
"aria-label": "Search adapters"
|
|
139
|
+
}
|
|
140
|
+
), /* @__PURE__ */ React.createElement(
|
|
141
|
+
import_solid_js3.Show,
|
|
142
|
+
{
|
|
143
|
+
when: filtered().length > 0,
|
|
144
|
+
fallback: /* @__PURE__ */ React.createElement("div", { class: "adapter-empty" }, /* @__PURE__ */ React.createElement("p", { class: "adapter-empty__text" }, search() ? "No adapters match your search" : "No adapters configured"))
|
|
145
|
+
},
|
|
146
|
+
/* @__PURE__ */ React.createElement("div", { class: "adapter-grid", role: "list", "aria-label": "Adapter list" }, /* @__PURE__ */ React.createElement(import_solid_js3.For, { each: filtered() }, (domain) => /* @__PURE__ */ React.createElement(
|
|
147
|
+
AdapterCard,
|
|
148
|
+
{
|
|
149
|
+
domain,
|
|
150
|
+
status: ctx.statuses[domain],
|
|
151
|
+
onClick: () => props.onSelect?.(domain)
|
|
152
|
+
}
|
|
153
|
+
)))
|
|
154
|
+
));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/components/AdapterConfigForm.tsx
|
|
158
|
+
var import_solid_js4 = require("solid-js");
|
|
159
|
+
var import_adapters_shared4 = require("@geenius/adapters-shared");
|
|
160
|
+
function AdapterConfigForm(props) {
|
|
161
|
+
const providers = (0, import_adapters_shared4.getProvidersForDomain)(props.domain);
|
|
162
|
+
const [provider, setProvider] = (0, import_solid_js4.createSignal)(props.initialConfig?.provider ?? providers[0]?.id ?? "");
|
|
163
|
+
const [apiKey, setApiKey] = (0, import_solid_js4.createSignal)(props.initialConfig?.apiKey ?? "");
|
|
164
|
+
const [baseUrl, setBaseUrl] = (0, import_solid_js4.createSignal)(props.initialConfig?.baseUrl ?? "");
|
|
165
|
+
const [isSaving, setIsSaving] = (0, import_solid_js4.createSignal)(false);
|
|
166
|
+
const [error, setError] = (0, import_solid_js4.createSignal)(null);
|
|
167
|
+
const needsApiKey = () => !["localStorage", "noop"].includes(provider());
|
|
168
|
+
const needsBaseUrl = () => ["ollama", "minio", "neon", "supabase"].includes(provider());
|
|
169
|
+
const handleSubmit = async (e) => {
|
|
170
|
+
e.preventDefault();
|
|
171
|
+
setError(null);
|
|
172
|
+
if (!provider()) {
|
|
173
|
+
setError("Select a provider");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (needsApiKey() && !apiKey().trim()) {
|
|
177
|
+
setError("API key is required");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
setIsSaving(true);
|
|
181
|
+
try {
|
|
182
|
+
await props.onSave({
|
|
183
|
+
provider: provider(),
|
|
184
|
+
apiKey: apiKey() || void 0,
|
|
185
|
+
baseUrl: baseUrl() || void 0
|
|
186
|
+
});
|
|
187
|
+
} catch (err) {
|
|
188
|
+
setError(err instanceof Error ? err.message : "Failed to save");
|
|
189
|
+
} finally {
|
|
190
|
+
setIsSaving(false);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
return /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit, class: "adapter-form", noValidate: true }, /* @__PURE__ */ React.createElement("h3", { class: "adapter-form__title" }, "Configure ", import_adapters_shared4.DOMAIN_LABELS[props.domain]), /* @__PURE__ */ React.createElement("p", { class: "adapter-form__subtitle" }, "Select and configure your preferred provider."), /* @__PURE__ */ React.createElement(import_solid_js4.Show, { when: error() }, /* @__PURE__ */ React.createElement("div", { class: "adapter-alert adapter-alert--error", role: "alert", style: { "margin-top": "1rem" } }, error())), /* @__PURE__ */ React.createElement("div", { class: "adapter-field" }, /* @__PURE__ */ React.createElement("span", { class: "adapter-field__label" }, "Provider"), /* @__PURE__ */ React.createElement("div", { class: "adapter-provider-grid" }, /* @__PURE__ */ React.createElement(import_solid_js4.For, { each: providers }, (p) => /* @__PURE__ */ React.createElement(
|
|
194
|
+
"button",
|
|
195
|
+
{
|
|
196
|
+
type: "button",
|
|
197
|
+
onClick: () => setProvider(p.id),
|
|
198
|
+
class: `adapter-provider-option ${provider() === p.id ? "adapter-provider-option--selected" : ""}`
|
|
199
|
+
},
|
|
200
|
+
/* @__PURE__ */ React.createElement("span", { class: "adapter-provider-option__name" }, p.name),
|
|
201
|
+
/* @__PURE__ */ React.createElement("span", { class: "adapter-provider-option__desc" }, p.description),
|
|
202
|
+
/* @__PURE__ */ React.createElement("span", { class: `adapter-tier-badge adapter-tier-badge--${p.tier}` }, p.tier)
|
|
203
|
+
)))), /* @__PURE__ */ React.createElement(import_solid_js4.Show, { when: needsApiKey() }, /* @__PURE__ */ React.createElement("div", { class: "adapter-field" }, /* @__PURE__ */ React.createElement("label", { class: "adapter-field__label", for: `adapter-${props.domain}-apiKey` }, "API Key"), /* @__PURE__ */ React.createElement(
|
|
204
|
+
"input",
|
|
205
|
+
{
|
|
206
|
+
id: `adapter-${props.domain}-apiKey`,
|
|
207
|
+
type: "password",
|
|
208
|
+
value: apiKey(),
|
|
209
|
+
onInput: (e) => setApiKey(e.currentTarget.value),
|
|
210
|
+
placeholder: `Enter API key`,
|
|
211
|
+
class: "adapter-field__input",
|
|
212
|
+
autocomplete: "off"
|
|
213
|
+
}
|
|
214
|
+
))), /* @__PURE__ */ React.createElement(import_solid_js4.Show, { when: needsBaseUrl() }, /* @__PURE__ */ React.createElement("div", { class: "adapter-field" }, /* @__PURE__ */ React.createElement("label", { class: "adapter-field__label", for: `adapter-${props.domain}-url` }, "Base URL"), /* @__PURE__ */ React.createElement(
|
|
215
|
+
"input",
|
|
216
|
+
{
|
|
217
|
+
id: `adapter-${props.domain}-url`,
|
|
218
|
+
type: "url",
|
|
219
|
+
value: baseUrl(),
|
|
220
|
+
onInput: (e) => setBaseUrl(e.currentTarget.value),
|
|
221
|
+
placeholder: "https://...",
|
|
222
|
+
class: "adapter-field__input"
|
|
223
|
+
}
|
|
224
|
+
))), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", "justify-content": "flex-end", gap: "0.75rem", "margin-top": "1.5rem" } }, /* @__PURE__ */ React.createElement(import_solid_js4.Show, { when: props.onCancel }, /* @__PURE__ */ React.createElement("button", { type: "button", onClick: () => props.onCancel?.(), class: "adapter-btn adapter-btn--ghost" }, "Cancel")), /* @__PURE__ */ React.createElement(
|
|
225
|
+
"button",
|
|
226
|
+
{
|
|
227
|
+
type: "submit",
|
|
228
|
+
disabled: isSaving() || !provider(),
|
|
229
|
+
class: "adapter-btn adapter-btn--primary"
|
|
230
|
+
},
|
|
231
|
+
isSaving() ? "Saving\u2026" : "Save Configuration"
|
|
232
|
+
)));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// src/pages/AdaptersPage.tsx
|
|
236
|
+
var import_solid_js5 = require("solid-js");
|
|
237
|
+
var import_adapters_shared5 = require("@geenius/adapters-shared");
|
|
238
|
+
function AdaptersPage(props) {
|
|
239
|
+
const ctx = (0, primitives_exports.createAdapters)();
|
|
240
|
+
const [selectedDomain, setSelectedDomain] = (0, import_solid_js5.createSignal)(null);
|
|
241
|
+
const [filterStatus, setFilterStatus] = (0, import_solid_js5.createSignal)();
|
|
242
|
+
const connected = () => import_adapters_shared5.ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === "connected").length;
|
|
243
|
+
const errors = () => import_adapters_shared5.ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === "error").length;
|
|
244
|
+
return /* @__PURE__ */ React.createElement("div", { class: "adapter-page" }, /* @__PURE__ */ React.createElement("div", { class: "adapter-page__header" }, /* @__PURE__ */ React.createElement("h1", { class: "adapter-page__title" }, "Adapters"), /* @__PURE__ */ React.createElement("p", { class: "adapter-page__subtitle" }, "Manage your infrastructure adapters \u2014 database, auth, AI, storage, payments, and admin.")), /* @__PURE__ */ React.createElement("div", { class: "adapter-summary" }, /* @__PURE__ */ React.createElement("div", { class: "adapter-summary__card" }, /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__label" }, "Total"), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__value" }, import_adapters_shared5.ADAPTER_DOMAINS.length), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__desc" }, "adapter domains")), /* @__PURE__ */ React.createElement("div", { class: "adapter-summary__card adapter-summary__card--success" }, /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__label" }, "Connected"), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__value" }, connected()), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__desc" }, "active adapters")), /* @__PURE__ */ React.createElement(import_solid_js5.Show, { when: errors() > 0 }, /* @__PURE__ */ React.createElement("div", { class: "adapter-summary__card adapter-summary__card--error" }, /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__label" }, "Errors"), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__value" }, errors()), /* @__PURE__ */ React.createElement("p", { class: "adapter-summary__desc" }, "need attention")))), /* @__PURE__ */ React.createElement("div", { class: "adapter-filters" }, /* @__PURE__ */ React.createElement(
|
|
245
|
+
"button",
|
|
246
|
+
{
|
|
247
|
+
class: `adapter-filter-btn ${!filterStatus() ? "adapter-filter-btn--active" : ""}`,
|
|
248
|
+
onClick: () => setFilterStatus(void 0)
|
|
249
|
+
},
|
|
250
|
+
"All"
|
|
251
|
+
), /* @__PURE__ */ React.createElement(import_solid_js5.For, { each: [...import_adapters_shared5.ADAPTER_STATUSES] }, (s) => /* @__PURE__ */ React.createElement(
|
|
252
|
+
"button",
|
|
253
|
+
{
|
|
254
|
+
class: `adapter-filter-btn ${filterStatus() === s ? "adapter-filter-btn--active" : ""}`,
|
|
255
|
+
onClick: () => setFilterStatus(s)
|
|
256
|
+
},
|
|
257
|
+
/* @__PURE__ */ React.createElement(AdapterStatusBadge, { status: s, showLabel: false }),
|
|
258
|
+
" ",
|
|
259
|
+
s
|
|
260
|
+
))), /* @__PURE__ */ React.createElement(
|
|
261
|
+
AdapterList,
|
|
262
|
+
{
|
|
263
|
+
onSelect: (domain) => {
|
|
264
|
+
if (props.onNavigateDetail) props.onNavigateDetail(domain);
|
|
265
|
+
else setSelectedDomain(domain);
|
|
266
|
+
},
|
|
267
|
+
filterStatus: filterStatus()
|
|
268
|
+
}
|
|
269
|
+
), /* @__PURE__ */ React.createElement(import_solid_js5.Show, { when: selectedDomain() }, /* @__PURE__ */ React.createElement("div", { class: "adapter-modal-overlay", onClick: () => setSelectedDomain(null) }, /* @__PURE__ */ React.createElement("div", { class: "adapter-modal", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React.createElement(
|
|
270
|
+
AdapterConfigForm,
|
|
271
|
+
{
|
|
272
|
+
domain: selectedDomain(),
|
|
273
|
+
onSave: async () => {
|
|
274
|
+
setSelectedDomain(null);
|
|
275
|
+
},
|
|
276
|
+
onCancel: () => setSelectedDomain(null)
|
|
277
|
+
}
|
|
278
|
+
)))));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// src/pages/AdapterDetailPage.tsx
|
|
282
|
+
var import_solid_js6 = require("solid-js");
|
|
283
|
+
var import_adapters_shared6 = require("@geenius/adapters-shared");
|
|
284
|
+
function AdapterDetailPage(props) {
|
|
285
|
+
const status = (0, primitives_exports.createAdapterStatus)(props.domain);
|
|
286
|
+
const providers = (0, import_adapters_shared6.getProvidersForDomain)(props.domain);
|
|
287
|
+
const [isEditing, setIsEditing] = (0, import_solid_js6.createSignal)(false);
|
|
288
|
+
return /* @__PURE__ */ React.createElement("div", { class: "adapter-page" }, /* @__PURE__ */ React.createElement(import_solid_js6.Show, { when: props.onBack }, /* @__PURE__ */ React.createElement("button", { onClick: () => props.onBack?.(), class: "adapter-btn adapter-btn--ghost adapter-btn--sm", style: { "margin-bottom": "1rem" } }, "\u2190 Back to Adapters")), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", "align-items": "flex-start", gap: "1.25rem", "margin-bottom": "2rem" } }, /* @__PURE__ */ React.createElement("div", { class: "adapter-detail__icon" }, import_adapters_shared6.DOMAIN_ICONS[props.domain]), /* @__PURE__ */ React.createElement("div", { style: { flex: "1" } }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", "align-items": "center", gap: "0.75rem" } }, /* @__PURE__ */ React.createElement("h1", { class: "adapter-page__title" }, import_adapters_shared6.DOMAIN_LABELS[props.domain]), /* @__PURE__ */ React.createElement(AdapterStatusBadge, { status: status().status })), /* @__PURE__ */ React.createElement("p", { class: "adapter-page__subtitle" }, import_adapters_shared6.DOMAIN_DESCRIPTIONS[props.domain]))), /* @__PURE__ */ React.createElement("div", { class: "adapter-summary__card", style: { "margin-bottom": "2rem" } }, /* @__PURE__ */ React.createElement("h2", { class: "adapter-summary__label", style: { "margin-bottom": "1rem" } }, "Current Status"), /* @__PURE__ */ React.createElement("div", { class: "adapter-detail__status-grid" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__label" }, "Provider"), /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__value" }, status().provider !== "none" ? status().provider : "\u2014")), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__label" }, "Status"), /* @__PURE__ */ React.createElement("div", { class: "adapter-detail__value" }, /* @__PURE__ */ React.createElement(AdapterStatusBadge, { status: status().status }))), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__label" }, "Last Checked"), /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__value" }, status().lastCheckedAt ? new Date(status().lastCheckedAt).toLocaleTimeString() : "\u2014"))), /* @__PURE__ */ React.createElement(import_solid_js6.Show, { when: status().error }, /* @__PURE__ */ React.createElement("div", { class: "adapter-alert adapter-alert--error", style: { "margin-top": "1rem" } }, /* @__PURE__ */ React.createElement("strong", null, "Error:"), " ", status().error))), /* @__PURE__ */ React.createElement("div", { class: "adapter-summary__card", style: { "margin-bottom": "2rem" } }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", "justify-content": "space-between", "margin-bottom": "1rem" } }, /* @__PURE__ */ React.createElement("h2", { class: "adapter-summary__label" }, "Available Providers"), /* @__PURE__ */ React.createElement("span", { class: "adapter-summary__desc" }, providers.length, " providers")), /* @__PURE__ */ React.createElement("div", { class: "adapter-provider-list" }, /* @__PURE__ */ React.createElement(import_solid_js6.For, { each: providers }, (p) => /* @__PURE__ */ React.createElement("div", { style: { display: "flex", "align-items": "center", "justify-content": "space-between" } }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__value", style: { "font-size": "0.875rem" } }, p.name), /* @__PURE__ */ React.createElement("p", { class: "adapter-detail__label" }, p.description)), /* @__PURE__ */ React.createElement("span", { class: `adapter-tier-badge adapter-tier-badge--${p.tier}` }, p.tier))))), /* @__PURE__ */ React.createElement(
|
|
289
|
+
import_solid_js6.Show,
|
|
290
|
+
{
|
|
291
|
+
when: isEditing(),
|
|
292
|
+
fallback: /* @__PURE__ */ React.createElement(
|
|
293
|
+
"button",
|
|
294
|
+
{
|
|
295
|
+
onClick: () => setIsEditing(true),
|
|
296
|
+
class: "adapter-card",
|
|
297
|
+
style: { "justify-content": "center", "border-style": "dashed" }
|
|
298
|
+
},
|
|
299
|
+
"\u2699\uFE0F Configure ",
|
|
300
|
+
import_adapters_shared6.DOMAIN_LABELS[props.domain],
|
|
301
|
+
" Adapter"
|
|
302
|
+
)
|
|
303
|
+
},
|
|
304
|
+
/* @__PURE__ */ React.createElement(
|
|
305
|
+
AdapterConfigForm,
|
|
306
|
+
{
|
|
307
|
+
domain: props.domain,
|
|
308
|
+
onSave: async () => {
|
|
309
|
+
setIsEditing(false);
|
|
310
|
+
},
|
|
311
|
+
onCancel: () => setIsEditing(false)
|
|
312
|
+
}
|
|
313
|
+
)
|
|
314
|
+
));
|
|
315
|
+
}
|
|
316
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
317
|
+
0 && (module.exports = {
|
|
318
|
+
ADAPTER_DOMAINS,
|
|
319
|
+
AdapterCard,
|
|
320
|
+
AdapterConfigForm,
|
|
321
|
+
AdapterDetailPage,
|
|
322
|
+
AdapterList,
|
|
323
|
+
AdapterProvider,
|
|
324
|
+
AdapterStatusBadge,
|
|
325
|
+
AdaptersPage,
|
|
326
|
+
DOMAIN_DESCRIPTIONS,
|
|
327
|
+
DOMAIN_ICONS,
|
|
328
|
+
DOMAIN_LABELS,
|
|
329
|
+
configureAdapters,
|
|
330
|
+
createAdapterStatus,
|
|
331
|
+
createAdapterStatuses,
|
|
332
|
+
createAdapters,
|
|
333
|
+
createAdmin,
|
|
334
|
+
createAi,
|
|
335
|
+
createAuth,
|
|
336
|
+
createDb,
|
|
337
|
+
createIsAdapterReady,
|
|
338
|
+
createPayments,
|
|
339
|
+
createStorage,
|
|
340
|
+
getAdapterConfig,
|
|
341
|
+
useAdapterContext
|
|
342
|
+
});
|
|
343
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/provider/AdapterProvider.tsx","../src/primitives/index.ts","../src/components/AdapterStatusBadge.tsx","../src/components/AdapterCard.tsx","../src/components/AdapterList.tsx","../src/components/AdapterConfigForm.tsx","../src/pages/AdaptersPage.tsx","../src/pages/AdapterDetailPage.tsx"],"sourcesContent":["// @geenius/adapters-solidjs-css — Barrel export\n// Vanilla CSS variant: import '@geenius/adapters-solidjs-css/styles.css'\n\nexport type {\n AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter,\n AdminAdapter, AdapterDomain, AdapterConfig, AdapterStatusType, AdapterStatusInfo,\n} from '@geenius/adapters-shared'\n\nexport {\n ADAPTER_DOMAINS, DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS,\n configureAdapters, getAdapterConfig,\n} from '@geenius/adapters-shared'\n\n// Provider\nexport { AdapterProvider, useAdapterContext } from './provider'\nexport type { AdapterProviderProps, AdapterSet, AdapterContextValue } from './provider'\n\n// Primitives\nexport {\n createDb, createAuth, createPayments, createAi, createStorage, createAdmin,\n createAdapters, createAdapterStatuses, createAdapterStatus, createIsAdapterReady,\n} from './primitives'\n\n// Components\nexport { AdapterStatusBadge, AdapterCard, AdapterList, AdapterConfigForm } from './components'\nexport type { AdapterStatusBadgeProps, AdapterCardProps, AdapterListProps, AdapterConfigFormProps } from './components'\n\n// Pages\nexport { AdaptersPage, AdapterDetailPage } from './pages'\nexport type { AdaptersPageProps, AdapterDetailPageProps } from './pages'\n","// @geenius/adapters-solidjs-css — AdapterProvider (SolidJS + vanilla CSS)\n\nimport { createContext, useContext } from 'solid-js'\nimport { createStore } from 'solid-js/store'\nimport type { JSX } from 'solid-js'\nimport type {\n AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter,\n AdapterDomain, AdapterStatusInfo,\n} from '@geenius/adapters-shared'\nimport { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius/adapters-shared'\n\nexport interface AdapterSet {\n db?: DbAdapter\n auth?: AuthAdapter\n payments?: PaymentsAdapter\n ai?: AiAdapter\n storage?: FileStorageAdapter\n admin?: AdminAdapter\n}\n\nexport interface AdapterContextValue {\n adapters: AdapterSet\n statuses: Record<AdapterDomain, AdapterStatusInfo>\n getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>\n isReady: (domain: AdapterDomain) => boolean\n isLoading: boolean\n}\n\nconst AdapterContext = createContext<AdapterContextValue>()\n\nexport interface AdapterProviderProps {\n adapters: AdapterSet\n children: JSX.Element\n}\n\nexport function AdapterProvider(props: AdapterProviderProps) {\n const init = {} as Record<AdapterDomain, AdapterStatusInfo>\n for (const d of ADAPTER_DOMAINS) {\n const a = props.adapters[d as keyof AdapterSet]\n init[d] = { domain: d, provider: a ? 'configured' : 'none', status: a ? 'connected' : 'disconnected', lastCheckedAt: Date.now() }\n }\n const [statuses] = createStore(init)\n\n const getAdapter = <K extends keyof AdapterSet>(domain: K): NonNullable<AdapterSet[K]> => {\n const adapter = props.adapters[domain]\n if (!adapter) throw new Error(`${DOMAIN_LABELS[domain as AdapterDomain] ?? domain} adapter not configured`)\n return adapter as NonNullable<AdapterSet[K]>\n }\n\n const isReady = (domain: AdapterDomain) =>\n !!props.adapters[domain as keyof AdapterSet] && statuses[domain]?.status === 'connected'\n\n const value: AdapterContextValue = { adapters: props.adapters, statuses, getAdapter, isReady, isLoading: false }\n return <AdapterContext.Provider value={value}>{props.children}</AdapterContext.Provider>\n}\n\nexport function useAdapterContext(): AdapterContextValue {\n const ctx = useContext(AdapterContext)\n if (!ctx) throw new Error('useAdapterContext must be used within <AdapterProvider>')\n return ctx\n}\n","export * from '@geenius/adapters-solidjs'\n","// @geenius/adapters-solidjs-css — AdapterStatusBadge (vanilla CSS)\n\nimport type { AdapterStatusType } from '@geenius/adapters-shared'\n\nconst LABELS: Record<AdapterStatusType, string> = {\n connected: 'Connected',\n disconnected: 'Disconnected',\n error: 'Error',\n initializing: 'Initializing',\n}\n\nexport interface AdapterStatusBadgeProps {\n status: AdapterStatusType\n showLabel?: boolean\n}\n\nexport function AdapterStatusBadge(props: AdapterStatusBadgeProps) {\n return (\n <span class={`adapter-badge adapter-badge--${props.status}`}>\n <span class=\"adapter-badge__dot\" />\n {props.showLabel !== false && <span>{LABELS[props.status]}</span>}\n </span>\n )\n}\n","// @geenius/adapters-solidjs-css — AdapterCard (vanilla CSS)\n\nimport { Show } from 'solid-js'\nimport type { AdapterDomain, AdapterStatusInfo } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS } from '@geenius/adapters-shared'\nimport { AdapterStatusBadge } from './AdapterStatusBadge'\n\nexport interface AdapterCardProps {\n domain: AdapterDomain\n status: AdapterStatusInfo\n onClick?: () => void\n}\n\nexport function AdapterCard(props: AdapterCardProps) {\n return (\n <button\n type=\"button\"\n onClick={() => props.onClick?.()}\n class=\"adapter-card\"\n aria-label={`${DOMAIN_LABELS[props.domain]} adapter — ${props.status.status}`}\n >\n <div class=\"adapter-card__icon\">{DOMAIN_ICONS[props.domain]}</div>\n <div class=\"adapter-card__body\">\n <div class=\"adapter-card__header\">\n <h3 class=\"adapter-card__name\">{DOMAIN_LABELS[props.domain]}</h3>\n <AdapterStatusBadge status={props.status.status} />\n </div>\n <p class=\"adapter-card__desc\">{DOMAIN_DESCRIPTIONS[props.domain]}</p>\n <Show when={props.status.provider && props.status.provider !== 'none'}>\n <div class=\"adapter-card__meta\">\n <span class=\"adapter-card__provider\">{props.status.provider}</span>\n <Show when={props.status.latency}>\n <span class=\"adapter-card__latency\">{props.status.latency}ms</span>\n </Show>\n </div>\n </Show>\n <Show when={props.status.error}>\n <p class=\"adapter-card__error\">{props.status.error}</p>\n </Show>\n </div>\n </button>\n )\n}\n","// @geenius/adapters-solidjs-css — AdapterList (vanilla CSS)\n\nimport { createSignal, createMemo, Show, For } from 'solid-js'\nimport { createAdapters } from '../primitives'\nimport { AdapterCard } from './AdapterCard'\nimport { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius/adapters-shared'\nimport type { AdapterDomain, AdapterStatusType } from '@geenius/adapters-shared'\n\nexport interface AdapterListProps {\n onSelect?: (domain: AdapterDomain) => void\n filterStatus?: AdapterStatusType\n}\n\nexport function AdapterList(props: AdapterListProps) {\n const ctx = createAdapters()\n const [search, setSearch] = createSignal('')\n\n const filtered = createMemo(() => {\n let domains = [...ADAPTER_DOMAINS]\n const q = search().toLowerCase()\n if (q) {\n domains = domains.filter((d) => {\n return DOMAIN_LABELS[d].toLowerCase().includes(q) || d.includes(q)\n || (ctx.statuses[d]?.provider?.toLowerCase().includes(q) ?? false)\n })\n }\n if (props.filterStatus) {\n domains = domains.filter((d) => ctx.statuses[d]?.status === props.filterStatus)\n }\n return domains\n })\n\n return (\n <div>\n <input\n type=\"text\"\n value={search()}\n onInput={(e) => setSearch(e.currentTarget.value)}\n placeholder=\"Search adapters...\"\n class=\"adapter-search\"\n aria-label=\"Search adapters\"\n />\n\n <Show\n when={filtered().length > 0}\n fallback={\n <div class=\"adapter-empty\">\n <p class=\"adapter-empty__text\">\n {search() ? 'No adapters match your search' : 'No adapters configured'}\n </p>\n </div>\n }\n >\n <div class=\"adapter-grid\" role=\"list\" aria-label=\"Adapter list\">\n <For each={filtered()}>\n {(domain) => (\n <AdapterCard\n domain={domain}\n status={ctx.statuses[domain]}\n onClick={() => props.onSelect?.(domain)}\n />\n )}\n </For>\n </div>\n </Show>\n </div>\n )\n}\n","// @geenius/adapters-solidjs-css — AdapterConfigForm (vanilla CSS)\n\nimport { createSignal, Show, For } from 'solid-js'\nimport type { AdapterDomain, DomainAdapterConfig } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, getProvidersForDomain } from '@geenius/adapters-shared'\n\nexport interface AdapterConfigFormProps {\n domain: AdapterDomain\n initialConfig?: DomainAdapterConfig\n onSave: (config: DomainAdapterConfig) => Promise<void> | void\n onCancel?: () => void\n}\n\nexport function AdapterConfigForm(props: AdapterConfigFormProps) {\n const providers = getProvidersForDomain(props.domain)\n const [provider, setProvider] = createSignal(props.initialConfig?.provider ?? providers[0]?.id ?? '')\n const [apiKey, setApiKey] = createSignal(props.initialConfig?.apiKey ?? '')\n const [baseUrl, setBaseUrl] = createSignal(props.initialConfig?.baseUrl ?? '')\n const [isSaving, setIsSaving] = createSignal(false)\n const [error, setError] = createSignal<string | null>(null)\n\n const needsApiKey = () => !['localStorage', 'noop'].includes(provider())\n const needsBaseUrl = () => ['ollama', 'minio', 'neon', 'supabase'].includes(provider())\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setError(null)\n if (!provider()) { setError('Select a provider'); return }\n if (needsApiKey() && !apiKey().trim()) { setError('API key is required'); return }\n setIsSaving(true)\n try {\n await props.onSave({\n provider: provider(),\n apiKey: apiKey() || undefined,\n baseUrl: baseUrl() || undefined,\n })\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save')\n } finally {\n setIsSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} class=\"adapter-form\" noValidate>\n <h3 class=\"adapter-form__title\">Configure {DOMAIN_LABELS[props.domain]}</h3>\n <p class=\"adapter-form__subtitle\">Select and configure your preferred provider.</p>\n\n <Show when={error()}>\n <div class=\"adapter-alert adapter-alert--error\" role=\"alert\" style={{ 'margin-top': '1rem' }}>\n {error()}\n </div>\n </Show>\n\n <div class=\"adapter-field\">\n <span class=\"adapter-field__label\">Provider</span>\n <div class=\"adapter-provider-grid\">\n <For each={providers}>\n {(p) => (\n <button\n type=\"button\"\n onClick={() => setProvider(p.id)}\n class={`adapter-provider-option ${provider() === p.id ? 'adapter-provider-option--selected' : ''}`}\n >\n <span class=\"adapter-provider-option__name\">{p.name}</span>\n <span class=\"adapter-provider-option__desc\">{p.description}</span>\n <span class={`adapter-tier-badge adapter-tier-badge--${p.tier}`}>{p.tier}</span>\n </button>\n )}\n </For>\n </div>\n </div>\n\n <Show when={needsApiKey()}>\n <div class=\"adapter-field\">\n <label class=\"adapter-field__label\" for={`adapter-${props.domain}-apiKey`}>API Key</label>\n <input\n id={`adapter-${props.domain}-apiKey`}\n type=\"password\"\n value={apiKey()}\n onInput={(e) => setApiKey(e.currentTarget.value)}\n placeholder={`Enter API key`}\n class=\"adapter-field__input\"\n autocomplete=\"off\"\n />\n </div>\n </Show>\n\n <Show when={needsBaseUrl()}>\n <div class=\"adapter-field\">\n <label class=\"adapter-field__label\" for={`adapter-${props.domain}-url`}>Base URL</label>\n <input\n id={`adapter-${props.domain}-url`}\n type=\"url\"\n value={baseUrl()}\n onInput={(e) => setBaseUrl(e.currentTarget.value)}\n placeholder=\"https://...\"\n class=\"adapter-field__input\"\n />\n </div>\n </Show>\n\n <div style={{ display: 'flex', 'justify-content': 'flex-end', gap: '0.75rem', 'margin-top': '1.5rem' }}>\n <Show when={props.onCancel}>\n <button type=\"button\" onClick={() => props.onCancel?.()} class=\"adapter-btn adapter-btn--ghost\">\n Cancel\n </button>\n </Show>\n <button\n type=\"submit\"\n disabled={isSaving() || !provider()}\n class=\"adapter-btn adapter-btn--primary\"\n >\n {isSaving() ? 'Saving…' : 'Save Configuration'}\n </button>\n </div>\n </form>\n )\n}\n","// @geenius/adapters-solidjs-css — AdaptersPage (vanilla CSS)\n\nimport { createSignal, Show, For } from 'solid-js'\nimport { createAdapters } from '../primitives'\nimport { AdapterList } from '../components/AdapterList'\nimport { AdapterConfigForm } from '../components/AdapterConfigForm'\nimport { AdapterStatusBadge } from '../components/AdapterStatusBadge'\nimport { ADAPTER_DOMAINS, ADAPTER_STATUSES } from '@geenius/adapters-shared'\nimport type { AdapterDomain, AdapterStatusType } from '@geenius/adapters-shared'\n\nexport interface AdaptersPageProps {\n onNavigateDetail?: (domain: AdapterDomain) => void\n}\n\nexport function AdaptersPage(props: AdaptersPageProps) {\n const ctx = createAdapters()\n const [selectedDomain, setSelectedDomain] = createSignal<AdapterDomain | null>(null)\n const [filterStatus, setFilterStatus] = createSignal<AdapterStatusType | undefined>()\n\n const connected = () => ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === 'connected').length\n const errors = () => ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === 'error').length\n\n return (\n <div class=\"adapter-page\">\n {/* Header */}\n <div class=\"adapter-page__header\">\n <h1 class=\"adapter-page__title\">Adapters</h1>\n <p class=\"adapter-page__subtitle\">Manage your infrastructure adapters — database, auth, AI, storage, payments, and admin.</p>\n </div>\n\n {/* Status Summary */}\n <div class=\"adapter-summary\">\n <div class=\"adapter-summary__card\">\n <p class=\"adapter-summary__label\">Total</p>\n <p class=\"adapter-summary__value\">{ADAPTER_DOMAINS.length}</p>\n <p class=\"adapter-summary__desc\">adapter domains</p>\n </div>\n <div class=\"adapter-summary__card adapter-summary__card--success\">\n <p class=\"adapter-summary__label\">Connected</p>\n <p class=\"adapter-summary__value\">{connected()}</p>\n <p class=\"adapter-summary__desc\">active adapters</p>\n </div>\n <Show when={errors() > 0}>\n <div class=\"adapter-summary__card adapter-summary__card--error\">\n <p class=\"adapter-summary__label\">Errors</p>\n <p class=\"adapter-summary__value\">{errors()}</p>\n <p class=\"adapter-summary__desc\">need attention</p>\n </div>\n </Show>\n </div>\n\n {/* Filters */}\n <div class=\"adapter-filters\">\n <button\n class={`adapter-filter-btn ${!filterStatus() ? 'adapter-filter-btn--active' : ''}`}\n onClick={() => setFilterStatus(undefined)}\n >All</button>\n <For each={[...ADAPTER_STATUSES]}>\n {(s) => (\n <button\n class={`adapter-filter-btn ${filterStatus() === s ? 'adapter-filter-btn--active' : ''}`}\n onClick={() => setFilterStatus(s)}\n >\n <AdapterStatusBadge status={s} showLabel={false} />\n {' '}{s}\n </button>\n )}\n </For>\n </div>\n\n {/* Adapter Grid */}\n <AdapterList\n onSelect={(domain) => {\n if (props.onNavigateDetail) props.onNavigateDetail(domain)\n else setSelectedDomain(domain)\n }}\n filterStatus={filterStatus()}\n />\n\n {/* Config Modal */}\n <Show when={selectedDomain()}>\n <div class=\"adapter-modal-overlay\" onClick={() => setSelectedDomain(null)}>\n <div class=\"adapter-modal\" onClick={(e) => e.stopPropagation()}>\n <AdapterConfigForm\n domain={selectedDomain()!}\n onSave={async () => { setSelectedDomain(null) }}\n onCancel={() => setSelectedDomain(null)}\n />\n </div>\n </div>\n </Show>\n </div>\n )\n}\n","// @geenius/adapters-solidjs-css — AdapterDetailPage (vanilla CSS)\n\nimport { createSignal, Show, For } from 'solid-js'\nimport { createAdapterStatus } from '../primitives'\nimport { AdapterStatusBadge } from '../components/AdapterStatusBadge'\nimport { AdapterConfigForm } from '../components/AdapterConfigForm'\nimport type { AdapterDomain } from '@geenius/adapters-shared'\nimport { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS, getProvidersForDomain } from '@geenius/adapters-shared'\n\nexport interface AdapterDetailPageProps {\n domain: AdapterDomain\n onBack?: () => void\n}\n\nexport function AdapterDetailPage(props: AdapterDetailPageProps) {\n const status = createAdapterStatus(props.domain)\n const providers = getProvidersForDomain(props.domain)\n const [isEditing, setIsEditing] = createSignal(false)\n\n return (\n <div class=\"adapter-page\">\n {/* Back */}\n <Show when={props.onBack}>\n <button onClick={() => props.onBack?.()} class=\"adapter-btn adapter-btn--ghost adapter-btn--sm\" style={{ 'margin-bottom': '1rem' }}>\n ← Back to Adapters\n </button>\n </Show>\n\n {/* Header */}\n <div style={{ display: 'flex', 'align-items': 'flex-start', gap: '1.25rem', 'margin-bottom': '2rem' }}>\n <div class=\"adapter-detail__icon\">{DOMAIN_ICONS[props.domain]}</div>\n <div style={{ flex: '1' }}>\n <div style={{ display: 'flex', 'align-items': 'center', gap: '0.75rem' }}>\n <h1 class=\"adapter-page__title\">{DOMAIN_LABELS[props.domain]}</h1>\n <AdapterStatusBadge status={status().status} />\n </div>\n <p class=\"adapter-page__subtitle\">{DOMAIN_DESCRIPTIONS[props.domain]}</p>\n </div>\n </div>\n\n {/* Status card */}\n <div class=\"adapter-summary__card\" style={{ 'margin-bottom': '2rem' }}>\n <h2 class=\"adapter-summary__label\" style={{ 'margin-bottom': '1rem' }}>Current Status</h2>\n <div class=\"adapter-detail__status-grid\">\n <div>\n <p class=\"adapter-detail__label\">Provider</p>\n <p class=\"adapter-detail__value\">{status().provider !== 'none' ? status().provider : '—'}</p>\n </div>\n <div>\n <p class=\"adapter-detail__label\">Status</p>\n <div class=\"adapter-detail__value\"><AdapterStatusBadge status={status().status} /></div>\n </div>\n <div>\n <p class=\"adapter-detail__label\">Last Checked</p>\n <p class=\"adapter-detail__value\">{status().lastCheckedAt ? new Date(status().lastCheckedAt!).toLocaleTimeString() : '—'}</p>\n </div>\n </div>\n <Show when={status().error}>\n <div class=\"adapter-alert adapter-alert--error\" style={{ 'margin-top': '1rem' }}>\n <strong>Error:</strong> {status().error}\n </div>\n </Show>\n </div>\n\n {/* Available providers */}\n <div class=\"adapter-summary__card\" style={{ 'margin-bottom': '2rem' }}>\n <div style={{ display: 'flex', 'justify-content': 'space-between', 'margin-bottom': '1rem' }}>\n <h2 class=\"adapter-summary__label\">Available Providers</h2>\n <span class=\"adapter-summary__desc\">{providers.length} providers</span>\n </div>\n <div class=\"adapter-provider-list\">\n <For each={providers}>\n {(p) => (\n <div style={{ display: 'flex', 'align-items': 'center', 'justify-content': 'space-between' }}>\n <div>\n <p class=\"adapter-detail__value\" style={{ 'font-size': '0.875rem' }}>{p.name}</p>\n <p class=\"adapter-detail__label\">{p.description}</p>\n </div>\n <span class={`adapter-tier-badge adapter-tier-badge--${p.tier}`}>{p.tier}</span>\n </div>\n )}\n </For>\n </div>\n </div>\n\n {/* Configuration */}\n <Show\n when={isEditing()}\n fallback={\n <button\n onClick={() => setIsEditing(true)}\n class=\"adapter-card\"\n style={{ 'justify-content': 'center', 'border-style': 'dashed' }}\n >\n ⚙️ Configure {DOMAIN_LABELS[props.domain]} Adapter\n </button>\n }\n >\n <AdapterConfigForm\n domain={props.domain}\n onSave={async () => { setIsEditing(false) }}\n onCancel={() => setIsEditing(false)}\n />\n </Show>\n </div>\n )\n}\n"],"mappings":"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","names":["import_adapters_shared","import_solid_js","import_adapters_shared","import_solid_js","import_adapters_shared","import_solid_js","import_adapters_shared","import_solid_js","import_adapters_shared","import_solid_js","import_adapters_shared"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
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, PaymentsAdapter, configureAdapters, getAdapterConfig } from '@geenius/adapters-shared';
|
|
3
|
+
import * as solid_js from 'solid-js';
|
|
4
|
+
import { JSX } from 'solid-js';
|
|
5
|
+
export { createAdapterStatus, createAdapterStatuses, createAdapters, createAdmin, createAi, createAuth, createDb, createIsAdapterReady, createPayments, createStorage } from '@geenius/adapters-solidjs';
|
|
6
|
+
|
|
7
|
+
interface AdapterSet {
|
|
8
|
+
db?: DbAdapter;
|
|
9
|
+
auth?: AuthAdapter;
|
|
10
|
+
payments?: PaymentsAdapter;
|
|
11
|
+
ai?: AiAdapter;
|
|
12
|
+
storage?: FileStorageAdapter;
|
|
13
|
+
admin?: AdminAdapter;
|
|
14
|
+
}
|
|
15
|
+
interface AdapterContextValue {
|
|
16
|
+
adapters: AdapterSet;
|
|
17
|
+
statuses: Record<AdapterDomain, AdapterStatusInfo>;
|
|
18
|
+
getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>;
|
|
19
|
+
isReady: (domain: AdapterDomain) => boolean;
|
|
20
|
+
isLoading: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface AdapterProviderProps {
|
|
23
|
+
adapters: AdapterSet;
|
|
24
|
+
children: JSX.Element;
|
|
25
|
+
}
|
|
26
|
+
declare function AdapterProvider(props: AdapterProviderProps): JSX.Element;
|
|
27
|
+
declare function useAdapterContext(): AdapterContextValue;
|
|
28
|
+
|
|
29
|
+
interface AdapterStatusBadgeProps {
|
|
30
|
+
status: AdapterStatusType;
|
|
31
|
+
showLabel?: boolean;
|
|
32
|
+
}
|
|
33
|
+
declare function AdapterStatusBadge(props: AdapterStatusBadgeProps): solid_js.JSX.Element;
|
|
34
|
+
|
|
35
|
+
interface AdapterCardProps {
|
|
36
|
+
domain: AdapterDomain;
|
|
37
|
+
status: AdapterStatusInfo;
|
|
38
|
+
onClick?: () => void;
|
|
39
|
+
}
|
|
40
|
+
declare function AdapterCard(props: AdapterCardProps): solid_js.JSX.Element;
|
|
41
|
+
|
|
42
|
+
interface AdapterListProps {
|
|
43
|
+
onSelect?: (domain: AdapterDomain) => void;
|
|
44
|
+
filterStatus?: AdapterStatusType;
|
|
45
|
+
}
|
|
46
|
+
declare function AdapterList(props: AdapterListProps): solid_js.JSX.Element;
|
|
47
|
+
|
|
48
|
+
interface AdapterConfigFormProps {
|
|
49
|
+
domain: AdapterDomain;
|
|
50
|
+
initialConfig?: DomainAdapterConfig;
|
|
51
|
+
onSave: (config: DomainAdapterConfig) => Promise<void> | void;
|
|
52
|
+
onCancel?: () => void;
|
|
53
|
+
}
|
|
54
|
+
declare function AdapterConfigForm(props: AdapterConfigFormProps): solid_js.JSX.Element;
|
|
55
|
+
|
|
56
|
+
interface AdaptersPageProps {
|
|
57
|
+
onNavigateDetail?: (domain: AdapterDomain) => void;
|
|
58
|
+
}
|
|
59
|
+
declare function AdaptersPage(props: AdaptersPageProps): solid_js.JSX.Element;
|
|
60
|
+
|
|
61
|
+
interface AdapterDetailPageProps {
|
|
62
|
+
domain: AdapterDomain;
|
|
63
|
+
onBack?: () => void;
|
|
64
|
+
}
|
|
65
|
+
declare function AdapterDetailPage(props: AdapterDetailPageProps): solid_js.JSX.Element;
|
|
66
|
+
|
|
67
|
+
export { AdapterCard, type AdapterCardProps, AdapterConfigForm, type AdapterConfigFormProps, type AdapterContextValue, AdapterDetailPage, type AdapterDetailPageProps, AdapterList, type AdapterListProps, AdapterProvider, type AdapterProviderProps, type AdapterSet, AdapterStatusBadge, type AdapterStatusBadgeProps, AdaptersPage, type AdaptersPageProps, useAdapterContext };
|