@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,613 @@
1
+ "use strict";
2
+ /**
3
+ * Cron Service
4
+ *
5
+ * Handles scheduled tasks like weekly domain validation.
6
+ * Designed to be triggered by Vercel Cron, external scheduler, or manual API call.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getDomainsNeedingValidation = getDomainsNeedingValidation;
10
+ exports.runWeeklyValidation = runWeeklyValidation;
11
+ exports.getCronStats = getCronStats;
12
+ exports.runTrialEmailSequence = runTrialEmailSequence;
13
+ exports.runHostedProfileMaintenance = runHostedProfileMaintenance;
14
+ exports.runExpireTrials = runExpireTrials;
15
+ const index_js_1 = require("../db/index.js");
16
+ const schema_js_1 = require("../db/schema.js");
17
+ const drizzle_orm_1 = require("drizzle-orm");
18
+ const validation_history_js_1 = require("./validation-history.js");
19
+ const email_js_1 = require("./email.js");
20
+ const monitoring_diff_js_1 = require("./monitoring-diff.js");
21
+ const notifications_js_1 = require("./notifications.js");
22
+ const hosted_profiles_js_1 = require("./hosted-profiles.js");
23
+ /**
24
+ * Get all domains that need validation based on their monitoring frequency.
25
+ * - Must be active
26
+ * - User must have active or trialing subscription
27
+ * - Filters by frequency: daily → 24h threshold, weekly → 7d threshold
28
+ * - Never-checked domains are always included
29
+ */
30
+ async function getDomainsNeedingValidation() {
31
+ const db = (0, index_js_1.getDb)();
32
+ // Get all active domains with active/trialing subscriptions
33
+ const domains = await db
34
+ .select({
35
+ id: schema_js_1.monitoredDomains.id,
36
+ domain: schema_js_1.monitoredDomains.domain,
37
+ userId: schema_js_1.monitoredDomains.userId,
38
+ userEmail: schema_js_1.users.email,
39
+ userName: schema_js_1.users.name,
40
+ lastCheckedAt: schema_js_1.monitoredDomains.lastCheckedAt,
41
+ lastScore: schema_js_1.monitoredDomains.lastScore,
42
+ lastGrade: schema_js_1.monitoredDomains.lastGrade,
43
+ alertOnScoreChange: schema_js_1.monitoredDomains.alertOnScoreChange,
44
+ alertOnGradeChange: schema_js_1.monitoredDomains.alertOnGradeChange,
45
+ alertThreshold: schema_js_1.monitoredDomains.alertThreshold,
46
+ monitoringFrequency: schema_js_1.monitoredDomains.monitoringFrequency,
47
+ webhookUrl: schema_js_1.monitoredDomains.webhookUrl,
48
+ webhookEnabled: schema_js_1.monitoredDomains.webhookEnabled,
49
+ })
50
+ .from(schema_js_1.monitoredDomains)
51
+ .innerJoin(schema_js_1.users, (0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, schema_js_1.users.id))
52
+ .innerJoin(schema_js_1.subscriptions, (0, drizzle_orm_1.eq)(schema_js_1.users.id, schema_js_1.subscriptions.userId))
53
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.isActive, true), (0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.status, 'active'), (0, drizzle_orm_1.eq)(schema_js_1.subscriptions.status, 'trialing'), (0, drizzle_orm_1.eq)(schema_js_1.subscriptions.status, 'expired'))));
54
+ // Filter in JS by frequency threshold
55
+ const now = Date.now();
56
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
57
+ const SEVEN_DAYS_MS = 7 * ONE_DAY_MS;
58
+ return domains.filter(d => {
59
+ // Never checked → always include
60
+ if (!d.lastCheckedAt)
61
+ return true;
62
+ const elapsed = now - new Date(d.lastCheckedAt).getTime();
63
+ const frequency = d.monitoringFrequency || 'weekly';
64
+ if (frequency === 'daily') {
65
+ return elapsed >= ONE_DAY_MS;
66
+ }
67
+ // weekly (default)
68
+ return elapsed >= SEVEN_DAYS_MS;
69
+ });
70
+ }
71
+ /**
72
+ * Run domain validation for all eligible domains (frequency-aware).
73
+ * Includes diff analysis, severity classification, and webhook dispatch.
74
+ *
75
+ * @param maxDomains - Maximum number of domains to process (for rate limiting)
76
+ * @param delayBetweenMs - Delay between validations in milliseconds
77
+ */
78
+ async function runWeeklyValidation(maxDomains = 100, delayBetweenMs = 1000) {
79
+ const startTime = Date.now();
80
+ const result = {
81
+ success: true,
82
+ domainsProcessed: 0,
83
+ domainsValidated: 0,
84
+ domainsFailed: 0,
85
+ alertsSent: 0,
86
+ alertsFailed: 0,
87
+ webhooksSent: 0,
88
+ errors: [],
89
+ durationMs: 0,
90
+ };
91
+ const dashboardBaseUrl = process.env.DASHBOARD_URL || 'https://ucptools.dev/dashboard';
92
+ try {
93
+ const domains = await getDomainsNeedingValidation();
94
+ const toProcess = domains.slice(0, maxDomains);
95
+ console.log(`[Cron] Found ${domains.length} domains needing validation, processing ${toProcess.length}`);
96
+ for (const domainInfo of toProcess) {
97
+ result.domainsProcessed++;
98
+ try {
99
+ console.log(`[Cron] Validating domain: ${domainInfo.domain}`);
100
+ // Run validation and store history
101
+ const { result: validationResult, historyEntry } = await (0, validation_history_js_1.validateAndStoreHistory)(domainInfo.id, domainInfo.domain);
102
+ result.domainsValidated++;
103
+ const newScore = validationResult.ai_readiness.score;
104
+ const newGrade = validationResult.ai_readiness.grade;
105
+ console.log(`[Cron] Successfully validated: ${domainInfo.domain} (score: ${newScore})`);
106
+ // ── Diff analysis ──────────────────────────────────────────
107
+ let diff = null;
108
+ const previousEntry = await (0, validation_history_js_1.getPreviousValidation)(domainInfo.id, historyEntry?.id);
109
+ if (previousEntry?.resultJson) {
110
+ try {
111
+ const previousResult = JSON.parse(previousEntry.resultJson);
112
+ diff = (0, monitoring_diff_js_1.diffValidationResults)(previousResult, validationResult, domainInfo.alertThreshold ?? 10);
113
+ // Store severity + changes summary on the history entry
114
+ if (historyEntry) {
115
+ await (0, validation_history_js_1.updateHistorySeverity)(historyEntry.id, diff.severity, JSON.stringify({ text: diff.summary, changes: diff.changes }));
116
+ }
117
+ // Update lastSeverity on the monitored domain
118
+ const db = (0, index_js_1.getDb)();
119
+ await db
120
+ .update(schema_js_1.monitoredDomains)
121
+ .set({ lastSeverity: diff.severity, updatedAt: new Date() })
122
+ .where((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.id, domainInfo.id));
123
+ console.log(`[Cron] Diff for ${domainInfo.domain}: severity=${diff.severity}, changes=${diff.changes.length}`);
124
+ }
125
+ catch (diffError) {
126
+ console.error(`[Cron] Diff error for ${domainInfo.domain}:`, diffError);
127
+ }
128
+ }
129
+ // ── Severity-based alerting ────────────────────────────────
130
+ const severity = diff?.severity;
131
+ const dashboardUrl = `${dashboardBaseUrl}/domains/${domainInfo.id}`;
132
+ const shouldEmail = severity === 'broken'
133
+ || (severity === 'degraded' && (domainInfo.alertOnScoreChange || domainInfo.alertOnGradeChange))
134
+ || (!diff && domainInfo.alertOnScoreChange && domainInfo.lastScore !== null && Math.abs(newScore - domainInfo.lastScore) >= (domainInfo.alertThreshold ?? 10));
135
+ if (shouldEmail) {
136
+ try {
137
+ let emailResult;
138
+ // Use severity-aware template when we have diff data
139
+ if (diff && (severity === 'broken' || severity === 'degraded' || severity === 'changed')) {
140
+ emailResult = await (0, email_js_1.sendSeverityAlert)({
141
+ to: {
142
+ email: domainInfo.userEmail,
143
+ name: domainInfo.userName || undefined,
144
+ },
145
+ domain: domainInfo.domain,
146
+ severity,
147
+ oldScore: domainInfo.lastScore,
148
+ newScore,
149
+ oldGrade: domainInfo.lastGrade,
150
+ newGrade,
151
+ summary: diff.summary,
152
+ changes: diff.changes.map(c => ({
153
+ field: c.field,
154
+ type: c.type,
155
+ oldValue: c.oldValue,
156
+ newValue: c.newValue,
157
+ })),
158
+ dashboardUrl,
159
+ });
160
+ }
161
+ else {
162
+ // Fallback to basic score change alert
163
+ emailResult = await (0, email_js_1.sendScoreChangeAlert)({
164
+ to: {
165
+ email: domainInfo.userEmail,
166
+ name: domainInfo.userName || undefined,
167
+ },
168
+ domain: domainInfo.domain,
169
+ oldScore: domainInfo.lastScore ?? 0,
170
+ newScore,
171
+ oldGrade: domainInfo.lastGrade || 'F',
172
+ newGrade,
173
+ dashboardUrl,
174
+ });
175
+ }
176
+ if (emailResult.success) {
177
+ result.alertsSent++;
178
+ console.log(`[Cron] Alert sent to ${domainInfo.userEmail} (severity: ${severity || 'score-change'})`);
179
+ }
180
+ else {
181
+ result.alertsFailed++;
182
+ console.error(`[Cron] Failed to send alert: ${emailResult.error}`);
183
+ }
184
+ }
185
+ catch (emailError) {
186
+ result.alertsFailed++;
187
+ console.error(`[Cron] Email error:`, emailError);
188
+ }
189
+ }
190
+ // ── Webhook dispatch ───────────────────────────────────────
191
+ if (diff && diff.severity !== 'stable' && domainInfo.webhookEnabled && domainInfo.webhookUrl) {
192
+ const eventMap = {
193
+ broken: 'profile_broken',
194
+ degraded: 'profile_degraded',
195
+ changed: 'profile_changed',
196
+ };
197
+ const payload = {
198
+ event: eventMap[diff.severity] || 'profile_changed',
199
+ domain: domainInfo.domain,
200
+ severity: diff.severity,
201
+ oldScore: domainInfo.lastScore,
202
+ newScore,
203
+ oldGrade: domainInfo.lastGrade,
204
+ newGrade,
205
+ changes: diff.changes.map(c => ({
206
+ field: c.field,
207
+ type: c.type,
208
+ oldValue: c.oldValue,
209
+ newValue: c.newValue,
210
+ })),
211
+ summary: diff.summary,
212
+ timestamp: new Date().toISOString(),
213
+ dashboardUrl,
214
+ };
215
+ const sent = await (0, notifications_js_1.sendDomainWebhook)(domainInfo.webhookUrl, payload);
216
+ if (sent)
217
+ result.webhooksSent++;
218
+ }
219
+ }
220
+ catch (error) {
221
+ result.domainsFailed++;
222
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
223
+ result.errors.push({ domain: domainInfo.domain, error: errorMessage });
224
+ console.error(`[Cron] Failed to validate ${domainInfo.domain}:`, errorMessage);
225
+ }
226
+ // Add delay between validations to avoid overwhelming the system
227
+ if (delayBetweenMs > 0 && result.domainsProcessed < toProcess.length) {
228
+ await sleep(delayBetweenMs);
229
+ }
230
+ }
231
+ result.success = result.domainsFailed === 0;
232
+ }
233
+ catch (error) {
234
+ result.success = false;
235
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
236
+ result.errors.push({ domain: 'system', error: errorMessage });
237
+ console.error('[Cron] Domain validation failed:', errorMessage);
238
+ }
239
+ result.durationMs = Date.now() - startTime;
240
+ console.log(`[Cron] Completed: ${result.domainsValidated}/${result.domainsProcessed} validated, ${result.alertsSent} alerts, ${result.webhooksSent} webhooks in ${result.durationMs}ms`);
241
+ return result;
242
+ }
243
+ /**
244
+ * Get cron status/stats
245
+ */
246
+ async function getCronStats() {
247
+ const domains = await getDomainsNeedingValidation();
248
+ // Next run is typically handled by external scheduler
249
+ // For Vercel Cron, this would be configured in vercel.json
250
+ const nextRunAt = new Date();
251
+ nextRunAt.setDate(nextRunAt.getDate() + 7);
252
+ nextRunAt.setHours(0, 0, 0, 0);
253
+ return {
254
+ pendingDomains: domains.length,
255
+ lastRunAt: null, // Would need separate tracking for this
256
+ nextRunAt,
257
+ };
258
+ }
259
+ function sleep(ms) {
260
+ return new Promise(resolve => setTimeout(resolve, ms));
261
+ }
262
+ /**
263
+ * Send trial sequence emails to users
264
+ *
265
+ * - Day 3: Value reminder + Feature highlight
266
+ * - Day 6: Trial ending + Conversion CTA
267
+ *
268
+ * This should be run daily via cron job.
269
+ */
270
+ async function runTrialEmailSequence() {
271
+ const startTime = Date.now();
272
+ const result = {
273
+ success: true,
274
+ day1Sent: 0,
275
+ day1Failed: 0,
276
+ day3Sent: 0,
277
+ day3Failed: 0,
278
+ day6Sent: 0,
279
+ day6Failed: 0,
280
+ errors: [],
281
+ durationMs: 0,
282
+ };
283
+ const dashboardBaseUrl = process.env.DASHBOARD_URL || 'https://ucptools.dev/dashboard';
284
+ try {
285
+ const db = (0, index_js_1.getDb)();
286
+ // Get trialing users with their trial start dates
287
+ const trialingUsers = await db
288
+ .select({
289
+ userId: schema_js_1.users.id,
290
+ email: schema_js_1.users.email,
291
+ name: schema_js_1.users.name,
292
+ trialStartedAt: schema_js_1.subscriptions.createdAt,
293
+ currentPeriodEnd: schema_js_1.subscriptions.currentPeriodEnd,
294
+ })
295
+ .from(schema_js_1.subscriptions)
296
+ .innerJoin(schema_js_1.users, (0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, schema_js_1.users.id))
297
+ .where((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.status, 'trialing'));
298
+ console.log(`[Cron] Found ${trialingUsers.length} users in trial`);
299
+ const now = new Date();
300
+ for (const user of trialingUsers) {
301
+ if (!user.trialStartedAt)
302
+ continue;
303
+ const trialStart = new Date(user.trialStartedAt);
304
+ const daysSinceTrialStart = Math.floor((now.getTime() - trialStart.getTime()) / (1000 * 60 * 60 * 24));
305
+ // Get user's domain count for personalization
306
+ const domainCount = await db
307
+ .select({ count: schema_js_1.monitoredDomains.id })
308
+ .from(schema_js_1.monitoredDomains)
309
+ .where((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, user.userId))
310
+ .then((rows) => rows.length);
311
+ // Day 1 email - Quick Start Guide
312
+ if (daysSinceTrialStart === 1) {
313
+ try {
314
+ console.log(`[Cron] Sending Day 1 email to ${user.email}`);
315
+ const emailResult = await (0, email_js_1.sendTrialDay1Email)({
316
+ to: {
317
+ email: user.email,
318
+ name: user.name || undefined,
319
+ },
320
+ dashboardUrl: dashboardBaseUrl,
321
+ });
322
+ if (emailResult.success) {
323
+ result.day1Sent++;
324
+ console.log(`[Cron] Day 1 email sent to ${user.email}`);
325
+ }
326
+ else {
327
+ result.day1Failed++;
328
+ result.errors.push({
329
+ userId: user.userId,
330
+ email: user.email,
331
+ error: emailResult.error || 'Unknown error',
332
+ });
333
+ }
334
+ }
335
+ catch (error) {
336
+ result.day1Failed++;
337
+ result.errors.push({
338
+ userId: user.userId,
339
+ email: user.email,
340
+ error: error instanceof Error ? error.message : 'Unknown error',
341
+ });
342
+ }
343
+ }
344
+ // Day 3 email (send on day 3)
345
+ if (daysSinceTrialStart === 3) {
346
+ try {
347
+ console.log(`[Cron] Sending Day 3 email to ${user.email}`);
348
+ const emailResult = await (0, email_js_1.sendTrialDay3Email)({
349
+ to: {
350
+ email: user.email,
351
+ name: user.name || undefined,
352
+ },
353
+ dashboardUrl: dashboardBaseUrl,
354
+ domainsAdded: domainCount,
355
+ });
356
+ if (emailResult.success) {
357
+ result.day3Sent++;
358
+ console.log(`[Cron] Day 3 email sent to ${user.email}`);
359
+ }
360
+ else {
361
+ result.day3Failed++;
362
+ result.errors.push({
363
+ userId: user.userId,
364
+ email: user.email,
365
+ error: emailResult.error || 'Unknown error',
366
+ });
367
+ }
368
+ }
369
+ catch (error) {
370
+ result.day3Failed++;
371
+ result.errors.push({
372
+ userId: user.userId,
373
+ email: user.email,
374
+ error: error instanceof Error ? error.message : 'Unknown error',
375
+ });
376
+ }
377
+ }
378
+ // Day 6 email (send on day 6)
379
+ if (daysSinceTrialStart === 6) {
380
+ try {
381
+ console.log(`[Cron] Sending Day 6 email to ${user.email}`);
382
+ // Get validation count for this user
383
+ const validationCount = await db
384
+ .select({ count: schema_js_1.monitoredDomains.id })
385
+ .from(schema_js_1.monitoredDomains)
386
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, user.userId),
387
+ // Has been validated at least once
388
+ (0, drizzle_orm_1.lt)(schema_js_1.monitoredDomains.lastCheckedAt, now)))
389
+ .then((rows) => rows.length);
390
+ const emailResult = await (0, email_js_1.sendTrialDay6Email)({
391
+ to: {
392
+ email: user.email,
393
+ name: user.name || undefined,
394
+ },
395
+ dashboardUrl: dashboardBaseUrl,
396
+ domainsAdded: domainCount,
397
+ validationsRun: validationCount,
398
+ });
399
+ if (emailResult.success) {
400
+ result.day6Sent++;
401
+ console.log(`[Cron] Day 6 email sent to ${user.email}`);
402
+ }
403
+ else {
404
+ result.day6Failed++;
405
+ result.errors.push({
406
+ userId: user.userId,
407
+ email: user.email,
408
+ error: emailResult.error || 'Unknown error',
409
+ });
410
+ }
411
+ }
412
+ catch (error) {
413
+ result.day6Failed++;
414
+ result.errors.push({
415
+ userId: user.userId,
416
+ email: user.email,
417
+ error: error instanceof Error ? error.message : 'Unknown error',
418
+ });
419
+ }
420
+ }
421
+ // Small delay between emails to avoid rate limits
422
+ await sleep(100);
423
+ }
424
+ result.success =
425
+ result.day1Failed === 0 && result.day3Failed === 0 && result.day6Failed === 0;
426
+ }
427
+ catch (error) {
428
+ result.success = false;
429
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
430
+ result.errors.push({ userId: 'system', email: '', error: errorMessage });
431
+ console.error('[Cron] Trial email sequence failed:', errorMessage);
432
+ }
433
+ result.durationMs = Date.now() - startTime;
434
+ console.log(`[Cron] Trial emails completed: Day 1: ${result.day1Sent}, Day 3: ${result.day3Sent}, Day 6: ${result.day6Sent} sent in ${result.durationMs}ms`);
435
+ return result;
436
+ }
437
+ /**
438
+ * Run validation on active hosted profiles that haven't been validated in 7+ days.
439
+ * Also checks pending DNS verifications.
440
+ */
441
+ async function runHostedProfileMaintenance(maxProfiles = 100, delayBetweenMs = 500) {
442
+ const startTime = Date.now();
443
+ const result = {
444
+ success: true,
445
+ profilesValidated: 0,
446
+ profilesFailed: 0,
447
+ verificationsChecked: 0,
448
+ verificationsConfirmed: 0,
449
+ errors: [],
450
+ durationMs: 0,
451
+ };
452
+ try {
453
+ // 1. Re-validate active profiles needing validation
454
+ const profilesToValidate = await (0, hosted_profiles_js_1.getProfilesNeedingValidation)(maxProfiles);
455
+ console.log(`[Cron] Found ${profilesToValidate.length} hosted profiles needing validation`);
456
+ for (const profile of profilesToValidate) {
457
+ try {
458
+ await (0, hosted_profiles_js_1.validateHostedProfile)(profile.id);
459
+ result.profilesValidated++;
460
+ }
461
+ catch (error) {
462
+ result.profilesFailed++;
463
+ result.errors.push({
464
+ profileId: profile.id,
465
+ error: error instanceof Error ? error.message : 'Unknown error',
466
+ });
467
+ }
468
+ if (delayBetweenMs > 0) {
469
+ await sleep(delayBetweenMs);
470
+ }
471
+ }
472
+ // 2. Check pending verifications
473
+ const pendingVerifications = await (0, hosted_profiles_js_1.getProfilesPendingVerification)(50);
474
+ console.log(`[Cron] Found ${pendingVerifications.length} profiles pending DNS verification`);
475
+ for (const profile of pendingVerifications) {
476
+ result.verificationsChecked++;
477
+ try {
478
+ const check = await (0, hosted_profiles_js_1.checkDnsVerification)(profile.id);
479
+ if (check.verified) {
480
+ result.verificationsConfirmed++;
481
+ console.log(`[Cron] DNS verified for ${profile.domain}`);
482
+ }
483
+ }
484
+ catch (error) {
485
+ result.errors.push({
486
+ profileId: profile.id,
487
+ error: error instanceof Error ? error.message : 'DNS check failed',
488
+ });
489
+ }
490
+ if (delayBetweenMs > 0) {
491
+ await sleep(delayBetweenMs);
492
+ }
493
+ }
494
+ result.success = result.profilesFailed === 0;
495
+ }
496
+ catch (error) {
497
+ result.success = false;
498
+ result.errors.push({
499
+ profileId: 'system',
500
+ error: error instanceof Error ? error.message : 'Unknown error',
501
+ });
502
+ console.error('[Cron] Hosted profile maintenance failed:', error);
503
+ }
504
+ result.durationMs = Date.now() - startTime;
505
+ console.log(`[Cron] Hosted profile maintenance: ${result.profilesValidated} validated, ${result.verificationsConfirmed}/${result.verificationsChecked} DNS verified in ${result.durationMs}ms`);
506
+ return result;
507
+ }
508
+ /**
509
+ * Expire trials that have passed their currentPeriodEnd date.
510
+ *
511
+ * Downgrades users from trialing/starter → canceled/free.
512
+ * Sends a "trial expired" email with upgrade CTA.
513
+ *
514
+ * Should be run daily via cron job (same schedule as trial-emails).
515
+ */
516
+ async function runExpireTrials() {
517
+ const startTime = Date.now();
518
+ const result = {
519
+ success: true,
520
+ expired: 0,
521
+ emailsSent: 0,
522
+ emailsFailed: 0,
523
+ errors: [],
524
+ durationMs: 0,
525
+ };
526
+ const dashboardBaseUrl = process.env.DASHBOARD_URL || 'https://ucptools.dev/dashboard';
527
+ try {
528
+ const db = (0, index_js_1.getDb)();
529
+ const now = new Date();
530
+ // Find all trialing subscriptions where currentPeriodEnd has passed
531
+ const expiredTrials = await db
532
+ .select({
533
+ userId: schema_js_1.subscriptions.userId,
534
+ currentPeriodEnd: schema_js_1.subscriptions.currentPeriodEnd,
535
+ userEmail: schema_js_1.users.email,
536
+ userName: schema_js_1.users.name,
537
+ })
538
+ .from(schema_js_1.subscriptions)
539
+ .innerJoin(schema_js_1.users, (0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, schema_js_1.users.id))
540
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.status, 'trialing'), (0, drizzle_orm_1.lt)(schema_js_1.subscriptions.currentPeriodEnd, now)));
541
+ console.log(`[Cron] Found ${expiredTrials.length} expired trials to downgrade`);
542
+ for (const trial of expiredTrials) {
543
+ try {
544
+ // Expire trial — keep tier so monitoring continues, set status to expired
545
+ await db
546
+ .update(schema_js_1.subscriptions)
547
+ .set({
548
+ status: 'expired',
549
+ updatedAt: new Date(),
550
+ })
551
+ .where((0, drizzle_orm_1.eq)(schema_js_1.subscriptions.userId, trial.userId));
552
+ result.expired++;
553
+ console.log(`[Cron] Expired trial for user ${trial.userId} (${trial.userEmail})`);
554
+ // Get domain count for email personalization
555
+ const domainCount = await db
556
+ .select({ id: schema_js_1.monitoredDomains.id })
557
+ .from(schema_js_1.monitoredDomains)
558
+ .where((0, drizzle_orm_1.eq)(schema_js_1.monitoredDomains.userId, trial.userId))
559
+ .then((rows) => rows.length);
560
+ // Send trial expired email
561
+ try {
562
+ const emailResult = await (0, email_js_1.sendTrialExpiredEmail)({
563
+ to: {
564
+ email: trial.userEmail,
565
+ name: trial.userName || undefined,
566
+ },
567
+ dashboardUrl: dashboardBaseUrl,
568
+ domainsAdded: domainCount,
569
+ });
570
+ if (emailResult.success) {
571
+ result.emailsSent++;
572
+ console.log(`[Cron] Trial expired email sent to ${trial.userEmail}`);
573
+ }
574
+ else {
575
+ result.emailsFailed++;
576
+ result.errors.push({
577
+ userId: trial.userId,
578
+ error: `Email failed: ${emailResult.error}`,
579
+ });
580
+ }
581
+ }
582
+ catch (emailError) {
583
+ result.emailsFailed++;
584
+ result.errors.push({
585
+ userId: trial.userId,
586
+ error: `Email error: ${emailError instanceof Error ? emailError.message : 'Unknown'}`,
587
+ });
588
+ }
589
+ }
590
+ catch (error) {
591
+ result.errors.push({
592
+ userId: trial.userId,
593
+ error: error instanceof Error ? error.message : 'Unknown error',
594
+ });
595
+ console.error(`[Cron] Failed to expire trial for ${trial.userId}:`, error);
596
+ }
597
+ await sleep(100);
598
+ }
599
+ result.success = result.errors.length === 0;
600
+ }
601
+ catch (error) {
602
+ result.success = false;
603
+ result.errors.push({
604
+ userId: 'system',
605
+ error: error instanceof Error ? error.message : 'Unknown error',
606
+ });
607
+ console.error('[Cron] Trial expiration failed:', error);
608
+ }
609
+ result.durationMs = Date.now() - startTime;
610
+ console.log(`[Cron] Trial expiration completed: ${result.expired} expired, ${result.emailsSent} emails sent in ${result.durationMs}ms`);
611
+ return result;
612
+ }
613
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/services/cron.ts"],"names":[],"mappings":"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"}