@zenmanage/nextjs 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/middleware.ts
21
+ var middleware_exports = {};
22
+ __export(middleware_exports, {
23
+ buildContextFromRequest: () => buildContextFromRequest,
24
+ evaluateMiddlewareFlag: () => evaluateMiddlewareFlag
25
+ });
26
+ module.exports = __toCommonJS(middleware_exports);
27
+ var import_sdk2 = require("@zenmanage/sdk");
28
+
29
+ // src/server.ts
30
+ var import_sdk = require("@zenmanage/sdk");
31
+
32
+ // src/types.ts
33
+ var DEFAULT_SERVER_CACHE_TTL = 60;
34
+
35
+ // package.json
36
+ var version = "1.0.0";
37
+
38
+ // src/identity.ts
39
+ var CLIENT_AGENT = "zenmanage-nextjs";
40
+ var PACKAGE_VERSION = version;
41
+
42
+ // src/server.ts
43
+ function buildClient(options) {
44
+ const builder = import_sdk.ConfigBuilder.create().withEnvironmentToken(options.environmentToken).withClientAgent(CLIENT_AGENT).withSdkVersion(PACKAGE_VERSION).withCacheTtl(options.cacheTtl ?? DEFAULT_SERVER_CACHE_TTL);
45
+ if (options.apiEndpoint) {
46
+ builder.withApiEndpoint(options.apiEndpoint);
47
+ }
48
+ if (typeof options.enableUsageReporting === "boolean") {
49
+ builder.withUsageReporting(options.enableUsageReporting);
50
+ }
51
+ if (options.logger) {
52
+ builder.withLogger(options.logger);
53
+ }
54
+ return new import_sdk.Zenmanage(builder.build());
55
+ }
56
+ var clientsWithoutLogger = /* @__PURE__ */ new Map();
57
+ var clientsByLogger = /* @__PURE__ */ new WeakMap();
58
+ function configurationKey(options) {
59
+ return JSON.stringify([
60
+ options.environmentToken,
61
+ options.apiEndpoint ?? null,
62
+ options.cacheTtl ?? null,
63
+ options.enableUsageReporting ?? null
64
+ ]);
65
+ }
66
+ function createServerClient(options) {
67
+ let clients = clientsWithoutLogger;
68
+ if (options.logger) {
69
+ clients = clientsByLogger.get(options.logger) ?? /* @__PURE__ */ new Map();
70
+ clientsByLogger.set(options.logger, clients);
71
+ }
72
+ const key = configurationKey(options);
73
+ let client = clients.get(key);
74
+ if (!client) {
75
+ client = buildClient(options);
76
+ clients.set(key, client);
77
+ }
78
+ return client;
79
+ }
80
+ function createServerRuntime(options) {
81
+ const client = createServerClient(options);
82
+ let manager = client.flags().withDefaults(options.defaults ?? new import_sdk.DefaultsCollection());
83
+ if (options.context) {
84
+ manager = manager.withContext(options.context);
85
+ }
86
+ return { client, manager };
87
+ }
88
+ function createServerManager(options) {
89
+ return createServerRuntime(options).manager;
90
+ }
91
+ async function getServerFlag(input) {
92
+ const manager = createServerManager(input);
93
+ return manager.single(input.key, input.defaultValue);
94
+ }
95
+
96
+ // src/middleware.ts
97
+ function getCookieValue(cookies, name) {
98
+ if (!cookies) {
99
+ return void 0;
100
+ }
101
+ const value = cookies.get(name);
102
+ if (typeof value === "string") {
103
+ return value;
104
+ }
105
+ return value?.value;
106
+ }
107
+ function getRequestPath(request) {
108
+ if (request.nextUrl?.pathname) {
109
+ return request.nextUrl.pathname;
110
+ }
111
+ if (request.url) {
112
+ return new URL(request.url).pathname;
113
+ }
114
+ return "/";
115
+ }
116
+ function decodeHeader(value) {
117
+ if (!value) {
118
+ return void 0;
119
+ }
120
+ try {
121
+ return decodeURIComponent(value);
122
+ } catch {
123
+ return value;
124
+ }
125
+ }
126
+ function getIp(request) {
127
+ if (request.ip) {
128
+ return request.ip;
129
+ }
130
+ const forwarded = request.headers.get("x-forwarded-for")?.split(",")[0]?.trim();
131
+ return forwarded || request.headers.get("x-real-ip") || void 0;
132
+ }
133
+ function getGeo(request) {
134
+ const { headers, geo } = request;
135
+ return {
136
+ country: geo?.country || headers.get("x-vercel-ip-country") || headers.get("cf-ipcountry") || void 0,
137
+ region: geo?.region || headers.get("x-vercel-ip-country-region") || void 0,
138
+ city: geo?.city || decodeHeader(headers.get("x-vercel-ip-city"))
139
+ };
140
+ }
141
+ function buildContextFromRequest(request, options = {}) {
142
+ const identifierCookieName = options.identifierCookieName ?? "zenmanage_user_id";
143
+ const identifierHeaderName = options.identifierHeaderName ?? "x-zenmanage-user-id";
144
+ const includeGeo = options.includeGeo ?? true;
145
+ const includeIp = options.includeIp ?? false;
146
+ const identifier = getCookieValue(request.cookies, identifierCookieName) ?? request.headers.get(identifierHeaderName) ?? void 0;
147
+ const context = new import_sdk2.Context(options.contextType ?? "user", options.contextName, identifier);
148
+ const userAgent = request.headers.get("user-agent");
149
+ if (userAgent) {
150
+ context.addAttribute(new import_sdk2.Attribute("user-agent", [userAgent]));
151
+ }
152
+ context.addAttribute(new import_sdk2.Attribute("path", [getRequestPath(request)]));
153
+ const ip = includeIp ? getIp(request) : void 0;
154
+ if (ip) {
155
+ context.addAttribute(new import_sdk2.Attribute("ip", [ip]));
156
+ }
157
+ if (includeGeo) {
158
+ const geo = getGeo(request);
159
+ if (geo.country) {
160
+ context.addAttribute(new import_sdk2.Attribute("country", [geo.country]));
161
+ }
162
+ if (geo.region) {
163
+ context.addAttribute(new import_sdk2.Attribute("region", [geo.region]));
164
+ }
165
+ if (geo.city) {
166
+ context.addAttribute(new import_sdk2.Attribute("city", [geo.city]));
167
+ }
168
+ }
169
+ if (options.additionalAttributes) {
170
+ for (const [key, value] of Object.entries(options.additionalAttributes)) {
171
+ if (!value) {
172
+ continue;
173
+ }
174
+ const values = Array.isArray(value) ? value : [value];
175
+ context.addAttribute(new import_sdk2.Attribute(key, values));
176
+ }
177
+ }
178
+ return context;
179
+ }
180
+ async function evaluateMiddlewareFlag(input) {
181
+ const context = buildContextFromRequest(input.request, input.requestContext);
182
+ return getServerFlag({
183
+ environmentToken: input.environmentToken,
184
+ apiEndpoint: input.apiEndpoint,
185
+ cacheTtl: input.cacheTtl,
186
+ enableUsageReporting: input.enableUsageReporting,
187
+ logger: input.logger,
188
+ key: input.key,
189
+ defaultValue: input.defaultValue,
190
+ defaults: input.defaults,
191
+ context
192
+ });
193
+ }
194
+ // Annotate the CommonJS export names for ESM import in node:
195
+ 0 && (module.exports = {
196
+ buildContextFromRequest,
197
+ evaluateMiddlewareFlag
198
+ });
199
+ //# sourceMappingURL=middleware.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware.ts","../src/server.ts","../src/types.ts","../package.json","../src/identity.ts"],"sourcesContent":["import { Attribute, Context, type Flag } from '@zenmanage/sdk';\nimport { getServerFlag } from './server';\nimport type {\n BuildRequestContextOptions,\n MiddlewareFlagInput,\n RequestCookiesLike,\n RequestLike,\n} from './types';\n\nfunction getCookieValue(cookies: RequestCookiesLike | undefined, name: string): string | undefined {\n if (!cookies) {\n return undefined;\n }\n\n const value = cookies.get(name);\n if (typeof value === 'string') {\n return value;\n }\n\n return value?.value;\n}\n\nfunction getRequestPath(request: RequestLike): string {\n if (request.nextUrl?.pathname) {\n return request.nextUrl.pathname;\n }\n\n if (request.url) {\n return new URL(request.url).pathname;\n }\n\n return '/';\n}\n\nfunction decodeHeader(value: string | null): string | undefined {\n if (!value) {\n return undefined;\n }\n\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n// Next.js 15 removed `request.ip` and `request.geo`, so read what the platform forwards.\nfunction getIp(request: RequestLike): string | undefined {\n if (request.ip) {\n return request.ip;\n }\n\n const forwarded = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim();\n return forwarded || request.headers.get('x-real-ip') || undefined;\n}\n\nfunction getGeo(request: RequestLike): { country?: string; region?: string; city?: string } {\n const { headers, geo } = request;\n\n // Next.js 14 and earlier set `request.geo` even when nothing fills it in (it is `{}` when\n // self-hosted), so each field falls back to the headers on its own.\n return {\n country:\n geo?.country ||\n headers.get('x-vercel-ip-country') ||\n headers.get('cf-ipcountry') ||\n undefined,\n region: geo?.region || headers.get('x-vercel-ip-country-region') || undefined,\n city: geo?.city || decodeHeader(headers.get('x-vercel-ip-city')),\n };\n}\n\n/**\n * Builds an evaluation context from a request: an identifier (cookie, then header), the path,\n * the user agent and, when the platform reports it, the visitor's location. Works with\n * `NextRequest` and with a plain `Request`.\n */\nexport function buildContextFromRequest(\n request: RequestLike,\n options: BuildRequestContextOptions = {}\n): Context {\n const identifierCookieName = options.identifierCookieName ?? 'zenmanage_user_id';\n const identifierHeaderName = options.identifierHeaderName ?? 'x-zenmanage-user-id';\n const includeGeo = options.includeGeo ?? true;\n const includeIp = options.includeIp ?? false;\n\n const identifier =\n getCookieValue(request.cookies, identifierCookieName) ??\n request.headers.get(identifierHeaderName) ??\n undefined;\n\n const context = new Context(options.contextType ?? 'user', options.contextName, identifier);\n\n const userAgent = request.headers.get('user-agent');\n if (userAgent) {\n context.addAttribute(new Attribute('user-agent', [userAgent]));\n }\n\n context.addAttribute(new Attribute('path', [getRequestPath(request)]));\n\n const ip = includeIp ? getIp(request) : undefined;\n if (ip) {\n context.addAttribute(new Attribute('ip', [ip]));\n }\n\n if (includeGeo) {\n const geo = getGeo(request);\n\n if (geo.country) {\n context.addAttribute(new Attribute('country', [geo.country]));\n }\n\n if (geo.region) {\n context.addAttribute(new Attribute('region', [geo.region]));\n }\n\n if (geo.city) {\n context.addAttribute(new Attribute('city', [geo.city]));\n }\n }\n\n if (options.additionalAttributes) {\n for (const [key, value] of Object.entries(options.additionalAttributes)) {\n if (!value) {\n continue;\n }\n\n const values = Array.isArray(value) ? value : [value];\n context.addAttribute(new Attribute(key, values));\n }\n }\n\n return context;\n}\n\n/**\n * Evaluates one flag for the request. Runs on the Edge runtime (`middleware.ts`) and on the\n * Node.js runtime (`proxy.ts` in Next.js 16), and needs a server key in both.\n */\nexport async function evaluateMiddlewareFlag(input: MiddlewareFlagInput): Promise<Flag> {\n const context = buildContextFromRequest(input.request, input.requestContext);\n\n return getServerFlag({\n environmentToken: input.environmentToken,\n apiEndpoint: input.apiEndpoint,\n cacheTtl: input.cacheTtl,\n enableUsageReporting: input.enableUsageReporting,\n logger: input.logger,\n key: input.key,\n defaultValue: input.defaultValue,\n defaults: input.defaults,\n context,\n });\n}\n","import {\n ConfigBuilder,\n DefaultsCollection,\n Zenmanage,\n type Flag,\n type FlagManager,\n type FlagValue,\n type Logger,\n} from '@zenmanage/sdk';\nimport { buildBootstrapPayload } from './bootstrap';\nimport { CLIENT_AGENT, PACKAGE_VERSION } from './identity';\nimport {\n DEFAULT_SERVER_CACHE_TTL,\n type BootstrapPayload,\n type NextFlagsRuntime,\n type NextZenmanageClientOptions,\n type ServerBootstrapInput,\n type ServerFlagInput,\n type ServerFlagsInput,\n type WidenFlagValue,\n} from './types';\n\nexport { mergeDefaults } from './defaults';\n\nfunction buildClient(options: NextZenmanageClientOptions): Zenmanage {\n const builder = ConfigBuilder.create()\n .withEnvironmentToken(options.environmentToken)\n .withClientAgent(CLIENT_AGENT)\n .withSdkVersion(PACKAGE_VERSION)\n .withCacheTtl(options.cacheTtl ?? DEFAULT_SERVER_CACHE_TTL);\n\n if (options.apiEndpoint) {\n builder.withApiEndpoint(options.apiEndpoint);\n }\n\n if (typeof options.enableUsageReporting === 'boolean') {\n builder.withUsageReporting(options.enableUsageReporting);\n }\n\n if (options.logger) {\n builder.withLogger(options.logger);\n }\n\n return new Zenmanage(builder.build());\n}\n\n// A client owns the rules cache, so building one per call would refetch the rules for every\n// flag on every request. Clients are shared per configuration instead, for the life of the\n// server process (or edge isolate). Loggers are compared by identity, hence the WeakMap.\nconst clientsWithoutLogger = new Map<string, Zenmanage>();\nlet clientsByLogger = new WeakMap<Logger, Map<string, Zenmanage>>();\n\nfunction configurationKey(options: NextZenmanageClientOptions): string {\n return JSON.stringify([\n options.environmentToken,\n options.apiEndpoint ?? null,\n options.cacheTtl ?? null,\n options.enableUsageReporting ?? null,\n ]);\n}\n\n/**\n * Returns the client for this configuration, creating it on first use. Calls with the same\n * token, endpoint, TTL, usage setting and logger share one client and so one rules cache.\n */\nexport function createServerClient(options: NextZenmanageClientOptions): Zenmanage {\n let clients = clientsWithoutLogger;\n\n if (options.logger) {\n clients = clientsByLogger.get(options.logger) ?? new Map<string, Zenmanage>();\n clientsByLogger.set(options.logger, clients);\n }\n\n const key = configurationKey(options);\n let client = clients.get(key);\n\n if (!client) {\n client = buildClient(options);\n clients.set(key, client);\n }\n\n return client;\n}\n\n/** Forgets every shared client, and with them their cached rules. Mostly useful in tests. */\nexport function clearServerClients(): void {\n clientsWithoutLogger.clear();\n clientsByLogger = new WeakMap();\n}\n\nexport function createServerRuntime(options: ServerFlagsInput): NextFlagsRuntime {\n const client = createServerClient(options);\n\n // A manager loads its rules once and keeps them, whatever the cache TTL. Handing out the\n // client's own manager would pin the first rules it saw for the life of the process, so\n // every call gets a copy that reads the shared cache (and so honors the TTL) instead.\n let manager = client.flags().withDefaults(options.defaults ?? new DefaultsCollection());\n\n if (options.context) {\n manager = manager.withContext(options.context);\n }\n\n return { client, manager };\n}\n\nexport function createServerManager(options: ServerFlagsInput): FlagManager {\n return createServerRuntime(options).manager;\n}\n\nexport async function getServerFlag(input: ServerFlagInput): Promise<Flag> {\n const manager = createServerManager(input);\n return manager.single(input.key, input.defaultValue);\n}\n\nexport async function getServerFlags(input: ServerFlagsInput): Promise<Flag[]> {\n const manager = createServerManager(input);\n return manager.all();\n}\n\nexport async function preloadServerFlags(input: ServerFlagsInput): Promise<FlagManager> {\n const manager = createServerManager(input);\n await manager.all();\n return manager;\n}\n\n/**\n * Evaluates a flag and returns its value as the type of `fallback`: a boolean, number or\n * string, or a JSON object or array. A literal fallback (`'control'`, `false`) gives the\n * widened type (`string`, `boolean`), so the result can be compared with other values.\n */\nexport async function getFlagValue<T extends FlagValue>(\n input: ServerFlagInput,\n fallback: T\n): Promise<WidenFlagValue<T>> {\n const flag = await getServerFlag(input);\n\n if (typeof fallback === 'boolean') {\n return flag.asBool() as WidenFlagValue<T>;\n }\n\n if (typeof fallback === 'number') {\n return flag.asNumber() as WidenFlagValue<T>;\n }\n\n if (typeof fallback === 'string') {\n return flag.asString() as WidenFlagValue<T>;\n }\n\n return flag.asJson() as WidenFlagValue<T>;\n}\n\n/**\n * Evaluates flags on the server and packages them for `NextFlagsProvider`. Pass `keys` to\n * send only the flags client components read.\n */\nexport async function getBootstrapPayload(input: ServerBootstrapInput): Promise<BootstrapPayload> {\n const flags = await getServerFlags(input);\n const wanted = input.keys ? new Set(input.keys) : null;\n\n return buildBootstrapPayload(\n flags.filter((flag) => wanted === null || wanted.has(flag.getKey())),\n { context: input.includeContext ? input.context : 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","{\n \"name\": \"@zenmanage/nextjs\",\n \"version\": \"1.0.0\",\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"],"mappings":"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","names":["import_sdk"]}
@@ -0,0 +1,16 @@
1
+ import { Context, Flag } from '@zenmanage/sdk';
2
+ import { g as RequestLike, c as BuildRequestContextOptions, M as MiddlewareFlagInput } from './types-CFBzBNpk.cjs';
3
+
4
+ /**
5
+ * Builds an evaluation context from a request: an identifier (cookie, then header), the path,
6
+ * the user agent and, when the platform reports it, the visitor's location. Works with
7
+ * `NextRequest` and with a plain `Request`.
8
+ */
9
+ declare function buildContextFromRequest(request: RequestLike, options?: BuildRequestContextOptions): Context;
10
+ /**
11
+ * Evaluates one flag for the request. Runs on the Edge runtime (`middleware.ts`) and on the
12
+ * Node.js runtime (`proxy.ts` in Next.js 16), and needs a server key in both.
13
+ */
14
+ declare function evaluateMiddlewareFlag(input: MiddlewareFlagInput): Promise<Flag>;
15
+
16
+ export { buildContextFromRequest, evaluateMiddlewareFlag };
@@ -0,0 +1,16 @@
1
+ import { Context, Flag } from '@zenmanage/sdk';
2
+ import { g as RequestLike, c as BuildRequestContextOptions, M as MiddlewareFlagInput } from './types-CFBzBNpk.js';
3
+
4
+ /**
5
+ * Builds an evaluation context from a request: an identifier (cookie, then header), the path,
6
+ * the user agent and, when the platform reports it, the visitor's location. Works with
7
+ * `NextRequest` and with a plain `Request`.
8
+ */
9
+ declare function buildContextFromRequest(request: RequestLike, options?: BuildRequestContextOptions): Context;
10
+ /**
11
+ * Evaluates one flag for the request. Runs on the Edge runtime (`middleware.ts`) and on the
12
+ * Node.js runtime (`proxy.ts` in Next.js 16), and needs a server key in both.
13
+ */
14
+ declare function evaluateMiddlewareFlag(input: MiddlewareFlagInput): Promise<Flag>;
15
+
16
+ export { buildContextFromRequest, evaluateMiddlewareFlag };
@@ -0,0 +1,10 @@
1
+ import {
2
+ buildContextFromRequest,
3
+ evaluateMiddlewareFlag
4
+ } from "./chunk-PMTVMVXJ.js";
5
+ import "./chunk-ZUB4F2DA.js";
6
+ export {
7
+ buildContextFromRequest,
8
+ evaluateMiddlewareFlag
9
+ };
10
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/server.ts
21
+ var server_exports = {};
22
+ __export(server_exports, {
23
+ clearServerClients: () => clearServerClients,
24
+ createServerClient: () => createServerClient,
25
+ createServerManager: () => createServerManager,
26
+ createServerRuntime: () => createServerRuntime,
27
+ getBootstrapPayload: () => getBootstrapPayload,
28
+ getFlagValue: () => getFlagValue,
29
+ getServerFlag: () => getServerFlag,
30
+ getServerFlags: () => getServerFlags,
31
+ mergeDefaults: () => mergeDefaults,
32
+ preloadServerFlags: () => preloadServerFlags
33
+ });
34
+ module.exports = __toCommonJS(server_exports);
35
+ var import_sdk3 = require("@zenmanage/sdk");
36
+
37
+ // src/bootstrap.ts
38
+ var import_sdk = require("@zenmanage/sdk");
39
+
40
+ // src/types.ts
41
+ var DEFAULT_SERVER_CACHE_TTL = 60;
42
+
43
+ // src/bootstrap.ts
44
+ function buildBootstrapPayload(flags, options = {}) {
45
+ const values = Array.isArray(flags) ? Object.fromEntries(flags.map((flag) => [flag.getKey(), flag.getValue()])) : flags;
46
+ return {
47
+ version: 1,
48
+ generatedAt: (options.generatedAt ?? /* @__PURE__ */ new Date()).toISOString(),
49
+ flags: values,
50
+ ...options.context ? { context: options.context.toJSON() } : {}
51
+ };
52
+ }
53
+
54
+ // package.json
55
+ var version = "1.0.0";
56
+
57
+ // src/identity.ts
58
+ var CLIENT_AGENT = "zenmanage-nextjs";
59
+ var PACKAGE_VERSION = version;
60
+
61
+ // src/defaults.ts
62
+ var import_sdk2 = require("@zenmanage/sdk");
63
+ function mergeDefaults(base, bootstrap) {
64
+ if (!base && !bootstrap) {
65
+ return void 0;
66
+ }
67
+ const merged = new import_sdk2.DefaultsCollection();
68
+ for (const source of [bootstrap, base]) {
69
+ if (!source) {
70
+ continue;
71
+ }
72
+ for (const key of source.keys()) {
73
+ const value = source.get(key);
74
+ if (value !== void 0) {
75
+ merged.set(key, value);
76
+ }
77
+ }
78
+ }
79
+ return merged;
80
+ }
81
+
82
+ // src/server.ts
83
+ function buildClient(options) {
84
+ const builder = import_sdk3.ConfigBuilder.create().withEnvironmentToken(options.environmentToken).withClientAgent(CLIENT_AGENT).withSdkVersion(PACKAGE_VERSION).withCacheTtl(options.cacheTtl ?? DEFAULT_SERVER_CACHE_TTL);
85
+ if (options.apiEndpoint) {
86
+ builder.withApiEndpoint(options.apiEndpoint);
87
+ }
88
+ if (typeof options.enableUsageReporting === "boolean") {
89
+ builder.withUsageReporting(options.enableUsageReporting);
90
+ }
91
+ if (options.logger) {
92
+ builder.withLogger(options.logger);
93
+ }
94
+ return new import_sdk3.Zenmanage(builder.build());
95
+ }
96
+ var clientsWithoutLogger = /* @__PURE__ */ new Map();
97
+ var clientsByLogger = /* @__PURE__ */ new WeakMap();
98
+ function configurationKey(options) {
99
+ return JSON.stringify([
100
+ options.environmentToken,
101
+ options.apiEndpoint ?? null,
102
+ options.cacheTtl ?? null,
103
+ options.enableUsageReporting ?? null
104
+ ]);
105
+ }
106
+ function createServerClient(options) {
107
+ let clients = clientsWithoutLogger;
108
+ if (options.logger) {
109
+ clients = clientsByLogger.get(options.logger) ?? /* @__PURE__ */ new Map();
110
+ clientsByLogger.set(options.logger, clients);
111
+ }
112
+ const key = configurationKey(options);
113
+ let client = clients.get(key);
114
+ if (!client) {
115
+ client = buildClient(options);
116
+ clients.set(key, client);
117
+ }
118
+ return client;
119
+ }
120
+ function clearServerClients() {
121
+ clientsWithoutLogger.clear();
122
+ clientsByLogger = /* @__PURE__ */ new WeakMap();
123
+ }
124
+ function createServerRuntime(options) {
125
+ const client = createServerClient(options);
126
+ let manager = client.flags().withDefaults(options.defaults ?? new import_sdk3.DefaultsCollection());
127
+ if (options.context) {
128
+ manager = manager.withContext(options.context);
129
+ }
130
+ return { client, manager };
131
+ }
132
+ function createServerManager(options) {
133
+ return createServerRuntime(options).manager;
134
+ }
135
+ async function getServerFlag(input) {
136
+ const manager = createServerManager(input);
137
+ return manager.single(input.key, input.defaultValue);
138
+ }
139
+ async function getServerFlags(input) {
140
+ const manager = createServerManager(input);
141
+ return manager.all();
142
+ }
143
+ async function preloadServerFlags(input) {
144
+ const manager = createServerManager(input);
145
+ await manager.all();
146
+ return manager;
147
+ }
148
+ async function getFlagValue(input, fallback) {
149
+ const flag = await getServerFlag(input);
150
+ if (typeof fallback === "boolean") {
151
+ return flag.asBool();
152
+ }
153
+ if (typeof fallback === "number") {
154
+ return flag.asNumber();
155
+ }
156
+ if (typeof fallback === "string") {
157
+ return flag.asString();
158
+ }
159
+ return flag.asJson();
160
+ }
161
+ async function getBootstrapPayload(input) {
162
+ const flags = await getServerFlags(input);
163
+ const wanted = input.keys ? new Set(input.keys) : null;
164
+ return buildBootstrapPayload(
165
+ flags.filter((flag) => wanted === null || wanted.has(flag.getKey())),
166
+ { context: input.includeContext ? input.context : void 0 }
167
+ );
168
+ }
169
+ // Annotate the CommonJS export names for ESM import in node:
170
+ 0 && (module.exports = {
171
+ clearServerClients,
172
+ createServerClient,
173
+ createServerManager,
174
+ createServerRuntime,
175
+ getBootstrapPayload,
176
+ getFlagValue,
177
+ getServerFlag,
178
+ getServerFlags,
179
+ mergeDefaults,
180
+ preloadServerFlags
181
+ });
182
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/bootstrap.ts","../src/types.ts","../package.json","../src/identity.ts","../src/defaults.ts"],"sourcesContent":["import {\n ConfigBuilder,\n DefaultsCollection,\n Zenmanage,\n type Flag,\n type FlagManager,\n type FlagValue,\n type Logger,\n} from '@zenmanage/sdk';\nimport { buildBootstrapPayload } from './bootstrap';\nimport { CLIENT_AGENT, PACKAGE_VERSION } from './identity';\nimport {\n DEFAULT_SERVER_CACHE_TTL,\n type BootstrapPayload,\n type NextFlagsRuntime,\n type NextZenmanageClientOptions,\n type ServerBootstrapInput,\n type ServerFlagInput,\n type ServerFlagsInput,\n type WidenFlagValue,\n} from './types';\n\nexport { mergeDefaults } from './defaults';\n\nfunction buildClient(options: NextZenmanageClientOptions): Zenmanage {\n const builder = ConfigBuilder.create()\n .withEnvironmentToken(options.environmentToken)\n .withClientAgent(CLIENT_AGENT)\n .withSdkVersion(PACKAGE_VERSION)\n .withCacheTtl(options.cacheTtl ?? DEFAULT_SERVER_CACHE_TTL);\n\n if (options.apiEndpoint) {\n builder.withApiEndpoint(options.apiEndpoint);\n }\n\n if (typeof options.enableUsageReporting === 'boolean') {\n builder.withUsageReporting(options.enableUsageReporting);\n }\n\n if (options.logger) {\n builder.withLogger(options.logger);\n }\n\n return new Zenmanage(builder.build());\n}\n\n// A client owns the rules cache, so building one per call would refetch the rules for every\n// flag on every request. Clients are shared per configuration instead, for the life of the\n// server process (or edge isolate). Loggers are compared by identity, hence the WeakMap.\nconst clientsWithoutLogger = new Map<string, Zenmanage>();\nlet clientsByLogger = new WeakMap<Logger, Map<string, Zenmanage>>();\n\nfunction configurationKey(options: NextZenmanageClientOptions): string {\n return JSON.stringify([\n options.environmentToken,\n options.apiEndpoint ?? null,\n options.cacheTtl ?? null,\n options.enableUsageReporting ?? null,\n ]);\n}\n\n/**\n * Returns the client for this configuration, creating it on first use. Calls with the same\n * token, endpoint, TTL, usage setting and logger share one client and so one rules cache.\n */\nexport function createServerClient(options: NextZenmanageClientOptions): Zenmanage {\n let clients = clientsWithoutLogger;\n\n if (options.logger) {\n clients = clientsByLogger.get(options.logger) ?? new Map<string, Zenmanage>();\n clientsByLogger.set(options.logger, clients);\n }\n\n const key = configurationKey(options);\n let client = clients.get(key);\n\n if (!client) {\n client = buildClient(options);\n clients.set(key, client);\n }\n\n return client;\n}\n\n/** Forgets every shared client, and with them their cached rules. Mostly useful in tests. */\nexport function clearServerClients(): void {\n clientsWithoutLogger.clear();\n clientsByLogger = new WeakMap();\n}\n\nexport function createServerRuntime(options: ServerFlagsInput): NextFlagsRuntime {\n const client = createServerClient(options);\n\n // A manager loads its rules once and keeps them, whatever the cache TTL. Handing out the\n // client's own manager would pin the first rules it saw for the life of the process, so\n // every call gets a copy that reads the shared cache (and so honors the TTL) instead.\n let manager = client.flags().withDefaults(options.defaults ?? new DefaultsCollection());\n\n if (options.context) {\n manager = manager.withContext(options.context);\n }\n\n return { client, manager };\n}\n\nexport function createServerManager(options: ServerFlagsInput): FlagManager {\n return createServerRuntime(options).manager;\n}\n\nexport async function getServerFlag(input: ServerFlagInput): Promise<Flag> {\n const manager = createServerManager(input);\n return manager.single(input.key, input.defaultValue);\n}\n\nexport async function getServerFlags(input: ServerFlagsInput): Promise<Flag[]> {\n const manager = createServerManager(input);\n return manager.all();\n}\n\nexport async function preloadServerFlags(input: ServerFlagsInput): Promise<FlagManager> {\n const manager = createServerManager(input);\n await manager.all();\n return manager;\n}\n\n/**\n * Evaluates a flag and returns its value as the type of `fallback`: a boolean, number or\n * string, or a JSON object or array. A literal fallback (`'control'`, `false`) gives the\n * widened type (`string`, `boolean`), so the result can be compared with other values.\n */\nexport async function getFlagValue<T extends FlagValue>(\n input: ServerFlagInput,\n fallback: T\n): Promise<WidenFlagValue<T>> {\n const flag = await getServerFlag(input);\n\n if (typeof fallback === 'boolean') {\n return flag.asBool() as WidenFlagValue<T>;\n }\n\n if (typeof fallback === 'number') {\n return flag.asNumber() as WidenFlagValue<T>;\n }\n\n if (typeof fallback === 'string') {\n return flag.asString() as WidenFlagValue<T>;\n }\n\n return flag.asJson() as WidenFlagValue<T>;\n}\n\n/**\n * Evaluates flags on the server and packages them for `NextFlagsProvider`. Pass `keys` to\n * send only the flags client components read.\n */\nexport async function getBootstrapPayload(input: ServerBootstrapInput): Promise<BootstrapPayload> {\n const flags = await getServerFlags(input);\n const wanted = input.keys ? new Set(input.keys) : null;\n\n return buildBootstrapPayload(\n flags.filter((flag) => wanted === null || wanted.has(flag.getKey())),\n { context: input.includeContext ? input.context : undefined }\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","{\n \"name\": \"@zenmanage/nextjs\",\n \"version\": \"1.0.0\",\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 { 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"],"mappings":"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","names":["import_sdk","import_sdk"]}
@@ -0,0 +1,31 @@
1
+ import { DefaultsCollection, Zenmanage, FlagManager, FlagValue, Flag } from '@zenmanage/sdk';
2
+ import { e as NextZenmanageClientOptions, i as ServerFlagsInput, N as NextFlagsRuntime, S as ServerBootstrapInput, a as BootstrapPayload, h as ServerFlagInput, W as WidenFlagValue } from './types-CFBzBNpk.cjs';
3
+
4
+ /** Combines two collections. `base` wins where both define a key. */
5
+ declare function mergeDefaults(base?: DefaultsCollection, bootstrap?: DefaultsCollection): DefaultsCollection | undefined;
6
+
7
+ /**
8
+ * Returns the client for this configuration, creating it on first use. Calls with the same
9
+ * token, endpoint, TTL, usage setting and logger share one client and so one rules cache.
10
+ */
11
+ declare function createServerClient(options: NextZenmanageClientOptions): Zenmanage;
12
+ /** Forgets every shared client, and with them their cached rules. Mostly useful in tests. */
13
+ declare function clearServerClients(): void;
14
+ declare function createServerRuntime(options: ServerFlagsInput): NextFlagsRuntime;
15
+ declare function createServerManager(options: ServerFlagsInput): FlagManager;
16
+ declare function getServerFlag(input: ServerFlagInput): Promise<Flag>;
17
+ declare function getServerFlags(input: ServerFlagsInput): Promise<Flag[]>;
18
+ declare function preloadServerFlags(input: ServerFlagsInput): Promise<FlagManager>;
19
+ /**
20
+ * Evaluates a flag and returns its value as the type of `fallback`: a boolean, number or
21
+ * string, or a JSON object or array. A literal fallback (`'control'`, `false`) gives the
22
+ * widened type (`string`, `boolean`), so the result can be compared with other values.
23
+ */
24
+ declare function getFlagValue<T extends FlagValue>(input: ServerFlagInput, fallback: T): Promise<WidenFlagValue<T>>;
25
+ /**
26
+ * Evaluates flags on the server and packages them for `NextFlagsProvider`. Pass `keys` to
27
+ * send only the flags client components read.
28
+ */
29
+ declare function getBootstrapPayload(input: ServerBootstrapInput): Promise<BootstrapPayload>;
30
+
31
+ export { clearServerClients, createServerClient, createServerManager, createServerRuntime, getBootstrapPayload, getFlagValue, getServerFlag, getServerFlags, mergeDefaults, preloadServerFlags };
@@ -0,0 +1,31 @@
1
+ import { DefaultsCollection, Zenmanage, FlagManager, FlagValue, Flag } from '@zenmanage/sdk';
2
+ import { e as NextZenmanageClientOptions, i as ServerFlagsInput, N as NextFlagsRuntime, S as ServerBootstrapInput, a as BootstrapPayload, h as ServerFlagInput, W as WidenFlagValue } from './types-CFBzBNpk.js';
3
+
4
+ /** Combines two collections. `base` wins where both define a key. */
5
+ declare function mergeDefaults(base?: DefaultsCollection, bootstrap?: DefaultsCollection): DefaultsCollection | undefined;
6
+
7
+ /**
8
+ * Returns the client for this configuration, creating it on first use. Calls with the same
9
+ * token, endpoint, TTL, usage setting and logger share one client and so one rules cache.
10
+ */
11
+ declare function createServerClient(options: NextZenmanageClientOptions): Zenmanage;
12
+ /** Forgets every shared client, and with them their cached rules. Mostly useful in tests. */
13
+ declare function clearServerClients(): void;
14
+ declare function createServerRuntime(options: ServerFlagsInput): NextFlagsRuntime;
15
+ declare function createServerManager(options: ServerFlagsInput): FlagManager;
16
+ declare function getServerFlag(input: ServerFlagInput): Promise<Flag>;
17
+ declare function getServerFlags(input: ServerFlagsInput): Promise<Flag[]>;
18
+ declare function preloadServerFlags(input: ServerFlagsInput): Promise<FlagManager>;
19
+ /**
20
+ * Evaluates a flag and returns its value as the type of `fallback`: a boolean, number or
21
+ * string, or a JSON object or array. A literal fallback (`'control'`, `false`) gives the
22
+ * widened type (`string`, `boolean`), so the result can be compared with other values.
23
+ */
24
+ declare function getFlagValue<T extends FlagValue>(input: ServerFlagInput, fallback: T): Promise<WidenFlagValue<T>>;
25
+ /**
26
+ * Evaluates flags on the server and packages them for `NextFlagsProvider`. Pass `keys` to
27
+ * send only the flags client components read.
28
+ */
29
+ declare function getBootstrapPayload(input: ServerBootstrapInput): Promise<BootstrapPayload>;
30
+
31
+ export { clearServerClients, createServerClient, createServerManager, createServerRuntime, getBootstrapPayload, getFlagValue, getServerFlag, getServerFlags, mergeDefaults, preloadServerFlags };
package/dist/server.js ADDED
@@ -0,0 +1,25 @@
1
+ import {
2
+ clearServerClients,
3
+ createServerClient,
4
+ createServerManager,
5
+ createServerRuntime,
6
+ getBootstrapPayload,
7
+ getFlagValue,
8
+ getServerFlag,
9
+ getServerFlags,
10
+ mergeDefaults,
11
+ preloadServerFlags
12
+ } from "./chunk-ZUB4F2DA.js";
13
+ export {
14
+ clearServerClients,
15
+ createServerClient,
16
+ createServerManager,
17
+ createServerRuntime,
18
+ getBootstrapPayload,
19
+ getFlagValue,
20
+ getServerFlag,
21
+ getServerFlags,
22
+ mergeDefaults,
23
+ preloadServerFlags
24
+ };
25
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}