@vard-app/sdk 0.1.3 → 0.1.4

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 CHANGED
@@ -1,70 +1,50 @@
1
- # @vard/sdk
1
+ # Vard SDK
2
2
 
3
- The Vard SDK lets developers annotate variables in their Next.js site so clients can edit them through the Vard portal — without touching code.
3
+ The modern, schema-first content layer for Next.js.
4
4
 
5
- ## Install
5
+ ## Installation
6
6
 
7
7
  ```bash
8
- pnpm add @vard-app/sdk
8
+ npm install @vard/sdk
9
9
  ```
10
10
 
11
- ## Quick start
11
+ ## Quick Start
12
12
 
13
- ### 1. Create your vard client
13
+ ### 1. Define your client
14
14
 
15
- ```ts
16
- // lib/vard.ts
17
- import { createVard } from "@vard-app/sdk";
18
- import { createVardNextAdapter } from "@vard-app/sdk/next";
15
+ Setup a shared client instance in your project (e.g. `lib/vard.ts`).
16
+
17
+ ```typescript
18
+ import { createVard, v } from "@vard/sdk";
19
+ import { createVardNextAdapter } from "@vard/sdk/next";
19
20
 
20
21
  export const vard = createVard({
21
- workspaceId: process.env.VARD_WORKSPACE_ID,
22
+ apiKey: process.env.VARD_API_KEY,
22
23
  store: createVardNextAdapter(),
24
+ schema: {
25
+ hero: {
26
+ title: v.string("Welcome to Vard"),
27
+ image: v.image("/hero.jpg"),
28
+ },
29
+ features: v.collection({
30
+ title: v.string(),
31
+ icon: v.image(),
32
+ }),
33
+ },
23
34
  });
24
35
  ```
25
36
 
26
- ### 2. Use variables anywhere in your site
27
-
28
- ```tsx
29
- // app/page.tsx
30
- import { vard } from "@/lib/vard";
31
-
32
- export default function HomePage() {
33
- const heroTitle = vard.string("hero.title", "Welcome to our site");
34
- const heroCopy = vard.richtext("hero.copy", "We build great things.");
35
- const primaryColor = vard.color("theme.primary", "#2563eb");
36
- const heroImage = vard.image("hero.image", "/default-hero.jpg");
37
- const showBanner = vard.boolean("banner.show", false);
38
-
39
- const team = vard.list(
40
- "team.members",
41
- { name: "string", role: "string", photo: "image" },
42
- [{ name: "Jane Doe", role: "Founder", photo: "/jane.jpg" }],
43
- { label: "Team Members" }
44
- );
45
-
46
- return (
47
- <main style={{ "--primary": primaryColor } as React.CSSProperties}>
48
- {showBanner && <Banner />}
49
- <h1>{heroTitle}</h1>
50
- <p dangerouslySetInnerHTML={{ __html: heroCopy }} />
51
- {team.map((member) => (
52
- <TeamCard key={member.name} {...member} />
53
- ))}
54
- </main>
55
- );
56
- }
57
- ```
37
+ ### 2. Prefetch in Layout (App Router)
58
38
 
59
- ### 3. Prefetch values in your layout (App Router)
39
+ To ensure zero-layout shift, prefetch values in your root layout.
60
40
 
61
41
  ```tsx
62
42
  // app/layout.tsx
63
- import { createVardNextAdapter, prefetchVardValues } from "@vard/sdk/next";
43
+ import { prefetchVardValues } from "@vard/sdk/next";
64
44
  import { vard } from "@/lib/vard";
65
45
 
66
- export default async function RootLayout({ children }: { children: React.ReactNode }) {
67
- await prefetchVardValues(vard.store as ReturnType<typeof createVardNextAdapter>);
46
+ export default async function RootLayout({ children }) {
47
+ await prefetchVardValues(vard);
68
48
  return (
69
49
  <html>
70
50
  <body>{children}</body>
@@ -73,36 +53,42 @@ export default async function RootLayout({ children }: { children: React.ReactNo
73
53
  }
74
54
  ```
75
55
 
76
- ## Variable types
56
+ ### 3. Use in Server Components
77
57
 
78
- | Method | Type | Client UI |
79
- | ----------------- | ---------------------- | ---------------- |
80
- | `vard.string()` | Plain text | Text input |
81
- | `vard.richtext()` | Markdown | Rich text editor |
82
- | `vard.color()` | CSS color string | Color picker |
83
- | `vard.image()` | Asset URL | Image uploader |
84
- | `vard.boolean()` | `true` / `false` | Toggle switch |
85
- | `vard.list()` | Array of typed objects | Repeater |
58
+ Retrieve your entire content structure with a single, type-safe call.
86
59
 
87
- ## Permissions
60
+ ```tsx
61
+ // app/page.tsx
62
+ import { vard } from "@/lib/vard";
88
63
 
89
- Each variable can restrict which role can edit it:
64
+ export default async function Page() {
65
+ const { hero, features } = await vard.get();
90
66
 
91
- ```ts
92
- vard.color("theme.primary", "#2563eb", {
93
- label: "Brand Color",
94
- editableBy: "owner", // only owners can change this
95
- });
67
+ return (
68
+ <main>
69
+ <h1>{hero.title}</h1>
70
+ <img src={hero.image} />
71
+
72
+ <ul>
73
+ {features.map((f) => (
74
+ <li key={f.title}>{f.title}</li>
75
+ ))}
76
+ </ul>
77
+ </main>
78
+ );
79
+ }
96
80
  ```
97
81
 
98
- Roles: `owner` > `developer` > `member` > `viewer`
99
-
100
- ## Local development
82
+ ## Schema-First Features
101
83
 
102
- If `VARD_WORKSPACE_ID` is not set, the SDK returns default values for every variable — your site works perfectly without a Vard account during development.
84
+ - **Type Safety**: Full TypeScript inference out of the box. No manual interfaces required.
85
+ - **Auto-Sync**: In `development` mode, the SDK automatically syncs your schema to the Vard dashboard.
86
+ - **Hierarchical Data**: Define nested objects and collections to match your UI perfectly.
87
+ - **Backward Compatibility**: Standard `vard.string(key, fallback)` methods still work for simple use cases.
103
88
 
104
- ## Environment variables
89
+ ## Environment Variables
105
90
 
106
- | Variable | Description |
107
- | ------------------- | ---------------------- |
108
- | `VARD_WORKSPACE_ID` | Your Vard workspace ID |
91
+ | Variable | Description |
92
+ | --------------- | ---------------------------------------------------- |
93
+ | `VARD_API_KEY` | Your workspace API Key (Required for production) |
94
+ | `VARD_API_BASE` | Optional custom API base (Defaults to dash.vard.app) |
package/dist/index.d.mts CHANGED
@@ -1,30 +1,17 @@
1
- import { V as VardOptions, a as VardClient, b as VardStore } from './types-eJuYa65b.mjs';
2
- export { I as InferListItem, c as VardListItemSchema, d as VardRole, e as VardVariableDefinition, f as VardVariableOptions, g as VardVariableType } from './types-eJuYa65b.mjs';
1
+ import { V as VardSchema, a as VardOptions, b as VardClient, c as VardStore } from './types-Dd-I7jwP.mjs';
2
+ export { I as InferListItem, d as InferSchema, M as MergeSchema, e as VardListItemSchema, f as VardRole, g as VardSchemaFragment, h as VardVariableDefinition, i as VardVariableOptions, j as VardVariableType, v } from './types-Dd-I7jwP.mjs';
3
3
 
4
4
  /**
5
5
  * Creates a Vard client instance. Call this once at the top of your site
6
6
  * (e.g. in `lib/vard.ts`) and export the result.
7
- *
8
- * @example
9
- * // lib/vard.ts
10
- * import { createVard } from "@vard/sdk"
11
- * export const vard = createVard({ apiKey: "..." })
12
- *
13
- * // app/page.tsx
14
- * import { vard } from "@/lib/vard"
15
- * const title = vard.string("hero.title", "Hello, world")
16
7
  */
17
- declare function createVard(options?: VardOptions): VardClient;
8
+ declare function createVard<S extends VardSchema = any>(options?: VardOptions<S>): VardClient<S>;
18
9
 
19
10
  interface VardFetchStoreOptions {
20
11
  /**
21
12
  * Base URL of the Vard API. Defaults to https://api.vard.app
22
13
  */
23
14
  apiBase?: string;
24
- /**
25
- * Workspace ID (Legacy). Defaults to process.env.VARD_WORKSPACE_ID.
26
- */
27
- workspaceId?: string;
28
15
  /**
29
16
  * API Key for authentication. Defaults to process.env.VARD_API_KEY.
30
17
  */
@@ -42,4 +29,4 @@ declare function createVardFetchStore(options?: VardFetchStoreOptions): VardStor
42
29
  prefetch(): Promise<void>;
43
30
  };
44
31
 
45
- export { VardClient, VardOptions, VardStore, createVard, createVardFetchStore };
32
+ export { VardClient, VardOptions, VardSchema, VardStore, createVard, createVardFetchStore };
package/dist/index.d.ts CHANGED
@@ -1,30 +1,17 @@
1
- import { V as VardOptions, a as VardClient, b as VardStore } from './types-eJuYa65b.js';
2
- export { I as InferListItem, c as VardListItemSchema, d as VardRole, e as VardVariableDefinition, f as VardVariableOptions, g as VardVariableType } from './types-eJuYa65b.js';
1
+ import { V as VardSchema, a as VardOptions, b as VardClient, c as VardStore } from './types-Dd-I7jwP.js';
2
+ export { I as InferListItem, d as InferSchema, M as MergeSchema, e as VardListItemSchema, f as VardRole, g as VardSchemaFragment, h as VardVariableDefinition, i as VardVariableOptions, j as VardVariableType, v } from './types-Dd-I7jwP.js';
3
3
 
4
4
  /**
5
5
  * Creates a Vard client instance. Call this once at the top of your site
6
6
  * (e.g. in `lib/vard.ts`) and export the result.
7
- *
8
- * @example
9
- * // lib/vard.ts
10
- * import { createVard } from "@vard/sdk"
11
- * export const vard = createVard({ apiKey: "..." })
12
- *
13
- * // app/page.tsx
14
- * import { vard } from "@/lib/vard"
15
- * const title = vard.string("hero.title", "Hello, world")
16
7
  */
17
- declare function createVard(options?: VardOptions): VardClient;
8
+ declare function createVard<S extends VardSchema = any>(options?: VardOptions<S>): VardClient<S>;
18
9
 
19
10
  interface VardFetchStoreOptions {
20
11
  /**
21
12
  * Base URL of the Vard API. Defaults to https://api.vard.app
22
13
  */
23
14
  apiBase?: string;
24
- /**
25
- * Workspace ID (Legacy). Defaults to process.env.VARD_WORKSPACE_ID.
26
- */
27
- workspaceId?: string;
28
15
  /**
29
16
  * API Key for authentication. Defaults to process.env.VARD_API_KEY.
30
17
  */
@@ -42,4 +29,4 @@ declare function createVardFetchStore(options?: VardFetchStoreOptions): VardStor
42
29
  prefetch(): Promise<void>;
43
30
  };
44
31
 
45
- export { VardClient, VardOptions, VardStore, createVard, createVardFetchStore };
32
+ export { VardClient, VardOptions, VardSchema, VardStore, createVard, createVardFetchStore };
package/dist/index.js CHANGED
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  createVard: () => createVard,
24
- createVardFetchStore: () => createVardFetchStore
24
+ createVardFetchStore: () => createVardFetchStore,
25
+ v: () => v
25
26
  });
26
27
  module.exports = __toCommonJS(src_exports);
27
28
 
@@ -29,15 +30,15 @@ module.exports = __toCommonJS(src_exports);
29
30
  function createVardFetchStore(options = {}) {
30
31
  const {
31
32
  apiBase = options.apiBase ?? process.env.VARD_API_BASE ?? process.env.NEXT_PUBLIC_VARD_API_BASE ?? "https://dash.vard.app",
32
- workspaceId = options.workspaceId ?? process.env.VARD_WORKSPACE_ID,
33
33
  apiKey = options.apiKey ?? process.env.VARD_API_KEY,
34
34
  fetchOptions = {}
35
35
  } = options;
36
36
  let resolvedValues = null;
37
+ let structuredContent = null;
37
38
  let fetchPromise = null;
38
39
  async function fetchValues() {
39
40
  const isDevelopment = process.env.NODE_ENV === "development";
40
- if (!apiKey && !workspaceId) {
41
+ if (!apiKey) {
41
42
  if (!isDevelopment) {
42
43
  console.error(
43
44
  "\x1B[31m[vard] Missing configuration! VARD_API_KEY is not set.\x1B[0m\nPlease set this environment variable in your production environment."
@@ -47,37 +48,51 @@ function createVardFetchStore(options = {}) {
47
48
  "[vard] No API Key found. Running in local fallback mode (using default values)."
48
49
  );
49
50
  }
50
- return /* @__PURE__ */ new Map();
51
+ return { variables: /* @__PURE__ */ new Map(), structured: {} };
51
52
  }
52
- const url = apiKey ? `${apiBase}/api/content/variables` : `${apiBase}/v1/workspaces/${workspaceId}/variables`;
53
+ const url = `${apiBase}/api/content/variables?structured=true`;
53
54
  try {
54
55
  const res = await fetch(url, {
55
56
  ...fetchOptions,
56
57
  headers: {
57
58
  ...fetchOptions.headers,
58
- ...apiKey ? { "X-Vard-API-Key": apiKey } : {}
59
+ "X-Vard-API-Key": apiKey
59
60
  }
60
61
  });
61
62
  if (!res.ok) {
62
63
  console.warn(`[vard] Failed to fetch variables: ${res.status}`);
63
- return /* @__PURE__ */ new Map();
64
+ return { variables: /* @__PURE__ */ new Map(), structured: {} };
64
65
  }
65
66
  const data = await res.json();
66
- return new Map(data.map((v) => [v.key, v.value]));
67
+ if (Array.isArray(data)) {
68
+ return {
69
+ variables: new Map(data.map((v2) => [v2.key, v2.value])),
70
+ structured: {}
71
+ };
72
+ }
73
+ return {
74
+ variables: new Map(data.variables.map((v2) => [v2.key, v2.value])),
75
+ structured: data.structured || {}
76
+ };
67
77
  } catch (err) {
68
- return /* @__PURE__ */ new Map();
78
+ return { variables: /* @__PURE__ */ new Map(), structured: {} };
69
79
  }
70
80
  }
71
81
  return {
72
82
  get(key) {
73
83
  return resolvedValues?.get(key);
74
84
  },
85
+ getStructured() {
86
+ return structuredContent;
87
+ },
75
88
  async prefetch() {
76
89
  if (resolvedValues) return;
77
90
  if (!fetchPromise) {
78
91
  fetchPromise = fetchValues();
79
92
  }
80
- resolvedValues = await fetchPromise;
93
+ const result = await fetchPromise;
94
+ resolvedValues = result.variables;
95
+ structuredContent = result.structured;
81
96
  }
82
97
  };
83
98
  }
@@ -96,7 +111,7 @@ var noopStore = {
96
111
  }
97
112
  };
98
113
  function createVard(options = {}) {
99
- const store = options.store ?? (options.apiKey || options.workspaceId ? createVardFetchStore(options) : noopStore);
114
+ const store = options.store ?? (options.apiKey ? createVardFetchStore(options) : noopStore);
100
115
  const registry = [];
101
116
  function register(def) {
102
117
  if (!registry.find((d) => d.key === def.key)) {
@@ -108,7 +123,85 @@ function createVard(options = {}) {
108
123
  }
109
124
  return def.defaultValue;
110
125
  }
126
+ function flattenSchema(schema, prefix = "") {
127
+ const result = {};
128
+ for (const [key, value] of Object.entries(schema)) {
129
+ const fullKey = prefix ? `${prefix}.${key}` : key;
130
+ if (typeof value === "object" && value !== null && "type" in value) {
131
+ const field = value;
132
+ if (field.type === "collection") {
133
+ const collection = field;
134
+ const listItemSchema = {};
135
+ for (const [fKey, fVal] of Object.entries(collection.schema)) {
136
+ listItemSchema[fKey] = fVal.type;
137
+ }
138
+ register({
139
+ key: fullKey,
140
+ label: labelFromKey(key),
141
+ type: "list",
142
+ defaultValue: [],
143
+ editableBy: "member",
144
+ listItemSchema,
145
+ isCollection: true
146
+ });
147
+ Object.defineProperty(result, key, {
148
+ get: () => store.get(fullKey) ?? [],
149
+ enumerable: true
150
+ });
151
+ } else {
152
+ const vardField = field;
153
+ register({
154
+ key: fullKey,
155
+ label: vardField.label ?? labelFromKey(key),
156
+ description: vardField.description,
157
+ type: vardField.type,
158
+ defaultValue: vardField.default,
159
+ editableBy: vardField.editableBy ?? "member",
160
+ group: vardField.group
161
+ });
162
+ Object.defineProperty(result, key, {
163
+ get: () => store.get(fullKey) ?? vardField.default,
164
+ enumerable: true
165
+ });
166
+ }
167
+ } else if (typeof value === "object" && value !== null) {
168
+ result[key] = flattenSchema(value, fullKey);
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ if (options.schema && process.env.NODE_ENV === "development" && options.apiKey) {
174
+ flattenSchema(options.schema);
175
+ const definitions = [...registry];
176
+ const apiBase = process.env.VARD_API_BASE ?? process.env.NEXT_PUBLIC_VARD_API_BASE ?? "https://dash.vard.app";
177
+ fetch(`${apiBase}/api/content/variables/sync`, {
178
+ method: "POST",
179
+ headers: {
180
+ "Content-Type": "application/json",
181
+ "X-Vard-API-Key": options.apiKey
182
+ },
183
+ body: JSON.stringify({
184
+ definitions,
185
+ schema: options.schema
186
+ })
187
+ }).catch((err) => console.warn("[vard] Auto-sync failed:", err));
188
+ }
111
189
  const client = {
190
+ define(schema) {
191
+ return flattenSchema(schema);
192
+ },
193
+ async get() {
194
+ if (store.prefetch) {
195
+ await store.prefetch();
196
+ }
197
+ if (store.getStructured) {
198
+ const structured = store.getStructured();
199
+ if (structured && Object.keys(structured).length > 0) {
200
+ return structured;
201
+ }
202
+ }
203
+ return flattenSchema(options.schema ?? {});
204
+ },
112
205
  string(key, fallback, opts = {}) {
113
206
  return register({
114
207
  key,
@@ -209,6 +302,14 @@ function createVard(options = {}) {
209
302
  return client.list(key, schema, fallback, { ...opts, group: "Global" });
210
303
  }
211
304
  },
305
+ extend(fragment) {
306
+ const mergedSchema = { ...options.schema ?? {}, ...fragment };
307
+ return createVard({
308
+ ...options,
309
+ schema: mergedSchema,
310
+ store
311
+ });
312
+ },
212
313
  getDefinitions() {
213
314
  return [...registry];
214
315
  },
@@ -220,9 +321,57 @@ function labelFromKey(key) {
220
321
  const lastSegment = key.split(".").pop() ?? key;
221
322
  return lastSegment.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).trim();
222
323
  }
324
+
325
+ // src/schema.ts
326
+ var v = {
327
+ string: (defaultValue, opts = {}) => ({
328
+ type: "string",
329
+ default: defaultValue,
330
+ ...opts
331
+ }),
332
+ richtext: (defaultValue, opts = {}) => ({
333
+ type: "richtext",
334
+ default: defaultValue,
335
+ ...opts
336
+ }),
337
+ color: (defaultValue, opts = {}) => ({
338
+ type: "color",
339
+ default: defaultValue,
340
+ ...opts
341
+ }),
342
+ image: (defaultValue, opts = {}) => ({
343
+ type: "image",
344
+ default: defaultValue,
345
+ ...opts
346
+ }),
347
+ boolean: (defaultValue, opts = {}) => ({
348
+ type: "boolean",
349
+ default: defaultValue,
350
+ ...opts
351
+ }),
352
+ collection: (schema) => ({
353
+ type: "collection",
354
+ schema
355
+ }),
356
+ /**
357
+ * Creates a reusable schema fragment that can be merged into a Vard client
358
+ * via `vard.extend(fragment)`. Co-locate this with your page/component.
359
+ *
360
+ * @example
361
+ * // app/therapists/schema.ts
362
+ * export const therapistSchema = v.schema({
363
+ * therapists: v.collection({ name: v.string(), photo: v.image() }),
364
+ * });
365
+ *
366
+ * // app/therapists/page.tsx
367
+ * const { therapists } = await vard.extend(therapistSchema).get();
368
+ */
369
+ schema: (schema) => schema
370
+ };
223
371
  // Annotate the CommonJS export names for ESM import in node:
224
372
  0 && (module.exports = {
225
373
  createVard,
226
- createVardFetchStore
374
+ createVardFetchStore,
375
+ v
227
376
  });
228
377
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fetch-store.ts","../src/client.ts"],"sourcesContent":["// Public entrypoint for @vard/sdk\nexport { createVard } from \"./client\";\nexport { createVardFetchStore } from \"./fetch-store\";\nexport type {\n VardClient,\n VardOptions,\n VardStore,\n VardVariableDefinition,\n VardVariableType,\n VardVariableOptions,\n VardListItemSchema,\n InferListItem,\n VardRole,\n} from \"./types\";\n","import type { VardStore } from \"./types\";\n\nexport interface VardFetchStoreOptions {\n /**\n * Base URL of the Vard API. Defaults to https://api.vard.app\n */\n apiBase?: string;\n\n /**\n * Workspace ID (Legacy). Defaults to process.env.VARD_WORKSPACE_ID.\n */\n workspaceId?: string;\n\n /**\n * API Key for authentication. Defaults to process.env.VARD_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Custom fetch options (headers, etc.)\n */\n fetchOptions?: RequestInit;\n}\n\n/**\n * Creates a universal VardStore that fetches variable values from the Vard API.\n * Works in any environment with a global `fetch` (Browsers, Node 18+, Bun, Deno).\n */\nexport function createVardFetchStore(\n options: VardFetchStoreOptions = {}\n): VardStore & { prefetch(): Promise<void> } {\n const {\n apiBase = options.apiBase ??\n process.env.VARD_API_BASE ??\n process.env.NEXT_PUBLIC_VARD_API_BASE ??\n \"https://dash.vard.app\",\n workspaceId = options.workspaceId ?? process.env.VARD_WORKSPACE_ID,\n apiKey = options.apiKey ?? process.env.VARD_API_KEY,\n fetchOptions = {},\n } = options;\n\n let resolvedValues: Map<string, unknown> | null = null;\n let fetchPromise: Promise<Map<string, unknown>> | null = null;\n\n async function fetchValues(): Promise<Map<string, unknown>> {\n const isDevelopment = process.env.NODE_ENV === \"development\";\n\n if (!apiKey && !workspaceId) {\n if (!isDevelopment) {\n console.error(\n \"\\x1b[31m[vard] Missing configuration! VARD_API_KEY is not set.\\x1b[0m\\n\" +\n \"Please set this environment variable in your production environment.\"\n );\n } else {\n console.warn(\n \"[vard] No API Key found. Running in local fallback mode (using default values).\"\n );\n }\n return new Map();\n }\n\n const url = apiKey\n ? `${apiBase}/api/content/variables`\n : `${apiBase}/v1/workspaces/${workspaceId}/variables`;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...fetchOptions.headers,\n ...(apiKey ? { \"X-Vard-API-Key\": apiKey } : {}),\n },\n });\n\n if (!res.ok) {\n console.warn(`[vard] Failed to fetch variables: ${res.status}`);\n return new Map();\n }\n\n const data = (await res.json()) as { key: string; value: unknown }[];\n\n return new Map(data.map((v) => [v.key, v.value]));\n } catch (err) {\n return new Map();\n }\n }\n\n return {\n get(key: string): unknown {\n return resolvedValues?.get(key);\n },\n\n async prefetch(): Promise<void> {\n if (resolvedValues) return;\n if (!fetchPromise) {\n fetchPromise = fetchValues();\n }\n resolvedValues = await fetchPromise;\n },\n };\n}\n","import type {\n VardClient,\n VardOptions,\n VardStore,\n VardVariableDefinition,\n VardVariableOptions,\n VardListItemSchema,\n InferListItem,\n VardRole,\n} from \"./types\";\n\n// ─────────────────────────────────────────────\n// No-op store (used in local dev when no workspaceId is set)\n// ─────────────────────────────────────────────\n\nlet hasLoggedNoop = false;\nconst noopStore: VardStore = {\n get: () => {\n if (!hasLoggedNoop && process.env.NODE_ENV !== \"test\") {\n console.warn(\n \"[vard] Using default values for all variables because no Store was provided to createVard().\"\n );\n hasLoggedNoop = true;\n }\n return undefined;\n },\n};\n\n// ─────────────────────────────────────────────\n// createVard — the main SDK factory\n// ─────────────────────────────────────────────\n\nimport { createVardFetchStore } from \"./fetch-store\";\n\n/**\n * Creates a Vard client instance. Call this once at the top of your site\n * (e.g. in `lib/vard.ts`) and export the result.\n *\n * @example\n * // lib/vard.ts\n * import { createVard } from \"@vard/sdk\"\n * export const vard = createVard({ apiKey: \"...\" })\n *\n * // app/page.tsx\n * import { vard } from \"@/lib/vard\"\n * const title = vard.string(\"hero.title\", \"Hello, world\")\n */\nexport function createVard(options: VardOptions = {}): VardClient {\n const store: VardStore =\n options.store ??\n (options.apiKey || options.workspaceId ? createVardFetchStore(options) : noopStore);\n\n // Registry of all declared variables — used by CLI + build pipeline\n const registry: VardVariableDefinition[] = [];\n\n function register<T>(def: VardVariableDefinition<T>): T {\n // Avoid double-registering the same key (e.g. in hot-reload scenarios)\n if (!registry.find((d) => d.key === def.key)) {\n registry.push(def as VardVariableDefinition);\n }\n\n // Resolve value: stored client value takes precedence over the default\n const stored = store.get(def.key);\n if (stored !== undefined && stored !== null) {\n return stored as T;\n }\n\n return def.defaultValue;\n }\n\n const client: VardClient = {\n string(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"string\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n richtext(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"richtext\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n color(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"color\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n image(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"image\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n boolean(key, fallback, opts: VardVariableOptions = {}) {\n return register<boolean>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"boolean\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n group: opts.group,\n });\n },\n\n list<S extends VardListItemSchema>(\n key: string,\n schema: S,\n fallback: InferListItem<S>[],\n opts: VardVariableOptions = {}\n ): InferListItem<S>[] {\n return register<InferListItem<S>[]>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"list\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n listItemSchema: schema,\n group: opts.group,\n });\n },\n\n collection<S extends VardListItemSchema>(\n key: string,\n schema: S,\n fallback: InferListItem<S>[],\n opts: Omit<VardVariableOptions, \"type\"> = {}\n ): InferListItem<S>[] {\n return register<InferListItem<S>[]>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"list\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n listItemSchema: schema,\n group: opts.group,\n isCollection: true,\n });\n },\n\n global: {\n string(key, fallback, opts = {}) {\n return client.string(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n richtext(key, fallback, opts = {}) {\n return client.richtext(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n color(key, fallback, opts = {}) {\n return client.color(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n image(key, fallback, opts = {}) {\n return client.image(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n boolean(key, fallback, opts = {}) {\n return client.boolean(key, fallback, { ...opts, group: \"Global\" } as Omit<\n VardVariableOptions,\n \"type\"\n >);\n },\n list(key, schema, fallback, opts = {}) {\n return client.list(key, schema, fallback, { ...opts, group: \"Global\" } as Omit<\n VardVariableOptions,\n \"type\"\n >);\n },\n },\n\n getDefinitions() {\n return [...registry];\n },\n store,\n };\n\n return client;\n}\n\n// ─────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────\n\n/**\n * Converts a dot-notation key to a human-readable label.\n * e.g. \"hero.primaryTitle\" → \"Hero Primary Title\"\n */\nfunction labelFromKey(key: string): string {\n const lastSegment = key.split(\".\").pop() ?? key;\n // Split on camelCase boundaries and capitalise\n return lastSegment\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (c) => c.toUpperCase())\n .trim();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fetch-store.ts","../src/client.ts","../src/schema.ts"],"sourcesContent":["// Public entrypoint for @vard/sdk\nexport { createVard } from \"./client\";\nexport { createVardFetchStore } from \"./fetch-store\";\nexport { v } from \"./schema\";\nexport type { VardSchema, InferSchema, VardSchemaFragment, MergeSchema } from \"./schema\";\nexport type {\n VardClient,\n VardOptions,\n VardStore,\n VardVariableDefinition,\n VardVariableType,\n VardVariableOptions,\n VardListItemSchema,\n InferListItem,\n VardRole,\n} from \"./types\";\n","import type { VardStore } from \"./types\";\n\nexport interface VardFetchStoreOptions {\n /**\n * Base URL of the Vard API. Defaults to https://api.vard.app\n */\n apiBase?: string;\n\n /**\n * API Key for authentication. Defaults to process.env.VARD_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Custom fetch options (headers, etc.)\n */\n fetchOptions?: RequestInit;\n}\n\n/**\n * Creates a universal VardStore that fetches variable values from the Vard API.\n * Works in any environment with a global `fetch` (Browsers, Node 18+, Bun, Deno).\n */\nexport function createVardFetchStore(\n options: VardFetchStoreOptions = {}\n): VardStore & { prefetch(): Promise<void> } {\n const {\n apiBase = options.apiBase ??\n process.env.VARD_API_BASE ??\n process.env.NEXT_PUBLIC_VARD_API_BASE ??\n \"https://dash.vard.app\",\n apiKey = options.apiKey ?? process.env.VARD_API_KEY,\n fetchOptions = {},\n } = options;\n\n let resolvedValues: Map<string, unknown> | null = null;\n let structuredContent: any = null;\n let fetchPromise: Promise<{ variables: Map<string, unknown>; structured: any }> | null = null;\n\n async function fetchValues(): Promise<{ variables: Map<string, unknown>; structured: any }> {\n const isDevelopment = process.env.NODE_ENV === \"development\";\n\n if (!apiKey) {\n if (!isDevelopment) {\n console.error(\n \"\\x1b[31m[vard] Missing configuration! VARD_API_KEY is not set.\\x1b[0m\\n\" +\n \"Please set this environment variable in your production environment.\"\n );\n } else {\n console.warn(\n \"[vard] No API Key found. Running in local fallback mode (using default values).\"\n );\n }\n return { variables: new Map(), structured: {} };\n }\n\n const url = `${apiBase}/api/content/variables?structured=true`;\n\n try {\n const res = await fetch(url, {\n ...fetchOptions,\n headers: {\n ...fetchOptions.headers,\n \"X-Vard-API-Key\": apiKey,\n },\n });\n\n if (!res.ok) {\n console.warn(`[vard] Failed to fetch variables: ${res.status}`);\n return { variables: new Map(), structured: {} };\n }\n\n const data = (await res.json()) as any;\n\n // Handle both legacy (array) and new (object with structured) responses\n if (Array.isArray(data)) {\n return {\n variables: new Map(data.map((v: any) => [v.key, v.value])),\n structured: {},\n };\n }\n\n return {\n variables: new Map(data.variables.map((v: any) => [v.key, v.value])),\n structured: data.structured || {},\n };\n } catch (err) {\n return { variables: new Map(), structured: {} };\n }\n }\n\n return {\n get(key: string): unknown {\n return resolvedValues?.get(key);\n },\n\n getStructured(): any {\n return structuredContent;\n },\n\n async prefetch(): Promise<void> {\n if (resolvedValues) return;\n if (!fetchPromise) {\n fetchPromise = fetchValues();\n }\n const result = await fetchPromise;\n resolvedValues = result.variables;\n structuredContent = result.structured;\n },\n };\n}\n","import {\n VardClient,\n VardOptions,\n VardStore,\n VardVariableDefinition,\n VardVariableOptions,\n VardListItemSchema,\n InferListItem,\n VardRole,\n VardVariableType,\n} from \"./types\";\nimport {\n VardSchema,\n InferSchema,\n VardField,\n VardCollection,\n VardSchemaFragment,\n MergeSchema,\n} from \"./schema\";\nimport { createVardFetchStore } from \"./fetch-store\";\n\n// ─────────────────────────────────────────────\n// No-op store (used in local dev when no apiKey is set)\n// ─────────────────────────────────────────────\n\nlet hasLoggedNoop = false;\nconst noopStore: VardStore = {\n get: () => {\n if (!hasLoggedNoop && process.env.NODE_ENV !== \"test\") {\n console.warn(\n \"[vard] Using default values for all variables because no Store was provided to createVard().\"\n );\n hasLoggedNoop = true;\n }\n return undefined;\n },\n};\n\n// ─────────────────────────────────────────────\n// createVard — the main SDK factory\n// ─────────────────────────────────────────────\n\n/**\n * Creates a Vard client instance. Call this once at the top of your site\n * (e.g. in `lib/vard.ts`) and export the result.\n */\nexport function createVard<S extends VardSchema = any>(\n options: VardOptions<S> = {}\n): VardClient<S> {\n const store: VardStore =\n options.store ?? (options.apiKey ? createVardFetchStore(options) : noopStore);\n\n // Registry of all declared variables — used by CLI + build pipeline\n const registry: VardVariableDefinition[] = [];\n\n function register<T>(def: VardVariableDefinition<T>): T {\n if (!registry.find((d) => d.key === def.key)) {\n registry.push(def as VardVariableDefinition);\n }\n\n const stored = store.get(def.key);\n if (stored !== undefined && stored !== null) {\n return stored as T;\n }\n\n return def.defaultValue;\n }\n\n // ─────────────────────────────────────────────\n // Schema Traversal\n // ─────────────────────────────────────────────\n\n function flattenSchema(schema: VardSchema, prefix = \"\"): any {\n const result: any = {};\n\n for (const [key, value] of Object.entries(schema)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === \"object\" && value !== null && \"type\" in value) {\n // It's a field or collection\n const field = value as VardField | VardCollection;\n\n if (field.type === \"collection\") {\n // Flatten collection schema but keep it as a 'list' type for the registry\n const collection = field as VardCollection;\n const listItemSchema: Record<string, string> = {};\n for (const [fKey, fVal] of Object.entries(collection.schema)) {\n listItemSchema[fKey] = (fVal as VardField).type;\n }\n\n register({\n key: fullKey,\n label: labelFromKey(key),\n type: \"list\",\n defaultValue: [],\n editableBy: \"member\",\n listItemSchema: listItemSchema as VardListItemSchema,\n isCollection: true,\n });\n\n // In the returned object, this remains a placeholder or is proxied to the store\n Object.defineProperty(result, key, {\n get: () => store.get(fullKey) ?? [],\n enumerable: true,\n });\n } else {\n // It's a plain field\n const vardField = field as VardField;\n register({\n key: fullKey,\n label: vardField.label ?? labelFromKey(key),\n description: vardField.description,\n type: vardField.type,\n defaultValue: vardField.default,\n editableBy: vardField.editableBy ?? \"member\",\n group: vardField.group,\n });\n\n Object.defineProperty(result, key, {\n get: () => store.get(fullKey) ?? vardField.default,\n enumerable: true,\n });\n }\n } else if (typeof value === \"object\" && value !== null) {\n // It's a nested object\n result[key] = flattenSchema(value as VardSchema, fullKey);\n }\n }\n\n return result;\n }\n\n // Auto-sync schema in development\n if (options.schema && process.env.NODE_ENV === \"development\" && options.apiKey) {\n flattenSchema(options.schema);\n const definitions = [...registry];\n const apiBase =\n process.env.VARD_API_BASE ?? process.env.NEXT_PUBLIC_VARD_API_BASE ?? \"https://dash.vard.app\";\n\n fetch(`${apiBase}/api/content/variables/sync`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Vard-API-Key\": options.apiKey,\n },\n body: JSON.stringify({\n definitions,\n schema: options.schema,\n }),\n }).catch((err) => console.warn(\"[vard] Auto-sync failed:\", err));\n }\n\n const client: VardClient<S> = {\n define<NS extends VardSchema>(schema: NS): InferSchema<NS> {\n return flattenSchema(schema) as InferSchema<NS>;\n },\n\n async get(): Promise<InferSchema<S>> {\n if (store.prefetch) {\n await store.prefetch();\n }\n if (store.getStructured) {\n const structured = store.getStructured();\n if (structured && Object.keys(structured).length > 0) {\n return structured as InferSchema<S>;\n }\n }\n return flattenSchema(options.schema ?? {}) as InferSchema<S>;\n },\n\n string(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"string\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n richtext(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"richtext\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n color(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"color\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n image(key, fallback, opts: VardVariableOptions = {}) {\n return register<string>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"image\",\n defaultValue: fallback,\n editableBy: opts.editableBy ?? \"member\",\n group: opts.group,\n });\n },\n\n boolean(key, fallback, opts: VardVariableOptions = {}) {\n return register<boolean>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"boolean\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n group: opts.group,\n });\n },\n\n list<LS extends VardListItemSchema>(\n key: string,\n schema: LS,\n fallback: InferListItem<LS>[],\n opts: VardVariableOptions = {}\n ): InferListItem<LS>[] {\n return register<InferListItem<LS>[]>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"list\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n listItemSchema: schema,\n group: opts.group,\n });\n },\n\n collection<LS extends VardListItemSchema>(\n key: string,\n schema: LS,\n fallback: InferListItem<LS>[],\n opts: Omit<VardVariableOptions, \"type\"> = {}\n ): InferListItem<LS>[] {\n return register<InferListItem<LS>[]>({\n key,\n label: opts.label ?? labelFromKey(key),\n description: opts.description,\n type: \"list\",\n defaultValue: fallback,\n editableBy: (opts.editableBy as VardRole) ?? \"member\",\n listItemSchema: schema,\n group: opts.group,\n isCollection: true,\n });\n },\n\n global: {\n string(key, fallback, opts = {}) {\n return client.string(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n richtext(key, fallback, opts = {}) {\n return client.richtext(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n color(key, fallback, opts = {}) {\n return client.color(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n image(key, fallback, opts = {}) {\n return client.image(key, fallback, { ...opts, group: \"Global\" } as VardVariableOptions);\n },\n boolean(key, fallback, opts = {}) {\n return client.boolean(key, fallback, { ...opts, group: \"Global\" } as Omit<\n VardVariableOptions,\n \"type\"\n >);\n },\n list(key, schema, fallback, opts = {}) {\n return client.list(key, schema, fallback, { ...opts, group: \"Global\" } as Omit<\n VardVariableOptions,\n \"type\"\n >);\n },\n },\n\n extend<E extends VardSchema>(fragment: VardSchemaFragment<E>): VardClient<MergeSchema<S, E>> {\n // Merge the base schema with the fragment — the fragment keys win on collision\n const mergedSchema = { ...(options.schema ?? {}), ...fragment } as unknown as MergeSchema<\n S,\n E\n >;\n // Return a new client with the merged schema, sharing the same store & registry.\n // We pass the in-memory store directly so there is no second fetch.\n return createVard<MergeSchema<S, E>>({\n ...options,\n schema: mergedSchema,\n store,\n });\n },\n\n getDefinitions() {\n return [...registry];\n },\n store,\n };\n\n return client;\n}\n\n// ─────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────\n\nfunction labelFromKey(key: string): string {\n const lastSegment = key.split(\".\").pop() ?? key;\n return lastSegment\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (c) => c.toUpperCase())\n .trim();\n}\n","import { VardVariableType, VardRole } from \"./types\";\n\nexport interface VardFieldOptions<T = any> {\n label?: string;\n description?: string;\n editableBy?: VardRole;\n group?: string;\n default?: T;\n}\n\nexport interface VardField<T = any> extends VardFieldOptions<T> {\n type: VardVariableType;\n}\n\nexport interface VardCollection<S extends Record<string, VardField | any> = any> {\n type: \"collection\";\n schema: S;\n}\n\nexport type VardSchemaValue = VardField | VardCollection | { [key: string]: VardSchemaValue };\n\nexport type VardSchema = Record<string, VardSchemaValue>;\n\n/**\n * A branded schema fragment created with `v.schema()`. Use with `vard.extend()`\n * to compose schemas defined across multiple files.\n */\nexport type VardSchemaFragment<S extends VardSchema> = S & {\n readonly __fragment: true;\n};\n\n/**\n * Merges two VardSchema types, with B's keys overriding A on collision.\n */\nexport type MergeSchema<A extends VardSchema, B extends VardSchema> = Omit<A, keyof B> & B;\n\n// ─────────────────────────────────────────────\n// The `v` helper object for schema definition\n// ─────────────────────────────────────────────\n\nexport const v = {\n string: (\n defaultValue?: string,\n opts: Omit<VardFieldOptions<string>, \"default\"> = {}\n ): VardField<string> => ({\n type: \"string\",\n default: defaultValue,\n ...opts,\n }),\n\n richtext: (\n defaultValue?: string,\n opts: Omit<VardFieldOptions<string>, \"default\"> = {}\n ): VardField<string> => ({\n type: \"richtext\",\n default: defaultValue,\n ...opts,\n }),\n\n color: (\n defaultValue?: string,\n opts: Omit<VardFieldOptions<string>, \"default\"> = {}\n ): VardField<string> => ({\n type: \"color\",\n default: defaultValue,\n ...opts,\n }),\n\n image: (\n defaultValue?: string,\n opts: Omit<VardFieldOptions<string>, \"default\"> = {}\n ): VardField<string> => ({\n type: \"image\",\n default: defaultValue,\n ...opts,\n }),\n\n boolean: (\n defaultValue?: boolean,\n opts: Omit<VardFieldOptions<boolean>, \"default\"> = {}\n ): VardField<boolean> => ({\n type: \"boolean\",\n default: defaultValue,\n ...opts,\n }),\n\n collection: <S extends Record<string, VardField | any>>(schema: S): VardCollection<S> => ({\n type: \"collection\",\n schema,\n }),\n\n /**\n * Creates a reusable schema fragment that can be merged into a Vard client\n * via `vard.extend(fragment)`. Co-locate this with your page/component.\n *\n * @example\n * // app/therapists/schema.ts\n * export const therapistSchema = v.schema({\n * therapists: v.collection({ name: v.string(), photo: v.image() }),\n * });\n *\n * // app/therapists/page.tsx\n * const { therapists } = await vard.extend(therapistSchema).get();\n */\n schema: <S extends VardSchema>(schema: S): VardSchemaFragment<S> =>\n schema as VardSchemaFragment<S>,\n};\n\n// ─────────────────────────────────────────────\n// Type inference for schema objects\n// ─────────────────────────────────────────────\n\nexport type InferSchema<T> = {\n [K in keyof T]: T[K] extends VardField<infer U>\n ? U\n : T[K] extends VardCollection<infer S>\n ? InferSchema<S>[]\n : T[K] extends object\n ? InferSchema<T[K]>\n : never;\n};\n"],"mappings":"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","names":["v"]}