@symbo.ls/sdk 2.34.32 → 2.34.34

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/dist/cjs/index.js CHANGED
@@ -33,6 +33,7 @@ __export(index_exports, {
33
33
  createBranchService: () => import_services3.createBranchService,
34
34
  createCollabService: () => import_services3.createCollabService,
35
35
  createDnsService: () => import_services3.createDnsService,
36
+ createFeatureFlagService: () => import_services3.createFeatureFlagService,
36
37
  createFileService: () => import_services3.createFileService,
37
38
  createIntegrationService: () => import_services3.createIntegrationService,
38
39
  createMetricsService: () => import_services3.createMetricsService,
@@ -190,6 +191,13 @@ class SDK {
190
191
  context: this._context,
191
192
  options: this._options
192
193
  })
194
+ ),
195
+ this._initService(
196
+ "featureFlag",
197
+ (0, import_services.createFeatureFlagService)({
198
+ context: this._context,
199
+ options: this._options
200
+ })
193
201
  )
194
202
  ]);
195
203
  return this;
@@ -0,0 +1,175 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var FeatureFlagService_exports = {};
19
+ __export(FeatureFlagService_exports, {
20
+ FeatureFlagService: () => FeatureFlagService
21
+ });
22
+ module.exports = __toCommonJS(FeatureFlagService_exports);
23
+ var import_BaseService = require("./BaseService.js");
24
+ function normalizeKeysParam(keys) {
25
+ if (!keys) {
26
+ return null;
27
+ }
28
+ if (Array.isArray(keys)) {
29
+ const flattened = keys.flatMap((k) => String(k).split(","));
30
+ const cleaned2 = flattened.map((s) => s.trim()).filter(Boolean);
31
+ return cleaned2.length ? cleaned2.join(",") : null;
32
+ }
33
+ const cleaned = String(keys).split(",").map((s) => s.trim()).filter(Boolean);
34
+ return cleaned.length ? cleaned.join(",") : null;
35
+ }
36
+ class FeatureFlagService extends import_BaseService.BaseService {
37
+ // ==================== USER FEATURE FLAGS (optional auth) ====================
38
+ /**
39
+ * Evaluate feature flags for the current user (or anonymous).
40
+ * @param {Object} [params]
41
+ * @param {string[]|string} [params.keys] Optional subset of keys (array or comma-separated string)
42
+ * @returns {Promise<{flags: Record<string, {enabled: boolean, variant: string|null, payload: any}>}>}
43
+ */
44
+ async getFeatureFlags(params = {}) {
45
+ this._requireReady("getFeatureFlags");
46
+ const { keys } = params || {};
47
+ const queryParams = new URLSearchParams();
48
+ const keysParam = normalizeKeysParam(keys);
49
+ if (keysParam) {
50
+ queryParams.append("keys", keysParam);
51
+ }
52
+ const queryString = queryParams.toString();
53
+ const url = `/feature-flags${queryString ? `?${queryString}` : ""}`;
54
+ try {
55
+ const response = await this._request(url, {
56
+ method: "GET",
57
+ methodName: "getFeatureFlags"
58
+ });
59
+ if (response.success) {
60
+ return response.data;
61
+ }
62
+ throw new Error(response.message);
63
+ } catch (error) {
64
+ throw new Error(`Failed to get feature flags: ${error.message}`, { cause: error });
65
+ }
66
+ }
67
+ /**
68
+ * Evaluate a single feature flag for the current user (or anonymous).
69
+ */
70
+ async getFeatureFlag(key) {
71
+ this._requireReady("getFeatureFlag");
72
+ if (!key) {
73
+ throw new Error("Feature flag key is required");
74
+ }
75
+ try {
76
+ const response = await this._request(`/feature-flags/${encodeURIComponent(String(key))}`, {
77
+ method: "GET",
78
+ methodName: "getFeatureFlag"
79
+ });
80
+ if (response.success) {
81
+ return response.data;
82
+ }
83
+ throw new Error(response.message);
84
+ } catch (error) {
85
+ throw new Error(`Failed to get feature flag: ${error.message}`, { cause: error });
86
+ }
87
+ }
88
+ // ==================== ADMIN FEATURE FLAGS (admin only) ====================
89
+ async getAdminFeatureFlags(params = {}) {
90
+ this._requireReady("getAdminFeatureFlags");
91
+ const { includeArchived = true } = params || {};
92
+ const queryParams = new URLSearchParams();
93
+ if (includeArchived === false) {
94
+ queryParams.append("includeArchived", "false");
95
+ }
96
+ const queryString = queryParams.toString();
97
+ const url = `/admin/feature-flags${queryString ? `?${queryString}` : ""}`;
98
+ try {
99
+ const response = await this._request(url, {
100
+ method: "GET",
101
+ methodName: "getAdminFeatureFlags"
102
+ });
103
+ if (response.success) {
104
+ return response.data;
105
+ }
106
+ throw new Error(response.message);
107
+ } catch (error) {
108
+ throw new Error(`Failed to get admin feature flags: ${error.message}`, {
109
+ cause: error
110
+ });
111
+ }
112
+ }
113
+ async createFeatureFlag(flagData) {
114
+ this._requireReady("createFeatureFlag");
115
+ if (!flagData || typeof flagData !== "object") {
116
+ throw new Error("Feature flag data is required");
117
+ }
118
+ if (!flagData.key) {
119
+ throw new Error("Feature flag key is required");
120
+ }
121
+ try {
122
+ const response = await this._request("/admin/feature-flags", {
123
+ method: "POST",
124
+ body: JSON.stringify(flagData),
125
+ methodName: "createFeatureFlag"
126
+ });
127
+ if (response.success) {
128
+ return response.data;
129
+ }
130
+ throw new Error(response.message);
131
+ } catch (error) {
132
+ throw new Error(`Failed to create feature flag: ${error.message}`, { cause: error });
133
+ }
134
+ }
135
+ async updateFeatureFlag(id, patch) {
136
+ this._requireReady("updateFeatureFlag");
137
+ if (!id) {
138
+ throw new Error("Feature flag id is required");
139
+ }
140
+ if (!patch || typeof patch !== "object") {
141
+ throw new Error("Feature flag patch is required");
142
+ }
143
+ try {
144
+ const response = await this._request(`/admin/feature-flags/${encodeURIComponent(String(id))}`, {
145
+ method: "PATCH",
146
+ body: JSON.stringify(patch),
147
+ methodName: "updateFeatureFlag"
148
+ });
149
+ if (response.success) {
150
+ return response.data;
151
+ }
152
+ throw new Error(response.message);
153
+ } catch (error) {
154
+ throw new Error(`Failed to update feature flag: ${error.message}`, { cause: error });
155
+ }
156
+ }
157
+ async archiveFeatureFlag(id) {
158
+ this._requireReady("archiveFeatureFlag");
159
+ if (!id) {
160
+ throw new Error("Feature flag id is required");
161
+ }
162
+ try {
163
+ const response = await this._request(`/admin/feature-flags/${encodeURIComponent(String(id))}`, {
164
+ method: "DELETE",
165
+ methodName: "archiveFeatureFlag"
166
+ });
167
+ if (response.success) {
168
+ return response.data;
169
+ }
170
+ throw new Error(response.message);
171
+ } catch (error) {
172
+ throw new Error(`Failed to archive feature flag: ${error.message}`, { cause: error });
173
+ }
174
+ }
175
+ }
@@ -22,6 +22,7 @@ __export(services_exports, {
22
22
  BranchService: () => import_BranchService.BranchService,
23
23
  CollabService: () => import_CollabService.CollabService,
24
24
  DnsService: () => import_DnsService.DnsService,
25
+ FeatureFlagService: () => import_FeatureFlagService.FeatureFlagService,
25
26
  FileService: () => import_FileService.FileService,
26
27
  IntegrationService: () => import_IntegrationService.IntegrationService,
27
28
  MetricsService: () => import_MetricsService.MetricsService,
@@ -38,6 +39,7 @@ __export(services_exports, {
38
39
  createBranchService: () => createBranchService,
39
40
  createCollabService: () => createCollabService,
40
41
  createDnsService: () => createDnsService,
42
+ createFeatureFlagService: () => createFeatureFlagService,
41
43
  createFileService: () => createFileService,
42
44
  createIntegrationService: () => createIntegrationService,
43
45
  createMetricsService: () => createMetricsService,
@@ -67,6 +69,7 @@ var import_TrackingService = require("./TrackingService.js");
67
69
  var import_WaitlistService = require("./WaitlistService.js");
68
70
  var import_MetricsService = require("./MetricsService.js");
69
71
  var import_IntegrationService = require("./IntegrationService.js");
72
+ var import_FeatureFlagService = require("./FeatureFlagService.js");
70
73
  const createService = (ServiceClass, config) => new ServiceClass(config);
71
74
  const createAuthService = (config) => createService(import_AuthService.AuthService, config);
72
75
  const createCollabService = (config) => createService(import_CollabService.CollabService, config);
@@ -84,3 +87,4 @@ const createTrackingService = (config) => createService(import_TrackingService.T
84
87
  const createWaitlistService = (config) => createService(import_WaitlistService.WaitlistService, config);
85
88
  const createMetricsService = (config) => createService(import_MetricsService.MetricsService, config);
86
89
  const createIntegrationService = (config) => createService(import_IntegrationService.IntegrationService, config);
90
+ const createFeatureFlagService = (config) => createService(import_FeatureFlagService.FeatureFlagService, config);
@@ -319,5 +319,12 @@ const SERVICE_METHODS = {
319
319
  listGitHubConnectors: "integration",
320
320
  createGitHubConnector: "integration",
321
321
  updateGitHubConnector: "integration",
322
- deleteGitHubConnector: "integration"
322
+ deleteGitHubConnector: "integration",
323
+ // Feature flag methods (system-level + experiments)
324
+ getFeatureFlags: "featureFlag",
325
+ getFeatureFlag: "featureFlag",
326
+ getAdminFeatureFlags: "featureFlag",
327
+ createFeatureFlag: "featureFlag",
328
+ updateFeatureFlag: "featureFlag",
329
+ archiveFeatureFlag: "featureFlag"
323
330
  };
package/dist/esm/index.js CHANGED
@@ -50331,6 +50331,160 @@ var IntegrationService = class extends BaseService {
50331
50331
  }
50332
50332
  };
50333
50333
 
50334
+ // src/services/FeatureFlagService.js
50335
+ function normalizeKeysParam(keys2) {
50336
+ if (!keys2) {
50337
+ return null;
50338
+ }
50339
+ if (Array.isArray(keys2)) {
50340
+ const flattened = keys2.flatMap((k3) => String(k3).split(","));
50341
+ const cleaned2 = flattened.map((s3) => s3.trim()).filter(Boolean);
50342
+ return cleaned2.length ? cleaned2.join(",") : null;
50343
+ }
50344
+ const cleaned = String(keys2).split(",").map((s3) => s3.trim()).filter(Boolean);
50345
+ return cleaned.length ? cleaned.join(",") : null;
50346
+ }
50347
+ var FeatureFlagService = class extends BaseService {
50348
+ // ==================== USER FEATURE FLAGS (optional auth) ====================
50349
+ /**
50350
+ * Evaluate feature flags for the current user (or anonymous).
50351
+ * @param {Object} [params]
50352
+ * @param {string[]|string} [params.keys] Optional subset of keys (array or comma-separated string)
50353
+ * @returns {Promise<{flags: Record<string, {enabled: boolean, variant: string|null, payload: any}>}>}
50354
+ */
50355
+ async getFeatureFlags(params2 = {}) {
50356
+ this._requireReady("getFeatureFlags");
50357
+ const { keys: keys2 } = params2 || {};
50358
+ const queryParams = new URLSearchParams();
50359
+ const keysParam = normalizeKeysParam(keys2);
50360
+ if (keysParam) {
50361
+ queryParams.append("keys", keysParam);
50362
+ }
50363
+ const queryString = queryParams.toString();
50364
+ const url2 = `/feature-flags${queryString ? `?${queryString}` : ""}`;
50365
+ try {
50366
+ const response = await this._request(url2, {
50367
+ method: "GET",
50368
+ methodName: "getFeatureFlags"
50369
+ });
50370
+ if (response.success) {
50371
+ return response.data;
50372
+ }
50373
+ throw new Error(response.message);
50374
+ } catch (error) {
50375
+ throw new Error(`Failed to get feature flags: ${error.message}`, { cause: error });
50376
+ }
50377
+ }
50378
+ /**
50379
+ * Evaluate a single feature flag for the current user (or anonymous).
50380
+ */
50381
+ async getFeatureFlag(key) {
50382
+ this._requireReady("getFeatureFlag");
50383
+ if (!key) {
50384
+ throw new Error("Feature flag key is required");
50385
+ }
50386
+ try {
50387
+ const response = await this._request(`/feature-flags/${encodeURIComponent(String(key))}`, {
50388
+ method: "GET",
50389
+ methodName: "getFeatureFlag"
50390
+ });
50391
+ if (response.success) {
50392
+ return response.data;
50393
+ }
50394
+ throw new Error(response.message);
50395
+ } catch (error) {
50396
+ throw new Error(`Failed to get feature flag: ${error.message}`, { cause: error });
50397
+ }
50398
+ }
50399
+ // ==================== ADMIN FEATURE FLAGS (admin only) ====================
50400
+ async getAdminFeatureFlags(params2 = {}) {
50401
+ this._requireReady("getAdminFeatureFlags");
50402
+ const { includeArchived = true } = params2 || {};
50403
+ const queryParams = new URLSearchParams();
50404
+ if (includeArchived === false) {
50405
+ queryParams.append("includeArchived", "false");
50406
+ }
50407
+ const queryString = queryParams.toString();
50408
+ const url2 = `/admin/feature-flags${queryString ? `?${queryString}` : ""}`;
50409
+ try {
50410
+ const response = await this._request(url2, {
50411
+ method: "GET",
50412
+ methodName: "getAdminFeatureFlags"
50413
+ });
50414
+ if (response.success) {
50415
+ return response.data;
50416
+ }
50417
+ throw new Error(response.message);
50418
+ } catch (error) {
50419
+ throw new Error(`Failed to get admin feature flags: ${error.message}`, {
50420
+ cause: error
50421
+ });
50422
+ }
50423
+ }
50424
+ async createFeatureFlag(flagData) {
50425
+ this._requireReady("createFeatureFlag");
50426
+ if (!flagData || typeof flagData !== "object") {
50427
+ throw new Error("Feature flag data is required");
50428
+ }
50429
+ if (!flagData.key) {
50430
+ throw new Error("Feature flag key is required");
50431
+ }
50432
+ try {
50433
+ const response = await this._request("/admin/feature-flags", {
50434
+ method: "POST",
50435
+ body: JSON.stringify(flagData),
50436
+ methodName: "createFeatureFlag"
50437
+ });
50438
+ if (response.success) {
50439
+ return response.data;
50440
+ }
50441
+ throw new Error(response.message);
50442
+ } catch (error) {
50443
+ throw new Error(`Failed to create feature flag: ${error.message}`, { cause: error });
50444
+ }
50445
+ }
50446
+ async updateFeatureFlag(id2, patch) {
50447
+ this._requireReady("updateFeatureFlag");
50448
+ if (!id2) {
50449
+ throw new Error("Feature flag id is required");
50450
+ }
50451
+ if (!patch || typeof patch !== "object") {
50452
+ throw new Error("Feature flag patch is required");
50453
+ }
50454
+ try {
50455
+ const response = await this._request(`/admin/feature-flags/${encodeURIComponent(String(id2))}`, {
50456
+ method: "PATCH",
50457
+ body: JSON.stringify(patch),
50458
+ methodName: "updateFeatureFlag"
50459
+ });
50460
+ if (response.success) {
50461
+ return response.data;
50462
+ }
50463
+ throw new Error(response.message);
50464
+ } catch (error) {
50465
+ throw new Error(`Failed to update feature flag: ${error.message}`, { cause: error });
50466
+ }
50467
+ }
50468
+ async archiveFeatureFlag(id2) {
50469
+ this._requireReady("archiveFeatureFlag");
50470
+ if (!id2) {
50471
+ throw new Error("Feature flag id is required");
50472
+ }
50473
+ try {
50474
+ const response = await this._request(`/admin/feature-flags/${encodeURIComponent(String(id2))}`, {
50475
+ method: "DELETE",
50476
+ methodName: "archiveFeatureFlag"
50477
+ });
50478
+ if (response.success) {
50479
+ return response.data;
50480
+ }
50481
+ throw new Error(response.message);
50482
+ } catch (error) {
50483
+ throw new Error(`Failed to archive feature flag: ${error.message}`, { cause: error });
50484
+ }
50485
+ }
50486
+ };
50487
+
50334
50488
  // src/services/index.js
50335
50489
  var createService = (ServiceClass, config) => new ServiceClass(config);
50336
50490
  var createAuthService = (config) => createService(AuthService, config);
@@ -50349,6 +50503,7 @@ var createTrackingService = (config) => createService(TrackingService, config);
50349
50503
  var createWaitlistService = (config) => createService(WaitlistService, config);
50350
50504
  var createMetricsService = (config) => createService(MetricsService, config);
50351
50505
  var createIntegrationService = (config) => createService(IntegrationService, config);
50506
+ var createFeatureFlagService = (config) => createService(FeatureFlagService, config);
50352
50507
 
50353
50508
  // src/utils/services.js
50354
50509
  var SERVICE_METHODS = {
@@ -50650,7 +50805,14 @@ var SERVICE_METHODS = {
50650
50805
  listGitHubConnectors: "integration",
50651
50806
  createGitHubConnector: "integration",
50652
50807
  updateGitHubConnector: "integration",
50653
- deleteGitHubConnector: "integration"
50808
+ deleteGitHubConnector: "integration",
50809
+ // Feature flag methods (system-level + experiments)
50810
+ getFeatureFlags: "featureFlag",
50811
+ getFeatureFlag: "featureFlag",
50812
+ getAdminFeatureFlags: "featureFlag",
50813
+ createFeatureFlag: "featureFlag",
50814
+ updateFeatureFlag: "featureFlag",
50815
+ archiveFeatureFlag: "featureFlag"
50654
50816
  };
50655
50817
 
50656
50818
  // src/index.js
@@ -50790,6 +50952,13 @@ var SDK = class {
50790
50952
  context: this._context,
50791
50953
  options: this._options
50792
50954
  })
50955
+ ),
50956
+ this._initService(
50957
+ "featureFlag",
50958
+ createFeatureFlagService({
50959
+ context: this._context,
50960
+ options: this._options
50961
+ })
50793
50962
  )
50794
50963
  ]);
50795
50964
  return this;
@@ -50913,6 +51082,7 @@ export {
50913
51082
  createBranchService,
50914
51083
  createCollabService,
50915
51084
  createDnsService,
51085
+ createFeatureFlagService,
50916
51086
  createFileService,
50917
51087
  createIntegrationService,
50918
51088
  createMetricsService,