@arcblock/did-connect-service 4.0.4 → 4.0.6
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/assets/fonts/noto-sans-sc-regular.otf +0 -0
- package/dist/embedded.d.ts +32 -0
- package/dist/embedded.d.ts.map +1 -1
- package/dist/embedded.js +3 -0
- package/dist/embedded.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts +5 -0
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +33 -0
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +17 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +107 -5
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/identity/csrf.d.ts +17 -0
- package/dist/identity/csrf.d.ts.map +1 -0
- package/dist/identity/csrf.js +56 -0
- package/dist/identity/csrf.js.map +1 -0
- package/dist/og/emoji.d.ts +12 -0
- package/dist/og/emoji.d.ts.map +1 -0
- package/dist/og/emoji.js +71 -0
- package/dist/og/emoji.js.map +1 -0
- package/dist/og/generator.d.ts +3 -0
- package/dist/og/generator.d.ts.map +1 -0
- package/dist/og/generator.js +338 -0
- package/dist/og/generator.js.map +1 -0
- package/dist/og/index.d.ts +6 -0
- package/dist/og/index.d.ts.map +1 -0
- package/dist/og/index.js +4 -0
- package/dist/og/index.js.map +1 -0
- package/dist/og/passport-svg.d.ts +52 -0
- package/dist/og/passport-svg.d.ts.map +1 -0
- package/dist/og/passport-svg.js +157 -0
- package/dist/og/passport-svg.js.map +1 -0
- package/dist/og/ssrf-guard.d.ts +38 -0
- package/dist/og/ssrf-guard.d.ts.map +1 -0
- package/dist/og/ssrf-guard.js +188 -0
- package/dist/og/ssrf-guard.js.map +1 -0
- package/dist/og/templates.d.ts +26 -0
- package/dist/og/templates.d.ts.map +1 -0
- package/dist/og/templates.js +302 -0
- package/dist/og/templates.js.map +1 -0
- package/dist/og/types.d.ts +74 -0
- package/dist/og/types.d.ts.map +1 -0
- package/dist/og/types.js +14 -0
- package/dist/og/types.js.map +1 -0
- package/package.json +18 -4
- package/dist/access-key-handler.d.ts +0 -37
- package/dist/access-key-handler.d.ts.map +0 -1
- package/dist/access-key-handler.js +0 -316
- package/dist/access-key-handler.js.map +0 -1
- package/dist/access-key-util.d.ts +0 -19
- package/dist/access-key-util.d.ts.map +0 -1
- package/dist/access-key-util.js +0 -45
- package/dist/access-key-util.js.map +0 -1
- package/dist/access-policy.d.ts +0 -53
- package/dist/access-policy.d.ts.map +0 -1
- package/dist/access-policy.js +0 -153
- package/dist/access-policy.js.map +0 -1
- package/dist/auth-client.d.ts +0 -20
- package/dist/auth-client.d.ts.map +0 -1
- package/dist/auth-client.js +0 -42
- package/dist/auth-client.js.map +0 -1
- package/dist/auth-entrypoint.d.ts +0 -45
- package/dist/auth-entrypoint.d.ts.map +0 -1
- package/dist/auth-entrypoint.js +0 -31
- package/dist/auth-entrypoint.js.map +0 -1
- package/dist/auth-handler.d.ts +0 -136
- package/dist/auth-handler.d.ts.map +0 -1
- package/dist/auth-handler.js +0 -408
- package/dist/auth-handler.js.map +0 -1
- package/dist/auth-rpc-types.d.ts +0 -139
- package/dist/auth-rpc-types.d.ts.map +0 -1
- package/dist/auth-rpc-types.js +0 -11
- package/dist/auth-rpc-types.js.map +0 -1
- package/dist/auth-rpc.d.ts +0 -80
- package/dist/auth-rpc.d.ts.map +0 -1
- package/dist/auth-rpc.js +0 -257
- package/dist/auth-rpc.js.map +0 -1
- package/dist/auth-worker.d.ts +0 -42
- package/dist/auth-worker.d.ts.map +0 -1
- package/dist/auth-worker.js +0 -120
- package/dist/auth-worker.js.map +0 -1
- package/dist/blocklet-js-handler.d.ts +0 -22
- package/dist/blocklet-js-handler.d.ts.map +0 -1
- package/dist/blocklet-js-handler.js +0 -205
- package/dist/blocklet-js-handler.js.map +0 -1
- package/dist/branding-handler.d.ts +0 -42
- package/dist/branding-handler.d.ts.map +0 -1
- package/dist/branding-handler.js +0 -326
- package/dist/branding-handler.js.map +0 -1
- package/dist/d1-token-storage.d.ts +0 -31
- package/dist/d1-token-storage.d.ts.map +0 -1
- package/dist/d1-token-storage.js +0 -83
- package/dist/d1-token-storage.js.map +0 -1
- package/dist/did-connect-handler.d.ts +0 -57
- package/dist/did-connect-handler.d.ts.map +0 -1
- package/dist/did-connect-handler.js +0 -182
- package/dist/did-connect-handler.js.map +0 -1
- package/dist/did.d.ts +0 -14
- package/dist/did.d.ts.map +0 -1
- package/dist/did.js +0 -17
- package/dist/did.js.map +0 -1
- package/dist/email-login-handler.d.ts +0 -50
- package/dist/email-login-handler.d.ts.map +0 -1
- package/dist/email-login-handler.js +0 -238
- package/dist/email-login-handler.js.map +0 -1
- package/dist/federation-utils.d.ts +0 -23
- package/dist/federation-utils.d.ts.map +0 -1
- package/dist/federation-utils.js +0 -25
- package/dist/federation-utils.js.map +0 -1
- package/dist/handler.d.ts +0 -90
- package/dist/handler.d.ts.map +0 -1
- package/dist/handler.js +0 -591
- package/dist/handler.js.map +0 -1
- package/dist/identity/invitation-util.d.ts +0 -7
- package/dist/identity/invitation-util.d.ts.map +0 -1
- package/dist/identity/invitation-util.js +0 -66
- package/dist/identity/invitation-util.js.map +0 -1
- package/dist/instance-role.d.ts +0 -10
- package/dist/instance-role.d.ts.map +0 -1
- package/dist/instance-role.js +0 -20
- package/dist/instance-role.js.map +0 -1
- package/dist/jwt.d.ts +0 -7
- package/dist/jwt.d.ts.map +0 -1
- package/dist/jwt.js +0 -72
- package/dist/jwt.js.map +0 -1
- package/dist/login-entry.d.ts +0 -9
- package/dist/login-entry.d.ts.map +0 -1
- package/dist/login-entry.js +0 -9
- package/dist/login-entry.js.map +0 -1
- package/dist/membership-handler.d.ts +0 -27
- package/dist/membership-handler.d.ts.map +0 -1
- package/dist/membership-handler.js +0 -111
- package/dist/membership-handler.js.map +0 -1
- package/dist/oauth-callback-page.d.ts +0 -9
- package/dist/oauth-callback-page.d.ts.map +0 -1
- package/dist/oauth-callback-page.js +0 -31
- package/dist/oauth-callback-page.js.map +0 -1
- package/dist/oauth-handler.d.ts +0 -72
- package/dist/oauth-handler.d.ts.map +0 -1
- package/dist/oauth-handler.js +0 -423
- package/dist/oauth-handler.js.map +0 -1
- package/dist/page.d.ts +0 -33
- package/dist/page.d.ts.map +0 -1
- package/dist/page.js +0 -59
- package/dist/page.js.map +0 -1
- package/dist/pages/auth-script.d.ts +0 -18
- package/dist/pages/auth-script.d.ts.map +0 -1
- package/dist/pages/auth-script.js +0 -185
- package/dist/pages/auth-script.js.map +0 -1
- package/dist/pages/design-tokens.d.ts +0 -86
- package/dist/pages/design-tokens.d.ts.map +0 -1
- package/dist/pages/design-tokens.js +0 -159
- package/dist/pages/design-tokens.js.map +0 -1
- package/dist/pages/did-connect-script.d.ts +0 -16
- package/dist/pages/did-connect-script.d.ts.map +0 -1
- package/dist/pages/did-connect-script.js +0 -105
- package/dist/pages/did-connect-script.js.map +0 -1
- package/dist/pages/shared-styles.d.ts +0 -6
- package/dist/pages/shared-styles.d.ts.map +0 -1
- package/dist/pages/shared-styles.js +0 -109
- package/dist/pages/shared-styles.js.map +0 -1
- package/dist/rbac.d.ts +0 -19
- package/dist/rbac.d.ts.map +0 -1
- package/dist/rbac.js +0 -76
- package/dist/rbac.js.map +0 -1
- package/dist/session-context.d.ts +0 -35
- package/dist/session-context.d.ts.map +0 -1
- package/dist/session-context.js +0 -39
- package/dist/session-context.js.map +0 -1
- package/dist/store.d.ts +0 -222
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -1366
- package/dist/store.js.map +0 -1
- package/dist/team-handler.d.ts +0 -90
- package/dist/team-handler.d.ts.map +0 -1
- package/dist/team-handler.js +0 -1225
- package/dist/team-handler.js.map +0 -1
- package/dist/ticket-handler.d.ts +0 -28
- package/dist/ticket-handler.d.ts.map +0 -1
- package/dist/ticket-handler.js +0 -74
- package/dist/ticket-handler.js.map +0 -1
- package/dist/wallet-identity.d.ts +0 -32
- package/dist/wallet-identity.d.ts.map +0 -1
- package/dist/wallet-identity.js +0 -43
- package/dist/wallet-identity.js.map +0 -1
- package/dist/webauthn.d.ts +0 -65
- package/dist/webauthn.d.ts.map +0 -1
- package/dist/webauthn.js +0 -112
- package/dist/webauthn.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { formatThemeForOutput } from "./theme-utils.js";
|
|
2
|
-
import { resolveWalletIdentity } from "./identity/wallet-identity.js";
|
|
3
|
-
export class BlockletJsHandler {
|
|
4
|
-
options;
|
|
5
|
-
appDid;
|
|
6
|
-
appPid;
|
|
7
|
-
appPk;
|
|
8
|
-
constructor(options) {
|
|
9
|
-
this.options = options;
|
|
10
|
-
const identity = resolveWalletIdentity(options.appSk, options.appPsk);
|
|
11
|
-
this.appDid = options.appDid || identity.appDid;
|
|
12
|
-
this.appPid = identity.appPid;
|
|
13
|
-
this.appPk = identity.appPk;
|
|
14
|
-
}
|
|
15
|
-
async fetch(request) {
|
|
16
|
-
const url = new URL(request.url);
|
|
17
|
-
// Fast path: endsWith check avoids regex on every request
|
|
18
|
-
if (!url.pathname.endsWith("/__blocklet__.js"))
|
|
19
|
-
return null;
|
|
20
|
-
const isJson = url.searchParams.get("type") === "json";
|
|
21
|
-
const data = await this.buildBlockletData(request);
|
|
22
|
-
if (isJson) {
|
|
23
|
-
return new Response(JSON.stringify(data), {
|
|
24
|
-
headers: {
|
|
25
|
-
"Content-Type": "application/json",
|
|
26
|
-
"Cache-Control": "private, no-store",
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
// JSON.stringify handles nested objects, special chars correctly
|
|
31
|
-
const js = `window.blocklet = ${JSON.stringify(data)};`;
|
|
32
|
-
return new Response(js, {
|
|
33
|
-
headers: {
|
|
34
|
-
"Content-Type": "application/javascript; charset=utf-8",
|
|
35
|
-
"Cache-Control": "private, no-store",
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
async buildBlockletData(request) {
|
|
40
|
-
const origin = new URL(request.url).origin;
|
|
41
|
-
const store = this.options.store;
|
|
42
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
43
|
-
// Single D1 query: load all settings for this instance
|
|
44
|
-
const allSettings = await store.listSettings(instanceDid);
|
|
45
|
-
const settingsMap = new Map(allSettings.map((s) => [s.key, s.value]));
|
|
46
|
-
// Deterministic updatedAt: max(updated_at) from settings rows
|
|
47
|
-
let latestUpdate = 0;
|
|
48
|
-
for (const s of allSettings) {
|
|
49
|
-
if (s.updated_at) {
|
|
50
|
-
const t = new Date(s.updated_at).getTime();
|
|
51
|
-
if (t > latestUpdate)
|
|
52
|
-
latestUpdate = t;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const parse = (key, fallback) => {
|
|
56
|
-
const raw = settingsMap.get(key);
|
|
57
|
-
if (!raw)
|
|
58
|
-
return fallback;
|
|
59
|
-
try {
|
|
60
|
-
const parsed = JSON.parse(raw);
|
|
61
|
-
// JSON.parse("null") returns null — use fallback for null
|
|
62
|
-
if (parsed === null)
|
|
63
|
-
return fallback;
|
|
64
|
-
return parsed;
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return fallback;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const branding = parse("app:branding", {});
|
|
71
|
-
const logos = parse("app:logos", {});
|
|
72
|
-
const orgConfig = parse("app:org", { enabled: false });
|
|
73
|
-
const didConnectConfig = parse("app:didConnect", { showDidColor: true, showAppInfo: true });
|
|
74
|
-
const inviteConfig = parse("app:invite", { enabled: false });
|
|
75
|
-
const fedConfig = parse("federation:config", {});
|
|
76
|
-
const navigation = parse("app:navigation", []);
|
|
77
|
-
const theme = parse("app:theme", {});
|
|
78
|
-
const languages = parse("app:languages", [{ code: "en", name: "English" }]);
|
|
79
|
-
const mountPoints = parse("app:mountPoints", []);
|
|
80
|
-
// Phase 3c keys — must stay aligned
|
|
81
|
-
const sessionConfig = parse("session:config", {});
|
|
82
|
-
const builtinProviders = parse("auth:builtin-providers", {});
|
|
83
|
-
const emailConfig = parse("email:config", null);
|
|
84
|
-
// ─── Build authentication map ───────────────────────────────────
|
|
85
|
-
const authentication = {};
|
|
86
|
-
// Builtin providers: respect admin toggles
|
|
87
|
-
const isPasskeyEnabled = builtinProviders.passkey ? builtinProviders.passkey.enabled !== false : true;
|
|
88
|
-
const isWalletEnabled = builtinProviders.wallet ? builtinProviders.wallet.enabled !== false : true;
|
|
89
|
-
const isEmailBuiltinEnabled = builtinProviders.email ? builtinProviders.email.enabled !== false : true;
|
|
90
|
-
if (isPasskeyEnabled) {
|
|
91
|
-
authentication.passkey = { enabled: true, type: "builtin", order: 0 };
|
|
92
|
-
}
|
|
93
|
-
if (isWalletEnabled) {
|
|
94
|
-
authentication.wallet = { enabled: true, type: "builtin", order: 1, showQrcode: true };
|
|
95
|
-
}
|
|
96
|
-
// OAuth providers: from oauth:* settings (only expose safe fields)
|
|
97
|
-
for (const [key, value] of settingsMap) {
|
|
98
|
-
if (key.startsWith("oauth:") && value) {
|
|
99
|
-
const provider = key.slice(6);
|
|
100
|
-
try {
|
|
101
|
-
const config = JSON.parse(value);
|
|
102
|
-
if (config.enabled !== false) {
|
|
103
|
-
authentication[provider] = {
|
|
104
|
-
enabled: true,
|
|
105
|
-
type: "oauth",
|
|
106
|
-
order: config.order ?? 99,
|
|
107
|
-
// Only expose safe fields — never clientSecret/privateKey
|
|
108
|
-
...(config.clientId ? { clientId: config.clientId } : {}),
|
|
109
|
-
...(config.domain ? { domain: config.domain } : {}),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
/* skip invalid JSON */
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// Email: enabled when BOTH conditions met
|
|
119
|
-
if (isEmailBuiltinEnabled && emailConfig?.resendApiKey) {
|
|
120
|
-
authentication.email = { enabled: true, type: "builtin", order: 98 };
|
|
121
|
-
}
|
|
122
|
-
// ─── Session: convert jwtTtlDays to seconds ────────────────────
|
|
123
|
-
const rawTtl = sessionConfig.jwtTtlDays;
|
|
124
|
-
const jwtTtlDays = typeof rawTtl === "number" && rawTtl > 0 ? rawTtl : 7;
|
|
125
|
-
const sessionTtlSeconds = jwtTtlDays * 86400;
|
|
126
|
-
// ─── Path prefixes from gateway headers ─────────────────────────
|
|
127
|
-
const prefix = request.headers.get("x-path-prefix") || "/";
|
|
128
|
-
const groupPrefix = request.headers.get("x-group-path-prefix") || "/";
|
|
129
|
-
const pageGroup = request.headers.get("x-page-group") || "";
|
|
130
|
-
return {
|
|
131
|
-
// --- App identity ---
|
|
132
|
-
appId: this.appDid,
|
|
133
|
-
appPid: this.appPid,
|
|
134
|
-
appPk: this.appPk,
|
|
135
|
-
appName: branding.name || "",
|
|
136
|
-
appDescription: branding.description || "",
|
|
137
|
-
appUrl: branding.url || origin,
|
|
138
|
-
did: this.appDid,
|
|
139
|
-
status: "running",
|
|
140
|
-
tenantMode: branding.tenantMode || "single",
|
|
141
|
-
passportColor: branding.passportColor || "#1DC1C7",
|
|
142
|
-
alsoKnownAs: [],
|
|
143
|
-
trustedFactories: [],
|
|
144
|
-
domainAliases: branding.domainAliases || [],
|
|
145
|
-
// --- Server info ---
|
|
146
|
-
serverDid: this.appDid,
|
|
147
|
-
serverVersion: this.options.serverVersion || "1.0.0",
|
|
148
|
-
// --- Path prefixes ---
|
|
149
|
-
prefix,
|
|
150
|
-
groupPrefix,
|
|
151
|
-
pageGroup,
|
|
152
|
-
servicePrefix: "/.well-known/service",
|
|
153
|
-
version: branding.version || "1.0.0",
|
|
154
|
-
componentId: this.appDid,
|
|
155
|
-
isComponent: false,
|
|
156
|
-
// --- Brand assets (R2 key → URL path conversion) ---
|
|
157
|
-
appLogo: logos.square ? "/.well-known/service/blocklet/logo" : "",
|
|
158
|
-
appLogoDark: logos.squareDark ? "/.well-known/service/blocklet/logo-dark" : "",
|
|
159
|
-
appLogoRect: logos.rect ? "/.well-known/service/blocklet/logo-rect" : "",
|
|
160
|
-
appLogoRectDark: logos.rectDark ? "/.well-known/service/blocklet/logo-rect-dark" : "",
|
|
161
|
-
appSplashPortrait: logos.splashPortrait || "",
|
|
162
|
-
appSplashLandscape: logos.splashLandscape || "",
|
|
163
|
-
blurhash: logos.blurhash || {},
|
|
164
|
-
// --- Config ---
|
|
165
|
-
webWalletUrl: "https://web.abtwallet.io",
|
|
166
|
-
preferences: {},
|
|
167
|
-
languages,
|
|
168
|
-
updatedAt: latestUpdate || 0,
|
|
169
|
-
copyright: branding.copyright || {},
|
|
170
|
-
navigation,
|
|
171
|
-
theme: formatThemeForOutput(theme),
|
|
172
|
-
optionalComponents: [],
|
|
173
|
-
enableDocker: false,
|
|
174
|
-
enableDockerNetwork: false,
|
|
175
|
-
componentMountPoints: mountPoints,
|
|
176
|
-
sw: { options: {} },
|
|
177
|
-
// --- Settings ---
|
|
178
|
-
settings: {
|
|
179
|
-
session: {
|
|
180
|
-
ttl: sessionTtlSeconds,
|
|
181
|
-
cacheTtl: sessionConfig.cacheTtl || 3600,
|
|
182
|
-
},
|
|
183
|
-
invite: inviteConfig,
|
|
184
|
-
federated: {
|
|
185
|
-
master: fedConfig.master || {},
|
|
186
|
-
config: {
|
|
187
|
-
status: fedConfig.status || undefined,
|
|
188
|
-
autoLogin: false,
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
oauth: {}, // deprecated
|
|
192
|
-
authentication,
|
|
193
|
-
didConnect: didConnectConfig,
|
|
194
|
-
actionConfig: {},
|
|
195
|
-
kyc: { email: false },
|
|
196
|
-
notification: {
|
|
197
|
-
email: { enabled: !!(isEmailBuiltinEnabled && emailConfig?.resendApiKey) },
|
|
198
|
-
toastAlert: false,
|
|
199
|
-
},
|
|
200
|
-
org: orgConfig,
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=blocklet-js-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blocklet-js-handler.js","sourceRoot":"","sources":["../src/blocklet-js-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BrandingHandler — Logo serving, Branding/Theme/Navigation CRUD for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Public routes (before enforceAccess): Logo access, Theme anti-FOUC
|
|
5
|
-
* Admin routes (after enforceAccess): Branding/Theme/Navigation CRUD, Logo upload/delete
|
|
6
|
-
*/
|
|
7
|
-
import type { D1Store } from "./store/d1-store.js";
|
|
8
|
-
export interface BrandingHandlerOptions {
|
|
9
|
-
store: D1Store;
|
|
10
|
-
r2?: R2Bucket;
|
|
11
|
-
instanceDid?: string;
|
|
12
|
-
}
|
|
13
|
-
export declare class BrandingHandler {
|
|
14
|
-
private options;
|
|
15
|
-
constructor(options: BrandingHandlerOptions);
|
|
16
|
-
/**
|
|
17
|
-
* Public routes — Logo access + Theme anti-FOUC endpoints.
|
|
18
|
-
* Called BEFORE enforceAccess in auth-handler route().
|
|
19
|
-
*/
|
|
20
|
-
fetchPublic(request: Request): Promise<Response | null>;
|
|
21
|
-
/**
|
|
22
|
-
* Admin routes — Branding/Theme/Navigation CRUD.
|
|
23
|
-
* Called AFTER enforceAccess in auth-handler route() (requires admin).
|
|
24
|
-
*/
|
|
25
|
-
fetchAdmin(request: Request): Promise<Response | null>;
|
|
26
|
-
private serveLogo;
|
|
27
|
-
resolveLogoType(pathname: string): string | null;
|
|
28
|
-
getFallbackChain(type: string): string[];
|
|
29
|
-
private defaultLogoResponse;
|
|
30
|
-
private getBranding;
|
|
31
|
-
private updateBranding;
|
|
32
|
-
private uploadLogo;
|
|
33
|
-
private deleteLogo;
|
|
34
|
-
private getTheme;
|
|
35
|
-
private updateTheme;
|
|
36
|
-
private serveThemeStyles;
|
|
37
|
-
private serveThemeInit;
|
|
38
|
-
private getFormattedTheme;
|
|
39
|
-
private getNavigation;
|
|
40
|
-
private updateNavigation;
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=branding-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"branding-handler.d.ts","sourceRoot":"","sources":["../src/branding-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,sBAAsB;IAEnD;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAqB7D;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YA+B9C,SAAS;IAmCvB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAahD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAcxC,OAAO,CAAC,mBAAmB;YAYb,WAAW;YAeX,cAAc;YAoBd,UAAU;YA8CV,UAAU;YAyBV,QAAQ;YAMR,WAAW;YAsBX,gBAAgB;YAmBhB,cAAc;YAwBd,iBAAiB;YAUjB,aAAa;YAMb,gBAAgB;CAW/B"}
|
package/dist/branding-handler.js
DELETED
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BrandingHandler — Logo serving, Branding/Theme/Navigation CRUD for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Public routes (before enforceAccess): Logo access, Theme anti-FOUC
|
|
5
|
-
* Admin routes (after enforceAccess): Branding/Theme/Navigation CRUD, Logo upload/delete
|
|
6
|
-
*/
|
|
7
|
-
import { formatThemeForOutput } from "./theme-utils.js";
|
|
8
|
-
export class BrandingHandler {
|
|
9
|
-
options;
|
|
10
|
-
constructor(options) {
|
|
11
|
-
this.options = options;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Public routes — Logo access + Theme anti-FOUC endpoints.
|
|
15
|
-
* Called BEFORE enforceAccess in auth-handler route().
|
|
16
|
-
*/
|
|
17
|
-
async fetchPublic(request) {
|
|
18
|
-
const url = new URL(request.url);
|
|
19
|
-
const { pathname } = url;
|
|
20
|
-
// Logo access (public)
|
|
21
|
-
if (pathname.startsWith("/.well-known/service/blocklet/logo") ||
|
|
22
|
-
pathname.startsWith("/.well-known/service/blocklet/splash") ||
|
|
23
|
-
pathname.startsWith("/.well-known/service/blocklet/og-image") ||
|
|
24
|
-
pathname === "/favicon.ico") {
|
|
25
|
-
return this.serveLogo(request);
|
|
26
|
-
}
|
|
27
|
-
// Theme anti-FOUC (public, cacheable)
|
|
28
|
-
if (pathname === "/.well-known/service/theme/styles.css")
|
|
29
|
-
return this.serveThemeStyles();
|
|
30
|
-
if (pathname === "/.well-known/service/theme/init.js")
|
|
31
|
-
return this.serveThemeInit();
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Admin routes — Branding/Theme/Navigation CRUD.
|
|
36
|
-
* Called AFTER enforceAccess in auth-handler route() (requires admin).
|
|
37
|
-
*/
|
|
38
|
-
async fetchAdmin(request) {
|
|
39
|
-
const url = new URL(request.url);
|
|
40
|
-
const { pathname } = url;
|
|
41
|
-
// Branding API
|
|
42
|
-
if (pathname === "/.well-known/service/api/branding") {
|
|
43
|
-
if (request.method === "GET")
|
|
44
|
-
return this.getBranding();
|
|
45
|
-
if (request.method === "PUT")
|
|
46
|
-
return this.updateBranding(request);
|
|
47
|
-
}
|
|
48
|
-
if (pathname.startsWith("/.well-known/service/api/branding/logo/")) {
|
|
49
|
-
if (request.method === "POST")
|
|
50
|
-
return this.uploadLogo(request);
|
|
51
|
-
if (request.method === "DELETE")
|
|
52
|
-
return this.deleteLogo(request);
|
|
53
|
-
}
|
|
54
|
-
// Theme API
|
|
55
|
-
if (pathname === "/.well-known/service/api/theme") {
|
|
56
|
-
if (request.method === "GET")
|
|
57
|
-
return this.getTheme();
|
|
58
|
-
if (request.method === "PUT")
|
|
59
|
-
return this.updateTheme(request);
|
|
60
|
-
}
|
|
61
|
-
// Navigation API
|
|
62
|
-
if (pathname === "/.well-known/service/api/navigation") {
|
|
63
|
-
if (request.method === "GET")
|
|
64
|
-
return this.getNavigation();
|
|
65
|
-
if (request.method === "PUT")
|
|
66
|
-
return this.updateNavigation(request);
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
// ─── Logo Access ───────────────────────────────────────────────────
|
|
71
|
-
async serveLogo(request) {
|
|
72
|
-
const url = new URL(request.url);
|
|
73
|
-
const logoType = this.resolveLogoType(url.pathname);
|
|
74
|
-
if (!logoType)
|
|
75
|
-
return new Response("Not found", { status: 404 });
|
|
76
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
77
|
-
const logosRaw = await this.options.store.getSetting(instanceDid, "app:logos");
|
|
78
|
-
const logos = logosRaw ? JSON.parse(logosRaw) : {};
|
|
79
|
-
// Fallback chain
|
|
80
|
-
const fallbackChain = this.getFallbackChain(logoType);
|
|
81
|
-
let r2Key = null;
|
|
82
|
-
for (const type of fallbackChain) {
|
|
83
|
-
if (logos[type]) {
|
|
84
|
-
r2Key = logos[type];
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (!r2Key || !this.options.r2) {
|
|
89
|
-
return this.defaultLogoResponse();
|
|
90
|
-
}
|
|
91
|
-
const object = await this.options.r2.get(r2Key);
|
|
92
|
-
if (!object)
|
|
93
|
-
return this.defaultLogoResponse();
|
|
94
|
-
const headers = new Headers();
|
|
95
|
-
headers.set("Content-Type", object.httpMetadata?.contentType || "image/png");
|
|
96
|
-
headers.set("Cache-Control", "public, max-age=86400");
|
|
97
|
-
headers.set("ETag", object.httpEtag);
|
|
98
|
-
return new Response(object.body, { headers });
|
|
99
|
-
}
|
|
100
|
-
resolveLogoType(pathname) {
|
|
101
|
-
if (pathname === "/favicon.ico")
|
|
102
|
-
return "favicon";
|
|
103
|
-
if (pathname.endsWith("/logo-rect-dark"))
|
|
104
|
-
return "rectDark";
|
|
105
|
-
if (pathname.endsWith("/logo-rect"))
|
|
106
|
-
return "rect";
|
|
107
|
-
if (pathname.endsWith("/logo-dark"))
|
|
108
|
-
return "squareDark";
|
|
109
|
-
if (pathname.endsWith("/logo-favicon"))
|
|
110
|
-
return "favicon";
|
|
111
|
-
if (pathname.endsWith("/logo"))
|
|
112
|
-
return "square";
|
|
113
|
-
if (pathname.endsWith("/splash/portrait"))
|
|
114
|
-
return "splashPortrait";
|
|
115
|
-
if (pathname.endsWith("/splash/landscape"))
|
|
116
|
-
return "splashLandscape";
|
|
117
|
-
if (pathname.endsWith("/og-image"))
|
|
118
|
-
return "ogImage";
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
getFallbackChain(type) {
|
|
122
|
-
const chains = {
|
|
123
|
-
square: ["square"],
|
|
124
|
-
squareDark: ["squareDark", "square"],
|
|
125
|
-
rect: ["rect", "square"],
|
|
126
|
-
rectDark: ["rectDark", "squareDark", "rect", "square"],
|
|
127
|
-
favicon: ["favicon", "square"],
|
|
128
|
-
splashPortrait: ["splashPortrait"],
|
|
129
|
-
splashLandscape: ["splashLandscape"],
|
|
130
|
-
ogImage: ["ogImage"],
|
|
131
|
-
};
|
|
132
|
-
return chains[type] || [type];
|
|
133
|
-
}
|
|
134
|
-
defaultLogoResponse() {
|
|
135
|
-
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
|
|
136
|
-
<rect width="64" height="64" rx="12" fill="#4F46E5"/>
|
|
137
|
-
<text x="32" y="40" text-anchor="middle" fill="white" font-size="28" font-family="system-ui">B</text>
|
|
138
|
-
</svg>`;
|
|
139
|
-
return new Response(svg, {
|
|
140
|
-
headers: { "Content-Type": "image/svg+xml", "Cache-Control": "public, max-age=86400" },
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
// ─── Branding CRUD ─────────────────────────────────────────────────
|
|
144
|
-
async getBranding() {
|
|
145
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
146
|
-
const [brandingRaw, logosRaw, langRaw] = await Promise.all([
|
|
147
|
-
this.options.store.getSetting(instanceDid, "app:branding"),
|
|
148
|
-
this.options.store.getSetting(instanceDid, "app:logos"),
|
|
149
|
-
this.options.store.getSetting(instanceDid, "app:languages"),
|
|
150
|
-
]);
|
|
151
|
-
return jsonResponse({
|
|
152
|
-
branding: brandingRaw ? JSON.parse(brandingRaw) : {},
|
|
153
|
-
logos: logosRaw ? JSON.parse(logosRaw) : {},
|
|
154
|
-
languages: langRaw ? JSON.parse(langRaw) : [{ code: "en", name: "English" }],
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
async updateBranding(request) {
|
|
158
|
-
const body = await request.json();
|
|
159
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
160
|
-
// Partial merge update
|
|
161
|
-
if (body.branding) {
|
|
162
|
-
const existing = await this.options.store.getSetting(instanceDid, "app:branding");
|
|
163
|
-
const merged = { ...(existing ? JSON.parse(existing) : {}), ...body.branding };
|
|
164
|
-
await this.options.store.setSetting(instanceDid, "app:branding", JSON.stringify(merged));
|
|
165
|
-
}
|
|
166
|
-
if (body.languages) {
|
|
167
|
-
await this.options.store.setSetting(instanceDid, "app:languages", JSON.stringify(body.languages));
|
|
168
|
-
}
|
|
169
|
-
return jsonResponse({ ok: true });
|
|
170
|
-
}
|
|
171
|
-
// ─── Logo Upload/Delete ────────────────────────────────────────────
|
|
172
|
-
async uploadLogo(request) {
|
|
173
|
-
if (!this.options.r2) {
|
|
174
|
-
return jsonResponse({ error: "R2 storage not configured" }, 500);
|
|
175
|
-
}
|
|
176
|
-
const url = new URL(request.url);
|
|
177
|
-
const type = url.pathname.split("/").pop();
|
|
178
|
-
if (!type)
|
|
179
|
-
return jsonResponse({ error: "Missing logo type" }, 400);
|
|
180
|
-
// Validate type to prevent path traversal
|
|
181
|
-
const camelType = toCamelCase(type);
|
|
182
|
-
if (camelType.includes("/") || camelType.includes("..") || camelType.includes("\0")) {
|
|
183
|
-
return jsonResponse({ error: "Invalid logo type" }, 400);
|
|
184
|
-
}
|
|
185
|
-
const contentType = request.headers.get("Content-Type") || "";
|
|
186
|
-
let fileData;
|
|
187
|
-
let mimeType = "image/png";
|
|
188
|
-
if (contentType.includes("multipart/form-data")) {
|
|
189
|
-
const formData = await request.formData();
|
|
190
|
-
const file = formData.get("file");
|
|
191
|
-
if (!file)
|
|
192
|
-
return jsonResponse({ error: "No file in form data" }, 400);
|
|
193
|
-
fileData = await file.arrayBuffer();
|
|
194
|
-
mimeType = file.type || "image/png";
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
fileData = await request.arrayBuffer();
|
|
198
|
-
mimeType = contentType || "image/png";
|
|
199
|
-
}
|
|
200
|
-
// Upload to R2
|
|
201
|
-
const r2Key = `logos/${type}/${Date.now()}-${type}`;
|
|
202
|
-
await this.options.r2.put(r2Key, fileData, {
|
|
203
|
-
httpMetadata: { contentType: mimeType },
|
|
204
|
-
});
|
|
205
|
-
// Update D1 settings
|
|
206
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
207
|
-
const logosRaw = await this.options.store.getSetting(instanceDid, "app:logos");
|
|
208
|
-
const logos = logosRaw ? JSON.parse(logosRaw) : {};
|
|
209
|
-
logos[camelType] = r2Key;
|
|
210
|
-
await this.options.store.setSetting(instanceDid, "app:logos", JSON.stringify(logos));
|
|
211
|
-
return jsonResponse({ ok: true, type: camelType, r2Key });
|
|
212
|
-
}
|
|
213
|
-
async deleteLogo(request) {
|
|
214
|
-
if (!this.options.r2) {
|
|
215
|
-
return jsonResponse({ error: "R2 storage not configured" }, 500);
|
|
216
|
-
}
|
|
217
|
-
const url = new URL(request.url);
|
|
218
|
-
const type = url.pathname.split("/").pop();
|
|
219
|
-
if (!type)
|
|
220
|
-
return jsonResponse({ error: "Missing logo type" }, 400);
|
|
221
|
-
const camelType = toCamelCase(type);
|
|
222
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
223
|
-
const logosRaw = await this.options.store.getSetting(instanceDid, "app:logos");
|
|
224
|
-
const logos = logosRaw ? JSON.parse(logosRaw) : {};
|
|
225
|
-
if (logos[camelType]) {
|
|
226
|
-
await this.options.r2.delete(logos[camelType]);
|
|
227
|
-
delete logos[camelType];
|
|
228
|
-
await this.options.store.setSetting(instanceDid, "app:logos", JSON.stringify(logos));
|
|
229
|
-
}
|
|
230
|
-
return jsonResponse({ ok: true });
|
|
231
|
-
}
|
|
232
|
-
// ─── Theme ─────────────────────────────────────────────────────────
|
|
233
|
-
async getTheme() {
|
|
234
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
235
|
-
const raw = await this.options.store.getSetting(instanceDid, "app:theme");
|
|
236
|
-
return jsonResponse({ theme: raw ? JSON.parse(raw) : {} });
|
|
237
|
-
}
|
|
238
|
-
async updateTheme(request) {
|
|
239
|
-
const body = await request.json();
|
|
240
|
-
const { theme } = body;
|
|
241
|
-
if (!theme)
|
|
242
|
-
return jsonResponse({ error: "Missing theme" }, 400);
|
|
243
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
244
|
-
// Check locked
|
|
245
|
-
const existingRaw = await this.options.store.getSetting(instanceDid, "app:theme");
|
|
246
|
-
const existing = existingRaw ? JSON.parse(existingRaw) : {};
|
|
247
|
-
if (existing.meta?.locked && theme.concepts) {
|
|
248
|
-
return jsonResponse({ error: "Theme is locked" }, 403);
|
|
249
|
-
}
|
|
250
|
-
// Merge update
|
|
251
|
-
const merged = { ...existing, ...theme };
|
|
252
|
-
await this.options.store.setSetting(instanceDid, "app:theme", JSON.stringify(merged));
|
|
253
|
-
return jsonResponse({ ok: true });
|
|
254
|
-
}
|
|
255
|
-
// ─── Theme anti-FOUC ──────────────────────────────────────────────
|
|
256
|
-
async serveThemeStyles() {
|
|
257
|
-
const theme = await this.getFormattedTheme();
|
|
258
|
-
const bgLight = theme.light?.palette?.background?.default || "#fff";
|
|
259
|
-
const textLight = theme.light?.palette?.text?.primary || "rgba(0,0,0,0.87)";
|
|
260
|
-
const bgDark = theme.dark?.palette?.background?.default || "#121212";
|
|
261
|
-
const textDark = theme.dark?.palette?.text?.primary || "#fff";
|
|
262
|
-
// Sanitize color values — only allow safe CSS color characters
|
|
263
|
-
const sanitize = (v) => v.replace(/[^a-zA-Z0-9#(),.\s%]/g, "");
|
|
264
|
-
const css = `:root { --blocklet-background-default-color: ${sanitize(bgLight)}; --blocklet-text-primary-color: ${sanitize(textLight)}; }
|
|
265
|
-
[data-theme='dark'] { --blocklet-background-default-color: ${sanitize(bgDark)}; --blocklet-text-primary-color: ${sanitize(textDark)}; }
|
|
266
|
-
html, body { background-color: var(--blocklet-background-default-color); color: var(--blocklet-text-primary-color); transition: background-color 0.2s, color 0.2s; }`;
|
|
267
|
-
return new Response(css, {
|
|
268
|
-
headers: { "Content-Type": "text/css", "Cache-Control": "public, max-age=60" },
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
async serveThemeInit() {
|
|
272
|
-
const theme = await this.getFormattedTheme();
|
|
273
|
-
// Whitelist validation — prevent XSS injection (prefer is embedded in JS string)
|
|
274
|
-
const allowed = ["light", "dark", "system"];
|
|
275
|
-
const prefer = allowed.includes(theme.prefer) ? theme.prefer : "system";
|
|
276
|
-
const js = `(function(){
|
|
277
|
-
var p = '${prefer}';
|
|
278
|
-
var isDark = false;
|
|
279
|
-
if (p === 'dark') isDark = true;
|
|
280
|
-
else if (p === 'system') {
|
|
281
|
-
var stored = localStorage.getItem('blocklet_theme_prefer');
|
|
282
|
-
if (stored === 'dark') isDark = true;
|
|
283
|
-
else if (!stored && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) isDark = true;
|
|
284
|
-
}
|
|
285
|
-
if (isDark) document.documentElement.setAttribute('data-theme', 'dark');
|
|
286
|
-
else document.documentElement.removeAttribute('data-theme');
|
|
287
|
-
})();`;
|
|
288
|
-
return new Response(js, {
|
|
289
|
-
headers: { "Content-Type": "application/javascript", "Cache-Control": "public, max-age=60" },
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
async getFormattedTheme() {
|
|
293
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
294
|
-
const raw = await this.options.store.getSetting(instanceDid, "app:theme");
|
|
295
|
-
if (!raw)
|
|
296
|
-
return {};
|
|
297
|
-
const parsed = JSON.parse(raw);
|
|
298
|
-
return formatThemeForOutput(parsed);
|
|
299
|
-
}
|
|
300
|
-
// ─── Navigation ────────────────────────────────────────────────────
|
|
301
|
-
async getNavigation() {
|
|
302
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
303
|
-
const raw = await this.options.store.getSetting(instanceDid, "app:navigation");
|
|
304
|
-
return jsonResponse({ navigation: raw ? JSON.parse(raw) : [] });
|
|
305
|
-
}
|
|
306
|
-
async updateNavigation(request) {
|
|
307
|
-
const body = await request.json();
|
|
308
|
-
const { navigation } = body;
|
|
309
|
-
if (!Array.isArray(navigation)) {
|
|
310
|
-
return jsonResponse({ error: "navigation must be an array" }, 400);
|
|
311
|
-
}
|
|
312
|
-
const instanceDid = this.options.instanceDid || "_global_";
|
|
313
|
-
await this.options.store.setSetting(instanceDid, "app:navigation", JSON.stringify(navigation));
|
|
314
|
-
return jsonResponse({ ok: true });
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
function toCamelCase(str) {
|
|
318
|
-
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
319
|
-
}
|
|
320
|
-
function jsonResponse(data, status = 200) {
|
|
321
|
-
return new Response(JSON.stringify(data), {
|
|
322
|
-
status,
|
|
323
|
-
headers: { "Content-Type": "application/json" },
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
//# sourceMappingURL=branding-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"branding-handler.js","sourceRoot":"","sources":["../src/branding-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* D1TokenStorage — DID Connect token storage backed by D1 (strongly consistent).
|
|
3
|
-
*
|
|
4
|
-
* Drop-in replacement for CloudflareKVStorage. D1 is a single-writer database
|
|
5
|
-
* with consistent reads, avoiding the KV eventual consistency problem where
|
|
6
|
-
* browser polls and wallet writes hit different edge nodes.
|
|
7
|
-
*
|
|
8
|
-
* The `connect_tokens` table schema is managed by D1Store (SCHEMA_SQL).
|
|
9
|
-
* Expired rows are cleaned up lazily on read and probabilistically on create().
|
|
10
|
-
*/
|
|
11
|
-
import { EventEmitter } from "events";
|
|
12
|
-
export interface D1TokenStorageOptions {
|
|
13
|
-
/** TTL in seconds for token entries. Default: 300 (5 minutes) */
|
|
14
|
-
ttl?: number;
|
|
15
|
-
}
|
|
16
|
-
export declare class D1TokenStorage extends EventEmitter {
|
|
17
|
-
private db;
|
|
18
|
-
private ttl;
|
|
19
|
-
constructor(db: D1Database, options?: D1TokenStorageOptions);
|
|
20
|
-
create(token: string, status?: string): Promise<{
|
|
21
|
-
token: string;
|
|
22
|
-
status: string;
|
|
23
|
-
}>;
|
|
24
|
-
read(token: string): Promise<any>;
|
|
25
|
-
update(token: string, updates: Record<string, any>): Promise<any>;
|
|
26
|
-
delete(token: string): Promise<void>;
|
|
27
|
-
exist(token: string, did?: string): Promise<boolean>;
|
|
28
|
-
/** Remove expired rows. Called probabilistically from create(). */
|
|
29
|
-
private cleanup;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=d1-token-storage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"d1-token-storage.d.ts","sourceRoot":"","sources":["../src/d1-token-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,GAAG,CAAS;gBAER,EAAE,EAAE,UAAU,EAAE,OAAO,GAAE,qBAA0B;IAMzD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAY;;;;IAexC,IAAI,CAAC,KAAK,EAAE,MAAM;IAclB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAelD,MAAM,CAAC,KAAK,EAAE,MAAM;IAQpB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAOvC,mEAAmE;YACrD,OAAO;CAItB"}
|