@augmenting-integrations/flags 0.2.2 → 2.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.
- package/dist/createFlags.cjs +108 -0
- package/dist/createFlags.cjs.map +1 -0
- package/dist/createFlags.js +84 -0
- package/dist/createFlags.js.map +1 -0
- package/dist/index.cjs +2 -84
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -80
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var createFlags_exports = {};
|
|
21
|
+
__export(createFlags_exports, {
|
|
22
|
+
createFlags: () => createFlags
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(createFlags_exports);
|
|
25
|
+
var import_react = require("react");
|
|
26
|
+
const EMPTY = Object.freeze({});
|
|
27
|
+
function createFlags(opts) {
|
|
28
|
+
const { flags, storageKey } = opts;
|
|
29
|
+
const eventName = `flags:changed:${storageKey}`;
|
|
30
|
+
let cachedRaw = void 0;
|
|
31
|
+
let cachedSnapshot = {};
|
|
32
|
+
function readSnapshot() {
|
|
33
|
+
if (typeof window === "undefined") return EMPTY;
|
|
34
|
+
let raw;
|
|
35
|
+
try {
|
|
36
|
+
raw = window.localStorage.getItem(storageKey);
|
|
37
|
+
} catch {
|
|
38
|
+
return cachedSnapshot;
|
|
39
|
+
}
|
|
40
|
+
if (raw === cachedRaw) return cachedSnapshot;
|
|
41
|
+
cachedRaw = raw;
|
|
42
|
+
try {
|
|
43
|
+
cachedSnapshot = raw ? JSON.parse(raw) : {};
|
|
44
|
+
} catch {
|
|
45
|
+
cachedSnapshot = {};
|
|
46
|
+
}
|
|
47
|
+
return cachedSnapshot;
|
|
48
|
+
}
|
|
49
|
+
function writeOverrides(next) {
|
|
50
|
+
if (typeof window === "undefined") return;
|
|
51
|
+
const json = JSON.stringify(next);
|
|
52
|
+
try {
|
|
53
|
+
window.localStorage.setItem(storageKey, json);
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
cachedRaw = json;
|
|
57
|
+
cachedSnapshot = next;
|
|
58
|
+
window.dispatchEvent(new Event(eventName));
|
|
59
|
+
}
|
|
60
|
+
function subscribe(callback) {
|
|
61
|
+
if (typeof window === "undefined") return () => {
|
|
62
|
+
};
|
|
63
|
+
const handler = () => {
|
|
64
|
+
cachedRaw = void 0;
|
|
65
|
+
callback();
|
|
66
|
+
};
|
|
67
|
+
window.addEventListener(eventName, handler);
|
|
68
|
+
window.addEventListener("storage", handler);
|
|
69
|
+
return () => {
|
|
70
|
+
window.removeEventListener(eventName, handler);
|
|
71
|
+
window.removeEventListener("storage", handler);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function getServerSnapshot() {
|
|
75
|
+
return EMPTY;
|
|
76
|
+
}
|
|
77
|
+
function useFlag(key) {
|
|
78
|
+
const overrides = (0, import_react.useSyncExternalStore)(subscribe, readSnapshot, getServerSnapshot);
|
|
79
|
+
if (key in overrides) return overrides[key];
|
|
80
|
+
const def = flags[key];
|
|
81
|
+
return def.default;
|
|
82
|
+
}
|
|
83
|
+
function setFlag(key, value) {
|
|
84
|
+
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
85
|
+
current[key] = value;
|
|
86
|
+
writeOverrides(current);
|
|
87
|
+
}
|
|
88
|
+
function resetFlag(key) {
|
|
89
|
+
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
90
|
+
delete current[key];
|
|
91
|
+
writeOverrides(current);
|
|
92
|
+
}
|
|
93
|
+
function resetAllFlags() {
|
|
94
|
+
writeOverrides({});
|
|
95
|
+
}
|
|
96
|
+
function listFlags() {
|
|
97
|
+
return Object.entries(flags).map(([key, def]) => ({
|
|
98
|
+
key,
|
|
99
|
+
...def
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };
|
|
103
|
+
}
|
|
104
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
105
|
+
0 && (module.exports = {
|
|
106
|
+
createFlags
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=createFlags.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/createFlags.tsx"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport type { FlagDef, FlagsMap } from \"./index.js\";\n\ntype Overrides = Record<string, unknown>;\n\nconst EMPTY: Overrides = Object.freeze({}) as Overrides;\n\n/**\n * Build a per-app flag system. Each consuming app calls this once with its\n * own flag definitions and a unique localStorage namespace. Returns a hook\n * + helpers + a studio panel scoped to those flags.\n */\nexport function createFlags<F extends FlagsMap>(opts: { flags: F; storageKey: string }) {\n const { flags, storageKey } = opts;\n const eventName = `flags:changed:${storageKey}`;\n\n // Cache for stable getSnapshot reference (required by useSyncExternalStore).\n let cachedRaw: string | null | undefined = undefined;\n let cachedSnapshot: Overrides = {};\n\n function readSnapshot(): Overrides {\n if (typeof window === \"undefined\") return EMPTY;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(storageKey);\n } catch {\n return cachedSnapshot;\n }\n if (raw === cachedRaw) return cachedSnapshot;\n cachedRaw = raw;\n try {\n cachedSnapshot = raw ? (JSON.parse(raw) as Overrides) : {};\n } catch {\n cachedSnapshot = {};\n }\n return cachedSnapshot;\n }\n\n function writeOverrides(next: Overrides) {\n if (typeof window === \"undefined\") return;\n const json = JSON.stringify(next);\n try {\n window.localStorage.setItem(storageKey, json);\n } catch {\n // ignore quota / private mode errors\n }\n cachedRaw = json;\n cachedSnapshot = next;\n window.dispatchEvent(new Event(eventName));\n }\n\n function subscribe(callback: () => void) {\n if (typeof window === \"undefined\") return () => {};\n const handler = () => {\n cachedRaw = undefined;\n callback();\n };\n window.addEventListener(eventName, handler);\n window.addEventListener(\"storage\", handler);\n return () => {\n window.removeEventListener(eventName, handler);\n window.removeEventListener(\"storage\", handler);\n };\n }\n\n function getServerSnapshot(): Overrides {\n return EMPTY;\n }\n\n type FlagKey = keyof F & string;\n\n function useFlag<T = unknown>(key: FlagKey): T {\n const overrides = useSyncExternalStore(subscribe, readSnapshot, getServerSnapshot);\n if (key in overrides) return overrides[key] as T;\n const def = flags[key] as FlagDef;\n return def.default as T;\n }\n\n function setFlag(key: FlagKey, value: unknown) {\n const current = typeof window === \"undefined\" ? {} : { ...readSnapshot() };\n current[key] = value;\n writeOverrides(current);\n }\n\n function resetFlag(key: FlagKey) {\n const current = typeof window === \"undefined\" ? {} : { ...readSnapshot() };\n delete current[key];\n writeOverrides(current);\n }\n\n function resetAllFlags() {\n writeOverrides({});\n }\n\n function listFlags() {\n return Object.entries(flags).map(([key, def]) => ({\n key,\n ...(def as FlagDef),\n }));\n }\n\n return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAqC;AAKrC,MAAM,QAAmB,OAAO,OAAO,CAAC,CAAC;AAOlC,SAAS,YAAgC,MAAwC;AACtF,QAAM,EAAE,OAAO,WAAW,IAAI;AAC9B,QAAM,YAAY,iBAAiB,UAAU;AAG7C,MAAI,YAAuC;AAC3C,MAAI,iBAA4B,CAAC;AAEjC,WAAS,eAA0B;AACjC,QAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,aAAa,QAAQ,UAAU;AAAA,IAC9C,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,UAAW,QAAO;AAC9B,gBAAY;AACZ,QAAI;AACF,uBAAiB,MAAO,KAAK,MAAM,GAAG,IAAkB,CAAC;AAAA,IAC3D,QAAQ;AACN,uBAAiB,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,MAAiB;AACvC,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,OAAO,KAAK,UAAU,IAAI;AAChC,QAAI;AACF,aAAO,aAAa,QAAQ,YAAY,IAAI;AAAA,IAC9C,QAAQ;AAAA,IAER;AACA,gBAAY;AACZ,qBAAiB;AACjB,WAAO,cAAc,IAAI,MAAM,SAAS,CAAC;AAAA,EAC3C;AAEA,WAAS,UAAU,UAAsB;AACvC,QAAI,OAAO,WAAW,YAAa,QAAO,MAAM;AAAA,IAAC;AACjD,UAAM,UAAU,MAAM;AACpB,kBAAY;AACZ,eAAS;AAAA,IACX;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,OAAO;AAC7C,aAAO,oBAAoB,WAAW,OAAO;AAAA,IAC/C;AAAA,EACF;AAEA,WAAS,oBAA+B;AACtC,WAAO;AAAA,EACT;AAIA,WAAS,QAAqB,KAAiB;AAC7C,UAAM,gBAAY,mCAAqB,WAAW,cAAc,iBAAiB;AACjF,QAAI,OAAO,UAAW,QAAO,UAAU,GAAG;AAC1C,UAAM,MAAM,MAAM,GAAG;AACrB,WAAO,IAAI;AAAA,EACb;AAEA,WAAS,QAAQ,KAAc,OAAgB;AAC7C,UAAM,UAAU,OAAO,WAAW,cAAc,CAAC,IAAI,EAAE,GAAG,aAAa,EAAE;AACzE,YAAQ,GAAG,IAAI;AACf,mBAAe,OAAO;AAAA,EACxB;AAEA,WAAS,UAAU,KAAc;AAC/B,UAAM,UAAU,OAAO,WAAW,cAAc,CAAC,IAAI,EAAE,GAAG,aAAa,EAAE;AACzE,WAAO,QAAQ,GAAG;AAClB,mBAAe,OAAO;AAAA,EACxB;AAEA,WAAS,gBAAgB;AACvB,mBAAe,CAAC,CAAC;AAAA,EACnB;AAEA,WAAS,YAAY;AACnB,WAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO;AAAA,MAChD;AAAA,MACA,GAAI;AAAA,IACN,EAAE;AAAA,EACJ;AAEA,SAAO,EAAE,SAAS,SAAS,WAAW,eAAe,UAAU;AACjE;","names":[]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
const EMPTY = Object.freeze({});
|
|
4
|
+
function createFlags(opts) {
|
|
5
|
+
const { flags, storageKey } = opts;
|
|
6
|
+
const eventName = `flags:changed:${storageKey}`;
|
|
7
|
+
let cachedRaw = void 0;
|
|
8
|
+
let cachedSnapshot = {};
|
|
9
|
+
function readSnapshot() {
|
|
10
|
+
if (typeof window === "undefined") return EMPTY;
|
|
11
|
+
let raw;
|
|
12
|
+
try {
|
|
13
|
+
raw = window.localStorage.getItem(storageKey);
|
|
14
|
+
} catch {
|
|
15
|
+
return cachedSnapshot;
|
|
16
|
+
}
|
|
17
|
+
if (raw === cachedRaw) return cachedSnapshot;
|
|
18
|
+
cachedRaw = raw;
|
|
19
|
+
try {
|
|
20
|
+
cachedSnapshot = raw ? JSON.parse(raw) : {};
|
|
21
|
+
} catch {
|
|
22
|
+
cachedSnapshot = {};
|
|
23
|
+
}
|
|
24
|
+
return cachedSnapshot;
|
|
25
|
+
}
|
|
26
|
+
function writeOverrides(next) {
|
|
27
|
+
if (typeof window === "undefined") return;
|
|
28
|
+
const json = JSON.stringify(next);
|
|
29
|
+
try {
|
|
30
|
+
window.localStorage.setItem(storageKey, json);
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
cachedRaw = json;
|
|
34
|
+
cachedSnapshot = next;
|
|
35
|
+
window.dispatchEvent(new Event(eventName));
|
|
36
|
+
}
|
|
37
|
+
function subscribe(callback) {
|
|
38
|
+
if (typeof window === "undefined") return () => {
|
|
39
|
+
};
|
|
40
|
+
const handler = () => {
|
|
41
|
+
cachedRaw = void 0;
|
|
42
|
+
callback();
|
|
43
|
+
};
|
|
44
|
+
window.addEventListener(eventName, handler);
|
|
45
|
+
window.addEventListener("storage", handler);
|
|
46
|
+
return () => {
|
|
47
|
+
window.removeEventListener(eventName, handler);
|
|
48
|
+
window.removeEventListener("storage", handler);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function getServerSnapshot() {
|
|
52
|
+
return EMPTY;
|
|
53
|
+
}
|
|
54
|
+
function useFlag(key) {
|
|
55
|
+
const overrides = useSyncExternalStore(subscribe, readSnapshot, getServerSnapshot);
|
|
56
|
+
if (key in overrides) return overrides[key];
|
|
57
|
+
const def = flags[key];
|
|
58
|
+
return def.default;
|
|
59
|
+
}
|
|
60
|
+
function setFlag(key, value) {
|
|
61
|
+
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
62
|
+
current[key] = value;
|
|
63
|
+
writeOverrides(current);
|
|
64
|
+
}
|
|
65
|
+
function resetFlag(key) {
|
|
66
|
+
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
67
|
+
delete current[key];
|
|
68
|
+
writeOverrides(current);
|
|
69
|
+
}
|
|
70
|
+
function resetAllFlags() {
|
|
71
|
+
writeOverrides({});
|
|
72
|
+
}
|
|
73
|
+
function listFlags() {
|
|
74
|
+
return Object.entries(flags).map(([key, def]) => ({
|
|
75
|
+
key,
|
|
76
|
+
...def
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
createFlags
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=createFlags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/createFlags.tsx"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport type { FlagDef, FlagsMap } from \"./index.js\";\n\ntype Overrides = Record<string, unknown>;\n\nconst EMPTY: Overrides = Object.freeze({}) as Overrides;\n\n/**\n * Build a per-app flag system. Each consuming app calls this once with its\n * own flag definitions and a unique localStorage namespace. Returns a hook\n * + helpers + a studio panel scoped to those flags.\n */\nexport function createFlags<F extends FlagsMap>(opts: { flags: F; storageKey: string }) {\n const { flags, storageKey } = opts;\n const eventName = `flags:changed:${storageKey}`;\n\n // Cache for stable getSnapshot reference (required by useSyncExternalStore).\n let cachedRaw: string | null | undefined = undefined;\n let cachedSnapshot: Overrides = {};\n\n function readSnapshot(): Overrides {\n if (typeof window === \"undefined\") return EMPTY;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(storageKey);\n } catch {\n return cachedSnapshot;\n }\n if (raw === cachedRaw) return cachedSnapshot;\n cachedRaw = raw;\n try {\n cachedSnapshot = raw ? (JSON.parse(raw) as Overrides) : {};\n } catch {\n cachedSnapshot = {};\n }\n return cachedSnapshot;\n }\n\n function writeOverrides(next: Overrides) {\n if (typeof window === \"undefined\") return;\n const json = JSON.stringify(next);\n try {\n window.localStorage.setItem(storageKey, json);\n } catch {\n // ignore quota / private mode errors\n }\n cachedRaw = json;\n cachedSnapshot = next;\n window.dispatchEvent(new Event(eventName));\n }\n\n function subscribe(callback: () => void) {\n if (typeof window === \"undefined\") return () => {};\n const handler = () => {\n cachedRaw = undefined;\n callback();\n };\n window.addEventListener(eventName, handler);\n window.addEventListener(\"storage\", handler);\n return () => {\n window.removeEventListener(eventName, handler);\n window.removeEventListener(\"storage\", handler);\n };\n }\n\n function getServerSnapshot(): Overrides {\n return EMPTY;\n }\n\n type FlagKey = keyof F & string;\n\n function useFlag<T = unknown>(key: FlagKey): T {\n const overrides = useSyncExternalStore(subscribe, readSnapshot, getServerSnapshot);\n if (key in overrides) return overrides[key] as T;\n const def = flags[key] as FlagDef;\n return def.default as T;\n }\n\n function setFlag(key: FlagKey, value: unknown) {\n const current = typeof window === \"undefined\" ? {} : { ...readSnapshot() };\n current[key] = value;\n writeOverrides(current);\n }\n\n function resetFlag(key: FlagKey) {\n const current = typeof window === \"undefined\" ? {} : { ...readSnapshot() };\n delete current[key];\n writeOverrides(current);\n }\n\n function resetAllFlags() {\n writeOverrides({});\n }\n\n function listFlags() {\n return Object.entries(flags).map(([key, def]) => ({\n key,\n ...(def as FlagDef),\n }));\n }\n\n return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };\n}\n"],"mappings":";AAEA,SAAS,4BAA4B;AAKrC,MAAM,QAAmB,OAAO,OAAO,CAAC,CAAC;AAOlC,SAAS,YAAgC,MAAwC;AACtF,QAAM,EAAE,OAAO,WAAW,IAAI;AAC9B,QAAM,YAAY,iBAAiB,UAAU;AAG7C,MAAI,YAAuC;AAC3C,MAAI,iBAA4B,CAAC;AAEjC,WAAS,eAA0B;AACjC,QAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,aAAa,QAAQ,UAAU;AAAA,IAC9C,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,UAAW,QAAO;AAC9B,gBAAY;AACZ,QAAI;AACF,uBAAiB,MAAO,KAAK,MAAM,GAAG,IAAkB,CAAC;AAAA,IAC3D,QAAQ;AACN,uBAAiB,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,MAAiB;AACvC,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,OAAO,KAAK,UAAU,IAAI;AAChC,QAAI;AACF,aAAO,aAAa,QAAQ,YAAY,IAAI;AAAA,IAC9C,QAAQ;AAAA,IAER;AACA,gBAAY;AACZ,qBAAiB;AACjB,WAAO,cAAc,IAAI,MAAM,SAAS,CAAC;AAAA,EAC3C;AAEA,WAAS,UAAU,UAAsB;AACvC,QAAI,OAAO,WAAW,YAAa,QAAO,MAAM;AAAA,IAAC;AACjD,UAAM,UAAU,MAAM;AACpB,kBAAY;AACZ,eAAS;AAAA,IACX;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,OAAO;AAC7C,aAAO,oBAAoB,WAAW,OAAO;AAAA,IAC/C;AAAA,EACF;AAEA,WAAS,oBAA+B;AACtC,WAAO;AAAA,EACT;AAIA,WAAS,QAAqB,KAAiB;AAC7C,UAAM,YAAY,qBAAqB,WAAW,cAAc,iBAAiB;AACjF,QAAI,OAAO,UAAW,QAAO,UAAU,GAAG;AAC1C,UAAM,MAAM,MAAM,GAAG;AACrB,WAAO,IAAI;AAAA,EACb;AAEA,WAAS,QAAQ,KAAc,OAAgB;AAC7C,UAAM,UAAU,OAAO,WAAW,cAAc,CAAC,IAAI,EAAE,GAAG,aAAa,EAAE;AACzE,YAAQ,GAAG,IAAI;AACf,mBAAe,OAAO;AAAA,EACxB;AAEA,WAAS,UAAU,KAAc;AAC/B,UAAM,UAAU,OAAO,WAAW,cAAc,CAAC,IAAI,EAAE,GAAG,aAAa,EAAE;AACzE,WAAO,QAAQ,GAAG;AAClB,mBAAe,OAAO;AAAA,EACxB;AAEA,WAAS,gBAAgB;AACvB,mBAAe,CAAC,CAAC;AAAA,EACnB;AAEA,WAAS,YAAY;AACnB,WAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO;AAAA,MAChD;AAAA,MACA,GAAI;AAAA,IACN,EAAE;AAAA,EACJ;AAEA,SAAO,EAAE,SAAS,SAAS,WAAW,eAAe,UAAU;AACjE;","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -16,94 +16,12 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
19
|
var index_exports = {};
|
|
22
20
|
__export(index_exports, {
|
|
23
|
-
createFlags: () => createFlags
|
|
21
|
+
createFlags: () => import_createFlags.createFlags
|
|
24
22
|
});
|
|
25
23
|
module.exports = __toCommonJS(index_exports);
|
|
26
|
-
|
|
27
|
-
// src/createFlags.tsx
|
|
28
|
-
var import_react = require("react");
|
|
29
|
-
var EMPTY = Object.freeze({});
|
|
30
|
-
function createFlags(opts) {
|
|
31
|
-
const { flags, storageKey } = opts;
|
|
32
|
-
const eventName = `flags:changed:${storageKey}`;
|
|
33
|
-
let cachedRaw = void 0;
|
|
34
|
-
let cachedSnapshot = {};
|
|
35
|
-
function readSnapshot() {
|
|
36
|
-
if (typeof window === "undefined") return EMPTY;
|
|
37
|
-
let raw;
|
|
38
|
-
try {
|
|
39
|
-
raw = window.localStorage.getItem(storageKey);
|
|
40
|
-
} catch {
|
|
41
|
-
return cachedSnapshot;
|
|
42
|
-
}
|
|
43
|
-
if (raw === cachedRaw) return cachedSnapshot;
|
|
44
|
-
cachedRaw = raw;
|
|
45
|
-
try {
|
|
46
|
-
cachedSnapshot = raw ? JSON.parse(raw) : {};
|
|
47
|
-
} catch {
|
|
48
|
-
cachedSnapshot = {};
|
|
49
|
-
}
|
|
50
|
-
return cachedSnapshot;
|
|
51
|
-
}
|
|
52
|
-
function writeOverrides(next) {
|
|
53
|
-
if (typeof window === "undefined") return;
|
|
54
|
-
const json = JSON.stringify(next);
|
|
55
|
-
try {
|
|
56
|
-
window.localStorage.setItem(storageKey, json);
|
|
57
|
-
} catch {
|
|
58
|
-
}
|
|
59
|
-
cachedRaw = json;
|
|
60
|
-
cachedSnapshot = next;
|
|
61
|
-
window.dispatchEvent(new Event(eventName));
|
|
62
|
-
}
|
|
63
|
-
function subscribe(callback) {
|
|
64
|
-
if (typeof window === "undefined") return () => {
|
|
65
|
-
};
|
|
66
|
-
const handler = () => {
|
|
67
|
-
cachedRaw = void 0;
|
|
68
|
-
callback();
|
|
69
|
-
};
|
|
70
|
-
window.addEventListener(eventName, handler);
|
|
71
|
-
window.addEventListener("storage", handler);
|
|
72
|
-
return () => {
|
|
73
|
-
window.removeEventListener(eventName, handler);
|
|
74
|
-
window.removeEventListener("storage", handler);
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
function getServerSnapshot() {
|
|
78
|
-
return EMPTY;
|
|
79
|
-
}
|
|
80
|
-
function useFlag(key) {
|
|
81
|
-
const overrides = (0, import_react.useSyncExternalStore)(subscribe, readSnapshot, getServerSnapshot);
|
|
82
|
-
if (key in overrides) return overrides[key];
|
|
83
|
-
const def = flags[key];
|
|
84
|
-
return def.default;
|
|
85
|
-
}
|
|
86
|
-
function setFlag(key, value) {
|
|
87
|
-
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
88
|
-
current[key] = value;
|
|
89
|
-
writeOverrides(current);
|
|
90
|
-
}
|
|
91
|
-
function resetFlag(key) {
|
|
92
|
-
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
93
|
-
delete current[key];
|
|
94
|
-
writeOverrides(current);
|
|
95
|
-
}
|
|
96
|
-
function resetAllFlags() {
|
|
97
|
-
writeOverrides({});
|
|
98
|
-
}
|
|
99
|
-
function listFlags() {
|
|
100
|
-
return Object.entries(flags).map(([key, def]) => ({
|
|
101
|
-
key,
|
|
102
|
-
...def
|
|
103
|
-
}));
|
|
104
|
-
}
|
|
105
|
-
return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };
|
|
106
|
-
}
|
|
24
|
+
var import_createFlags = require("./createFlags.js");
|
|
107
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
108
26
|
0 && (module.exports = {
|
|
109
27
|
createFlags
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type FlagDef =\n | { type: \"boolean\"; default: boolean; description: string }\n | { type: \"string\"; default: string; description: string }\n | { type: \"number\"; default: number; description: string }\n | {\n type: \"enum\";\n default: string;\n options: string[];\n description: string;\n };\n\nexport type FlagsMap = Record<string, FlagDef>;\n\nexport { createFlags } from \"./createFlags.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,yBAA4B;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,83 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { useSyncExternalStore } from "react";
|
|
3
|
-
var EMPTY = Object.freeze({});
|
|
4
|
-
function createFlags(opts) {
|
|
5
|
-
const { flags, storageKey } = opts;
|
|
6
|
-
const eventName = `flags:changed:${storageKey}`;
|
|
7
|
-
let cachedRaw = void 0;
|
|
8
|
-
let cachedSnapshot = {};
|
|
9
|
-
function readSnapshot() {
|
|
10
|
-
if (typeof window === "undefined") return EMPTY;
|
|
11
|
-
let raw;
|
|
12
|
-
try {
|
|
13
|
-
raw = window.localStorage.getItem(storageKey);
|
|
14
|
-
} catch {
|
|
15
|
-
return cachedSnapshot;
|
|
16
|
-
}
|
|
17
|
-
if (raw === cachedRaw) return cachedSnapshot;
|
|
18
|
-
cachedRaw = raw;
|
|
19
|
-
try {
|
|
20
|
-
cachedSnapshot = raw ? JSON.parse(raw) : {};
|
|
21
|
-
} catch {
|
|
22
|
-
cachedSnapshot = {};
|
|
23
|
-
}
|
|
24
|
-
return cachedSnapshot;
|
|
25
|
-
}
|
|
26
|
-
function writeOverrides(next) {
|
|
27
|
-
if (typeof window === "undefined") return;
|
|
28
|
-
const json = JSON.stringify(next);
|
|
29
|
-
try {
|
|
30
|
-
window.localStorage.setItem(storageKey, json);
|
|
31
|
-
} catch {
|
|
32
|
-
}
|
|
33
|
-
cachedRaw = json;
|
|
34
|
-
cachedSnapshot = next;
|
|
35
|
-
window.dispatchEvent(new Event(eventName));
|
|
36
|
-
}
|
|
37
|
-
function subscribe(callback) {
|
|
38
|
-
if (typeof window === "undefined") return () => {
|
|
39
|
-
};
|
|
40
|
-
const handler = () => {
|
|
41
|
-
cachedRaw = void 0;
|
|
42
|
-
callback();
|
|
43
|
-
};
|
|
44
|
-
window.addEventListener(eventName, handler);
|
|
45
|
-
window.addEventListener("storage", handler);
|
|
46
|
-
return () => {
|
|
47
|
-
window.removeEventListener(eventName, handler);
|
|
48
|
-
window.removeEventListener("storage", handler);
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function getServerSnapshot() {
|
|
52
|
-
return EMPTY;
|
|
53
|
-
}
|
|
54
|
-
function useFlag(key) {
|
|
55
|
-
const overrides = useSyncExternalStore(subscribe, readSnapshot, getServerSnapshot);
|
|
56
|
-
if (key in overrides) return overrides[key];
|
|
57
|
-
const def = flags[key];
|
|
58
|
-
return def.default;
|
|
59
|
-
}
|
|
60
|
-
function setFlag(key, value) {
|
|
61
|
-
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
62
|
-
current[key] = value;
|
|
63
|
-
writeOverrides(current);
|
|
64
|
-
}
|
|
65
|
-
function resetFlag(key) {
|
|
66
|
-
const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
|
|
67
|
-
delete current[key];
|
|
68
|
-
writeOverrides(current);
|
|
69
|
-
}
|
|
70
|
-
function resetAllFlags() {
|
|
71
|
-
writeOverrides({});
|
|
72
|
-
}
|
|
73
|
-
function listFlags() {
|
|
74
|
-
return Object.entries(flags).map(([key, def]) => ({
|
|
75
|
-
key,
|
|
76
|
-
...def
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };
|
|
80
|
-
}
|
|
1
|
+
import { createFlags } from "./createFlags.js";
|
|
81
2
|
export {
|
|
82
3
|
createFlags
|
|
83
4
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type FlagDef =\n | { type: \"boolean\"; default: boolean; description: string }\n | { type: \"string\"; default: string; description: string }\n | { type: \"number\"; default: number; description: string }\n | {\n type: \"enum\";\n default: string;\n options: string[];\n description: string;\n };\n\nexport type FlagsMap = Record<string, FlagDef>;\n\nexport { createFlags } from \"./createFlags.js\";\n"],"mappings":"AAaA,SAAS,mBAAmB;","names":[]}
|
package/package.json
CHANGED