@voyant-travel/auth 0.113.3
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/LICENSE +201 -0
- package/README.md +225 -0
- package/dist/api-token-rotation.d.ts +54 -0
- package/dist/api-token-rotation.d.ts.map +1 -0
- package/dist/api-token-rotation.js +134 -0
- package/dist/api-token-rotation.js.map +1 -0
- package/dist/auth-facades.d.ts +62 -0
- package/dist/auth-facades.d.ts.map +1 -0
- package/dist/auth-facades.js +252 -0
- package/dist/auth-facades.js.map +1 -0
- package/dist/backend.d.ts +10 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +15 -0
- package/dist/backend.js.map +1 -0
- package/dist/cloud-admin-session-public.d.ts +67 -0
- package/dist/cloud-admin-session-public.d.ts.map +1 -0
- package/dist/cloud-admin-session-public.js +2 -0
- package/dist/cloud-admin-session-public.js.map +1 -0
- package/dist/cloud-admin-session-revalidation-store.d.ts +17 -0
- package/dist/cloud-admin-session-revalidation-store.d.ts.map +1 -0
- package/dist/cloud-admin-session-revalidation-store.js +64 -0
- package/dist/cloud-admin-session-revalidation-store.js.map +1 -0
- package/dist/cloud-admin-session.d.ts +70 -0
- package/dist/cloud-admin-session.d.ts.map +1 -0
- package/dist/cloud-admin-session.js +319 -0
- package/dist/cloud-admin-session.js.map +1 -0
- package/dist/cloud-broker/assertion.d.ts +69 -0
- package/dist/cloud-broker/assertion.d.ts.map +1 -0
- package/dist/cloud-broker/assertion.js +226 -0
- package/dist/cloud-broker/assertion.js.map +1 -0
- package/dist/cloud-broker/state.d.ts +55 -0
- package/dist/cloud-broker/state.d.ts.map +1 -0
- package/dist/cloud-broker/state.js +191 -0
- package/dist/cloud-broker/state.js.map +1 -0
- package/dist/cloud-broker/utils.d.ts +7 -0
- package/dist/cloud-broker/utils.d.ts.map +1 -0
- package/dist/cloud-broker/utils.js +50 -0
- package/dist/cloud-broker/utils.js.map +1 -0
- package/dist/cloud-broker.d.ts +5 -0
- package/dist/cloud-broker.d.ts.map +1 -0
- package/dist/cloud-broker.js +3 -0
- package/dist/cloud-broker.js.map +1 -0
- package/dist/edge.d.ts +28 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +106 -0
- package/dist/edge.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions.d.ts +141 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +46 -0
- package/dist/permissions.js.map +1 -0
- package/dist/server.d.ts +106 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +193 -0
- package/dist/server.js.map +1 -0
- package/dist/trusted-origins.d.ts +9 -0
- package/dist/trusted-origins.d.ts.map +1 -0
- package/dist/trusted-origins.js +41 -0
- package/dist/trusted-origins.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/workspace.d.ts +43 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +146 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE = "voyant-cloud-admin-auth";
|
|
2
|
+
export type CloudAdminAuthStartConfig = {
|
|
3
|
+
cloudAuthStartUrl: string;
|
|
4
|
+
deploymentId: string;
|
|
5
|
+
adminCallbackUrl: string;
|
|
6
|
+
cookieSecret: string;
|
|
7
|
+
appId?: string | null;
|
|
8
|
+
environment?: string | null;
|
|
9
|
+
surface?: string | null;
|
|
10
|
+
stateTtlSeconds?: number;
|
|
11
|
+
};
|
|
12
|
+
export type CloudAdminAuthState = {
|
|
13
|
+
state: string;
|
|
14
|
+
nonce: string;
|
|
15
|
+
deploymentId: string;
|
|
16
|
+
redirectUri: string;
|
|
17
|
+
next: string;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
};
|
|
20
|
+
export type CreateCloudAdminAuthStartInput = {
|
|
21
|
+
requestUrl: string;
|
|
22
|
+
next?: string | null;
|
|
23
|
+
config: CloudAdminAuthStartConfig;
|
|
24
|
+
now?: Date;
|
|
25
|
+
randomState?: string;
|
|
26
|
+
randomNonce?: string;
|
|
27
|
+
};
|
|
28
|
+
export type CreateCloudAdminAuthStartResult = {
|
|
29
|
+
redirectUrl: string;
|
|
30
|
+
state: CloudAdminAuthState;
|
|
31
|
+
setCookie: string;
|
|
32
|
+
};
|
|
33
|
+
export type VerifyCloudAdminAuthCallbackInput = {
|
|
34
|
+
requestUrl: string;
|
|
35
|
+
cookieHeader?: string | null;
|
|
36
|
+
cookieSecret: string;
|
|
37
|
+
now?: Date;
|
|
38
|
+
};
|
|
39
|
+
export type VerifyCloudAdminAuthCallbackResult = {
|
|
40
|
+
ok: true;
|
|
41
|
+
code: string;
|
|
42
|
+
state: CloudAdminAuthState;
|
|
43
|
+
clearCookie: string;
|
|
44
|
+
} | {
|
|
45
|
+
ok: false;
|
|
46
|
+
error: "cloud_error" | "invalid_request" | "invalid_state" | "expired_state";
|
|
47
|
+
description?: string;
|
|
48
|
+
cloudError?: string;
|
|
49
|
+
clearCookie: string;
|
|
50
|
+
};
|
|
51
|
+
export declare function createCloudAdminAuthStart({ requestUrl, next, config, now, randomState, randomNonce, }: CreateCloudAdminAuthStartInput): Promise<CreateCloudAdminAuthStartResult>;
|
|
52
|
+
export declare function verifyCloudAdminAuthCallback({ requestUrl, cookieHeader, cookieSecret, now, }: VerifyCloudAdminAuthCallbackInput): Promise<VerifyCloudAdminAuthCallbackResult>;
|
|
53
|
+
export declare function normalizeCloudAdminAuthNext(next: string | null | undefined, adminOrigin: string): string;
|
|
54
|
+
export declare function buildClearCloudAdminAuthStateCookie(secure: boolean, path?: string): string;
|
|
55
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/cloud-broker/state.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oCAAoC,4BAA4B,CAAA;AAK7E,MAAM,MAAM,yBAAyB,GAAG;IACtC,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,yBAAyB,CAAA;IACjC,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,mBAAmB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,IAAI,CAAA;CACX,CAAA;AAED,MAAM,MAAM,kCAAkC,GAC1C;IACE,EAAE,EAAE,IAAI,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,mBAAmB,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;CACpB,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAA;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAEL,wBAAsB,yBAAyB,CAAC,EAC9C,UAAU,EACV,IAAI,EACJ,MAAM,EACN,GAAgB,EAChB,WAAW,EACX,WAAW,GACZ,EAAE,8BAA8B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAuC3E;AAED,wBAAsB,4BAA4B,CAAC,EACjD,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,GAAgB,GACjB,EAAE,iCAAiC,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAwCjF;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAClB,MAAM,CAeR;AAED,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,SAAgB,GAAG,MAAM,CAQjG"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { base64UrlDecode, base64UrlEncode, isRecord, normalizeAbsoluteUrl, timingSafeEqual, } from "./utils.js";
|
|
2
|
+
export const VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE = "voyant-cloud-admin-auth";
|
|
3
|
+
const DEFAULT_STATE_TTL_SECONDS = 300;
|
|
4
|
+
const RANDOM_BYTES = 32;
|
|
5
|
+
export async function createCloudAdminAuthStart({ requestUrl, next, config, now = new Date(), randomState, randomNonce, }) {
|
|
6
|
+
validateStartConfig(config);
|
|
7
|
+
const parsedRequestUrl = new URL(requestUrl);
|
|
8
|
+
const ttlSeconds = config.stateTtlSeconds ?? DEFAULT_STATE_TTL_SECONDS;
|
|
9
|
+
const state = {
|
|
10
|
+
state: randomState ?? randomToken(),
|
|
11
|
+
nonce: randomNonce ?? randomToken(),
|
|
12
|
+
deploymentId: config.deploymentId.trim(),
|
|
13
|
+
redirectUri: normalizeAbsoluteUrl(config.adminCallbackUrl, "adminCallbackUrl"),
|
|
14
|
+
next: normalizeCloudAdminAuthNext(next, parsedRequestUrl.origin),
|
|
15
|
+
expiresAt: now.getTime() + ttlSeconds * 1000,
|
|
16
|
+
};
|
|
17
|
+
const redirectUrl = new URL(config.cloudAuthStartUrl);
|
|
18
|
+
redirectUrl.searchParams.set("deployment_id", state.deploymentId);
|
|
19
|
+
redirectUrl.searchParams.set("redirect_uri", state.redirectUri);
|
|
20
|
+
redirectUrl.searchParams.set("state", state.state);
|
|
21
|
+
redirectUrl.searchParams.set("nonce", state.nonce);
|
|
22
|
+
redirectUrl.searchParams.set("surface", config.surface?.trim() || "admin");
|
|
23
|
+
redirectUrl.searchParams.set("next", state.next);
|
|
24
|
+
if (config.appId?.trim()) {
|
|
25
|
+
redirectUrl.searchParams.set("app_id", config.appId.trim());
|
|
26
|
+
}
|
|
27
|
+
if (config.environment?.trim()) {
|
|
28
|
+
redirectUrl.searchParams.set("environment", config.environment.trim());
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
redirectUrl: redirectUrl.toString(),
|
|
32
|
+
state,
|
|
33
|
+
setCookie: await buildCloudAdminAuthStateCookie({
|
|
34
|
+
state,
|
|
35
|
+
secret: config.cookieSecret,
|
|
36
|
+
secure: parsedRequestUrl.protocol === "https:",
|
|
37
|
+
path: cloudAuthCookiePath(new URL(state.redirectUri).pathname),
|
|
38
|
+
maxAgeSeconds: ttlSeconds,
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export async function verifyCloudAdminAuthCallback({ requestUrl, cookieHeader, cookieSecret, now = new Date(), }) {
|
|
43
|
+
assertUsableSecret(cookieSecret);
|
|
44
|
+
const url = new URL(requestUrl);
|
|
45
|
+
const clearCookie = buildClearCloudAdminAuthStateCookie(url.protocol === "https:", cloudAuthCookiePath(url.pathname));
|
|
46
|
+
const cloudError = url.searchParams.get("error");
|
|
47
|
+
if (cloudError) {
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
error: "cloud_error",
|
|
51
|
+
cloudError,
|
|
52
|
+
description: url.searchParams.get("error_description") ?? undefined,
|
|
53
|
+
clearCookie,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const stateParam = url.searchParams.get("state");
|
|
57
|
+
const code = url.searchParams.get("code");
|
|
58
|
+
if (!stateParam || !code) {
|
|
59
|
+
return { ok: false, error: "invalid_request", clearCookie };
|
|
60
|
+
}
|
|
61
|
+
const stateCookie = readCookie(cookieHeader, VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE);
|
|
62
|
+
if (!stateCookie) {
|
|
63
|
+
return { ok: false, error: "invalid_state", clearCookie };
|
|
64
|
+
}
|
|
65
|
+
const state = await verifyCloudAdminAuthStateCookie(stateCookie, cookieSecret);
|
|
66
|
+
if (!state || state.state !== stateParam) {
|
|
67
|
+
return { ok: false, error: "invalid_state", clearCookie };
|
|
68
|
+
}
|
|
69
|
+
if (state.expiresAt <= now.getTime()) {
|
|
70
|
+
return { ok: false, error: "expired_state", clearCookie };
|
|
71
|
+
}
|
|
72
|
+
return { ok: true, code, state, clearCookie };
|
|
73
|
+
}
|
|
74
|
+
export function normalizeCloudAdminAuthNext(next, adminOrigin) {
|
|
75
|
+
const value = next?.trim();
|
|
76
|
+
if (!value)
|
|
77
|
+
return "/";
|
|
78
|
+
if (value.startsWith("/") && !value.startsWith("//")) {
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const url = new URL(value);
|
|
83
|
+
if (url.origin !== adminOrigin)
|
|
84
|
+
return "/";
|
|
85
|
+
return `${url.pathname}${url.search}${url.hash}` || "/";
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return "/";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function buildClearCloudAdminAuthStateCookie(secure, path = "/auth/cloud") {
|
|
92
|
+
return serializeCookie(VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE, "", {
|
|
93
|
+
httpOnly: true,
|
|
94
|
+
maxAge: 0,
|
|
95
|
+
path,
|
|
96
|
+
sameSite: "Lax",
|
|
97
|
+
secure,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async function buildCloudAdminAuthStateCookie({ state, secret, secure, path, maxAgeSeconds, }) {
|
|
101
|
+
const payload = base64UrlEncode(new TextEncoder().encode(JSON.stringify(state)));
|
|
102
|
+
const signature = await hmac(payload, secret);
|
|
103
|
+
return serializeCookie(VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE, `${payload}.${signature}`, {
|
|
104
|
+
httpOnly: true,
|
|
105
|
+
maxAge: maxAgeSeconds,
|
|
106
|
+
path,
|
|
107
|
+
sameSite: "Lax",
|
|
108
|
+
secure,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function verifyCloudAdminAuthStateCookie(cookieValue, secret) {
|
|
112
|
+
const [payload, signature, ...rest] = cookieValue.split(".");
|
|
113
|
+
if (!payload || !signature || rest.length > 0)
|
|
114
|
+
return null;
|
|
115
|
+
const expectedSignature = await hmac(payload, secret);
|
|
116
|
+
if (!timingSafeEqual(signature, expectedSignature))
|
|
117
|
+
return null;
|
|
118
|
+
const parsed = JSON.parse(new TextDecoder().decode(base64UrlDecode(payload)));
|
|
119
|
+
if (!isCloudAdminAuthState(parsed))
|
|
120
|
+
return null;
|
|
121
|
+
return parsed;
|
|
122
|
+
}
|
|
123
|
+
function validateStartConfig(config) {
|
|
124
|
+
assertUsableSecret(config.cookieSecret);
|
|
125
|
+
normalizeAbsoluteUrl(config.cloudAuthStartUrl, "cloudAuthStartUrl");
|
|
126
|
+
normalizeAbsoluteUrl(config.adminCallbackUrl, "adminCallbackUrl");
|
|
127
|
+
if (!config.deploymentId.trim()) {
|
|
128
|
+
throw new Error("Voyant Cloud auth requires deploymentId");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function assertUsableSecret(secret) {
|
|
132
|
+
if (!secret || secret.length < 32) {
|
|
133
|
+
throw new Error("Voyant Cloud auth requires a cookie secret with at least 32 characters");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function isCloudAdminAuthState(value) {
|
|
137
|
+
if (!isRecord(value))
|
|
138
|
+
return false;
|
|
139
|
+
return (typeof value.state === "string" &&
|
|
140
|
+
typeof value.nonce === "string" &&
|
|
141
|
+
typeof value.deploymentId === "string" &&
|
|
142
|
+
typeof value.redirectUri === "string" &&
|
|
143
|
+
typeof value.next === "string" &&
|
|
144
|
+
typeof value.expiresAt === "number");
|
|
145
|
+
}
|
|
146
|
+
function readCookie(cookieHeader, name) {
|
|
147
|
+
if (!cookieHeader)
|
|
148
|
+
return null;
|
|
149
|
+
for (const part of cookieHeader.split(";")) {
|
|
150
|
+
const [rawName, ...rawValue] = part.trim().split("=");
|
|
151
|
+
if (rawName === name)
|
|
152
|
+
return rawValue.join("=");
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function cloudAuthCookiePath(pathname) {
|
|
157
|
+
const normalized = pathname.replace(/\/+$/, "") || "/";
|
|
158
|
+
const marker = "/auth/cloud/";
|
|
159
|
+
const markerIndex = normalized.indexOf(marker);
|
|
160
|
+
if (markerIndex >= 0) {
|
|
161
|
+
return normalized.slice(0, markerIndex + marker.length - 1) || "/auth/cloud";
|
|
162
|
+
}
|
|
163
|
+
if (normalized.endsWith("/auth/cloud")) {
|
|
164
|
+
return normalized;
|
|
165
|
+
}
|
|
166
|
+
return "/auth/cloud";
|
|
167
|
+
}
|
|
168
|
+
function serializeCookie(name, value, options) {
|
|
169
|
+
const parts = [
|
|
170
|
+
`${name}=${value}`,
|
|
171
|
+
`Max-Age=${options.maxAge}`,
|
|
172
|
+
`Path=${options.path}`,
|
|
173
|
+
`SameSite=${options.sameSite}`,
|
|
174
|
+
];
|
|
175
|
+
if (options.httpOnly)
|
|
176
|
+
parts.push("HttpOnly");
|
|
177
|
+
if (options.secure)
|
|
178
|
+
parts.push("Secure");
|
|
179
|
+
return parts.join("; ");
|
|
180
|
+
}
|
|
181
|
+
function randomToken() {
|
|
182
|
+
const bytes = new Uint8Array(RANDOM_BYTES);
|
|
183
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
184
|
+
return base64UrlEncode(bytes);
|
|
185
|
+
}
|
|
186
|
+
async function hmac(value, secret) {
|
|
187
|
+
const key = await globalThis.crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
188
|
+
const signature = await globalThis.crypto.subtle.sign("HMAC", key, new TextEncoder().encode(value));
|
|
189
|
+
return base64UrlEncode(new Uint8Array(signature));
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/cloud-broker/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function normalizeAbsoluteUrl(value: string, label: string): string;
|
|
2
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
3
|
+
export declare function base64UrlEncode(bytes: Uint8Array): string;
|
|
4
|
+
export declare function base64UrlDecode(value: string): Uint8Array;
|
|
5
|
+
export declare function toArrayBuffer(bytes: Uint8Array): ArrayBuffer;
|
|
6
|
+
export declare function timingSafeEqual(left: string, right: string): boolean;
|
|
7
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cloud-broker/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAWzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAI5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUpE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function normalizeAbsoluteUrl(value, label) {
|
|
2
|
+
const trimmed = value.trim();
|
|
3
|
+
if (!trimmed) {
|
|
4
|
+
throw new Error(`Voyant Cloud auth requires ${label}`);
|
|
5
|
+
}
|
|
6
|
+
const url = new URL(trimmed);
|
|
7
|
+
if (url.protocol !== "https:" && url.hostname !== "localhost" && url.hostname !== "127.0.0.1") {
|
|
8
|
+
throw new Error(`Voyant Cloud auth ${label} must use HTTPS outside localhost`);
|
|
9
|
+
}
|
|
10
|
+
return url.toString();
|
|
11
|
+
}
|
|
12
|
+
export function isRecord(value) {
|
|
13
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
export function base64UrlEncode(bytes) {
|
|
16
|
+
let binary = "";
|
|
17
|
+
for (const byte of bytes) {
|
|
18
|
+
binary += String.fromCharCode(byte);
|
|
19
|
+
}
|
|
20
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
21
|
+
}
|
|
22
|
+
export function base64UrlDecode(value) {
|
|
23
|
+
const padded = value
|
|
24
|
+
.replace(/-/g, "+")
|
|
25
|
+
.replace(/_/g, "/")
|
|
26
|
+
.padEnd(Math.ceil(value.length / 4) * 4, "=");
|
|
27
|
+
const binary = atob(padded);
|
|
28
|
+
const bytes = new Uint8Array(binary.length);
|
|
29
|
+
for (let i = 0; i < binary.length; i += 1) {
|
|
30
|
+
bytes[i] = binary.charCodeAt(i);
|
|
31
|
+
}
|
|
32
|
+
return bytes;
|
|
33
|
+
}
|
|
34
|
+
export function toArrayBuffer(bytes) {
|
|
35
|
+
const buffer = new ArrayBuffer(bytes.byteLength);
|
|
36
|
+
new Uint8Array(buffer).set(bytes);
|
|
37
|
+
return buffer;
|
|
38
|
+
}
|
|
39
|
+
export function timingSafeEqual(left, right) {
|
|
40
|
+
const leftBytes = new TextEncoder().encode(left);
|
|
41
|
+
const rightBytes = new TextEncoder().encode(right);
|
|
42
|
+
if (leftBytes.length !== rightBytes.length)
|
|
43
|
+
return false;
|
|
44
|
+
let diff = 0;
|
|
45
|
+
for (let i = 0; i < leftBytes.length; i += 1) {
|
|
46
|
+
diff |= leftBytes[i] ^ rightBytes[i];
|
|
47
|
+
}
|
|
48
|
+
return diff === 0;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cloud-broker/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { CloudAdminAssertion, CloudAdminAuthExchangeConfig, CloudAdminAuthRevalidateConfig, CloudAdminAuthRevalidationResult, ExchangeCloudAdminAuthCodeInput, RevalidateCloudAdminAuthAccessInput, } from "./cloud-broker/assertion.js";
|
|
2
|
+
export { exchangeCloudAdminAuthCode, revalidateCloudAdminAuthAccess, VOYANT_CLOUD_ADMIN_ASSERTION_ISSUER, verifyCloudAdminAssertion, } from "./cloud-broker/assertion.js";
|
|
3
|
+
export type { CloudAdminAuthStartConfig, CloudAdminAuthState, CreateCloudAdminAuthStartInput, CreateCloudAdminAuthStartResult, VerifyCloudAdminAuthCallbackInput, VerifyCloudAdminAuthCallbackResult, } from "./cloud-broker/state.js";
|
|
4
|
+
export { buildClearCloudAdminAuthStateCookie, createCloudAdminAuthStart, normalizeCloudAdminAuthNext, VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE, verifyCloudAdminAuthCallback, } from "./cloud-broker/state.js";
|
|
5
|
+
//# sourceMappingURL=cloud-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-broker.d.ts","sourceRoot":"","sources":["../src/cloud-broker.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC9B,gCAAgC,EAChC,+BAA+B,EAC/B,mCAAmC,GACpC,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,+BAA+B,EAC/B,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,oCAAoC,EACpC,4BAA4B,GAC7B,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { exchangeCloudAdminAuthCode, revalidateCloudAdminAuthAccess, VOYANT_CLOUD_ADMIN_ASSERTION_ISSUER, verifyCloudAdminAssertion, } from "./cloud-broker/assertion.js";
|
|
2
|
+
export { buildClearCloudAdminAuthStateCookie, createCloudAdminAuthStart, normalizeCloudAdminAuthNext, VOYANT_CLOUD_ADMIN_AUTH_STATE_COOKIE, verifyCloudAdminAuthCallback, } from "./cloud-broker/state.js";
|
|
3
|
+
//# sourceMappingURL=cloud-broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-broker.js","sourceRoot":"","sources":["../src/cloud-broker.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,6BAA6B,CAAA;AASpC,OAAO,EACL,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,oCAAoC,EACpC,4BAA4B,GAC7B,MAAM,yBAAyB,CAAA"}
|
package/dist/edge.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge-compatible session check for Next.js middleware.
|
|
3
|
+
*
|
|
4
|
+
* Does NOT import better-auth (which uses eval / new Function via
|
|
5
|
+
* createTelemetry, incompatible with Edge Runtime).
|
|
6
|
+
*
|
|
7
|
+
* Instead it reads the session cookie, unsigns it using the same
|
|
8
|
+
* HMAC-SHA256 scheme that better-call uses, and queries better-auth's
|
|
9
|
+
* `session` + `user` tables directly via the Neon HTTP drizzle adapter.
|
|
10
|
+
*
|
|
11
|
+
* With the identity table collapse, authUser.id IS the userId —
|
|
12
|
+
* no extra identity lookup required.
|
|
13
|
+
*/
|
|
14
|
+
type AuthContext = {
|
|
15
|
+
userId: string | null;
|
|
16
|
+
email: string | null;
|
|
17
|
+
sessionId: string | null;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Lightweight edge-compatible session check.
|
|
21
|
+
* Safe to call from Next.js middleware.
|
|
22
|
+
*
|
|
23
|
+
* Returns `userId` which is Better Auth's `user.id` — the single
|
|
24
|
+
* canonical user identifier after the identity table collapse.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAuthContextFromHeaders(headers: Headers): Promise<AuthContext>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=edge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkEH,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAQD;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BtF"}
|
package/dist/edge.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge-compatible session check for Next.js middleware.
|
|
3
|
+
*
|
|
4
|
+
* Does NOT import better-auth (which uses eval / new Function via
|
|
5
|
+
* createTelemetry, incompatible with Edge Runtime).
|
|
6
|
+
*
|
|
7
|
+
* Instead it reads the session cookie, unsigns it using the same
|
|
8
|
+
* HMAC-SHA256 scheme that better-call uses, and queries better-auth's
|
|
9
|
+
* `session` + `user` tables directly via the Neon HTTP drizzle adapter.
|
|
10
|
+
*
|
|
11
|
+
* With the identity table collapse, authUser.id IS the userId —
|
|
12
|
+
* no extra identity lookup required.
|
|
13
|
+
*/
|
|
14
|
+
import { getDb } from "@voyant-travel/db";
|
|
15
|
+
import { authSession, authUser } from "@voyant-travel/db/schema/iam";
|
|
16
|
+
import { and, eq, gt } from "drizzle-orm";
|
|
17
|
+
const SESSION_COOKIE_NAME = "better-auth.session_token";
|
|
18
|
+
function getAuthSecret() {
|
|
19
|
+
return process.env.BETTER_AUTH_SECRET || process.env.SESSION_CLAIMS_SECRET || "";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Unsign a Better Auth cookie value.
|
|
23
|
+
*
|
|
24
|
+
* Better Auth (via better-call) signs cookies as:
|
|
25
|
+
* encodeURIComponent(value + "." + base64(HMAC-SHA256(value, secret)))
|
|
26
|
+
*
|
|
27
|
+
* This function reverses that: URL-decode, split at last ".",
|
|
28
|
+
* verify the HMAC-SHA256 signature, and return the raw value.
|
|
29
|
+
*/
|
|
30
|
+
async function unsignCookie(rawCookieValue, secret) {
|
|
31
|
+
const decoded = decodeURIComponent(rawCookieValue);
|
|
32
|
+
const lastDot = decoded.lastIndexOf(".");
|
|
33
|
+
if (lastDot < 1)
|
|
34
|
+
return null;
|
|
35
|
+
const value = decoded.substring(0, lastDot);
|
|
36
|
+
const signature = decoded.substring(lastDot + 1);
|
|
37
|
+
// Better Auth signatures are 44-char base64 strings ending with "="
|
|
38
|
+
if (signature.length !== 44 || !signature.endsWith("="))
|
|
39
|
+
return null;
|
|
40
|
+
const encoder = new TextEncoder();
|
|
41
|
+
const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
|
|
42
|
+
const sigBinStr = atob(signature);
|
|
43
|
+
const sigBytes = new Uint8Array(sigBinStr.length);
|
|
44
|
+
for (let i = 0; i < sigBinStr.length; i++)
|
|
45
|
+
sigBytes[i] = sigBinStr.charCodeAt(i);
|
|
46
|
+
const valid = await crypto.subtle.verify("HMAC", key, sigBytes, encoder.encode(value));
|
|
47
|
+
return valid ? value : null;
|
|
48
|
+
}
|
|
49
|
+
function getRawCookieValue(headers) {
|
|
50
|
+
const cookieHeader = headers.get("cookie");
|
|
51
|
+
if (!cookieHeader)
|
|
52
|
+
return null;
|
|
53
|
+
for (const part of cookieHeader.split(";")) {
|
|
54
|
+
const trimmed = part.trim();
|
|
55
|
+
const eqIdx = trimmed.indexOf("=");
|
|
56
|
+
if (eqIdx === -1)
|
|
57
|
+
continue;
|
|
58
|
+
const name = trimmed.slice(0, eqIdx).trim();
|
|
59
|
+
if (name === SESSION_COOKIE_NAME) {
|
|
60
|
+
return trimmed.slice(eqIdx + 1).trim() || null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const EMPTY = {
|
|
66
|
+
userId: null,
|
|
67
|
+
email: null,
|
|
68
|
+
sessionId: null,
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Lightweight edge-compatible session check.
|
|
72
|
+
* Safe to call from Next.js middleware.
|
|
73
|
+
*
|
|
74
|
+
* Returns `userId` which is Better Auth's `user.id` — the single
|
|
75
|
+
* canonical user identifier after the identity table collapse.
|
|
76
|
+
*/
|
|
77
|
+
export async function getAuthContextFromHeaders(headers) {
|
|
78
|
+
const rawCookie = getRawCookieValue(headers);
|
|
79
|
+
if (!rawCookie)
|
|
80
|
+
return EMPTY;
|
|
81
|
+
const secret = getAuthSecret();
|
|
82
|
+
if (!secret)
|
|
83
|
+
return EMPTY;
|
|
84
|
+
const token = await unsignCookie(rawCookie, secret);
|
|
85
|
+
if (!token)
|
|
86
|
+
return EMPTY;
|
|
87
|
+
const db = getDb("edge");
|
|
88
|
+
const [row] = await db
|
|
89
|
+
.select({
|
|
90
|
+
sessionId: authSession.id,
|
|
91
|
+
userId: authSession.userId,
|
|
92
|
+
email: authUser.email,
|
|
93
|
+
})
|
|
94
|
+
.from(authSession)
|
|
95
|
+
.innerJoin(authUser, eq(authUser.id, authSession.userId))
|
|
96
|
+
.where(and(eq(authSession.token, token), gt(authSession.expiresAt, new Date())))
|
|
97
|
+
.limit(1);
|
|
98
|
+
if (!row)
|
|
99
|
+
return EMPTY;
|
|
100
|
+
return {
|
|
101
|
+
userId: row.userId,
|
|
102
|
+
email: row.email,
|
|
103
|
+
sessionId: row.sessionId,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=edge.js.map
|
package/dist/edge.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type RouteContext = {
|
|
2
|
+
siteId?: string;
|
|
3
|
+
organizationType?: "live" | "sandbox" | null;
|
|
4
|
+
};
|
|
5
|
+
export declare function isStaticPath(pathname: string): boolean;
|
|
6
|
+
export declare function isApiPath(_pathname: string): boolean;
|
|
7
|
+
export declare function isPublicPath(pathname: string): boolean;
|
|
8
|
+
export declare function attachOrganizationHeaders(headers: Headers, ctx: RouteContext): void;
|
|
9
|
+
export type VoyantSubdomain = {
|
|
10
|
+
type: "booking" | "customer";
|
|
11
|
+
slug: string;
|
|
12
|
+
isLocal: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseVoyantSubdomain(hostname: string): VoyantSubdomain | null;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;CAC7C,CAAA;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,WAE5C;AAGD,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,WAG1C;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,WAI5C;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,QAG5E;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,SAAS,GAAG,UAAU,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAwB7E"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function isStaticPath(pathname) {
|
|
2
|
+
return pathname.startsWith("/_next") || /\.(?:svg|png|jpg|jpeg|gif|webp|ico)$/.test(pathname);
|
|
3
|
+
}
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- owner: auth; existing suppression is intentional pending typed cleanup.
|
|
5
|
+
export function isApiPath(_pathname) {
|
|
6
|
+
// API routes should be evaluated by middleware for auth context propagation.
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
export function isPublicPath(pathname) {
|
|
10
|
+
return ["/login", "/auth", "/sign-in", "/sign-up", "/forgot-password", "/reset-password"].some((p) => pathname.startsWith(p));
|
|
11
|
+
}
|
|
12
|
+
export function attachOrganizationHeaders(headers, ctx) {
|
|
13
|
+
if (ctx.siteId)
|
|
14
|
+
headers.set("x-site-id", String(ctx.siteId));
|
|
15
|
+
if (ctx.organizationType)
|
|
16
|
+
headers.set("x-organization-type", ctx.organizationType);
|
|
17
|
+
}
|
|
18
|
+
export function parseVoyantSubdomain(hostname) {
|
|
19
|
+
const normalized = hostname.toLowerCase().split(":")[0] ?? "";
|
|
20
|
+
const prodMatch = normalized.match(/^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\.(booking|customer)\.voyantcloud\.app$/);
|
|
21
|
+
if (prodMatch?.[1] && prodMatch[2]) {
|
|
22
|
+
const slug = prodMatch[1];
|
|
23
|
+
const type = prodMatch[2];
|
|
24
|
+
if (slug.includes("--"))
|
|
25
|
+
return null;
|
|
26
|
+
return { type, slug, isLocal: false };
|
|
27
|
+
}
|
|
28
|
+
const localMatch = normalized.match(/^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\.(booking|customer)\.localhost$/);
|
|
29
|
+
if (localMatch?.[1] && localMatch[2]) {
|
|
30
|
+
const slug = localMatch[1];
|
|
31
|
+
const type = localMatch[2];
|
|
32
|
+
if (slug.includes("--"))
|
|
33
|
+
return null;
|
|
34
|
+
return { type, slug, isLocal: true };
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// NOTE: Do NOT re-export from ./server here.
|
|
39
|
+
// Those modules import better-auth which uses dynamic code evaluation
|
|
40
|
+
// (eval/new Function) incompatible with Edge Runtime middleware.
|
|
41
|
+
// Import it directly: @voyant-travel/auth/server
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,sCAAsC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC/F,CAAC;AAED,wIAAwI;AACxI,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,6EAA6E;IAC7E,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAC5F,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAC9B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,GAAiB;IAC3E,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5D,IAAI,GAAG,CAAC,gBAAgB;QAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;AACpF,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAE7D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAChC,2EAA2E,CAC5E,CAAA;IACD,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAA2B,CAAA;QACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CACjC,oEAAoE,CACrE,CAAA;IACD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAA2B,CAAA;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACtC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,6CAA6C;AAC7C,sEAAsE;AACtE,iEAAiE;AACjE,iDAAiD"}
|