@bravely-studios/account-web 0.5.1 → 0.5.2

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,84 @@
1
+ /** Tunable limits. Defaults are the shipping values (verbatim from the .NET throttle). */
2
+ export interface AnalyticsEmitThrottleOptions {
3
+ /** At most one emit of a given coalesce key per this many ms (default 60_000). */
4
+ coalesceWindowMs: number;
5
+ /** Per-process token-bucket capacity (default 200). */
6
+ budgetMax: number;
7
+ /** Token refill cadence: +1 token every this many ms (default 300). */
8
+ budgetRefillMs: number;
9
+ /** Property keys folded into the coalesce key (default slot/source/surface/variant/reason/step/plan). */
10
+ coalesceDiscriminators: string[];
11
+ /** Events that always pass and never consume a token. */
12
+ neverDropEvents: ReadonlySet<string>;
13
+ /** Injectable clock (ms epoch); defaults to `Date.now`. Tests pass a fake. */
14
+ now: () => number;
15
+ }
16
+ /**
17
+ * Synchronous analytics-emit gate. One instance per page/process (hold it in a
18
+ * module singleton on the host's analytics layer). See the file header for the
19
+ * four protections and the firehose incident that motivated it. Pure
20
+ * bookkeeping; never throws.
21
+ */
22
+ export declare class AnalyticsEmitThrottle {
23
+ private readonly coalesceWindowMs;
24
+ private readonly budgetMax;
25
+ private readonly budgetRefillMs;
26
+ private readonly discriminators;
27
+ private readonly neverDrop;
28
+ private readonly now;
29
+ private readonly lastEmitByKey;
30
+ private budgetTokens;
31
+ private budgetLastRefill;
32
+ constructor(opts?: Partial<AnalyticsEmitThrottleOptions>);
33
+ /**
34
+ * Returns `true` if `eventName` may be emitted now, recording the emit. Drops
35
+ * a repeat of the same coalesce key (name + identifying props) inside the
36
+ * coalesce window, and drops anything over the per-process token budget.
37
+ * `$`-prefixed meta events and `neverDropEvents` always pass (and never
38
+ * consume a token).
39
+ *
40
+ * Call this in the host's `track(...)` BEFORE any serialization/network work,
41
+ * so it gates BOTH the PostHog capture and the `/api/app-events` mirror.
42
+ */
43
+ allowEmit(eventName: string, properties?: Record<string, unknown> | null): boolean;
44
+ private coalesceKey;
45
+ }
46
+ /**
47
+ * The resolved entitlement gate the host compares across refreshes to decide
48
+ * whether `entitlement_refreshed` represents a REAL change. PII-free — three
49
+ * booleans, nothing identifying.
50
+ */
51
+ export interface EntitlementResolution {
52
+ active: boolean;
53
+ trialActive: boolean;
54
+ subscriptionActive: boolean;
55
+ }
56
+ /**
57
+ * Emit-on-change tracker for `entitlement_refreshed`. Hosts run an entitlement
58
+ * refresh on every foreground/visibility change, the post-checkout activation
59
+ * poll, and a timer; an unconditional `entitlement_refreshed` emit on each of
60
+ * those flooded the firehose (the 2026-06 incident). Feed each freshly resolved
61
+ * gate to `changed(...)` and only emit when it returns `true`:
62
+ *
63
+ * ```ts
64
+ * const entitlementEmit = new EntitlementEmitGate();
65
+ * // after a refresh resolves:
66
+ * if (entitlementEmit.changed({ active, trialActive, subscriptionActive })) {
67
+ * track("entitlement_refreshed", { active, trial_active: trialActive, subscription_active: subscriptionActive });
68
+ * }
69
+ * ```
70
+ *
71
+ * The event still fires on every genuine flip (sign-in resolve, purchase, trial
72
+ * expiry, revoke) and collapses the no-op refreshes to nothing.
73
+ */
74
+ export declare class EntitlementEmitGate {
75
+ private last;
76
+ /**
77
+ * Returns `true` iff `resolution` differs from the last value passed (always
78
+ * `true` on the first call), recording it as the new baseline.
79
+ */
80
+ changed(resolution: EntitlementResolution): boolean;
81
+ /** Current baseline (the last resolution observed), for tests/diagnostics. */
82
+ get current(): EntitlementResolution | null;
83
+ }
84
+ //# sourceMappingURL=analyticsEmitThrottle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyticsEmitThrottle.d.ts","sourceRoot":"","sources":["../src/analyticsEmitThrottle.ts"],"names":[],"mappings":"AAmDA,0FAA0F;AAC1F,MAAM,WAAW,4BAA4B;IAC3C,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,yGAAyG;IACzG,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,yDAAyD;IACzD,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAWD;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,IAAI,GAAE,OAAO,CAAC,4BAA4B,CAAM;IAW5D;;;;;;;;;OASG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO;IAuClF,OAAO,CAAC,WAAW;CASpB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAsC;IAElD;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,qBAAqB,GAAG,OAAO;IAWnD,8EAA8E;IAC9E,IAAI,OAAO,IAAI,qBAAqB,GAAG,IAAI,CAE1C;CACF"}
@@ -0,0 +1,179 @@
1
+ // Analytics-emit throttle (firehose-hardening #5f) — the web analog of the
2
+ // .NET `Analytics.AllowEmit` (saycopypaste-windows) and a sibling discipline to
3
+ // this package's identity-traffic guardrails, extended to the analytics-emit
4
+ // path. Pure, host-agnostic gates the host calls right before it puts an event
5
+ // on the wire.
6
+ //
7
+ // WHY THIS LIVES IN THE SDK BUT SENDS NOTHING
8
+ // -------------------------------------------
9
+ // This package carries NO analytics dependency — every Bravely web app owns its
10
+ // own PostHog transport and the identity `/api/app-events` mirror (see
11
+ // `installMetrics.ts`: "this lib carries no analytics dependency"). So this is
12
+ // NOT an analytics client; it is a gate:
13
+ //
14
+ // ```ts
15
+ // // host analytics layer, one instance per page/process:
16
+ // const emitThrottle = new AnalyticsEmitThrottle();
17
+ //
18
+ // function track(event: string, props?: Record<string, unknown>) {
19
+ // if (optedOut) return;
20
+ // if (!emitThrottle.allowEmit(event, props)) return;
21
+ // // ...existing posthog.capture(...) + POST /api/app-events mirror...
22
+ // }
23
+ // ```
24
+ //
25
+ // Server-side coalescing + the Cloudflare edge limit already protect ALL
26
+ // platforms; this is client-side defense-in-depth so a re-armed loop in the tab
27
+ // never even attempts the flood. It mirrors the .NET `AllowEmit` one-for-one.
28
+ //
29
+ // WHAT IT DOES
30
+ // ------------
31
+ // 1. Per-event-name coalescing — at most one emit of a given coalesce key per
32
+ // `coalesceWindowMs` (60s). The key is the event name plus identifying
33
+ // discriminator props (`slot`, `source`, `surface`, `variant`, `reason`,
34
+ // `step`, `plan`), so the three distinct `slot_viewed` events the offer
35
+ // grid fires (one per slot) each pass, while a tight loop of IDENTICAL
36
+ // events (the `entitlement_refreshed` flood, whose resolved tuple never
37
+ // changes) collapses to one. The FIRST emit in any window always passes.
38
+ // 2. Per-process token-bucket budget — `budgetMax` (200) tokens refilling +1
39
+ // every `budgetRefillMs` (300ms); a runaway loop drains it to a trickle.
40
+ // 3. Never-drop exemptions — money-critical funnel TERMINALS
41
+ // (`purchase_completed`, `subscription_activated`, `checkout_completed`,
42
+ // `auth_completed`) and genuine entitlement changes (`entitlement_refreshed`)
43
+ // ALWAYS pass and never consume a token, so a prior event storm can't drop
44
+ // the one event that records a real purchase.
45
+ // 4. `$`-prefixed PostHog meta events (`$identify`, …) always pass.
46
+ //
47
+ // `entitlement_refreshed` is never-drop because its durable fix is the
48
+ // EMIT-ON-CHANGE guard (`EntitlementEmitGate` below): only emit when the
49
+ // resolved `(active, trial, subscription)` tuple actually changed. Coalescing it
50
+ // would wrongly drop a second REAL change inside 60s (trial→paid, paid→revoked).
51
+ const DEFAULT_DISCRIMINATORS = ["slot", "source", "surface", "variant", "reason", "step", "plan"];
52
+ const DEFAULT_NEVER_DROP = new Set([
53
+ "purchase_completed",
54
+ "subscription_activated",
55
+ "checkout_completed",
56
+ "auth_completed",
57
+ "entitlement_refreshed",
58
+ ]);
59
+ /**
60
+ * Synchronous analytics-emit gate. One instance per page/process (hold it in a
61
+ * module singleton on the host's analytics layer). See the file header for the
62
+ * four protections and the firehose incident that motivated it. Pure
63
+ * bookkeeping; never throws.
64
+ */
65
+ export class AnalyticsEmitThrottle {
66
+ coalesceWindowMs;
67
+ budgetMax;
68
+ budgetRefillMs;
69
+ discriminators;
70
+ neverDrop;
71
+ now;
72
+ lastEmitByKey = new Map();
73
+ budgetTokens;
74
+ budgetLastRefill;
75
+ constructor(opts = {}) {
76
+ this.coalesceWindowMs = opts.coalesceWindowMs ?? 60_000;
77
+ this.budgetMax = opts.budgetMax ?? 200;
78
+ this.budgetRefillMs = opts.budgetRefillMs ?? 300;
79
+ this.discriminators = opts.coalesceDiscriminators ?? DEFAULT_DISCRIMINATORS;
80
+ this.neverDrop = opts.neverDropEvents ?? DEFAULT_NEVER_DROP;
81
+ this.now = opts.now ?? Date.now;
82
+ this.budgetTokens = this.budgetMax;
83
+ this.budgetLastRefill = this.now();
84
+ }
85
+ /**
86
+ * Returns `true` if `eventName` may be emitted now, recording the emit. Drops
87
+ * a repeat of the same coalesce key (name + identifying props) inside the
88
+ * coalesce window, and drops anything over the per-process token budget.
89
+ * `$`-prefixed meta events and `neverDropEvents` always pass (and never
90
+ * consume a token).
91
+ *
92
+ * Call this in the host's `track(...)` BEFORE any serialization/network work,
93
+ * so it gates BOTH the PostHog capture and the `/api/app-events` mirror.
94
+ */
95
+ allowEmit(eventName, properties) {
96
+ // $-prefixed PostHog meta events ($identify, $set, …): never throttled.
97
+ if (eventName.startsWith("$"))
98
+ return true;
99
+ // Money-critical completions + genuine entitlement changes always pass and
100
+ // do NOT consume a token — a purchase must land even mid-storm.
101
+ if (this.neverDrop.has(eventName))
102
+ return true;
103
+ const key = this.coalesceKey(eventName, properties);
104
+ const now = this.now();
105
+ // Refill the token bucket for elapsed wall-clock time.
106
+ const elapsed = now - this.budgetLastRefill;
107
+ if (elapsed > 0 && this.budgetRefillMs > 0) {
108
+ this.budgetTokens = Math.min(this.budgetMax, this.budgetTokens + elapsed / this.budgetRefillMs);
109
+ this.budgetLastRefill = now;
110
+ }
111
+ // Per-key coalescing: at most one of a given key per window.
112
+ const last = this.lastEmitByKey.get(key);
113
+ if (last !== undefined && now - last < this.coalesceWindowMs) {
114
+ return false;
115
+ }
116
+ if (this.budgetTokens < 1)
117
+ return false;
118
+ this.budgetTokens -= 1;
119
+ this.lastEmitByKey.set(key, now);
120
+ // Bound the map: prune fully-elapsed keys so a long-running tab doesn't
121
+ // accumulate them.
122
+ if (this.lastEmitByKey.size > 256) {
123
+ for (const [k, v] of this.lastEmitByKey) {
124
+ if (now - v >= this.coalesceWindowMs)
125
+ this.lastEmitByKey.delete(k);
126
+ }
127
+ }
128
+ return true;
129
+ }
130
+ coalesceKey(eventName, properties) {
131
+ if (!properties)
132
+ return eventName;
133
+ let key = eventName;
134
+ for (const name of this.discriminators) {
135
+ const v = properties[name];
136
+ if (v !== undefined && v !== null)
137
+ key += `|${name}=${String(v)}`;
138
+ }
139
+ return key;
140
+ }
141
+ }
142
+ /**
143
+ * Emit-on-change tracker for `entitlement_refreshed`. Hosts run an entitlement
144
+ * refresh on every foreground/visibility change, the post-checkout activation
145
+ * poll, and a timer; an unconditional `entitlement_refreshed` emit on each of
146
+ * those flooded the firehose (the 2026-06 incident). Feed each freshly resolved
147
+ * gate to `changed(...)` and only emit when it returns `true`:
148
+ *
149
+ * ```ts
150
+ * const entitlementEmit = new EntitlementEmitGate();
151
+ * // after a refresh resolves:
152
+ * if (entitlementEmit.changed({ active, trialActive, subscriptionActive })) {
153
+ * track("entitlement_refreshed", { active, trial_active: trialActive, subscription_active: subscriptionActive });
154
+ * }
155
+ * ```
156
+ *
157
+ * The event still fires on every genuine flip (sign-in resolve, purchase, trial
158
+ * expiry, revoke) and collapses the no-op refreshes to nothing.
159
+ */
160
+ export class EntitlementEmitGate {
161
+ last = null;
162
+ /**
163
+ * Returns `true` iff `resolution` differs from the last value passed (always
164
+ * `true` on the first call), recording it as the new baseline.
165
+ */
166
+ changed(resolution) {
167
+ const prev = this.last;
168
+ this.last = { ...resolution };
169
+ return (prev === null ||
170
+ prev.active !== resolution.active ||
171
+ prev.trialActive !== resolution.trialActive ||
172
+ prev.subscriptionActive !== resolution.subscriptionActive);
173
+ }
174
+ /** Current baseline (the last resolution observed), for tests/diagnostics. */
175
+ get current() {
176
+ return this.last ? { ...this.last } : null;
177
+ }
178
+ }
179
+ //# sourceMappingURL=analyticsEmitThrottle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyticsEmitThrottle.js","sourceRoot":"","sources":["../src/analyticsEmitThrottle.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,4 +18,5 @@ export { ErrorFirehoseClient, CONSENT_KEY, OPT_OUT_SHOWN_KEY, GEO_CACHE_KEY, OPT
18
18
  export { BravelySignInScreen, SIGN_IN_OFFLINE_HEADLINE, SIGN_IN_OFFLINE_BODY, SIGN_IN_OFFLINE_RETRY_LABEL, SIGN_IN_COMPACT_MAX_WIDTH, type BravelySignInScreenProps, } from "./components/BravelySignInScreen.js";
19
19
  export { OfferSlotGrid, buildOfferSlots, bonusAppsForSlug, offerThemeForSlug, planTokenForSlot, telemetryValueForSlot, computeOfferFit, OFFER_THEMES, OFFER_GUARANTEE_LINE, OFFER_GUARANTEE_TOOLTIP, OFFER_FOOTER_NOTE, OFFER_BONUS_FOOTER, OFFER_BUNDLE_TAGLINE, OFFER_FIT_MIN_WIDTH, OFFER_FIT_MIN_SCALE, OFFER_FIT_MAX_SCALE, OFFER_FIT_PAD, OFFER_FIT_HEIGHT_FRACTION, OFFER_FIT_WIDTH_CAP_FRACTION, OFFER_NATURAL_WIDTH, type OfferSlotKind, type OfferAppType, type OfferCtaVariant, type OfferRich, type OfferRichSeg, type OfferBonusApp, type OfferBonus, type OfferSlotCopy, type OfferTheme, type OfferSlotGridProps, type BuildOfferSlotsArgs, type OfferFitInput, type OfferFitResult, } from "./components/OfferSlotGrid.js";
20
20
  export { getOrMintInstallId, emitAppFirstOpenedIfNeeded, INSTALL_ID_STORAGE_KEY, FIRST_OPEN_SENTINEL_STORAGE_KEY, type FirstOpenResult, type EmitAppFirstOpenedOptions, } from "./installMetrics.js";
21
+ export { AnalyticsEmitThrottle, EntitlementEmitGate, type AnalyticsEmitThrottleOptions, type EntitlementResolution, } from "./analyticsEmitThrottle.js";
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,4 +20,6 @@ export { ErrorFirehoseClient, CONSENT_KEY, OPT_OUT_SHOWN_KEY, GEO_CACHE_KEY, OPT
20
20
  export { BravelySignInScreen, SIGN_IN_OFFLINE_HEADLINE, SIGN_IN_OFFLINE_BODY, SIGN_IN_OFFLINE_RETRY_LABEL, SIGN_IN_COMPACT_MAX_WIDTH, } from "./components/BravelySignInScreen.js";
21
21
  export { OfferSlotGrid, buildOfferSlots, bonusAppsForSlug, offerThemeForSlug, planTokenForSlot, telemetryValueForSlot, computeOfferFit, OFFER_THEMES, OFFER_GUARANTEE_LINE, OFFER_GUARANTEE_TOOLTIP, OFFER_FOOTER_NOTE, OFFER_BONUS_FOOTER, OFFER_BUNDLE_TAGLINE, OFFER_FIT_MIN_WIDTH, OFFER_FIT_MIN_SCALE, OFFER_FIT_MAX_SCALE, OFFER_FIT_PAD, OFFER_FIT_HEIGHT_FRACTION, OFFER_FIT_WIDTH_CAP_FRACTION, OFFER_NATURAL_WIDTH, } from "./components/OfferSlotGrid.js";
22
22
  export { getOrMintInstallId, emitAppFirstOpenedIfNeeded, INSTALL_ID_STORAGE_KEY, FIRST_OPEN_SENTINEL_STORAGE_KEY, } from "./installMetrics.js";
23
+ // ---- Analytics-emit throttle (firehose-hardening #5f) -----------------------
24
+ export { AnalyticsEmitThrottle, EntitlementEmitGate, } from "./analyticsEmitThrottle.js";
23
25
  //# 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,wDAAwD;AAExD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEtH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,GAEhB,MAAM,WAAW,CAAC;AAuBnB,+EAA+E;AAC/E,OAAO,EACL,gBAAgB,EAChB,iCAAiC,EACjC,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sBAAsB,GAIvB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GAIrB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAG3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE,gFAAgF;AAChF,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,GAOrB,MAAM,4BAA4B,CAAC;AAEpC,8EAA8E;AAC9E,gFAAgF;AAChF,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,GAE1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,4BAA4B,EAC5B,mBAAmB,GAcpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,GAGhC,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEtH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,GAEhB,MAAM,WAAW,CAAC;AAuBnB,+EAA+E;AAC/E,OAAO,EACL,gBAAgB,EAChB,iCAAiC,EACjC,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sBAAsB,GAIvB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GAIrB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAG3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE,gFAAgF;AAChF,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,GAOrB,MAAM,4BAA4B,CAAC;AAEpC,8EAA8E;AAC9E,gFAAgF;AAChF,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,GAE1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,4BAA4B,EAC5B,mBAAmB,GAcpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,GAGhC,MAAM,qBAAqB,CAAC;AAE7B,gFAAgF;AAChF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bravely-studios/account-web",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Bravely Account web facade: OAuth 2.1 + PKCE sign-in, BAS lifecycle, entitlement cache, activation state machine, C-ux M2/M3/M4 components. Used by all 10 utility web variants + bravely.dev.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,13 +29,13 @@
29
29
  "@testing-library/react": "^16.3.2",
30
30
  "@types/react": "^19.2.14",
31
31
  "@types/react-dom": "^19.2.3",
32
- "@vitest/coverage-v8": "^3.2.4",
32
+ "@vitest/coverage-v8": "^4.1.9",
33
33
  "fast-check": "^4.7.0",
34
34
  "happy-dom": "^20.9.0",
35
35
  "react": "^19.2.6",
36
36
  "react-dom": "^19.2.6",
37
37
  "typescript": "^5.6.0",
38
- "vitest": "^3.2.4"
38
+ "vitest": "^4.1.9"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=18.0.0"