@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,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Signing Key Generator for UCP Webhook Signing
|
|
4
|
+
* Generates EC or RSA key pairs in JWK format
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.generateSigningKeyPair = generateSigningKeyPair;
|
|
41
|
+
exports.validatePublicKey = validatePublicKey;
|
|
42
|
+
exports.importPublicKey = importPublicKey;
|
|
43
|
+
const jose = __importStar(require("jose"));
|
|
44
|
+
const nanoid_1 = require("nanoid");
|
|
45
|
+
/**
|
|
46
|
+
* Generate a new signing key pair
|
|
47
|
+
*/
|
|
48
|
+
async function generateSigningKeyPair(algorithm = 'ES256') {
|
|
49
|
+
const keyId = `ucp-${(0, nanoid_1.nanoid)(12)}`;
|
|
50
|
+
if (algorithm === 'ES256') {
|
|
51
|
+
return generateECKeyPair(keyId);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return generateRSAKeyPair(keyId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate EC (P-256) key pair
|
|
59
|
+
*/
|
|
60
|
+
async function generateECKeyPair(keyId) {
|
|
61
|
+
const { publicKey, privateKey } = await jose.generateKeyPair('ES256', {
|
|
62
|
+
extractable: true,
|
|
63
|
+
});
|
|
64
|
+
// Export public key as JWK
|
|
65
|
+
const publicJwk = await jose.exportJWK(publicKey);
|
|
66
|
+
// Export private key as PEM
|
|
67
|
+
const privatePem = await jose.exportPKCS8(privateKey);
|
|
68
|
+
return {
|
|
69
|
+
publicKey: {
|
|
70
|
+
kty: 'EC',
|
|
71
|
+
kid: keyId,
|
|
72
|
+
use: 'sig',
|
|
73
|
+
alg: 'ES256',
|
|
74
|
+
crv: publicJwk.crv,
|
|
75
|
+
x: publicJwk.x,
|
|
76
|
+
y: publicJwk.y,
|
|
77
|
+
},
|
|
78
|
+
privateKey: privatePem,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate RSA (2048-bit) key pair
|
|
83
|
+
*/
|
|
84
|
+
async function generateRSAKeyPair(keyId) {
|
|
85
|
+
const { publicKey, privateKey } = await jose.generateKeyPair('RS256', {
|
|
86
|
+
extractable: true,
|
|
87
|
+
modulusLength: 2048,
|
|
88
|
+
});
|
|
89
|
+
// Export public key as JWK
|
|
90
|
+
const publicJwk = await jose.exportJWK(publicKey);
|
|
91
|
+
// Export private key as PEM
|
|
92
|
+
const privatePem = await jose.exportPKCS8(privateKey);
|
|
93
|
+
return {
|
|
94
|
+
publicKey: {
|
|
95
|
+
kty: 'RSA',
|
|
96
|
+
kid: keyId,
|
|
97
|
+
use: 'sig',
|
|
98
|
+
alg: 'RS256',
|
|
99
|
+
n: publicJwk.n,
|
|
100
|
+
e: publicJwk.e,
|
|
101
|
+
},
|
|
102
|
+
privateKey: privatePem,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Validate a JWK public key structure
|
|
107
|
+
*/
|
|
108
|
+
function validatePublicKey(key) {
|
|
109
|
+
const errors = [];
|
|
110
|
+
if (!key.kty) {
|
|
111
|
+
errors.push('Missing required field: kty');
|
|
112
|
+
}
|
|
113
|
+
if (!key.kid) {
|
|
114
|
+
errors.push('Missing required field: kid');
|
|
115
|
+
}
|
|
116
|
+
if (key.kty === 'EC') {
|
|
117
|
+
if (!key.crv)
|
|
118
|
+
errors.push('EC key missing curve (crv)');
|
|
119
|
+
if (!key.x)
|
|
120
|
+
errors.push('EC key missing x coordinate');
|
|
121
|
+
if (!key.y)
|
|
122
|
+
errors.push('EC key missing y coordinate');
|
|
123
|
+
if (key.crv && !['P-256', 'P-384', 'P-521'].includes(key.crv)) {
|
|
124
|
+
errors.push(`Unsupported EC curve: ${key.crv}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (key.kty === 'RSA') {
|
|
128
|
+
if (!key.n)
|
|
129
|
+
errors.push('RSA key missing modulus (n)');
|
|
130
|
+
if (!key.e)
|
|
131
|
+
errors.push('RSA key missing exponent (e)');
|
|
132
|
+
}
|
|
133
|
+
else if (key.kty) {
|
|
134
|
+
errors.push(`Unsupported key type: ${key.kty}`);
|
|
135
|
+
}
|
|
136
|
+
return errors;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Import and validate a public key from JWK
|
|
140
|
+
*/
|
|
141
|
+
async function importPublicKey(jwk) {
|
|
142
|
+
return jose.importJWK(jwk, jwk.alg);
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=key-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-generator.js","sourceRoot":"","sources":["../../src/generator/key-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UCP Profile Builder
|
|
3
|
+
* Generates valid UCP Business Profiles from configuration inputs
|
|
4
|
+
*/
|
|
5
|
+
import type { UcpProfile } from '../types/ucp-profile.js';
|
|
6
|
+
import type { GeneratorInput, GeneratorOutput } from '../types/generator.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build a complete UCP Profile from generator inputs
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildProfile(input: GeneratorInput): Promise<GeneratorOutput>;
|
|
11
|
+
/**
|
|
12
|
+
* Generate a minimal starter profile (for quick setup)
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateMinimalProfile(endpoint: string, ucpVersion?: string): UcpProfile;
|
|
15
|
+
//# sourceMappingURL=profile-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-builder.d.ts","sourceRoot":"","sources":["../../src/generator/profile-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EAMX,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AAS/B;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAsDlF;AA+RD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAA4B,GACvC,UAAU,CAwBZ"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UCP Profile Builder
|
|
4
|
+
* Generates valid UCP Business Profiles from configuration inputs
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildProfile = buildProfile;
|
|
8
|
+
exports.generateMinimalProfile = generateMinimalProfile;
|
|
9
|
+
const ucp_profile_js_1 = require("../types/ucp-profile.js");
|
|
10
|
+
const key_generator_js_1 = require("./key-generator.js");
|
|
11
|
+
/**
|
|
12
|
+
* Build a complete UCP Profile from generator inputs
|
|
13
|
+
*/
|
|
14
|
+
async function buildProfile(input) {
|
|
15
|
+
const ucpVersion = input.ucpVersion || ucp_profile_js_1.CURRENT_UCP_VERSION;
|
|
16
|
+
// Build services
|
|
17
|
+
const services = buildServices(input.transport, ucpVersion);
|
|
18
|
+
// Build capabilities
|
|
19
|
+
const capabilities = buildCapabilities(input.capabilities, ucpVersion);
|
|
20
|
+
// Build the UCP object
|
|
21
|
+
const ucpObject = {
|
|
22
|
+
version: ucpVersion,
|
|
23
|
+
services,
|
|
24
|
+
capabilities,
|
|
25
|
+
};
|
|
26
|
+
// Build the full profile
|
|
27
|
+
const profile = {
|
|
28
|
+
ucp: ucpObject,
|
|
29
|
+
};
|
|
30
|
+
// Handle signing keys if Order capability is enabled
|
|
31
|
+
let signingKeyPair;
|
|
32
|
+
if (input.capabilities.order) {
|
|
33
|
+
if (input.security?.generateSigningKeys !== false) {
|
|
34
|
+
// Generate new signing keys
|
|
35
|
+
const keyPair = await (0, key_generator_js_1.generateSigningKeyPair)(input.security?.signingKeyAlgorithm || 'ES256');
|
|
36
|
+
profile.signing_keys = [keyPair.publicKey];
|
|
37
|
+
signingKeyPair = keyPair;
|
|
38
|
+
}
|
|
39
|
+
else if (input.security?.uploadedPublicKey) {
|
|
40
|
+
// Use uploaded public key
|
|
41
|
+
const publicKey = parsePublicKey(input.security.uploadedPublicKey);
|
|
42
|
+
profile.signing_keys = [publicKey];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Format the profile JSON
|
|
46
|
+
const profileJson = JSON.stringify(profile, null, 2);
|
|
47
|
+
// Generate install instructions
|
|
48
|
+
const installInstructions = generateInstallInstructions(input.merchant.primaryDomain, input.merchant.merchantId);
|
|
49
|
+
return {
|
|
50
|
+
profile,
|
|
51
|
+
profileJson,
|
|
52
|
+
installInstructions,
|
|
53
|
+
signingKeyPair,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build services configuration
|
|
58
|
+
*/
|
|
59
|
+
function buildServices(transport, ucpVersion) {
|
|
60
|
+
const services = {};
|
|
61
|
+
// Always include the shopping service for MVP
|
|
62
|
+
const shoppingService = {
|
|
63
|
+
version: ucpVersion,
|
|
64
|
+
spec: `${ucp_profile_js_1.UCP_DEFAULTS.SPEC_BASE}overview/`,
|
|
65
|
+
};
|
|
66
|
+
// Add REST transport (required for MVP)
|
|
67
|
+
if (transport.rest) {
|
|
68
|
+
shoppingService.rest = {
|
|
69
|
+
schema: transport.rest.schemaUrl || ucp_profile_js_1.UCP_DEFAULTS.SHOPPING_REST_SCHEMA,
|
|
70
|
+
endpoint: normalizeEndpoint(transport.rest.endpoint),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Add MCP transport (optional)
|
|
74
|
+
if (transport.mcp) {
|
|
75
|
+
shoppingService.mcp = {
|
|
76
|
+
schema: transport.mcp.schemaUrl || `${ucp_profile_js_1.UCP_DEFAULTS.SERVICE_SCHEMA_BASE}shopping/mcp.json`,
|
|
77
|
+
endpoint: normalizeEndpoint(transport.mcp.endpoint),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Add A2A transport (optional)
|
|
81
|
+
if (transport.a2a) {
|
|
82
|
+
shoppingService.a2a = {
|
|
83
|
+
agentCard: transport.a2a.agentCardUrl,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Add embedded transport (optional)
|
|
87
|
+
if (transport.embedded) {
|
|
88
|
+
shoppingService.embedded = {
|
|
89
|
+
schema: transport.embedded.schemaUrl,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
services[ucp_profile_js_1.KNOWN_SERVICES.SHOPPING] = shoppingService;
|
|
93
|
+
return services;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Build capabilities array based on selection
|
|
97
|
+
*/
|
|
98
|
+
function buildCapabilities(selection, ucpVersion) {
|
|
99
|
+
const capabilities = [];
|
|
100
|
+
// Checkout capability (default ON)
|
|
101
|
+
if (selection.checkout !== false) {
|
|
102
|
+
capabilities.push({
|
|
103
|
+
name: ucp_profile_js_1.KNOWN_CAPABILITIES.CHECKOUT,
|
|
104
|
+
version: ucpVersion,
|
|
105
|
+
spec: ucp_profile_js_1.UCP_DEFAULTS.CHECKOUT_SPEC,
|
|
106
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.CHECKOUT_SCHEMA,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Order capability
|
|
110
|
+
if (selection.order) {
|
|
111
|
+
capabilities.push({
|
|
112
|
+
name: ucp_profile_js_1.KNOWN_CAPABILITIES.ORDER,
|
|
113
|
+
version: ucpVersion,
|
|
114
|
+
spec: ucp_profile_js_1.UCP_DEFAULTS.ORDER_SPEC,
|
|
115
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.ORDER_SCHEMA,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Fulfillment capability (extends Order)
|
|
119
|
+
if (selection.fulfillment) {
|
|
120
|
+
capabilities.push({
|
|
121
|
+
name: ucp_profile_js_1.KNOWN_CAPABILITIES.FULFILLMENT,
|
|
122
|
+
version: ucpVersion,
|
|
123
|
+
spec: ucp_profile_js_1.UCP_DEFAULTS.FULFILLMENT_SPEC,
|
|
124
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.FULFILLMENT_SCHEMA,
|
|
125
|
+
extends: ucp_profile_js_1.KNOWN_CAPABILITIES.ORDER,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Discount capability
|
|
129
|
+
if (selection.discount) {
|
|
130
|
+
capabilities.push({
|
|
131
|
+
name: ucp_profile_js_1.KNOWN_CAPABILITIES.DISCOUNT,
|
|
132
|
+
version: ucpVersion,
|
|
133
|
+
spec: ucp_profile_js_1.UCP_DEFAULTS.DISCOUNT_SPEC,
|
|
134
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.DISCOUNT_SCHEMA,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Custom capabilities
|
|
138
|
+
if (selection.customCapabilities) {
|
|
139
|
+
for (const custom of selection.customCapabilities) {
|
|
140
|
+
const capability = {
|
|
141
|
+
name: `${custom.namespace}.${custom.name}`,
|
|
142
|
+
version: custom.version,
|
|
143
|
+
spec: custom.specUrl,
|
|
144
|
+
schema: custom.schemaUrl,
|
|
145
|
+
};
|
|
146
|
+
if (custom.extendsCapability) {
|
|
147
|
+
capability.extends = custom.extendsCapability;
|
|
148
|
+
}
|
|
149
|
+
capabilities.push(capability);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return capabilities;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Normalize endpoint URL (ensure https, no trailing slash)
|
|
156
|
+
*/
|
|
157
|
+
function normalizeEndpoint(endpoint) {
|
|
158
|
+
let normalized = endpoint.trim();
|
|
159
|
+
// Ensure https
|
|
160
|
+
if (!normalized.startsWith('https://')) {
|
|
161
|
+
if (normalized.startsWith('http://')) {
|
|
162
|
+
normalized = normalized.replace('http://', 'https://');
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
normalized = `https://${normalized}`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Remove trailing slash
|
|
169
|
+
if (normalized.endsWith('/')) {
|
|
170
|
+
normalized = normalized.slice(0, -1);
|
|
171
|
+
}
|
|
172
|
+
return normalized;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Parse uploaded public key (PEM or JWK format)
|
|
176
|
+
*/
|
|
177
|
+
function parsePublicKey(keyData) {
|
|
178
|
+
// Try to parse as JSON (JWK)
|
|
179
|
+
try {
|
|
180
|
+
const parsed = JSON.parse(keyData);
|
|
181
|
+
if (parsed.kty) {
|
|
182
|
+
return parsed;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Not JSON, assume PEM format
|
|
187
|
+
}
|
|
188
|
+
// For PEM format, we'll need to convert (simplified for now)
|
|
189
|
+
throw new Error('PEM format not yet supported. Please provide the public key in JWK format.');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Generate installation instructions markdown
|
|
193
|
+
*/
|
|
194
|
+
function generateInstallInstructions(merchantDomain, merchantId) {
|
|
195
|
+
return `# UCP Profile Installation Instructions
|
|
196
|
+
|
|
197
|
+
## Profile Location
|
|
198
|
+
|
|
199
|
+
Your UCP Business Profile must be accessible at:
|
|
200
|
+
\`\`\`
|
|
201
|
+
https://${merchantDomain}/.well-known/ucp
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
## Installation Options
|
|
205
|
+
|
|
206
|
+
### Option 1: Static File (Recommended for most setups)
|
|
207
|
+
|
|
208
|
+
1. Save the \`ucp.json\` file to your web server
|
|
209
|
+
2. Configure your server to serve it at \`/.well-known/ucp\`
|
|
210
|
+
|
|
211
|
+
#### Nginx Configuration
|
|
212
|
+
\`\`\`nginx
|
|
213
|
+
location = /.well-known/ucp {
|
|
214
|
+
alias /path/to/ucp.json;
|
|
215
|
+
default_type application/json;
|
|
216
|
+
add_header Access-Control-Allow-Origin "*";
|
|
217
|
+
add_header Cache-Control "public, max-age=3600";
|
|
218
|
+
}
|
|
219
|
+
\`\`\`
|
|
220
|
+
|
|
221
|
+
#### Apache Configuration
|
|
222
|
+
\`\`\`apache
|
|
223
|
+
<Directory "/path/to/.well-known">
|
|
224
|
+
Options -Indexes
|
|
225
|
+
AllowOverride None
|
|
226
|
+
Require all granted
|
|
227
|
+
</Directory>
|
|
228
|
+
|
|
229
|
+
<Files "ucp">
|
|
230
|
+
ForceType application/json
|
|
231
|
+
Header set Access-Control-Allow-Origin "*"
|
|
232
|
+
Header set Cache-Control "public, max-age=3600"
|
|
233
|
+
</Files>
|
|
234
|
+
\`\`\`
|
|
235
|
+
|
|
236
|
+
#### Vercel (vercel.json)
|
|
237
|
+
\`\`\`json
|
|
238
|
+
{
|
|
239
|
+
"rewrites": [
|
|
240
|
+
{ "source": "/.well-known/ucp", "destination": "/ucp.json" }
|
|
241
|
+
],
|
|
242
|
+
"headers": [
|
|
243
|
+
{
|
|
244
|
+
"source": "/.well-known/ucp",
|
|
245
|
+
"headers": [
|
|
246
|
+
{ "key": "Content-Type", "value": "application/json" },
|
|
247
|
+
{ "key": "Access-Control-Allow-Origin", "value": "*" }
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
\`\`\`
|
|
253
|
+
|
|
254
|
+
#### Netlify (_redirects)
|
|
255
|
+
\`\`\`
|
|
256
|
+
/.well-known/ucp /ucp.json 200
|
|
257
|
+
\`\`\`
|
|
258
|
+
|
|
259
|
+
### Option 2: Edge Worker (Cloudflare)
|
|
260
|
+
|
|
261
|
+
This approach proxies the profile from our hosted service.
|
|
262
|
+
|
|
263
|
+
\`\`\`javascript
|
|
264
|
+
// Cloudflare Worker
|
|
265
|
+
export default {
|
|
266
|
+
async fetch(request, env) {
|
|
267
|
+
const profileUrl = 'https://profiles.ucp.tools/${merchantId}/ucp.json';
|
|
268
|
+
|
|
269
|
+
const response = await fetch(profileUrl, {
|
|
270
|
+
cf: { cacheTtl: 3600, cacheEverything: true }
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
return new Response(response.body, {
|
|
274
|
+
headers: {
|
|
275
|
+
'Content-Type': 'application/json',
|
|
276
|
+
'Access-Control-Allow-Origin': '*',
|
|
277
|
+
'Cache-Control': 'public, max-age=3600'
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
\`\`\`
|
|
283
|
+
|
|
284
|
+
Route: \`${merchantDomain}/.well-known/ucp*\`
|
|
285
|
+
|
|
286
|
+
### Option 3: Reverse Proxy (Nginx)
|
|
287
|
+
|
|
288
|
+
\`\`\`nginx
|
|
289
|
+
location = /.well-known/ucp {
|
|
290
|
+
proxy_pass https://profiles.ucp.tools/${merchantId}/ucp.json;
|
|
291
|
+
proxy_set_header Host profiles.ucp.tools;
|
|
292
|
+
proxy_cache_valid 200 1h;
|
|
293
|
+
add_header Access-Control-Allow-Origin "*";
|
|
294
|
+
}
|
|
295
|
+
\`\`\`
|
|
296
|
+
|
|
297
|
+
## Verification
|
|
298
|
+
|
|
299
|
+
After installation, verify your profile:
|
|
300
|
+
|
|
301
|
+
1. Open: https://${merchantDomain}/.well-known/ucp
|
|
302
|
+
2. Confirm JSON response with correct structure
|
|
303
|
+
3. Run validation: \`ucp-validate --remote https://${merchantDomain}\`
|
|
304
|
+
|
|
305
|
+
## Support
|
|
306
|
+
|
|
307
|
+
For help, visit: https://ucp.tools
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Generate a minimal starter profile (for quick setup)
|
|
312
|
+
*/
|
|
313
|
+
function generateMinimalProfile(endpoint, ucpVersion = ucp_profile_js_1.CURRENT_UCP_VERSION) {
|
|
314
|
+
return {
|
|
315
|
+
ucp: {
|
|
316
|
+
version: ucpVersion,
|
|
317
|
+
services: {
|
|
318
|
+
[ucp_profile_js_1.KNOWN_SERVICES.SHOPPING]: {
|
|
319
|
+
version: ucpVersion,
|
|
320
|
+
spec: `${ucp_profile_js_1.UCP_DEFAULTS.SPEC_BASE}overview/`,
|
|
321
|
+
rest: {
|
|
322
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.SHOPPING_REST_SCHEMA,
|
|
323
|
+
endpoint: normalizeEndpoint(endpoint),
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
capabilities: [
|
|
328
|
+
{
|
|
329
|
+
name: ucp_profile_js_1.KNOWN_CAPABILITIES.CHECKOUT,
|
|
330
|
+
version: ucpVersion,
|
|
331
|
+
spec: ucp_profile_js_1.UCP_DEFAULTS.CHECKOUT_SPEC,
|
|
332
|
+
schema: ucp_profile_js_1.UCP_DEFAULTS.CHECKOUT_SCHEMA,
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=profile-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-builder.js","sourceRoot":"","sources":["../../src/generator/profile-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hosting Artifacts Generator
|
|
3
|
+
* Generates installation artifacts for different hosting platforms
|
|
4
|
+
*/
|
|
5
|
+
import type { HostingConfig, InstallArtifact } from '../types/generator.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate all installation artifacts for a hosting configuration
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateHostingArtifacts(config: HostingConfig, profileJson: string): InstallArtifact[];
|
|
10
|
+
//# sourceMappingURL=artifacts-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts-generator.d.ts","sourceRoot":"","sources":["../../src/hosting/artifacts-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EAGb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,eAAe,EAAE,CA4BnB"}
|