@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.
Files changed (185) hide show
  1. package/README.md +79 -42
  2. package/package.json +23 -4
  3. package/packages/convex/README.md +1 -1
  4. package/packages/convex/dist/index.cjs +300 -0
  5. package/packages/convex/dist/index.cjs.map +1 -0
  6. package/packages/convex/dist/index.d.cts +231 -0
  7. package/packages/convex/dist/index.d.ts +231 -0
  8. package/packages/convex/dist/index.js +263 -0
  9. package/packages/convex/dist/index.js.map +1 -0
  10. package/packages/react/README.md +1 -1
  11. package/packages/react/dist/index.d.mts +106 -0
  12. package/packages/react/dist/index.d.ts +106 -0
  13. package/packages/react/dist/index.js +611 -0
  14. package/packages/react/dist/index.js.map +1 -0
  15. package/packages/react/dist/index.mjs +570 -0
  16. package/packages/react/dist/index.mjs.map +1 -0
  17. package/packages/react-css/README.md +1 -1
  18. package/packages/react-css/dist/index.cjs +515 -0
  19. package/packages/react-css/dist/index.cjs.map +1 -0
  20. package/packages/react-css/dist/index.d.cts +105 -0
  21. package/packages/react-css/dist/index.d.ts +105 -0
  22. package/packages/react-css/dist/index.js +467 -0
  23. package/packages/react-css/dist/index.js.map +1 -0
  24. package/packages/shared/README.md +1 -1
  25. package/packages/shared/dist/index.d.mts +625 -0
  26. package/packages/shared/dist/index.d.ts +625 -0
  27. package/packages/shared/dist/index.js +1567 -0
  28. package/packages/shared/dist/index.js.map +1 -0
  29. package/packages/shared/dist/index.mjs +1489 -0
  30. package/packages/shared/dist/index.mjs.map +1 -0
  31. package/packages/solidjs/README.md +1 -1
  32. package/packages/solidjs/dist/index.d.mts +97 -0
  33. package/packages/solidjs/dist/index.d.ts +97 -0
  34. package/packages/solidjs/dist/index.js +250 -0
  35. package/packages/solidjs/dist/index.js.map +1 -0
  36. package/packages/solidjs/dist/index.mjs +202 -0
  37. package/packages/solidjs/dist/index.mjs.map +1 -0
  38. package/packages/solidjs-css/README.md +1 -1
  39. package/packages/solidjs-css/dist/index.cjs +343 -0
  40. package/packages/solidjs-css/dist/index.cjs.map +1 -0
  41. package/packages/solidjs-css/dist/index.d.cts +67 -0
  42. package/packages/solidjs-css/dist/index.d.ts +67 -0
  43. package/packages/solidjs-css/dist/index.js +326 -0
  44. package/packages/solidjs-css/dist/index.js.map +1 -0
  45. package/.changeset/config.json +0 -11
  46. package/.github/CODEOWNERS +0 -1
  47. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  48. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  49. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  50. package/.github/dependabot.yml +0 -11
  51. package/.github/workflows/ci.yml +0 -23
  52. package/.github/workflows/release.yml +0 -29
  53. package/.nvmrc +0 -1
  54. package/.project/ACCOUNT.yaml +0 -4
  55. package/.project/IDEAS.yaml +0 -7
  56. package/.project/PROJECT.yaml +0 -11
  57. package/.project/ROADMAP.yaml +0 -15
  58. package/CODE_OF_CONDUCT.md +0 -16
  59. package/CONTRIBUTING.md +0 -26
  60. package/SECURITY.md +0 -15
  61. package/SUPPORT.md +0 -8
  62. package/packages/convex/package.json +0 -42
  63. package/packages/convex/src/adapter.ts +0 -39
  64. package/packages/convex/src/index.ts +0 -19
  65. package/packages/convex/src/mutations.ts +0 -142
  66. package/packages/convex/src/queries.ts +0 -106
  67. package/packages/convex/src/schema.ts +0 -54
  68. package/packages/convex/src/types.ts +0 -20
  69. package/packages/convex/tsconfig.json +0 -11
  70. package/packages/convex/tsup.config.ts +0 -10
  71. package/packages/react/package.json +0 -45
  72. package/packages/react/src/components/AdapterCard.tsx +0 -49
  73. package/packages/react/src/components/AdapterConfigForm.tsx +0 -118
  74. package/packages/react/src/components/AdapterList.tsx +0 -84
  75. package/packages/react/src/components/AdapterStatusBadge.tsx +0 -30
  76. package/packages/react/src/components/index.ts +0 -4
  77. package/packages/react/src/hooks/index.ts +0 -75
  78. package/packages/react/src/index.tsx +0 -44
  79. package/packages/react/src/pages/AdapterDetailPage.tsx +0 -133
  80. package/packages/react/src/pages/AdaptersPage.tsx +0 -111
  81. package/packages/react/src/pages/index.ts +0 -2
  82. package/packages/react/src/provider/AdapterProvider.tsx +0 -115
  83. package/packages/react/src/provider/index.ts +0 -2
  84. package/packages/react/tsconfig.json +0 -18
  85. package/packages/react/tsup.config.ts +0 -10
  86. package/packages/react-css/package.json +0 -44
  87. package/packages/react-css/src/adapters.css +0 -1576
  88. package/packages/react-css/src/components/AdapterCard.tsx +0 -34
  89. package/packages/react-css/src/components/AdapterConfigForm.tsx +0 -63
  90. package/packages/react-css/src/components/AdapterList.tsx +0 -40
  91. package/packages/react-css/src/components/AdapterStatusBadge.tsx +0 -21
  92. package/packages/react-css/src/components/index.ts +0 -4
  93. package/packages/react-css/src/hooks/index.ts +0 -75
  94. package/packages/react-css/src/index.tsx +0 -25
  95. package/packages/react-css/src/pages/AdapterDetailPage.tsx +0 -133
  96. package/packages/react-css/src/pages/AdaptersPage.tsx +0 -111
  97. package/packages/react-css/src/pages/index.ts +0 -2
  98. package/packages/react-css/src/provider/AdapterProvider.tsx +0 -115
  99. package/packages/react-css/src/provider/index.ts +0 -2
  100. package/packages/react-css/src/styles.css +0 -494
  101. package/packages/react-css/tsconfig.json +0 -19
  102. package/packages/react-css/tsup.config.ts +0 -2
  103. package/packages/shared/package.json +0 -39
  104. package/packages/shared/src/__tests__/adapters.test.ts +0 -545
  105. package/packages/shared/src/admin/index.ts +0 -2
  106. package/packages/shared/src/admin/interface.ts +0 -34
  107. package/packages/shared/src/admin/localStorage.ts +0 -109
  108. package/packages/shared/src/ai/anthropic.ts +0 -123
  109. package/packages/shared/src/ai/cloudflare-gateway.ts +0 -130
  110. package/packages/shared/src/ai/gemini.ts +0 -181
  111. package/packages/shared/src/ai/index.ts +0 -14
  112. package/packages/shared/src/ai/interface.ts +0 -11
  113. package/packages/shared/src/ai/localStorage.ts +0 -78
  114. package/packages/shared/src/ai/ollama.ts +0 -143
  115. package/packages/shared/src/ai/openai.ts +0 -120
  116. package/packages/shared/src/ai/vercel-ai.ts +0 -101
  117. package/packages/shared/src/auth/better-auth.ts +0 -118
  118. package/packages/shared/src/auth/clerk.ts +0 -151
  119. package/packages/shared/src/auth/convex-auth.ts +0 -125
  120. package/packages/shared/src/auth/index.ts +0 -10
  121. package/packages/shared/src/auth/interface.ts +0 -17
  122. package/packages/shared/src/auth/localStorage.ts +0 -125
  123. package/packages/shared/src/auth/supabase-auth.ts +0 -136
  124. package/packages/shared/src/config.ts +0 -57
  125. package/packages/shared/src/constants.ts +0 -122
  126. package/packages/shared/src/db/convex.ts +0 -146
  127. package/packages/shared/src/db/index.ts +0 -10
  128. package/packages/shared/src/db/interface.ts +0 -13
  129. package/packages/shared/src/db/localStorage.ts +0 -91
  130. package/packages/shared/src/db/mongodb.ts +0 -125
  131. package/packages/shared/src/db/neon.ts +0 -171
  132. package/packages/shared/src/db/supabase.ts +0 -158
  133. package/packages/shared/src/index.ts +0 -117
  134. package/packages/shared/src/payments/index.ts +0 -4
  135. package/packages/shared/src/payments/interface.ts +0 -11
  136. package/packages/shared/src/payments/localStorage.ts +0 -81
  137. package/packages/shared/src/payments/stripe.ts +0 -177
  138. package/packages/shared/src/storage/convex.ts +0 -113
  139. package/packages/shared/src/storage/index.ts +0 -14
  140. package/packages/shared/src/storage/interface.ts +0 -11
  141. package/packages/shared/src/storage/localStorage.ts +0 -95
  142. package/packages/shared/src/storage/minio.ts +0 -47
  143. package/packages/shared/src/storage/r2.ts +0 -123
  144. package/packages/shared/src/storage/s3.ts +0 -128
  145. package/packages/shared/src/storage/supabase-storage.ts +0 -116
  146. package/packages/shared/src/storage/uploadthing.ts +0 -126
  147. package/packages/shared/src/styles/adapters.css +0 -494
  148. package/packages/shared/src/tier-gate.ts +0 -119
  149. package/packages/shared/src/types.ts +0 -162
  150. package/packages/shared/tsconfig.json +0 -18
  151. package/packages/shared/tsup.config.ts +0 -9
  152. package/packages/shared/vitest.config.ts +0 -14
  153. package/packages/solidjs/package.json +0 -44
  154. package/packages/solidjs/src/components/AdapterCard.tsx +0 -24
  155. package/packages/solidjs/src/components/AdapterConfigForm.tsx +0 -54
  156. package/packages/solidjs/src/components/AdapterList.tsx +0 -28
  157. package/packages/solidjs/src/components/AdapterStatusBadge.tsx +0 -20
  158. package/packages/solidjs/src/components/index.ts +0 -4
  159. package/packages/solidjs/src/index.tsx +0 -17
  160. package/packages/solidjs/src/pages/AdapterDetailPage.tsx +0 -38
  161. package/packages/solidjs/src/pages/AdaptersPage.tsx +0 -39
  162. package/packages/solidjs/src/pages/index.ts +0 -2
  163. package/packages/solidjs/src/primitives/index.ts +0 -78
  164. package/packages/solidjs/src/provider/AdapterProvider.tsx +0 -62
  165. package/packages/solidjs/src/provider/index.ts +0 -2
  166. package/packages/solidjs/tsconfig.json +0 -20
  167. package/packages/solidjs/tsup.config.ts +0 -10
  168. package/packages/solidjs-css/package.json +0 -43
  169. package/packages/solidjs-css/src/adapters.css +0 -1576
  170. package/packages/solidjs-css/src/components/AdapterCard.tsx +0 -43
  171. package/packages/solidjs-css/src/components/AdapterConfigForm.tsx +0 -119
  172. package/packages/solidjs-css/src/components/AdapterList.tsx +0 -68
  173. package/packages/solidjs-css/src/components/AdapterStatusBadge.tsx +0 -24
  174. package/packages/solidjs-css/src/components/index.ts +0 -8
  175. package/packages/solidjs-css/src/index.tsx +0 -30
  176. package/packages/solidjs-css/src/pages/AdapterDetailPage.tsx +0 -107
  177. package/packages/solidjs-css/src/pages/AdaptersPage.tsx +0 -94
  178. package/packages/solidjs-css/src/pages/index.ts +0 -4
  179. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  180. package/packages/solidjs-css/src/provider/AdapterProvider.tsx +0 -61
  181. package/packages/solidjs-css/src/provider/index.ts +0 -2
  182. package/packages/solidjs-css/tsconfig.json +0 -20
  183. package/packages/solidjs-css/tsup.config.ts +0 -2
  184. package/pnpm-workspace.yaml +0 -2
  185. package/tsconfig.json +0 -17
@@ -1,43 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterCard (vanilla CSS)
2
-
3
- import { Show } from 'solid-js'
4
- import type { AdapterDomain, AdapterStatusInfo } from '@geenius-adapters/shared'
5
- import { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS } from '@geenius-adapters/shared'
6
- import { AdapterStatusBadge } from './AdapterStatusBadge'
7
-
8
- export interface AdapterCardProps {
9
- domain: AdapterDomain
10
- status: AdapterStatusInfo
11
- onClick?: () => void
12
- }
13
-
14
- export function AdapterCard(props: AdapterCardProps) {
15
- return (
16
- <button
17
- type="button"
18
- onClick={() => props.onClick?.()}
19
- class="adapter-card"
20
- aria-label={`${DOMAIN_LABELS[props.domain]} adapter — ${props.status.status}`}
21
- >
22
- <div class="adapter-card__icon">{DOMAIN_ICONS[props.domain]}</div>
23
- <div class="adapter-card__body">
24
- <div class="adapter-card__header">
25
- <h3 class="adapter-card__name">{DOMAIN_LABELS[props.domain]}</h3>
26
- <AdapterStatusBadge status={props.status.status} />
27
- </div>
28
- <p class="adapter-card__desc">{DOMAIN_DESCRIPTIONS[props.domain]}</p>
29
- <Show when={props.status.provider && props.status.provider !== 'none'}>
30
- <div class="adapter-card__meta">
31
- <span class="adapter-card__provider">{props.status.provider}</span>
32
- <Show when={props.status.latency}>
33
- <span class="adapter-card__latency">{props.status.latency}ms</span>
34
- </Show>
35
- </div>
36
- </Show>
37
- <Show when={props.status.error}>
38
- <p class="adapter-card__error">{props.status.error}</p>
39
- </Show>
40
- </div>
41
- </button>
42
- )
43
- }
@@ -1,119 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterConfigForm (vanilla CSS)
2
-
3
- import { createSignal, Show, For } from 'solid-js'
4
- import type { AdapterDomain, DomainAdapterConfig } from '@geenius-adapters/shared'
5
- import { DOMAIN_LABELS, getProvidersForDomain } from '@geenius-adapters/shared'
6
-
7
- export interface AdapterConfigFormProps {
8
- domain: AdapterDomain
9
- initialConfig?: DomainAdapterConfig
10
- onSave: (config: DomainAdapterConfig) => Promise<void> | void
11
- onCancel?: () => void
12
- }
13
-
14
- export function AdapterConfigForm(props: AdapterConfigFormProps) {
15
- const providers = getProvidersForDomain(props.domain)
16
- const [provider, setProvider] = createSignal(props.initialConfig?.provider ?? providers[0]?.id ?? '')
17
- const [apiKey, setApiKey] = createSignal(props.initialConfig?.apiKey ?? '')
18
- const [baseUrl, setBaseUrl] = createSignal(props.initialConfig?.baseUrl ?? '')
19
- const [isSaving, setIsSaving] = createSignal(false)
20
- const [error, setError] = createSignal<string | null>(null)
21
-
22
- const needsApiKey = () => !['localStorage', 'noop'].includes(provider())
23
- const needsBaseUrl = () => ['ollama', 'minio', 'neon', 'supabase'].includes(provider())
24
-
25
- const handleSubmit = async (e: Event) => {
26
- e.preventDefault()
27
- setError(null)
28
- if (!provider()) { setError('Select a provider'); return }
29
- if (needsApiKey() && !apiKey().trim()) { setError('API key is required'); return }
30
- setIsSaving(true)
31
- try {
32
- await props.onSave({
33
- provider: provider(),
34
- apiKey: apiKey() || undefined,
35
- baseUrl: baseUrl() || undefined,
36
- })
37
- } catch (err) {
38
- setError(err instanceof Error ? err.message : 'Failed to save')
39
- } finally {
40
- setIsSaving(false)
41
- }
42
- }
43
-
44
- return (
45
- <form onSubmit={handleSubmit} class="adapter-form" noValidate>
46
- <h3 class="adapter-form__title">Configure {DOMAIN_LABELS[props.domain]}</h3>
47
- <p class="adapter-form__subtitle">Select and configure your preferred provider.</p>
48
-
49
- <Show when={error()}>
50
- <div class="adapter-alert adapter-alert--error" role="alert" style={{ 'margin-top': '1rem' }}>
51
- {error()}
52
- </div>
53
- </Show>
54
-
55
- <div class="adapter-field">
56
- <span class="adapter-field__label">Provider</span>
57
- <div class="adapter-provider-grid">
58
- <For each={providers}>
59
- {(p) => (
60
- <button
61
- type="button"
62
- onClick={() => setProvider(p.id)}
63
- class={`adapter-provider-option ${provider() === p.id ? 'adapter-provider-option--selected' : ''}`}
64
- >
65
- <span class="adapter-provider-option__name">{p.name}</span>
66
- <span class="adapter-provider-option__desc">{p.description}</span>
67
- <span class={`adapter-tier-badge adapter-tier-badge--${p.tier}`}>{p.tier}</span>
68
- </button>
69
- )}
70
- </For>
71
- </div>
72
- </div>
73
-
74
- <Show when={needsApiKey()}>
75
- <div class="adapter-field">
76
- <label class="adapter-field__label" for={`adapter-${props.domain}-apiKey`}>API Key</label>
77
- <input
78
- id={`adapter-${props.domain}-apiKey`}
79
- type="password"
80
- value={apiKey()}
81
- onInput={(e) => setApiKey(e.currentTarget.value)}
82
- placeholder={`Enter API key`}
83
- class="adapter-field__input"
84
- autocomplete="off"
85
- />
86
- </div>
87
- </Show>
88
-
89
- <Show when={needsBaseUrl()}>
90
- <div class="adapter-field">
91
- <label class="adapter-field__label" for={`adapter-${props.domain}-url`}>Base URL</label>
92
- <input
93
- id={`adapter-${props.domain}-url`}
94
- type="url"
95
- value={baseUrl()}
96
- onInput={(e) => setBaseUrl(e.currentTarget.value)}
97
- placeholder="https://..."
98
- class="adapter-field__input"
99
- />
100
- </div>
101
- </Show>
102
-
103
- <div style={{ display: 'flex', 'justify-content': 'flex-end', gap: '0.75rem', 'margin-top': '1.5rem' }}>
104
- <Show when={props.onCancel}>
105
- <button type="button" onClick={() => props.onCancel?.()} class="adapter-btn adapter-btn--ghost">
106
- Cancel
107
- </button>
108
- </Show>
109
- <button
110
- type="submit"
111
- disabled={isSaving() || !provider()}
112
- class="adapter-btn adapter-btn--primary"
113
- >
114
- {isSaving() ? 'Saving…' : 'Save Configuration'}
115
- </button>
116
- </div>
117
- </form>
118
- )
119
- }
@@ -1,68 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterList (vanilla CSS)
2
-
3
- import { createSignal, createMemo, Show, For } from 'solid-js'
4
- import { createAdapters } from '../primitives'
5
- import { AdapterCard } from './AdapterCard'
6
- import { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius-adapters/shared'
7
- import type { AdapterDomain, AdapterStatusType } from '@geenius-adapters/shared'
8
-
9
- export interface AdapterListProps {
10
- onSelect?: (domain: AdapterDomain) => void
11
- filterStatus?: AdapterStatusType
12
- }
13
-
14
- export function AdapterList(props: AdapterListProps) {
15
- const ctx = createAdapters()
16
- const [search, setSearch] = createSignal('')
17
-
18
- const filtered = createMemo(() => {
19
- let domains = [...ADAPTER_DOMAINS]
20
- const q = search().toLowerCase()
21
- if (q) {
22
- domains = domains.filter((d) => {
23
- return DOMAIN_LABELS[d].toLowerCase().includes(q) || d.includes(q)
24
- || (ctx.statuses[d]?.provider?.toLowerCase().includes(q) ?? false)
25
- })
26
- }
27
- if (props.filterStatus) {
28
- domains = domains.filter((d) => ctx.statuses[d]?.status === props.filterStatus)
29
- }
30
- return domains
31
- })
32
-
33
- return (
34
- <div>
35
- <input
36
- type="text"
37
- value={search()}
38
- onInput={(e) => setSearch(e.currentTarget.value)}
39
- placeholder="Search adapters..."
40
- class="adapter-search"
41
- aria-label="Search adapters"
42
- />
43
-
44
- <Show
45
- when={filtered().length > 0}
46
- fallback={
47
- <div class="adapter-empty">
48
- <p class="adapter-empty__text">
49
- {search() ? 'No adapters match your search' : 'No adapters configured'}
50
- </p>
51
- </div>
52
- }
53
- >
54
- <div class="adapter-grid" role="list" aria-label="Adapter list">
55
- <For each={filtered()}>
56
- {(domain) => (
57
- <AdapterCard
58
- domain={domain}
59
- status={ctx.statuses[domain]}
60
- onClick={() => props.onSelect?.(domain)}
61
- />
62
- )}
63
- </For>
64
- </div>
65
- </Show>
66
- </div>
67
- )
68
- }
@@ -1,24 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterStatusBadge (vanilla CSS)
2
-
3
- import type { AdapterStatusType } from '@geenius-adapters/shared'
4
-
5
- const LABELS: Record<AdapterStatusType, string> = {
6
- connected: 'Connected',
7
- disconnected: 'Disconnected',
8
- error: 'Error',
9
- initializing: 'Initializing',
10
- }
11
-
12
- export interface AdapterStatusBadgeProps {
13
- status: AdapterStatusType
14
- showLabel?: boolean
15
- }
16
-
17
- export function AdapterStatusBadge(props: AdapterStatusBadgeProps) {
18
- return (
19
- <span class={`adapter-badge adapter-badge--${props.status}`}>
20
- <span class="adapter-badge__dot" />
21
- {props.showLabel !== false && <span>{LABELS[props.status]}</span>}
22
- </span>
23
- )
24
- }
@@ -1,8 +0,0 @@
1
- export { AdapterStatusBadge } from './AdapterStatusBadge'
2
- export type { AdapterStatusBadgeProps } from './AdapterStatusBadge'
3
- export { AdapterCard } from './AdapterCard'
4
- export type { AdapterCardProps } from './AdapterCard'
5
- export { AdapterList } from './AdapterList'
6
- export type { AdapterListProps } from './AdapterList'
7
- export { AdapterConfigForm } from './AdapterConfigForm'
8
- export type { AdapterConfigFormProps } from './AdapterConfigForm'
@@ -1,30 +0,0 @@
1
- // @geenius-adapters/solidjs-css — Barrel export
2
- // Vanilla CSS variant: import '@geenius-adapters/solidjs-css/styles.css'
3
-
4
- export type {
5
- AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter,
6
- AdminAdapter, AdapterDomain, AdapterConfig, AdapterStatusType, AdapterStatusInfo,
7
- } from '@geenius-adapters/shared'
8
-
9
- export {
10
- ADAPTER_DOMAINS, DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS,
11
- configureAdapters, getAdapterConfig,
12
- } from '@geenius-adapters/shared'
13
-
14
- // Provider
15
- export { AdapterProvider, useAdapterContext } from './provider'
16
- export type { AdapterProviderProps, AdapterSet, AdapterContextValue } from './provider'
17
-
18
- // Primitives
19
- export {
20
- createDb, createAuth, createPayments, createAi, createStorage, createAdmin,
21
- createAdapters, createAdapterStatuses, createAdapterStatus, createIsAdapterReady,
22
- } from './primitives'
23
-
24
- // Components
25
- export { AdapterStatusBadge, AdapterCard, AdapterList, AdapterConfigForm } from './components'
26
- export type { AdapterStatusBadgeProps, AdapterCardProps, AdapterListProps, AdapterConfigFormProps } from './components'
27
-
28
- // Pages
29
- export { AdaptersPage, AdapterDetailPage } from './pages'
30
- export type { AdaptersPageProps, AdapterDetailPageProps } from './pages'
@@ -1,107 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterDetailPage (vanilla CSS)
2
-
3
- import { createSignal, Show, For } from 'solid-js'
4
- import { createAdapterStatus } from '../primitives'
5
- import { AdapterStatusBadge } from '../components/AdapterStatusBadge'
6
- import { AdapterConfigForm } from '../components/AdapterConfigForm'
7
- import type { AdapterDomain } from '@geenius-adapters/shared'
8
- import { DOMAIN_LABELS, DOMAIN_ICONS, DOMAIN_DESCRIPTIONS, getProvidersForDomain } from '@geenius-adapters/shared'
9
-
10
- export interface AdapterDetailPageProps {
11
- domain: AdapterDomain
12
- onBack?: () => void
13
- }
14
-
15
- export function AdapterDetailPage(props: AdapterDetailPageProps) {
16
- const status = createAdapterStatus(props.domain)
17
- const providers = getProvidersForDomain(props.domain)
18
- const [isEditing, setIsEditing] = createSignal(false)
19
-
20
- return (
21
- <div class="adapter-page">
22
- {/* Back */}
23
- <Show when={props.onBack}>
24
- <button onClick={() => props.onBack?.()} class="adapter-btn adapter-btn--ghost adapter-btn--sm" style={{ 'margin-bottom': '1rem' }}>
25
- ← Back to Adapters
26
- </button>
27
- </Show>
28
-
29
- {/* Header */}
30
- <div style={{ display: 'flex', 'align-items': 'flex-start', gap: '1.25rem', 'margin-bottom': '2rem' }}>
31
- <div class="adapter-detail__icon">{DOMAIN_ICONS[props.domain]}</div>
32
- <div style={{ flex: '1' }}>
33
- <div style={{ display: 'flex', 'align-items': 'center', gap: '0.75rem' }}>
34
- <h1 class="adapter-page__title">{DOMAIN_LABELS[props.domain]}</h1>
35
- <AdapterStatusBadge status={status().status} />
36
- </div>
37
- <p class="adapter-page__subtitle">{DOMAIN_DESCRIPTIONS[props.domain]}</p>
38
- </div>
39
- </div>
40
-
41
- {/* Status card */}
42
- <div class="adapter-summary__card" style={{ 'margin-bottom': '2rem' }}>
43
- <h2 class="adapter-summary__label" style={{ 'margin-bottom': '1rem' }}>Current Status</h2>
44
- <div class="adapter-detail__status-grid">
45
- <div>
46
- <p class="adapter-detail__label">Provider</p>
47
- <p class="adapter-detail__value">{status().provider !== 'none' ? status().provider : '—'}</p>
48
- </div>
49
- <div>
50
- <p class="adapter-detail__label">Status</p>
51
- <div class="adapter-detail__value"><AdapterStatusBadge status={status().status} /></div>
52
- </div>
53
- <div>
54
- <p class="adapter-detail__label">Last Checked</p>
55
- <p class="adapter-detail__value">{status().lastCheckedAt ? new Date(status().lastCheckedAt!).toLocaleTimeString() : '—'}</p>
56
- </div>
57
- </div>
58
- <Show when={status().error}>
59
- <div class="adapter-alert adapter-alert--error" style={{ 'margin-top': '1rem' }}>
60
- <strong>Error:</strong> {status().error}
61
- </div>
62
- </Show>
63
- </div>
64
-
65
- {/* Available providers */}
66
- <div class="adapter-summary__card" style={{ 'margin-bottom': '2rem' }}>
67
- <div style={{ display: 'flex', 'justify-content': 'space-between', 'margin-bottom': '1rem' }}>
68
- <h2 class="adapter-summary__label">Available Providers</h2>
69
- <span class="adapter-summary__desc">{providers.length} providers</span>
70
- </div>
71
- <div class="adapter-provider-list">
72
- <For each={providers}>
73
- {(p) => (
74
- <div style={{ display: 'flex', 'align-items': 'center', 'justify-content': 'space-between' }}>
75
- <div>
76
- <p class="adapter-detail__value" style={{ 'font-size': '0.875rem' }}>{p.name}</p>
77
- <p class="adapter-detail__label">{p.description}</p>
78
- </div>
79
- <span class={`adapter-tier-badge adapter-tier-badge--${p.tier}`}>{p.tier}</span>
80
- </div>
81
- )}
82
- </For>
83
- </div>
84
- </div>
85
-
86
- {/* Configuration */}
87
- <Show
88
- when={isEditing()}
89
- fallback={
90
- <button
91
- onClick={() => setIsEditing(true)}
92
- class="adapter-card"
93
- style={{ 'justify-content': 'center', 'border-style': 'dashed' }}
94
- >
95
- ⚙️ Configure {DOMAIN_LABELS[props.domain]} Adapter
96
- </button>
97
- }
98
- >
99
- <AdapterConfigForm
100
- domain={props.domain}
101
- onSave={async () => setIsEditing(false)}
102
- onCancel={() => setIsEditing(false)}
103
- />
104
- </Show>
105
- </div>
106
- )
107
- }
@@ -1,94 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdaptersPage (vanilla CSS)
2
-
3
- import { createSignal, Show, For } from 'solid-js'
4
- import { createAdapters } from '../primitives'
5
- import { AdapterList } from '../components/AdapterList'
6
- import { AdapterConfigForm } from '../components/AdapterConfigForm'
7
- import { AdapterStatusBadge } from '../components/AdapterStatusBadge'
8
- import { ADAPTER_DOMAINS, ADAPTER_STATUSES } from '@geenius-adapters/shared'
9
- import type { AdapterDomain, AdapterStatusType } from '@geenius-adapters/shared'
10
-
11
- export interface AdaptersPageProps {
12
- onNavigateDetail?: (domain: AdapterDomain) => void
13
- }
14
-
15
- export function AdaptersPage(props: AdaptersPageProps) {
16
- const ctx = createAdapters()
17
- const [selectedDomain, setSelectedDomain] = createSignal<AdapterDomain | null>(null)
18
- const [filterStatus, setFilterStatus] = createSignal<AdapterStatusType | undefined>()
19
-
20
- const connected = () => ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === 'connected').length
21
- const errors = () => ADAPTER_DOMAINS.filter((d) => ctx.statuses[d]?.status === 'error').length
22
-
23
- return (
24
- <div class="adapter-page">
25
- {/* Header */}
26
- <div class="adapter-page__header">
27
- <h1 class="adapter-page__title">Adapters</h1>
28
- <p class="adapter-page__subtitle">Manage your infrastructure adapters — database, auth, AI, storage, payments, and admin.</p>
29
- </div>
30
-
31
- {/* Status Summary */}
32
- <div class="adapter-summary">
33
- <div class="adapter-summary__card">
34
- <p class="adapter-summary__label">Total</p>
35
- <p class="adapter-summary__value">{ADAPTER_DOMAINS.length}</p>
36
- <p class="adapter-summary__desc">adapter domains</p>
37
- </div>
38
- <div class="adapter-summary__card adapter-summary__card--success">
39
- <p class="adapter-summary__label">Connected</p>
40
- <p class="adapter-summary__value">{connected()}</p>
41
- <p class="adapter-summary__desc">active adapters</p>
42
- </div>
43
- <Show when={errors() > 0}>
44
- <div class="adapter-summary__card adapter-summary__card--error">
45
- <p class="adapter-summary__label">Errors</p>
46
- <p class="adapter-summary__value">{errors()}</p>
47
- <p class="adapter-summary__desc">need attention</p>
48
- </div>
49
- </Show>
50
- </div>
51
-
52
- {/* Filters */}
53
- <div class="adapter-filters">
54
- <button
55
- class={`adapter-filter-btn ${!filterStatus() ? 'adapter-filter-btn--active' : ''}`}
56
- onClick={() => setFilterStatus(undefined)}
57
- >All</button>
58
- <For each={[...ADAPTER_STATUSES]}>
59
- {(s) => (
60
- <button
61
- class={`adapter-filter-btn ${filterStatus() === s ? 'adapter-filter-btn--active' : ''}`}
62
- onClick={() => setFilterStatus(s)}
63
- >
64
- <AdapterStatusBadge status={s} showLabel={false} />
65
- {' '}{s}
66
- </button>
67
- )}
68
- </For>
69
- </div>
70
-
71
- {/* Adapter Grid */}
72
- <AdapterList
73
- onSelect={(domain) => {
74
- if (props.onNavigateDetail) props.onNavigateDetail(domain)
75
- else setSelectedDomain(domain)
76
- }}
77
- filterStatus={filterStatus()}
78
- />
79
-
80
- {/* Config Modal */}
81
- <Show when={selectedDomain()}>
82
- <div class="adapter-modal-overlay" onClick={() => setSelectedDomain(null)}>
83
- <div class="adapter-modal" onClick={(e) => e.stopPropagation()}>
84
- <AdapterConfigForm
85
- domain={selectedDomain()!}
86
- onSave={async () => setSelectedDomain(null)}
87
- onCancel={() => setSelectedDomain(null)}
88
- />
89
- </div>
90
- </div>
91
- </Show>
92
- </div>
93
- )
94
- }
@@ -1,4 +0,0 @@
1
- export { AdaptersPage } from './AdaptersPage'
2
- export type { AdaptersPageProps } from './AdaptersPage'
3
- export { AdapterDetailPage } from './AdapterDetailPage'
4
- export type { AdapterDetailPageProps } from './AdapterDetailPage'
@@ -1 +0,0 @@
1
- export * from '@geenius-adapters/solidjs'
@@ -1,61 +0,0 @@
1
- // @geenius-adapters/solidjs-css — AdapterProvider (SolidJS + vanilla CSS)
2
-
3
- import { createContext, useContext } from 'solid-js'
4
- import { createStore } from 'solid-js/store'
5
- import type { JSX } from 'solid-js'
6
- import type {
7
- AuthAdapter, DbAdapter, PaymentsAdapter, AiAdapter, FileStorageAdapter, AdminAdapter,
8
- AdapterDomain, AdapterStatusInfo,
9
- } from '@geenius-adapters/shared'
10
- import { ADAPTER_DOMAINS, DOMAIN_LABELS } from '@geenius-adapters/shared'
11
-
12
- export interface AdapterSet {
13
- db?: DbAdapter
14
- auth?: AuthAdapter
15
- payments?: PaymentsAdapter
16
- ai?: AiAdapter
17
- storage?: FileStorageAdapter
18
- admin?: AdminAdapter
19
- }
20
-
21
- export interface AdapterContextValue {
22
- adapters: AdapterSet
23
- statuses: Record<AdapterDomain, AdapterStatusInfo>
24
- getAdapter: <K extends keyof AdapterSet>(domain: K) => NonNullable<AdapterSet[K]>
25
- isReady: (domain: AdapterDomain) => boolean
26
- isLoading: boolean
27
- }
28
-
29
- const AdapterContext = createContext<AdapterContextValue>()
30
-
31
- export interface AdapterProviderProps {
32
- adapters: AdapterSet
33
- children: JSX.Element
34
- }
35
-
36
- export function AdapterProvider(props: AdapterProviderProps) {
37
- const init = {} as Record<AdapterDomain, AdapterStatusInfo>
38
- for (const d of ADAPTER_DOMAINS) {
39
- const a = props.adapters[d as keyof AdapterSet]
40
- init[d] = { domain: d, provider: a ? 'configured' : 'none', status: a ? 'connected' : 'disconnected', lastCheckedAt: Date.now() }
41
- }
42
- const [statuses] = createStore(init)
43
-
44
- const getAdapter = <K extends keyof AdapterSet>(domain: K): NonNullable<AdapterSet[K]> => {
45
- const adapter = props.adapters[domain]
46
- if (!adapter) throw new Error(`${DOMAIN_LABELS[domain as AdapterDomain] ?? domain} adapter not configured`)
47
- return adapter as NonNullable<AdapterSet[K]>
48
- }
49
-
50
- const isReady = (domain: AdapterDomain) =>
51
- !!props.adapters[domain as keyof AdapterSet] && statuses[domain]?.status === 'connected'
52
-
53
- const value: AdapterContextValue = { adapters: props.adapters, statuses, getAdapter, isReady, isLoading: false }
54
- return <AdapterContext.Provider value={value}>{props.children}</AdapterContext.Provider>
55
- }
56
-
57
- export function useAdapterContext(): AdapterContextValue {
58
- const ctx = useContext(AdapterContext)
59
- if (!ctx) throw new Error('useAdapterContext must be used within <AdapterProvider>')
60
- return ctx
61
- }
@@ -1,2 +0,0 @@
1
- export { AdapterProvider, useAdapterContext } from './AdapterProvider'
2
- export type { AdapterProviderProps, AdapterSet, AdapterContextValue } from './AdapterProvider'
@@ -1,20 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src",
6
- "jsx": "preserve",
7
- "jsxImportSource": "solid-js",
8
- "strict": true,
9
- "skipLibCheck": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "resolveJsonModule": true,
12
- "isolatedModules": true,
13
- "target": "ES2022",
14
- "module": "ESNext",
15
- "moduleResolution": "bundler"
16
- },
17
- "include": [
18
- "src"
19
- ]
20
- }
@@ -1,2 +0,0 @@
1
- import { defineConfig } from 'tsup'
2
- export default defineConfig({ entry: ['src/index.tsx'], format: ['cjs', 'esm'], dts: true, clean: true, sourcemap: true, external: ['solid-js'] })
@@ -1,2 +0,0 @@
1
- packages:
2
- - "packages/*"
package/tsconfig.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "Bundler",
6
- "declaration": true,
7
- "declarationMap": true,
8
- "sourceMap": true,
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true,
12
- "forceConsistentCasingInFileNames": true,
13
- "resolveJsonModule": true,
14
- "isolatedModules": true,
15
- "jsx": "react-jsx"
16
- }
17
- }