@ucptools/validator 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/config.d.ts +20 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +114 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +17 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +45 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +170 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/service.d.ts +80 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +298 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +375 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mock-server.d.ts +20 -0
- package/dist/cli/mock-server.d.ts.map +1 -0
- package/dist/cli/mock-server.js +261 -0
- package/dist/cli/mock-server.js.map +1 -0
- package/dist/compliance/compliance-generator.d.ts +34 -0
- package/dist/compliance/compliance-generator.d.ts.map +1 -0
- package/dist/compliance/compliance-generator.js +320 -0
- package/dist/compliance/compliance-generator.js.map +1 -0
- package/dist/compliance/index.d.ts +8 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +17 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/templates.d.ts +34 -0
- package/dist/compliance/templates.d.ts.map +1 -0
- package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
- package/dist/compliance/templates.js.map +1 -0
- package/dist/compliance/types.d.ts +64 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +64 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/db/index.d.ts +17 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +80 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +3886 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +425 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/utils.d.ts +252 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/db/utils.js +295 -0
- package/dist/db/utils.js.map +1 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
- package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
- package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
- package/dist/feed-analyzer/index.d.ts +8 -0
- package/dist/feed-analyzer/index.d.ts.map +1 -0
- package/dist/feed-analyzer/index.js +19 -0
- package/dist/feed-analyzer/index.js.map +1 -0
- package/dist/feed-analyzer/types.d.ts +285 -0
- package/dist/feed-analyzer/types.d.ts.map +1 -0
- package/dist/feed-analyzer/types.js +175 -0
- package/dist/feed-analyzer/types.js.map +1 -0
- package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +13 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/key-generator.d.ts +24 -0
- package/dist/generator/key-generator.d.ts.map +1 -0
- package/dist/generator/key-generator.js +144 -0
- package/dist/generator/key-generator.js.map +1 -0
- package/dist/generator/profile-builder.d.ts +15 -0
- package/dist/generator/profile-builder.d.ts.map +1 -0
- package/dist/generator/profile-builder.js +338 -0
- package/dist/generator/profile-builder.js.map +1 -0
- package/dist/hosting/artifacts-generator.d.ts +10 -0
- package/dist/hosting/artifacts-generator.d.ts.map +1 -0
- package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
- package/dist/hosting/artifacts-generator.js.map +1 -0
- package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
- package/dist/hosting/index.d.ts.map +1 -0
- package/dist/hosting/index.js +10 -0
- package/dist/hosting/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/analytics.d.ts +337 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +188 -0
- package/dist/lib/analytics.js.map +1 -0
- package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +12 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security-scanner.d.ts +10 -0
- package/dist/security/security-scanner.d.ts.map +1 -0
- package/dist/security/security-scanner.js +669 -0
- package/dist/security/security-scanner.js.map +1 -0
- package/dist/security/types.d.ts +80 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +21 -0
- package/dist/security/types.js.map +1 -0
- package/dist/services/analytics.d.ts +114 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +862 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/badge.d.ts +31 -0
- package/dist/services/badge.d.ts.map +1 -0
- package/dist/services/badge.js +152 -0
- package/dist/services/badge.js.map +1 -0
- package/dist/services/cron.d.ts +125 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +613 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/directory.d.ts +106 -0
- package/dist/services/directory.d.ts.map +1 -0
- package/dist/services/directory.js +351 -0
- package/dist/services/directory.js.map +1 -0
- package/dist/services/email.d.ts +112 -0
- package/dist/services/email.d.ts.map +1 -0
- package/dist/services/email.js +772 -0
- package/dist/services/email.js.map +1 -0
- package/dist/services/hosted-profiles.d.ts +77 -0
- package/dist/services/hosted-profiles.d.ts.map +1 -0
- package/dist/services/hosted-profiles.js +433 -0
- package/dist/services/hosted-profiles.js.map +1 -0
- package/dist/services/latency.d.ts +67 -0
- package/dist/services/latency.d.ts.map +1 -0
- package/dist/services/latency.js +274 -0
- package/dist/services/latency.js.map +1 -0
- package/dist/services/manifest-compliance.d.ts +64 -0
- package/dist/services/manifest-compliance.d.ts.map +1 -0
- package/dist/services/manifest-compliance.js +271 -0
- package/dist/services/manifest-compliance.js.map +1 -0
- package/dist/services/monitoring-diff.d.ts +31 -0
- package/dist/services/monitoring-diff.d.ts.map +1 -0
- package/dist/services/monitoring-diff.js +189 -0
- package/dist/services/monitoring-diff.js.map +1 -0
- package/dist/services/notifications.d.ts +46 -0
- package/dist/services/notifications.d.ts.map +1 -0
- package/dist/services/notifications.js +88 -0
- package/dist/services/notifications.js.map +1 -0
- package/dist/services/stripe.d.ts +93 -0
- package/dist/services/stripe.d.ts.map +1 -0
- package/dist/services/stripe.js +490 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/services/validation-history.d.ts +99 -0
- package/dist/services/validation-history.d.ts.map +1 -0
- package/dist/services/validation-history.js +344 -0
- package/dist/services/validation-history.js.map +1 -0
- package/dist/services/validation-logging.d.ts +103 -0
- package/dist/services/validation-logging.d.ts.map +1 -0
- package/dist/services/validation-logging.js +210 -0
- package/dist/services/validation-logging.js.map +1 -0
- package/dist/services/validation.d.ts +119 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/services/validation.js +1185 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/simulator/agent-simulator.d.ts +69 -0
- package/dist/simulator/agent-simulator.d.ts.map +1 -0
- package/dist/simulator/agent-simulator.js +870 -0
- package/dist/simulator/agent-simulator.js.map +1 -0
- package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
- package/dist/simulator/index.d.ts.map +1 -0
- package/dist/simulator/index.js +23 -0
- package/dist/simulator/index.js.map +1 -0
- package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
- package/dist/simulator/types.d.ts.map +1 -0
- package/dist/simulator/types.js +18 -0
- package/dist/simulator/types.js.map +1 -0
- package/dist/types/acp-validation.d.ts +87 -0
- package/dist/types/acp-validation.d.ts.map +1 -0
- package/dist/types/acp-validation.js +40 -0
- package/dist/types/acp-validation.js.map +1 -0
- package/dist/types/analytics.d.ts +182 -0
- package/dist/types/analytics.d.ts.map +1 -0
- package/dist/types/analytics.js +7 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/generator.d.ts +106 -0
- package/dist/types/generator.d.ts.map +1 -0
- package/dist/types/generator.js +6 -0
- package/dist/types/generator.js.map +1 -0
- package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/ucp-profile.d.ts +111 -0
- package/dist/types/ucp-profile.d.ts.map +1 -0
- package/dist/types/ucp-profile.js +45 -0
- package/dist/types/ucp-profile.js.map +1 -0
- package/dist/types/validation.d.ts +76 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +42 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/validator/acp/index.d.ts +31 -0
- package/dist/validator/acp/index.d.ts.map +1 -0
- package/dist/validator/acp/index.js +574 -0
- package/dist/validator/acp/index.js.map +1 -0
- package/dist/validator/index.d.ts +26 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +161 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/network-validator.d.ts +28 -0
- package/dist/validator/network-validator.d.ts.map +1 -0
- package/dist/validator/network-validator.js +319 -0
- package/dist/validator/network-validator.js.map +1 -0
- package/dist/validator/rules-validator.d.ts +19 -0
- package/dist/validator/rules-validator.d.ts.map +1 -0
- package/dist/validator/rules-validator.js +306 -0
- package/dist/validator/rules-validator.js.map +1 -0
- package/dist/validator/sdk-validator.d.ts +58 -0
- package/dist/validator/sdk-validator.d.ts.map +1 -0
- package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
- package/dist/validator/sdk-validator.js.map +1 -0
- package/dist/validator/structural-validator.d.ts +11 -0
- package/dist/validator/structural-validator.d.ts.map +1 -0
- package/dist/validator/structural-validator.js +549 -0
- package/dist/validator/structural-validator.js.map +1 -0
- package/dist/validator/utils.d.ts +51 -0
- package/dist/validator/utils.d.ts.map +1 -0
- package/dist/validator/utils.js +132 -0
- package/dist/validator/utils.js.map +1 -0
- package/package.json +44 -12
- package/CLAUDE.md +0 -109
- package/api/analyze-feed.js +0 -140
- package/api/badge.js +0 -185
- package/api/benchmark.js +0 -177
- package/api/directory-stats.ts +0 -29
- package/api/directory.ts +0 -73
- package/api/generate-compliance.js +0 -143
- package/api/generate-schema.js +0 -457
- package/api/generate.js +0 -132
- package/api/security-scan.js +0 -133
- package/api/simulate.js +0 -187
- package/api/tsconfig.json +0 -10
- package/api/validate.js +0 -1351
- package/apify-actor/.actor/actor.json +0 -68
- package/apify-actor/.actor/input_schema.json +0 -32
- package/apify-actor/APIFY-STORE-LISTING.md +0 -412
- package/apify-actor/Dockerfile +0 -8
- package/apify-actor/README.md +0 -166
- package/apify-actor/main.ts +0 -111
- package/apify-actor/package.json +0 -17
- package/apify-actor/src/main.js +0 -199
- package/docs/BRAND-IDENTITY.md +0 -238
- package/docs/BRAND-STYLE-GUIDE.md +0 -356
- package/drizzle/0000_black_king_cobra.sql +0 -39
- package/drizzle/meta/0000_snapshot.json +0 -309
- package/drizzle/meta/_journal.json +0 -13
- package/drizzle.config.ts +0 -10
- package/public/.well-known/ucp +0 -25
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/brand.css +0 -321
- package/public/directory.html +0 -701
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/guides/bigcommerce.html +0 -743
- package/public/guides/fastucp.html +0 -838
- package/public/guides/magento.html +0 -779
- package/public/guides/shopify.html +0 -726
- package/public/guides/squarespace.html +0 -749
- package/public/guides/wix.html +0 -747
- package/public/guides/woocommerce.html +0 -733
- package/public/index.html +0 -3835
- package/public/learn.html +0 -396
- package/public/logo.jpeg +0 -0
- package/public/og-image-icon.png +0 -0
- package/public/og-image.png +0 -0
- package/public/robots.txt +0 -6
- package/public/site.webmanifest +0 -31
- package/public/sitemap.xml +0 -69
- package/public/social/linkedin-banner-1128x191.png +0 -0
- package/public/social/temp.PNG +0 -0
- package/public/social/x-header-1500x500.png +0 -0
- package/public/verify.html +0 -410
- package/scripts/generate-favicons.js +0 -44
- package/scripts/generate-ico.js +0 -23
- package/scripts/generate-og-image.js +0 -45
- package/scripts/reset-db.ts +0 -77
- package/scripts/seed-db.ts +0 -71
- package/scripts/setup-benchmark-db.js +0 -70
- package/src/api/server.ts +0 -266
- package/src/cli/index.ts +0 -302
- package/src/compliance/compliance-generator.ts +0 -452
- package/src/compliance/index.ts +0 -28
- package/src/compliance/types.ts +0 -170
- package/src/db/index.ts +0 -28
- package/src/db/schema.ts +0 -84
- package/src/feed-analyzer/index.ts +0 -34
- package/src/feed-analyzer/types.ts +0 -354
- package/src/generator/key-generator.ts +0 -124
- package/src/generator/profile-builder.ts +0 -402
- package/src/index.ts +0 -105
- package/src/security/security-scanner.ts +0 -604
- package/src/security/types.ts +0 -55
- package/src/services/directory.ts +0 -434
- package/src/simulator/agent-simulator.ts +0 -941
- package/src/types/generator.ts +0 -140
- package/src/types/ucp-profile.ts +0 -140
- package/src/types/validation.ts +0 -89
- package/src/validator/index.ts +0 -194
- package/src/validator/network-validator.ts +0 -417
- package/src/validator/rules-validator.ts +0 -297
- package/src/validator/structural-validator.ts +0 -476
- package/tests/fixtures/non-compliant-profile.json +0 -25
- package/tests/fixtures/official-sample-profile.json +0 -75
- package/tests/integration/benchmark.test.ts +0 -207
- package/tests/integration/database.test.ts +0 -163
- package/tests/integration/directory-api.test.ts +0 -268
- package/tests/integration/simulate-api.test.ts +0 -230
- package/tests/integration/validate-api.test.ts +0 -269
- package/tests/setup.ts +0 -15
- package/tests/unit/agent-simulator.test.ts +0 -575
- package/tests/unit/compliance-generator.test.ts +0 -374
- package/tests/unit/directory-service.test.ts +0 -272
- package/tests/unit/feed-analyzer.test.ts +0 -517
- package/tests/unit/lint-suggestions.test.ts +0 -423
- package/tests/unit/official-samples.test.ts +0 -211
- package/tests/unit/pdf-report.test.ts +0 -390
- package/tests/unit/sdk-validator.test.ts +0 -531
- package/tests/unit/security-scanner.test.ts +0 -410
- package/tests/unit/validation.test.ts +0 -390
- package/tsconfig.json +0 -20
- package/vercel.json +0 -34
- package/vitest.config.ts +0 -22
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AuthConfig } from '@auth/core';
|
|
2
|
+
/**
|
|
3
|
+
* Auth.js configuration for UCPtools
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Email/password authentication
|
|
6
|
+
* - Google OAuth
|
|
7
|
+
* - GitHub OAuth
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAuthConfig(): AuthConfig;
|
|
10
|
+
declare module '@auth/core/types' {
|
|
11
|
+
interface Session {
|
|
12
|
+
user: {
|
|
13
|
+
id: string;
|
|
14
|
+
email: string;
|
|
15
|
+
name?: string | null;
|
|
16
|
+
image?: string | null;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/auth/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAqG1C;AAGD,OAAO,QAAQ,kBAAkB,CAAC;IAChC,UAAU,OAAO;QACf,IAAI,EAAE;YACJ,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SACvB,CAAC;KACH;CACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getAuthConfig = getAuthConfig;
|
|
7
|
+
const drizzle_adapter_1 = require("@auth/drizzle-adapter");
|
|
8
|
+
const credentials_1 = __importDefault(require("@auth/core/providers/credentials"));
|
|
9
|
+
const google_1 = __importDefault(require("@auth/core/providers/google"));
|
|
10
|
+
const github_1 = __importDefault(require("@auth/core/providers/github"));
|
|
11
|
+
const bcryptjs_1 = require("bcryptjs");
|
|
12
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
13
|
+
const index_js_1 = require("../db/index.js");
|
|
14
|
+
/**
|
|
15
|
+
* Auth.js configuration for UCPtools
|
|
16
|
+
* Supports:
|
|
17
|
+
* - Email/password authentication
|
|
18
|
+
* - Google OAuth
|
|
19
|
+
* - GitHub OAuth
|
|
20
|
+
*/
|
|
21
|
+
function getAuthConfig() {
|
|
22
|
+
const db = (0, index_js_1.getDb)();
|
|
23
|
+
// Type assertion needed for PostgreSQL compatibility
|
|
24
|
+
// The DrizzleAdapter works with PostgreSQL at runtime
|
|
25
|
+
const adapter = (0, drizzle_adapter_1.DrizzleAdapter)(db, {
|
|
26
|
+
usersTable: index_js_1.users,
|
|
27
|
+
accountsTable: index_js_1.accounts,
|
|
28
|
+
sessionsTable: index_js_1.sessions,
|
|
29
|
+
verificationTokensTable: index_js_1.verificationTokens,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
adapter,
|
|
33
|
+
providers: [
|
|
34
|
+
// Email/Password authentication
|
|
35
|
+
(0, credentials_1.default)({
|
|
36
|
+
name: 'credentials',
|
|
37
|
+
credentials: {
|
|
38
|
+
email: { label: 'Email', type: 'email' },
|
|
39
|
+
password: { label: 'Password', type: 'password' },
|
|
40
|
+
},
|
|
41
|
+
async authorize(credentials) {
|
|
42
|
+
if (!credentials?.email || !credentials?.password) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const email = credentials.email;
|
|
46
|
+
const password = credentials.password;
|
|
47
|
+
// Find user by email
|
|
48
|
+
const user = await db
|
|
49
|
+
.select()
|
|
50
|
+
.from(index_js_1.users)
|
|
51
|
+
.where((0, drizzle_orm_1.eq)(index_js_1.users.email, email))
|
|
52
|
+
.limit(1)
|
|
53
|
+
.then((rows) => rows[0]);
|
|
54
|
+
if (!user || !user.passwordHash) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// Verify password
|
|
58
|
+
const isValidPassword = await (0, bcryptjs_1.compare)(password, user.passwordHash);
|
|
59
|
+
if (!isValidPassword) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
id: user.id,
|
|
64
|
+
email: user.email,
|
|
65
|
+
name: user.name,
|
|
66
|
+
image: user.image,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
// Google OAuth
|
|
71
|
+
(0, google_1.default)({
|
|
72
|
+
clientId: process.env.GOOGLE_CLIENT_ID || '',
|
|
73
|
+
clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',
|
|
74
|
+
allowDangerousEmailAccountLinking: true,
|
|
75
|
+
}),
|
|
76
|
+
// GitHub OAuth
|
|
77
|
+
(0, github_1.default)({
|
|
78
|
+
clientId: process.env.GITHUB_CLIENT_ID || '',
|
|
79
|
+
clientSecret: process.env.GITHUB_CLIENT_SECRET || '',
|
|
80
|
+
allowDangerousEmailAccountLinking: true,
|
|
81
|
+
}),
|
|
82
|
+
],
|
|
83
|
+
session: {
|
|
84
|
+
strategy: 'jwt',
|
|
85
|
+
maxAge: 30 * 24 * 60 * 60, // 30 days
|
|
86
|
+
},
|
|
87
|
+
pages: {
|
|
88
|
+
signIn: '/auth/signin',
|
|
89
|
+
signOut: '/auth/signout',
|
|
90
|
+
error: '/auth/error',
|
|
91
|
+
verifyRequest: '/auth/verify-request',
|
|
92
|
+
},
|
|
93
|
+
callbacks: {
|
|
94
|
+
async jwt({ token, user, account }) {
|
|
95
|
+
if (user) {
|
|
96
|
+
token.id = user.id;
|
|
97
|
+
}
|
|
98
|
+
if (account) {
|
|
99
|
+
token.provider = account.provider;
|
|
100
|
+
}
|
|
101
|
+
return token;
|
|
102
|
+
},
|
|
103
|
+
async session({ session, token }) {
|
|
104
|
+
if (session.user && token.id) {
|
|
105
|
+
session.user.id = token.id;
|
|
106
|
+
}
|
|
107
|
+
return session;
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
trustHost: true,
|
|
111
|
+
secret: process.env.AUTH_SECRET,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/auth/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getAuthConfig } from './config.js';
|
|
2
|
+
export { authService, AuthService } from './service.js';
|
|
3
|
+
export type { SignupInput, LoginInput, AuthResult, TokenResult } from './service.js';
|
|
4
|
+
export { requireAuth, optionalAuth, sessionMiddleware, requireTier, rateLimitByTier, csrfProtection, } from './middleware.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.csrfProtection = exports.rateLimitByTier = exports.requireTier = exports.sessionMiddleware = exports.optionalAuth = exports.requireAuth = exports.AuthService = exports.authService = exports.getAuthConfig = void 0;
|
|
4
|
+
// Auth module exports
|
|
5
|
+
var config_js_1 = require("./config.js");
|
|
6
|
+
Object.defineProperty(exports, "getAuthConfig", { enumerable: true, get: function () { return config_js_1.getAuthConfig; } });
|
|
7
|
+
var service_js_1 = require("./service.js");
|
|
8
|
+
Object.defineProperty(exports, "authService", { enumerable: true, get: function () { return service_js_1.authService; } });
|
|
9
|
+
Object.defineProperty(exports, "AuthService", { enumerable: true, get: function () { return service_js_1.AuthService; } });
|
|
10
|
+
var middleware_js_1 = require("./middleware.js");
|
|
11
|
+
Object.defineProperty(exports, "requireAuth", { enumerable: true, get: function () { return middleware_js_1.requireAuth; } });
|
|
12
|
+
Object.defineProperty(exports, "optionalAuth", { enumerable: true, get: function () { return middleware_js_1.optionalAuth; } });
|
|
13
|
+
Object.defineProperty(exports, "sessionMiddleware", { enumerable: true, get: function () { return middleware_js_1.sessionMiddleware; } });
|
|
14
|
+
Object.defineProperty(exports, "requireTier", { enumerable: true, get: function () { return middleware_js_1.requireTier; } });
|
|
15
|
+
Object.defineProperty(exports, "rateLimitByTier", { enumerable: true, get: function () { return middleware_js_1.rateLimitByTier; } });
|
|
16
|
+
Object.defineProperty(exports, "csrfProtection", { enumerable: true, get: function () { return middleware_js_1.csrfProtection; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;AAAA,sBAAsB;AACtB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,2CAAwD;AAA/C,yGAAA,WAAW,OAAA;AAAE,yGAAA,WAAW,OAAA;AAEjC,iDAOyB;AANvB,4GAAA,WAAW,OAAA;AACX,6GAAA,YAAY,OAAA;AACZ,kHAAA,iBAAiB,OAAA;AACjB,4GAAA,WAAW,OAAA;AACX,gHAAA,eAAe,OAAA;AACf,+GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import type { User } from '../db/schema.js';
|
|
3
|
+
declare global {
|
|
4
|
+
namespace Express {
|
|
5
|
+
interface Request {
|
|
6
|
+
user?: User;
|
|
7
|
+
session?: {
|
|
8
|
+
user: {
|
|
9
|
+
id: string;
|
|
10
|
+
email: string;
|
|
11
|
+
name?: string | null;
|
|
12
|
+
image?: string | null;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Middleware to require authentication
|
|
20
|
+
* Blocks request if user is not authenticated
|
|
21
|
+
*/
|
|
22
|
+
export declare function requireAuth(req: Request, res: Response, next: NextFunction): void;
|
|
23
|
+
/**
|
|
24
|
+
* Middleware to optionally load user if authenticated
|
|
25
|
+
* Does not block request if user is not authenticated
|
|
26
|
+
*/
|
|
27
|
+
export declare function optionalAuth(req: Request, res: Response, next: NextFunction): void;
|
|
28
|
+
/**
|
|
29
|
+
* Middleware to load session and user from request
|
|
30
|
+
* Should be applied globally
|
|
31
|
+
*/
|
|
32
|
+
export declare function sessionMiddleware(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Middleware to require specific subscription tiers
|
|
35
|
+
*/
|
|
36
|
+
export declare function requireTier(...allowedTiers: string[]): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Rate limiting middleware based on subscription tier
|
|
39
|
+
*/
|
|
40
|
+
export declare function rateLimitByTier(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* CSRF protection middleware
|
|
43
|
+
*/
|
|
44
|
+
export declare function csrfProtection(req: Request, res: Response, next: NextFunction): void;
|
|
45
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE,IAAI,CAAC;YACZ,OAAO,CAAC,EAAE;gBACR,IAAI,EAAE;oBACJ,EAAE,EAAE,MAAM,CAAC;oBACX,KAAK,EAAE,MAAM,CAAC;oBACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;oBACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;iBACvB,CAAC;aACH,CAAC;SACH;KACF;CACF;AAoDD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAMjF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAGlF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,IACrC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAU9E;AAED;;GAEG;AACH,wBAAgB,eAAe,KAQf,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAwBpF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireAuth = requireAuth;
|
|
4
|
+
exports.optionalAuth = optionalAuth;
|
|
5
|
+
exports.sessionMiddleware = sessionMiddleware;
|
|
6
|
+
exports.requireTier = requireTier;
|
|
7
|
+
exports.rateLimitByTier = rateLimitByTier;
|
|
8
|
+
exports.csrfProtection = csrfProtection;
|
|
9
|
+
const jose_1 = require("jose");
|
|
10
|
+
const core_1 = require("@auth/core");
|
|
11
|
+
const config_js_1 = require("./config.js");
|
|
12
|
+
const service_js_1 = require("./service.js");
|
|
13
|
+
// JWT secret - must match the one in auth routes
|
|
14
|
+
const JWT_SECRET = new TextEncoder().encode(process.env.JWT_SECRET || 'ucp-tools-jwt-secret-dev');
|
|
15
|
+
/**
|
|
16
|
+
* Extract session from request using Auth.js
|
|
17
|
+
*/
|
|
18
|
+
async function getSessionFromRequest(req) {
|
|
19
|
+
try {
|
|
20
|
+
// Get session token from cookie or authorization header
|
|
21
|
+
const sessionToken = req.cookies?.['authjs.session-token'] ||
|
|
22
|
+
req.cookies?.['__Secure-authjs.session-token'] ||
|
|
23
|
+
extractBearerToken(req.headers.authorization);
|
|
24
|
+
if (!sessionToken) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// For JWT sessions, decode the token
|
|
28
|
+
// This is a simplified version - in production you'd verify the JWT
|
|
29
|
+
const config = (0, config_js_1.getAuthConfig)();
|
|
30
|
+
// Create a mock request for Auth.js
|
|
31
|
+
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
32
|
+
const headers = new Headers();
|
|
33
|
+
Object.entries(req.headers).forEach(([key, value]) => {
|
|
34
|
+
if (value) {
|
|
35
|
+
headers.set(key, Array.isArray(value) ? value.join(', ') : value);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const authRequest = new Request(url, {
|
|
39
|
+
method: req.method,
|
|
40
|
+
headers,
|
|
41
|
+
});
|
|
42
|
+
const response = await (0, core_1.Auth)(authRequest, config);
|
|
43
|
+
// Parse session from response if available
|
|
44
|
+
// This is a fallback - primarily we rely on the session cookie
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function extractBearerToken(header) {
|
|
52
|
+
if (!header?.startsWith('Bearer ')) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return header.slice(7);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Middleware to require authentication
|
|
59
|
+
* Blocks request if user is not authenticated
|
|
60
|
+
*/
|
|
61
|
+
function requireAuth(req, res, next) {
|
|
62
|
+
if (!req.user) {
|
|
63
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
next();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Middleware to optionally load user if authenticated
|
|
70
|
+
* Does not block request if user is not authenticated
|
|
71
|
+
*/
|
|
72
|
+
function optionalAuth(req, res, next) {
|
|
73
|
+
// User is loaded by sessionMiddleware if present
|
|
74
|
+
next();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Middleware to load session and user from request
|
|
78
|
+
* Should be applied globally
|
|
79
|
+
*/
|
|
80
|
+
async function sessionMiddleware(req, res, next) {
|
|
81
|
+
try {
|
|
82
|
+
// Try to get token from Authorization header or session cookie
|
|
83
|
+
const bearerToken = extractBearerToken(req.headers.authorization);
|
|
84
|
+
const sessionToken = req.cookies?.['authjs.session-token'] ||
|
|
85
|
+
req.cookies?.['__Secure-authjs.session-token'];
|
|
86
|
+
const token = bearerToken || sessionToken;
|
|
87
|
+
if (token) {
|
|
88
|
+
try {
|
|
89
|
+
// Verify JWT token
|
|
90
|
+
const { payload } = await (0, jose_1.jwtVerify)(token, JWT_SECRET);
|
|
91
|
+
if (payload.userId && typeof payload.userId === 'string') {
|
|
92
|
+
// Load user from database
|
|
93
|
+
const user = await service_js_1.authService.getUserById(payload.userId);
|
|
94
|
+
if (user) {
|
|
95
|
+
req.user = user;
|
|
96
|
+
req.userId = user.id;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (jwtError) {
|
|
101
|
+
// Token verification failed - continue without auth
|
|
102
|
+
// This could be an expired token or invalid signature
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Also check for API key authentication
|
|
106
|
+
const apiKey = req.headers['x-api-key'];
|
|
107
|
+
if (apiKey && !req.user) {
|
|
108
|
+
// API key auth will be handled by a separate middleware
|
|
109
|
+
}
|
|
110
|
+
next();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
next();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Middleware to require specific subscription tiers
|
|
118
|
+
*/
|
|
119
|
+
function requireTier(...allowedTiers) {
|
|
120
|
+
return async (req, res, next) => {
|
|
121
|
+
if (!req.user) {
|
|
122
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// TODO: Load user subscription and check tier
|
|
126
|
+
// For now, allow all authenticated users
|
|
127
|
+
next();
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Rate limiting middleware based on subscription tier
|
|
132
|
+
*/
|
|
133
|
+
function rateLimitByTier() {
|
|
134
|
+
const limits = {
|
|
135
|
+
free: 100,
|
|
136
|
+
pro: 1000,
|
|
137
|
+
business: 5000,
|
|
138
|
+
agency: 25000,
|
|
139
|
+
};
|
|
140
|
+
return async (req, res, next) => {
|
|
141
|
+
// TODO: Implement rate limiting based on user's subscription tier
|
|
142
|
+
// For now, pass through
|
|
143
|
+
next();
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* CSRF protection middleware
|
|
148
|
+
*/
|
|
149
|
+
function csrfProtection(req, res, next) {
|
|
150
|
+
// Skip CSRF for API routes with API key auth
|
|
151
|
+
if (req.headers['x-api-key']) {
|
|
152
|
+
next();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Skip for safe methods
|
|
156
|
+
if (['GET', 'HEAD', 'OPTIONS'].includes(req.method)) {
|
|
157
|
+
next();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Check CSRF token
|
|
161
|
+
const csrfToken = req.headers['x-csrf-token'] || req.body?._csrf;
|
|
162
|
+
const sessionCsrf = req.cookies?.['csrf-token'];
|
|
163
|
+
if (!csrfToken || csrfToken !== sessionCsrf) {
|
|
164
|
+
// For now, log warning but don't block
|
|
165
|
+
// In production, uncomment the next line:
|
|
166
|
+
// return res.status(403).json({ error: 'Invalid CSRF token' });
|
|
167
|
+
}
|
|
168
|
+
next();
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { User } from '../db/schema.js';
|
|
2
|
+
export interface SignupInput {
|
|
3
|
+
email: string;
|
|
4
|
+
password: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LoginInput {
|
|
8
|
+
email: string;
|
|
9
|
+
password: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AuthResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
user?: User;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TokenResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
token?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Auth service for user management
|
|
23
|
+
*/
|
|
24
|
+
export declare class AuthService {
|
|
25
|
+
private db;
|
|
26
|
+
/**
|
|
27
|
+
* Register a new user with email and password
|
|
28
|
+
*/
|
|
29
|
+
signup(input: SignupInput): Promise<AuthResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Authenticate user with email and password
|
|
32
|
+
*/
|
|
33
|
+
login(input: LoginInput): Promise<AuthResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Generate email verification token
|
|
36
|
+
*/
|
|
37
|
+
createVerificationToken(email: string): Promise<TokenResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Verify email with token
|
|
40
|
+
*/
|
|
41
|
+
verifyEmail(email: string, token: string): Promise<AuthResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Create password reset token
|
|
44
|
+
*/
|
|
45
|
+
createPasswordResetToken(email: string): Promise<TokenResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Reset password with token
|
|
48
|
+
*/
|
|
49
|
+
resetPassword(email: string, token: string, newPassword: string): Promise<AuthResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Get user by ID
|
|
52
|
+
*/
|
|
53
|
+
getUserById(id: string): Promise<User | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Get user by email
|
|
56
|
+
*/
|
|
57
|
+
getUserByEmail(email: string): Promise<User | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Update user profile
|
|
60
|
+
*/
|
|
61
|
+
updateProfile(userId: string, data: {
|
|
62
|
+
name?: string;
|
|
63
|
+
image?: string;
|
|
64
|
+
}): Promise<AuthResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Change password for authenticated user
|
|
67
|
+
*/
|
|
68
|
+
changePassword(userId: string, currentPassword: string, newPassword: string): Promise<AuthResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Delete user account
|
|
71
|
+
*/
|
|
72
|
+
deleteAccount(userId: string): Promise<{
|
|
73
|
+
success: boolean;
|
|
74
|
+
error?: string;
|
|
75
|
+
}>;
|
|
76
|
+
private isValidEmail;
|
|
77
|
+
private validatePassword;
|
|
78
|
+
}
|
|
79
|
+
export declare const authService: AuthService;
|
|
80
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/auth/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,iBAAiB,CAAC;AAKrD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAW;IAErB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAiDrD;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA4BnD;;OAEG;IACG,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAalE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCpE;;OAEG;IACG,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgCnE;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwC3F;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAgBnD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAWzD;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACtC,OAAO,CAAC,UAAU,CAAC;IAmBtB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC;IA0BtB;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAOlF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;CAezB;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|