@augmenting-integrations/flags 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,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":[]}
@@ -1,6 +1,6 @@
1
- // src/createFlags.tsx
1
+ "use client";
2
2
  import { useSyncExternalStore } from "react";
3
- var EMPTY = Object.freeze({});
3
+ const EMPTY = Object.freeze({});
4
4
  function createFlags(opts) {
5
5
  const { flags, storageKey } = opts;
6
6
  const eventName = `flags:changed:${storageKey}`;
@@ -81,4 +81,4 @@ function createFlags(opts) {
81
81
  export {
82
82
  createFlags
83
83
  };
84
- //# sourceMappingURL=index.mjs.map
84
+ //# sourceMappingURL=createFlags.js.map
@@ -1 +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,IAAM,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":[]}
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 ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
+ createFlags: () => import_createFlags.createFlags
22
+ });
23
+ module.exports = __toCommonJS(index_exports);
24
+ var import_createFlags = require("./createFlags.js");
25
+ // Annotate the CommonJS export names for ESM import in node:
26
+ 0 && (module.exports = {
27
+ createFlags
28
+ });
29
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
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,2 +1,5 @@
1
- export { createFlags } from "./createFlags.js";
1
+ import { createFlags } from "./createFlags.js";
2
+ export {
3
+ createFlags
4
+ };
2
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@augmenting-integrations/flags",
3
- "version": "0.2.1",
3
+ "version": "1.0.0",
4
4
  "description": "Feature flag hook (useFlag) and per-app studio panel. Flag definitions are passed in by the consuming app.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -1,95 +0,0 @@
1
- "use client";
2
- import { useSyncExternalStore } from "react";
3
- const EMPTY = Object.freeze({});
4
- /**
5
- * Build a per-app flag system. Each consuming app calls this once with its
6
- * own flag definitions and a unique localStorage namespace. Returns a hook
7
- * + helpers + a studio panel scoped to those flags.
8
- */
9
- export function createFlags(opts) {
10
- const { flags, storageKey } = opts;
11
- const eventName = `flags:changed:${storageKey}`;
12
- // Cache for stable getSnapshot reference (required by useSyncExternalStore).
13
- let cachedRaw = undefined;
14
- let cachedSnapshot = {};
15
- function readSnapshot() {
16
- if (typeof window === "undefined")
17
- return EMPTY;
18
- let raw;
19
- try {
20
- raw = window.localStorage.getItem(storageKey);
21
- }
22
- catch {
23
- return cachedSnapshot;
24
- }
25
- if (raw === cachedRaw)
26
- return cachedSnapshot;
27
- cachedRaw = raw;
28
- try {
29
- cachedSnapshot = raw ? JSON.parse(raw) : {};
30
- }
31
- catch {
32
- cachedSnapshot = {};
33
- }
34
- return cachedSnapshot;
35
- }
36
- function writeOverrides(next) {
37
- if (typeof window === "undefined")
38
- return;
39
- const json = JSON.stringify(next);
40
- try {
41
- window.localStorage.setItem(storageKey, json);
42
- }
43
- catch {
44
- // ignore quota / private mode errors
45
- }
46
- cachedRaw = json;
47
- cachedSnapshot = next;
48
- window.dispatchEvent(new Event(eventName));
49
- }
50
- function subscribe(callback) {
51
- if (typeof window === "undefined")
52
- return () => { };
53
- const handler = () => {
54
- cachedRaw = undefined;
55
- callback();
56
- };
57
- window.addEventListener(eventName, handler);
58
- window.addEventListener("storage", handler);
59
- return () => {
60
- window.removeEventListener(eventName, handler);
61
- window.removeEventListener("storage", handler);
62
- };
63
- }
64
- function getServerSnapshot() {
65
- return EMPTY;
66
- }
67
- function useFlag(key) {
68
- const overrides = useSyncExternalStore(subscribe, readSnapshot, getServerSnapshot);
69
- if (key in overrides)
70
- return overrides[key];
71
- const def = flags[key];
72
- return def.default;
73
- }
74
- function setFlag(key, value) {
75
- const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
76
- current[key] = value;
77
- writeOverrides(current);
78
- }
79
- function resetFlag(key) {
80
- const current = typeof window === "undefined" ? {} : { ...readSnapshot() };
81
- delete current[key];
82
- writeOverrides(current);
83
- }
84
- function resetAllFlags() {
85
- writeOverrides({});
86
- }
87
- function listFlags() {
88
- return Object.entries(flags).map(([key, def]) => ({
89
- key,
90
- ...def,
91
- }));
92
- }
93
- return { useFlag, setFlag, resetFlag, resetAllFlags, listFlags };
94
- }
95
- //# sourceMappingURL=createFlags.jsx.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createFlags.jsx","sourceRoot":"","sources":["../src/createFlags.tsx"],"names":[],"mappings":"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"}