@empire-builder-kit/runtime 0.0.1-alpha.9 → 1.0.0-beta.4
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 -21
- package/NOTICE +5 -0
- package/README.md +14 -23
- package/package.json +53 -97
- package/src/auth-backend.d.ts +44 -0
- package/src/auth-backend.js +158 -0
- package/src/auth-backend.js.map +1 -0
- package/src/auth-session.d.ts +175 -0
- package/src/auth-session.js +181 -0
- package/src/auth-session.js.map +1 -0
- package/src/auth-web.d.ts +79 -0
- package/src/auth-web.js +153 -0
- package/src/auth-web.js.map +1 -0
- package/src/auth.d.ts +143 -0
- package/src/auth.js +233 -0
- package/src/auth.js.map +1 -0
- package/{dist → src}/config.d.ts +0 -1
- package/{dist → src}/config.js +9 -21
- package/src/config.js.map +1 -0
- package/src/events.d.ts +74 -0
- package/src/events.js +149 -0
- package/src/events.js.map +1 -0
- package/{dist → src}/frontend.d.ts +1 -2
- package/src/frontend.js +62 -0
- package/src/frontend.js.map +1 -0
- package/src/hosts.d.ts +9 -0
- package/src/hosts.js +38 -0
- package/src/hosts.js.map +1 -0
- package/src/index.d.ts +15 -0
- package/src/index.js +30 -0
- package/src/index.js.map +1 -0
- package/src/lambda.d.ts +45 -0
- package/src/lambda.js +117 -0
- package/src/lambda.js.map +1 -0
- package/{dist → src}/logging.d.ts +0 -1
- package/src/logging.js +113 -0
- package/src/logging.js.map +1 -0
- package/{dist → src}/observability.d.ts +18 -1
- package/{dist → src}/observability.js +72 -62
- package/src/observability.js.map +1 -0
- package/{dist → src}/request-context.d.ts +12 -2
- package/src/request-context.js +68 -0
- package/src/request-context.js.map +1 -0
- package/{dist → src}/response.d.ts +0 -1
- package/src/response.js +66 -0
- package/src/response.js.map +1 -0
- package/dist/auth-backend.d.ts +0 -18
- package/dist/auth-backend.d.ts.map +0 -1
- package/dist/auth-backend.js +0 -57
- package/dist/auth-web.d.ts +0 -18
- package/dist/auth-web.d.ts.map +0 -1
- package/dist/auth-web.js +0 -32
- package/dist/auth.d.ts +0 -68
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -107
- package/dist/config.d.ts.map +0 -1
- package/dist/frontend.d.ts.map +0 -1
- package/dist/frontend.js +0 -64
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -23
- package/dist/logging.d.ts.map +0 -1
- package/dist/logging.js +0 -129
- package/dist/observability.d.ts.map +0 -1
- package/dist/request-context.d.ts.map +0 -1
- package/dist/request-context.js +0 -58
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -66
package/src/auth-web.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { isAuthError, toPrincipal, } from './auth.js';
|
|
3
|
+
import { createCognitoJwtVerifier, extractBearerToken, } from './auth-backend.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates Next.js middleware configuration for auth.
|
|
6
|
+
* Validates JWTs from the standard Authorization header.
|
|
7
|
+
*
|
|
8
|
+
* The verifier defaults to `tokenUse: 'access'` (matching `createAuthGuard`),
|
|
9
|
+
* so a Cognito id token — which is audience-scoped to the client and not
|
|
10
|
+
* intended as an API access credential (OAuth 2.0 Security BCP / RFC 9700) —
|
|
11
|
+
* is rejected as a bearer credential. Pass `verifierOptions.tokenUse` to
|
|
12
|
+
* override (e.g. `'any'` or `'id'`).
|
|
13
|
+
*/
|
|
14
|
+
export function createAuthMiddlewareConfig(config, options = {}) {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
const verifier = createCognitoJwtVerifier(config, Object.assign(Object.assign({}, options.verifierOptions), { tokenUse: (_b = (_a = options.verifierOptions) === null || _a === void 0 ? void 0 : _a.tokenUse) !== null && _b !== void 0 ? _b : 'access' }));
|
|
17
|
+
/**
|
|
18
|
+
* Extract and verify session from a Next.js request.
|
|
19
|
+
*/
|
|
20
|
+
function getSession(request) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
const authHeader = request.headers.get('authorization');
|
|
23
|
+
const token = extractBearerToken(authHeader !== null && authHeader !== void 0 ? authHeader : undefined);
|
|
24
|
+
if (!token) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return yield verifier.verify(token);
|
|
29
|
+
}
|
|
30
|
+
catch (_a) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
verifier,
|
|
37
|
+
getSession,
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a typed principal from the request session. Returns null
|
|
40
|
+
* (never throws) when the token is missing/invalid, no policy is
|
|
41
|
+
* configured, or the session maps to no principal kind.
|
|
42
|
+
*/
|
|
43
|
+
getPrincipal(request) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
if (!options.policy) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const session = yield getSession(request);
|
|
49
|
+
if (!session) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
return toPrincipal(session, options.policy);
|
|
54
|
+
}
|
|
55
|
+
catch (_a) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function normalizePath(path) {
|
|
63
|
+
var _a, _b;
|
|
64
|
+
const pathOnly = (_b = (_a = path.split(/[?#]/, 1)[0]) === null || _a === void 0 ? void 0 : _a.replace(/\\/g, '/')) !== null && _b !== void 0 ? _b : '/';
|
|
65
|
+
if (/%(?:2f|5c)/i.test(pathOnly)) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
let decoded;
|
|
69
|
+
try {
|
|
70
|
+
decoded = decodeURI(pathOnly);
|
|
71
|
+
}
|
|
72
|
+
catch (_c) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (/%(?:2f|5c)/i.test(decoded)) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const segments = [];
|
|
79
|
+
for (const segment of decoded.split('/')) {
|
|
80
|
+
if (!segment || segment === '.') {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (segment === '..') {
|
|
84
|
+
segments.pop();
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
segments.push(segment);
|
|
88
|
+
}
|
|
89
|
+
return `/${segments.join('/')}`.replace(/\/+$/, '') || '/';
|
|
90
|
+
}
|
|
91
|
+
function matchesRoute(rulePath, pathname) {
|
|
92
|
+
return ((rulePath === '/' && pathname === '/') ||
|
|
93
|
+
pathname === rulePath ||
|
|
94
|
+
pathname.startsWith(`${rulePath}/`));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Framework-agnostic route guard for web middleware. Returns a decision
|
|
98
|
+
* object instead of throwing so middleware templates can translate it into
|
|
99
|
+
* redirects or responses. The most specific (longest) matching rule wins;
|
|
100
|
+
* equal-length rules keep their input order; unmatched paths are denied
|
|
101
|
+
* unless `defaultBehavior` is set to `allow`.
|
|
102
|
+
*
|
|
103
|
+
* Path matching is case-sensitive: `/Admin` does not match a `/admin` rule.
|
|
104
|
+
* Under the default `deny` this fails closed (an unmatched `/Admin` is
|
|
105
|
+
* denied). Do not combine `defaultBehavior: 'allow'` with a case-insensitive
|
|
106
|
+
* routing layer, or a case-variant of a protected path can bypass its rule
|
|
107
|
+
* and fall through to `allow`.
|
|
108
|
+
*/
|
|
109
|
+
export function createRouteGuard(options) {
|
|
110
|
+
var _a;
|
|
111
|
+
const rules = options.rules
|
|
112
|
+
.map((rule) => {
|
|
113
|
+
const normalizedPath = normalizePath(rule.path);
|
|
114
|
+
if (!normalizedPath) {
|
|
115
|
+
throw new Error(`Invalid route rule path: ${rule.path}`);
|
|
116
|
+
}
|
|
117
|
+
return Object.assign(Object.assign({}, rule), { path: normalizedPath });
|
|
118
|
+
})
|
|
119
|
+
.sort((a, b) => b.path.length - a.path.length);
|
|
120
|
+
const defaultBehavior = (_a = options.defaultBehavior) !== null && _a !== void 0 ? _a : 'deny';
|
|
121
|
+
return {
|
|
122
|
+
check(pathname, session) {
|
|
123
|
+
const normalizedPathname = normalizePath(pathname);
|
|
124
|
+
if (!normalizedPathname) {
|
|
125
|
+
return { allowed: false, reason: 'forbidden', status: 403 };
|
|
126
|
+
}
|
|
127
|
+
const rule = rules.find((candidate) => matchesRoute(candidate.path, normalizedPathname));
|
|
128
|
+
if (!rule) {
|
|
129
|
+
return defaultBehavior === 'allow'
|
|
130
|
+
? { allowed: true }
|
|
131
|
+
: { allowed: false, reason: 'forbidden', status: 403 };
|
|
132
|
+
}
|
|
133
|
+
if (rule.public) {
|
|
134
|
+
return { allowed: true };
|
|
135
|
+
}
|
|
136
|
+
let principal;
|
|
137
|
+
try {
|
|
138
|
+
principal = toPrincipal(session !== null && session !== void 0 ? session : { metadata: {}, status: 'anonymous' }, options.policy);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (isAuthError(error) && error.status === 401) {
|
|
142
|
+
return { allowed: false, reason: 'unauthenticated', status: 401 };
|
|
143
|
+
}
|
|
144
|
+
return { allowed: false, reason: 'forbidden', status: 403 };
|
|
145
|
+
}
|
|
146
|
+
if (rule.allow && !rule.allow.includes(principal.kind)) {
|
|
147
|
+
return { allowed: false, reason: 'forbidden', status: 403 };
|
|
148
|
+
}
|
|
149
|
+
return { allowed: true, principal };
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=auth-web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-web.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth-web.ts"],"names":[],"mappings":"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"}
|
package/src/auth.d.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { RequestActor, RequestMetadata, RequestMetadataValue } from './request-context.js';
|
|
2
|
+
import { RuntimeError, type RuntimeErrorDetails } from './response.js';
|
|
3
|
+
export type AuthSessionStatus = 'anonymous' | 'authenticated';
|
|
4
|
+
export interface AuthSessionSubject {
|
|
5
|
+
displayName?: string;
|
|
6
|
+
email?: string;
|
|
7
|
+
id: string;
|
|
8
|
+
permissions?: string[];
|
|
9
|
+
roles?: string[];
|
|
10
|
+
tenantId?: string;
|
|
11
|
+
type: RequestActor['type'];
|
|
12
|
+
}
|
|
13
|
+
export interface AuthSession {
|
|
14
|
+
audience?: string;
|
|
15
|
+
expiresAt?: string;
|
|
16
|
+
issuedAt?: string;
|
|
17
|
+
metadata: RequestMetadata;
|
|
18
|
+
sessionId?: string;
|
|
19
|
+
status: AuthSessionStatus;
|
|
20
|
+
subject?: AuthSessionSubject;
|
|
21
|
+
}
|
|
22
|
+
export interface AnonymousSessionInput {
|
|
23
|
+
audience?: string;
|
|
24
|
+
expiresAt?: string;
|
|
25
|
+
issuedAt?: string;
|
|
26
|
+
metadata?: Record<string, RequestMetadataValue | undefined>;
|
|
27
|
+
sessionId?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AuthenticatedSessionInput extends AnonymousSessionInput {
|
|
30
|
+
subject: AuthSessionSubject;
|
|
31
|
+
}
|
|
32
|
+
export interface AuthenticatedSession extends AuthSession {
|
|
33
|
+
status: 'authenticated';
|
|
34
|
+
subject: AuthSessionSubject;
|
|
35
|
+
}
|
|
36
|
+
export declare const authContract: {
|
|
37
|
+
readonly exportPath: "@empire-builder-kit/runtime/auth";
|
|
38
|
+
readonly packageName: "@empire-builder-kit/runtime";
|
|
39
|
+
};
|
|
40
|
+
export declare function createAnonymousSession(input?: AnonymousSessionInput): AuthSession;
|
|
41
|
+
export declare function createAuthenticatedSession(input: AuthenticatedSessionInput): AuthenticatedSession;
|
|
42
|
+
export declare function isAuthenticatedSession(session: AuthSession): session is AuthenticatedSession;
|
|
43
|
+
export declare function toRequestActor(session: AuthSession): RequestActor | undefined;
|
|
44
|
+
export declare function toSessionLogMetadata(session: AuthSession): RequestMetadata;
|
|
45
|
+
/**
|
|
46
|
+
* BetterAuth configuration contract.
|
|
47
|
+
*
|
|
48
|
+
* App groups consume auth from the core SDK. The core app group owns
|
|
49
|
+
* the Cognito user pool and exposes these connection details so
|
|
50
|
+
* BetterAuth can be configured against the shared pool.
|
|
51
|
+
*/
|
|
52
|
+
export interface BetterAuthConfig {
|
|
53
|
+
provider: 'cognito';
|
|
54
|
+
userPoolId: string;
|
|
55
|
+
clientId: string;
|
|
56
|
+
issuerUrl: string;
|
|
57
|
+
}
|
|
58
|
+
export declare function createBetterAuthConfig(options: {
|
|
59
|
+
userPoolId: string;
|
|
60
|
+
clientId: string;
|
|
61
|
+
region: string;
|
|
62
|
+
}): BetterAuthConfig;
|
|
63
|
+
export interface CognitoTokenClaims {
|
|
64
|
+
sub: string;
|
|
65
|
+
aud?: string | string[];
|
|
66
|
+
client_id?: string;
|
|
67
|
+
email?: string;
|
|
68
|
+
'cognito:username'?: string;
|
|
69
|
+
'cognito:groups'?: string[];
|
|
70
|
+
exp?: number;
|
|
71
|
+
iat?: number;
|
|
72
|
+
scope?: string;
|
|
73
|
+
token_use?: string;
|
|
74
|
+
}
|
|
75
|
+
export declare function sessionFromCognitoToken(decoded: CognitoTokenClaims): AuthenticatedSession;
|
|
76
|
+
export type PrincipalKind = 'admin' | 'agent' | 'customer';
|
|
77
|
+
export type DefaultPrincipalKind = Exclude<PrincipalKind, 'admin'>;
|
|
78
|
+
/**
|
|
79
|
+
* A typed identity resolved from an authenticated session via an
|
|
80
|
+
* {@link AuthPolicy}. Guards and handlers should authorize against the
|
|
81
|
+
* principal instead of inspecting raw Cognito claims.
|
|
82
|
+
*/
|
|
83
|
+
export interface Principal {
|
|
84
|
+
audience?: string;
|
|
85
|
+
id: string;
|
|
86
|
+
kind: PrincipalKind;
|
|
87
|
+
roles: string[];
|
|
88
|
+
scopes: string[];
|
|
89
|
+
session: AuthenticatedSession;
|
|
90
|
+
}
|
|
91
|
+
export interface AuthPolicyRule {
|
|
92
|
+
/**
|
|
93
|
+
* App client ids. Audience matching is ignored for admin rules and only
|
|
94
|
+
* matches agent rules for service principals. Use Cognito groups for
|
|
95
|
+
* privileged human access; scopes only grant privileged (admin/agent)
|
|
96
|
+
* access to service principals, so a human token carrying a privileged
|
|
97
|
+
* scope cannot elevate above customer.
|
|
98
|
+
*/
|
|
99
|
+
audiences?: string[];
|
|
100
|
+
groups?: string[];
|
|
101
|
+
scopes?: string[];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Maps Cognito groups, safe token audience matches, and OAuth scopes onto
|
|
105
|
+
* principal kinds. When several kinds match, the more privileged kind wins:
|
|
106
|
+
* admin, then agent, then customer. Admin defaults are intentionally
|
|
107
|
+
* disallowed; unaffiliated authenticated users may only default to agent or
|
|
108
|
+
* customer.
|
|
109
|
+
*/
|
|
110
|
+
export interface AuthPolicy {
|
|
111
|
+
admin?: AuthPolicyRule;
|
|
112
|
+
agent?: AuthPolicyRule;
|
|
113
|
+
customer?: AuthPolicyRule;
|
|
114
|
+
defaultKind?: DefaultPrincipalKind;
|
|
115
|
+
}
|
|
116
|
+
export declare const authErrorCodes: {
|
|
117
|
+
readonly forbiddenKind: "auth_forbidden_kind";
|
|
118
|
+
readonly forbiddenRole: "auth_forbidden_role";
|
|
119
|
+
readonly forbiddenScope: "auth_forbidden_scope";
|
|
120
|
+
readonly invalidToken: "auth_invalid_token";
|
|
121
|
+
readonly principalMismatch: "auth_principal_mismatch";
|
|
122
|
+
readonly unauthenticated: "auth_unauthenticated";
|
|
123
|
+
};
|
|
124
|
+
export type AuthErrorCode = (typeof authErrorCodes)[keyof typeof authErrorCodes];
|
|
125
|
+
export interface AuthErrorOptions {
|
|
126
|
+
code: AuthErrorCode;
|
|
127
|
+
details?: RuntimeErrorDetails;
|
|
128
|
+
message: string;
|
|
129
|
+
status: 401 | 403;
|
|
130
|
+
}
|
|
131
|
+
export declare class AuthError extends RuntimeError {
|
|
132
|
+
constructor(options: AuthErrorOptions);
|
|
133
|
+
}
|
|
134
|
+
export declare function isAuthError(error: unknown): error is AuthError;
|
|
135
|
+
export declare function toPrincipal(session: AuthSession, policy: AuthPolicy): Principal;
|
|
136
|
+
export declare function hasRole(principal: Principal, role: string): boolean;
|
|
137
|
+
export declare function hasScope(principal: Principal, scope: string): boolean;
|
|
138
|
+
export declare function isAdmin(principal: Principal): boolean;
|
|
139
|
+
export declare function isAgent(principal: Principal): boolean;
|
|
140
|
+
export declare function isCustomer(principal: Principal): boolean;
|
|
141
|
+
export declare function assertPrincipalKind(principal: Principal, allowed: PrincipalKind[]): void;
|
|
142
|
+
export declare function assertRole(principal: Principal, role: string): void;
|
|
143
|
+
export declare function assertScope(principal: Principal, scope: string): void;
|
package/src/auth.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { RuntimeError } from './response.js';
|
|
2
|
+
export const authContract = {
|
|
3
|
+
exportPath: '@empire-builder-kit/runtime/auth',
|
|
4
|
+
packageName: '@empire-builder-kit/runtime',
|
|
5
|
+
};
|
|
6
|
+
function normalizeMetadata(metadata) {
|
|
7
|
+
const entries = Object.entries(metadata !== null && metadata !== void 0 ? metadata : {}).filter(([, value]) => value !== undefined);
|
|
8
|
+
return Object.fromEntries(entries);
|
|
9
|
+
}
|
|
10
|
+
function normalizeList(values) {
|
|
11
|
+
const normalized = (values !== null && values !== void 0 ? values : [])
|
|
12
|
+
.map((value) => value.trim())
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
if (normalized.length === 0) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return [...new Set(normalized)];
|
|
18
|
+
}
|
|
19
|
+
function normalizeSubject(subject) {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
return Object.assign(Object.assign({}, subject), { displayName: ((_a = subject.displayName) === null || _a === void 0 ? void 0 : _a.trim()) || undefined, email: ((_b = subject.email) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, permissions: normalizeList(subject.permissions), roles: normalizeList(subject.roles), tenantId: ((_c = subject.tenantId) === null || _c === void 0 ? void 0 : _c.trim()) || undefined });
|
|
22
|
+
}
|
|
23
|
+
export function createAnonymousSession(input = {}) {
|
|
24
|
+
var _a;
|
|
25
|
+
return {
|
|
26
|
+
audience: ((_a = input.audience) === null || _a === void 0 ? void 0 : _a.trim()) || undefined,
|
|
27
|
+
expiresAt: input.expiresAt,
|
|
28
|
+
issuedAt: input.issuedAt,
|
|
29
|
+
metadata: normalizeMetadata(input.metadata),
|
|
30
|
+
sessionId: input.sessionId,
|
|
31
|
+
status: 'anonymous',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function createAuthenticatedSession(input) {
|
|
35
|
+
return Object.assign(Object.assign({}, createAnonymousSession(input)), { status: 'authenticated', subject: normalizeSubject(input.subject) });
|
|
36
|
+
}
|
|
37
|
+
export function isAuthenticatedSession(session) {
|
|
38
|
+
return session.status === 'authenticated' && session.subject !== undefined;
|
|
39
|
+
}
|
|
40
|
+
export function toRequestActor(session) {
|
|
41
|
+
if (!isAuthenticatedSession(session)) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
id: session.subject.id,
|
|
46
|
+
type: session.subject.type,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function toSessionLogMetadata(session) {
|
|
50
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
51
|
+
return normalizeMetadata(Object.assign({ authAudience: session.audience, authExpiresAt: session.expiresAt, authIssuedAt: session.issuedAt, authPermissions: (_b = (_a = session.subject) === null || _a === void 0 ? void 0 : _a.permissions) === null || _b === void 0 ? void 0 : _b.join(','), authRoles: (_d = (_c = session.subject) === null || _c === void 0 ? void 0 : _c.roles) === null || _d === void 0 ? void 0 : _d.join(','), authSessionId: session.sessionId, authStatus: session.status, authSubjectEmail: (_e = session.subject) === null || _e === void 0 ? void 0 : _e.email, authSubjectId: (_f = session.subject) === null || _f === void 0 ? void 0 : _f.id, authSubjectName: (_g = session.subject) === null || _g === void 0 ? void 0 : _g.displayName, authSubjectType: (_h = session.subject) === null || _h === void 0 ? void 0 : _h.type, authTenantId: (_j = session.subject) === null || _j === void 0 ? void 0 : _j.tenantId }, session.metadata));
|
|
52
|
+
}
|
|
53
|
+
export function createBetterAuthConfig(options) {
|
|
54
|
+
const region = options.region.trim();
|
|
55
|
+
const userPoolId = options.userPoolId.trim();
|
|
56
|
+
const clientId = options.clientId.trim();
|
|
57
|
+
if (!region || !userPoolId || !clientId) {
|
|
58
|
+
throw new Error('Cognito region, userPoolId, and clientId must be non-empty.');
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
provider: 'cognito',
|
|
62
|
+
userPoolId,
|
|
63
|
+
clientId,
|
|
64
|
+
issuerUrl: `https://cognito-idp.${region}.amazonaws.com/${userPoolId}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function resolveTokenAudience(decoded) {
|
|
68
|
+
if (decoded.client_id) {
|
|
69
|
+
return decoded.client_id;
|
|
70
|
+
}
|
|
71
|
+
if (typeof decoded.aud === 'string') {
|
|
72
|
+
return decoded.aud;
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(decoded.aud)) {
|
|
75
|
+
return decoded.aud.find((audience) => audience.trim() !== '');
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
export function sessionFromCognitoToken(decoded) {
|
|
80
|
+
var _a;
|
|
81
|
+
// Client-credentials access tokens carry sub === client_id and no user
|
|
82
|
+
// claims; they represent a machine caller, not a Cognito user.
|
|
83
|
+
const isServiceToken = decoded.client_id !== undefined && decoded.client_id === decoded.sub;
|
|
84
|
+
return createAuthenticatedSession({
|
|
85
|
+
audience: resolveTokenAudience(decoded),
|
|
86
|
+
subject: {
|
|
87
|
+
id: decoded.sub,
|
|
88
|
+
email: decoded.email,
|
|
89
|
+
displayName: decoded['cognito:username'],
|
|
90
|
+
permissions: (_a = decoded.scope) === null || _a === void 0 ? void 0 : _a.split(/\s+/),
|
|
91
|
+
roles: decoded['cognito:groups'],
|
|
92
|
+
type: isServiceToken ? 'service' : 'user',
|
|
93
|
+
},
|
|
94
|
+
expiresAt: decoded.exp
|
|
95
|
+
? new Date(decoded.exp * 1000).toISOString()
|
|
96
|
+
: undefined,
|
|
97
|
+
issuedAt: decoded.iat
|
|
98
|
+
? new Date(decoded.iat * 1000).toISOString()
|
|
99
|
+
: undefined,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export const authErrorCodes = {
|
|
103
|
+
forbiddenKind: 'auth_forbidden_kind',
|
|
104
|
+
forbiddenRole: 'auth_forbidden_role',
|
|
105
|
+
forbiddenScope: 'auth_forbidden_scope',
|
|
106
|
+
invalidToken: 'auth_invalid_token',
|
|
107
|
+
principalMismatch: 'auth_principal_mismatch',
|
|
108
|
+
unauthenticated: 'auth_unauthenticated',
|
|
109
|
+
};
|
|
110
|
+
export class AuthError extends RuntimeError {
|
|
111
|
+
constructor(options) {
|
|
112
|
+
super(Object.assign(Object.assign({}, options), { retryable: false }));
|
|
113
|
+
this.name = 'AuthError';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function isAuthError(error) {
|
|
117
|
+
return error instanceof AuthError;
|
|
118
|
+
}
|
|
119
|
+
const principalKindPrecedence = ['admin', 'agent', 'customer'];
|
|
120
|
+
function matchesPolicyRule(kind, rule, input) {
|
|
121
|
+
var _a, _b, _c;
|
|
122
|
+
if ((_a = rule.groups) === null || _a === void 0 ? void 0 : _a.some((group) => input.roles.includes(group))) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if (((_b = rule.scopes) === null || _b === void 0 ? void 0 : _b.some((scope) => input.scopes.includes(scope))) &&
|
|
126
|
+
(kind === 'customer' || input.subjectType === 'service')) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (input.audience !== undefined &&
|
|
130
|
+
((_c = rule.audiences) === null || _c === void 0 ? void 0 : _c.includes(input.audience)) &&
|
|
131
|
+
(kind === 'customer' ||
|
|
132
|
+
(kind === 'agent' && input.subjectType === 'service'))) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
function resolveDefaultPrincipalKind(policy) {
|
|
138
|
+
const defaultKind = policy.defaultKind;
|
|
139
|
+
if (defaultKind === 'admin') {
|
|
140
|
+
throw new AuthError({
|
|
141
|
+
code: authErrorCodes.principalMismatch,
|
|
142
|
+
message: 'Auth policy defaultKind cannot be admin',
|
|
143
|
+
status: 403,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return defaultKind;
|
|
147
|
+
}
|
|
148
|
+
export function toPrincipal(session, policy) {
|
|
149
|
+
var _a, _b, _c;
|
|
150
|
+
if (!isAuthenticatedSession(session)) {
|
|
151
|
+
throw new AuthError({
|
|
152
|
+
code: authErrorCodes.unauthenticated,
|
|
153
|
+
message: 'Authentication required',
|
|
154
|
+
status: 401,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const audience = session.audience;
|
|
158
|
+
const roles = (_a = session.subject.roles) !== null && _a !== void 0 ? _a : [];
|
|
159
|
+
const scopes = (_b = session.subject.permissions) !== null && _b !== void 0 ? _b : [];
|
|
160
|
+
const defaultKind = resolveDefaultPrincipalKind(policy);
|
|
161
|
+
const kind = (_c = principalKindPrecedence.find((candidate) => {
|
|
162
|
+
const rule = policy[candidate];
|
|
163
|
+
return rule !== undefined
|
|
164
|
+
? matchesPolicyRule(candidate, rule, {
|
|
165
|
+
audience,
|
|
166
|
+
roles,
|
|
167
|
+
scopes,
|
|
168
|
+
subjectType: session.subject.type,
|
|
169
|
+
})
|
|
170
|
+
: false;
|
|
171
|
+
})) !== null && _c !== void 0 ? _c : defaultKind;
|
|
172
|
+
if (!kind) {
|
|
173
|
+
throw new AuthError({
|
|
174
|
+
code: authErrorCodes.principalMismatch,
|
|
175
|
+
message: 'Session does not map to a known principal kind',
|
|
176
|
+
status: 403,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
audience,
|
|
181
|
+
id: session.subject.id,
|
|
182
|
+
kind,
|
|
183
|
+
roles,
|
|
184
|
+
scopes,
|
|
185
|
+
session,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export function hasRole(principal, role) {
|
|
189
|
+
return principal.roles.includes(role);
|
|
190
|
+
}
|
|
191
|
+
export function hasScope(principal, scope) {
|
|
192
|
+
return principal.scopes.includes(scope);
|
|
193
|
+
}
|
|
194
|
+
export function isAdmin(principal) {
|
|
195
|
+
return principal.kind === 'admin';
|
|
196
|
+
}
|
|
197
|
+
export function isAgent(principal) {
|
|
198
|
+
return principal.kind === 'agent';
|
|
199
|
+
}
|
|
200
|
+
export function isCustomer(principal) {
|
|
201
|
+
return principal.kind === 'customer';
|
|
202
|
+
}
|
|
203
|
+
export function assertPrincipalKind(principal, allowed) {
|
|
204
|
+
if (!allowed.includes(principal.kind)) {
|
|
205
|
+
throw new AuthError({
|
|
206
|
+
code: authErrorCodes.forbiddenKind,
|
|
207
|
+
details: { allowed, kind: principal.kind },
|
|
208
|
+
message: `Principal kind '${principal.kind}' is not allowed`,
|
|
209
|
+
status: 403,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export function assertRole(principal, role) {
|
|
214
|
+
if (!hasRole(principal, role)) {
|
|
215
|
+
throw new AuthError({
|
|
216
|
+
code: authErrorCodes.forbiddenRole,
|
|
217
|
+
details: { role },
|
|
218
|
+
message: `Principal is missing required role '${role}'`,
|
|
219
|
+
status: 403,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export function assertScope(principal, scope) {
|
|
224
|
+
if (!hasScope(principal, scope)) {
|
|
225
|
+
throw new AuthError({
|
|
226
|
+
code: authErrorCodes.forbiddenScope,
|
|
227
|
+
details: { scope },
|
|
228
|
+
message: `Principal is missing required scope '${scope}'`,
|
|
229
|
+
status: 403,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=auth.js.map
|
package/src/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../packages/runtime/src/auth.ts"],"names":[],"mappings":"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"}
|
package/{dist → src}/config.d.ts
RENAMED
|
@@ -49,4 +49,3 @@ export declare function number(options?: NumberOptions): ConfigParser<number>;
|
|
|
49
49
|
export declare function boolean(options?: BooleanOptions): ConfigParser<boolean>;
|
|
50
50
|
export declare function enumValue<const T extends string>(values: readonly T[], options?: EnumOptions<T>): ConfigParser<T>;
|
|
51
51
|
export {};
|
|
52
|
-
//# sourceMappingURL=config.d.ts.map
|
package/{dist → src}/config.js
RENAMED
|
@@ -1,30 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ConfigValidationError = void 0;
|
|
4
|
-
exports.formatConfigIssues = formatConfigIssues;
|
|
5
|
-
exports.loadConfig = loadConfig;
|
|
6
|
-
exports.string = string;
|
|
7
|
-
exports.optionalString = optionalString;
|
|
8
|
-
exports.number = number;
|
|
9
|
-
exports.boolean = boolean;
|
|
10
|
-
exports.enumValue = enumValue;
|
|
11
1
|
class ConfigFieldError extends Error {
|
|
12
|
-
issue;
|
|
13
2
|
constructor(issue) {
|
|
14
3
|
super(`${issue.key}: ${issue.message}`);
|
|
15
4
|
this.name = 'ConfigFieldError';
|
|
16
5
|
this.issue = issue;
|
|
17
6
|
}
|
|
18
7
|
}
|
|
19
|
-
class ConfigValidationError extends Error {
|
|
20
|
-
issues;
|
|
8
|
+
export class ConfigValidationError extends Error {
|
|
21
9
|
constructor(issues) {
|
|
22
10
|
super(formatConfigIssues(issues));
|
|
23
11
|
this.name = 'ConfigValidationError';
|
|
24
12
|
this.issues = issues;
|
|
25
13
|
}
|
|
26
14
|
}
|
|
27
|
-
exports.ConfigValidationError = ConfigValidationError;
|
|
28
15
|
function normalizeEnvKey(propertyKey, env) {
|
|
29
16
|
if (env) {
|
|
30
17
|
return env;
|
|
@@ -53,7 +40,7 @@ function resolveStringValue(rawValue, defaultValue) {
|
|
|
53
40
|
}
|
|
54
41
|
return rawValue;
|
|
55
42
|
}
|
|
56
|
-
function formatConfigIssues(issues) {
|
|
43
|
+
export function formatConfigIssues(issues) {
|
|
57
44
|
const summary = issues
|
|
58
45
|
.map(({ key, message, value }) => value === undefined
|
|
59
46
|
? `- ${key}: ${message}`
|
|
@@ -61,7 +48,7 @@ function formatConfigIssues(issues) {
|
|
|
61
48
|
.join('\n');
|
|
62
49
|
return `Invalid configuration:\n${summary}`;
|
|
63
50
|
}
|
|
64
|
-
function loadConfig(schema, source = process.env) {
|
|
51
|
+
export function loadConfig(schema, source = process.env) {
|
|
65
52
|
const issues = [];
|
|
66
53
|
const config = {};
|
|
67
54
|
for (const [propertyKey, parser] of Object.entries(schema)) {
|
|
@@ -84,7 +71,7 @@ function loadConfig(schema, source = process.env) {
|
|
|
84
71
|
}
|
|
85
72
|
return config;
|
|
86
73
|
}
|
|
87
|
-
function string(options = {}) {
|
|
74
|
+
export function string(options = {}) {
|
|
88
75
|
return ({ propertyKey, source }) => {
|
|
89
76
|
const envKey = normalizeEnvKey(propertyKey, options.env);
|
|
90
77
|
const rawValue = resolveStringValue(source[envKey], options.defaultValue);
|
|
@@ -104,7 +91,7 @@ function string(options = {}) {
|
|
|
104
91
|
return value;
|
|
105
92
|
};
|
|
106
93
|
}
|
|
107
|
-
function optionalString(options = {}) {
|
|
94
|
+
export function optionalString(options = {}) {
|
|
108
95
|
return ({ propertyKey, source }) => {
|
|
109
96
|
const envKey = normalizeEnvKey(propertyKey, options.env);
|
|
110
97
|
const rawValue = resolveStringValue(source[envKey], options.defaultValue);
|
|
@@ -124,7 +111,7 @@ function optionalString(options = {}) {
|
|
|
124
111
|
return value;
|
|
125
112
|
};
|
|
126
113
|
}
|
|
127
|
-
function number(options = {}) {
|
|
114
|
+
export function number(options = {}) {
|
|
128
115
|
return ({ propertyKey, source }) => {
|
|
129
116
|
const envKey = normalizeEnvKey(propertyKey, options.env);
|
|
130
117
|
const rawValue = source[envKey];
|
|
@@ -150,7 +137,7 @@ function number(options = {}) {
|
|
|
150
137
|
return value;
|
|
151
138
|
};
|
|
152
139
|
}
|
|
153
|
-
function boolean(options = {}) {
|
|
140
|
+
export function boolean(options = {}) {
|
|
154
141
|
return ({ propertyKey, source }) => {
|
|
155
142
|
const envKey = normalizeEnvKey(propertyKey, options.env);
|
|
156
143
|
const rawValue = source[envKey];
|
|
@@ -170,7 +157,7 @@ function boolean(options = {}) {
|
|
|
170
157
|
throwFieldError(envKey, 'must be a boolean value', rawValue);
|
|
171
158
|
};
|
|
172
159
|
}
|
|
173
|
-
function enumValue(values, options = {}) {
|
|
160
|
+
export function enumValue(values, options = {}) {
|
|
174
161
|
return ({ propertyKey, source }) => {
|
|
175
162
|
const envKey = normalizeEnvKey(propertyKey, options.env);
|
|
176
163
|
const rawValue = resolveStringValue(source[envKey], options.defaultValue);
|
|
@@ -183,3 +170,4 @@ function enumValue(values, options = {}) {
|
|
|
183
170
|
return rawValue;
|
|
184
171
|
};
|
|
185
172
|
}
|
|
173
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../packages/runtime/src/config.ts"],"names":[],"mappings":"AA6CA,MAAM,gBAAiB,SAAQ,KAAK;IAGlC,YAAY,KAAkB;QAC5B,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG9C,YAAY,MAAqB;QAC/B,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAY;IACxD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,WAAW;SACf,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAClB,GAAW,EACX,OAAe,EACf,KAAc;IAEd,OAAO;QACL,GAAG;QACH,OAAO;QACP,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,OAAe,EAAE,KAAc;IACnE,MAAM,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,IAAI,GAAG,IAAI;IACtD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CACzB,QAA4B,EAC5B,YAAgC;IAEhC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/B,KAAK,KAAK,SAAS;QACjB,CAAC,CAAC,KAAK,GAAG,KAAK,OAAO,EAAE;QACxB,CAAC,CAAC,KAAK,GAAG,KAAK,OAAO,eAAe,KAAK,IAAI,CACjD;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,2BAA2B,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,MAAS,EACT,SAAuB,OAAO,CAAC,GAAG;IAElC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,EAAoB,CAAC;IAEpC,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGtD,EAAE,CAAC;QACJ,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;gBAChC,MAAM;aACP,CAAuC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,UAAyB,EAAE;IAChD,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAE1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAErE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACxE,eAAe,CACb,MAAM,EACN,oBAAoB,OAAO,CAAC,SAAS,aAAa,EAClD,KAAK,CACN,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,eAAe,CAAC,MAAM,EAAE,qCAAqC,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAEI,EAAE;IAEN,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAE1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAErE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACxE,eAAe,CACb,MAAM,EACN,oBAAoB,OAAO,CAAC,SAAS,aAAa,EAClD,KAAK,CACN,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,eAAe,CAAC,MAAM,EAAE,qCAAqC,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,UAAyB,EAAE;IAChD,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,OAAO,CAAC,YAAY,CAAC;YAC9B,CAAC;YAED,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE/B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,eAAe,CAAC,MAAM,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,eAAe,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACrD,eAAe,CAAC,MAAM,EAAE,oBAAoB,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACrD,eAAe,CAAC,MAAM,EAAE,mBAAmB,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,UAA0B,EAAE;IAClD,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,OAAO,CAAC,YAAY,CAAC;YAC9B,CAAC;YAED,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjD,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,eAAe,CAAC,MAAM,EAAE,yBAAyB,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAAoB,EACpB,UAA0B,EAAE;IAE5B,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAE1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAa,CAAC,EAAE,CAAC;YACpC,eAAe,CACb,MAAM,EACN,kBAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAClE,QAAQ,CACT,CAAC;QACJ,CAAC;QAED,OAAO,QAAa,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|