@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,252 @@
1
+ /**
2
+ * Database Utility Functions
3
+ * Helper functions for database operations, seeding, and testing
4
+ */
5
+ import { users, apiKeys, type NewSubscription, type NewMonitoredDomain, type NewValidationHistoryEntry } from './schema.js';
6
+ /**
7
+ * Create a new user with hashed password
8
+ */
9
+ export declare function createUser(data: {
10
+ email: string;
11
+ name?: string;
12
+ password?: string;
13
+ stripeCustomerId?: string;
14
+ }): Promise<typeof users.$inferSelect>;
15
+ /**
16
+ * Get user by email
17
+ */
18
+ export declare function getUserByEmail(email: string): Promise<{
19
+ id: string;
20
+ name: string | null;
21
+ email: string;
22
+ emailVerified: Date | null;
23
+ image: string | null;
24
+ passwordHash: string | null;
25
+ stripeCustomerId: string | null;
26
+ createdAt: Date;
27
+ updatedAt: Date;
28
+ }>;
29
+ /**
30
+ * Get user by ID
31
+ */
32
+ export declare function getUserById(id: string): Promise<{
33
+ id: string;
34
+ name: string | null;
35
+ email: string;
36
+ emailVerified: Date | null;
37
+ image: string | null;
38
+ passwordHash: string | null;
39
+ stripeCustomerId: string | null;
40
+ createdAt: Date;
41
+ updatedAt: Date;
42
+ }>;
43
+ /**
44
+ * Create or update a subscription
45
+ */
46
+ export declare function upsertSubscription(data: NewSubscription): Promise<{
47
+ id: string;
48
+ status: string;
49
+ createdAt: Date;
50
+ updatedAt: Date;
51
+ userId: string;
52
+ stripeSubscriptionId: string | null;
53
+ stripePriceId: string | null;
54
+ tier: string;
55
+ currentPeriodStart: Date | null;
56
+ currentPeriodEnd: Date | null;
57
+ cancelAtPeriodEnd: boolean | null;
58
+ }>;
59
+ /**
60
+ * Get user's current subscription
61
+ */
62
+ export declare function getUserSubscription(userId: string): Promise<{
63
+ id: string;
64
+ userId: string;
65
+ stripeSubscriptionId: string | null;
66
+ stripePriceId: string | null;
67
+ tier: string;
68
+ status: string;
69
+ currentPeriodStart: Date | null;
70
+ currentPeriodEnd: Date | null;
71
+ cancelAtPeriodEnd: boolean | null;
72
+ createdAt: Date;
73
+ updatedAt: Date;
74
+ }>;
75
+ import { getTierLimits } from '../api/tier-config/tiers.js';
76
+ export { getTierLimits };
77
+ /**
78
+ * Add a monitored domain for a user
79
+ */
80
+ export declare function addMonitoredDomain(data: NewMonitoredDomain): Promise<{
81
+ id: string;
82
+ domain: string;
83
+ createdAt: Date;
84
+ updatedAt: Date;
85
+ userId: string;
86
+ displayName: string | null;
87
+ lastScore: number | null;
88
+ lastGrade: string | null;
89
+ lastCheckedAt: Date | null;
90
+ alertOnScoreChange: boolean | null;
91
+ alertOnGradeChange: boolean | null;
92
+ alertThreshold: number | null;
93
+ monitoringFrequency: string | null;
94
+ webhookUrl: string | null;
95
+ webhookEnabled: boolean | null;
96
+ lastSeverity: string | null;
97
+ isActive: boolean | null;
98
+ }>;
99
+ /**
100
+ * Get user's monitored domains
101
+ */
102
+ export declare function getUserMonitoredDomains(userId: string): Promise<{
103
+ id: string;
104
+ userId: string;
105
+ domain: string;
106
+ displayName: string | null;
107
+ lastScore: number | null;
108
+ lastGrade: string | null;
109
+ lastCheckedAt: Date | null;
110
+ alertOnScoreChange: boolean | null;
111
+ alertOnGradeChange: boolean | null;
112
+ alertThreshold: number | null;
113
+ monitoringFrequency: string | null;
114
+ webhookUrl: string | null;
115
+ webhookEnabled: boolean | null;
116
+ lastSeverity: string | null;
117
+ isActive: boolean | null;
118
+ createdAt: Date;
119
+ updatedAt: Date;
120
+ }[]>;
121
+ /**
122
+ * Update domain validation results
123
+ */
124
+ export declare function updateDomainValidation(domainId: string, score: number, grade: string, hasUcp: boolean): Promise<{
125
+ id: string;
126
+ userId: string;
127
+ domain: string;
128
+ displayName: string | null;
129
+ lastScore: number | null;
130
+ lastGrade: string | null;
131
+ lastCheckedAt: Date | null;
132
+ alertOnScoreChange: boolean | null;
133
+ alertOnGradeChange: boolean | null;
134
+ alertThreshold: number | null;
135
+ monitoringFrequency: string | null;
136
+ webhookUrl: string | null;
137
+ webhookEnabled: boolean | null;
138
+ lastSeverity: string | null;
139
+ isActive: boolean | null;
140
+ createdAt: Date;
141
+ updatedAt: Date;
142
+ }>;
143
+ /**
144
+ * Add validation history entry
145
+ */
146
+ export declare function addValidationHistory(data: NewValidationHistoryEntry): Promise<{
147
+ id: string;
148
+ grade: string | null;
149
+ score: number | null;
150
+ severity: string | null;
151
+ domainId: string;
152
+ hasUcp: boolean | null;
153
+ issuesCount: number | null;
154
+ errorsCount: number | null;
155
+ warningsCount: number | null;
156
+ resultJson: string | null;
157
+ changesSummary: string | null;
158
+ validatedAt: Date;
159
+ }>;
160
+ /**
161
+ * Get validation history for a domain
162
+ */
163
+ export declare function getDomainHistory(domainId: string, limit?: number): Promise<{
164
+ id: string;
165
+ domainId: string;
166
+ score: number | null;
167
+ grade: string | null;
168
+ hasUcp: boolean | null;
169
+ issuesCount: number | null;
170
+ errorsCount: number | null;
171
+ warningsCount: number | null;
172
+ resultJson: string | null;
173
+ severity: string | null;
174
+ changesSummary: string | null;
175
+ validatedAt: Date;
176
+ }[]>;
177
+ /**
178
+ * Create API key for user
179
+ */
180
+ export declare function createApiKey(userId: string, name: string, monthlyLimit?: number): Promise<{
181
+ key: string;
182
+ apiKey: typeof apiKeys.$inferSelect;
183
+ }>;
184
+ /**
185
+ * Get user's API keys
186
+ */
187
+ export declare function getUserApiKeys(userId: string): Promise<{
188
+ id: string;
189
+ userId: string;
190
+ keyHash: string;
191
+ keyPrefix: string;
192
+ name: string;
193
+ lastUsedAt: Date | null;
194
+ callsThisMonth: number | null;
195
+ monthlyLimit: number | null;
196
+ isActive: boolean | null;
197
+ expiresAt: Date | null;
198
+ createdAt: Date;
199
+ }[]>;
200
+ /**
201
+ * Increment API key usage
202
+ */
203
+ export declare function incrementApiKeyUsage(keyId: string): Promise<{
204
+ id: string;
205
+ userId: string;
206
+ keyHash: string;
207
+ keyPrefix: string;
208
+ name: string;
209
+ lastUsedAt: Date | null;
210
+ callsThisMonth: number | null;
211
+ monthlyLimit: number | null;
212
+ isActive: boolean | null;
213
+ expiresAt: Date | null;
214
+ createdAt: Date;
215
+ }>;
216
+ /**
217
+ * Reset monthly API call counters (for cron job)
218
+ */
219
+ export declare function resetMonthlyApiCalls(): Promise<void>;
220
+ /**
221
+ * Check if user can add more domains based on their subscription tier
222
+ *
223
+ * Returns an object with:
224
+ * - allowed: boolean - whether the user can add more domains
225
+ * - currentCount: number - current number of active domains
226
+ * - maxAllowed: number - maximum domains allowed for their tier
227
+ * - tier: string - the user's subscription tier
228
+ */
229
+ export declare function canAddDomain(userId: string): Promise<{
230
+ allowed: boolean;
231
+ currentCount: number;
232
+ maxAllowed: number;
233
+ tier: string;
234
+ }>;
235
+ /**
236
+ * Check if user can add more hosted profiles based on their subscription tier
237
+ */
238
+ export declare function canAddHostedProfile(userId: string): Promise<{
239
+ allowed: boolean;
240
+ currentCount: number;
241
+ maxAllowed: number;
242
+ tier: string;
243
+ }>;
244
+ /**
245
+ * Check if user can create more API keys
246
+ */
247
+ export declare function canCreateApiKey(userId: string): Promise<boolean>;
248
+ /**
249
+ * Clean up test data (for testing)
250
+ */
251
+ export declare function cleanupTestData(email: string): Promise<void>;
252
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/db/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,KAAK,EAIL,OAAO,EAGP,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAEjC,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAYrC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;GAIjD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;GAI3C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,eAAe;;;;;;;;;;;;GAyB7D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;GAOvD;AAID,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;GAoBhE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;KAM3D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO;;;;;;;;;;;;;;;;;;GAgBlB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,yBAAyB;;;;;;;;;;;;;GAIzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAW;;;;;;;;;;;;;KASrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,OAAO,CAAC,YAAY,CAAA;CAAE,CAAC,CAoB/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;KAGlD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;;GAavD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,kBASzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC,CA6BD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC,CA2BD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUtE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,iBASlD"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ /**
3
+ * Database Utility Functions
4
+ * Helper functions for database operations, seeding, and testing
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getTierLimits = void 0;
8
+ exports.createUser = createUser;
9
+ exports.getUserByEmail = getUserByEmail;
10
+ exports.getUserById = getUserById;
11
+ exports.upsertSubscription = upsertSubscription;
12
+ exports.getUserSubscription = getUserSubscription;
13
+ exports.addMonitoredDomain = addMonitoredDomain;
14
+ exports.getUserMonitoredDomains = getUserMonitoredDomains;
15
+ exports.updateDomainValidation = updateDomainValidation;
16
+ exports.addValidationHistory = addValidationHistory;
17
+ exports.getDomainHistory = getDomainHistory;
18
+ exports.createApiKey = createApiKey;
19
+ exports.getUserApiKeys = getUserApiKeys;
20
+ exports.incrementApiKeyUsage = incrementApiKeyUsage;
21
+ exports.resetMonthlyApiCalls = resetMonthlyApiCalls;
22
+ exports.canAddDomain = canAddDomain;
23
+ exports.canAddHostedProfile = canAddHostedProfile;
24
+ exports.canCreateApiKey = canCreateApiKey;
25
+ exports.cleanupTestData = cleanupTestData;
26
+ const index_js_1 = require("./index.js");
27
+ const schema_js_1 = require("./schema.js");
28
+ const drizzle_orm_1 = require("drizzle-orm");
29
+ const bcryptjs_1 = require("bcryptjs");
30
+ const nanoid_1 = require("nanoid");
31
+ /**
32
+ * Create a new user with hashed password
33
+ */
34
+ async function createUser(data) {
35
+ const db = (0, index_js_1.getDb)();
36
+ const userData = {
37
+ email: data.email,
38
+ name: data.name,
39
+ passwordHash: data.password ? await (0, bcryptjs_1.hash)(data.password, 10) : undefined,
40
+ stripeCustomerId: data.stripeCustomerId,
41
+ };
42
+ const [user] = await db.insert(schema_js_1.users).values(userData).returning();
43
+ return user;
44
+ }
45
+ /**
46
+ * Get user by email
47
+ */
48
+ async function getUserByEmail(email) {
49
+ const db = (0, index_js_1.getDb)();
50
+ const [user] = await db.select().from(schema_js_1.users).where((0, drizzle_orm_1.eq)(schema_js_1.users.email, email));
51
+ return user || null;
52
+ }
53
+ /**
54
+ * Get user by ID
55
+ */
56
+ async function getUserById(id) {
57
+ const db = (0, index_js_1.getDb)();
58
+ const [user] = await db.select().from(schema_js_1.users).where((0, drizzle_orm_1.eq)(schema_js_1.users.id, id));
59
+ return user || null;
60
+ }
61
+ /**
62
+ * Create or update a subscription
63
+ */
64
+ async function upsertSubscription(data) {
65
+ const db = (0, index_js_1.getDb)();
66
+ // Check if subscription exists for this user
67
+ const [existing] = await db
68
+ .select()
69
+ .from(schema_js_1.subscriptions)
70
+ .where((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, data.userId));
71
+ if (existing) {
72
+ // Update existing subscription
73
+ const [updated] = await db
74
+ .update(schema_js_1.subscriptions)
75
+ .set({
76
+ ...data,
77
+ updatedAt: new Date(),
78
+ })
79
+ .where((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, data.userId))
80
+ .returning();
81
+ return updated;
82
+ }
83
+ else {
84
+ // Create new subscription
85
+ const [created] = await db.insert(schema_js_1.subscriptions).values(data).returning();
86
+ return created;
87
+ }
88
+ }
89
+ /**
90
+ * Get user's current subscription
91
+ */
92
+ async function getUserSubscription(userId) {
93
+ const db = (0, index_js_1.getDb)();
94
+ const [subscription] = await db
95
+ .select()
96
+ .from(schema_js_1.subscriptions)
97
+ .where((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, userId));
98
+ return subscription || null;
99
+ }
100
+ // Import and re-export getTierLimits from centralized config
101
+ // All tier limits are defined in src/api/tier-config/tiers.ts
102
+ const tiers_js_1 = require("../api/tier-config/tiers.js");
103
+ Object.defineProperty(exports, "getTierLimits", { enumerable: true, get: function () { return tiers_js_1.getTierLimits; } });
104
+ /**
105
+ * Add a monitored domain for a user
106
+ */
107
+ async function addMonitoredDomain(data) {
108
+ const db = (0, index_js_1.getDb)();
109
+ // Check if domain already exists for this user
110
+ const [existing] = await db
111
+ .select()
112
+ .from(schema_js_1.monitoredDomains)
113
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, data.userId), (0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.domain, data.domain)));
114
+ if (existing) {
115
+ throw new Error(`Domain ${data.domain} is already being monitored`);
116
+ }
117
+ const [domain] = await db.insert(schema_js_1.monitoredDomains).values(data).returning();
118
+ return domain;
119
+ }
120
+ /**
121
+ * Get user's monitored domains
122
+ */
123
+ async function getUserMonitoredDomains(userId) {
124
+ const db = (0, index_js_1.getDb)();
125
+ return db
126
+ .select()
127
+ .from(schema_js_1.monitoredDomains)
128
+ .where((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, userId));
129
+ }
130
+ /**
131
+ * Update domain validation results
132
+ */
133
+ async function updateDomainValidation(domainId, score, grade, hasUcp) {
134
+ const db = (0, index_js_1.getDb)();
135
+ const [updated] = await db
136
+ .update(schema_js_1.monitoredDomains)
137
+ .set({
138
+ lastScore: score,
139
+ lastGrade: grade,
140
+ lastCheckedAt: new Date(),
141
+ updatedAt: new Date(),
142
+ })
143
+ .where((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.id, domainId))
144
+ .returning();
145
+ return updated;
146
+ }
147
+ /**
148
+ * Add validation history entry
149
+ */
150
+ async function addValidationHistory(data) {
151
+ const db = (0, index_js_1.getDb)();
152
+ const [entry] = await db.insert(schema_js_1.validationHistory).values(data).returning();
153
+ return entry;
154
+ }
155
+ /**
156
+ * Get validation history for a domain
157
+ */
158
+ async function getDomainHistory(domainId, limit = 30) {
159
+ const db = (0, index_js_1.getDb)();
160
+ return db
161
+ .select()
162
+ .from(schema_js_1.validationHistory)
163
+ .where((0, drizzle_orm_1.eq)(schema_js_1.validationHistory.domainId, domainId))
164
+ .orderBy((0, drizzle_orm_1.desc)(schema_js_1.validationHistory.validatedAt))
165
+ .limit(limit);
166
+ }
167
+ /**
168
+ * Create API key for user
169
+ */
170
+ async function createApiKey(userId, name, monthlyLimit) {
171
+ const db = (0, index_js_1.getDb)();
172
+ // Generate API key: ucp_live_<random>
173
+ const key = `ucp_live_${(0, nanoid_1.nanoid)(32)}`;
174
+ const keyHash = await (0, bcryptjs_1.hash)(key, 10);
175
+ const keyPrefix = key.substring(0, 12);
176
+ const [apiKey] = await db
177
+ .insert(schema_js_1.apiKeys)
178
+ .values({
179
+ userId,
180
+ keyHash,
181
+ keyPrefix,
182
+ name,
183
+ monthlyLimit: monthlyLimit || 100,
184
+ })
185
+ .returning();
186
+ return { key, apiKey };
187
+ }
188
+ /**
189
+ * Get user's API keys
190
+ */
191
+ async function getUserApiKeys(userId) {
192
+ const db = (0, index_js_1.getDb)();
193
+ return db.select().from(schema_js_1.apiKeys).where((0, drizzle_orm_1.eq)(schema_js_1.apiKeys.userId, userId));
194
+ }
195
+ /**
196
+ * Increment API key usage
197
+ */
198
+ async function incrementApiKeyUsage(keyId) {
199
+ const db = (0, index_js_1.getDb)();
200
+ const [updated] = await db
201
+ .update(schema_js_1.apiKeys)
202
+ .set({
203
+ callsThisMonth: (0, drizzle_orm_1.sql) `${schema_js_1.apiKeys.callsThisMonth} + 1`,
204
+ lastUsedAt: new Date(),
205
+ })
206
+ .where((0, drizzle_orm_1.eq)(schema_js_1.apiKeys.id, keyId))
207
+ .returning();
208
+ return updated;
209
+ }
210
+ /**
211
+ * Reset monthly API call counters (for cron job)
212
+ */
213
+ async function resetMonthlyApiCalls() {
214
+ const db = (0, index_js_1.getDb)();
215
+ await db
216
+ .update(schema_js_1.apiKeys)
217
+ .set({
218
+ callsThisMonth: 0,
219
+ })
220
+ .where((0, drizzle_orm_1.eq)(schema_js_1.apiKeys.isActive, true));
221
+ }
222
+ /**
223
+ * Check if user can add more domains based on their subscription tier
224
+ *
225
+ * Returns an object with:
226
+ * - allowed: boolean - whether the user can add more domains
227
+ * - currentCount: number - current number of active domains
228
+ * - maxAllowed: number - maximum domains allowed for their tier
229
+ * - tier: string - the user's subscription tier
230
+ */
231
+ async function canAddDomain(userId) {
232
+ const db = (0, index_js_1.getDb)();
233
+ const subscription = await getUserSubscription(userId);
234
+ const tier = subscription?.tier || 'free';
235
+ // Only count active subscriptions as valid
236
+ const isActiveSubscription = subscription?.status === 'active' || subscription?.status === 'trialing';
237
+ const effectiveTier = isActiveSubscription ? tier : 'free';
238
+ const limits = (0, tiers_js_1.getTierLimits)(effectiveTier);
239
+ // Count only active domains (not soft-deleted)
240
+ const activeDomains = await db
241
+ .select()
242
+ .from(schema_js_1.monitoredDomains)
243
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, userId), (0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.isActive, true)));
244
+ return {
245
+ allowed: activeDomains.length < limits.maxDomains,
246
+ currentCount: activeDomains.length,
247
+ maxAllowed: limits.maxDomains,
248
+ tier: effectiveTier,
249
+ };
250
+ }
251
+ /**
252
+ * Check if user can add more hosted profiles based on their subscription tier
253
+ */
254
+ async function canAddHostedProfile(userId) {
255
+ const db = (0, index_js_1.getDb)();
256
+ const subscription = await getUserSubscription(userId);
257
+ const tier = subscription?.tier || 'free';
258
+ const isActiveSubscription = subscription?.status === 'active' || subscription?.status === 'trialing';
259
+ const effectiveTier = isActiveSubscription ? tier : 'free';
260
+ const limits = (0, tiers_js_1.getTierLimits)(effectiveTier);
261
+ const activeProfiles = await db
262
+ .select()
263
+ .from(schema_js_1.hostedProfiles)
264
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.hostedProfiles.userId, userId), (0, drizzle_orm_1.sql) `${schema_js_1.hostedProfiles.hostingStatus} != 'suspended'`));
265
+ return {
266
+ allowed: limits.hasHosting && activeProfiles.length < limits.maxHostedProfiles,
267
+ currentCount: activeProfiles.length,
268
+ maxAllowed: limits.maxHostedProfiles,
269
+ tier: effectiveTier,
270
+ };
271
+ }
272
+ /**
273
+ * Check if user can create more API keys
274
+ */
275
+ async function canCreateApiKey(userId) {
276
+ const db = (0, index_js_1.getDb)();
277
+ const subscription = await getUserSubscription(userId);
278
+ const tier = subscription?.tier || 'free';
279
+ const limits = (0, tiers_js_1.getTierLimits)(tier);
280
+ const keys = await getUserApiKeys(userId);
281
+ return keys.length < limits.maxApiKeys;
282
+ }
283
+ /**
284
+ * Clean up test data (for testing)
285
+ */
286
+ async function cleanupTestData(email) {
287
+ const db = (0, index_js_1.getDb)();
288
+ // Get user
289
+ const user = await getUserByEmail(email);
290
+ if (!user)
291
+ return;
292
+ // Delete will cascade to all related tables due to foreign key constraints
293
+ await db.delete(schema_js_1.users).where((0, drizzle_orm_1.eq)(schema_js_1.users.id, user.id));
294
+ }
295
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/db/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Product Feed Quality Analyzer
3
+ * Deep analysis of product data quality for AI agent visibility
4
+ */
5
+ import type { ProductData, ProductAnalysis, FeedAnalysisResult, FeedAnalysisInput, GtinValidation } from './types.js';
6
+ /**
7
+ * Validate a GTIN/UPC/EAN identifier
8
+ */
9
+ export declare function validateGtin(gtin: string): GtinValidation;
10
+ /**
11
+ * Extract products from HTML content
12
+ */
13
+ export declare function extractProductsFromHtml(html: string): ProductData[];
14
+ /**
15
+ * Analyze a single product
16
+ */
17
+ export declare function analyzeProduct(product: ProductData): ProductAnalysis;
18
+ /**
19
+ * Analyze product feed from raw product data
20
+ */
21
+ export declare function analyzeProductFeed(products: ProductData[], url: string, maxProducts?: number, includeProductDetails?: boolean): FeedAnalysisResult;
22
+ /**
23
+ * Analyze a product feed from HTML content
24
+ */
25
+ export declare function analyzeProductFeedFromHtml(html: string, url: string, options?: Partial<FeedAnalysisInput>): FeedAnalysisResult;
26
+ //# sourceMappingURL=feed-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-analyzer.d.ts","sourceRoot":"","sources":["../../src/feed-analyzer/feed-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACR,WAAW,EAEX,eAAe,EAEf,kBAAkB,EAClB,iBAAiB,EAIjB,cAAc,EAGjB,MAAM,YAAY,CAAC;AAmBpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAwCzD;AAsBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAiDnE;AAgDD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,CA4GpE;AAkkBD;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,MAA6B,EAC1C,qBAAqB,GAAE,OAAc,GACtC,kBAAkB,CAqDpB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACzC,kBAAkB,CAMpB"}