@vard-app/sdk 0.1.0 → 0.1.2
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 +30 -26
- package/dist/index.d.mts +30 -4
- package/dist/index.d.ts +30 -4
- package/dist/index.js +120 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +118 -10
- package/dist/index.mjs.map +1 -1
- package/dist/next.d.mts +13 -19
- package/dist/next.d.ts +13 -19
- package/dist/next.js +185 -16
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +183 -17
- package/dist/next.mjs.map +1 -1
- package/dist/{types-DLM7i_Qr.d.mts → types-eJuYa65b.d.mts} +33 -2
- package/dist/{types-DLM7i_Qr.d.ts → types-eJuYa65b.d.ts} +33 -2
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["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\nconst noopStore: VardStore = {\n get: () => undefined,\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 *\n * @example\n * // lib/vard.ts\n * import { createVard } from \"@vard/sdk\"\n * export const vard = createVard()\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 = options.store ?? 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 });\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 });\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 });\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 });\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 });\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 });\n },\n\n getDefinitions() {\n return [...registry];\n },\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":";AAeA,IAAM,YAAuB;AAAA,EAC3B,KAAK,MAAM;AACb;AAmBO,SAAS,WAAW,UAAuB,CAAC,GAAe;AAChE,QAAM,QAAmB,QAAQ,SAAS;AAG1C,QAAM,WAAqC,CAAC;AAE5C,WAAS,SAAY,KAAmC;AAEtD,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI,GAAG,GAAG;AAC5C,eAAS,KAAK,GAA6B;AAAA,IAC7C;AAGA,UAAM,SAAS,MAAM,IAAI,IAAI,GAAG;AAChC,QAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,aAAO;AAAA,IACT;AAEA,WAAO,IAAI;AAAA,EACb;AAEA,QAAM,SAAqB;AAAA,IACzB,OAAO,KAAK,UAAU,OAA4B,CAAC,GAAG;AACpD,aAAO,SAAiB;AAAA,QACtB;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAY,KAAK,cAAc;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IAEA,SAAS,KAAK,UAAU,OAA4B,CAAC,GAAG;AACtD,aAAO,SAAiB;AAAA,QACtB;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAY,KAAK,cAAc;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,KAAK,UAAU,OAA4B,CAAC,GAAG;AACnD,aAAO,SAAiB;AAAA,QACtB;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAY,KAAK,cAAc;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,KAAK,UAAU,OAA4B,CAAC,GAAG;AACnD,aAAO,SAAiB;AAAA,QACtB;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAY,KAAK,cAAc;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IAEA,QAAQ,KAAK,UAAU,OAA4B,CAAC,GAAG;AACrD,aAAO,SAAkB;AAAA,QACvB;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAa,KAAK,cAA2B;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IAEA,KACE,KACA,QACA,UACA,OAA4B,CAAC,GACT;AACpB,aAAO,SAA6B;AAAA,QAClC;AAAA,QACA,OAAO,KAAK,SAAS,aAAa,GAAG;AAAA,QACrC,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,YAAa,KAAK,cAA2B;AAAA,QAC7C,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB;AACf,aAAO,CAAC,GAAG,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAUA,SAAS,aAAa,KAAqB;AACzC,QAAM,cAAc,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AAE5C,SAAO,YACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACpC,KAAK;AACV;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/fetch-store.ts","../src/client.ts"],"sourcesContent":["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 = \"https://api.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 return new Map(data.map((v) => [v.key, v.value]));\n } catch (err) {\n console.warn(\"[vard] Error fetching variable values:\", 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":[]}
|
package/dist/next.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { V as VardOptions, a as VardClient, b as VardStore } from './types-eJuYa65b.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @vard/sdk — Next.js adapter
|
|
@@ -51,28 +51,22 @@ interface VardNextAdapterOptions {
|
|
|
51
51
|
/**
|
|
52
52
|
* Creates a VardStore that fetches live variable values from the Vard API.
|
|
53
53
|
* Designed for use inside Next.js App Router (server components, server actions).
|
|
54
|
-
*
|
|
55
|
-
* Values are fetched once per request and cached in a simple Map.
|
|
56
|
-
* In local dev with no workspaceId, returns undefined for every key (defaults take over).
|
|
57
54
|
*/
|
|
58
|
-
declare function createVardNextAdapter(options?: VardNextAdapterOptions): VardStore
|
|
55
|
+
declare function createVardNextAdapter(options?: VardNextAdapterOptions): VardStore & {
|
|
56
|
+
prefetch(): Promise<void>;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
59
|
/**
|
|
60
|
-
* A convenience wrapper
|
|
61
|
-
* Call this once in your Next.js layout before rendering any server component
|
|
62
|
-
* that uses vard variables.
|
|
60
|
+
* A convenience wrapper for createVard that automatically uses the Next.js adapter.
|
|
63
61
|
*
|
|
64
62
|
* @example
|
|
65
|
-
* //
|
|
66
|
-
* import {
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* export default async function RootLayout({ children }) {
|
|
70
|
-
* await prefetchVardValues(vard)
|
|
71
|
-
* return <html>...</html>
|
|
72
|
-
* }
|
|
63
|
+
* // lib/vard.ts
|
|
64
|
+
* import { createVardNext } from "@vard/sdk/next"
|
|
65
|
+
* export const vard = createVardNext({ revalidate: 60 })
|
|
73
66
|
*/
|
|
74
|
-
declare function
|
|
67
|
+
declare function createVardNext(options?: VardNextAdapterOptions & VardOptions): VardClient;
|
|
68
|
+
declare function prefetchVardValues(target: {
|
|
75
69
|
prefetch(): Promise<void>;
|
|
76
|
-
}): Promise<void>;
|
|
70
|
+
} | VardClient): Promise<void>;
|
|
77
71
|
|
|
78
|
-
export { type VardNextAdapterOptions, createVardNextAdapter, prefetchVardValues };
|
|
72
|
+
export { type VardNextAdapterOptions, createVardNext, createVardNextAdapter, prefetchVardValues };
|
package/dist/next.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { V as VardOptions, a as VardClient, b as VardStore } from './types-eJuYa65b.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @vard/sdk — Next.js adapter
|
|
@@ -51,28 +51,22 @@ interface VardNextAdapterOptions {
|
|
|
51
51
|
/**
|
|
52
52
|
* Creates a VardStore that fetches live variable values from the Vard API.
|
|
53
53
|
* Designed for use inside Next.js App Router (server components, server actions).
|
|
54
|
-
*
|
|
55
|
-
* Values are fetched once per request and cached in a simple Map.
|
|
56
|
-
* In local dev with no workspaceId, returns undefined for every key (defaults take over).
|
|
57
54
|
*/
|
|
58
|
-
declare function createVardNextAdapter(options?: VardNextAdapterOptions): VardStore
|
|
55
|
+
declare function createVardNextAdapter(options?: VardNextAdapterOptions): VardStore & {
|
|
56
|
+
prefetch(): Promise<void>;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
59
|
/**
|
|
60
|
-
* A convenience wrapper
|
|
61
|
-
* Call this once in your Next.js layout before rendering any server component
|
|
62
|
-
* that uses vard variables.
|
|
60
|
+
* A convenience wrapper for createVard that automatically uses the Next.js adapter.
|
|
63
61
|
*
|
|
64
62
|
* @example
|
|
65
|
-
* //
|
|
66
|
-
* import {
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* export default async function RootLayout({ children }) {
|
|
70
|
-
* await prefetchVardValues(vard)
|
|
71
|
-
* return <html>...</html>
|
|
72
|
-
* }
|
|
63
|
+
* // lib/vard.ts
|
|
64
|
+
* import { createVardNext } from "@vard/sdk/next"
|
|
65
|
+
* export const vard = createVardNext({ revalidate: 60 })
|
|
73
66
|
*/
|
|
74
|
-
declare function
|
|
67
|
+
declare function createVardNext(options?: VardNextAdapterOptions & VardOptions): VardClient;
|
|
68
|
+
declare function prefetchVardValues(target: {
|
|
75
69
|
prefetch(): Promise<void>;
|
|
76
|
-
}): Promise<void>;
|
|
70
|
+
} | VardClient): Promise<void>;
|
|
77
71
|
|
|
78
|
-
export { type VardNextAdapterOptions, createVardNextAdapter, prefetchVardValues };
|
|
72
|
+
export { type VardNextAdapterOptions, createVardNext, createVardNextAdapter, prefetchVardValues };
|
package/dist/next.js
CHANGED
|
@@ -20,38 +20,47 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/next.ts
|
|
21
21
|
var next_exports = {};
|
|
22
22
|
__export(next_exports, {
|
|
23
|
+
createVardNext: () => createVardNext,
|
|
23
24
|
createVardNextAdapter: () => createVardNextAdapter,
|
|
24
25
|
prefetchVardValues: () => prefetchVardValues
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(next_exports);
|
|
27
|
-
|
|
28
|
+
|
|
29
|
+
// src/fetch-store.ts
|
|
30
|
+
function createVardFetchStore(options = {}) {
|
|
28
31
|
const {
|
|
29
32
|
apiBase = "https://api.vard.app",
|
|
30
|
-
workspaceId = process.env.VARD_WORKSPACE_ID,
|
|
31
|
-
apiKey = process.env.VARD_API_KEY,
|
|
32
|
-
|
|
33
|
-
revalidate = 60
|
|
33
|
+
workspaceId = options.workspaceId ?? process.env.VARD_WORKSPACE_ID,
|
|
34
|
+
apiKey = options.apiKey ?? process.env.VARD_API_KEY,
|
|
35
|
+
fetchOptions = {}
|
|
34
36
|
} = options;
|
|
35
37
|
let resolvedValues = null;
|
|
36
38
|
let fetchPromise = null;
|
|
37
39
|
async function fetchValues() {
|
|
40
|
+
const isDevelopment = process.env.NODE_ENV === "development";
|
|
38
41
|
if (!apiKey && !workspaceId) {
|
|
42
|
+
if (!isDevelopment) {
|
|
43
|
+
console.error(
|
|
44
|
+
"\x1B[31m[vard] Missing configuration! VARD_API_KEY is not set.\x1B[0m\nPlease set this environment variable in your production environment."
|
|
45
|
+
);
|
|
46
|
+
} else {
|
|
47
|
+
console.warn(
|
|
48
|
+
"[vard] No API Key found. Running in local fallback mode (using default values)."
|
|
49
|
+
);
|
|
50
|
+
}
|
|
39
51
|
return /* @__PURE__ */ new Map();
|
|
40
52
|
}
|
|
41
53
|
const url = apiKey ? `${apiBase}/api/content/variables` : `${apiBase}/v1/workspaces/${workspaceId}/variables`;
|
|
42
54
|
try {
|
|
43
55
|
const res = await fetch(url, {
|
|
44
|
-
|
|
56
|
+
...fetchOptions,
|
|
45
57
|
headers: {
|
|
58
|
+
...fetchOptions.headers,
|
|
46
59
|
...apiKey ? { "X-Vard-API-Key": apiKey } : {}
|
|
47
|
-
}
|
|
48
|
-
// Next.js specific: revalidation hint
|
|
49
|
-
...revalidate !== void 0 && cache === "force-cache" ? { next: { revalidate } } : {}
|
|
60
|
+
}
|
|
50
61
|
});
|
|
51
62
|
if (!res.ok) {
|
|
52
|
-
console.warn(
|
|
53
|
-
`[vard] Failed to fetch variables: ${res.status}`
|
|
54
|
-
);
|
|
63
|
+
console.warn(`[vard] Failed to fetch variables: ${res.status}`);
|
|
55
64
|
return /* @__PURE__ */ new Map();
|
|
56
65
|
}
|
|
57
66
|
const data = await res.json();
|
|
@@ -65,8 +74,6 @@ function createVardNextAdapter(options = {}) {
|
|
|
65
74
|
get(key) {
|
|
66
75
|
return resolvedValues?.get(key);
|
|
67
76
|
},
|
|
68
|
-
// Extended method — not on base VardStore interface, but available
|
|
69
|
-
// for Next.js users who import from @vard/sdk/next
|
|
70
77
|
async prefetch() {
|
|
71
78
|
if (resolvedValues) return;
|
|
72
79
|
if (!fetchPromise) {
|
|
@@ -76,11 +83,173 @@ function createVardNextAdapter(options = {}) {
|
|
|
76
83
|
}
|
|
77
84
|
};
|
|
78
85
|
}
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
|
|
87
|
+
// src/client.ts
|
|
88
|
+
var hasLoggedNoop = false;
|
|
89
|
+
var noopStore = {
|
|
90
|
+
get: () => {
|
|
91
|
+
if (!hasLoggedNoop && process.env.NODE_ENV !== "test") {
|
|
92
|
+
console.warn(
|
|
93
|
+
"[vard] Using default values for all variables because no Store was provided to createVard()."
|
|
94
|
+
);
|
|
95
|
+
hasLoggedNoop = true;
|
|
96
|
+
}
|
|
97
|
+
return void 0;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
function createVard(options = {}) {
|
|
101
|
+
const store = options.store ?? (options.apiKey || options.workspaceId ? createVardFetchStore(options) : noopStore);
|
|
102
|
+
const registry = [];
|
|
103
|
+
function register(def) {
|
|
104
|
+
if (!registry.find((d) => d.key === def.key)) {
|
|
105
|
+
registry.push(def);
|
|
106
|
+
}
|
|
107
|
+
const stored = store.get(def.key);
|
|
108
|
+
if (stored !== void 0 && stored !== null) {
|
|
109
|
+
return stored;
|
|
110
|
+
}
|
|
111
|
+
return def.defaultValue;
|
|
112
|
+
}
|
|
113
|
+
const client = {
|
|
114
|
+
string(key, fallback, opts = {}) {
|
|
115
|
+
return register({
|
|
116
|
+
key,
|
|
117
|
+
label: opts.label ?? labelFromKey(key),
|
|
118
|
+
description: opts.description,
|
|
119
|
+
type: "string",
|
|
120
|
+
defaultValue: fallback,
|
|
121
|
+
editableBy: opts.editableBy ?? "member",
|
|
122
|
+
group: opts.group
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
richtext(key, fallback, opts = {}) {
|
|
126
|
+
return register({
|
|
127
|
+
key,
|
|
128
|
+
label: opts.label ?? labelFromKey(key),
|
|
129
|
+
description: opts.description,
|
|
130
|
+
type: "richtext",
|
|
131
|
+
defaultValue: fallback,
|
|
132
|
+
editableBy: opts.editableBy ?? "member",
|
|
133
|
+
group: opts.group
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
color(key, fallback, opts = {}) {
|
|
137
|
+
return register({
|
|
138
|
+
key,
|
|
139
|
+
label: opts.label ?? labelFromKey(key),
|
|
140
|
+
description: opts.description,
|
|
141
|
+
type: "color",
|
|
142
|
+
defaultValue: fallback,
|
|
143
|
+
editableBy: opts.editableBy ?? "member",
|
|
144
|
+
group: opts.group
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
image(key, fallback, opts = {}) {
|
|
148
|
+
return register({
|
|
149
|
+
key,
|
|
150
|
+
label: opts.label ?? labelFromKey(key),
|
|
151
|
+
description: opts.description,
|
|
152
|
+
type: "image",
|
|
153
|
+
defaultValue: fallback,
|
|
154
|
+
editableBy: opts.editableBy ?? "member",
|
|
155
|
+
group: opts.group
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
boolean(key, fallback, opts = {}) {
|
|
159
|
+
return register({
|
|
160
|
+
key,
|
|
161
|
+
label: opts.label ?? labelFromKey(key),
|
|
162
|
+
description: opts.description,
|
|
163
|
+
type: "boolean",
|
|
164
|
+
defaultValue: fallback,
|
|
165
|
+
editableBy: opts.editableBy ?? "member",
|
|
166
|
+
group: opts.group
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
list(key, schema, fallback, opts = {}) {
|
|
170
|
+
return register({
|
|
171
|
+
key,
|
|
172
|
+
label: opts.label ?? labelFromKey(key),
|
|
173
|
+
description: opts.description,
|
|
174
|
+
type: "list",
|
|
175
|
+
defaultValue: fallback,
|
|
176
|
+
editableBy: opts.editableBy ?? "member",
|
|
177
|
+
listItemSchema: schema,
|
|
178
|
+
group: opts.group
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
collection(key, schema, fallback, opts = {}) {
|
|
182
|
+
return register({
|
|
183
|
+
key,
|
|
184
|
+
label: opts.label ?? labelFromKey(key),
|
|
185
|
+
description: opts.description,
|
|
186
|
+
type: "list",
|
|
187
|
+
defaultValue: fallback,
|
|
188
|
+
editableBy: opts.editableBy ?? "member",
|
|
189
|
+
listItemSchema: schema,
|
|
190
|
+
group: opts.group,
|
|
191
|
+
isCollection: true
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
global: {
|
|
195
|
+
string(key, fallback, opts = {}) {
|
|
196
|
+
return client.string(key, fallback, { ...opts, group: "Global" });
|
|
197
|
+
},
|
|
198
|
+
richtext(key, fallback, opts = {}) {
|
|
199
|
+
return client.richtext(key, fallback, { ...opts, group: "Global" });
|
|
200
|
+
},
|
|
201
|
+
color(key, fallback, opts = {}) {
|
|
202
|
+
return client.color(key, fallback, { ...opts, group: "Global" });
|
|
203
|
+
},
|
|
204
|
+
image(key, fallback, opts = {}) {
|
|
205
|
+
return client.image(key, fallback, { ...opts, group: "Global" });
|
|
206
|
+
},
|
|
207
|
+
boolean(key, fallback, opts = {}) {
|
|
208
|
+
return client.boolean(key, fallback, { ...opts, group: "Global" });
|
|
209
|
+
},
|
|
210
|
+
list(key, schema, fallback, opts = {}) {
|
|
211
|
+
return client.list(key, schema, fallback, { ...opts, group: "Global" });
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
getDefinitions() {
|
|
215
|
+
return [...registry];
|
|
216
|
+
},
|
|
217
|
+
store
|
|
218
|
+
};
|
|
219
|
+
return client;
|
|
220
|
+
}
|
|
221
|
+
function labelFromKey(key) {
|
|
222
|
+
const lastSegment = key.split(".").pop() ?? key;
|
|
223
|
+
return lastSegment.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).trim();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/next.ts
|
|
227
|
+
function createVardNextAdapter(options = {}) {
|
|
228
|
+
const { cache = "force-cache", revalidate = 60, ...rest } = options;
|
|
229
|
+
return createVardFetchStore({
|
|
230
|
+
...rest,
|
|
231
|
+
fetchOptions: {
|
|
232
|
+
cache,
|
|
233
|
+
...revalidate !== void 0 && cache === "force-cache" ? { next: { revalidate } } : {}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function createVardNext(options = {}) {
|
|
238
|
+
const adapter = createVardNextAdapter(options);
|
|
239
|
+
return createVard({
|
|
240
|
+
...options,
|
|
241
|
+
store: adapter
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async function prefetchVardValues(target) {
|
|
245
|
+
const adapter = target.prefetch ? target : target.store;
|
|
246
|
+
if (adapter && typeof adapter.prefetch === "function") {
|
|
247
|
+
await adapter.prefetch();
|
|
248
|
+
}
|
|
81
249
|
}
|
|
82
250
|
// Annotate the CommonJS export names for ESM import in node:
|
|
83
251
|
0 && (module.exports = {
|
|
252
|
+
createVardNext,
|
|
84
253
|
createVardNextAdapter,
|
|
85
254
|
prefetchVardValues
|
|
86
255
|
});
|
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next.ts"],"sourcesContent":["/**\n * @vard/sdk — Next.js adapter\n *\n * This module provides a VardStore implementation that reads variable values\n * from the Vard API at request time (App Router) or build time (static export).\n *\n * Usage in your Next.js site:\n *\n * // lib/vard.ts\n * import { createVardNextAdapter } from \"@vard/sdk/next\"\n * import { createVard } from \"@vard/sdk\"\n *\n * export const vard = createVard({\n * workspaceId: process.env.VARD_WORKSPACE_ID,\n * store: createVardNextAdapter(),\n * })\n *\n * The adapter fetches variable values from the Vard API:\n * GET https://api.vard.app/v1/workspaces/{workspaceId}/variables\n *\n * In local development (no VARD_WORKSPACE_ID set) it silently falls back\n * to default values so your site works without any Vard account.\n */\n\nimport type { VardStore } from \"./types\";\n\nexport interface VardNextAdapterOptions {\n /**\n * Base URL of the Vard API. Defaults to https://api.vard.app\n */\n apiBase?: string;\n\n /**\n * Workspace ID. Falls back to process.env.VARD_WORKSPACE_ID.\n */\n workspaceId?: string;\n\n /**\n * API Key for authentication. Falls back to process.env.VARD_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Next.js fetch cache strategy. Defaults to \"force-cache\" (SSG-friendly).\n * Use \"no-store\" for fully dynamic pages.\n */\n cache?: RequestCache;\n\n /**\n * Next.js ISR revalidation interval in seconds.\n * Only applies when cache is \"force-cache\".\n */\n revalidate?: number;\n}\n\n/**\n * Creates a VardStore that fetches live variable values from the Vard API.\n * Designed for use inside Next.js App Router (server components, server actions).\n *\n * Values are fetched once per request and cached in a simple Map.\n * In local dev with no workspaceId, returns undefined for every key (defaults take over).\n */\nexport function createVardNextAdapter(\n options: VardNextAdapterOptions = {}\n): VardStore {\n const {\n apiBase = \"https://api.vard.app\",\n workspaceId = process.env.VARD_WORKSPACE_ID,\n apiKey = process.env.VARD_API_KEY,\n cache = \"force-cache\",\n revalidate = 60,\n } = options;\n\n // In-memory cache per module instance (one Node.js process = one workspace)\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 if (!apiKey && !workspaceId) {\n return new Map();\n }\n\n // New format uses API Key and points to a generic content endpoint\n // Old format uses workspaceId and points to a workspace-specific endpoint\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 cache,\n headers: {\n ...(apiKey ? { \"X-Vard-API-Key\": apiKey } : {}),\n },\n // Next.js specific: revalidation hint\n ...(revalidate !== undefined && cache === \"force-cache\"\n ? { next: { revalidate } }\n : {}),\n });\n\n if (!res.ok) {\n console.warn(\n `[vard] Failed to fetch variables: ${res.status}`\n );\n return new Map();\n }\n\n const data = (await res.json()) as { key: string; value: unknown }[];\n return new Map(data.map((v) => [v.key, v.value]));\n } catch (err) {\n console.warn(\"[vard] Error fetching variable values:\", err);\n return new Map();\n }\n }\n\n return {\n get(key: string): unknown {\n // Synchronous path — values must have been pre-fetched.\n // In Next.js App Router, call vard.prefetch() in your layout/page\n // before rendering, or use the async helper below.\n return resolvedValues?.get(key);\n },\n\n // Extended method — not on base VardStore interface, but available\n // for Next.js users who import from @vard/sdk/next\n async prefetch(): Promise<void> {\n if (resolvedValues) return;\n if (!fetchPromise) {\n fetchPromise = fetchValues();\n }\n resolvedValues = await fetchPromise;\n },\n } as VardStore & { prefetch(): Promise<void> };\n}\n\n/**\n * A convenience wrapper that creates a Vard client pre-loaded with live values.\n * Call this once in your Next.js layout before rendering any server component\n * that uses vard variables.\n *\n * @example\n * // app/layout.tsx\n * import { prefetchVardValues } from \"@vard/sdk/next\"\n * import { vard } from \"@/lib/vard\"\n *\n * export default async function RootLayout({ children }) {\n * await prefetchVardValues(vard)\n * return <html>...</html>\n * }\n */\nexport async function prefetchVardValues(\n adapter: { prefetch(): Promise<void> }\n): Promise<void> {\n await adapter.prefetch();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8DO,SAAS,sBACd,UAAkC,CAAC,GACxB;AACX,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,cAAc,QAAQ,IAAI;AAAA,IAC1B,SAAS,QAAQ,IAAI;AAAA,IACrB,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,IAAI;AAGJ,MAAI,iBAA8C;AAClD,MAAI,eAAqD;AAEzD,iBAAe,cAA6C;AAC1D,QAAI,CAAC,UAAU,CAAC,aAAa;AAC3B,aAAO,oBAAI,IAAI;AAAA,IACjB;AAIA,UAAM,MAAM,SACR,GAAG,OAAO,2BACV,GAAG,OAAO,kBAAkB,WAAW;AAE3C,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B;AAAA,QACA,SAAS;AAAA,UACP,GAAI,SAAS,EAAE,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAC/C;AAAA;AAAA,QAEA,GAAI,eAAe,UAAa,UAAU,gBACtC,EAAE,MAAM,EAAE,WAAW,EAAE,IACvB,CAAC;AAAA,MACP,CAAC;AAED,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ;AAAA,UACN,qCAAqC,IAAI,MAAM;AAAA,QACjD;AACA,eAAO,oBAAI,IAAI;AAAA,MACjB;AAEA,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,aAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,IAClD,SAAS,KAAK;AACZ,cAAQ,KAAK,0CAA0C,GAAG;AAC1D,aAAO,oBAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,KAAsB;AAIxB,aAAO,gBAAgB,IAAI,GAAG;AAAA,IAChC;AAAA;AAAA;AAAA,IAIA,MAAM,WAA0B;AAC9B,UAAI,eAAgB;AACpB,UAAI,CAAC,cAAc;AACjB,uBAAe,YAAY;AAAA,MAC7B;AACA,uBAAiB,MAAM;AAAA,IACzB;AAAA,EACF;AACF;AAiBA,eAAsB,mBACpB,SACe;AACf,QAAM,QAAQ,SAAS;AACzB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/next.ts","../src/fetch-store.ts","../src/client.ts"],"sourcesContent":["/**\n * @vard/sdk — Next.js adapter\n *\n * This module provides a VardStore implementation that reads variable values\n * from the Vard API at request time (App Router) or build time (static export).\n *\n * Usage in your Next.js site:\n *\n * // lib/vard.ts\n * import { createVardNextAdapter } from \"@vard/sdk/next\"\n * import { createVard } from \"@vard/sdk\"\n *\n * export const vard = createVard({\n * workspaceId: process.env.VARD_WORKSPACE_ID,\n * store: createVardNextAdapter(),\n * })\n *\n * The adapter fetches variable values from the Vard API:\n * GET https://api.vard.app/v1/workspaces/{workspaceId}/variables\n *\n * In local development (no VARD_WORKSPACE_ID set) it silently falls back\n * to default values so your site works without any Vard account.\n */\n\nimport type { VardStore } from \"./types\";\n\nexport interface VardNextAdapterOptions {\n /**\n * Base URL of the Vard API. Defaults to https://api.vard.app\n */\n apiBase?: string;\n\n /**\n * Workspace ID. Falls back to process.env.VARD_WORKSPACE_ID.\n */\n workspaceId?: string;\n\n /**\n * API Key for authentication. Falls back to process.env.VARD_API_KEY.\n */\n apiKey?: string;\n\n /**\n * Next.js fetch cache strategy. Defaults to \"force-cache\" (SSG-friendly).\n * Use \"no-store\" for fully dynamic pages.\n */\n cache?: RequestCache;\n\n /**\n * Next.js ISR revalidation interval in seconds.\n * Only applies when cache is \"force-cache\".\n */\n revalidate?: number;\n}\n\nimport { createVardFetchStore, VardFetchStoreOptions } from \"./fetch-store\";\n\n/**\n * Creates a VardStore that fetches live variable values from the Vard API.\n * Designed for use inside Next.js App Router (server components, server actions).\n */\nexport function createVardNextAdapter(\n options: VardNextAdapterOptions = {}\n): VardStore & { prefetch(): Promise<void> } {\n const { cache = \"force-cache\", revalidate = 60, ...rest } = options;\n\n return createVardFetchStore({\n ...rest,\n fetchOptions: {\n cache,\n ...(revalidate !== undefined && cache === \"force-cache\"\n ? ({ next: { revalidate } } as any)\n : {}),\n },\n });\n}\n\n/**\n * A convenience wrapper that creates a Vard client pre-loaded with live values.\n * Call this once in your Next.js layout before rendering any server component\n * that uses vard variables.\n *\n * @example\n * // app/layout.tsx\n * import { prefetchVardValues } from \"@vard/sdk/next\"\n * import { vard } from \"@/lib/vard\"\n *\n * export default async function RootLayout({ children }) {\n * await prefetchVardValues(vard)\n * return <html>...</html>\n * }\n */\nimport { createVard } from \"./client\";\nimport type { VardClient, VardOptions } from \"./types\";\n\n/**\n * A convenience wrapper for createVard that automatically uses the Next.js adapter.\n *\n * @example\n * // lib/vard.ts\n * import { createVardNext } from \"@vard/sdk/next\"\n * export const vard = createVardNext({ revalidate: 60 })\n */\nexport function createVardNext(options: VardNextAdapterOptions & VardOptions = {}): VardClient {\n const adapter = createVardNextAdapter(options);\n return createVard({\n ...options,\n store: adapter,\n });\n}\n\nexport async function prefetchVardValues(\n target: { prefetch(): Promise<void> } | VardClient\n): Promise<void> {\n const adapter = (target as any).prefetch ? target : (target as VardClient).store;\n if (adapter && typeof (adapter as any).prefetch === \"function\") {\n await (adapter as any).prefetch();\n }\n}\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 = \"https://api.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 return new Map(data.map((v) => [v.key, v.value]));\n } catch (err) {\n console.warn(\"[vard] Error fetching variable values:\", 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":[]}
|