@bravely-studios/account-web 0.3.10 → 0.4.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/README.md +122 -5
- package/dist/ActivationStateMachine.d.ts +1 -1
- package/dist/ActivationStateMachine.d.ts.map +1 -1
- package/dist/ActivationStateMachine.js +6 -2
- package/dist/ActivationStateMachine.js.map +1 -1
- package/dist/BravelyAccountManager.d.ts +108 -2
- package/dist/BravelyAccountManager.d.ts.map +1 -1
- package/dist/BravelyAccountManager.js +376 -29
- package/dist/BravelyAccountManager.js.map +1 -1
- package/dist/components/BravelyProviderButtons.d.ts.map +1 -1
- package/dist/components/BravelyProviderButtons.js.map +1 -1
- package/dist/components/BravelySignInScreen.d.ts +55 -0
- package/dist/components/BravelySignInScreen.d.ts.map +1 -0
- package/dist/components/BravelySignInScreen.js +141 -0
- package/dist/components/BravelySignInScreen.js.map +1 -0
- package/dist/components/OfferSlotGrid.d.ts +204 -0
- package/dist/components/OfferSlotGrid.d.ts.map +1 -0
- package/dist/components/OfferSlotGrid.js +490 -0
- package/dist/components/OfferSlotGrid.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/installMetrics.d.ts +40 -0
- package/dist/installMetrics.d.ts.map +1 -0
- package/dist/installMetrics.js +128 -0
- package/dist/installMetrics.js.map +1 -0
- package/dist/storage.d.ts +23 -10
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +52 -16
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Install metrics helpers (login-first cutover D6 — `analytics.first_open_once`
|
|
2
|
+
// + `analytics.install_path`).
|
|
3
|
+
//
|
|
4
|
+
// Two seams, both storage-backed (IndexedDB via the composite default), both
|
|
5
|
+
// per-origin (every Bravely web app runs on its own origin, so the sentinel
|
|
6
|
+
// and install id are per-app automatically):
|
|
7
|
+
//
|
|
8
|
+
// 1. `getOrMintInstallId()` — mint a UUID ONCE per install (origin) and
|
|
9
|
+
// persist it durably. Thread it into `BravelyAccountManager` via
|
|
10
|
+
// `setInstallId()` / `ManagerConfig.installId` so every auth exchange
|
|
11
|
+
// carries `install_id` and the server can reconcile the install onto
|
|
12
|
+
// the resolved `ba_id`.
|
|
13
|
+
//
|
|
14
|
+
// 2. `emitAppFirstOpenedIfNeeded()` — the fire-once `app_first_opened`
|
|
15
|
+
// guard. The HOST fires the actual analytics event inside the `emit`
|
|
16
|
+
// callback (this lib carries no analytics dependency); the helper owns
|
|
17
|
+
// the contract: a durable sentinel is written BEFORE the emit, so a
|
|
18
|
+
// crash between persist and emit can only UNDER-count, never
|
|
19
|
+
// double-fire. Reinstall semantics on web = cleared site data (the only
|
|
20
|
+
// legitimate re-fire). Subsequent opens are `app_relaunched` — the
|
|
21
|
+
// host's job, not this helper's.
|
|
22
|
+
//
|
|
23
|
+
// Per the spec, analytics opt-out / missing keys must no-op the network emit
|
|
24
|
+
// but STILL write the sentinel — implement that by making `emit` a no-op;
|
|
25
|
+
// the helper always persists first regardless.
|
|
26
|
+
import { defaultStorage } from "./storage.js";
|
|
27
|
+
/** Storage key for the per-install UUID (persistent / IndexedDB). */
|
|
28
|
+
export const INSTALL_ID_STORAGE_KEY = "install_id";
|
|
29
|
+
/** Storage key for the `app_first_opened` fire-once sentinel (persistent / IndexedDB). */
|
|
30
|
+
export const FIRST_OPEN_SENTINEL_STORAGE_KEY = "first_open_sentinel";
|
|
31
|
+
/**
|
|
32
|
+
* Module-singleton default storage so concurrent helper calls (and repeat
|
|
33
|
+
* calls across the page lifetime) share one adapter — required for the
|
|
34
|
+
* single-flight mint guard to work without the caller threading a storage
|
|
35
|
+
* instance through.
|
|
36
|
+
*/
|
|
37
|
+
let sharedStorage = null;
|
|
38
|
+
function sharedDefaultStorage() {
|
|
39
|
+
if (!sharedStorage)
|
|
40
|
+
sharedStorage = defaultStorage();
|
|
41
|
+
return sharedStorage;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Single-flight mint guard, keyed per storage adapter: two concurrent
|
|
45
|
+
* `getOrMintInstallId()` calls must resolve to the SAME id (an install id
|
|
46
|
+
* that differs between the authorize leg and the token leg would split the
|
|
47
|
+
* install in the ledger).
|
|
48
|
+
*/
|
|
49
|
+
const mintInFlight = new WeakMap();
|
|
50
|
+
/**
|
|
51
|
+
* Return the per-install UUID, minting + persisting it on first call.
|
|
52
|
+
* Stable for the life of the install (origin storage); cleared only when the
|
|
53
|
+
* user clears site data — which IS the reinstall boundary on web.
|
|
54
|
+
*/
|
|
55
|
+
export function getOrMintInstallId(storage = sharedDefaultStorage()) {
|
|
56
|
+
const inFlight = mintInFlight.get(storage);
|
|
57
|
+
if (inFlight)
|
|
58
|
+
return inFlight;
|
|
59
|
+
const p = (async () => {
|
|
60
|
+
const existing = await storage.get(INSTALL_ID_STORAGE_KEY);
|
|
61
|
+
if (existing)
|
|
62
|
+
return existing;
|
|
63
|
+
const minted = mintUuid();
|
|
64
|
+
await storage.set(INSTALL_ID_STORAGE_KEY, minted);
|
|
65
|
+
return minted;
|
|
66
|
+
})().finally(() => {
|
|
67
|
+
mintInFlight.delete(storage);
|
|
68
|
+
});
|
|
69
|
+
mintInFlight.set(storage, p);
|
|
70
|
+
return p;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Per-storage serialization chain for the fire-once guard: two concurrent
|
|
74
|
+
* calls must not BOTH observe a missing sentinel and double-emit. Calls
|
|
75
|
+
* queue per storage adapter; the second runs after the first persisted the
|
|
76
|
+
* sentinel and therefore no-ops.
|
|
77
|
+
*/
|
|
78
|
+
const firstOpenChain = new WeakMap();
|
|
79
|
+
/**
|
|
80
|
+
* Fire-once `app_first_opened` guard. Call at app entry, before any other
|
|
81
|
+
* UI/flow gating (NOT behind onboarding or sign-in). Persist-first contract:
|
|
82
|
+
* the sentinel row is written before `emit` runs. Concurrent calls are
|
|
83
|
+
* serialized per storage adapter (exactly one can fire).
|
|
84
|
+
*/
|
|
85
|
+
export function emitAppFirstOpenedIfNeeded(opts) {
|
|
86
|
+
const storage = opts.storage ?? sharedDefaultStorage();
|
|
87
|
+
const prev = firstOpenChain.get(storage) ?? Promise.resolve();
|
|
88
|
+
const next = prev
|
|
89
|
+
.catch(() => undefined) // a failed predecessor must not poison the chain
|
|
90
|
+
.then(async () => {
|
|
91
|
+
const installId = await getOrMintInstallId(storage);
|
|
92
|
+
const existing = await storage.get(FIRST_OPEN_SENTINEL_STORAGE_KEY);
|
|
93
|
+
if (existing !== null) {
|
|
94
|
+
return { fired: false, installId };
|
|
95
|
+
}
|
|
96
|
+
// Persist-first: sentinel BEFORE emit. A crash/throw between the two
|
|
97
|
+
// can only under-count.
|
|
98
|
+
await storage.set(FIRST_OPEN_SENTINEL_STORAGE_KEY, new Date().toISOString());
|
|
99
|
+
try {
|
|
100
|
+
await opts.emit({ installId });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Swallowed by contract: the sentinel already guarantees no re-fire.
|
|
104
|
+
}
|
|
105
|
+
return { fired: true, installId };
|
|
106
|
+
});
|
|
107
|
+
firstOpenChain.set(storage, next);
|
|
108
|
+
return next;
|
|
109
|
+
}
|
|
110
|
+
/** RFC 4122 v4 UUID via WebCrypto, with a manual fallback for older DOMs. */
|
|
111
|
+
function mintUuid() {
|
|
112
|
+
const c = globalThis.crypto;
|
|
113
|
+
if (c && typeof c.randomUUID === "function")
|
|
114
|
+
return c.randomUUID();
|
|
115
|
+
const bytes = new Uint8Array(16);
|
|
116
|
+
if (c && typeof c.getRandomValues === "function") {
|
|
117
|
+
c.getRandomValues(bytes);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
for (let i = 0; i < 16; i++)
|
|
121
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
122
|
+
}
|
|
123
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
124
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
125
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
126
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=installMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installMetrics.js","sourceRoot":"","sources":["../src/installMetrics.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -11,27 +11,40 @@ export interface Storage {
|
|
|
11
11
|
/** A no-op storage for SSR or first-render where DOM globals are missing. */
|
|
12
12
|
declare function memoryStorage(): Storage;
|
|
13
13
|
/**
|
|
14
|
-
* sessionStorage-backed adapter. Page-lifetime —
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* sessionStorage-backed adapter. Page-lifetime — used only for the in-flight
|
|
15
|
+
* PKCE verifier + state (single OAuth dance secrets). Everything session-
|
|
16
|
+
* durable lives in IndexedDB.
|
|
17
17
|
*/
|
|
18
18
|
declare function sessionStorageBacked(): Storage;
|
|
19
19
|
/**
|
|
20
|
-
* IndexedDB-backed adapter for
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* IndexedDB-backed adapter for the durable session (bas / ba_id / email /
|
|
21
|
+
* expires_at / refresh_token), entitlement cache, and install metrics keys.
|
|
22
|
+
* Wraps the verbose IDB API behind the same simple surface. No external
|
|
23
|
+
* dependency — small enough to inline.
|
|
23
24
|
*/
|
|
24
25
|
declare function indexedDbBacked(dbName?: string, storeName?: string): Storage;
|
|
25
26
|
/**
|
|
26
|
-
* Composite storage:
|
|
27
|
-
*
|
|
28
|
-
*
|
|
27
|
+
* Composite storage: the in-flight PKCE keys land in sessionStorage; the
|
|
28
|
+
* durable session + caches land in IndexedDB. Falls back to an in-memory map
|
|
29
|
+
* if either subsystem is unavailable (SSR, tests).
|
|
29
30
|
*/
|
|
30
31
|
declare class CompositeStorage implements Storage {
|
|
31
32
|
private readonly session;
|
|
32
33
|
private readonly persistent;
|
|
33
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Keys routed to persistent storage (IndexedDB). Everything else lives in
|
|
36
|
+
* sessionStorage. D4 (login-first cutover): `bas` / `ba_id` / `email` /
|
|
37
|
+
* `expires_at` moved here from sessionStorage so a web sign-in survives
|
|
38
|
+
* tab close + browser restart; the PKCE verifier/state deliberately stay
|
|
39
|
+
* session-scoped.
|
|
40
|
+
*/
|
|
34
41
|
static readonly persistentKeys: Set<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Keys that lived in sessionStorage before 0.4.0 and are now persistent.
|
|
44
|
+
* `get()` falls back to the legacy sessionStorage row and migrates it so a
|
|
45
|
+
* tab that was signed in when the host shipped 0.4.0 stays signed in.
|
|
46
|
+
*/
|
|
47
|
+
static readonly legacySessionKeys: Set<string>;
|
|
35
48
|
constructor(session: Storage, persistent: Storage);
|
|
36
49
|
private route;
|
|
37
50
|
set(k: string, v: string): Promise<void>;
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,OAAO;IACtB,4BAA4B;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,oDAAoD;IACpD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,oDAAoD;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID,6EAA6E;AAC7E,iBAAS,aAAa,IAAI,OAAO,CAgBhC;AAED;;;;GAIG;AACH,iBAAS,oBAAoB,IAAI,OAAO,CAoBvC;AAED;;;;;GAKG;AACH,iBAAS,eAAe,CAAC,MAAM,SAAoB,EAAE,SAAS,SAAO,GAAG,OAAO,CAsC9E;AAED;;;;GAIG;AACH,cAAM,gBAAiB,YAAW,OAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CAAC,cAAc,cAU3B;IACH;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,iBAAiB,cAAsC;gBAE3D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO;IAKjD,OAAO,CAAC,KAAK;IAIP,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGxC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUtC,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/storage.js
CHANGED
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
// verifier, and the entitlement cache without baking in any one backing
|
|
3
3
|
// store.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// Routing (login-first cutover D4, `identity.session_persistence`):
|
|
6
6
|
// 1. ServiceWorker-controlled store via postMessage → not implemented yet;
|
|
7
7
|
// host pages will replace `defaultStorage()` with their own SW adapter.
|
|
8
|
-
// 2. sessionStorage for
|
|
9
|
-
//
|
|
10
|
-
// 3. IndexedDB for the
|
|
11
|
-
//
|
|
8
|
+
// 2. sessionStorage ONLY for the in-flight PKCE verifier + state — those
|
|
9
|
+
// are single-dance secrets that should die with the tab.
|
|
10
|
+
// 3. IndexedDB for the durable session (bas / ba_id / email / expires_at /
|
|
11
|
+
// refresh_token), the entitlement cache, the DPoP key thumbprint, and
|
|
12
|
+
// the install metrics keys. A web session must survive tab close,
|
|
13
|
+
// browser restart, and app updates — sessionStorage for `bas` was the
|
|
14
|
+
// family-wide "signed out on every visit" bug (spec
|
|
15
|
+
// `identity.session_persistence` calls it out as a red).
|
|
12
16
|
//
|
|
13
17
|
// For Gate 2 the refresh_token will be DPoP-bound and the IndexedDB row will
|
|
14
18
|
// carry the JKT thumbprint of the non-extractable key it is bound to.
|
|
@@ -32,9 +36,9 @@ function memoryStorage() {
|
|
|
32
36
|
};
|
|
33
37
|
}
|
|
34
38
|
/**
|
|
35
|
-
* sessionStorage-backed adapter. Page-lifetime —
|
|
36
|
-
*
|
|
37
|
-
*
|
|
39
|
+
* sessionStorage-backed adapter. Page-lifetime — used only for the in-flight
|
|
40
|
+
* PKCE verifier + state (single OAuth dance secrets). Everything session-
|
|
41
|
+
* durable lives in IndexedDB.
|
|
38
42
|
*/
|
|
39
43
|
function sessionStorageBacked() {
|
|
40
44
|
return {
|
|
@@ -60,9 +64,10 @@ function sessionStorageBacked() {
|
|
|
60
64
|
};
|
|
61
65
|
}
|
|
62
66
|
/**
|
|
63
|
-
* IndexedDB-backed adapter for
|
|
64
|
-
*
|
|
65
|
-
*
|
|
67
|
+
* IndexedDB-backed adapter for the durable session (bas / ba_id / email /
|
|
68
|
+
* expires_at / refresh_token), entitlement cache, and install metrics keys.
|
|
69
|
+
* Wraps the verbose IDB API behind the same simple surface. No external
|
|
70
|
+
* dependency — small enough to inline.
|
|
66
71
|
*/
|
|
67
72
|
function indexedDbBacked(dbName = "bravely-account", storeName = "kv") {
|
|
68
73
|
const openDb = () => new Promise((resolve, reject) => {
|
|
@@ -102,19 +107,37 @@ function indexedDbBacked(dbName = "bravely-account", storeName = "kv") {
|
|
|
102
107
|
};
|
|
103
108
|
}
|
|
104
109
|
/**
|
|
105
|
-
* Composite storage:
|
|
106
|
-
*
|
|
107
|
-
*
|
|
110
|
+
* Composite storage: the in-flight PKCE keys land in sessionStorage; the
|
|
111
|
+
* durable session + caches land in IndexedDB. Falls back to an in-memory map
|
|
112
|
+
* if either subsystem is unavailable (SSR, tests).
|
|
108
113
|
*/
|
|
109
114
|
class CompositeStorage {
|
|
110
115
|
session;
|
|
111
116
|
persistent;
|
|
112
|
-
/**
|
|
117
|
+
/**
|
|
118
|
+
* Keys routed to persistent storage (IndexedDB). Everything else lives in
|
|
119
|
+
* sessionStorage. D4 (login-first cutover): `bas` / `ba_id` / `email` /
|
|
120
|
+
* `expires_at` moved here from sessionStorage so a web sign-in survives
|
|
121
|
+
* tab close + browser restart; the PKCE verifier/state deliberately stay
|
|
122
|
+
* session-scoped.
|
|
123
|
+
*/
|
|
113
124
|
static persistentKeys = new Set([
|
|
125
|
+
"bas",
|
|
126
|
+
"ba_id",
|
|
127
|
+
"email",
|
|
128
|
+
"expires_at",
|
|
114
129
|
"refresh_token",
|
|
115
130
|
"entitlement_cache",
|
|
116
131
|
"dpop_jkt_thumbprint",
|
|
132
|
+
"install_id",
|
|
133
|
+
"first_open_sentinel",
|
|
117
134
|
]);
|
|
135
|
+
/**
|
|
136
|
+
* Keys that lived in sessionStorage before 0.4.0 and are now persistent.
|
|
137
|
+
* `get()` falls back to the legacy sessionStorage row and migrates it so a
|
|
138
|
+
* tab that was signed in when the host shipped 0.4.0 stays signed in.
|
|
139
|
+
*/
|
|
140
|
+
static legacySessionKeys = new Set(["bas", "ba_id", "email"]);
|
|
118
141
|
constructor(session, persistent) {
|
|
119
142
|
this.session = session;
|
|
120
143
|
this.persistent = persistent;
|
|
@@ -126,10 +149,23 @@ class CompositeStorage {
|
|
|
126
149
|
await this.route(k).set(k, v);
|
|
127
150
|
}
|
|
128
151
|
async get(k) {
|
|
129
|
-
|
|
152
|
+
const value = await this.route(k).get(k);
|
|
153
|
+
if (value !== null || !CompositeStorage.legacySessionKeys.has(k))
|
|
154
|
+
return value;
|
|
155
|
+
// Pre-0.4.0 rows lived in sessionStorage. Migrate on first read.
|
|
156
|
+
const legacy = await this.session.get(k);
|
|
157
|
+
if (legacy === null)
|
|
158
|
+
return null;
|
|
159
|
+
await this.persistent.set(k, legacy);
|
|
160
|
+
await this.session.remove(k);
|
|
161
|
+
return legacy;
|
|
130
162
|
}
|
|
131
163
|
async remove(k) {
|
|
132
164
|
await this.route(k).remove(k);
|
|
165
|
+
// Also clear any legacy sessionStorage copy so a remove is total.
|
|
166
|
+
if (CompositeStorage.legacySessionKeys.has(k)) {
|
|
167
|
+
await this.session.remove(k);
|
|
168
|
+
}
|
|
133
169
|
}
|
|
134
170
|
async clear() {
|
|
135
171
|
await Promise.all([this.session.clear(), this.persistent.clear()]);
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,wEAAwE;AACxE,SAAS;AACT,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -110,7 +110,14 @@ export type BravelyAccountState = {
|
|
|
110
110
|
kind: "failed";
|
|
111
111
|
error: string;
|
|
112
112
|
};
|
|
113
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Catalog plan tokens for `openCheckout()`. Slot-1 is interval-true per the
|
|
115
|
+
* 2026-06-10 catalog rename: `monthly` (RVA apps) / `onetime` (IVA apps);
|
|
116
|
+
* `annual`/`lifetime` resolve server-side to the universal bundle plans
|
|
117
|
+
* (`premium_annual`/`premium_lifetime`). Legacy aliases keep working on the
|
|
118
|
+
* wire but new code should send these canonical keys.
|
|
119
|
+
*/
|
|
120
|
+
export type CheckoutPlan = "monthly" | "onetime" | "annual" | "lifetime";
|
|
114
121
|
/** Response from `POST /api/paddle-portal`. */
|
|
115
122
|
export interface PaddlePortalSession {
|
|
116
123
|
ok: true;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// bravely-commerce-router/openapi.yaml. Keep aligned by hand — the spec is
|
|
3
3
|
// small enough that codegen is more friction than the lib is worth.
|
|
4
4
|
//
|
|
5
|
-
// API version baseline: 1.
|
|
5
|
+
// API version baseline: 1.6.0 (`/oauth/token` returns the rotating refresh
|
|
6
|
+
// token + accepts `grant_type=refresh_token`; sliding 365d session window).
|
|
6
7
|
export {};
|
|
7
8
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,2EAA2E;AAC3E,oEAAoE;AACpE,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,2EAA2E;AAC3E,oEAAoE;AACpE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bravely-studios/account-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
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",
|