@ucptools/validator 1.0.0 → 1.0.1
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/.claude/settings.local.json +60 -0
- package/.vercel/README.txt +11 -0
- package/.vercel/project.json +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +279 -0
- package/dist/cli/index.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 +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +63 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +444 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +65 -0
- package/dist/db/schema.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} +642 -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 +204 -0
- package/dist/feed-analyzer/types.d.ts.map +1 -0
- package/dist/feed-analyzer/types.js +162 -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/{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 +541 -0
- package/dist/security/security-scanner.js.map +1 -0
- package/dist/security/types.d.ts +48 -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/directory.d.ts +104 -0
- package/dist/services/directory.d.ts.map +1 -0
- package/dist/services/directory.js +333 -0
- package/dist/services/directory.js.map +1 -0
- package/dist/simulator/agent-simulator.d.ts +69 -0
- package/dist/simulator/agent-simulator.d.ts.map +1 -0
- package/{src/simulator/agent-simulator.ts → dist/simulator/agent-simulator.js} +650 -941
- 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} +145 -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/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 +103 -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 +68 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +32 -0
- package/dist/types/validation.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 +11 -0
- package/dist/validator/rules-validator.d.ts.map +1 -0
- package/dist/validator/rules-validator.js +257 -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 +415 -0
- package/dist/validator/structural-validator.js.map +1 -0
- package/package.json +1 -1
- package/publish-output.txt +0 -0
- 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/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/vercel.json +0 -34
- package/vitest.config.ts +0 -22
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UCP (Universal Commerce Protocol) Profile Types
|
|
3
|
+
* Based on https://ucp.dev/specification/overview/
|
|
4
|
+
*/
|
|
5
|
+
export declare const CURRENT_UCP_VERSION = "2026-01-11";
|
|
6
|
+
export interface RestTransport {
|
|
7
|
+
schema: string;
|
|
8
|
+
endpoint: string;
|
|
9
|
+
}
|
|
10
|
+
export interface McpTransport {
|
|
11
|
+
schema: string;
|
|
12
|
+
endpoint: string;
|
|
13
|
+
}
|
|
14
|
+
export interface A2aTransport {
|
|
15
|
+
agentCard: string;
|
|
16
|
+
}
|
|
17
|
+
export interface EmbeddedTransport {
|
|
18
|
+
schema: string;
|
|
19
|
+
}
|
|
20
|
+
export interface UcpService {
|
|
21
|
+
version: string;
|
|
22
|
+
spec: string;
|
|
23
|
+
rest?: RestTransport;
|
|
24
|
+
mcp?: McpTransport;
|
|
25
|
+
a2a?: A2aTransport;
|
|
26
|
+
embedded?: EmbeddedTransport;
|
|
27
|
+
}
|
|
28
|
+
export interface UcpCapability {
|
|
29
|
+
name: string;
|
|
30
|
+
version: string;
|
|
31
|
+
spec: string;
|
|
32
|
+
schema: string;
|
|
33
|
+
extends?: string;
|
|
34
|
+
config?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export interface JwkKey {
|
|
37
|
+
kty: string;
|
|
38
|
+
kid: string;
|
|
39
|
+
use?: string;
|
|
40
|
+
alg?: string;
|
|
41
|
+
crv?: string;
|
|
42
|
+
x?: string;
|
|
43
|
+
y?: string;
|
|
44
|
+
n?: string;
|
|
45
|
+
e?: string;
|
|
46
|
+
}
|
|
47
|
+
export type SigningKeys = JwkKey[];
|
|
48
|
+
export interface PaymentHandler {
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
version: string;
|
|
52
|
+
spec: string;
|
|
53
|
+
config_schema?: string;
|
|
54
|
+
instrument_schemas?: string[];
|
|
55
|
+
config?: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
export interface PaymentConfig {
|
|
58
|
+
handlers: PaymentHandler[];
|
|
59
|
+
}
|
|
60
|
+
export interface UcpObject {
|
|
61
|
+
version: string;
|
|
62
|
+
services: Record<string, UcpService>;
|
|
63
|
+
capabilities: UcpCapability[];
|
|
64
|
+
}
|
|
65
|
+
export interface UcpProfile {
|
|
66
|
+
ucp: UcpObject;
|
|
67
|
+
payment?: PaymentConfig;
|
|
68
|
+
signing_keys?: SigningKeys;
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
}
|
|
71
|
+
export declare const CAPABILITY_NAMESPACES: {
|
|
72
|
+
readonly UCP_OFFICIAL: "dev.ucp.";
|
|
73
|
+
readonly VENDOR_PREFIX: "com.";
|
|
74
|
+
};
|
|
75
|
+
export declare const KNOWN_CAPABILITIES: {
|
|
76
|
+
readonly CHECKOUT: "dev.ucp.shopping.checkout";
|
|
77
|
+
readonly ORDER: "dev.ucp.shopping.order";
|
|
78
|
+
readonly PAYMENT: "dev.ucp.shopping.payment";
|
|
79
|
+
readonly PAYMENT_DATA: "dev.ucp.shopping.payment_data";
|
|
80
|
+
readonly FULFILLMENT: "dev.ucp.shopping.fulfillment";
|
|
81
|
+
readonly DISCOUNT: "dev.ucp.shopping.discount";
|
|
82
|
+
readonly BUYER_CONSENT: "dev.ucp.shopping.buyer_consent";
|
|
83
|
+
};
|
|
84
|
+
export declare const KNOWN_SERVICES: {
|
|
85
|
+
readonly SHOPPING: "dev.ucp.shopping";
|
|
86
|
+
};
|
|
87
|
+
export declare const UCP_DEFAULTS: {
|
|
88
|
+
readonly SPEC_BASE: "https://ucp.dev/specification/";
|
|
89
|
+
readonly SCHEMA_BASE: "https://ucp.dev/schemas/";
|
|
90
|
+
readonly SERVICE_SCHEMA_BASE: "https://ucp.dev/services/";
|
|
91
|
+
readonly SHOPPING_REST_SCHEMA: "https://ucp.dev/services/shopping/rest.openapi.json";
|
|
92
|
+
readonly CHECKOUT_SPEC: "https://ucp.dev/specification/checkout/";
|
|
93
|
+
readonly CHECKOUT_SCHEMA: "https://ucp.dev/schemas/shopping/checkout.json";
|
|
94
|
+
readonly ORDER_SPEC: "https://ucp.dev/specification/order/";
|
|
95
|
+
readonly ORDER_SCHEMA: "https://ucp.dev/schemas/shopping/order.json";
|
|
96
|
+
readonly FULFILLMENT_SPEC: "https://ucp.dev/specification/fulfillment/";
|
|
97
|
+
readonly FULFILLMENT_SCHEMA: "https://ucp.dev/schemas/shopping/fulfillment.json";
|
|
98
|
+
readonly DISCOUNT_SPEC: "https://ucp.dev/specification/discount/";
|
|
99
|
+
readonly DISCOUNT_SCHEMA: "https://ucp.dev/schemas/shopping/discount.json";
|
|
100
|
+
};
|
|
101
|
+
export type Environment = 'production' | 'staging' | 'development';
|
|
102
|
+
export type ProfileStatus = 'draft' | 'published';
|
|
103
|
+
//# sourceMappingURL=ucp-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucp-profile.d.ts","sourceRoot":"","sources":["../../src/types/ucp-profile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAGD,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;AAGnC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAGD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,YAAY,EAAE,aAAa,EAAE,CAAC;CAC/B;AAGD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC;IAE3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC;AAGX,eAAO,MAAM,kBAAkB;;;;;;;;CAQrB,CAAC;AAGX,eAAO,MAAM,cAAc;;CAEjB,CAAC;AAGX,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAef,CAAC;AAGX,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;AAGnE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,WAAW,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UCP (Universal Commerce Protocol) Profile Types
|
|
4
|
+
* Based on https://ucp.dev/specification/overview/
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.UCP_DEFAULTS = exports.KNOWN_SERVICES = exports.KNOWN_CAPABILITIES = exports.CAPABILITY_NAMESPACES = exports.CURRENT_UCP_VERSION = void 0;
|
|
8
|
+
// Current UCP version
|
|
9
|
+
exports.CURRENT_UCP_VERSION = '2026-01-11';
|
|
10
|
+
// Known capability namespaces
|
|
11
|
+
exports.CAPABILITY_NAMESPACES = {
|
|
12
|
+
UCP_OFFICIAL: 'dev.ucp.',
|
|
13
|
+
VENDOR_PREFIX: 'com.',
|
|
14
|
+
};
|
|
15
|
+
// Known UCP capabilities (from official spec)
|
|
16
|
+
exports.KNOWN_CAPABILITIES = {
|
|
17
|
+
CHECKOUT: 'dev.ucp.shopping.checkout',
|
|
18
|
+
ORDER: 'dev.ucp.shopping.order',
|
|
19
|
+
PAYMENT: 'dev.ucp.shopping.payment',
|
|
20
|
+
PAYMENT_DATA: 'dev.ucp.shopping.payment_data',
|
|
21
|
+
FULFILLMENT: 'dev.ucp.shopping.fulfillment',
|
|
22
|
+
DISCOUNT: 'dev.ucp.shopping.discount',
|
|
23
|
+
BUYER_CONSENT: 'dev.ucp.shopping.buyer_consent',
|
|
24
|
+
};
|
|
25
|
+
// Known UCP services
|
|
26
|
+
exports.KNOWN_SERVICES = {
|
|
27
|
+
SHOPPING: 'dev.ucp.shopping',
|
|
28
|
+
};
|
|
29
|
+
// Default URLs for UCP official resources
|
|
30
|
+
exports.UCP_DEFAULTS = {
|
|
31
|
+
SPEC_BASE: 'https://ucp.dev/specification/',
|
|
32
|
+
SCHEMA_BASE: 'https://ucp.dev/schemas/',
|
|
33
|
+
SERVICE_SCHEMA_BASE: 'https://ucp.dev/services/',
|
|
34
|
+
// Default schema URLs
|
|
35
|
+
SHOPPING_REST_SCHEMA: 'https://ucp.dev/services/shopping/rest.openapi.json',
|
|
36
|
+
CHECKOUT_SPEC: 'https://ucp.dev/specification/checkout/',
|
|
37
|
+
CHECKOUT_SCHEMA: 'https://ucp.dev/schemas/shopping/checkout.json',
|
|
38
|
+
ORDER_SPEC: 'https://ucp.dev/specification/order/',
|
|
39
|
+
ORDER_SCHEMA: 'https://ucp.dev/schemas/shopping/order.json',
|
|
40
|
+
FULFILLMENT_SPEC: 'https://ucp.dev/specification/fulfillment/',
|
|
41
|
+
FULFILLMENT_SCHEMA: 'https://ucp.dev/schemas/shopping/fulfillment.json',
|
|
42
|
+
DISCOUNT_SPEC: 'https://ucp.dev/specification/discount/',
|
|
43
|
+
DISCOUNT_SCHEMA: 'https://ucp.dev/schemas/shopping/discount.json',
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=ucp-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucp-profile.js","sourceRoot":"","sources":["../../src/types/ucp-profile.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,sBAAsB;AACT,QAAA,mBAAmB,GAAG,YAAY,CAAC;AAyFhD,8BAA8B;AACjB,QAAA,qBAAqB,GAAG;IACnC,YAAY,EAAE,UAAU;IACxB,aAAa,EAAE,MAAM;CACb,CAAC;AAEX,8CAA8C;AACjC,QAAA,kBAAkB,GAAG;IAChC,QAAQ,EAAE,2BAA2B;IACrC,KAAK,EAAE,wBAAwB;IAC/B,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,+BAA+B;IAC7C,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,2BAA2B;IACrC,aAAa,EAAE,gCAAgC;CACvC,CAAC;AAEX,qBAAqB;AACR,QAAA,cAAc,GAAG;IAC5B,QAAQ,EAAE,kBAAkB;CACpB,CAAC;AAEX,0CAA0C;AAC7B,QAAA,YAAY,GAAG;IAC1B,SAAS,EAAE,gCAAgC;IAC3C,WAAW,EAAE,0BAA0B;IACvC,mBAAmB,EAAE,2BAA2B;IAEhD,sBAAsB;IACtB,oBAAoB,EAAE,qDAAqD;IAC3E,aAAa,EAAE,yCAAyC;IACxD,eAAe,EAAE,gDAAgD;IACjE,UAAU,EAAE,sCAAsC;IAClD,YAAY,EAAE,6CAA6C;IAC3D,gBAAgB,EAAE,4CAA4C;IAC9D,kBAAkB,EAAE,mDAAmD;IACvE,aAAa,EAAE,yCAAyC;IACxD,eAAe,EAAE,gDAAgD;CACzD,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Types for UCP Profile Validator
|
|
3
|
+
*/
|
|
4
|
+
export type ValidationSeverity = 'error' | 'warn' | 'info';
|
|
5
|
+
export declare const ValidationErrorCodes: {
|
|
6
|
+
readonly MISSING_UCP_OBJECT: "UCP_MISSING_ROOT";
|
|
7
|
+
readonly MISSING_VERSION: "UCP_MISSING_VERSION";
|
|
8
|
+
readonly INVALID_VERSION_FORMAT: "UCP_INVALID_VERSION_FORMAT";
|
|
9
|
+
readonly MISSING_SERVICES: "UCP_MISSING_SERVICES";
|
|
10
|
+
readonly MISSING_CAPABILITIES: "UCP_MISSING_CAPABILITIES";
|
|
11
|
+
readonly INVALID_SERVICE_STRUCTURE: "UCP_INVALID_SERVICE";
|
|
12
|
+
readonly INVALID_CAPABILITY_STRUCTURE: "UCP_INVALID_CAPABILITY";
|
|
13
|
+
readonly NS_ORIGIN_MISMATCH: "UCP_NS_ORIGIN_MISMATCH";
|
|
14
|
+
readonly ORPHANED_EXTENSION: "UCP_ORPHANED_EXTENSION";
|
|
15
|
+
readonly ENDPOINT_NOT_HTTPS: "UCP_ENDPOINT_NOT_HTTPS";
|
|
16
|
+
readonly ENDPOINT_TRAILING_SLASH: "UCP_ENDPOINT_TRAILING_SLASH";
|
|
17
|
+
readonly MISSING_SIGNING_KEYS: "UCP_MISSING_SIGNING_KEYS";
|
|
18
|
+
readonly INVALID_SIGNING_KEY: "UCP_INVALID_SIGNING_KEY";
|
|
19
|
+
readonly PROFILE_FETCH_FAILED: "UCP_PROFILE_FETCH_FAILED";
|
|
20
|
+
readonly SCHEMA_FETCH_FAILED: "UCP_SCHEMA_FETCH_FAILED";
|
|
21
|
+
readonly SCHEMA_NOT_SELF_DESCRIBING: "UCP_SCHEMA_NOT_SELF_DESCRIBING";
|
|
22
|
+
readonly SCHEMA_NAME_MISMATCH: "UCP_SCHEMA_NAME_MISMATCH";
|
|
23
|
+
readonly SCHEMA_VERSION_MISMATCH: "UCP_SCHEMA_VERSION_MISMATCH";
|
|
24
|
+
readonly PRIVATE_IP_ENDPOINT: "UCP_PRIVATE_IP_ENDPOINT";
|
|
25
|
+
};
|
|
26
|
+
export type ValidationErrorCode = typeof ValidationErrorCodes[keyof typeof ValidationErrorCodes];
|
|
27
|
+
export interface ValidationIssue {
|
|
28
|
+
severity: ValidationSeverity;
|
|
29
|
+
code: ValidationErrorCode;
|
|
30
|
+
path: string;
|
|
31
|
+
message: string;
|
|
32
|
+
hint?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ValidationReport {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
profile_url?: string;
|
|
37
|
+
ucp_version?: string;
|
|
38
|
+
issues: ValidationIssue[];
|
|
39
|
+
validated_at: string;
|
|
40
|
+
validation_mode: ValidationMode;
|
|
41
|
+
sdk_validation?: {
|
|
42
|
+
validated: boolean;
|
|
43
|
+
sdk_version: string;
|
|
44
|
+
compliant: boolean;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export type ValidationMode = 'structural' | 'rules' | 'network' | 'full';
|
|
48
|
+
export interface ValidationOptions {
|
|
49
|
+
mode?: ValidationMode;
|
|
50
|
+
skipNetworkChecks?: boolean;
|
|
51
|
+
timeoutMs?: number;
|
|
52
|
+
cacheTtlMs?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface SchemaCacheEntry {
|
|
55
|
+
url: string;
|
|
56
|
+
etag?: string;
|
|
57
|
+
fetchedAt: string;
|
|
58
|
+
body: Record<string, unknown>;
|
|
59
|
+
expiresAt: string;
|
|
60
|
+
}
|
|
61
|
+
export interface FetchResult<T> {
|
|
62
|
+
success: boolean;
|
|
63
|
+
data?: T;
|
|
64
|
+
error?: string;
|
|
65
|
+
statusCode?: number;
|
|
66
|
+
etag?: string;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/types/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAG3D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;CAyBvB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,oBAAoB,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAGjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAGD,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAGzE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation Types for UCP Profile Validator
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ValidationErrorCodes = void 0;
|
|
7
|
+
// Validation error codes
|
|
8
|
+
exports.ValidationErrorCodes = {
|
|
9
|
+
// Structural errors
|
|
10
|
+
MISSING_UCP_OBJECT: 'UCP_MISSING_ROOT',
|
|
11
|
+
MISSING_VERSION: 'UCP_MISSING_VERSION',
|
|
12
|
+
INVALID_VERSION_FORMAT: 'UCP_INVALID_VERSION_FORMAT',
|
|
13
|
+
MISSING_SERVICES: 'UCP_MISSING_SERVICES',
|
|
14
|
+
MISSING_CAPABILITIES: 'UCP_MISSING_CAPABILITIES',
|
|
15
|
+
INVALID_SERVICE_STRUCTURE: 'UCP_INVALID_SERVICE',
|
|
16
|
+
INVALID_CAPABILITY_STRUCTURE: 'UCP_INVALID_CAPABILITY',
|
|
17
|
+
// UCP rules errors
|
|
18
|
+
NS_ORIGIN_MISMATCH: 'UCP_NS_ORIGIN_MISMATCH',
|
|
19
|
+
ORPHANED_EXTENSION: 'UCP_ORPHANED_EXTENSION',
|
|
20
|
+
ENDPOINT_NOT_HTTPS: 'UCP_ENDPOINT_NOT_HTTPS',
|
|
21
|
+
ENDPOINT_TRAILING_SLASH: 'UCP_ENDPOINT_TRAILING_SLASH',
|
|
22
|
+
MISSING_SIGNING_KEYS: 'UCP_MISSING_SIGNING_KEYS',
|
|
23
|
+
INVALID_SIGNING_KEY: 'UCP_INVALID_SIGNING_KEY',
|
|
24
|
+
// Network validation errors
|
|
25
|
+
PROFILE_FETCH_FAILED: 'UCP_PROFILE_FETCH_FAILED',
|
|
26
|
+
SCHEMA_FETCH_FAILED: 'UCP_SCHEMA_FETCH_FAILED',
|
|
27
|
+
SCHEMA_NOT_SELF_DESCRIBING: 'UCP_SCHEMA_NOT_SELF_DESCRIBING',
|
|
28
|
+
SCHEMA_NAME_MISMATCH: 'UCP_SCHEMA_NAME_MISMATCH',
|
|
29
|
+
SCHEMA_VERSION_MISMATCH: 'UCP_SCHEMA_VERSION_MISMATCH',
|
|
30
|
+
PRIVATE_IP_ENDPOINT: 'UCP_PRIVATE_IP_ENDPOINT',
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/types/validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,yBAAyB;AACZ,QAAA,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,kBAAkB,EAAE,kBAAkB;IACtC,eAAe,EAAE,qBAAqB;IACtC,sBAAsB,EAAE,4BAA4B;IACpD,gBAAgB,EAAE,sBAAsB;IACxC,oBAAoB,EAAE,0BAA0B;IAChD,yBAAyB,EAAE,qBAAqB;IAChD,4BAA4B,EAAE,wBAAwB;IAEtD,mBAAmB;IACnB,kBAAkB,EAAE,wBAAwB;IAC5C,kBAAkB,EAAE,wBAAwB;IAC5C,kBAAkB,EAAE,wBAAwB;IAC5C,uBAAuB,EAAE,6BAA6B;IACtD,oBAAoB,EAAE,0BAA0B;IAChD,mBAAmB,EAAE,yBAAyB;IAE9C,4BAA4B;IAC5B,oBAAoB,EAAE,0BAA0B;IAChD,mBAAmB,EAAE,yBAAyB;IAC9C,0BAA0B,EAAE,gCAAgC;IAC5D,oBAAoB,EAAE,0BAA0B;IAChD,uBAAuB,EAAE,6BAA6B;IACtD,mBAAmB,EAAE,yBAAyB;CACtC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UCP Profile Validator
|
|
3
|
+
* Main entry point combining structural, rules, and network validation
|
|
4
|
+
*/
|
|
5
|
+
import type { ValidationReport, ValidationOptions } from '../types/validation.js';
|
|
6
|
+
export { validateStructure } from './structural-validator.js';
|
|
7
|
+
export { validateRules } from './rules-validator.js';
|
|
8
|
+
export { validateNetwork, validateRemoteProfile, clearSchemaCache } from './network-validator.js';
|
|
9
|
+
export { safeValidateWithSdk, validateWithSdk, getSdkVersion, isSdkCompliant, validateServiceWithSdk, validateCapabilityWithSdk, validateSigningKeysWithSdk, } from './sdk-validator.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate a UCP profile (local JSON)
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateProfile(profile: unknown, options?: ValidationOptions): Promise<ValidationReport>;
|
|
14
|
+
/**
|
|
15
|
+
* Validate a remote UCP profile (fetches from domain)
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateRemote(domain: string, options?: ValidationOptions): Promise<ValidationReport>;
|
|
18
|
+
/**
|
|
19
|
+
* Quick validation (structural + rules only, no network)
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateQuick(profile: unknown): ValidationReport;
|
|
22
|
+
/**
|
|
23
|
+
* Parse and validate JSON string
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateJsonString(json: string, options?: ValidationOptions): Promise<ValidationReport>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,gBAAgB,EAGhB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAsC3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAqB3B;AA4CD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAehE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAmB3B"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UCP Profile Validator
|
|
4
|
+
* Main entry point combining structural, rules, and network validation
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateSigningKeysWithSdk = exports.validateCapabilityWithSdk = exports.validateServiceWithSdk = exports.isSdkCompliant = exports.getSdkVersion = exports.validateWithSdk = exports.safeValidateWithSdk = exports.clearSchemaCache = exports.validateRemoteProfile = exports.validateNetwork = exports.validateRules = exports.validateStructure = void 0;
|
|
8
|
+
exports.validateProfile = validateProfile;
|
|
9
|
+
exports.validateRemote = validateRemote;
|
|
10
|
+
exports.validateQuick = validateQuick;
|
|
11
|
+
exports.validateJsonString = validateJsonString;
|
|
12
|
+
const structural_validator_js_1 = require("./structural-validator.js");
|
|
13
|
+
const rules_validator_js_1 = require("./rules-validator.js");
|
|
14
|
+
const network_validator_js_1 = require("./network-validator.js");
|
|
15
|
+
const sdk_validator_js_1 = require("./sdk-validator.js");
|
|
16
|
+
var structural_validator_js_2 = require("./structural-validator.js");
|
|
17
|
+
Object.defineProperty(exports, "validateStructure", { enumerable: true, get: function () { return structural_validator_js_2.validateStructure; } });
|
|
18
|
+
var rules_validator_js_2 = require("./rules-validator.js");
|
|
19
|
+
Object.defineProperty(exports, "validateRules", { enumerable: true, get: function () { return rules_validator_js_2.validateRules; } });
|
|
20
|
+
var network_validator_js_2 = require("./network-validator.js");
|
|
21
|
+
Object.defineProperty(exports, "validateNetwork", { enumerable: true, get: function () { return network_validator_js_2.validateNetwork; } });
|
|
22
|
+
Object.defineProperty(exports, "validateRemoteProfile", { enumerable: true, get: function () { return network_validator_js_2.validateRemoteProfile; } });
|
|
23
|
+
Object.defineProperty(exports, "clearSchemaCache", { enumerable: true, get: function () { return network_validator_js_2.clearSchemaCache; } });
|
|
24
|
+
var sdk_validator_js_2 = require("./sdk-validator.js");
|
|
25
|
+
Object.defineProperty(exports, "safeValidateWithSdk", { enumerable: true, get: function () { return sdk_validator_js_2.safeValidateWithSdk; } });
|
|
26
|
+
Object.defineProperty(exports, "validateWithSdk", { enumerable: true, get: function () { return sdk_validator_js_2.validateWithSdk; } });
|
|
27
|
+
Object.defineProperty(exports, "getSdkVersion", { enumerable: true, get: function () { return sdk_validator_js_2.getSdkVersion; } });
|
|
28
|
+
Object.defineProperty(exports, "isSdkCompliant", { enumerable: true, get: function () { return sdk_validator_js_2.isSdkCompliant; } });
|
|
29
|
+
Object.defineProperty(exports, "validateServiceWithSdk", { enumerable: true, get: function () { return sdk_validator_js_2.validateServiceWithSdk; } });
|
|
30
|
+
Object.defineProperty(exports, "validateCapabilityWithSdk", { enumerable: true, get: function () { return sdk_validator_js_2.validateCapabilityWithSdk; } });
|
|
31
|
+
Object.defineProperty(exports, "validateSigningKeysWithSdk", { enumerable: true, get: function () { return sdk_validator_js_2.validateSigningKeysWithSdk; } });
|
|
32
|
+
/**
|
|
33
|
+
* Validate a UCP profile (local JSON)
|
|
34
|
+
*/
|
|
35
|
+
async function validateProfile(profile, options = {}) {
|
|
36
|
+
const mode = options.mode || 'full';
|
|
37
|
+
const issues = [];
|
|
38
|
+
// Phase 1: Structural validation (always run)
|
|
39
|
+
if (mode === 'structural' || mode === 'rules' || mode === 'full') {
|
|
40
|
+
const structuralIssues = (0, structural_validator_js_1.validateStructure)(profile);
|
|
41
|
+
issues.push(...structuralIssues);
|
|
42
|
+
// If structural validation has errors, don't proceed with rules/network
|
|
43
|
+
const hasStructuralErrors = structuralIssues.some(i => i.severity === 'error');
|
|
44
|
+
if (hasStructuralErrors && mode !== 'structural') {
|
|
45
|
+
return buildReport(issues, mode, undefined, profile);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// At this point, profile structure is valid
|
|
49
|
+
const ucpProfile = profile;
|
|
50
|
+
// Phase 2: UCP rules validation
|
|
51
|
+
if (mode === 'rules' || mode === 'full') {
|
|
52
|
+
const rulesIssues = (0, rules_validator_js_1.validateRules)(ucpProfile);
|
|
53
|
+
issues.push(...rulesIssues);
|
|
54
|
+
}
|
|
55
|
+
// Phase 3: Network validation (optional)
|
|
56
|
+
if (mode === 'network' || mode === 'full') {
|
|
57
|
+
if (!options.skipNetworkChecks) {
|
|
58
|
+
const networkOptions = {
|
|
59
|
+
timeoutMs: options.timeoutMs,
|
|
60
|
+
cacheTtlMs: options.cacheTtlMs,
|
|
61
|
+
};
|
|
62
|
+
const networkIssues = await (0, network_validator_js_1.validateNetwork)(ucpProfile, networkOptions);
|
|
63
|
+
issues.push(...networkIssues);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return buildReport(issues, mode, undefined, ucpProfile);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate a remote UCP profile (fetches from domain)
|
|
70
|
+
*/
|
|
71
|
+
async function validateRemote(domain, options = {}) {
|
|
72
|
+
const issues = [];
|
|
73
|
+
// Fetch remote profile
|
|
74
|
+
const { profile, profileUrl: foundProfileUrl, issues: fetchIssues } = await (0, network_validator_js_1.validateRemoteProfile)(domain, {
|
|
75
|
+
timeoutMs: options.timeoutMs,
|
|
76
|
+
cacheTtlMs: options.cacheTtlMs,
|
|
77
|
+
});
|
|
78
|
+
issues.push(...fetchIssues);
|
|
79
|
+
const profileUrl = foundProfileUrl || `https://${domain}/.well-known/ucp`;
|
|
80
|
+
if (!profile) {
|
|
81
|
+
return buildReport(issues, 'network', profileUrl, undefined);
|
|
82
|
+
}
|
|
83
|
+
// Run full validation on fetched profile
|
|
84
|
+
const validationResult = await validateProfile(profile, options);
|
|
85
|
+
issues.push(...validationResult.issues);
|
|
86
|
+
return buildReport(issues, options.mode || 'full', profileUrl, profile);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build validation report
|
|
90
|
+
*/
|
|
91
|
+
function buildReport(issues, mode, profileUrl, profile) {
|
|
92
|
+
// Determine if validation passed (no errors)
|
|
93
|
+
const hasErrors = issues.some(i => i.severity === 'error');
|
|
94
|
+
// Extract UCP version if available
|
|
95
|
+
let ucpVersion;
|
|
96
|
+
if (profile && typeof profile === 'object') {
|
|
97
|
+
const p = profile;
|
|
98
|
+
if (p.ucp && typeof p.ucp === 'object') {
|
|
99
|
+
const ucp = p.ucp;
|
|
100
|
+
if (typeof ucp.version === 'string') {
|
|
101
|
+
ucpVersion = ucp.version;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Run SDK validation for compliance check
|
|
106
|
+
const sdkCompliant = profile ? (0, sdk_validator_js_1.isSdkCompliant)(profile) : false;
|
|
107
|
+
return {
|
|
108
|
+
ok: !hasErrors,
|
|
109
|
+
profile_url: profileUrl,
|
|
110
|
+
ucp_version: ucpVersion,
|
|
111
|
+
issues,
|
|
112
|
+
validated_at: new Date().toISOString(),
|
|
113
|
+
validation_mode: mode,
|
|
114
|
+
sdk_validation: {
|
|
115
|
+
validated: true,
|
|
116
|
+
sdk_version: (0, sdk_validator_js_1.getSdkVersion)(),
|
|
117
|
+
compliant: sdkCompliant,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Quick validation (structural + rules only, no network)
|
|
123
|
+
*/
|
|
124
|
+
function validateQuick(profile) {
|
|
125
|
+
const issues = [];
|
|
126
|
+
// Structural validation
|
|
127
|
+
const structuralIssues = (0, structural_validator_js_1.validateStructure)(profile);
|
|
128
|
+
issues.push(...structuralIssues);
|
|
129
|
+
// If structural is OK, run rules validation
|
|
130
|
+
const hasStructuralErrors = structuralIssues.some(i => i.severity === 'error');
|
|
131
|
+
if (!hasStructuralErrors) {
|
|
132
|
+
const rulesIssues = (0, rules_validator_js_1.validateRules)(profile);
|
|
133
|
+
issues.push(...rulesIssues);
|
|
134
|
+
}
|
|
135
|
+
return buildReport(issues, 'rules', undefined, profile);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Parse and validate JSON string
|
|
139
|
+
*/
|
|
140
|
+
async function validateJsonString(json, options = {}) {
|
|
141
|
+
try {
|
|
142
|
+
const profile = JSON.parse(json);
|
|
143
|
+
return validateProfile(profile, options);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const message = error instanceof Error ? error.message : 'Invalid JSON';
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
issues: [{
|
|
150
|
+
severity: 'error',
|
|
151
|
+
code: 'UCP_MISSING_ROOT',
|
|
152
|
+
path: '$',
|
|
153
|
+
message: `Failed to parse JSON: ${message}`,
|
|
154
|
+
hint: 'Ensure the input is valid JSON',
|
|
155
|
+
}],
|
|
156
|
+
validated_at: new Date().toISOString(),
|
|
157
|
+
validation_mode: options.mode || 'full',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Validator
|
|
3
|
+
* Validates UCP profile with network checks (fetches remote schemas)
|
|
4
|
+
*/
|
|
5
|
+
import type { UcpProfile } from '../types/ucp-profile.js';
|
|
6
|
+
import type { ValidationIssue } from '../types/validation.js';
|
|
7
|
+
export interface NetworkValidationOptions {
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
cacheTtlMs?: number;
|
|
10
|
+
skipSchemaFetch?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate UCP profile with network checks
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateNetwork(profile: UcpProfile, options?: NetworkValidationOptions): Promise<ValidationIssue[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Validate remote profile fetch
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateRemoteProfile(domain: string, options?: NetworkValidationOptions): Promise<{
|
|
20
|
+
profile: UcpProfile | null;
|
|
21
|
+
profileUrl?: string;
|
|
22
|
+
issues: ValidationIssue[];
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Clear the schema cache
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearSchemaCache(): void;
|
|
28
|
+
//# sourceMappingURL=network-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-validator.d.ts","sourceRoot":"","sources":["../../src/validator/network-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAiC,MAAM,wBAAwB,CAAC;AAQ7F,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,eAAe,EAAE,CAAC,CA8B5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC;IAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAwCzF;AAmTD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|