@schematichq/schematic-react 1.0.3 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +50 -1
- package/dist/schematic-react.cjs.js +290 -90
- package/dist/schematic-react.d.ts +11 -6
- package/dist/schematic-react.esm.js +287 -87
- package/package.json +2 -2
@@ -28,17 +28,20 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
29
29
|
|
30
30
|
// src/index.ts
|
31
|
-
var
|
32
|
-
__export(
|
31
|
+
var index_exports = {};
|
32
|
+
__export(index_exports, {
|
33
|
+
RuleType: () => RuleType,
|
33
34
|
Schematic: () => Schematic,
|
34
35
|
SchematicProvider: () => SchematicProvider,
|
36
|
+
UsagePeriod: () => UsagePeriod,
|
35
37
|
useSchematic: () => useSchematic,
|
36
38
|
useSchematicContext: () => useSchematicContext,
|
39
|
+
useSchematicEntitlement: () => useSchematicEntitlement,
|
37
40
|
useSchematicEvents: () => useSchematicEvents,
|
38
41
|
useSchematicFlag: () => useSchematicFlag,
|
39
42
|
useSchematicIsPending: () => useSchematicIsPending
|
40
43
|
});
|
41
|
-
module.exports = __toCommonJS(
|
44
|
+
module.exports = __toCommonJS(index_exports);
|
42
45
|
|
43
46
|
// node_modules/@schematichq/schematic-js/dist/schematic.esm.js
|
44
47
|
var __create2 = Object.create;
|
@@ -70,11 +73,12 @@ var require_browser_polyfill = __commonJS({
|
|
70
73
|
"node_modules/cross-fetch/dist/browser-polyfill.js"(exports) {
|
71
74
|
(function(self2) {
|
72
75
|
var irrelevant = function(exports2) {
|
73
|
-
var
|
76
|
+
var g = typeof globalThis !== "undefined" && globalThis || typeof self2 !== "undefined" && self2 || // eslint-disable-next-line no-undef
|
77
|
+
typeof global !== "undefined" && global || {};
|
74
78
|
var support = {
|
75
|
-
searchParams: "URLSearchParams" in
|
76
|
-
iterable: "Symbol" in
|
77
|
-
blob: "FileReader" in
|
79
|
+
searchParams: "URLSearchParams" in g,
|
80
|
+
iterable: "Symbol" in g && "iterator" in Symbol,
|
81
|
+
blob: "FileReader" in g && "Blob" in g && function() {
|
78
82
|
try {
|
79
83
|
new Blob();
|
80
84
|
return true;
|
@@ -82,8 +86,8 @@ var require_browser_polyfill = __commonJS({
|
|
82
86
|
return false;
|
83
87
|
}
|
84
88
|
}(),
|
85
|
-
formData: "FormData" in
|
86
|
-
arrayBuffer: "ArrayBuffer" in
|
89
|
+
formData: "FormData" in g,
|
90
|
+
arrayBuffer: "ArrayBuffer" in g
|
87
91
|
};
|
88
92
|
function isDataView(obj) {
|
89
93
|
return obj && DataView.prototype.isPrototypeOf(obj);
|
@@ -141,6 +145,9 @@ var require_browser_polyfill = __commonJS({
|
|
141
145
|
}, this);
|
142
146
|
} else if (Array.isArray(headers)) {
|
143
147
|
headers.forEach(function(header) {
|
148
|
+
if (header.length != 2) {
|
149
|
+
throw new TypeError("Headers constructor: expected name/value pair to be length 2, found" + header.length);
|
150
|
+
}
|
144
151
|
this.append(header[0], header[1]);
|
145
152
|
}, this);
|
146
153
|
} else if (headers) {
|
@@ -200,6 +207,7 @@ var require_browser_polyfill = __commonJS({
|
|
200
207
|
Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
|
201
208
|
}
|
202
209
|
function consumed(body) {
|
210
|
+
if (body._noBody) return;
|
203
211
|
if (body.bodyUsed) {
|
204
212
|
return Promise.reject(new TypeError("Already read"));
|
205
213
|
}
|
@@ -224,14 +232,16 @@ var require_browser_polyfill = __commonJS({
|
|
224
232
|
function readBlobAsText(blob) {
|
225
233
|
var reader = new FileReader();
|
226
234
|
var promise = fileReaderReady(reader);
|
227
|
-
|
235
|
+
var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type);
|
236
|
+
var encoding = match ? match[1] : "utf-8";
|
237
|
+
reader.readAsText(blob, encoding);
|
228
238
|
return promise;
|
229
239
|
}
|
230
240
|
function readArrayBufferAsText(buf) {
|
231
241
|
var view = new Uint8Array(buf);
|
232
242
|
var chars = new Array(view.length);
|
233
|
-
for (var
|
234
|
-
chars[
|
243
|
+
for (var i = 0; i < view.length; i++) {
|
244
|
+
chars[i] = String.fromCharCode(view[i]);
|
235
245
|
}
|
236
246
|
return chars.join("");
|
237
247
|
}
|
@@ -250,6 +260,7 @@ var require_browser_polyfill = __commonJS({
|
|
250
260
|
this.bodyUsed = this.bodyUsed;
|
251
261
|
this._bodyInit = body;
|
252
262
|
if (!body) {
|
263
|
+
this._noBody = true;
|
253
264
|
this._bodyText = "";
|
254
265
|
} else if (typeof body === "string") {
|
255
266
|
this._bodyText = body;
|
@@ -293,27 +304,28 @@ var require_browser_polyfill = __commonJS({
|
|
293
304
|
return Promise.resolve(new Blob([this._bodyText]));
|
294
305
|
}
|
295
306
|
};
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
} else {
|
310
|
-
return Promise.resolve(this._bodyArrayBuffer);
|
311
|
-
}
|
307
|
+
}
|
308
|
+
this.arrayBuffer = function() {
|
309
|
+
if (this._bodyArrayBuffer) {
|
310
|
+
var isConsumed = consumed(this);
|
311
|
+
if (isConsumed) {
|
312
|
+
return isConsumed;
|
313
|
+
} else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
|
314
|
+
return Promise.resolve(
|
315
|
+
this._bodyArrayBuffer.buffer.slice(
|
316
|
+
this._bodyArrayBuffer.byteOffset,
|
317
|
+
this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
|
318
|
+
)
|
319
|
+
);
|
312
320
|
} else {
|
313
|
-
return
|
321
|
+
return Promise.resolve(this._bodyArrayBuffer);
|
314
322
|
}
|
315
|
-
}
|
316
|
-
|
323
|
+
} else if (support.blob) {
|
324
|
+
return this.blob().then(readBlobAsArrayBuffer);
|
325
|
+
} else {
|
326
|
+
throw new Error("could not read as ArrayBuffer");
|
327
|
+
}
|
328
|
+
};
|
317
329
|
this.text = function() {
|
318
330
|
var rejected = consumed(this);
|
319
331
|
if (rejected) {
|
@@ -339,7 +351,7 @@ var require_browser_polyfill = __commonJS({
|
|
339
351
|
};
|
340
352
|
return this;
|
341
353
|
}
|
342
|
-
var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
|
354
|
+
var methods = ["CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"];
|
343
355
|
function normalizeMethod(method) {
|
344
356
|
var upcased = method.toUpperCase();
|
345
357
|
return methods.indexOf(upcased) > -1 ? upcased : method;
|
@@ -375,7 +387,12 @@ var require_browser_polyfill = __commonJS({
|
|
375
387
|
}
|
376
388
|
this.method = normalizeMethod(options.method || this.method || "GET");
|
377
389
|
this.mode = options.mode || this.mode || null;
|
378
|
-
this.signal = options.signal || this.signal
|
390
|
+
this.signal = options.signal || this.signal || function() {
|
391
|
+
if ("AbortController" in g) {
|
392
|
+
var ctrl = new AbortController();
|
393
|
+
return ctrl.signal;
|
394
|
+
}
|
395
|
+
}();
|
379
396
|
this.referrer = null;
|
380
397
|
if ((this.method === "GET" || this.method === "HEAD") && body) {
|
381
398
|
throw new TypeError("Body not allowed for GET or HEAD requests");
|
@@ -418,7 +435,11 @@ var require_browser_polyfill = __commonJS({
|
|
418
435
|
var key = parts.shift().trim();
|
419
436
|
if (key) {
|
420
437
|
var value = parts.join(":").trim();
|
421
|
-
|
438
|
+
try {
|
439
|
+
headers.append(key, value);
|
440
|
+
} catch (error) {
|
441
|
+
console.warn("Response " + error.message);
|
442
|
+
}
|
422
443
|
}
|
423
444
|
});
|
424
445
|
return headers;
|
@@ -433,6 +454,9 @@ var require_browser_polyfill = __commonJS({
|
|
433
454
|
}
|
434
455
|
this.type = "default";
|
435
456
|
this.status = options.status === void 0 ? 200 : options.status;
|
457
|
+
if (this.status < 200 || this.status > 599) {
|
458
|
+
throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");
|
459
|
+
}
|
436
460
|
this.ok = this.status >= 200 && this.status < 300;
|
437
461
|
this.statusText = options.statusText === void 0 ? "" : "" + options.statusText;
|
438
462
|
this.headers = new Headers(options.headers);
|
@@ -449,7 +473,9 @@ var require_browser_polyfill = __commonJS({
|
|
449
473
|
});
|
450
474
|
};
|
451
475
|
Response.error = function() {
|
452
|
-
var response = new Response(null, { status:
|
476
|
+
var response = new Response(null, { status: 200, statusText: "" });
|
477
|
+
response.ok = false;
|
478
|
+
response.status = 0;
|
453
479
|
response.type = "error";
|
454
480
|
return response;
|
455
481
|
};
|
@@ -460,7 +486,7 @@ var require_browser_polyfill = __commonJS({
|
|
460
486
|
}
|
461
487
|
return new Response(null, { status, headers: { location: url } });
|
462
488
|
};
|
463
|
-
exports2.DOMException =
|
489
|
+
exports2.DOMException = g.DOMException;
|
464
490
|
try {
|
465
491
|
new exports2.DOMException();
|
466
492
|
} catch (err) {
|
@@ -485,10 +511,14 @@ var require_browser_polyfill = __commonJS({
|
|
485
511
|
}
|
486
512
|
xhr.onload = function() {
|
487
513
|
var options = {
|
488
|
-
status: xhr.status,
|
489
514
|
statusText: xhr.statusText,
|
490
515
|
headers: parseHeaders(xhr.getAllResponseHeaders() || "")
|
491
516
|
};
|
517
|
+
if (request.url.indexOf("file://") === 0 && (xhr.status < 200 || xhr.status > 599)) {
|
518
|
+
options.status = 200;
|
519
|
+
} else {
|
520
|
+
options.status = xhr.status;
|
521
|
+
}
|
492
522
|
options.url = "responseURL" in xhr ? xhr.responseURL : options.headers.get("X-Request-URL");
|
493
523
|
var body = "response" in xhr ? xhr.response : xhr.responseText;
|
494
524
|
setTimeout(function() {
|
@@ -502,7 +532,7 @@ var require_browser_polyfill = __commonJS({
|
|
502
532
|
};
|
503
533
|
xhr.ontimeout = function() {
|
504
534
|
setTimeout(function() {
|
505
|
-
reject(new TypeError("Network request
|
535
|
+
reject(new TypeError("Network request timed out"));
|
506
536
|
}, 0);
|
507
537
|
};
|
508
538
|
xhr.onabort = function() {
|
@@ -512,7 +542,7 @@ var require_browser_polyfill = __commonJS({
|
|
512
542
|
};
|
513
543
|
function fixUrl(url) {
|
514
544
|
try {
|
515
|
-
return url === "" &&
|
545
|
+
return url === "" && g.location.href ? g.location.href : url;
|
516
546
|
} catch (e) {
|
517
547
|
return url;
|
518
548
|
}
|
@@ -526,14 +556,21 @@ var require_browser_polyfill = __commonJS({
|
|
526
556
|
if ("responseType" in xhr) {
|
527
557
|
if (support.blob) {
|
528
558
|
xhr.responseType = "blob";
|
529
|
-
} else if (support.arrayBuffer
|
559
|
+
} else if (support.arrayBuffer) {
|
530
560
|
xhr.responseType = "arraybuffer";
|
531
561
|
}
|
532
562
|
}
|
533
|
-
if (init && typeof init.headers === "object" && !(init.headers instanceof Headers)) {
|
563
|
+
if (init && typeof init.headers === "object" && !(init.headers instanceof Headers || g.Headers && init.headers instanceof g.Headers)) {
|
564
|
+
var names = [];
|
534
565
|
Object.getOwnPropertyNames(init.headers).forEach(function(name) {
|
566
|
+
names.push(normalizeName(name));
|
535
567
|
xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
|
536
568
|
});
|
569
|
+
request.headers.forEach(function(value, name) {
|
570
|
+
if (names.indexOf(name) === -1) {
|
571
|
+
xhr.setRequestHeader(name, value);
|
572
|
+
}
|
573
|
+
});
|
537
574
|
} else {
|
538
575
|
request.headers.forEach(function(value, name) {
|
539
576
|
xhr.setRequestHeader(name, value);
|
@@ -551,11 +588,11 @@ var require_browser_polyfill = __commonJS({
|
|
551
588
|
});
|
552
589
|
}
|
553
590
|
fetch2.polyfill = true;
|
554
|
-
if (!
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
591
|
+
if (!g.fetch) {
|
592
|
+
g.fetch = fetch2;
|
593
|
+
g.Headers = Headers;
|
594
|
+
g.Request = Request;
|
595
|
+
g.Response = Response;
|
559
596
|
}
|
560
597
|
exports2.Headers = Headers;
|
561
598
|
exports2.Request = Request;
|
@@ -567,10 +604,9 @@ var require_browser_polyfill = __commonJS({
|
|
567
604
|
}
|
568
605
|
});
|
569
606
|
var byteToHex = [];
|
570
|
-
for (i = 0; i < 256; ++i) {
|
607
|
+
for (let i = 0; i < 256; ++i) {
|
571
608
|
byteToHex.push((i + 256).toString(16).slice(1));
|
572
609
|
}
|
573
|
-
var i;
|
574
610
|
function unsafeStringify(arr, offset = 0) {
|
575
611
|
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
576
612
|
}
|
@@ -578,29 +614,33 @@ var getRandomValues;
|
|
578
614
|
var rnds8 = new Uint8Array(16);
|
579
615
|
function rng() {
|
580
616
|
if (!getRandomValues) {
|
581
|
-
|
582
|
-
if (!getRandomValues) {
|
617
|
+
if (typeof crypto === "undefined" || !crypto.getRandomValues) {
|
583
618
|
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
|
584
619
|
}
|
620
|
+
getRandomValues = crypto.getRandomValues.bind(crypto);
|
585
621
|
}
|
586
622
|
return getRandomValues(rnds8);
|
587
623
|
}
|
588
624
|
var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
589
|
-
var native_default = {
|
590
|
-
randomUUID
|
591
|
-
};
|
625
|
+
var native_default = { randomUUID };
|
592
626
|
function v4(options, buf, offset) {
|
593
627
|
if (native_default.randomUUID && !buf && !options) {
|
594
628
|
return native_default.randomUUID();
|
595
629
|
}
|
596
630
|
options = options || {};
|
597
|
-
|
631
|
+
const rnds = options.random ?? options.rng?.() ?? rng();
|
632
|
+
if (rnds.length < 16) {
|
633
|
+
throw new Error("Random bytes length must be >= 16");
|
634
|
+
}
|
598
635
|
rnds[6] = rnds[6] & 15 | 64;
|
599
636
|
rnds[8] = rnds[8] & 63 | 128;
|
600
637
|
if (buf) {
|
601
638
|
offset = offset || 0;
|
602
|
-
|
603
|
-
|
639
|
+
if (offset < 0 || offset + 16 > buf.length) {
|
640
|
+
throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
|
641
|
+
}
|
642
|
+
for (let i = 0; i < 16; ++i) {
|
643
|
+
buf[offset + i] = rnds[i];
|
604
644
|
}
|
605
645
|
return buf;
|
606
646
|
}
|
@@ -608,6 +648,117 @@ function v4(options, buf, offset) {
|
|
608
648
|
}
|
609
649
|
var v4_default = v4;
|
610
650
|
var import_polyfill = __toESM2(require_browser_polyfill());
|
651
|
+
function CheckFlagResponseDataFromJSON(json) {
|
652
|
+
return CheckFlagResponseDataFromJSONTyped(json, false);
|
653
|
+
}
|
654
|
+
function CheckFlagResponseDataFromJSONTyped(json, ignoreDiscriminator) {
|
655
|
+
if (json == null) {
|
656
|
+
return json;
|
657
|
+
}
|
658
|
+
return {
|
659
|
+
companyId: json["company_id"] == null ? void 0 : json["company_id"],
|
660
|
+
error: json["error"] == null ? void 0 : json["error"],
|
661
|
+
featureAllocation: json["feature_allocation"] == null ? void 0 : json["feature_allocation"],
|
662
|
+
featureUsage: json["feature_usage"] == null ? void 0 : json["feature_usage"],
|
663
|
+
featureUsagePeriod: json["feature_usage_period"] == null ? void 0 : json["feature_usage_period"],
|
664
|
+
featureUsageResetAt: json["feature_usage_reset_at"] == null ? void 0 : new Date(json["feature_usage_reset_at"]),
|
665
|
+
flag: json["flag"],
|
666
|
+
flagId: json["flag_id"] == null ? void 0 : json["flag_id"],
|
667
|
+
reason: json["reason"],
|
668
|
+
ruleId: json["rule_id"] == null ? void 0 : json["rule_id"],
|
669
|
+
ruleType: json["rule_type"] == null ? void 0 : json["rule_type"],
|
670
|
+
userId: json["user_id"] == null ? void 0 : json["user_id"],
|
671
|
+
value: json["value"]
|
672
|
+
};
|
673
|
+
}
|
674
|
+
function CheckFlagResponseFromJSON(json) {
|
675
|
+
return CheckFlagResponseFromJSONTyped(json, false);
|
676
|
+
}
|
677
|
+
function CheckFlagResponseFromJSONTyped(json, ignoreDiscriminator) {
|
678
|
+
if (json == null) {
|
679
|
+
return json;
|
680
|
+
}
|
681
|
+
return {
|
682
|
+
data: CheckFlagResponseDataFromJSON(json["data"]),
|
683
|
+
params: json["params"]
|
684
|
+
};
|
685
|
+
}
|
686
|
+
function CheckFlagsResponseDataFromJSON(json) {
|
687
|
+
return CheckFlagsResponseDataFromJSONTyped(json, false);
|
688
|
+
}
|
689
|
+
function CheckFlagsResponseDataFromJSONTyped(json, ignoreDiscriminator) {
|
690
|
+
if (json == null) {
|
691
|
+
return json;
|
692
|
+
}
|
693
|
+
return {
|
694
|
+
flags: json["flags"].map(CheckFlagResponseDataFromJSON)
|
695
|
+
};
|
696
|
+
}
|
697
|
+
function CheckFlagsResponseFromJSON(json) {
|
698
|
+
return CheckFlagsResponseFromJSONTyped(json, false);
|
699
|
+
}
|
700
|
+
function CheckFlagsResponseFromJSONTyped(json, ignoreDiscriminator) {
|
701
|
+
if (json == null) {
|
702
|
+
return json;
|
703
|
+
}
|
704
|
+
return {
|
705
|
+
data: CheckFlagsResponseDataFromJSON(json["data"]),
|
706
|
+
params: json["params"]
|
707
|
+
};
|
708
|
+
}
|
709
|
+
var RuleType = /* @__PURE__ */ ((RuleType2) => {
|
710
|
+
RuleType2["GLOBAL_OVERRIDE"] = "global_override";
|
711
|
+
RuleType2["COMPANY_OVERRIDE"] = "company_override";
|
712
|
+
RuleType2["COMPANY_OVERRIDE_USAGE_EXCEEDED"] = "company_override_usage_exceeded";
|
713
|
+
RuleType2["PLAN_ENTITLEMENT"] = "plan_entitlement";
|
714
|
+
RuleType2["PLAN_ENTITLEMENT_USAGE_EXCEEDED"] = "plan_entitlement_usage_exceeded";
|
715
|
+
RuleType2["STANDARD"] = "standard";
|
716
|
+
RuleType2["DEFAULT"] = "default";
|
717
|
+
return RuleType2;
|
718
|
+
})(RuleType || {});
|
719
|
+
var UsagePeriod = /* @__PURE__ */ ((UsagePeriod2) => {
|
720
|
+
UsagePeriod2["ALL_TIME"] = "all_time";
|
721
|
+
UsagePeriod2["CURRENT_DAY"] = "current_day";
|
722
|
+
UsagePeriod2["CURRENT_MONTH"] = "current_month";
|
723
|
+
UsagePeriod2["CURRENT_WEEK"] = "current_week";
|
724
|
+
return UsagePeriod2;
|
725
|
+
})(UsagePeriod || {});
|
726
|
+
var CheckFlagReturnFromJSON = (json) => {
|
727
|
+
const {
|
728
|
+
companyId,
|
729
|
+
error,
|
730
|
+
featureAllocation,
|
731
|
+
featureUsage,
|
732
|
+
featureUsagePeriod,
|
733
|
+
featureUsageResetAt,
|
734
|
+
flag,
|
735
|
+
flagId,
|
736
|
+
reason,
|
737
|
+
ruleId,
|
738
|
+
ruleType,
|
739
|
+
userId,
|
740
|
+
value
|
741
|
+
} = CheckFlagResponseDataFromJSON(json);
|
742
|
+
const featureUsageExceeded = !value && // if flag is not false, then we haven't exceeded usage
|
743
|
+
(ruleType == "company_override_usage_exceeded" || // if the rule type is one of these, then we have exceeded usage
|
744
|
+
ruleType == "plan_entitlement_usage_exceeded");
|
745
|
+
return {
|
746
|
+
featureUsageExceeded,
|
747
|
+
companyId: companyId == null ? void 0 : companyId,
|
748
|
+
error: error == null ? void 0 : error,
|
749
|
+
featureAllocation: featureAllocation == null ? void 0 : featureAllocation,
|
750
|
+
featureUsage: featureUsage == null ? void 0 : featureUsage,
|
751
|
+
featureUsagePeriod: featureUsagePeriod == null ? void 0 : featureUsagePeriod,
|
752
|
+
featureUsageResetAt: featureUsageResetAt == null ? void 0 : featureUsageResetAt,
|
753
|
+
flag,
|
754
|
+
flagId: flagId == null ? void 0 : flagId,
|
755
|
+
reason,
|
756
|
+
ruleId: ruleId == null ? void 0 : ruleId,
|
757
|
+
ruleType: ruleType == null ? void 0 : ruleType,
|
758
|
+
userId: userId == null ? void 0 : userId,
|
759
|
+
value
|
760
|
+
};
|
761
|
+
};
|
611
762
|
function contextString(context) {
|
612
763
|
const sortedContext = Object.keys(context).reduce((acc, key) => {
|
613
764
|
const sortedKeys = Object.keys(
|
@@ -631,19 +782,18 @@ var Schematic = class {
|
|
631
782
|
context = {};
|
632
783
|
eventQueue;
|
633
784
|
eventUrl = "https://c.schematichq.com";
|
634
|
-
|
785
|
+
flagCheckListeners = {};
|
635
786
|
flagValueListeners = {};
|
636
787
|
isPending = true;
|
637
788
|
isPendingListeners = /* @__PURE__ */ new Set();
|
638
789
|
storage;
|
639
790
|
useWebSocket = false;
|
640
|
-
|
791
|
+
checks = {};
|
641
792
|
webSocketUrl = "wss://api.schematichq.com";
|
642
793
|
constructor(apiKey, options) {
|
643
794
|
this.apiKey = apiKey;
|
644
795
|
this.eventQueue = [];
|
645
796
|
this.useWebSocket = options?.useWebSocket ?? false;
|
646
|
-
this.flagListener = options?.flagListener;
|
647
797
|
if (options?.additionalHeaders) {
|
648
798
|
this.additionalHeaders = options.additionalHeaders;
|
649
799
|
}
|
@@ -693,17 +843,17 @@ var Schematic = class {
|
|
693
843
|
throw new Error("Network response was not ok");
|
694
844
|
}
|
695
845
|
return response.json();
|
696
|
-
}).then((
|
697
|
-
return
|
846
|
+
}).then((response) => {
|
847
|
+
return CheckFlagResponseFromJSON(response).data.value;
|
698
848
|
}).catch((error) => {
|
699
849
|
console.error("There was a problem with the fetch operation:", error);
|
700
850
|
return fallback;
|
701
851
|
});
|
702
852
|
}
|
703
853
|
try {
|
704
|
-
const existingVals = this.
|
854
|
+
const existingVals = this.checks[contextStr];
|
705
855
|
if (this.conn && typeof existingVals !== "undefined" && typeof existingVals[key] !== "undefined") {
|
706
|
-
return existingVals[key];
|
856
|
+
return existingVals[key].value;
|
707
857
|
}
|
708
858
|
try {
|
709
859
|
await this.setContext(context);
|
@@ -714,8 +864,8 @@ var Schematic = class {
|
|
714
864
|
);
|
715
865
|
return this.fallbackToRest(key, context, fallback);
|
716
866
|
}
|
717
|
-
const contextVals = this.
|
718
|
-
return
|
867
|
+
const contextVals = this.checks[contextStr] ?? {};
|
868
|
+
return contextVals[key]?.value ?? fallback;
|
719
869
|
} catch (error) {
|
720
870
|
console.error("Unexpected error in checkFlag:", error);
|
721
871
|
return fallback;
|
@@ -739,8 +889,8 @@ var Schematic = class {
|
|
739
889
|
if (!response.ok) {
|
740
890
|
throw new Error("Network response was not ok");
|
741
891
|
}
|
742
|
-
const data = await response.json();
|
743
|
-
return data
|
892
|
+
const data = CheckFlagResponseFromJSON(await response.json());
|
893
|
+
return data?.data?.value ?? false;
|
744
894
|
} catch (error) {
|
745
895
|
console.error("REST API call failed, using fallback value:", error);
|
746
896
|
return fallback;
|
@@ -767,8 +917,9 @@ var Schematic = class {
|
|
767
917
|
throw new Error("Network response was not ok");
|
768
918
|
}
|
769
919
|
return response.json();
|
770
|
-
}).then((
|
771
|
-
|
920
|
+
}).then((responseJson) => {
|
921
|
+
const resp = CheckFlagsResponseFromJSON(responseJson);
|
922
|
+
return (resp?.data?.flags ?? []).reduce(
|
772
923
|
(accum, flag) => {
|
773
924
|
accum[flag.flag] = flag.value;
|
774
925
|
return accum;
|
@@ -777,7 +928,7 @@ var Schematic = class {
|
|
777
928
|
);
|
778
929
|
}).catch((error) => {
|
779
930
|
console.error("There was a problem with the fetch operation:", error);
|
780
|
-
return
|
931
|
+
return {};
|
781
932
|
});
|
782
933
|
};
|
783
934
|
/**
|
@@ -939,18 +1090,15 @@ var Schematic = class {
|
|
939
1090
|
let resolved = false;
|
940
1091
|
const messageHandler = (event) => {
|
941
1092
|
const message = JSON.parse(event.data);
|
942
|
-
if (!(contextString(context) in this.
|
943
|
-
this.
|
944
|
-
}
|
945
|
-
(message.flags ?? []).forEach(
|
946
|
-
(flag) => {
|
947
|
-
this.values[contextString(context)][flag.flag] = flag.value;
|
948
|
-
this.notifyFlagValueListeners(flag.flag, flag.value);
|
949
|
-
}
|
950
|
-
);
|
951
|
-
if (this.flagListener) {
|
952
|
-
this.flagListener(this.getFlagValues());
|
1093
|
+
if (!(contextString(context) in this.checks)) {
|
1094
|
+
this.checks[contextString(context)] = {};
|
953
1095
|
}
|
1096
|
+
(message.flags ?? []).forEach((flag) => {
|
1097
|
+
const flagCheck = CheckFlagReturnFromJSON(flag);
|
1098
|
+
this.checks[contextString(context)][flagCheck.flag] = flagCheck;
|
1099
|
+
this.notifyFlagCheckListeners(flag.flag, flagCheck);
|
1100
|
+
this.notifyFlagValueListeners(flag.flag, flagCheck.value);
|
1101
|
+
});
|
954
1102
|
this.setIsPending(false);
|
955
1103
|
if (!resolved) {
|
956
1104
|
resolved = true;
|
@@ -990,18 +1138,21 @@ var Schematic = class {
|
|
990
1138
|
setIsPending = (isPending) => {
|
991
1139
|
this.isPending = isPending;
|
992
1140
|
this.isPendingListeners.forEach(
|
993
|
-
(listener) =>
|
1141
|
+
(listener) => notifyPendingListener(listener, isPending)
|
994
1142
|
);
|
995
1143
|
};
|
1144
|
+
// flag checks state
|
1145
|
+
getFlagCheck = (flagKey) => {
|
1146
|
+
const contextStr = contextString(this.context);
|
1147
|
+
const checks = this.checks[contextStr] ?? {};
|
1148
|
+
return checks[flagKey];
|
1149
|
+
};
|
996
1150
|
// flagValues state
|
997
1151
|
getFlagValue = (flagKey) => {
|
998
|
-
const
|
999
|
-
return
|
1000
|
-
};
|
1001
|
-
getFlagValues = () => {
|
1002
|
-
const contextStr = contextString(this.context);
|
1003
|
-
return this.values[contextStr] ?? {};
|
1152
|
+
const check = this.getFlagCheck(flagKey);
|
1153
|
+
return check?.value;
|
1004
1154
|
};
|
1155
|
+
/** Register an event listener that will be notified with the boolean value for a given flag when this value changes */
|
1005
1156
|
addFlagValueListener = (flagKey, listener) => {
|
1006
1157
|
if (!(flagKey in this.flagValueListeners)) {
|
1007
1158
|
this.flagValueListeners[flagKey] = /* @__PURE__ */ new Set();
|
@@ -1011,12 +1162,40 @@ var Schematic = class {
|
|
1011
1162
|
this.flagValueListeners[flagKey].delete(listener);
|
1012
1163
|
};
|
1013
1164
|
};
|
1165
|
+
/** Register an event listener that will be notified with the full flag check response for a given flag whenever this value changes */
|
1166
|
+
addFlagCheckListener = (flagKey, listener) => {
|
1167
|
+
if (!(flagKey in this.flagCheckListeners)) {
|
1168
|
+
this.flagCheckListeners[flagKey] = /* @__PURE__ */ new Set();
|
1169
|
+
}
|
1170
|
+
this.flagCheckListeners[flagKey].add(listener);
|
1171
|
+
return () => {
|
1172
|
+
this.flagCheckListeners[flagKey].delete(listener);
|
1173
|
+
};
|
1174
|
+
};
|
1175
|
+
notifyFlagCheckListeners = (flagKey, check) => {
|
1176
|
+
const listeners = this.flagCheckListeners?.[flagKey] ?? [];
|
1177
|
+
listeners.forEach((listener) => notifyFlagCheckListener(listener, check));
|
1178
|
+
};
|
1014
1179
|
notifyFlagValueListeners = (flagKey, value) => {
|
1015
1180
|
const listeners = this.flagValueListeners?.[flagKey] ?? [];
|
1016
|
-
listeners.forEach((listener) =>
|
1181
|
+
listeners.forEach((listener) => notifyFlagValueListener(listener, value));
|
1017
1182
|
};
|
1018
1183
|
};
|
1019
|
-
var
|
1184
|
+
var notifyPendingListener = (listener, value) => {
|
1185
|
+
if (listener.length > 0) {
|
1186
|
+
listener(value);
|
1187
|
+
} else {
|
1188
|
+
listener();
|
1189
|
+
}
|
1190
|
+
};
|
1191
|
+
var notifyFlagCheckListener = (listener, value) => {
|
1192
|
+
if (listener.length > 0) {
|
1193
|
+
listener(value);
|
1194
|
+
} else {
|
1195
|
+
listener();
|
1196
|
+
}
|
1197
|
+
};
|
1198
|
+
var notifyFlagValueListener = (listener, value) => {
|
1020
1199
|
if (listener.length > 0) {
|
1021
1200
|
listener(value);
|
1022
1201
|
} else {
|
@@ -1120,6 +1299,27 @@ var useSchematicFlag = (key, opts) => {
|
|
1120
1299
|
}, [client, key, fallback]);
|
1121
1300
|
return (0, import_react2.useSyncExternalStore)(subscribe, getSnapshot);
|
1122
1301
|
};
|
1302
|
+
var useSchematicEntitlement = (key, opts) => {
|
1303
|
+
const client = useSchematicClient(opts);
|
1304
|
+
const fallback = opts?.fallback ?? false;
|
1305
|
+
const fallbackCheck = (0, import_react2.useMemo)(
|
1306
|
+
() => ({
|
1307
|
+
flag: key,
|
1308
|
+
reason: "Fallback",
|
1309
|
+
value: fallback
|
1310
|
+
}),
|
1311
|
+
[key, fallback]
|
1312
|
+
);
|
1313
|
+
const subscribe = (0, import_react2.useCallback)(
|
1314
|
+
(callback) => client.addFlagCheckListener(key, callback),
|
1315
|
+
[client, key]
|
1316
|
+
);
|
1317
|
+
const getSnapshot = (0, import_react2.useCallback)(() => {
|
1318
|
+
const check = client.getFlagCheck(key);
|
1319
|
+
return check ?? fallbackCheck;
|
1320
|
+
}, [client, key, fallbackCheck]);
|
1321
|
+
return (0, import_react2.useSyncExternalStore)(subscribe, getSnapshot);
|
1322
|
+
};
|
1123
1323
|
var useSchematicIsPending = (opts) => {
|
1124
1324
|
const client = useSchematicClient(opts);
|
1125
1325
|
const subscribe = (0, import_react2.useCallback)(
|