@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.
Files changed (330) hide show
  1. package/dist/auth/config.d.ts +20 -0
  2. package/dist/auth/config.d.ts.map +1 -0
  3. package/dist/auth/config.js +114 -0
  4. package/dist/auth/config.js.map +1 -0
  5. package/dist/auth/index.d.ts +5 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +17 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/middleware.d.ts +45 -0
  10. package/dist/auth/middleware.d.ts.map +1 -0
  11. package/dist/auth/middleware.js +170 -0
  12. package/dist/auth/middleware.js.map +1 -0
  13. package/dist/auth/service.d.ts +80 -0
  14. package/dist/auth/service.d.ts.map +1 -0
  15. package/dist/auth/service.js +298 -0
  16. package/dist/auth/service.js.map +1 -0
  17. package/dist/cli/index.d.ts +6 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +375 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/mock-server.d.ts +20 -0
  22. package/dist/cli/mock-server.d.ts.map +1 -0
  23. package/dist/cli/mock-server.js +261 -0
  24. package/dist/cli/mock-server.js.map +1 -0
  25. package/dist/compliance/compliance-generator.d.ts +34 -0
  26. package/dist/compliance/compliance-generator.d.ts.map +1 -0
  27. package/dist/compliance/compliance-generator.js +320 -0
  28. package/dist/compliance/compliance-generator.js.map +1 -0
  29. package/dist/compliance/index.d.ts +8 -0
  30. package/dist/compliance/index.d.ts.map +1 -0
  31. package/dist/compliance/index.js +17 -0
  32. package/dist/compliance/index.js.map +1 -0
  33. package/dist/compliance/templates.d.ts +34 -0
  34. package/dist/compliance/templates.d.ts.map +1 -0
  35. package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
  36. package/dist/compliance/templates.js.map +1 -0
  37. package/dist/compliance/types.d.ts +64 -0
  38. package/dist/compliance/types.d.ts.map +1 -0
  39. package/dist/compliance/types.js +64 -0
  40. package/dist/compliance/types.js.map +1 -0
  41. package/dist/db/index.d.ts +17 -0
  42. package/dist/db/index.d.ts.map +1 -0
  43. package/dist/db/index.js +80 -0
  44. package/dist/db/index.js.map +1 -0
  45. package/dist/db/schema.d.ts +3886 -0
  46. package/dist/db/schema.d.ts.map +1 -0
  47. package/dist/db/schema.js +425 -0
  48. package/dist/db/schema.js.map +1 -0
  49. package/dist/db/utils.d.ts +252 -0
  50. package/dist/db/utils.d.ts.map +1 -0
  51. package/dist/db/utils.js +295 -0
  52. package/dist/db/utils.js.map +1 -0
  53. package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
  54. package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
  55. package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
  56. package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
  57. package/dist/feed-analyzer/index.d.ts +8 -0
  58. package/dist/feed-analyzer/index.d.ts.map +1 -0
  59. package/dist/feed-analyzer/index.js +19 -0
  60. package/dist/feed-analyzer/index.js.map +1 -0
  61. package/dist/feed-analyzer/types.d.ts +285 -0
  62. package/dist/feed-analyzer/types.d.ts.map +1 -0
  63. package/dist/feed-analyzer/types.js +175 -0
  64. package/dist/feed-analyzer/types.js.map +1 -0
  65. package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
  66. package/dist/generator/index.d.ts.map +1 -0
  67. package/dist/generator/index.js +13 -0
  68. package/dist/generator/index.js.map +1 -0
  69. package/dist/generator/key-generator.d.ts +24 -0
  70. package/dist/generator/key-generator.d.ts.map +1 -0
  71. package/dist/generator/key-generator.js +144 -0
  72. package/dist/generator/key-generator.js.map +1 -0
  73. package/dist/generator/profile-builder.d.ts +15 -0
  74. package/dist/generator/profile-builder.d.ts.map +1 -0
  75. package/dist/generator/profile-builder.js +338 -0
  76. package/dist/generator/profile-builder.js.map +1 -0
  77. package/dist/hosting/artifacts-generator.d.ts +10 -0
  78. package/dist/hosting/artifacts-generator.d.ts.map +1 -0
  79. package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
  80. package/dist/hosting/artifacts-generator.js.map +1 -0
  81. package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
  82. package/dist/hosting/index.d.ts.map +1 -0
  83. package/dist/hosting/index.js +10 -0
  84. package/dist/hosting/index.js.map +1 -0
  85. package/dist/index.d.ts +18 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +78 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/lib/analytics.d.ts +337 -0
  90. package/dist/lib/analytics.d.ts.map +1 -0
  91. package/dist/lib/analytics.js +188 -0
  92. package/dist/lib/analytics.js.map +1 -0
  93. package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
  94. package/dist/security/index.d.ts.map +1 -0
  95. package/dist/security/index.js +12 -0
  96. package/dist/security/index.js.map +1 -0
  97. package/dist/security/security-scanner.d.ts +10 -0
  98. package/dist/security/security-scanner.d.ts.map +1 -0
  99. package/dist/security/security-scanner.js +669 -0
  100. package/dist/security/security-scanner.js.map +1 -0
  101. package/dist/security/types.d.ts +80 -0
  102. package/dist/security/types.d.ts.map +1 -0
  103. package/dist/security/types.js +21 -0
  104. package/dist/security/types.js.map +1 -0
  105. package/dist/services/analytics.d.ts +114 -0
  106. package/dist/services/analytics.d.ts.map +1 -0
  107. package/dist/services/analytics.js +862 -0
  108. package/dist/services/analytics.js.map +1 -0
  109. package/dist/services/badge.d.ts +31 -0
  110. package/dist/services/badge.d.ts.map +1 -0
  111. package/dist/services/badge.js +152 -0
  112. package/dist/services/badge.js.map +1 -0
  113. package/dist/services/cron.d.ts +125 -0
  114. package/dist/services/cron.d.ts.map +1 -0
  115. package/dist/services/cron.js +613 -0
  116. package/dist/services/cron.js.map +1 -0
  117. package/dist/services/directory.d.ts +106 -0
  118. package/dist/services/directory.d.ts.map +1 -0
  119. package/dist/services/directory.js +351 -0
  120. package/dist/services/directory.js.map +1 -0
  121. package/dist/services/email.d.ts +112 -0
  122. package/dist/services/email.d.ts.map +1 -0
  123. package/dist/services/email.js +772 -0
  124. package/dist/services/email.js.map +1 -0
  125. package/dist/services/hosted-profiles.d.ts +77 -0
  126. package/dist/services/hosted-profiles.d.ts.map +1 -0
  127. package/dist/services/hosted-profiles.js +433 -0
  128. package/dist/services/hosted-profiles.js.map +1 -0
  129. package/dist/services/latency.d.ts +67 -0
  130. package/dist/services/latency.d.ts.map +1 -0
  131. package/dist/services/latency.js +274 -0
  132. package/dist/services/latency.js.map +1 -0
  133. package/dist/services/manifest-compliance.d.ts +64 -0
  134. package/dist/services/manifest-compliance.d.ts.map +1 -0
  135. package/dist/services/manifest-compliance.js +271 -0
  136. package/dist/services/manifest-compliance.js.map +1 -0
  137. package/dist/services/monitoring-diff.d.ts +31 -0
  138. package/dist/services/monitoring-diff.d.ts.map +1 -0
  139. package/dist/services/monitoring-diff.js +189 -0
  140. package/dist/services/monitoring-diff.js.map +1 -0
  141. package/dist/services/notifications.d.ts +46 -0
  142. package/dist/services/notifications.d.ts.map +1 -0
  143. package/dist/services/notifications.js +88 -0
  144. package/dist/services/notifications.js.map +1 -0
  145. package/dist/services/stripe.d.ts +93 -0
  146. package/dist/services/stripe.d.ts.map +1 -0
  147. package/dist/services/stripe.js +490 -0
  148. package/dist/services/stripe.js.map +1 -0
  149. package/dist/services/validation-history.d.ts +99 -0
  150. package/dist/services/validation-history.d.ts.map +1 -0
  151. package/dist/services/validation-history.js +344 -0
  152. package/dist/services/validation-history.js.map +1 -0
  153. package/dist/services/validation-logging.d.ts +103 -0
  154. package/dist/services/validation-logging.d.ts.map +1 -0
  155. package/dist/services/validation-logging.js +210 -0
  156. package/dist/services/validation-logging.js.map +1 -0
  157. package/dist/services/validation.d.ts +119 -0
  158. package/dist/services/validation.d.ts.map +1 -0
  159. package/dist/services/validation.js +1185 -0
  160. package/dist/services/validation.js.map +1 -0
  161. package/dist/simulator/agent-simulator.d.ts +69 -0
  162. package/dist/simulator/agent-simulator.d.ts.map +1 -0
  163. package/dist/simulator/agent-simulator.js +870 -0
  164. package/dist/simulator/agent-simulator.js.map +1 -0
  165. package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
  166. package/dist/simulator/index.d.ts.map +1 -0
  167. package/dist/simulator/index.js +23 -0
  168. package/dist/simulator/index.js.map +1 -0
  169. package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
  170. package/dist/simulator/types.d.ts.map +1 -0
  171. package/dist/simulator/types.js +18 -0
  172. package/dist/simulator/types.js.map +1 -0
  173. package/dist/types/acp-validation.d.ts +87 -0
  174. package/dist/types/acp-validation.d.ts.map +1 -0
  175. package/dist/types/acp-validation.js +40 -0
  176. package/dist/types/acp-validation.js.map +1 -0
  177. package/dist/types/analytics.d.ts +182 -0
  178. package/dist/types/analytics.d.ts.map +1 -0
  179. package/dist/types/analytics.js +7 -0
  180. package/dist/types/analytics.js.map +1 -0
  181. package/dist/types/generator.d.ts +106 -0
  182. package/dist/types/generator.d.ts.map +1 -0
  183. package/dist/types/generator.js +6 -0
  184. package/dist/types/generator.js.map +1 -0
  185. package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
  186. package/dist/types/index.d.ts.map +1 -0
  187. package/dist/types/index.js +23 -0
  188. package/dist/types/index.js.map +1 -0
  189. package/dist/types/ucp-profile.d.ts +111 -0
  190. package/dist/types/ucp-profile.d.ts.map +1 -0
  191. package/dist/types/ucp-profile.js +45 -0
  192. package/dist/types/ucp-profile.js.map +1 -0
  193. package/dist/types/validation.d.ts +76 -0
  194. package/dist/types/validation.d.ts.map +1 -0
  195. package/dist/types/validation.js +42 -0
  196. package/dist/types/validation.js.map +1 -0
  197. package/dist/validator/acp/index.d.ts +31 -0
  198. package/dist/validator/acp/index.d.ts.map +1 -0
  199. package/dist/validator/acp/index.js +574 -0
  200. package/dist/validator/acp/index.js.map +1 -0
  201. package/dist/validator/index.d.ts +26 -0
  202. package/dist/validator/index.d.ts.map +1 -0
  203. package/dist/validator/index.js +161 -0
  204. package/dist/validator/index.js.map +1 -0
  205. package/dist/validator/network-validator.d.ts +28 -0
  206. package/dist/validator/network-validator.d.ts.map +1 -0
  207. package/dist/validator/network-validator.js +319 -0
  208. package/dist/validator/network-validator.js.map +1 -0
  209. package/dist/validator/rules-validator.d.ts +19 -0
  210. package/dist/validator/rules-validator.d.ts.map +1 -0
  211. package/dist/validator/rules-validator.js +306 -0
  212. package/dist/validator/rules-validator.js.map +1 -0
  213. package/dist/validator/sdk-validator.d.ts +58 -0
  214. package/dist/validator/sdk-validator.d.ts.map +1 -0
  215. package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
  216. package/dist/validator/sdk-validator.js.map +1 -0
  217. package/dist/validator/structural-validator.d.ts +11 -0
  218. package/dist/validator/structural-validator.d.ts.map +1 -0
  219. package/dist/validator/structural-validator.js +549 -0
  220. package/dist/validator/structural-validator.js.map +1 -0
  221. package/dist/validator/utils.d.ts +51 -0
  222. package/dist/validator/utils.d.ts.map +1 -0
  223. package/dist/validator/utils.js +132 -0
  224. package/dist/validator/utils.js.map +1 -0
  225. package/package.json +44 -12
  226. package/CLAUDE.md +0 -109
  227. package/api/analyze-feed.js +0 -140
  228. package/api/badge.js +0 -185
  229. package/api/benchmark.js +0 -177
  230. package/api/directory-stats.ts +0 -29
  231. package/api/directory.ts +0 -73
  232. package/api/generate-compliance.js +0 -143
  233. package/api/generate-schema.js +0 -457
  234. package/api/generate.js +0 -132
  235. package/api/security-scan.js +0 -133
  236. package/api/simulate.js +0 -187
  237. package/api/tsconfig.json +0 -10
  238. package/api/validate.js +0 -1351
  239. package/apify-actor/.actor/actor.json +0 -68
  240. package/apify-actor/.actor/input_schema.json +0 -32
  241. package/apify-actor/APIFY-STORE-LISTING.md +0 -412
  242. package/apify-actor/Dockerfile +0 -8
  243. package/apify-actor/README.md +0 -166
  244. package/apify-actor/main.ts +0 -111
  245. package/apify-actor/package.json +0 -17
  246. package/apify-actor/src/main.js +0 -199
  247. package/docs/BRAND-IDENTITY.md +0 -238
  248. package/docs/BRAND-STYLE-GUIDE.md +0 -356
  249. package/drizzle/0000_black_king_cobra.sql +0 -39
  250. package/drizzle/meta/0000_snapshot.json +0 -309
  251. package/drizzle/meta/_journal.json +0 -13
  252. package/drizzle.config.ts +0 -10
  253. package/public/.well-known/ucp +0 -25
  254. package/public/android-chrome-192x192.png +0 -0
  255. package/public/android-chrome-512x512.png +0 -0
  256. package/public/apple-touch-icon.png +0 -0
  257. package/public/brand.css +0 -321
  258. package/public/directory.html +0 -701
  259. package/public/favicon-16x16.png +0 -0
  260. package/public/favicon-32x32.png +0 -0
  261. package/public/favicon.ico +0 -0
  262. package/public/guides/bigcommerce.html +0 -743
  263. package/public/guides/fastucp.html +0 -838
  264. package/public/guides/magento.html +0 -779
  265. package/public/guides/shopify.html +0 -726
  266. package/public/guides/squarespace.html +0 -749
  267. package/public/guides/wix.html +0 -747
  268. package/public/guides/woocommerce.html +0 -733
  269. package/public/index.html +0 -3835
  270. package/public/learn.html +0 -396
  271. package/public/logo.jpeg +0 -0
  272. package/public/og-image-icon.png +0 -0
  273. package/public/og-image.png +0 -0
  274. package/public/robots.txt +0 -6
  275. package/public/site.webmanifest +0 -31
  276. package/public/sitemap.xml +0 -69
  277. package/public/social/linkedin-banner-1128x191.png +0 -0
  278. package/public/social/temp.PNG +0 -0
  279. package/public/social/x-header-1500x500.png +0 -0
  280. package/public/verify.html +0 -410
  281. package/scripts/generate-favicons.js +0 -44
  282. package/scripts/generate-ico.js +0 -23
  283. package/scripts/generate-og-image.js +0 -45
  284. package/scripts/reset-db.ts +0 -77
  285. package/scripts/seed-db.ts +0 -71
  286. package/scripts/setup-benchmark-db.js +0 -70
  287. package/src/api/server.ts +0 -266
  288. package/src/cli/index.ts +0 -302
  289. package/src/compliance/compliance-generator.ts +0 -452
  290. package/src/compliance/index.ts +0 -28
  291. package/src/compliance/types.ts +0 -170
  292. package/src/db/index.ts +0 -28
  293. package/src/db/schema.ts +0 -84
  294. package/src/feed-analyzer/index.ts +0 -34
  295. package/src/feed-analyzer/types.ts +0 -354
  296. package/src/generator/key-generator.ts +0 -124
  297. package/src/generator/profile-builder.ts +0 -402
  298. package/src/index.ts +0 -105
  299. package/src/security/security-scanner.ts +0 -604
  300. package/src/security/types.ts +0 -55
  301. package/src/services/directory.ts +0 -434
  302. package/src/simulator/agent-simulator.ts +0 -941
  303. package/src/types/generator.ts +0 -140
  304. package/src/types/ucp-profile.ts +0 -140
  305. package/src/types/validation.ts +0 -89
  306. package/src/validator/index.ts +0 -194
  307. package/src/validator/network-validator.ts +0 -417
  308. package/src/validator/rules-validator.ts +0 -297
  309. package/src/validator/structural-validator.ts +0 -476
  310. package/tests/fixtures/non-compliant-profile.json +0 -25
  311. package/tests/fixtures/official-sample-profile.json +0 -75
  312. package/tests/integration/benchmark.test.ts +0 -207
  313. package/tests/integration/database.test.ts +0 -163
  314. package/tests/integration/directory-api.test.ts +0 -268
  315. package/tests/integration/simulate-api.test.ts +0 -230
  316. package/tests/integration/validate-api.test.ts +0 -269
  317. package/tests/setup.ts +0 -15
  318. package/tests/unit/agent-simulator.test.ts +0 -575
  319. package/tests/unit/compliance-generator.test.ts +0 -374
  320. package/tests/unit/directory-service.test.ts +0 -272
  321. package/tests/unit/feed-analyzer.test.ts +0 -517
  322. package/tests/unit/lint-suggestions.test.ts +0 -423
  323. package/tests/unit/official-samples.test.ts +0 -211
  324. package/tests/unit/pdf-report.test.ts +0 -390
  325. package/tests/unit/sdk-validator.test.ts +0 -531
  326. package/tests/unit/security-scanner.test.ts +0 -410
  327. package/tests/unit/validation.test.ts +0 -390
  328. package/tsconfig.json +0 -20
  329. package/vercel.json +0 -34
  330. package/vitest.config.ts +0 -22
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Directory Service
3
+ * Business logic for the UCP Merchant Directory
4
+ */
5
+ import { type Merchant } from '../db/index.js';
6
+ export interface ListMerchantsParams {
7
+ page?: number;
8
+ limit?: number;
9
+ category?: string;
10
+ country?: string;
11
+ search?: string;
12
+ grades?: string;
13
+ sort?: 'score' | 'domain' | 'displayName' | 'createdAt';
14
+ order?: 'asc' | 'desc';
15
+ }
16
+ export interface ListMerchantsResult {
17
+ merchants: Merchant[];
18
+ pagination: {
19
+ page: number;
20
+ limit: number;
21
+ total: number;
22
+ totalPages: number;
23
+ };
24
+ filters: {
25
+ categories: {
26
+ name: string;
27
+ count: number;
28
+ }[];
29
+ countries: {
30
+ code: string;
31
+ count: number;
32
+ }[];
33
+ };
34
+ }
35
+ export interface SubmitMerchantParams {
36
+ domain: string;
37
+ displayName?: string;
38
+ description?: string;
39
+ logoUrl?: string;
40
+ websiteUrl?: string;
41
+ category?: string;
42
+ countryCode?: string;
43
+ }
44
+ export interface DirectoryStats {
45
+ totalMerchants: number;
46
+ verifiedMerchants: number;
47
+ avgScore: number;
48
+ totalCategories: number;
49
+ totalCountries: number;
50
+ gradeDistribution: {
51
+ grade: string;
52
+ count: number;
53
+ }[];
54
+ topCategories: {
55
+ name: string;
56
+ count: number;
57
+ }[];
58
+ recentAdditions: {
59
+ domain: string;
60
+ displayName: string;
61
+ grade: string | null;
62
+ addedAt: Date;
63
+ }[];
64
+ }
65
+ export interface ValidationResult {
66
+ valid: boolean;
67
+ error?: string;
68
+ score?: number;
69
+ grade?: string;
70
+ transports?: string;
71
+ ucpVersion?: string;
72
+ profileUrl?: string;
73
+ }
74
+ /**
75
+ * Validate a domain's UCP profile
76
+ */
77
+ export declare function validateDomain(domain: string): Promise<ValidationResult>;
78
+ /**
79
+ * List merchants with pagination and filters
80
+ */
81
+ export declare function listMerchants(params: ListMerchantsParams): Promise<ListMerchantsResult>;
82
+ /**
83
+ * Get a single merchant by domain
84
+ */
85
+ export declare function getMerchantByDomain(domain: string): Promise<Merchant | null>;
86
+ /**
87
+ * Submit a new merchant to the directory
88
+ */
89
+ export declare function submitMerchant(params: SubmitMerchantParams): Promise<{
90
+ success: boolean;
91
+ merchant?: Merchant;
92
+ error?: string;
93
+ details?: string;
94
+ }>;
95
+ /**
96
+ * Get directory statistics
97
+ */
98
+ export declare function getDirectoryStats(): Promise<DirectoryStats>;
99
+ /**
100
+ * Re-validate a merchant's UCP profile and update their record
101
+ */
102
+ export declare function revalidateMerchant(domain: string): Promise<{
103
+ success: boolean;
104
+ error?: string;
105
+ }>;
106
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../src/services/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /**
3
+ * Directory Service
4
+ * Business logic for the UCP Merchant Directory
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateDomain = validateDomain;
8
+ exports.listMerchants = listMerchants;
9
+ exports.getMerchantByDomain = getMerchantByDomain;
10
+ exports.submitMerchant = submitMerchant;
11
+ exports.getDirectoryStats = getDirectoryStats;
12
+ exports.revalidateMerchant = revalidateMerchant;
13
+ const drizzle_orm_1 = require("drizzle-orm");
14
+ const index_js_1 = require("../db/index.js");
15
+ const utils_js_1 = require("../validator/utils.js");
16
+ const validation_js_1 = require("./validation.js");
17
+ /**
18
+ * Fetch UCP profile from a URL, return null if not valid JSON
19
+ */
20
+ async function tryFetchProfile(url) {
21
+ try {
22
+ const res = await fetch(url, {
23
+ headers: {
24
+ Accept: 'application/json',
25
+ 'User-Agent': 'UCP-Directory/1.0 (https://ucptools.dev)',
26
+ },
27
+ signal: AbortSignal.timeout(10000),
28
+ });
29
+ if (!res.ok)
30
+ return null;
31
+ const text = await res.text();
32
+ // Check if response looks like JSON (not HTML)
33
+ if (text.trim().startsWith('<'))
34
+ return null;
35
+ return JSON.parse(text);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Validate a domain's UCP profile
43
+ */
44
+ async function validateDomain(domain) {
45
+ // Try both /.well-known/ucp and /.well-known/ucp.json
46
+ const urls = [
47
+ `https://${domain}/.well-known/ucp`,
48
+ `https://${domain}/.well-known/ucp.json`,
49
+ ];
50
+ let profile = null;
51
+ let foundUrl;
52
+ for (const url of urls) {
53
+ profile = await tryFetchProfile(url);
54
+ if (profile) {
55
+ foundUrl = url;
56
+ break;
57
+ }
58
+ }
59
+ try {
60
+ if (!profile) {
61
+ return { valid: false, error: 'No UCP profile found at /.well-known/ucp or /.well-known/ucp.json' };
62
+ }
63
+ // Basic validation
64
+ if (!profile?.ucp?.version || !profile?.ucp?.services) {
65
+ return { valid: false, error: 'Invalid UCP profile structure' };
66
+ }
67
+ // Extract transports
68
+ const transports = new Set();
69
+ for (const svc of Object.values(profile.ucp.services || {})) {
70
+ if (svc.rest)
71
+ transports.add('REST');
72
+ if (svc.mcp)
73
+ transports.add('MCP');
74
+ if (svc.a2a)
75
+ transports.add('A2A');
76
+ if (svc.embedded)
77
+ transports.add('Embedded');
78
+ }
79
+ // Simple scoring
80
+ let score = 50;
81
+ const capabilities = (0, utils_js_1.normalizeCapabilities)(profile.ucp.capabilities);
82
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.checkout'))
83
+ score += 20;
84
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.cart'))
85
+ score += 10;
86
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.order'))
87
+ score += 10;
88
+ if (profile.signing_keys && profile.signing_keys.length > 0)
89
+ score += 10;
90
+ const grade = score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : score >= 60 ? 'D' : 'F';
91
+ return {
92
+ valid: true,
93
+ score,
94
+ grade,
95
+ transports: Array.from(transports).join(','),
96
+ ucpVersion: profile.ucp.version,
97
+ profileUrl: foundUrl,
98
+ };
99
+ }
100
+ catch (e) {
101
+ const message = e instanceof Error ? e.message : 'Failed to fetch profile';
102
+ return { valid: false, error: message };
103
+ }
104
+ }
105
+ /**
106
+ * List merchants with pagination and filters
107
+ */
108
+ async function listMerchants(params) {
109
+ const db = (0, index_js_1.getDb)();
110
+ const page = Math.max(1, params.page || 1);
111
+ const limit = Math.min(100, Math.max(1, params.limit || 20));
112
+ const offset = (page - 1) * limit;
113
+ // Build where conditions
114
+ const conditions = [(0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true)];
115
+ if (params.category) {
116
+ conditions.push((0, drizzle_orm_1.eq)(index_js_1.merchants.category, params.category));
117
+ }
118
+ if (params.country) {
119
+ conditions.push((0, drizzle_orm_1.eq)(index_js_1.merchants.countryCode, params.country.toUpperCase()));
120
+ }
121
+ if (params.search) {
122
+ conditions.push((0, drizzle_orm_1.sql) `(${index_js_1.merchants.domain} ILIKE ${`%${params.search}%`} OR ${index_js_1.merchants.displayName} ILIKE ${`%${params.search}%`})`);
123
+ }
124
+ if (params.grades) {
125
+ const gradeList = params.grades.split(',').map(g => g.trim()).filter(Boolean);
126
+ if (gradeList.length > 0) {
127
+ conditions.push((0, drizzle_orm_1.sql) `${index_js_1.merchants.ucpGrade} IN (${drizzle_orm_1.sql.join(gradeList.map(g => (0, drizzle_orm_1.sql) `${g}`), (0, drizzle_orm_1.sql) `, `)})`);
128
+ }
129
+ }
130
+ const whereClause = (0, drizzle_orm_1.and)(...conditions);
131
+ // Determine sort column and order
132
+ const sortColumn = params.sort === 'domain'
133
+ ? index_js_1.merchants.domain
134
+ : params.sort === 'displayName'
135
+ ? index_js_1.merchants.displayName
136
+ : params.sort === 'createdAt'
137
+ ? index_js_1.merchants.createdAt
138
+ : index_js_1.merchants.ucpScore;
139
+ const orderFn = params.order === 'asc' ? drizzle_orm_1.asc : drizzle_orm_1.desc;
140
+ // Get total count
141
+ const countResult = await db
142
+ .select({ total: (0, drizzle_orm_1.count)() })
143
+ .from(index_js_1.merchants)
144
+ .where(whereClause);
145
+ const total = countResult[0]?.total || 0;
146
+ // Get merchants
147
+ const merchantList = await db
148
+ .select()
149
+ .from(index_js_1.merchants)
150
+ .where(whereClause)
151
+ .orderBy(orderFn(sortColumn))
152
+ .limit(limit)
153
+ .offset(offset);
154
+ // Get category counts
155
+ const categoryResult = await db
156
+ .select({
157
+ category: index_js_1.merchants.category,
158
+ count: (0, drizzle_orm_1.count)(),
159
+ })
160
+ .from(index_js_1.merchants)
161
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`))
162
+ .groupBy(index_js_1.merchants.category)
163
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()));
164
+ // Get country counts
165
+ const countryResult = await db
166
+ .select({
167
+ countryCode: index_js_1.merchants.countryCode,
168
+ count: (0, drizzle_orm_1.count)(),
169
+ })
170
+ .from(index_js_1.merchants)
171
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.countryCode} IS NOT NULL`))
172
+ .groupBy(index_js_1.merchants.countryCode)
173
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()));
174
+ return {
175
+ merchants: merchantList,
176
+ pagination: {
177
+ page,
178
+ limit,
179
+ total,
180
+ totalPages: Math.ceil(total / limit),
181
+ },
182
+ filters: {
183
+ categories: categoryResult.map((r) => ({ name: r.category, count: r.count })),
184
+ countries: countryResult.map((r) => ({ code: r.countryCode, count: r.count })),
185
+ },
186
+ };
187
+ }
188
+ /**
189
+ * Get a single merchant by domain
190
+ */
191
+ async function getMerchantByDomain(domain) {
192
+ const db = (0, index_js_1.getDb)();
193
+ const result = await db.select().from(index_js_1.merchants).where((0, drizzle_orm_1.eq)(index_js_1.merchants.domain, domain.toLowerCase())).limit(1);
194
+ return result[0] || null;
195
+ }
196
+ /**
197
+ * Submit a new merchant to the directory
198
+ */
199
+ async function submitMerchant(params) {
200
+ const db = (0, index_js_1.getDb)();
201
+ // Clean domain
202
+ const cleanDomain = params.domain
203
+ .replace(/^https?:\/\//, '')
204
+ .replace(/\/$/, '')
205
+ .split('/')[0]
206
+ .toLowerCase();
207
+ // Check if domain already exists
208
+ const existing = await getMerchantByDomain(cleanDomain);
209
+ if (existing) {
210
+ return {
211
+ success: false,
212
+ error: 'Domain already registered',
213
+ details: `Merchant ID: ${existing.id}`,
214
+ };
215
+ }
216
+ // Run full validation (same scoring as homepage validator)
217
+ const fullValidation = await (0, validation_js_1.validateDomainReadiness)(cleanDomain);
218
+ // Extract transports and profile URL if UCP was found
219
+ let transports = null;
220
+ let ucpProfileUrl = null;
221
+ if (fullValidation.ucp.found) {
222
+ const simpleValidation = await validateDomain(cleanDomain);
223
+ transports = simpleValidation.transports || null;
224
+ ucpProfileUrl = simpleValidation.profileUrl || null;
225
+ }
226
+ // Insert merchant using the main validator's score (all domains get a real grade)
227
+ const newMerchant = {
228
+ domain: cleanDomain,
229
+ displayName: params.displayName || cleanDomain,
230
+ description: params.description || null,
231
+ logoUrl: params.logoUrl || null,
232
+ websiteUrl: params.websiteUrl || `https://${cleanDomain}`,
233
+ category: params.category || null,
234
+ countryCode: params.countryCode?.toUpperCase() || null,
235
+ ucpScore: fullValidation.ai_readiness.score,
236
+ ucpGrade: fullValidation.ai_readiness.grade,
237
+ transports,
238
+ ucpProfileUrl,
239
+ isPublic: true,
240
+ isVerified: false,
241
+ lastValidatedAt: new Date(),
242
+ };
243
+ const result = await db.insert(index_js_1.merchants).values(newMerchant).returning();
244
+ return {
245
+ success: true,
246
+ merchant: result[0],
247
+ };
248
+ }
249
+ /**
250
+ * Get directory statistics
251
+ */
252
+ async function getDirectoryStats() {
253
+ const db = (0, index_js_1.getDb)();
254
+ // Overall stats
255
+ const statsResult = await db
256
+ .select({
257
+ totalMerchants: (0, drizzle_orm_1.count)(),
258
+ verifiedMerchants: (0, drizzle_orm_1.sql) `COUNT(*) FILTER (WHERE ${index_js_1.merchants.isVerified} = true)`,
259
+ avgScore: (0, drizzle_orm_1.sql) `COALESCE(AVG(${index_js_1.merchants.ucpScore}), 0)`,
260
+ })
261
+ .from(index_js_1.merchants)
262
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true));
263
+ // Count distinct categories and countries
264
+ const categoryCountResult = await db
265
+ .select({ count: (0, drizzle_orm_1.sql) `COUNT(DISTINCT ${index_js_1.merchants.category})` })
266
+ .from(index_js_1.merchants)
267
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`));
268
+ const countryCountResult = await db
269
+ .select({ count: (0, drizzle_orm_1.sql) `COUNT(DISTINCT ${index_js_1.merchants.countryCode})` })
270
+ .from(index_js_1.merchants)
271
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.countryCode} IS NOT NULL`));
272
+ // Grade distribution
273
+ const gradeResult = await db
274
+ .select({
275
+ grade: index_js_1.merchants.ucpGrade,
276
+ count: (0, drizzle_orm_1.count)(),
277
+ })
278
+ .from(index_js_1.merchants)
279
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.ucpGrade} IS NOT NULL`))
280
+ .groupBy(index_js_1.merchants.ucpGrade)
281
+ .orderBy(index_js_1.merchants.ucpGrade);
282
+ // Top categories
283
+ const topCategoriesResult = await db
284
+ .select({
285
+ name: index_js_1.merchants.category,
286
+ count: (0, drizzle_orm_1.count)(),
287
+ })
288
+ .from(index_js_1.merchants)
289
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`))
290
+ .groupBy(index_js_1.merchants.category)
291
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()))
292
+ .limit(10);
293
+ // Recent additions
294
+ const recentResult = await db
295
+ .select({
296
+ domain: index_js_1.merchants.domain,
297
+ displayName: index_js_1.merchants.displayName,
298
+ grade: index_js_1.merchants.ucpGrade,
299
+ addedAt: index_js_1.merchants.createdAt,
300
+ })
301
+ .from(index_js_1.merchants)
302
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true))
303
+ .orderBy((0, drizzle_orm_1.desc)(index_js_1.merchants.createdAt))
304
+ .limit(5);
305
+ const stats = statsResult[0];
306
+ return {
307
+ totalMerchants: Number(stats?.totalMerchants) || 0,
308
+ verifiedMerchants: Number(stats?.verifiedMerchants) || 0,
309
+ avgScore: Math.round(Number(stats?.avgScore) || 0),
310
+ totalCategories: Number(categoryCountResult[0]?.count) || 0,
311
+ totalCountries: Number(countryCountResult[0]?.count) || 0,
312
+ gradeDistribution: gradeResult.map((r) => ({ grade: r.grade, count: Number(r.count) })),
313
+ topCategories: topCategoriesResult.map((r) => ({ name: r.name, count: Number(r.count) })),
314
+ recentAdditions: recentResult.map((r) => ({
315
+ domain: r.domain,
316
+ displayName: r.displayName,
317
+ grade: r.grade,
318
+ addedAt: r.addedAt,
319
+ })),
320
+ };
321
+ }
322
+ /**
323
+ * Re-validate a merchant's UCP profile and update their record
324
+ */
325
+ async function revalidateMerchant(domain) {
326
+ const db = (0, index_js_1.getDb)();
327
+ const merchant = await getMerchantByDomain(domain);
328
+ if (!merchant) {
329
+ return { success: false, error: 'Merchant not found' };
330
+ }
331
+ // Use the main validator for consistent scoring
332
+ const fullValidation = await (0, validation_js_1.validateDomainReadiness)(domain);
333
+ if (!fullValidation.ucp.found) {
334
+ return { success: false, error: 'No UCP profile found' };
335
+ }
336
+ // Get transports from simplified check
337
+ const simpleValidation = await validateDomain(domain);
338
+ await db
339
+ .update(index_js_1.merchants)
340
+ .set({
341
+ ucpScore: fullValidation.ai_readiness.score,
342
+ ucpGrade: fullValidation.ai_readiness.grade,
343
+ transports: simpleValidation.transports || null,
344
+ ucpProfileUrl: simpleValidation.profileUrl || null,
345
+ lastValidatedAt: new Date(),
346
+ updatedAt: new Date(),
347
+ })
348
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.domain, domain.toLowerCase()));
349
+ return { success: true };
350
+ }
351
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/services/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Email Service
3
+ *
4
+ * Handles sending transactional emails via MailerSend API.
5
+ * Used for validation alerts, welcome emails, etc.
6
+ */
7
+ /**
8
+ * Determine if an alert email should be sent based on score change
9
+ * Threshold: ±10 points
10
+ */
11
+ export declare function shouldSendAlert(oldScore: number | null, newScore: number | null): boolean;
12
+ export interface EmailRecipient {
13
+ email: string;
14
+ name?: string;
15
+ }
16
+ export interface EmailOptions {
17
+ to: EmailRecipient[];
18
+ subject: string;
19
+ text?: string;
20
+ html?: string;
21
+ from?: EmailRecipient;
22
+ }
23
+ export interface EmailResult {
24
+ success: boolean;
25
+ messageId?: string;
26
+ error?: string;
27
+ }
28
+ /**
29
+ * Send an email via MailerSend
30
+ */
31
+ export declare function sendEmail(options: EmailOptions): Promise<EmailResult>;
32
+ /**
33
+ * Send a score change alert email
34
+ */
35
+ export declare function sendScoreChangeAlert(params: {
36
+ to: EmailRecipient;
37
+ domain: string;
38
+ oldScore: number;
39
+ newScore: number;
40
+ oldGrade: string;
41
+ newGrade: string;
42
+ dashboardUrl: string;
43
+ }): Promise<EmailResult>;
44
+ /**
45
+ * Send a severity-aware alert email with richer context.
46
+ * Uses severity to determine header color, subject line, and content.
47
+ */
48
+ export declare function sendSeverityAlert(params: {
49
+ to: EmailRecipient;
50
+ domain: string;
51
+ severity: 'broken' | 'degraded' | 'changed';
52
+ oldScore: number | null;
53
+ newScore: number;
54
+ oldGrade: string | null;
55
+ newGrade: string;
56
+ summary: string;
57
+ changes: Array<{
58
+ field: string;
59
+ type: string;
60
+ oldValue?: unknown;
61
+ newValue?: unknown;
62
+ }>;
63
+ dashboardUrl: string;
64
+ }): Promise<EmailResult>;
65
+ /**
66
+ * Send a welcome email to new subscribers
67
+ */
68
+ export declare function sendWelcomeEmail(params: {
69
+ to: EmailRecipient;
70
+ dashboardUrl: string;
71
+ trialEndsAt?: string;
72
+ }): Promise<EmailResult>;
73
+ /**
74
+ * Send a password reset email
75
+ */
76
+ export declare function sendPasswordResetEmail(params: {
77
+ to: EmailRecipient;
78
+ resetUrl: string;
79
+ }): Promise<EmailResult>;
80
+ /**
81
+ * Send trial Day 1 email - Quick Start Guide
82
+ */
83
+ export declare function sendTrialDay1Email(params: {
84
+ to: EmailRecipient;
85
+ dashboardUrl: string;
86
+ }): Promise<EmailResult>;
87
+ /**
88
+ * Send trial Day 3 email - Value reminder + Feature highlight
89
+ */
90
+ export declare function sendTrialDay3Email(params: {
91
+ to: EmailRecipient;
92
+ dashboardUrl: string;
93
+ domainsAdded?: number;
94
+ }): Promise<EmailResult>;
95
+ /**
96
+ * Send trial Day 6 email - Trial ending + Conversion CTA
97
+ */
98
+ export declare function sendTrialDay6Email(params: {
99
+ to: EmailRecipient;
100
+ dashboardUrl: string;
101
+ domainsAdded?: number;
102
+ validationsRun?: number;
103
+ }): Promise<EmailResult>;
104
+ /**
105
+ * Send trial expired email - Trial has ended, prompt to upgrade
106
+ */
107
+ export declare function sendTrialExpiredEmail(params: {
108
+ to: EmailRecipient;
109
+ dashboardUrl: string;
110
+ domainsAdded?: number;
111
+ }): Promise<EmailResult>;
112
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/services/email.ts"],"names":[],"mappings":"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"}