@zenmanage/nextjs 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1,38 @@
1
+ import { ReactElement } from 'react';
2
+ import { DefaultsCollection, FlagValue, ContextData } from '@zenmanage/sdk';
3
+ import { FlagsProviderProps, UseFlagResult, WidenFlagValue, UseVariantResult } from '@zenmanage/react';
4
+ export { useFlagsContext } from '@zenmanage/react';
5
+
6
+ interface BootstrapPayload {
7
+ version: 1;
8
+ generatedAt: string;
9
+ flags: Record<string, FlagValue>;
10
+ context?: ContextData;
11
+ }
12
+ interface NextFlagsProviderProps extends Omit<FlagsProviderProps, 'defaults'> {
13
+ defaults?: DefaultsCollection;
14
+ /**
15
+ * Flags evaluated on the server. Pass it as a prop so the server render and the first
16
+ * client render see the same value, which is what keeps hydration clean.
17
+ */
18
+ bootstrapPayload?: BootstrapPayload | null;
19
+ /** Read the payload from a `<script>` tag with this id when `bootstrapPayload` isn't set. */
20
+ bootstrapElementId?: string;
21
+ }
22
+
23
+ declare function NextFlagsProvider({ client, environmentToken, apiEndpoint, cacheTtl, enableUsageReporting, context, defaults, bootstrapPayload, bootstrapElementId, children, ...providerProps }: NextFlagsProviderProps): ReactElement;
24
+
25
+ /**
26
+ * Like `useFlag` from `@zenmanage/react`, but it serves the value the server evaluated until
27
+ * the browser has a live evaluation to replace it. Both the server render and the first client
28
+ * render use that value, with `isLoading` false, so the page hydrates without a mismatch or a
29
+ * flash of the default. Once the browser's rules load, the live value takes over. If they
30
+ * never load (a blocked CDN, no network), the server's value stays rather than the page
31
+ * switching to the code default.
32
+ *
33
+ * Without a bootstrap value for the key it behaves exactly like the React hook.
34
+ */
35
+ declare function useFlag<T extends FlagValue>(key: string, defaultValue: T): UseFlagResult<WidenFlagValue<T>>;
36
+ declare function useVariant(key: string, defaultVariant?: string): UseVariantResult;
37
+
38
+ export { NextFlagsProvider, type NextFlagsProviderProps, useFlag, useVariant };
@@ -0,0 +1,38 @@
1
+ import { ReactElement } from 'react';
2
+ import { DefaultsCollection, FlagValue, ContextData } from '@zenmanage/sdk';
3
+ import { FlagsProviderProps, UseFlagResult, WidenFlagValue, UseVariantResult } from '@zenmanage/react';
4
+ export { useFlagsContext } from '@zenmanage/react';
5
+
6
+ interface BootstrapPayload {
7
+ version: 1;
8
+ generatedAt: string;
9
+ flags: Record<string, FlagValue>;
10
+ context?: ContextData;
11
+ }
12
+ interface NextFlagsProviderProps extends Omit<FlagsProviderProps, 'defaults'> {
13
+ defaults?: DefaultsCollection;
14
+ /**
15
+ * Flags evaluated on the server. Pass it as a prop so the server render and the first
16
+ * client render see the same value, which is what keeps hydration clean.
17
+ */
18
+ bootstrapPayload?: BootstrapPayload | null;
19
+ /** Read the payload from a `<script>` tag with this id when `bootstrapPayload` isn't set. */
20
+ bootstrapElementId?: string;
21
+ }
22
+
23
+ declare function NextFlagsProvider({ client, environmentToken, apiEndpoint, cacheTtl, enableUsageReporting, context, defaults, bootstrapPayload, bootstrapElementId, children, ...providerProps }: NextFlagsProviderProps): ReactElement;
24
+
25
+ /**
26
+ * Like `useFlag` from `@zenmanage/react`, but it serves the value the server evaluated until
27
+ * the browser has a live evaluation to replace it. Both the server render and the first client
28
+ * render use that value, with `isLoading` false, so the page hydrates without a mismatch or a
29
+ * flash of the default. Once the browser's rules load, the live value takes over. If they
30
+ * never load (a blocked CDN, no network), the server's value stays rather than the page
31
+ * switching to the code default.
32
+ *
33
+ * Without a bootstrap value for the key it behaves exactly like the React hook.
34
+ */
35
+ declare function useFlag<T extends FlagValue>(key: string, defaultValue: T): UseFlagResult<WidenFlagValue<T>>;
36
+ declare function useVariant(key: string, defaultVariant?: string): UseVariantResult;
37
+
38
+ export { NextFlagsProvider, type NextFlagsProviderProps, useFlag, useVariant };
package/dist/client.js ADDED
@@ -0,0 +1,263 @@
1
+ 'use client';
2
+
3
+ // src/client/NextFlagsProvider.tsx
4
+ import { useCallback, useMemo as useMemo2, useRef, useSyncExternalStore } from "react";
5
+ import { FlagsProvider } from "@zenmanage/react";
6
+
7
+ // src/bootstrap.ts
8
+ import {
9
+ Context,
10
+ DefaultsCollection
11
+ } from "@zenmanage/sdk";
12
+
13
+ // src/types.ts
14
+ var DEFAULT_BOOTSTRAP_ELEMENT_ID = "__ZENMANAGE_BOOTSTRAP__";
15
+
16
+ // src/bootstrap.ts
17
+ function isPlainObject(value) {
18
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19
+ }
20
+ function isFlagValue(value) {
21
+ return typeof value === "boolean" || typeof value === "string" || typeof value === "number" && Number.isFinite(value) || typeof value === "object" && value !== null;
22
+ }
23
+ function deserializeBootstrapPayload(serializedPayload) {
24
+ try {
25
+ const parsed = JSON.parse(serializedPayload);
26
+ if (!isPlainObject(parsed) || parsed.version !== 1 || !isPlainObject(parsed.flags) || typeof parsed.generatedAt !== "string") {
27
+ return null;
28
+ }
29
+ const flags = Object.fromEntries(
30
+ Object.entries(parsed.flags).filter(([, value]) => isFlagValue(value))
31
+ );
32
+ return {
33
+ version: 1,
34
+ generatedAt: parsed.generatedAt,
35
+ flags,
36
+ ...isPlainObject(parsed.context) ? { context: parsed.context } : {}
37
+ };
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+ function defaultsFromBootstrapPayload(payload) {
43
+ if (!payload) {
44
+ return void 0;
45
+ }
46
+ return DefaultsCollection.fromObject(payload.flags);
47
+ }
48
+ function contextFromBootstrapPayload(payload) {
49
+ if (!payload?.context) {
50
+ return void 0;
51
+ }
52
+ try {
53
+ return Context.fromObject(payload.context);
54
+ } catch {
55
+ return void 0;
56
+ }
57
+ }
58
+
59
+ // src/defaults.ts
60
+ import { DefaultsCollection as DefaultsCollection2 } from "@zenmanage/sdk";
61
+ function mergeDefaults(base, bootstrap) {
62
+ if (!base && !bootstrap) {
63
+ return void 0;
64
+ }
65
+ const merged = new DefaultsCollection2();
66
+ for (const source of [bootstrap, base]) {
67
+ if (!source) {
68
+ continue;
69
+ }
70
+ for (const key of source.keys()) {
71
+ const value = source.get(key);
72
+ if (value !== void 0) {
73
+ merged.set(key, value);
74
+ }
75
+ }
76
+ }
77
+ return merged;
78
+ }
79
+
80
+ // src/client/BootstrapProvider.tsx
81
+ import { useEffect, useMemo, useState } from "react";
82
+ import { useFlagsContext } from "@zenmanage/react";
83
+
84
+ // src/client/context.ts
85
+ import { createContext } from "react";
86
+ var BootstrapContext = createContext(null);
87
+
88
+ // src/client/BootstrapProvider.tsx
89
+ import { jsx } from "react/jsx-runtime";
90
+ function BootstrapProvider({ flags, children }) {
91
+ const { manager, isReady, revision } = useFlagsContext();
92
+ const [live, setLive] = useState(null);
93
+ useEffect(() => {
94
+ if (!flags || !isReady) {
95
+ return void 0;
96
+ }
97
+ let isCurrent = true;
98
+ manager.all().then(
99
+ (loaded) => isCurrent && setLive(new Set(loaded.map((flag) => flag.getKey()))),
100
+ () => isCurrent && setLive(/* @__PURE__ */ new Set())
101
+ );
102
+ return () => {
103
+ isCurrent = false;
104
+ };
105
+ }, [flags, isReady, manager, revision]);
106
+ const value = useMemo(() => flags ? { flags, live } : null, [flags, live]);
107
+ return /* @__PURE__ */ jsx(BootstrapContext.Provider, { value, children });
108
+ }
109
+
110
+ // src/client/createClient.ts
111
+ import { ConfigBuilder, Zenmanage } from "@zenmanage/sdk";
112
+
113
+ // package.json
114
+ var version = "1.0.1";
115
+
116
+ // src/identity.ts
117
+ var CLIENT_AGENT = "zenmanage-nextjs";
118
+ var PACKAGE_VERSION = version;
119
+
120
+ // src/client/createClient.ts
121
+ function isServerRender() {
122
+ return typeof window === "undefined" && typeof document === "undefined";
123
+ }
124
+ function createProviderClient(options) {
125
+ const { environmentToken, apiEndpoint, cacheTtl, enableUsageReporting } = options;
126
+ if (!environmentToken) {
127
+ throw new Error("NextFlagsProvider requires either a client or an environmentToken.");
128
+ }
129
+ if (environmentToken.startsWith("srv_")) {
130
+ throw new Error(
131
+ "NextFlagsProvider received a server key (srv_...). Server keys must never reach the browser; use a client key (cli_...)."
132
+ );
133
+ }
134
+ if (isServerRender()) {
135
+ if (!environmentToken.startsWith("cli_")) {
136
+ throw new Error("NextFlagsProvider needs a client key (cli_...).");
137
+ }
138
+ return new Zenmanage({
139
+ environmentToken,
140
+ apiEndpoint,
141
+ cacheTtl,
142
+ enableUsageReporting,
143
+ clientAgent: CLIENT_AGENT,
144
+ sdkVersion: PACKAGE_VERSION
145
+ });
146
+ }
147
+ const builder = ConfigBuilder.create().withEnvironmentToken(environmentToken).withClientAgent(CLIENT_AGENT).withSdkVersion(PACKAGE_VERSION);
148
+ if (apiEndpoint) {
149
+ builder.withApiEndpoint(apiEndpoint);
150
+ }
151
+ if (typeof cacheTtl === "number") {
152
+ builder.withCacheTtl(cacheTtl);
153
+ }
154
+ if (typeof enableUsageReporting === "boolean") {
155
+ builder.withUsageReporting(enableUsageReporting);
156
+ }
157
+ return new Zenmanage(builder.build());
158
+ }
159
+
160
+ // src/client/NextFlagsProvider.tsx
161
+ import { jsx as jsx2 } from "react/jsx-runtime";
162
+ var subscribeToNothing = () => () => void 0;
163
+ function useDocumentPayload(elementId, enabled) {
164
+ const cache = useRef({
165
+ text: null,
166
+ payload: null
167
+ });
168
+ const getSnapshot = useCallback(() => {
169
+ if (!enabled || typeof document === "undefined") {
170
+ return null;
171
+ }
172
+ const text = document.getElementById(elementId)?.textContent ?? null;
173
+ if (text !== cache.current.text) {
174
+ cache.current = { text, payload: text === null ? null : deserializeBootstrapPayload(text) };
175
+ }
176
+ return cache.current.payload;
177
+ }, [elementId, enabled]);
178
+ return useSyncExternalStore(subscribeToNothing, getSnapshot, () => null);
179
+ }
180
+ function NextFlagsProvider({
181
+ client,
182
+ environmentToken,
183
+ apiEndpoint,
184
+ cacheTtl,
185
+ enableUsageReporting,
186
+ context,
187
+ defaults,
188
+ bootstrapPayload,
189
+ bootstrapElementId = DEFAULT_BOOTSTRAP_ELEMENT_ID,
190
+ children,
191
+ ...providerProps
192
+ }) {
193
+ const documentPayload = useDocumentPayload(bootstrapElementId, !bootstrapPayload);
194
+ const payload = bootstrapPayload ?? documentPayload;
195
+ const resolvedClient = useMemo2(
196
+ () => client ?? createProviderClient({ environmentToken, apiEndpoint, cacheTtl, enableUsageReporting }),
197
+ [client, environmentToken, apiEndpoint, cacheTtl, enableUsageReporting]
198
+ );
199
+ const mergedDefaults = useMemo2(
200
+ () => mergeDefaults(defaults, defaultsFromBootstrapPayload(payload)),
201
+ [defaults, payload]
202
+ );
203
+ const resolvedContext = useMemo2(
204
+ () => context ?? contextFromBootstrapPayload(payload),
205
+ [context, payload]
206
+ );
207
+ return /* @__PURE__ */ jsx2(
208
+ FlagsProvider,
209
+ {
210
+ ...providerProps,
211
+ client: resolvedClient,
212
+ context: resolvedContext,
213
+ defaults: mergedDefaults,
214
+ children: /* @__PURE__ */ jsx2(BootstrapProvider, { flags: payload?.flags ?? null, children })
215
+ }
216
+ );
217
+ }
218
+
219
+ // src/client/hooks.ts
220
+ import { useContext } from "react";
221
+ import {
222
+ useFlag as useReactFlag
223
+ } from "@zenmanage/react";
224
+ function sameKind(candidate, fallback) {
225
+ if (typeof fallback === "object") {
226
+ return typeof candidate === "object" && candidate !== null && Array.isArray(candidate) === Array.isArray(fallback);
227
+ }
228
+ return typeof candidate === typeof fallback;
229
+ }
230
+ function useFlag(key, defaultValue) {
231
+ const bootstrap = useContext(BootstrapContext);
232
+ const result = useReactFlag(key, defaultValue);
233
+ const seed = bootstrap?.flags[key];
234
+ if (seed === void 0 || !sameKind(seed, defaultValue)) {
235
+ return result;
236
+ }
237
+ const hasLiveValue = bootstrap?.live?.has(key) === true;
238
+ if (hasLiveValue && !result.isLoading) {
239
+ return result;
240
+ }
241
+ return { ...result, value: seed, isLoading: false };
242
+ }
243
+ function useVariant(key, defaultVariant = "control") {
244
+ const result = useFlag(key, defaultVariant);
245
+ return {
246
+ key,
247
+ variant: result.value,
248
+ flag: result.flag,
249
+ isLoading: result.isLoading,
250
+ error: result.error,
251
+ refresh: result.refresh
252
+ };
253
+ }
254
+
255
+ // src/client.ts
256
+ import { useFlagsContext as useFlagsContext2 } from "@zenmanage/react";
257
+ export {
258
+ NextFlagsProvider,
259
+ useFlag,
260
+ useFlagsContext2 as useFlagsContext,
261
+ useVariant
262
+ };
263
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/NextFlagsProvider.tsx","../src/bootstrap.ts","../src/types.ts","../src/defaults.ts","../src/client/BootstrapProvider.tsx","../src/client/context.ts","../src/client/createClient.ts","../package.json","../src/identity.ts","../src/client/hooks.ts","../src/client.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useSyncExternalStore, type ReactElement } from 'react';\nimport { FlagsProvider } from '@zenmanage/react';\nimport {\n contextFromBootstrapPayload,\n defaultsFromBootstrapPayload,\n deserializeBootstrapPayload,\n} from '../bootstrap';\nimport { mergeDefaults } from '../defaults';\nimport {\n DEFAULT_BOOTSTRAP_ELEMENT_ID,\n type BootstrapPayload,\n type NextFlagsProviderProps,\n} from '../types';\nimport { BootstrapProvider } from './BootstrapProvider';\nimport { createProviderClient } from './createClient';\n\nconst subscribeToNothing = (): (() => void) => () => undefined;\n\n/**\n * Reads the payload from a `<script>` tag. `useSyncExternalStore` serves `null` while\n * hydrating and the real payload right after, so the first client render matches the server\n * render instead of reading the DOM mid-render.\n */\nfunction useDocumentPayload(elementId: string, enabled: boolean): BootstrapPayload | null {\n const cache = useRef<{ text: string | null; payload: BootstrapPayload | null }>({\n text: null,\n payload: null,\n });\n\n const getSnapshot = useCallback((): BootstrapPayload | null => {\n if (!enabled || typeof document === 'undefined') {\n return null;\n }\n\n const text = document.getElementById(elementId)?.textContent ?? null;\n if (text !== cache.current.text) {\n cache.current = { text, payload: text === null ? null : deserializeBootstrapPayload(text) };\n }\n\n return cache.current.payload;\n }, [elementId, enabled]);\n\n return useSyncExternalStore(subscribeToNothing, getSnapshot, () => null);\n}\n\nexport function NextFlagsProvider({\n client,\n environmentToken,\n apiEndpoint,\n cacheTtl,\n enableUsageReporting,\n context,\n defaults,\n bootstrapPayload,\n bootstrapElementId = DEFAULT_BOOTSTRAP_ELEMENT_ID,\n children,\n ...providerProps\n}: NextFlagsProviderProps): ReactElement {\n const documentPayload = useDocumentPayload(bootstrapElementId, !bootstrapPayload);\n const payload = bootstrapPayload ?? documentPayload;\n\n const resolvedClient = useMemo(\n () =>\n client ??\n createProviderClient({ environmentToken, apiEndpoint, cacheTtl, enableUsageReporting }),\n [client, environmentToken, apiEndpoint, cacheTtl, enableUsageReporting]\n );\n\n const mergedDefaults = useMemo(\n () => mergeDefaults(defaults, defaultsFromBootstrapPayload(payload)),\n [defaults, payload]\n );\n\n // Without an explicit context the browser evaluates for the user the server evaluated for.\n const resolvedContext = useMemo(\n () => context ?? contextFromBootstrapPayload(payload),\n [context, payload]\n );\n\n return (\n <FlagsProvider\n {...providerProps}\n client={resolvedClient}\n context={resolvedContext}\n defaults={mergedDefaults}\n >\n <BootstrapProvider flags={payload?.flags ?? null}>{children}</BootstrapProvider>\n </FlagsProvider>\n );\n}\n","import {\n Context,\n DefaultsCollection,\n type ContextData,\n type Flag,\n type FlagValue,\n} from '@zenmanage/sdk';\nimport type {\n BootstrapPayload,\n BuildBootstrapPayloadOptions,\n BuildBootstrapScriptOptions,\n} from './types';\nimport { DEFAULT_BOOTSTRAP_ELEMENT_ID } from './types';\n\nconst ELEMENT_ID_PATTERN = /^[A-Za-z_][\\w:.-]*$/;\n\nfunction escapeForScriptTag(value: string): string {\n return value\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isFlagValue(value: unknown): value is FlagValue {\n return (\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n (typeof value === 'number' && Number.isFinite(value)) ||\n (typeof value === 'object' && value !== null)\n );\n}\n\n/**\n * Builds the payload `NextFlagsProvider` reads. Accepts the flags straight from\n * `getServerFlags`, or a plain `{ key: value }` record.\n */\nexport function buildBootstrapPayload(\n flags: Flag[] | Record<string, FlagValue>,\n options: BuildBootstrapPayloadOptions = {}\n): BootstrapPayload {\n const values = Array.isArray(flags)\n ? Object.fromEntries(flags.map((flag) => [flag.getKey(), flag.getValue()]))\n : flags;\n\n // `context` is left out rather than set to undefined: Next.js refuses undefined in the props\n // `getServerSideProps` returns, and this payload is meant to be passed there.\n return {\n version: 1,\n generatedAt: (options.generatedAt ?? new Date()).toISOString(),\n flags: values,\n ...(options.context ? { context: options.context.toJSON() } : {}),\n };\n}\n\nexport function serializeBootstrapPayload(payload: BootstrapPayload): string {\n return escapeForScriptTag(JSON.stringify(payload));\n}\n\nexport function deserializeBootstrapPayload(serializedPayload: string): BootstrapPayload | null {\n try {\n const parsed: unknown = JSON.parse(serializedPayload);\n\n if (\n !isPlainObject(parsed) ||\n parsed.version !== 1 ||\n !isPlainObject(parsed.flags) ||\n typeof parsed.generatedAt !== 'string'\n ) {\n return null;\n }\n\n const flags = Object.fromEntries(\n Object.entries(parsed.flags).filter(([, value]) => isFlagValue(value))\n ) as Record<string, FlagValue>;\n\n return {\n version: 1,\n generatedAt: parsed.generatedAt,\n flags,\n ...(isPlainObject(parsed.context)\n ? { context: parsed.context as unknown as ContextData }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Renders the payload as a JSON `<script>` tag for pages that can't pass props to the provider.\n * Prefer the `bootstrapPayload` prop: only a prop is identical on the server and in the browser.\n */\nexport function buildBootstrapScript(\n payload: BootstrapPayload,\n options: BuildBootstrapScriptOptions = {}\n): string {\n const elementId = options.elementId ?? DEFAULT_BOOTSTRAP_ELEMENT_ID;\n\n if (!ELEMENT_ID_PATTERN.test(elementId)) {\n throw new Error(`Invalid bootstrap element id \"${elementId}\".`);\n }\n\n const serialized = serializeBootstrapPayload(payload);\n return `<script id=\"${elementId}\" type=\"application/json\">${serialized}</script>`;\n}\n\nexport function readBootstrapPayloadFromDocument(\n elementId = DEFAULT_BOOTSTRAP_ELEMENT_ID\n): BootstrapPayload | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const element = document.getElementById(elementId);\n if (!element) {\n return null;\n }\n\n const text = element.textContent ?? '';\n return deserializeBootstrapPayload(text);\n}\n\nexport function defaultsFromBootstrapPayload(\n payload: BootstrapPayload | null | undefined\n): DefaultsCollection | undefined {\n if (!payload) {\n return undefined;\n }\n\n return DefaultsCollection.fromObject(payload.flags);\n}\n\nexport function defaultsFromBootstrapDocument(\n elementId = DEFAULT_BOOTSTRAP_ELEMENT_ID\n): DefaultsCollection | undefined {\n return defaultsFromBootstrapPayload(readBootstrapPayloadFromDocument(elementId));\n}\n\nexport function contextFromBootstrapPayload(\n payload: BootstrapPayload | null | undefined\n): Context | undefined {\n if (!payload?.context) {\n return undefined;\n }\n\n try {\n return Context.fromObject(payload.context);\n } catch {\n return undefined;\n }\n}\n","import type {\n Context,\n ContextData,\n DefaultsCollection,\n FlagManager,\n FlagValue,\n Logger,\n Zenmanage,\n} from '@zenmanage/sdk';\nimport type { FlagsProviderProps } from '@zenmanage/react';\n\nexport const DEFAULT_BOOTSTRAP_ELEMENT_ID = '__ZENMANAGE_BOOTSTRAP__';\n\n/**\n * Rules are cached in memory for this many seconds. The SDK's own default is an hour, which\n * would leave a long-running `next start` server on stale rules; a minute keeps flag changes\n * visible quickly while still sharing one fetch across every request and component.\n */\nexport const DEFAULT_SERVER_CACHE_TTL = 60;\n\n/**\n * Widens a literal (`false`, `'control'`, `1500`) to its primitive type, so a value read with\n * a literal fallback is `boolean`, `string` or `number` rather than the literal. Object and\n * array values (JSON flags) pass through unchanged.\n */\nexport type WidenFlagValue<T extends FlagValue> = T extends boolean\n ? boolean\n : T extends number\n ? number\n : T extends string\n ? string\n : T;\n\nexport interface NextZenmanageClientOptions {\n /** A server key (`srv_...`). Server and edge runtimes reject client keys. */\n environmentToken: string;\n apiEndpoint?: string;\n /** Seconds to cache rules in memory. Defaults to {@link DEFAULT_SERVER_CACHE_TTL}. */\n cacheTtl?: number;\n enableUsageReporting?: boolean;\n logger?: Logger;\n}\n\nexport interface ServerFlagInput extends NextZenmanageClientOptions {\n key: string;\n defaultValue?: FlagValue;\n context?: Context;\n defaults?: DefaultsCollection;\n}\n\nexport interface ServerFlagsInput extends NextZenmanageClientOptions {\n context?: Context;\n defaults?: DefaultsCollection;\n}\n\nexport interface ServerBootstrapInput extends ServerFlagsInput {\n /**\n * The flags to send to the browser. Bootstrapping every flag puts each flag's key and\n * value in the page source, so list only what client components read.\n */\n keys?: string[];\n /** Include the evaluation context in the payload so the browser evaluates for the same user. */\n includeContext?: boolean;\n}\n\nexport interface BootstrapPayload {\n version: 1;\n generatedAt: string;\n flags: Record<string, FlagValue>;\n context?: ContextData;\n}\n\nexport interface BuildBootstrapPayloadOptions {\n context?: Context;\n generatedAt?: Date;\n}\n\nexport interface BuildBootstrapScriptOptions {\n elementId?: string;\n}\n\nexport interface RequestCookieValue {\n value: string;\n}\n\nexport interface RequestCookiesLike {\n get(name: string): RequestCookieValue | string | undefined;\n}\n\nexport interface RequestGeoLike {\n country?: string;\n region?: string;\n city?: string;\n}\n\nexport interface RequestLike {\n headers: Headers;\n cookies?: RequestCookiesLike;\n nextUrl?: { pathname: string };\n url?: string;\n /** Removed from `NextRequest` in Next.js 15; the forwarding headers are used instead. */\n ip?: string | null;\n /** Removed from `NextRequest` in Next.js 15; the Vercel and Cloudflare headers are used instead. */\n geo?: RequestGeoLike;\n}\n\nexport interface BuildRequestContextOptions {\n contextType?: string;\n contextName?: string;\n identifierCookieName?: string;\n identifierHeaderName?: string;\n /** Add `country`, `region` and `city` attributes when the platform reports them. Default `true`. */\n includeGeo?: boolean;\n /** Add the visitor's IP address as an `ip` attribute. Default `false`: an IP is personal data. */\n includeIp?: boolean;\n additionalAttributes?: Record<string, string | string[] | undefined>;\n}\n\nexport interface MiddlewareFlagInput extends NextZenmanageClientOptions {\n request: RequestLike;\n key: string;\n defaultValue?: FlagValue;\n defaults?: DefaultsCollection;\n requestContext?: BuildRequestContextOptions;\n}\n\nexport interface NextFlagsProviderProps extends Omit<FlagsProviderProps, 'defaults'> {\n defaults?: DefaultsCollection;\n /**\n * Flags evaluated on the server. Pass it as a prop so the server render and the first\n * client render see the same value, which is what keeps hydration clean.\n */\n bootstrapPayload?: BootstrapPayload | null;\n /** Read the payload from a `<script>` tag with this id when `bootstrapPayload` isn't set. */\n bootstrapElementId?: string;\n}\n\nexport interface NextFlagsRuntime {\n client: Zenmanage;\n manager: FlagManager;\n}\n","import { DefaultsCollection } from '@zenmanage/sdk';\n\n/** Combines two collections. `base` wins where both define a key. */\nexport function mergeDefaults(\n base?: DefaultsCollection,\n bootstrap?: DefaultsCollection\n): DefaultsCollection | undefined {\n if (!base && !bootstrap) {\n return undefined;\n }\n\n const merged = new DefaultsCollection();\n\n for (const source of [bootstrap, base]) {\n if (!source) {\n continue;\n }\n\n for (const key of source.keys()) {\n const value = source.get(key);\n if (value !== undefined) {\n merged.set(key, value);\n }\n }\n }\n\n return merged;\n}\n","import { useEffect, useMemo, useState, type ReactElement, type ReactNode } from 'react';\nimport type { FlagValue } from '@zenmanage/sdk';\nimport { useFlagsContext } from '@zenmanage/react';\nimport { BootstrapContext } from './context';\n\ninterface BootstrapProviderProps {\n flags: Record<string, FlagValue> | null;\n children: ReactNode;\n}\n\n/**\n * Sits inside `FlagsProvider`. Once the browser has tried to load the rules it records which\n * flags they contain, so `useFlag` can tell \"the live value\" from \"the SDK fell back to the\n * default because nothing loaded\".\n */\nexport function BootstrapProvider({ flags, children }: BootstrapProviderProps): ReactElement {\n const { manager, isReady, revision } = useFlagsContext();\n const [live, setLive] = useState<ReadonlySet<string> | null>(null);\n\n useEffect(() => {\n if (!flags || !isReady) {\n return undefined;\n }\n\n let isCurrent = true;\n\n // The SDK serves defaults instead of throwing when rules can't be loaded, so an empty list\n // is what an unreachable API looks like.\n manager.all().then(\n (loaded) => isCurrent && setLive(new Set(loaded.map((flag) => flag.getKey()))),\n () => isCurrent && setLive(new Set())\n );\n\n return () => {\n isCurrent = false;\n };\n }, [flags, isReady, manager, revision]);\n\n const value = useMemo(() => (flags ? { flags, live } : null), [flags, live]);\n\n return <BootstrapContext.Provider value={value}>{children}</BootstrapContext.Provider>;\n}\n","import { createContext } from 'react';\nimport type { FlagValue } from '@zenmanage/sdk';\n\nexport interface BootstrapState {\n /** The flag values the server evaluated. */\n flags: Record<string, FlagValue>;\n /**\n * The keys the browser's own rules contain, or `null` until it has asked. A flag that is\n * bootstrapped but absent here has no live evaluation behind it (the rules didn't load, or\n * the flag doesn't exist), so the server's value is the best answer there is.\n */\n live: ReadonlySet<string> | null;\n}\n\n/** `null` when the provider wasn't given a bootstrap payload. */\nexport const BootstrapContext = createContext<BootstrapState | null>(null);\n","import { ConfigBuilder, Zenmanage } from '@zenmanage/sdk';\nimport { CLIENT_AGENT, PACKAGE_VERSION } from '../identity';\n\ninterface ClientOptions {\n environmentToken?: string;\n apiEndpoint?: string;\n cacheTtl?: number;\n enableUsageReporting?: boolean;\n}\n\n// Mirrors how @zenmanage/sdk tells the runtimes apart.\nfunction isServerRender(): boolean {\n return typeof window === 'undefined' && typeof document === 'undefined';\n}\n\n/**\n * Builds the client a provider hands to its hooks.\n *\n * Next.js renders Client Components on the server as well as in the browser, and the SDK\n * refuses a client key in Node.js. Nothing is fetched while rendering (effects don't run), so\n * the server render gets a client assembled without that check, which is only ever asked for\n * its defaults. The browser gets a fully validated one.\n */\nexport function createProviderClient(options: ClientOptions): Zenmanage {\n const { environmentToken, apiEndpoint, cacheTtl, enableUsageReporting } = options;\n\n if (!environmentToken) {\n throw new Error('NextFlagsProvider requires either a client or an environmentToken.');\n }\n\n // A prop on a Client Component is written into the page, so a server key here would leak.\n if (environmentToken.startsWith('srv_')) {\n throw new Error(\n 'NextFlagsProvider received a server key (srv_...). Server keys must never reach the browser; use a client key (cli_...).'\n );\n }\n\n if (isServerRender()) {\n if (!environmentToken.startsWith('cli_')) {\n throw new Error('NextFlagsProvider needs a client key (cli_...).');\n }\n\n return new Zenmanage({\n environmentToken,\n apiEndpoint,\n cacheTtl,\n enableUsageReporting,\n clientAgent: CLIENT_AGENT,\n sdkVersion: PACKAGE_VERSION,\n });\n }\n\n const builder = ConfigBuilder.create()\n .withEnvironmentToken(environmentToken)\n .withClientAgent(CLIENT_AGENT)\n .withSdkVersion(PACKAGE_VERSION);\n\n if (apiEndpoint) {\n builder.withApiEndpoint(apiEndpoint);\n }\n\n if (typeof cacheTtl === 'number') {\n builder.withCacheTtl(cacheTtl);\n }\n\n if (typeof enableUsageReporting === 'boolean') {\n builder.withUsageReporting(enableUsageReporting);\n }\n\n return new Zenmanage(builder.build());\n}\n","{\n \"name\": \"@zenmanage/nextjs\",\n \"version\": \"1.0.1\",\n \"description\": \"Next.js integration helpers for Zenmanage feature flags: server evaluation, middleware, and hydration-safe client bootstrap\",\n \"keywords\": [\n \"nextjs\",\n \"next.js\",\n \"react\",\n \"ssr\",\n \"app-router\",\n \"pages-router\",\n \"middleware\",\n \"feature-flags\",\n \"feature-toggles\",\n \"feature-management\",\n \"remote-config\",\n \"ab-testing\",\n \"experiments\",\n \"zenmanage\"\n ],\n \"homepage\": \"https://github.com/zenmanage/zenmanage-nextjs#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/zenmanage/zenmanage-nextjs/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/zenmanage/zenmanage-nextjs.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Zenmanage\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./server\": {\n \"import\": {\n \"types\": \"./dist/server.d.ts\",\n \"default\": \"./dist/server.js\"\n },\n \"require\": {\n \"types\": \"./dist/server.d.cts\",\n \"default\": \"./dist/server.cjs\"\n }\n },\n \"./middleware\": {\n \"import\": {\n \"types\": \"./dist/middleware.d.ts\",\n \"default\": \"./dist/middleware.js\"\n },\n \"require\": {\n \"types\": \"./dist/middleware.d.cts\",\n \"default\": \"./dist/middleware.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/client.d.ts\",\n \"default\": \"./dist/client.js\"\n },\n \"require\": {\n \"types\": \"./dist/client.d.cts\",\n \"default\": \"./dist/client.cjs\"\n }\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"sideEffects\": false,\n \"scripts\": {\n \"build\": \"rm -rf dist && tsup\",\n \"clean\": \"rm -rf dist coverage\",\n \"changeset\": \"changeset\",\n \"version-packages\": \"changeset version\",\n \"release\": \"changeset publish\",\n \"lint\": \"eslint src tests --ext .ts,.tsx\",\n \"lint:fix\": \"eslint src tests --ext .ts,.tsx --fix\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\" \\\"tests/**/*.{ts,tsx}\\\" \\\"examples/**/*.{ts,tsx}\\\" \\\"examples/smoke-app/**/*.{js,jsx}\\\" \\\"scripts/**/*.mjs\\\" \\\"*.{md,json,yml,yaml,cjs}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\" \\\"tests/**/*.{ts,tsx}\\\" \\\"examples/**/*.{ts,tsx}\\\" \\\"examples/smoke-app/**/*.{js,jsx}\\\" \\\"scripts/**/*.mjs\\\" \\\"*.{md,json,yml,yaml,cjs}\\\"\",\n \"type-check\": \"tsc --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.examples.json\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:smoke\": \"npm run build && node scripts/smoke.mjs\",\n \"validate\": \"npm run format:check && npm run lint && npm run type-check && npm run test:coverage && npm run build && npm run test:smoke\",\n \"prepublishOnly\": \"npm run validate\"\n },\n \"peerDependencies\": {\n \"@zenmanage/react\": \"^1.0.0\",\n \"@zenmanage/sdk\": \"^3.5.0\",\n \"next\": \"^13.4.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\",\n \"react\": \"^18.2.0 || ^19.0.0\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.28.1\",\n \"@testing-library/react\": \"^16.0.1\",\n \"@types/node\": \"^20.11.0\",\n \"@types/react\": \"^19.2.0\",\n \"@types/react-dom\": \"^19.2.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.20.0\",\n \"@typescript-eslint/parser\": \"^6.20.0\",\n \"@vitest/coverage-v8\": \"^1.6.0\",\n \"@zenmanage/react\": \"^1.0.0\",\n \"@zenmanage/sdk\": \"^3.5.0\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.2.1\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"jsdom\": \"^24.1.1\",\n \"next\": \"^15.5.0\",\n \"prettier\": \"^3.3.3\",\n \"react\": \"^19.2.0\",\n \"react-dom\": \"^19.2.0\",\n \"tsup\": \"^8.2.4\",\n \"typescript\": \"^5.6.2\",\n \"vitest\": \"^1.6.0\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n }\n}\n","import { version } from '../package.json';\n\n/** The client agent the API registers this package under (see the api's EnsureClientAgentIsValid). */\nexport const CLIENT_AGENT = 'zenmanage-nextjs';\n\nexport const PACKAGE_VERSION: string = version;\n","import { useContext } from 'react';\nimport type { FlagValue } from '@zenmanage/sdk';\nimport {\n useFlag as useReactFlag,\n type UseFlagResult,\n type UseVariantResult,\n type WidenFlagValue,\n} from '@zenmanage/react';\nimport { BootstrapContext } from './context';\n\nfunction sameKind(candidate: FlagValue, fallback: FlagValue): boolean {\n if (typeof fallback === 'object') {\n return (\n typeof candidate === 'object' &&\n candidate !== null &&\n Array.isArray(candidate) === Array.isArray(fallback)\n );\n }\n\n return typeof candidate === typeof fallback;\n}\n\n/**\n * Like `useFlag` from `@zenmanage/react`, but it serves the value the server evaluated until\n * the browser has a live evaluation to replace it. Both the server render and the first client\n * render use that value, with `isLoading` false, so the page hydrates without a mismatch or a\n * flash of the default. Once the browser's rules load, the live value takes over. If they\n * never load (a blocked CDN, no network), the server's value stays rather than the page\n * switching to the code default.\n *\n * Without a bootstrap value for the key it behaves exactly like the React hook.\n */\nexport function useFlag<T extends FlagValue>(\n key: string,\n defaultValue: T\n): UseFlagResult<WidenFlagValue<T>> {\n const bootstrap = useContext(BootstrapContext);\n // The hook's own default stays the fallback for the live evaluation: reporting the server's\n // value as the code default would corrupt the default-value usage the API records.\n const result = useReactFlag(key, defaultValue);\n\n const seed = bootstrap?.flags[key];\n if (seed === undefined || !sameKind(seed, defaultValue)) {\n return result;\n }\n\n const hasLiveValue = bootstrap?.live?.has(key) === true;\n if (hasLiveValue && !result.isLoading) {\n return result;\n }\n\n return { ...result, value: seed as WidenFlagValue<T>, isLoading: false };\n}\n\nexport function useVariant(key: string, defaultVariant = 'control'): UseVariantResult {\n const result = useFlag<string>(key, defaultVariant);\n\n return {\n key,\n variant: result.value,\n flag: result.flag,\n isLoading: result.isLoading,\n error: result.error,\n refresh: result.refresh,\n };\n}\n","export { NextFlagsProvider } from './client/NextFlagsProvider';\nexport { useFlag, useVariant } from './client/hooks';\nexport { useFlagsContext } from '@zenmanage/react';\nexport type { NextFlagsProviderProps } from './types';\n"],"mappings":"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","names":["useMemo","DefaultsCollection","jsx","useMemo","useFlagsContext"]}