@vertebr/react 0.1.1 → 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 (128) hide show
  1. package/dist/{VertebrAdmin.d.ts → components/admin/VertebrAdmin.d.ts} +3 -1
  2. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -0
  3. package/dist/components/admin/VertebrAdmin.js +375 -0
  4. package/dist/components/config/ConfigForm.d.ts +3 -0
  5. package/dist/components/config/ConfigForm.d.ts.map +1 -0
  6. package/dist/components/config/ConfigForm.js +1 -0
  7. package/dist/components/config/DescriptionInput.d.ts +18 -0
  8. package/dist/components/config/DescriptionInput.d.ts.map +1 -0
  9. package/dist/components/config/DescriptionInput.js +152 -0
  10. package/dist/components/config/ImagePickerModal.d.ts +18 -0
  11. package/dist/components/config/ImagePickerModal.d.ts.map +1 -0
  12. package/dist/components/config/ImagePickerModal.js +120 -0
  13. package/dist/components/config/PriceInput.d.ts +12 -0
  14. package/dist/components/config/PriceInput.d.ts.map +1 -0
  15. package/dist/components/config/PriceInput.js +20 -0
  16. package/dist/components/config/form/ConfigField.d.ts +21 -0
  17. package/dist/components/config/form/ConfigField.d.ts.map +1 -0
  18. package/dist/components/config/form/ConfigField.js +48 -0
  19. package/dist/components/config/form/ConfigForm.d.ts +4 -0
  20. package/dist/components/config/form/ConfigForm.d.ts.map +1 -0
  21. package/dist/components/config/form/ConfigForm.js +70 -0
  22. package/dist/components/config/form/ConfigFormActions.d.ts +10 -0
  23. package/dist/components/config/form/ConfigFormActions.d.ts.map +1 -0
  24. package/dist/components/config/form/ConfigFormActions.js +4 -0
  25. package/dist/components/config/form/RecordConfigForm.d.ts +21 -0
  26. package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -0
  27. package/dist/components/config/form/RecordConfigForm.js +37 -0
  28. package/dist/components/config/form/SettingsConfigForm.d.ts +21 -0
  29. package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -0
  30. package/dist/components/config/form/SettingsConfigForm.js +7 -0
  31. package/dist/components/config/form/helpers.d.ts +16 -0
  32. package/dist/components/config/form/helpers.d.ts.map +1 -0
  33. package/dist/components/config/form/helpers.js +186 -0
  34. package/dist/components/config/form/types.d.ts +27 -0
  35. package/dist/components/config/form/types.d.ts.map +1 -0
  36. package/dist/{EnvSelect.d.ts → components/env/EnvSelect.d.ts} +1 -1
  37. package/dist/components/env/EnvSelect.d.ts.map +1 -0
  38. package/dist/components/gallery/GalleryBoard.d.ts +14 -0
  39. package/dist/components/gallery/GalleryBoard.d.ts.map +1 -0
  40. package/dist/components/gallery/GalleryBoard.js +14 -0
  41. package/dist/components/index.d.ts +9 -0
  42. package/dist/components/index.d.ts.map +1 -0
  43. package/dist/components/index.js +6 -0
  44. package/dist/{MetricsBoard.d.ts → components/metrics/MetricsBoard.d.ts} +1 -1
  45. package/dist/components/metrics/MetricsBoard.d.ts.map +1 -0
  46. package/dist/components/resources/BulkImageUploadModal.d.ts +17 -0
  47. package/dist/components/resources/BulkImageUploadModal.d.ts.map +1 -0
  48. package/dist/components/resources/BulkImageUploadModal.js +47 -0
  49. package/dist/components/resources/ColumnVisibilityMenu.d.ts +11 -0
  50. package/dist/components/resources/ColumnVisibilityMenu.d.ts.map +1 -0
  51. package/dist/components/resources/ColumnVisibilityMenu.js +40 -0
  52. package/dist/components/resources/ImageUploadControl.d.ts +10 -0
  53. package/dist/components/resources/ImageUploadControl.d.ts.map +1 -0
  54. package/dist/components/resources/ImageUploadControl.js +50 -0
  55. package/dist/components/resources/ResourceCell.d.ts +10 -0
  56. package/dist/components/resources/ResourceCell.d.ts.map +1 -0
  57. package/dist/components/resources/ResourceCell.js +100 -0
  58. package/dist/components/resources/ResourceTable.d.ts +34 -0
  59. package/dist/components/resources/ResourceTable.d.ts.map +1 -0
  60. package/dist/components/resources/ResourceTable.js +249 -0
  61. package/dist/components/resources/ResourceViewModal.d.ts +11 -0
  62. package/dist/components/resources/ResourceViewModal.d.ts.map +1 -0
  63. package/dist/components/resources/ResourceViewModal.js +44 -0
  64. package/dist/components/theme/ThemeToggle.d.ts +7 -0
  65. package/dist/components/theme/ThemeToggle.d.ts.map +1 -0
  66. package/dist/components/theme/ThemeToggle.js +10 -0
  67. package/dist/hooks/index.d.ts +5 -0
  68. package/dist/hooks/index.d.ts.map +1 -0
  69. package/dist/hooks/index.js +2 -0
  70. package/dist/{useVertebrControls.d.ts → hooks/useVertebrControls.d.ts} +2 -2
  71. package/dist/hooks/useVertebrControls.d.ts.map +1 -0
  72. package/dist/{useVertebrControls.js → hooks/useVertebrControls.js} +11 -21
  73. package/dist/hooks/useVertebrTheme.d.ts +7 -0
  74. package/dist/hooks/useVertebrTheme.d.ts.map +1 -0
  75. package/dist/hooks/useVertebrTheme.js +38 -0
  76. package/dist/index.d.ts +20 -10
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +14 -6
  79. package/dist/lib/description.d.ts +18 -0
  80. package/dist/lib/description.d.ts.map +1 -0
  81. package/dist/lib/description.js +85 -0
  82. package/dist/lib/images.d.ts +14 -0
  83. package/dist/lib/images.d.ts.map +1 -0
  84. package/dist/lib/images.js +63 -0
  85. package/dist/lib/price.d.ts +15 -0
  86. package/dist/lib/price.d.ts.map +1 -0
  87. package/dist/lib/price.js +50 -0
  88. package/dist/styles/auth.css +39 -0
  89. package/dist/styles/base.css +70 -0
  90. package/dist/styles/buttons.css +86 -0
  91. package/dist/styles/cells.css +178 -0
  92. package/dist/styles/columns.css +103 -0
  93. package/dist/styles/form.css +773 -0
  94. package/dist/styles/gallery.css +90 -0
  95. package/dist/styles/index.css +18 -0
  96. package/dist/styles/main.css +89 -0
  97. package/dist/styles/modal.css +225 -0
  98. package/dist/styles/nav.css +92 -0
  99. package/dist/styles/panel.css +215 -0
  100. package/dist/styles/select.css +151 -0
  101. package/dist/styles/sidebar.css +42 -0
  102. package/dist/styles/states.css +169 -0
  103. package/dist/styles/table.css +101 -0
  104. package/dist/styles/theme-toggle.css +87 -0
  105. package/dist/styles.css +2 -997
  106. package/dist/themes/dark.css +55 -0
  107. package/dist/themes/index.css +2 -0
  108. package/dist/themes/light.css +102 -0
  109. package/package.json +13 -3
  110. package/dist/ConfigForm.d.ts +0 -9
  111. package/dist/ConfigForm.d.ts.map +0 -1
  112. package/dist/ConfigForm.js +0 -87
  113. package/dist/EnvSelect.d.ts.map +0 -1
  114. package/dist/MetricsBoard.d.ts.map +0 -1
  115. package/dist/ResourceTable.d.ts +0 -23
  116. package/dist/ResourceTable.d.ts.map +0 -1
  117. package/dist/ResourceTable.js +0 -112
  118. package/dist/VertebrAdmin.d.ts.map +0 -1
  119. package/dist/VertebrAdmin.js +0 -269
  120. package/dist/client.d.ts +0 -32
  121. package/dist/client.d.ts.map +0 -1
  122. package/dist/client.js +0 -65
  123. package/dist/types.d.ts +0 -103
  124. package/dist/types.d.ts.map +0 -1
  125. package/dist/useVertebrControls.d.ts.map +0 -1
  126. /package/dist/{types.js → components/config/form/types.js} +0 -0
  127. /package/dist/{EnvSelect.js → components/env/EnvSelect.js} +0 -0
  128. /package/dist/{MetricsBoard.js → components/metrics/MetricsBoard.js} +0 -0
@@ -1,269 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useState } from "react";
3
- import { createVertebrClient } from "./client";
4
- import { ConfigForm } from "./ConfigForm";
5
- import { EnvSelect } from "./EnvSelect";
6
- import { MetricsBoard } from "./MetricsBoard";
7
- import { ResourcePanel } from "./ResourceTable";
8
- function readStored(key) {
9
- try {
10
- return localStorage.getItem(key);
11
- }
12
- catch {
13
- return null;
14
- }
15
- }
16
- function writeStored(key, value) {
17
- try {
18
- localStorage.setItem(key, value);
19
- }
20
- catch {
21
- // ignore
22
- }
23
- }
24
- function clearStored(key) {
25
- try {
26
- localStorage.removeItem(key);
27
- }
28
- catch {
29
- // ignore
30
- }
31
- }
32
- export function VertebrAdmin({ apiBase = "/admin/api", title = "Control plane", envStorageKey = "vertebr:env", tokenStorageKey = "vertebr:token", getAccessToken, authUserLabel, onSignOut, }) {
33
- const [environment, setEnvironment] = useState(() => readStored(envStorageKey) ?? "");
34
- const [token, setToken] = useState(() => readStored(tokenStorageKey) ?? "");
35
- const [tokenDraft, setTokenDraft] = useState(token);
36
- const getEnvironment = useCallback(() => environment, [environment]);
37
- const client = useMemo(() => createVertebrClient({
38
- apiBase,
39
- getEnvironment,
40
- getAccessToken: getAccessToken ?? (() => token || null),
41
- }), [apiBase, getEnvironment, getAccessToken, token]);
42
- const [bootstrap, setBootstrap] = useState(null);
43
- const [catalog, setCatalog] = useState(null);
44
- const [selection, setSelection] = useState({ kind: "overview" });
45
- const [resourceData, setResourceData] = useState(null);
46
- const [configData, setConfigData] = useState(null);
47
- const [metricsData, setMetricsData] = useState(null);
48
- const [metricsLoading, setMetricsLoading] = useState(false);
49
- const [error, setError] = useState(null);
50
- const [loading, setLoading] = useState(true);
51
- useEffect(() => {
52
- let cancelled = false;
53
- (async () => {
54
- try {
55
- const next = await client.getBootstrap();
56
- if (cancelled)
57
- return;
58
- setBootstrap(next);
59
- const known = next.environments.map((env) => env.id);
60
- const preferred = (environment && known.includes(environment) && environment) ||
61
- next.defaultEnvironment;
62
- if (preferred !== environment) {
63
- setEnvironment(preferred);
64
- writeStored(envStorageKey, preferred);
65
- }
66
- }
67
- catch (err) {
68
- if (!cancelled) {
69
- setError(err instanceof Error ? err.message : "Failed to load bootstrap");
70
- }
71
- }
72
- })();
73
- return () => {
74
- cancelled = true;
75
- };
76
- }, [client, environment, envStorageKey]);
77
- useEffect(() => {
78
- if (!bootstrap || !environment)
79
- return;
80
- let cancelled = false;
81
- (async () => {
82
- try {
83
- setLoading(true);
84
- setError(null);
85
- const next = await client.getCatalog();
86
- if (cancelled)
87
- return;
88
- setCatalog(next);
89
- setSelection((current) => {
90
- if (current?.kind === "overview")
91
- return current;
92
- if (current?.kind === "resource") {
93
- if (next.resources.some((r) => r.id === current.id))
94
- return current;
95
- }
96
- if (current?.kind === "config") {
97
- if (next.configs.some((c) => c.id === current.id))
98
- return current;
99
- }
100
- if (next.metrics)
101
- return { kind: "overview" };
102
- const firstResource = next.resources[0];
103
- if (firstResource)
104
- return { kind: "resource", id: firstResource.id };
105
- const firstConfig = next.configs[0];
106
- if (firstConfig)
107
- return { kind: "config", id: firstConfig.id };
108
- return { kind: "overview" };
109
- });
110
- }
111
- catch (err) {
112
- if (!cancelled) {
113
- setCatalog(null);
114
- setError(err instanceof Error ? err.message : "Failed to load catalog");
115
- }
116
- }
117
- finally {
118
- if (!cancelled)
119
- setLoading(false);
120
- }
121
- })();
122
- return () => {
123
- cancelled = true;
124
- };
125
- }, [client, bootstrap, environment]);
126
- useEffect(() => {
127
- if (!selection || !catalog)
128
- return;
129
- let cancelled = false;
130
- (async () => {
131
- try {
132
- setError(null);
133
- if (selection.kind === "overview") {
134
- setMetricsLoading(true);
135
- const data = await client.getMetrics();
136
- if (!cancelled) {
137
- setMetricsData(data);
138
- setResourceData(null);
139
- setConfigData(null);
140
- }
141
- }
142
- else if (selection.kind === "resource") {
143
- const data = await client.listResource(selection.id);
144
- if (!cancelled) {
145
- setResourceData(data);
146
- setConfigData(null);
147
- setMetricsData(null);
148
- }
149
- }
150
- else {
151
- const data = await client.getConfig(selection.id);
152
- if (!cancelled) {
153
- setConfigData(data);
154
- setResourceData(null);
155
- setMetricsData(null);
156
- }
157
- }
158
- }
159
- catch (err) {
160
- if (!cancelled) {
161
- setError(err instanceof Error ? err.message : "Failed to load panel");
162
- }
163
- }
164
- finally {
165
- if (!cancelled)
166
- setMetricsLoading(false);
167
- }
168
- })();
169
- return () => {
170
- cancelled = true;
171
- };
172
- }, [client, selection, catalog, environment]);
173
- const refreshResource = useCallback(async () => {
174
- if (selection?.kind !== "resource")
175
- return;
176
- const data = await client.listResource(selection.id);
177
- setResourceData(data);
178
- }, [client, selection]);
179
- const refreshMetrics = useCallback(async () => {
180
- setMetricsLoading(true);
181
- try {
182
- const data = await client.getMetrics();
183
- setMetricsData(data);
184
- }
185
- finally {
186
- setMetricsLoading(false);
187
- }
188
- }, [client]);
189
- const envList = catalog?.environments ?? bootstrap?.environments ?? [];
190
- const activeEnv = envList.find((env) => env.id === environment);
191
- const authRequired = Boolean(activeEnv?.auth?.required);
192
- const switchEnvironment = (nextEnv) => {
193
- if (nextEnv === environment)
194
- return;
195
- const meta = envList.find((env) => env.id === nextEnv);
196
- if (meta?.tone === "danger") {
197
- const ok = window.confirm(`Switch to ${meta.label}? Writes will affect this environment.`);
198
- if (!ok)
199
- return;
200
- }
201
- writeStored(envStorageKey, nextEnv);
202
- setEnvironment(nextEnv);
203
- setResourceData(null);
204
- setConfigData(null);
205
- };
206
- const saveToken = () => {
207
- const next = tokenDraft.trim();
208
- setToken(next);
209
- if (next)
210
- writeStored(tokenStorageKey, next);
211
- else
212
- clearStored(tokenStorageKey);
213
- };
214
- const clearToken = () => {
215
- setToken("");
216
- setTokenDraft("");
217
- clearStored(tokenStorageKey);
218
- };
219
- if (!bootstrap && loading) {
220
- return _jsx("div", { className: "vertebr-loading", children: "Loading Vertebr\u2026" });
221
- }
222
- if (error && !bootstrap) {
223
- return _jsx("div", { className: "vertebr-error", children: error });
224
- }
225
- const activeLabel = selection?.kind === "overview"
226
- ? (catalog?.metrics?.label ?? "Overview")
227
- : selection?.kind === "resource"
228
- ? catalog?.resources.find((r) => r.id === selection.id)?.label
229
- : selection?.kind === "config"
230
- ? catalog?.configs.find((c) => c.id === selection.id)?.label
231
- : null;
232
- return (_jsxs("div", { className: "vertebr-root", "data-env": environment, children: [_jsxs("aside", { className: "vertebr-sidebar", children: [_jsxs("div", { className: "vertebr-sidebar-top", children: [_jsxs("div", { className: "vertebr-brand", children: [_jsx("strong", { children: bootstrap?.brand ?? catalog?.brand ?? "Vertebr" }), _jsx("span", { children: title })] }), envList.length > 0 ? (_jsxs("div", { className: "vertebr-env", children: [_jsx("div", { className: "vertebr-nav-label", children: "Environment" }), _jsx(EnvSelect, { environments: envList, value: environment, onChange: switchEnvironment })] })) : null, _jsxs("nav", { className: "vertebr-nav", children: [catalog?.metrics ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Analytics" }), _jsx("button", { type: "button", "data-active": selection?.kind === "overview", onClick: () => setSelection({ kind: "overview" }), children: catalog.metrics.label })] })) : null, catalog && catalog.resources.length > 0 ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Resources" }), catalog.resources.map((resource) => (_jsx("button", { type: "button", "data-active": selection?.kind === "resource" &&
233
- selection.id === resource.id, onClick: () => setSelection({ kind: "resource", id: resource.id }), children: resource.label }, resource.id)))] })) : null, catalog && catalog.configs.length > 0 ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Config" }), catalog.configs.map((config) => (_jsx("button", { type: "button", "data-active": selection?.kind === "config" && selection.id === config.id, onClick: () => setSelection({ kind: "config", id: config.id }), children: config.label }, config.id)))] })) : null] })] }), _jsxs("div", { className: "vertebr-sidebar-bottom", children: [getAccessToken && authUserLabel ? (_jsxs("div", { className: "vertebr-auth", children: [_jsx("div", { className: "vertebr-nav-label", children: "Signed in" }), _jsx("p", { className: "vertebr-auth-hint", children: authUserLabel }), onSignOut ? (_jsx("button", { type: "button", className: "vertebr-btn", onClick: () => void onSignOut(), children: "Sign out" })) : null] })) : null, !getAccessToken && (authRequired || token) ? (_jsxs("div", { className: "vertebr-auth", children: [_jsx("div", { className: "vertebr-nav-label", children: "Access" }), _jsx("p", { className: "vertebr-auth-hint", children: authRequired
234
- ? `This environment requires auth${activeEnv?.auth?.claimKey
235
- ? ` (${activeEnv.auth.claimKey})`
236
- : ""}.`
237
- : "Optional access token for protected environments." }), _jsx("input", { className: "vertebr-auth-input", type: "password", placeholder: "Bearer token", value: tokenDraft, onChange: (event) => setTokenDraft(event.target.value), autoComplete: "off" }), _jsxs("div", { className: "vertebr-auth-actions", children: [_jsx("button", { type: "button", className: "vertebr-btn vertebr-btn-primary", onClick: saveToken, children: "Use token" }), token ? (_jsx("button", { type: "button", className: "vertebr-btn", onClick: clearToken, children: "Clear" })) : null] })] })) : null] })] }), _jsxs("main", { className: "vertebr-main", children: [_jsxs("header", { className: "vertebr-header", children: [_jsxs("div", { children: [_jsxs("div", { className: "vertebr-heading-row", children: [_jsx("h1", { children: activeLabel ?? (catalog ? "Dashboard" : "Sign in") }), activeEnv ? (_jsx("span", { className: "vertebr-env-badge", "data-tone": activeEnv.tone ?? "neutral", children: activeEnv.label })) : null] }), _jsx("p", { children: !catalog && authRequired
238
- ? "Provide an access token to load this environment."
239
- : selection?.kind === "overview"
240
- ? "Live metrics for the selected environment."
241
- : selection?.kind === "resource"
242
- ? "Manage records scoped to the selected environment."
243
- : selection?.kind === "config"
244
- ? "Owner-managed config for this environment."
245
- : "Select a panel." })] }), error ? (_jsx("span", { className: "vertebr-status", "data-tone": "danger", children: error })) : null] }), _jsx("div", { className: "vertebr-content", children: catalog ? (_jsxs("section", { className: "vertebr-panel", children: [selection?.kind === "overview" ? (_jsx(MetricsBoard, { label: metricsData?.label ?? catalog.metrics?.label, metrics: metricsData?.metrics ?? [], loading: metricsLoading, onRefresh: () => void refreshMetrics() })) : null, selection?.kind === "resource" && resourceData ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "vertebr-panel-head", children: [_jsx("h2", { children: "Records" }), _jsx("span", { className: "vertebr-count", children: resourceData.items.length })] }), _jsx(ResourcePanel, { schema: resourceData.schema, items: resourceData.items, permissions: resourceData.permissions, actions: resourceData.actions, onUpdate: resourceData.permissions.update
246
- ? async (rowId, value) => {
247
- await client.updateResource(resourceData.id, rowId, value);
248
- await refreshResource();
249
- }
250
- : undefined, onDelete: resourceData.permissions.delete
251
- ? async (rowId) => {
252
- await client.deleteResource(resourceData.id, rowId);
253
- await refreshResource();
254
- }
255
- : undefined, onAction: async (rowId, actionId) => {
256
- await client.runResourceAction(resourceData.id, rowId, actionId);
257
- await refreshResource();
258
- } })] })) : null, selection?.kind === "config" && configData ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "vertebr-panel-head", children: [_jsx("h2", { children: "Settings" }), _jsxs("span", { className: "vertebr-count", children: [Object.keys(configData.schema).length, " fields"] })] }), _jsx(ConfigForm, { schema: configData.schema, value: configData.value, onSave: async (next) => {
259
- const saved = await client.setConfig(configData.id, next);
260
- setConfigData({
261
- ...configData,
262
- value: saved.value,
263
- });
264
- } })] })) : null] })) : (_jsx("section", { className: "vertebr-panel", children: _jsx("div", { className: "vertebr-empty", children: authRequired
265
- ? "Authenticated access required for this environment."
266
- : loading
267
- ? "Loading…"
268
- : "Unable to load catalog." }) })) })] })] }));
269
- }
package/dist/client.d.ts DELETED
@@ -1,32 +0,0 @@
1
- import type { BootstrapResponse, CatalogResponse, ConfigResponse, MetricsResponse, ResourceListResponse } from "./types";
2
- export declare const VERTEBR_ENV_HEADER = "x-vertebr-env";
3
- export type VertebrClientOptions = {
4
- apiBase: string;
5
- getEnvironment: () => string;
6
- getAccessToken?: () => string | null | undefined | Promise<string | null | undefined>;
7
- };
8
- export type VertebrClient = {
9
- getBootstrap: () => Promise<BootstrapResponse>;
10
- getCatalog: () => Promise<CatalogResponse>;
11
- getMetrics: () => Promise<MetricsResponse>;
12
- listResource: (id: string) => Promise<ResourceListResponse>;
13
- createResource: (id: string, value: Record<string, unknown>) => Promise<{
14
- ok: boolean;
15
- item: Record<string, unknown>;
16
- }>;
17
- updateResource: (id: string, rowId: string, value: Record<string, unknown>) => Promise<{
18
- ok: boolean;
19
- item: Record<string, unknown>;
20
- }>;
21
- deleteResource: (id: string, rowId: string) => Promise<{
22
- ok: boolean;
23
- }>;
24
- runResourceAction: (id: string, rowId: string, actionId: string, input?: Record<string, unknown>) => Promise<{
25
- ok: boolean;
26
- result?: unknown;
27
- }>;
28
- getConfig: (id: string) => Promise<ConfigResponse>;
29
- setConfig: (id: string, value: Record<string, unknown>) => Promise<ConfigResponse>;
30
- };
31
- export declare function createVertebrClient(apiBaseOrOptions: string | VertebrClientOptions, getEnvironment?: () => string): VertebrClient;
32
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MACb,MAAM,GACN,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9B,iBAAiB,EAAE,CACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChD,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,SAAS,EAAE,CACT,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9B,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,GAAG,oBAAoB,EAC/C,cAAc,CAAC,EAAE,MAAM,MAAM,GAC5B,aAAa,CA4Ff"}
package/dist/client.js DELETED
@@ -1,65 +0,0 @@
1
- export const VERTEBR_ENV_HEADER = "x-vertebr-env";
2
- export function createVertebrClient(apiBaseOrOptions, getEnvironment) {
3
- const options = typeof apiBaseOrOptions === "string"
4
- ? {
5
- apiBase: apiBaseOrOptions,
6
- getEnvironment: getEnvironment ?? (() => ""),
7
- }
8
- : apiBaseOrOptions;
9
- const base = options.apiBase.replace(/\/$/, "");
10
- async function request(path, init, opts) {
11
- const env = options.getEnvironment().trim();
12
- const rawToken = await options.getAccessToken?.();
13
- const token = rawToken?.trim();
14
- const response = await fetch(`${base}${path}`, {
15
- ...init,
16
- headers: {
17
- Accept: "application/json",
18
- "Content-Type": "application/json",
19
- ...(env ? { [VERTEBR_ENV_HEADER]: env } : {}),
20
- ...(opts?.auth !== false && token
21
- ? { Authorization: `Bearer ${token}` }
22
- : {}),
23
- ...(init?.headers ?? {}),
24
- },
25
- });
26
- if (!response.ok) {
27
- const text = await response.text();
28
- throw new Error(text || `Request failed (${response.status})`);
29
- }
30
- return (await response.json());
31
- }
32
- return {
33
- getBootstrap: () => request("/bootstrap", undefined, { auth: false }),
34
- getCatalog: () => request(""),
35
- getMetrics: () => request("/metrics"),
36
- listResource: (id) => request(`/resources/${encodeURIComponent(id)}`),
37
- createResource: (id, value) => request(`/resources/${encodeURIComponent(id)}`, {
38
- method: "POST",
39
- body: JSON.stringify(value),
40
- }),
41
- updateResource: (id, rowId, value) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}`, {
42
- method: "PUT",
43
- body: JSON.stringify(value),
44
- }),
45
- deleteResource: (id, rowId) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}`, { method: "DELETE" }),
46
- runResourceAction: (id, rowId, actionId, input) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}/actions/${encodeURIComponent(actionId)}`, {
47
- method: "POST",
48
- body: JSON.stringify(input ?? {}),
49
- }),
50
- getConfig: (id) => request(`/configs/${encodeURIComponent(id)}`),
51
- setConfig: async (id, value) => {
52
- const result = await request(`/configs/${encodeURIComponent(id)}`, {
53
- method: "PUT",
54
- body: JSON.stringify(value),
55
- });
56
- return {
57
- id: result.id,
58
- label: id,
59
- schema: {},
60
- environment: result.environment,
61
- value: result.value,
62
- };
63
- },
64
- };
65
- }
package/dist/types.d.ts DELETED
@@ -1,103 +0,0 @@
1
- export type FieldType = "string" | "number" | "boolean" | "datetime" | "richtext" | "enum" | "enum[]" | "file[]";
2
- export type FieldSchema = {
3
- type: FieldType;
4
- label?: string;
5
- required?: boolean;
6
- readOnly?: boolean;
7
- unique?: boolean;
8
- min?: number;
9
- max?: number;
10
- default?: unknown;
11
- options?: string[];
12
- };
13
- export type EnvironmentAuthPublic = {
14
- required: boolean;
15
- claimKey?: string;
16
- roles?: string[];
17
- client?: {
18
- provider: "firebase";
19
- config: {
20
- apiKey: string;
21
- authDomain: string;
22
- projectId: string;
23
- appId: string;
24
- messagingSenderId?: string;
25
- };
26
- methods?: Array<"email" | "google">;
27
- };
28
- };
29
- export type AdminEnvironment = {
30
- id: string;
31
- label: string;
32
- tone?: "neutral" | "warn" | "danger";
33
- auth?: EnvironmentAuthPublic;
34
- };
35
- export type CatalogResource = {
36
- id: string;
37
- label: string;
38
- schema: Record<string, FieldSchema>;
39
- permissions: {
40
- create?: boolean;
41
- update?: boolean;
42
- delete?: boolean;
43
- };
44
- };
45
- export type CatalogConfig = {
46
- id: string;
47
- label: string;
48
- schema: Record<string, FieldSchema>;
49
- };
50
- export type BootstrapResponse = {
51
- ok: boolean;
52
- brand: string;
53
- defaultEnvironment: string;
54
- environments: AdminEnvironment[];
55
- };
56
- export type CatalogResponse = {
57
- ok: boolean;
58
- brand: string;
59
- environment: string;
60
- environments: AdminEnvironment[];
61
- defaultEnvironment: string;
62
- resources: CatalogResource[];
63
- configs: CatalogConfig[];
64
- metrics?: {
65
- id: string;
66
- label: string;
67
- } | null;
68
- };
69
- export type ResourceActionMeta = {
70
- label: string;
71
- input?: Record<string, FieldType>;
72
- };
73
- export type ResourceListResponse = {
74
- id: string;
75
- label: string;
76
- schema: Record<string, FieldSchema>;
77
- environment?: string;
78
- permissions: CatalogResource["permissions"];
79
- actions?: Record<string, ResourceActionMeta>;
80
- items: Record<string, unknown>[];
81
- };
82
- export type MetricCard = {
83
- id: string;
84
- label: string;
85
- value: string | number;
86
- hint?: string;
87
- tone?: "neutral" | "ok" | "warn" | "danger";
88
- };
89
- export type MetricsResponse = {
90
- ok: boolean;
91
- id: string;
92
- label: string;
93
- environment?: string;
94
- metrics: MetricCard[];
95
- };
96
- export type ConfigResponse = {
97
- id: string;
98
- label: string;
99
- schema: Record<string, FieldSchema>;
100
- environment?: string;
101
- value: Record<string, unknown>;
102
- };
103
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVertebrControls.d.ts","sourceRoot":"","sources":["../src/useVertebrControls.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzE,KAAK,oBAAoB,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAIF,MAAM,MAAM,4BAA4B,GAAG;IACzC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AA2BF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,OAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,4BAA4B,+BA8B9B;AAYD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,GACV;IACD,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAMA;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}