@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
@@ -1,457 +0,0 @@
1
- /**
2
- * Vercel Serverless Function: Generate Schema.org Snippets
3
- * POST /api/generate-schema
4
- *
5
- * Generates ready-to-use JSON-LD snippets for:
6
- * - MerchantReturnPolicy
7
- * - OfferShippingDetails
8
- * - Complete Product schema
9
- */
10
-
11
- // Default templates for common scenarios
12
- const RETURN_POLICY_TEMPLATES = {
13
- '30-day-free': {
14
- '@context': 'https://schema.org',
15
- '@type': 'MerchantReturnPolicy',
16
- '@id': '#return-policy',
17
- name: '30-Day Free Returns',
18
- applicableCountry: 'US',
19
- returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
20
- merchantReturnDays: 30,
21
- returnMethod: 'https://schema.org/ReturnByMail',
22
- returnFees: 'https://schema.org/FreeReturn',
23
- returnShippingFeesAmount: {
24
- '@type': 'MonetaryAmount',
25
- value: 0,
26
- currency: 'USD',
27
- },
28
- },
29
- '14-day-free': {
30
- '@context': 'https://schema.org',
31
- '@type': 'MerchantReturnPolicy',
32
- '@id': '#return-policy',
33
- name: '14-Day Free Returns',
34
- applicableCountry: 'US',
35
- returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
36
- merchantReturnDays: 14,
37
- returnMethod: 'https://schema.org/ReturnByMail',
38
- returnFees: 'https://schema.org/FreeReturn',
39
- },
40
- '30-day-paid': {
41
- '@context': 'https://schema.org',
42
- '@type': 'MerchantReturnPolicy',
43
- '@id': '#return-policy',
44
- name: '30-Day Returns',
45
- applicableCountry: 'US',
46
- returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
47
- merchantReturnDays: 30,
48
- returnMethod: 'https://schema.org/ReturnByMail',
49
- returnFees: 'https://schema.org/ReturnShippingFees',
50
- },
51
- 'no-returns': {
52
- '@context': 'https://schema.org',
53
- '@type': 'MerchantReturnPolicy',
54
- '@id': '#return-policy',
55
- name: 'Final Sale - No Returns',
56
- applicableCountry: 'US',
57
- returnPolicyCategory: 'https://schema.org/MerchantReturnNotPermitted',
58
- },
59
- };
60
-
61
- const SHIPPING_TEMPLATES = {
62
- 'us-standard': {
63
- '@context': 'https://schema.org',
64
- '@type': 'OfferShippingDetails',
65
- '@id': '#shipping-us-standard',
66
- shippingRate: {
67
- '@type': 'MonetaryAmount',
68
- value: 5.99,
69
- currency: 'USD',
70
- },
71
- shippingDestination: {
72
- '@type': 'DefinedRegion',
73
- addressCountry: 'US',
74
- },
75
- deliveryTime: {
76
- '@type': 'ShippingDeliveryTime',
77
- handlingTime: {
78
- '@type': 'QuantitativeValue',
79
- minValue: 1,
80
- maxValue: 2,
81
- unitCode: 'd',
82
- },
83
- transitTime: {
84
- '@type': 'QuantitativeValue',
85
- minValue: 3,
86
- maxValue: 7,
87
- unitCode: 'd',
88
- },
89
- },
90
- },
91
- 'us-free': {
92
- '@context': 'https://schema.org',
93
- '@type': 'OfferShippingDetails',
94
- '@id': '#shipping-us-free',
95
- shippingRate: {
96
- '@type': 'MonetaryAmount',
97
- value: 0,
98
- currency: 'USD',
99
- },
100
- shippingDestination: {
101
- '@type': 'DefinedRegion',
102
- addressCountry: 'US',
103
- },
104
- deliveryTime: {
105
- '@type': 'ShippingDeliveryTime',
106
- handlingTime: {
107
- '@type': 'QuantitativeValue',
108
- minValue: 1,
109
- maxValue: 2,
110
- unitCode: 'd',
111
- },
112
- transitTime: {
113
- '@type': 'QuantitativeValue',
114
- minValue: 5,
115
- maxValue: 10,
116
- unitCode: 'd',
117
- },
118
- },
119
- },
120
- 'us-express': {
121
- '@context': 'https://schema.org',
122
- '@type': 'OfferShippingDetails',
123
- '@id': '#shipping-us-express',
124
- shippingRate: {
125
- '@type': 'MonetaryAmount',
126
- value: 14.99,
127
- currency: 'USD',
128
- },
129
- shippingDestination: {
130
- '@type': 'DefinedRegion',
131
- addressCountry: 'US',
132
- },
133
- deliveryTime: {
134
- '@type': 'ShippingDeliveryTime',
135
- handlingTime: {
136
- '@type': 'QuantitativeValue',
137
- minValue: 0,
138
- maxValue: 1,
139
- unitCode: 'd',
140
- },
141
- transitTime: {
142
- '@type': 'QuantitativeValue',
143
- minValue: 1,
144
- maxValue: 2,
145
- unitCode: 'd',
146
- },
147
- },
148
- },
149
- 'international': {
150
- '@context': 'https://schema.org',
151
- '@type': 'OfferShippingDetails',
152
- '@id': '#shipping-international',
153
- shippingRate: {
154
- '@type': 'MonetaryAmount',
155
- value: 19.99,
156
- currency: 'USD',
157
- },
158
- shippingDestination: {
159
- '@type': 'DefinedRegion',
160
- addressCountry: ['CA', 'GB', 'AU', 'DE', 'FR'],
161
- },
162
- deliveryTime: {
163
- '@type': 'ShippingDeliveryTime',
164
- handlingTime: {
165
- '@type': 'QuantitativeValue',
166
- minValue: 1,
167
- maxValue: 3,
168
- unitCode: 'd',
169
- },
170
- transitTime: {
171
- '@type': 'QuantitativeValue',
172
- minValue: 7,
173
- maxValue: 21,
174
- unitCode: 'd',
175
- },
176
- },
177
- },
178
- };
179
-
180
- function generateCustomReturnPolicy(options) {
181
- const {
182
- country = 'US',
183
- returnDays = 30,
184
- freeReturns = true,
185
- returnFee = 0,
186
- currency = 'USD',
187
- policyName = `${returnDays}-Day Returns`,
188
- noReturns = false,
189
- } = options;
190
-
191
- if (noReturns) {
192
- return {
193
- '@context': 'https://schema.org',
194
- '@type': 'MerchantReturnPolicy',
195
- '@id': '#return-policy',
196
- name: policyName || 'Final Sale - No Returns',
197
- applicableCountry: country,
198
- returnPolicyCategory: 'https://schema.org/MerchantReturnNotPermitted',
199
- };
200
- }
201
-
202
- const policy = {
203
- '@context': 'https://schema.org',
204
- '@type': 'MerchantReturnPolicy',
205
- '@id': '#return-policy',
206
- name: policyName,
207
- applicableCountry: country,
208
- returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',
209
- merchantReturnDays: returnDays,
210
- returnMethod: 'https://schema.org/ReturnByMail',
211
- };
212
-
213
- if (freeReturns) {
214
- policy.returnFees = 'https://schema.org/FreeReturn';
215
- } else {
216
- policy.returnFees = 'https://schema.org/ReturnShippingFees';
217
- if (returnFee > 0) {
218
- policy.returnShippingFeesAmount = {
219
- '@type': 'MonetaryAmount',
220
- value: returnFee,
221
- currency: currency,
222
- };
223
- }
224
- }
225
-
226
- return policy;
227
- }
228
-
229
- function generateCustomShipping(options) {
230
- const {
231
- country = 'US',
232
- rate = 5.99,
233
- currency = 'USD',
234
- freeShipping = false,
235
- handlingMin = 1,
236
- handlingMax = 2,
237
- transitMin = 3,
238
- transitMax = 7,
239
- } = options;
240
-
241
- return {
242
- '@context': 'https://schema.org',
243
- '@type': 'OfferShippingDetails',
244
- '@id': `#shipping-${country.toLowerCase()}`,
245
- shippingRate: {
246
- '@type': 'MonetaryAmount',
247
- value: freeShipping ? 0 : rate,
248
- currency: currency,
249
- },
250
- shippingDestination: {
251
- '@type': 'DefinedRegion',
252
- addressCountry: country,
253
- },
254
- deliveryTime: {
255
- '@type': 'ShippingDeliveryTime',
256
- handlingTime: {
257
- '@type': 'QuantitativeValue',
258
- minValue: handlingMin,
259
- maxValue: handlingMax,
260
- unitCode: 'd',
261
- },
262
- transitTime: {
263
- '@type': 'QuantitativeValue',
264
- minValue: transitMin,
265
- maxValue: transitMax,
266
- unitCode: 'd',
267
- },
268
- },
269
- };
270
- }
271
-
272
- function generateProductSchema(options) {
273
- const {
274
- name,
275
- description,
276
- image,
277
- sku,
278
- brand,
279
- price,
280
- currency = 'USD',
281
- availability = 'InStock',
282
- condition = 'NewCondition',
283
- includeReturnPolicy = true,
284
- includeShipping = true,
285
- returnPolicyRef = '#return-policy',
286
- shippingRef = '#shipping-us-standard',
287
- } = options;
288
-
289
- const product = {
290
- '@context': 'https://schema.org',
291
- '@type': 'Product',
292
- name: name || 'Product Name',
293
- description: description || 'Product description goes here. Aim for 150-300 characters to help AI agents understand your product.',
294
- };
295
-
296
- if (image) {
297
- product.image = image;
298
- }
299
-
300
- if (sku) {
301
- product.sku = sku;
302
- }
303
-
304
- if (brand) {
305
- product.brand = {
306
- '@type': 'Brand',
307
- name: brand,
308
- };
309
- }
310
-
311
- product.offers = {
312
- '@type': 'Offer',
313
- price: price || 29.99,
314
- priceCurrency: currency,
315
- availability: `https://schema.org/${availability}`,
316
- itemCondition: `https://schema.org/${condition}`,
317
- };
318
-
319
- if (includeReturnPolicy) {
320
- product.offers.hasMerchantReturnPolicy = { '@id': returnPolicyRef };
321
- }
322
-
323
- if (includeShipping) {
324
- product.offers.shippingDetails = { '@id': shippingRef };
325
- }
326
-
327
- return product;
328
- }
329
-
330
- function generateCompleteSchema(options) {
331
- const {
332
- returnPolicy = '30-day-free',
333
- shipping = 'us-standard',
334
- customReturn,
335
- customShipping,
336
- product,
337
- } = options;
338
-
339
- const schemas = [];
340
-
341
- // Add return policy
342
- if (customReturn) {
343
- schemas.push(generateCustomReturnPolicy(customReturn));
344
- } else if (RETURN_POLICY_TEMPLATES[returnPolicy]) {
345
- schemas.push(RETURN_POLICY_TEMPLATES[returnPolicy]);
346
- }
347
-
348
- // Add shipping
349
- if (customShipping) {
350
- schemas.push(generateCustomShipping(customShipping));
351
- } else if (SHIPPING_TEMPLATES[shipping]) {
352
- schemas.push(SHIPPING_TEMPLATES[shipping]);
353
- }
354
-
355
- // Add product if provided
356
- if (product) {
357
- schemas.push(generateProductSchema(product));
358
- }
359
-
360
- return schemas;
361
- }
362
-
363
- export default async function handler(req, res) {
364
- // CORS headers
365
- res.setHeader('Access-Control-Allow-Origin', '*');
366
- res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
367
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
368
-
369
- if (req.method === 'OPTIONS') {
370
- return res.status(200).end();
371
- }
372
-
373
- // GET: Return available templates
374
- if (req.method === 'GET') {
375
- return res.status(200).json({
376
- templates: {
377
- returnPolicy: Object.keys(RETURN_POLICY_TEMPLATES),
378
- shipping: Object.keys(SHIPPING_TEMPLATES),
379
- },
380
- description: 'Use POST to generate custom Schema.org snippets',
381
- });
382
- }
383
-
384
- if (req.method !== 'POST') {
385
- return res.status(405).json({ error: 'Method not allowed' });
386
- }
387
-
388
- const {
389
- type, // 'return-policy', 'shipping', 'product', 'complete'
390
- template, // template name for quick generation
391
- options = {}, // custom options
392
- } = req.body;
393
-
394
- try {
395
- let schema;
396
- let embedCode;
397
-
398
- switch (type) {
399
- case 'return-policy':
400
- if (template && RETURN_POLICY_TEMPLATES[template]) {
401
- schema = RETURN_POLICY_TEMPLATES[template];
402
- } else {
403
- schema = generateCustomReturnPolicy(options);
404
- }
405
- break;
406
-
407
- case 'shipping':
408
- if (template && SHIPPING_TEMPLATES[template]) {
409
- schema = SHIPPING_TEMPLATES[template];
410
- } else {
411
- schema = generateCustomShipping(options);
412
- }
413
- break;
414
-
415
- case 'product':
416
- schema = generateProductSchema(options);
417
- break;
418
-
419
- case 'complete':
420
- schema = generateCompleteSchema(options);
421
- break;
422
-
423
- default:
424
- return res.status(400).json({
425
- error: 'Invalid type. Use: return-policy, shipping, product, or complete',
426
- availableTemplates: {
427
- returnPolicy: Object.keys(RETURN_POLICY_TEMPLATES),
428
- shipping: Object.keys(SHIPPING_TEMPLATES),
429
- },
430
- });
431
- }
432
-
433
- // Generate embed code
434
- const schemaJson = JSON.stringify(schema, null, 2);
435
- embedCode = `<script type="application/ld+json">
436
- ${schemaJson}
437
- </script>`;
438
-
439
- return res.status(200).json({
440
- success: true,
441
- type,
442
- schema,
443
- embedCode,
444
- instructions: [
445
- 'Copy the embedCode and paste it into your HTML <head> section',
446
- 'For products, add the schema to each product page',
447
- 'Use the @id references to link return policy and shipping to products',
448
- 'Validate at https://validator.schema.org/',
449
- ],
450
- });
451
- } catch (error) {
452
- return res.status(500).json({
453
- error: 'Failed to generate schema',
454
- message: error.message,
455
- });
456
- }
457
- }
package/api/generate.js DELETED
@@ -1,132 +0,0 @@
1
- /**
2
- * Vercel Serverless Function: Generate UCP Profile
3
- * POST /api/generate
4
- */
5
-
6
- function generateProfile({ domain, endpoint, capabilities }) {
7
- const today = new Date().toISOString().split('T')[0];
8
-
9
- const profile = {
10
- ucp: {
11
- version: today,
12
- services: {
13
- shopping: {
14
- version: "1.0",
15
- spec: "https://ucp.dev/specs/shopping/1.0",
16
- rest: {
17
- endpoint: endpoint,
18
- auth: {
19
- type: "oauth2",
20
- flows: ["client_credentials"],
21
- token_url: `${endpoint}/oauth/token`
22
- }
23
- }
24
- }
25
- },
26
- capabilities: []
27
- }
28
- };
29
-
30
- // Always add checkout (required)
31
- profile.ucp.capabilities.push({
32
- name: "dev.ucp.shopping.checkout",
33
- version: "1.0",
34
- spec: "https://ucp.dev/specs/shopping/checkout/1.0",
35
- schema: "https://ucp.dev/schemas/shopping/checkout/1.0.json"
36
- });
37
-
38
- // Add optional capabilities
39
- if (capabilities?.order) {
40
- profile.ucp.capabilities.push({
41
- name: "dev.ucp.shopping.order",
42
- version: "1.0",
43
- spec: "https://ucp.dev/specs/shopping/order/1.0",
44
- schema: "https://ucp.dev/schemas/shopping/order/1.0.json"
45
- });
46
-
47
- // Add signing_keys for order capability
48
- profile.signing_keys = [
49
- {
50
- kid: `${domain.replace(/\./g, '-')}-key-1`,
51
- alg: "ES256",
52
- use: "sig",
53
- kty: "EC",
54
- crv: "P-256",
55
- x: "PLACEHOLDER_X_COORDINATE",
56
- y: "PLACEHOLDER_Y_COORDINATE"
57
- }
58
- ];
59
- }
60
-
61
- if (capabilities?.fulfillment) {
62
- profile.ucp.capabilities.push({
63
- name: "dev.ucp.shopping.fulfillment",
64
- version: "1.0",
65
- spec: "https://ucp.dev/specs/shopping/fulfillment/1.0",
66
- schema: "https://ucp.dev/schemas/shopping/fulfillment/1.0.json"
67
- });
68
- }
69
-
70
- if (capabilities?.discount) {
71
- profile.ucp.capabilities.push({
72
- name: "dev.ucp.shopping.discount",
73
- version: "1.0",
74
- spec: "https://ucp.dev/specs/shopping/discount/1.0",
75
- schema: "https://ucp.dev/schemas/shopping/discount/1.0.json"
76
- });
77
- }
78
-
79
- return profile;
80
- }
81
-
82
- export default async function handler(req, res) {
83
- // CORS headers
84
- res.setHeader('Access-Control-Allow-Origin', '*');
85
- res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
86
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
87
-
88
- if (req.method === 'OPTIONS') {
89
- return res.status(200).end();
90
- }
91
-
92
- if (req.method !== 'POST') {
93
- return res.status(405).json({ error: 'Method not allowed' });
94
- }
95
-
96
- const { domain, endpoint, capabilities } = req.body;
97
-
98
- if (!domain) {
99
- return res.status(400).json({ error: 'Missing required field: domain' });
100
- }
101
-
102
- if (!endpoint) {
103
- return res.status(400).json({ error: 'Missing required field: endpoint' });
104
- }
105
-
106
- if (!endpoint.startsWith('https://')) {
107
- return res.status(400).json({ error: 'Endpoint must use HTTPS' });
108
- }
109
-
110
- const cleanDomain = domain.replace(/^https?:\/\//, '').replace(/\/$/, '');
111
- const cleanEndpoint = endpoint.replace(/\/$/, '');
112
-
113
- const profile = generateProfile({
114
- domain: cleanDomain,
115
- endpoint: cleanEndpoint,
116
- capabilities: capabilities || { checkout: true }
117
- });
118
-
119
- return res.status(200).json({
120
- ok: true,
121
- domain: cleanDomain,
122
- profile,
123
- deploy_to: `https://${cleanDomain}/.well-known/ucp`,
124
- instructions: [
125
- 'Save this JSON as "ucp" (no extension) or "ucp.json"',
126
- `Upload to your server at /.well-known/ucp`,
127
- 'Set Content-Type: application/json',
128
- 'Add CORS header: Access-Control-Allow-Origin: *',
129
- profile.signing_keys ? 'Replace PLACEHOLDER values in signing_keys with your actual EC key' : null
130
- ].filter(Boolean)
131
- });
132
- }