@flagsync/nextjs-sdk 0.3.0 → 0.3.1-alpha.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.
package/LICENSE CHANGED
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2005 Mike Chabot (FlagSync)
189
+ Copyright 2025 FlagSync Inc.
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
package/dist/index.cjs CHANGED
@@ -21,13 +21,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  SyncType: () => import_node_sdk2.SyncType,
24
- createBoolFlagAdaptor: () => createBoolFlagAdaptor,
25
24
  createFlagSyncAdapter: () => createFlagSyncAdapter,
26
25
  createFlagSyncClient: () => createFlagSyncClient,
27
- createIdentify: () => createIdentify,
28
- createJsonFlagAdaptor: () => createJsonFlagAdaptor,
29
- createNumberFlagAdaptor: () => createNumberFlagAdaptor,
30
- createStringFlagAdaptor: () => createStringFlagAdaptor
26
+ createIdentify: () => createIdentify
31
27
  });
32
28
  module.exports = __toCommonJS(index_exports);
33
29
  var import_node_sdk2 = require("@flagsync/node-sdk");
@@ -39,7 +35,7 @@ function createFlagSyncClient(config) {
39
35
  ...config,
40
36
  metadata: {
41
37
  sdkName: "@flagsync/nextjs-sdk",
42
- sdkVersion: "0.3.0"
38
+ sdkVersion: "0.3.1-alpha.0"
43
39
  }
44
40
  });
45
41
  return instance.client();
@@ -57,33 +53,29 @@ function createFlagSyncAdapter(client) {
57
53
  /**
58
54
  * Evaluates a feature flag for a given context and returns its value.
59
55
  */
60
- async decide({ key, entities }) {
56
+ async decide({ key, entities, defaultValue }) {
61
57
  await ensureReady();
62
58
  const userContext = {
63
59
  key: "anonymous",
64
60
  ...entities ?? {}
65
61
  };
66
- return client.flag(userContext, key);
62
+ return client.flag(
63
+ userContext,
64
+ key,
65
+ defaultValue
66
+ );
67
67
  }
68
68
  };
69
69
  };
70
70
  }
71
- var createStringFlagAdaptor = (client) => createFlagSyncAdapter(client)();
72
- var createBoolFlagAdaptor = (client) => createFlagSyncAdapter(client)();
73
- var createNumberFlagAdaptor = (client) => createFlagSyncAdapter(client)();
74
- var createJsonFlagAdaptor = (client) => createFlagSyncAdapter(client)();
75
71
 
76
72
  // src/identify.ts
77
73
  var createIdentify = (callback) => (params) => callback(params);
78
74
  // Annotate the CommonJS export names for ESM import in node:
79
75
  0 && (module.exports = {
80
76
  SyncType,
81
- createBoolFlagAdaptor,
82
77
  createFlagSyncAdapter,
83
78
  createFlagSyncClient,
84
- createIdentify,
85
- createJsonFlagAdaptor,
86
- createNumberFlagAdaptor,
87
- createStringFlagAdaptor
79
+ createIdentify
88
80
  });
89
81
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/identify.ts"],"sourcesContent":["export type {\n CustomAttributes,\n CustomAttributeValue,\n FsConfig,\n FsClient,\n LogLevel,\n FsUserContext,\n} from '@flagsync/node-sdk';\n\nexport { SyncType } from '@flagsync/node-sdk';\n\nexport type { JsonObject } from './types';\n\nexport {\n createFlagSyncClient,\n createFlagSyncAdapter,\n createBoolFlagAdaptor,\n createStringFlagAdaptor,\n createJsonFlagAdaptor,\n createNumberFlagAdaptor,\n} from './adapter';\n\nexport { createIdentify } from './identify';\n","import {\n FlagSyncFactory,\n FsClient,\n type FsConfig,\n type FsUserContext,\n} from '@flagsync/node-sdk';\nimport type { Adapter } from '@vercel/flags';\n\nimport { JsonObject } from './types';\n\n/**\n * Creates a FlagSync client instance that can be used across multiple feature flags.\n * This function should be called once to create a singleton client for your application.\n */\nexport function createFlagSyncClient(config: FsConfig): FsClient {\n const instance = FlagSyncFactory({\n ...config,\n metadata: {\n sdkName: '@flagsync/nextjs-sdk',\n sdkVersion: '0.3.0',\n },\n });\n return instance.client();\n}\n\n/**\n * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.\n * This adapter handles the communication between your application and the FlagSync service.\n */\nexport function createFlagSyncAdapter(client: FsClient) {\n let isReady = false;\n\n /**\n * Ensures the FlagSync client is ready before making any flag decisions.\n * This is called internally before each flag evaluation.\n */\n const ensureReady = async () => {\n if (!isReady) {\n await client.waitForReady();\n isReady = true;\n }\n };\n\n /**\n * Creates a typed adapter instance for a specific flag value type.\n */\n return function flagSyncAdapter<ValueType>(): Adapter<\n ValueType,\n FsUserContext\n > {\n return {\n /**\n * Evaluates a feature flag for a given context and returns its value.\n */\n async decide({ key, entities }) {\n await ensureReady();\n\n const userContext: FsUserContext = {\n key: 'anonymous',\n ...(entities ?? {}),\n };\n\n return client.flag<ValueType>(userContext, key);\n },\n };\n };\n}\n\n/** Creates an adapter for string-typed flags */\nexport const createStringFlagAdaptor = (\n client: FsClient,\n): Adapter<string, FsUserContext> => createFlagSyncAdapter(client)<string>();\n\n/** Creates an adapter for boolean-typed flags */\nexport const createBoolFlagAdaptor = (\n client: FsClient,\n): Adapter<boolean, FsUserContext> => createFlagSyncAdapter(client)<boolean>();\n\n/** Creates an adapter for number-typed flags */\nexport const createNumberFlagAdaptor = (\n client: FsClient,\n): Adapter<number, FsUserContext> => createFlagSyncAdapter(client)<number>();\n\n/** Creates an adapter for JSON object-typed flags */\nexport const createJsonFlagAdaptor = (\n client: FsClient,\n): Adapter<JsonObject, FsUserContext> =>\n createFlagSyncAdapter(client)<JsonObject>();\n","import { FsUserContext } from '@flagsync/node-sdk';\nimport { Identify } from '@vercel/flags';\n\ntype ExtractParams<T> = T extends (params: infer P) => any ? P : never;\n\nexport const createIdentify =\n (\n callback: (\n params: ExtractParams<Identify<FsUserContext>>,\n ) => Promise<FsUserContext> | FsUserContext,\n ): Identify<FsUserContext> =>\n (params) =>\n callback(params);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,IAAAA,mBAAyB;;;ACTzB,sBAKO;AASA,SAAS,qBAAqB,QAA4B;AAC/D,QAAM,eAAW,iCAAgB;AAAA,IAC/B,GAAG;AAAA,IACH,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO;AACzB;AAMO,SAAS,sBAAsB,QAAkB;AACtD,MAAI,UAAU;AAMd,QAAM,cAAc,YAAY;AAC9B,QAAI,CAAC,SAAS;AACZ,YAAM,OAAO,aAAa;AAC1B,gBAAU;AAAA,IACZ;AAAA,EACF;AAKA,SAAO,SAAS,kBAGd;AACA,WAAO;AAAA;AAAA;AAAA;AAAA,MAIL,MAAM,OAAO,EAAE,KAAK,SAAS,GAAG;AAC9B,cAAM,YAAY;AAElB,cAAM,cAA6B;AAAA,UACjC,KAAK;AAAA,UACL,GAAI,YAAY,CAAC;AAAA,QACnB;AAEA,eAAO,OAAO,KAAgB,aAAa,GAAG;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,0BAA0B,CACrC,WACmC,sBAAsB,MAAM,EAAU;AAGpE,IAAM,wBAAwB,CACnC,WACoC,sBAAsB,MAAM,EAAW;AAGtE,IAAM,0BAA0B,CACrC,WACmC,sBAAsB,MAAM,EAAU;AAGpE,IAAM,wBAAwB,CACnC,WAEA,sBAAsB,MAAM,EAAc;;;AClFrC,IAAM,iBACX,CACE,aAIF,CAAC,WACC,SAAS,MAAM;","names":["import_node_sdk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/identify.ts"],"sourcesContent":["export type {\n CustomAttributes,\n CustomAttributeValue,\n FsConfig,\n FsClient,\n LogLevel,\n FsUserContext,\n FeatureFlags,\n FlagKey,\n} from '@flagsync/node-sdk';\n\nexport { SyncType } from '@flagsync/node-sdk';\n\nexport type { JsonObject } from './types';\n\nexport { createFlagSyncClient, createFlagSyncAdapter } from './adapter';\n\nexport { createIdentify } from './identify';\n","import {\n FeatureFlags,\n FlagKey,\n FlagSyncFactory,\n FsClient,\n type FsConfig,\n type FsUserContext,\n} from '@flagsync/node-sdk';\nimport type { Adapter } from 'flags';\n\nexport type TypedFeatureFlags = keyof FeatureFlags extends never\n ? Record<string, unknown>\n : { [K in keyof FeatureFlags]: FeatureFlags[K] };\n\n/**\n * Creates a FlagSync client instance that can be used across multiple feature flags.\n * This function should be called once to create a singleton client for your application.\n */\nexport function createFlagSyncClient(config: FsConfig): FsClient {\n const instance = FlagSyncFactory({\n ...config,\n metadata: {\n sdkName: '@flagsync/nextjs-sdk',\n sdkVersion: '0.3.1-alpha.0',\n },\n });\n return instance.client();\n}\n\n/**\n * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.\n * This adapter handles the communication between your application and the FlagSync service.\n */\nexport function createFlagSyncAdapter(client: FsClient) {\n let isReady = false;\n\n /**\n * Ensures the FlagSync client is ready before making any flag decisions.\n * This is called internally before each flag evaluation.\n */\n const ensureReady = async () => {\n if (!isReady) {\n await client.waitForReady();\n isReady = true;\n }\n };\n\n /**\n * Creates a typed adapter instance for a specific flag value type.\n */\n return function flagSyncAdapter<Key extends FlagKey>(): Adapter<\n TypedFeatureFlags[Key],\n FsUserContext\n > {\n return {\n /**\n * Evaluates a feature flag for a given context and returns its value.\n */\n async decide({ key, entities, defaultValue }) {\n await ensureReady();\n\n const userContext: FsUserContext = {\n key: 'anonymous',\n ...(entities ?? {}),\n };\n\n return client.flag<Key>(\n userContext,\n key as Key,\n defaultValue,\n ) as TypedFeatureFlags[Key];\n },\n };\n };\n}\n","import { FsUserContext } from '@flagsync/node-sdk';\nimport { Identify } from 'flags';\n\ntype ExtractParams<T> = T extends (params: infer P) => any ? P : never;\n\nexport const createIdentify =\n (\n callback: (\n params: ExtractParams<Identify<FsUserContext>>,\n ) => Promise<FsUserContext> | FsUserContext,\n ): Identify<FsUserContext> =>\n (params) =>\n callback(params);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,IAAAA,mBAAyB;;;ACXzB,sBAOO;AAWA,SAAS,qBAAqB,QAA4B;AAC/D,QAAM,eAAW,iCAAgB;AAAA,IAC/B,GAAG;AAAA,IACH,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO;AACzB;AAMO,SAAS,sBAAsB,QAAkB;AACtD,MAAI,UAAU;AAMd,QAAM,cAAc,YAAY;AAC9B,QAAI,CAAC,SAAS;AACZ,YAAM,OAAO,aAAa;AAC1B,gBAAU;AAAA,IACZ;AAAA,EACF;AAKA,SAAO,SAAS,kBAGd;AACA,WAAO;AAAA;AAAA;AAAA;AAAA,MAIL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAG;AAC5C,cAAM,YAAY;AAElB,cAAM,cAA6B;AAAA,UACjC,KAAK;AAAA,UACL,GAAI,YAAY,CAAC;AAAA,QACnB;AAEA,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrEO,IAAM,iBACX,CACE,aAIF,CAAC,WACC,SAAS,MAAM;","names":["import_node_sdk"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import { FsConfig, FsClient, FsUserContext } from '@flagsync/node-sdk';
2
- export { CustomAttributeValue, CustomAttributes, FsClient, FsConfig, FsUserContext, LogLevel, SyncType } from '@flagsync/node-sdk';
3
- import { Adapter, Identify } from '@vercel/flags';
1
+ import { FsConfig, FsClient, FlagKey, FeatureFlags, FsUserContext } from '@flagsync/node-sdk';
2
+ export { CustomAttributeValue, CustomAttributes, FeatureFlags, FlagKey, FsClient, FsConfig, FsUserContext, LogLevel, SyncType } from '@flagsync/node-sdk';
3
+ import { Adapter, Identify } from 'flags';
4
4
 
5
5
  type JsonPrimitive = string | number | boolean | null;
6
6
  type JsonValue = JsonPrimitive | JsonObject | JsonArray;
@@ -9,6 +9,9 @@ interface JsonObject {
9
9
  [key: string]: JsonValue;
10
10
  }
11
11
 
12
+ type TypedFeatureFlags = keyof FeatureFlags extends never ? Record<string, unknown> : {
13
+ [K in keyof FeatureFlags]: FeatureFlags[K];
14
+ };
12
15
  /**
13
16
  * Creates a FlagSync client instance that can be used across multiple feature flags.
14
17
  * This function should be called once to create a singleton client for your application.
@@ -18,17 +21,9 @@ declare function createFlagSyncClient(config: FsConfig): FsClient;
18
21
  * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.
19
22
  * This adapter handles the communication between your application and the FlagSync service.
20
23
  */
21
- declare function createFlagSyncAdapter(client: FsClient): <ValueType>() => Adapter<ValueType, FsUserContext>;
22
- /** Creates an adapter for string-typed flags */
23
- declare const createStringFlagAdaptor: (client: FsClient) => Adapter<string, FsUserContext>;
24
- /** Creates an adapter for boolean-typed flags */
25
- declare const createBoolFlagAdaptor: (client: FsClient) => Adapter<boolean, FsUserContext>;
26
- /** Creates an adapter for number-typed flags */
27
- declare const createNumberFlagAdaptor: (client: FsClient) => Adapter<number, FsUserContext>;
28
- /** Creates an adapter for JSON object-typed flags */
29
- declare const createJsonFlagAdaptor: (client: FsClient) => Adapter<JsonObject, FsUserContext>;
24
+ declare function createFlagSyncAdapter(client: FsClient): <Key extends FlagKey>() => Adapter<TypedFeatureFlags[Key], FsUserContext>;
30
25
 
31
26
  type ExtractParams<T> = T extends (params: infer P) => any ? P : never;
32
27
  declare const createIdentify: (callback: (params: ExtractParams<Identify<FsUserContext>>) => Promise<FsUserContext> | FsUserContext) => Identify<FsUserContext>;
33
28
 
34
- export { type JsonObject, createBoolFlagAdaptor, createFlagSyncAdapter, createFlagSyncClient, createIdentify, createJsonFlagAdaptor, createNumberFlagAdaptor, createStringFlagAdaptor };
29
+ export { type JsonObject, createFlagSyncAdapter, createFlagSyncClient, createIdentify };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { FsConfig, FsClient, FsUserContext } from '@flagsync/node-sdk';
2
- export { CustomAttributeValue, CustomAttributes, FsClient, FsConfig, FsUserContext, LogLevel, SyncType } from '@flagsync/node-sdk';
3
- import { Adapter, Identify } from '@vercel/flags';
1
+ import { FsConfig, FsClient, FlagKey, FeatureFlags, FsUserContext } from '@flagsync/node-sdk';
2
+ export { CustomAttributeValue, CustomAttributes, FeatureFlags, FlagKey, FsClient, FsConfig, FsUserContext, LogLevel, SyncType } from '@flagsync/node-sdk';
3
+ import { Adapter, Identify } from 'flags';
4
4
 
5
5
  type JsonPrimitive = string | number | boolean | null;
6
6
  type JsonValue = JsonPrimitive | JsonObject | JsonArray;
@@ -9,6 +9,9 @@ interface JsonObject {
9
9
  [key: string]: JsonValue;
10
10
  }
11
11
 
12
+ type TypedFeatureFlags = keyof FeatureFlags extends never ? Record<string, unknown> : {
13
+ [K in keyof FeatureFlags]: FeatureFlags[K];
14
+ };
12
15
  /**
13
16
  * Creates a FlagSync client instance that can be used across multiple feature flags.
14
17
  * This function should be called once to create a singleton client for your application.
@@ -18,17 +21,9 @@ declare function createFlagSyncClient(config: FsConfig): FsClient;
18
21
  * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.
19
22
  * This adapter handles the communication between your application and the FlagSync service.
20
23
  */
21
- declare function createFlagSyncAdapter(client: FsClient): <ValueType>() => Adapter<ValueType, FsUserContext>;
22
- /** Creates an adapter for string-typed flags */
23
- declare const createStringFlagAdaptor: (client: FsClient) => Adapter<string, FsUserContext>;
24
- /** Creates an adapter for boolean-typed flags */
25
- declare const createBoolFlagAdaptor: (client: FsClient) => Adapter<boolean, FsUserContext>;
26
- /** Creates an adapter for number-typed flags */
27
- declare const createNumberFlagAdaptor: (client: FsClient) => Adapter<number, FsUserContext>;
28
- /** Creates an adapter for JSON object-typed flags */
29
- declare const createJsonFlagAdaptor: (client: FsClient) => Adapter<JsonObject, FsUserContext>;
24
+ declare function createFlagSyncAdapter(client: FsClient): <Key extends FlagKey>() => Adapter<TypedFeatureFlags[Key], FsUserContext>;
30
25
 
31
26
  type ExtractParams<T> = T extends (params: infer P) => any ? P : never;
32
27
  declare const createIdentify: (callback: (params: ExtractParams<Identify<FsUserContext>>) => Promise<FsUserContext> | FsUserContext) => Identify<FsUserContext>;
33
28
 
34
- export { type JsonObject, createBoolFlagAdaptor, createFlagSyncAdapter, createFlagSyncClient, createIdentify, createJsonFlagAdaptor, createNumberFlagAdaptor, createStringFlagAdaptor };
29
+ export { type JsonObject, createFlagSyncAdapter, createFlagSyncClient, createIdentify };
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ function createFlagSyncClient(config) {
10
10
  ...config,
11
11
  metadata: {
12
12
  sdkName: "@flagsync/nextjs-sdk",
13
- sdkVersion: "0.3.0"
13
+ sdkVersion: "0.3.1-alpha.0"
14
14
  }
15
15
  });
16
16
  return instance.client();
@@ -28,32 +28,28 @@ function createFlagSyncAdapter(client) {
28
28
  /**
29
29
  * Evaluates a feature flag for a given context and returns its value.
30
30
  */
31
- async decide({ key, entities }) {
31
+ async decide({ key, entities, defaultValue }) {
32
32
  await ensureReady();
33
33
  const userContext = {
34
34
  key: "anonymous",
35
35
  ...entities ?? {}
36
36
  };
37
- return client.flag(userContext, key);
37
+ return client.flag(
38
+ userContext,
39
+ key,
40
+ defaultValue
41
+ );
38
42
  }
39
43
  };
40
44
  };
41
45
  }
42
- var createStringFlagAdaptor = (client) => createFlagSyncAdapter(client)();
43
- var createBoolFlagAdaptor = (client) => createFlagSyncAdapter(client)();
44
- var createNumberFlagAdaptor = (client) => createFlagSyncAdapter(client)();
45
- var createJsonFlagAdaptor = (client) => createFlagSyncAdapter(client)();
46
46
 
47
47
  // src/identify.ts
48
48
  var createIdentify = (callback) => (params) => callback(params);
49
49
  export {
50
50
  SyncType,
51
- createBoolFlagAdaptor,
52
51
  createFlagSyncAdapter,
53
52
  createFlagSyncClient,
54
- createIdentify,
55
- createJsonFlagAdaptor,
56
- createNumberFlagAdaptor,
57
- createStringFlagAdaptor
53
+ createIdentify
58
54
  };
59
55
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/identify.ts"],"sourcesContent":["export type {\n CustomAttributes,\n CustomAttributeValue,\n FsConfig,\n FsClient,\n LogLevel,\n FsUserContext,\n} from '@flagsync/node-sdk';\n\nexport { SyncType } from '@flagsync/node-sdk';\n\nexport type { JsonObject } from './types';\n\nexport {\n createFlagSyncClient,\n createFlagSyncAdapter,\n createBoolFlagAdaptor,\n createStringFlagAdaptor,\n createJsonFlagAdaptor,\n createNumberFlagAdaptor,\n} from './adapter';\n\nexport { createIdentify } from './identify';\n","import {\n FlagSyncFactory,\n FsClient,\n type FsConfig,\n type FsUserContext,\n} from '@flagsync/node-sdk';\nimport type { Adapter } from '@vercel/flags';\n\nimport { JsonObject } from './types';\n\n/**\n * Creates a FlagSync client instance that can be used across multiple feature flags.\n * This function should be called once to create a singleton client for your application.\n */\nexport function createFlagSyncClient(config: FsConfig): FsClient {\n const instance = FlagSyncFactory({\n ...config,\n metadata: {\n sdkName: '@flagsync/nextjs-sdk',\n sdkVersion: '0.3.0',\n },\n });\n return instance.client();\n}\n\n/**\n * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.\n * This adapter handles the communication between your application and the FlagSync service.\n */\nexport function createFlagSyncAdapter(client: FsClient) {\n let isReady = false;\n\n /**\n * Ensures the FlagSync client is ready before making any flag decisions.\n * This is called internally before each flag evaluation.\n */\n const ensureReady = async () => {\n if (!isReady) {\n await client.waitForReady();\n isReady = true;\n }\n };\n\n /**\n * Creates a typed adapter instance for a specific flag value type.\n */\n return function flagSyncAdapter<ValueType>(): Adapter<\n ValueType,\n FsUserContext\n > {\n return {\n /**\n * Evaluates a feature flag for a given context and returns its value.\n */\n async decide({ key, entities }) {\n await ensureReady();\n\n const userContext: FsUserContext = {\n key: 'anonymous',\n ...(entities ?? {}),\n };\n\n return client.flag<ValueType>(userContext, key);\n },\n };\n };\n}\n\n/** Creates an adapter for string-typed flags */\nexport const createStringFlagAdaptor = (\n client: FsClient,\n): Adapter<string, FsUserContext> => createFlagSyncAdapter(client)<string>();\n\n/** Creates an adapter for boolean-typed flags */\nexport const createBoolFlagAdaptor = (\n client: FsClient,\n): Adapter<boolean, FsUserContext> => createFlagSyncAdapter(client)<boolean>();\n\n/** Creates an adapter for number-typed flags */\nexport const createNumberFlagAdaptor = (\n client: FsClient,\n): Adapter<number, FsUserContext> => createFlagSyncAdapter(client)<number>();\n\n/** Creates an adapter for JSON object-typed flags */\nexport const createJsonFlagAdaptor = (\n client: FsClient,\n): Adapter<JsonObject, FsUserContext> =>\n createFlagSyncAdapter(client)<JsonObject>();\n","import { FsUserContext } from '@flagsync/node-sdk';\nimport { Identify } from '@vercel/flags';\n\ntype ExtractParams<T> = T extends (params: infer P) => any ? P : never;\n\nexport const createIdentify =\n (\n callback: (\n params: ExtractParams<Identify<FsUserContext>>,\n ) => Promise<FsUserContext> | FsUserContext,\n ): Identify<FsUserContext> =>\n (params) =>\n callback(params);\n"],"mappings":";AASA,SAAS,gBAAgB;;;ACTzB;AAAA,EACE;AAAA,OAIK;AASA,SAAS,qBAAqB,QAA4B;AAC/D,QAAM,WAAW,gBAAgB;AAAA,IAC/B,GAAG;AAAA,IACH,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO;AACzB;AAMO,SAAS,sBAAsB,QAAkB;AACtD,MAAI,UAAU;AAMd,QAAM,cAAc,YAAY;AAC9B,QAAI,CAAC,SAAS;AACZ,YAAM,OAAO,aAAa;AAC1B,gBAAU;AAAA,IACZ;AAAA,EACF;AAKA,SAAO,SAAS,kBAGd;AACA,WAAO;AAAA;AAAA;AAAA;AAAA,MAIL,MAAM,OAAO,EAAE,KAAK,SAAS,GAAG;AAC9B,cAAM,YAAY;AAElB,cAAM,cAA6B;AAAA,UACjC,KAAK;AAAA,UACL,GAAI,YAAY,CAAC;AAAA,QACnB;AAEA,eAAO,OAAO,KAAgB,aAAa,GAAG;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,0BAA0B,CACrC,WACmC,sBAAsB,MAAM,EAAU;AAGpE,IAAM,wBAAwB,CACnC,WACoC,sBAAsB,MAAM,EAAW;AAGtE,IAAM,0BAA0B,CACrC,WACmC,sBAAsB,MAAM,EAAU;AAGpE,IAAM,wBAAwB,CACnC,WAEA,sBAAsB,MAAM,EAAc;;;AClFrC,IAAM,iBACX,CACE,aAIF,CAAC,WACC,SAAS,MAAM;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/identify.ts"],"sourcesContent":["export type {\n CustomAttributes,\n CustomAttributeValue,\n FsConfig,\n FsClient,\n LogLevel,\n FsUserContext,\n FeatureFlags,\n FlagKey,\n} from '@flagsync/node-sdk';\n\nexport { SyncType } from '@flagsync/node-sdk';\n\nexport type { JsonObject } from './types';\n\nexport { createFlagSyncClient, createFlagSyncAdapter } from './adapter';\n\nexport { createIdentify } from './identify';\n","import {\n FeatureFlags,\n FlagKey,\n FlagSyncFactory,\n FsClient,\n type FsConfig,\n type FsUserContext,\n} from '@flagsync/node-sdk';\nimport type { Adapter } from 'flags';\n\nexport type TypedFeatureFlags = keyof FeatureFlags extends never\n ? Record<string, unknown>\n : { [K in keyof FeatureFlags]: FeatureFlags[K] };\n\n/**\n * Creates a FlagSync client instance that can be used across multiple feature flags.\n * This function should be called once to create a singleton client for your application.\n */\nexport function createFlagSyncClient(config: FsConfig): FsClient {\n const instance = FlagSyncFactory({\n ...config,\n metadata: {\n sdkName: '@flagsync/nextjs-sdk',\n sdkVersion: '0.3.1-alpha.0',\n },\n });\n return instance.client();\n}\n\n/**\n * Creates an adapter factory that integrates FlagSync with Vercel's feature flag system.\n * This adapter handles the communication between your application and the FlagSync service.\n */\nexport function createFlagSyncAdapter(client: FsClient) {\n let isReady = false;\n\n /**\n * Ensures the FlagSync client is ready before making any flag decisions.\n * This is called internally before each flag evaluation.\n */\n const ensureReady = async () => {\n if (!isReady) {\n await client.waitForReady();\n isReady = true;\n }\n };\n\n /**\n * Creates a typed adapter instance for a specific flag value type.\n */\n return function flagSyncAdapter<Key extends FlagKey>(): Adapter<\n TypedFeatureFlags[Key],\n FsUserContext\n > {\n return {\n /**\n * Evaluates a feature flag for a given context and returns its value.\n */\n async decide({ key, entities, defaultValue }) {\n await ensureReady();\n\n const userContext: FsUserContext = {\n key: 'anonymous',\n ...(entities ?? {}),\n };\n\n return client.flag<Key>(\n userContext,\n key as Key,\n defaultValue,\n ) as TypedFeatureFlags[Key];\n },\n };\n };\n}\n","import { FsUserContext } from '@flagsync/node-sdk';\nimport { Identify } from 'flags';\n\ntype ExtractParams<T> = T extends (params: infer P) => any ? P : never;\n\nexport const createIdentify =\n (\n callback: (\n params: ExtractParams<Identify<FsUserContext>>,\n ) => Promise<FsUserContext> | FsUserContext,\n ): Identify<FsUserContext> =>\n (params) =>\n callback(params);\n"],"mappings":";AAWA,SAAS,gBAAgB;;;ACXzB;AAAA,EAGE;AAAA,OAIK;AAWA,SAAS,qBAAqB,QAA4B;AAC/D,QAAM,WAAW,gBAAgB;AAAA,IAC/B,GAAG;AAAA,IACH,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO;AACzB;AAMO,SAAS,sBAAsB,QAAkB;AACtD,MAAI,UAAU;AAMd,QAAM,cAAc,YAAY;AAC9B,QAAI,CAAC,SAAS;AACZ,YAAM,OAAO,aAAa;AAC1B,gBAAU;AAAA,IACZ;AAAA,EACF;AAKA,SAAO,SAAS,kBAGd;AACA,WAAO;AAAA;AAAA;AAAA;AAAA,MAIL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAG;AAC5C,cAAM,YAAY;AAElB,cAAM,cAA6B;AAAA,UACjC,KAAK;AAAA,UACL,GAAI,YAAY,CAAC;AAAA,QACnB;AAEA,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrEO,IAAM,iBACX,CACE,aAIF,CAAC,WACC,SAAS,MAAM;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flagsync/nextjs-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.1-alpha.0",
4
4
  "description": "FlagSync adapter for Vercel's Flags SDK",
5
5
  "author": "Mike Chabot",
6
6
  "license": "Apache-2.0",
@@ -36,10 +36,10 @@
36
36
  "npm": ">=6"
37
37
  },
38
38
  "peerDependencies": {
39
- "@vercel/flags": "^3.1.1"
39
+ "flags": "^4.0.1"
40
40
  },
41
41
  "dependencies": {
42
- "@flagsync/node-sdk": "^0.3.0"
42
+ "@flagsync/node-sdk": "^0.5.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
@@ -47,7 +47,6 @@
47
47
  "@types/semver": "^7.5.8",
48
48
  "@typescript-eslint/eslint-plugin": "^8.26.1",
49
49
  "@typescript-eslint/parser": "^8.26.1",
50
- "@vercel/flags": "^3.1.1",
51
50
  "eslint": "^9.22.0",
52
51
  "eslint-config-prettier": "^10.1.1",
53
52
  "eslint-plugin-prettier": "^5.2.3",