@we8/cms 0.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 (304) hide show
  1. package/README.md +78 -0
  2. package/dist/auth/auth.d.ts +87 -0
  3. package/dist/auth/auth.d.ts.map +1 -0
  4. package/dist/auth/auth.js +90 -0
  5. package/dist/auth/auth.js.map +1 -0
  6. package/dist/auth/routes.admin.d.ts +22 -0
  7. package/dist/auth/routes.admin.d.ts.map +1 -0
  8. package/dist/auth/routes.admin.js +106 -0
  9. package/dist/auth/routes.admin.js.map +1 -0
  10. package/dist/auth/schema.d.ts +1395 -0
  11. package/dist/auth/schema.d.ts.map +1 -0
  12. package/dist/auth/schema.js +76 -0
  13. package/dist/auth/schema.js.map +1 -0
  14. package/dist/env.d.ts +64 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +48 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/index.d.ts +22 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +170 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/keys/middleware.d.ts +54 -0
  23. package/dist/keys/middleware.d.ts.map +1 -0
  24. package/dist/keys/middleware.js +84 -0
  25. package/dist/keys/middleware.js.map +1 -0
  26. package/dist/keys/routes.admin.d.ts +16 -0
  27. package/dist/keys/routes.admin.d.ts.map +1 -0
  28. package/dist/keys/routes.admin.js +34 -0
  29. package/dist/keys/routes.admin.js.map +1 -0
  30. package/dist/keys/service.d.ts +36 -0
  31. package/dist/keys/service.d.ts.map +1 -0
  32. package/dist/keys/service.js +120 -0
  33. package/dist/keys/service.js.map +1 -0
  34. package/dist/lib/bots.d.ts +24 -0
  35. package/dist/lib/bots.d.ts.map +1 -0
  36. package/dist/lib/bots.js +79 -0
  37. package/dist/lib/bots.js.map +1 -0
  38. package/dist/lib/email.d.ts +62 -0
  39. package/dist/lib/email.d.ts.map +1 -0
  40. package/dist/lib/email.js +64 -0
  41. package/dist/lib/email.js.map +1 -0
  42. package/dist/lib/errors.d.ts +12 -0
  43. package/dist/lib/errors.d.ts.map +1 -0
  44. package/dist/lib/errors.js +23 -0
  45. package/dist/lib/errors.js.map +1 -0
  46. package/dist/lib/notify.d.ts +20 -0
  47. package/dist/lib/notify.d.ts.map +1 -0
  48. package/dist/lib/notify.js +60 -0
  49. package/dist/lib/notify.js.map +1 -0
  50. package/dist/lib/retention.d.ts +15 -0
  51. package/dist/lib/retention.d.ts.map +1 -0
  52. package/dist/lib/retention.js +40 -0
  53. package/dist/lib/retention.js.map +1 -0
  54. package/dist/lib/sanitize.d.ts +14 -0
  55. package/dist/lib/sanitize.d.ts.map +1 -0
  56. package/dist/lib/sanitize.js +145 -0
  57. package/dist/lib/sanitize.js.map +1 -0
  58. package/dist/lib/turnstile.d.ts +7 -0
  59. package/dist/lib/turnstile.d.ts.map +1 -0
  60. package/dist/lib/turnstile.js +32 -0
  61. package/dist/lib/turnstile.js.map +1 -0
  62. package/dist/lib/validate.d.ts +11 -0
  63. package/dist/lib/validate.d.ts.map +1 -0
  64. package/dist/lib/validate.js +22 -0
  65. package/dist/lib/validate.js.map +1 -0
  66. package/dist/lib/word-count.d.ts +7 -0
  67. package/dist/lib/word-count.d.ts.map +1 -0
  68. package/dist/lib/word-count.js +14 -0
  69. package/dist/lib/word-count.js.map +1 -0
  70. package/dist/middleware/auth.d.ts +46 -0
  71. package/dist/middleware/auth.d.ts.map +1 -0
  72. package/dist/middleware/auth.js +60 -0
  73. package/dist/middleware/auth.js.map +1 -0
  74. package/dist/middleware/cors.d.ts +33 -0
  75. package/dist/middleware/cors.d.ts.map +1 -0
  76. package/dist/middleware/cors.js +55 -0
  77. package/dist/middleware/cors.js.map +1 -0
  78. package/dist/middleware/module-gate.d.ts +11 -0
  79. package/dist/middleware/module-gate.d.ts.map +1 -0
  80. package/dist/middleware/module-gate.js +18 -0
  81. package/dist/middleware/module-gate.js.map +1 -0
  82. package/dist/middleware/rate-limit.d.ts +13 -0
  83. package/dist/middleware/rate-limit.d.ts.map +1 -0
  84. package/dist/middleware/rate-limit.js +30 -0
  85. package/dist/middleware/rate-limit.js.map +1 -0
  86. package/dist/middleware/request-id.d.ts +8 -0
  87. package/dist/middleware/request-id.d.ts.map +1 -0
  88. package/dist/middleware/request-id.js +11 -0
  89. package/dist/middleware/request-id.js.map +1 -0
  90. package/dist/modules/aeo/checks.d.ts +41 -0
  91. package/dist/modules/aeo/checks.d.ts.map +1 -0
  92. package/dist/modules/aeo/checks.js +127 -0
  93. package/dist/modules/aeo/checks.js.map +1 -0
  94. package/dist/modules/aeo/llms.d.ts +24 -0
  95. package/dist/modules/aeo/llms.d.ts.map +1 -0
  96. package/dist/modules/aeo/llms.js +92 -0
  97. package/dist/modules/aeo/llms.js.map +1 -0
  98. package/dist/modules/aeo/routes.admin.d.ts +12 -0
  99. package/dist/modules/aeo/routes.admin.d.ts.map +1 -0
  100. package/dist/modules/aeo/routes.admin.js +37 -0
  101. package/dist/modules/aeo/routes.admin.js.map +1 -0
  102. package/dist/modules/analytics/db.d.ts +24 -0
  103. package/dist/modules/analytics/db.d.ts.map +1 -0
  104. package/dist/modules/analytics/db.js +24 -0
  105. package/dist/modules/analytics/db.js.map +1 -0
  106. package/dist/modules/analytics/routes.admin.d.ts +6 -0
  107. package/dist/modules/analytics/routes.admin.d.ts.map +1 -0
  108. package/dist/modules/analytics/routes.admin.js +21 -0
  109. package/dist/modules/analytics/routes.admin.js.map +1 -0
  110. package/dist/modules/analytics/routes.public.d.ts +6 -0
  111. package/dist/modules/analytics/routes.public.d.ts.map +1 -0
  112. package/dist/modules/analytics/routes.public.js +33 -0
  113. package/dist/modules/analytics/routes.public.js.map +1 -0
  114. package/dist/modules/analytics/service.d.ts +16 -0
  115. package/dist/modules/analytics/service.d.ts.map +1 -0
  116. package/dist/modules/analytics/service.js +148 -0
  117. package/dist/modules/analytics/service.js.map +1 -0
  118. package/dist/modules/authors/routes.admin.d.ts +6 -0
  119. package/dist/modules/authors/routes.admin.d.ts.map +1 -0
  120. package/dist/modules/authors/routes.admin.js +29 -0
  121. package/dist/modules/authors/routes.admin.js.map +1 -0
  122. package/dist/modules/authors/routes.public.d.ts +6 -0
  123. package/dist/modules/authors/routes.public.d.ts.map +1 -0
  124. package/dist/modules/authors/routes.public.js +11 -0
  125. package/dist/modules/authors/routes.public.js.map +1 -0
  126. package/dist/modules/authors/service.d.ts +26 -0
  127. package/dist/modules/authors/service.d.ts.map +1 -0
  128. package/dist/modules/authors/service.js +116 -0
  129. package/dist/modules/authors/service.js.map +1 -0
  130. package/dist/modules/content/db.d.ts +127 -0
  131. package/dist/modules/content/db.d.ts.map +1 -0
  132. package/dist/modules/content/db.js +203 -0
  133. package/dist/modules/content/db.js.map +1 -0
  134. package/dist/modules/content/publish.d.ts +38 -0
  135. package/dist/modules/content/publish.d.ts.map +1 -0
  136. package/dist/modules/content/publish.js +184 -0
  137. package/dist/modules/content/publish.js.map +1 -0
  138. package/dist/modules/content/routes.admin.d.ts +8 -0
  139. package/dist/modules/content/routes.admin.d.ts.map +1 -0
  140. package/dist/modules/content/routes.admin.js +122 -0
  141. package/dist/modules/content/routes.admin.js.map +1 -0
  142. package/dist/modules/content/routes.public.d.ts +6 -0
  143. package/dist/modules/content/routes.public.d.ts.map +1 -0
  144. package/dist/modules/content/routes.public.js +56 -0
  145. package/dist/modules/content/routes.public.js.map +1 -0
  146. package/dist/modules/content/service.d.ts +137 -0
  147. package/dist/modules/content/service.d.ts.map +1 -0
  148. package/dist/modules/content/service.js +348 -0
  149. package/dist/modules/content/service.js.map +1 -0
  150. package/dist/modules/forms/db.d.ts +42 -0
  151. package/dist/modules/forms/db.d.ts.map +1 -0
  152. package/dist/modules/forms/db.js +62 -0
  153. package/dist/modules/forms/db.js.map +1 -0
  154. package/dist/modules/forms/forms-routes.admin.d.ts +6 -0
  155. package/dist/modules/forms/forms-routes.admin.d.ts.map +1 -0
  156. package/dist/modules/forms/forms-routes.admin.js +37 -0
  157. package/dist/modules/forms/forms-routes.admin.js.map +1 -0
  158. package/dist/modules/forms/forms-service.d.ts +18 -0
  159. package/dist/modules/forms/forms-service.d.ts.map +1 -0
  160. package/dist/modules/forms/forms-service.js +121 -0
  161. package/dist/modules/forms/forms-service.js.map +1 -0
  162. package/dist/modules/forms/routes.public.d.ts +6 -0
  163. package/dist/modules/forms/routes.public.d.ts.map +1 -0
  164. package/dist/modules/forms/routes.public.js +41 -0
  165. package/dist/modules/forms/routes.public.js.map +1 -0
  166. package/dist/modules/forms/submissions-routes.admin.d.ts +6 -0
  167. package/dist/modules/forms/submissions-routes.admin.d.ts.map +1 -0
  168. package/dist/modules/forms/submissions-routes.admin.js +46 -0
  169. package/dist/modules/forms/submissions-routes.admin.js.map +1 -0
  170. package/dist/modules/forms/submissions-service.d.ts +45 -0
  171. package/dist/modules/forms/submissions-service.d.ts.map +1 -0
  172. package/dist/modules/forms/submissions-service.js +174 -0
  173. package/dist/modules/forms/submissions-service.js.map +1 -0
  174. package/dist/modules/media/db.d.ts +15 -0
  175. package/dist/modules/media/db.d.ts.map +1 -0
  176. package/dist/modules/media/db.js +24 -0
  177. package/dist/modules/media/db.js.map +1 -0
  178. package/dist/modules/media/routes.admin.d.ts +6 -0
  179. package/dist/modules/media/routes.admin.d.ts.map +1 -0
  180. package/dist/modules/media/routes.admin.js +30 -0
  181. package/dist/modules/media/routes.admin.js.map +1 -0
  182. package/dist/modules/media/routes.public.d.ts +6 -0
  183. package/dist/modules/media/routes.public.d.ts.map +1 -0
  184. package/dist/modules/media/routes.public.js +35 -0
  185. package/dist/modules/media/routes.public.js.map +1 -0
  186. package/dist/modules/media/service.d.ts +32 -0
  187. package/dist/modules/media/service.d.ts.map +1 -0
  188. package/dist/modules/media/service.js +99 -0
  189. package/dist/modules/media/service.js.map +1 -0
  190. package/dist/modules/openapi/spec.d.ts +21 -0
  191. package/dist/modules/openapi/spec.d.ts.map +1 -0
  192. package/dist/modules/openapi/spec.js +468 -0
  193. package/dist/modules/openapi/spec.js.map +1 -0
  194. package/dist/modules/seo/jsonld.d.ts +25 -0
  195. package/dist/modules/seo/jsonld.d.ts.map +1 -0
  196. package/dist/modules/seo/jsonld.js +67 -0
  197. package/dist/modules/seo/jsonld.js.map +1 -0
  198. package/dist/modules/seo/routes.public.d.ts +6 -0
  199. package/dist/modules/seo/routes.public.d.ts.map +1 -0
  200. package/dist/modules/seo/routes.public.js +39 -0
  201. package/dist/modules/seo/routes.public.js.map +1 -0
  202. package/dist/modules/seo/sitemap.d.ts +3 -0
  203. package/dist/modules/seo/sitemap.d.ts.map +1 -0
  204. package/dist/modules/seo/sitemap.js +39 -0
  205. package/dist/modules/seo/sitemap.js.map +1 -0
  206. package/dist/modules/settings/routes.admin.d.ts +12 -0
  207. package/dist/modules/settings/routes.admin.d.ts.map +1 -0
  208. package/dist/modules/settings/routes.admin.js +27 -0
  209. package/dist/modules/settings/routes.admin.js.map +1 -0
  210. package/dist/modules/site-documents/routes.admin.d.ts +10 -0
  211. package/dist/modules/site-documents/routes.admin.d.ts.map +1 -0
  212. package/dist/modules/site-documents/routes.admin.js +29 -0
  213. package/dist/modules/site-documents/routes.admin.js.map +1 -0
  214. package/dist/modules/site-documents/routes.public.d.ts +6 -0
  215. package/dist/modules/site-documents/routes.public.d.ts.map +1 -0
  216. package/dist/modules/site-documents/routes.public.js +16 -0
  217. package/dist/modules/site-documents/routes.public.js.map +1 -0
  218. package/dist/modules/site-documents/service.d.ts +11 -0
  219. package/dist/modules/site-documents/service.d.ts.map +1 -0
  220. package/dist/modules/site-documents/service.js +42 -0
  221. package/dist/modules/site-documents/service.js.map +1 -0
  222. package/dist/modules/webhooks/dispatch.d.ts +14 -0
  223. package/dist/modules/webhooks/dispatch.d.ts.map +1 -0
  224. package/dist/modules/webhooks/dispatch.js +84 -0
  225. package/dist/modules/webhooks/dispatch.js.map +1 -0
  226. package/dist/shared/constants.d.ts +79 -0
  227. package/dist/shared/constants.d.ts.map +1 -0
  228. package/dist/shared/constants.js +89 -0
  229. package/dist/shared/constants.js.map +1 -0
  230. package/dist/shared/envelope.d.ts +37 -0
  231. package/dist/shared/envelope.d.ts.map +1 -0
  232. package/dist/shared/envelope.js +46 -0
  233. package/dist/shared/envelope.js.map +1 -0
  234. package/dist/shared/hash.d.ts +2 -0
  235. package/dist/shared/hash.d.ts.map +1 -0
  236. package/dist/shared/hash.js +8 -0
  237. package/dist/shared/hash.js.map +1 -0
  238. package/dist/shared/index.d.ts +13 -0
  239. package/dist/shared/index.d.ts.map +1 -0
  240. package/dist/shared/index.js +13 -0
  241. package/dist/shared/index.js.map +1 -0
  242. package/dist/shared/schemas/aeo.d.ts +182 -0
  243. package/dist/shared/schemas/aeo.d.ts.map +1 -0
  244. package/dist/shared/schemas/aeo.js +43 -0
  245. package/dist/shared/schemas/aeo.js.map +1 -0
  246. package/dist/shared/schemas/analytics.d.ts +277 -0
  247. package/dist/shared/schemas/analytics.d.ts.map +1 -0
  248. package/dist/shared/schemas/analytics.js +74 -0
  249. package/dist/shared/schemas/analytics.js.map +1 -0
  250. package/dist/shared/schemas/api-key.d.ts +77 -0
  251. package/dist/shared/schemas/api-key.d.ts.map +1 -0
  252. package/dist/shared/schemas/api-key.js +27 -0
  253. package/dist/shared/schemas/api-key.js.map +1 -0
  254. package/dist/shared/schemas/author.d.ts +147 -0
  255. package/dist/shared/schemas/author.d.ts.map +1 -0
  256. package/dist/shared/schemas/author.js +27 -0
  257. package/dist/shared/schemas/author.js.map +1 -0
  258. package/dist/shared/schemas/form.d.ts +341 -0
  259. package/dist/shared/schemas/form.d.ts.map +1 -0
  260. package/dist/shared/schemas/form.js +117 -0
  261. package/dist/shared/schemas/form.js.map +1 -0
  262. package/dist/shared/schemas/index.d.ts +12 -0
  263. package/dist/shared/schemas/index.d.ts.map +1 -0
  264. package/dist/shared/schemas/index.js +12 -0
  265. package/dist/shared/schemas/index.js.map +1 -0
  266. package/dist/shared/schemas/media.d.ts +42 -0
  267. package/dist/shared/schemas/media.d.ts.map +1 -0
  268. package/dist/shared/schemas/media.js +16 -0
  269. package/dist/shared/schemas/media.js.map +1 -0
  270. package/dist/shared/schemas/pagination.d.ts +34 -0
  271. package/dist/shared/schemas/pagination.d.ts.map +1 -0
  272. package/dist/shared/schemas/pagination.js +21 -0
  273. package/dist/shared/schemas/pagination.js.map +1 -0
  274. package/dist/shared/schemas/post.d.ts +862 -0
  275. package/dist/shared/schemas/post.d.ts.map +1 -0
  276. package/dist/shared/schemas/post.js +187 -0
  277. package/dist/shared/schemas/post.js.map +1 -0
  278. package/dist/shared/schemas/settings.d.ts +839 -0
  279. package/dist/shared/schemas/settings.d.ts.map +1 -0
  280. package/dist/shared/schemas/settings.js +202 -0
  281. package/dist/shared/schemas/settings.js.map +1 -0
  282. package/dist/shared/schemas/site-document.d.ts +38 -0
  283. package/dist/shared/schemas/site-document.d.ts.map +1 -0
  284. package/dist/shared/schemas/site-document.js +21 -0
  285. package/dist/shared/schemas/site-document.js.map +1 -0
  286. package/dist/shared/schemas/webhook.d.ts +39 -0
  287. package/dist/shared/schemas/webhook.d.ts.map +1 -0
  288. package/dist/shared/schemas/webhook.js +20 -0
  289. package/dist/shared/schemas/webhook.js.map +1 -0
  290. package/dist/spa.d.ts +9 -0
  291. package/dist/spa.d.ts.map +1 -0
  292. package/dist/spa.js +57 -0
  293. package/dist/spa.js.map +1 -0
  294. package/migrations/0001_settings.sql +39 -0
  295. package/migrations/0002_content.sql +135 -0
  296. package/migrations/0003_forms.sql +35 -0
  297. package/migrations/0004_analytics.sql +42 -0
  298. package/migrations/0005_media.sql +17 -0
  299. package/migrations/0006_site_documents.sql +18 -0
  300. package/migrations/0007_auth.sql +81 -0
  301. package/migrations/0008_api_keys.sql +20 -0
  302. package/package.json +68 -0
  303. package/scripts/bundle-admin.mjs +54 -0
  304. package/seed/local.sql +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/shared/envelope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,WAAW;IACX,UAAU;IACV,cAAc;IACd,mBAAmB;IACnB,UAAU;CACF,CAAC;AAIX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;IACb,YAAY,EAAE,GAAG;IACjB,iBAAiB,EAAE,GAAG;IACtB,QAAQ,EAAE,GAAG;CAC+B,CAAC;AAY/C,MAAM,UAAU,EAAE,CAAmB,IAAO;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAe,EAAE,KAAa;IAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,IAAI,CAAmB,QAAqB;IAC1D,OAAO,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,KAAK,CAAmB,QAAqB;IAC3D,OAAO,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function sha256Hex(input: string): Promise<string>;
2
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/shared/hash.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D"}
@@ -0,0 +1,8 @@
1
+ export async function sha256Hex(input) {
2
+ const data = new TextEncoder().encode(input);
3
+ const digest = await crypto.subtle.digest('SHA-256', data);
4
+ return Array.from(new Uint8Array(digest))
5
+ .map((byte) => byte.toString(16).padStart(2, '0'))
6
+ .join('');
7
+ }
8
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/shared/hash.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The self-contained kernel this package carries instead of depending on a
3
+ * shared library: the response envelope, the SHA-256 helper, the platform
4
+ * vocabularies, and the zod schemas that define the wire contract. It is a
5
+ * copy of managed we8's `@we8/shared`, minus everything tenancy-shaped (the
6
+ * internal HMAC helpers and the control-plane schemas), plus the additions
7
+ * 0.1 makes for AEO and for keys validated inside this worker.
8
+ */
9
+ export * from './envelope.js';
10
+ export * from './constants.js';
11
+ export * from './hash.js';
12
+ export * from './schemas/index.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The self-contained kernel this package carries instead of depending on a
3
+ * shared library: the response envelope, the SHA-256 helper, the platform
4
+ * vocabularies, and the zod schemas that define the wire contract. It is a
5
+ * copy of managed we8's `@we8/shared`, minus everything tenancy-shaped (the
6
+ * internal HMAC helpers and the control-plane schemas), plus the additions
7
+ * 0.1 makes for AEO and for keys validated inside this worker.
8
+ */
9
+ export * from './envelope.js';
10
+ export * from './constants.js';
11
+ export * from './hash.js';
12
+ export * from './schemas/index.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,182 @@
1
+ import { z } from 'zod';
2
+ export declare const aeoFindingSchema: z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>;
3
+ export declare const userAgentClassSchema: z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>;
4
+ /**
5
+ * One piece of content and everything the check found missing on it. `findings`
6
+ * is empty when the content passes; the admin renders the empty case as a pass
7
+ * rather than hiding the row, so a clean site still shows its coverage.
8
+ */
9
+ export declare const aeoContentCheckSchema: z.ZodObject<{
10
+ id: z.ZodString;
11
+ slug: z.ZodString;
12
+ title: z.ZodString;
13
+ type: z.ZodEnum<["blog", "article", "news", "research", "whitepaper", "case-study"]>;
14
+ status: z.ZodEnum<["draft", "published", "archived"]>;
15
+ findings: z.ZodArray<z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>, "many">;
16
+ }, "strip", z.ZodTypeAny, {
17
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
18
+ status: "draft" | "published" | "archived";
19
+ slug: string;
20
+ id: string;
21
+ title: string;
22
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
23
+ }, {
24
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
25
+ status: "draft" | "published" | "archived";
26
+ slug: string;
27
+ id: string;
28
+ title: string;
29
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
30
+ }>;
31
+ /** The same check applied to a site document, which has a kind instead of a slug. */
32
+ export declare const aeoDocumentCheckSchema: z.ZodObject<{
33
+ kind: z.ZodEnum<["design-md", "llms-txt"]>;
34
+ findings: z.ZodArray<z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>, "many">;
35
+ }, "strip", z.ZodTypeAny, {
36
+ kind: "design-md" | "llms-txt";
37
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
38
+ }, {
39
+ kind: "design-md" | "llms-txt";
40
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
41
+ }>;
42
+ export declare const aeoReportSchema: z.ZodObject<{
43
+ posts: z.ZodArray<z.ZodObject<{
44
+ id: z.ZodString;
45
+ slug: z.ZodString;
46
+ title: z.ZodString;
47
+ type: z.ZodEnum<["blog", "article", "news", "research", "whitepaper", "case-study"]>;
48
+ status: z.ZodEnum<["draft", "published", "archived"]>;
49
+ findings: z.ZodArray<z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>, "many">;
50
+ }, "strip", z.ZodTypeAny, {
51
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
52
+ status: "draft" | "published" | "archived";
53
+ slug: string;
54
+ id: string;
55
+ title: string;
56
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
57
+ }, {
58
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
59
+ status: "draft" | "published" | "archived";
60
+ slug: string;
61
+ id: string;
62
+ title: string;
63
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
64
+ }>, "many">;
65
+ documents: z.ZodArray<z.ZodObject<{
66
+ kind: z.ZodEnum<["design-md", "llms-txt"]>;
67
+ findings: z.ZodArray<z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>, "many">;
68
+ }, "strip", z.ZodTypeAny, {
69
+ kind: "design-md" | "llms-txt";
70
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
71
+ }, {
72
+ kind: "design-md" | "llms-txt";
73
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
74
+ }>, "many">;
75
+ /** How many pieces of content carry each finding, for the admin's summary strip. */
76
+ totals: z.ZodRecord<z.ZodEnum<["missing_description", "missing_answer_summary", "missing_question_heading", "missing_json_ld", "not_in_sitemap"]>, z.ZodNumber>;
77
+ checkedAt: z.ZodString;
78
+ }, "strip", z.ZodTypeAny, {
79
+ posts: {
80
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
81
+ status: "draft" | "published" | "archived";
82
+ slug: string;
83
+ id: string;
84
+ title: string;
85
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
86
+ }[];
87
+ documents: {
88
+ kind: "design-md" | "llms-txt";
89
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
90
+ }[];
91
+ totals: Partial<Record<"missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap", number>>;
92
+ checkedAt: string;
93
+ }, {
94
+ posts: {
95
+ type: "blog" | "article" | "news" | "research" | "whitepaper" | "case-study";
96
+ status: "draft" | "published" | "archived";
97
+ slug: string;
98
+ id: string;
99
+ title: string;
100
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
101
+ }[];
102
+ documents: {
103
+ kind: "design-md" | "llms-txt";
104
+ findings: ("missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap")[];
105
+ }[];
106
+ totals: Partial<Record<"missing_description" | "missing_answer_summary" | "missing_question_heading" | "missing_json_ld" | "not_in_sitemap", number>>;
107
+ checkedAt: string;
108
+ }>;
109
+ /** Crawler activity, read straight from the visit log's user-agent class. */
110
+ export declare const aeoCrawlerStatsSchema: z.ZodObject<{
111
+ byClass: z.ZodArray<z.ZodObject<{
112
+ userAgentClass: z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>;
113
+ count: z.ZodNumber;
114
+ }, "strip", z.ZodTypeAny, {
115
+ count: number;
116
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
117
+ }, {
118
+ count: number;
119
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
120
+ }>, "many">;
121
+ topCrawlers: z.ZodArray<z.ZodObject<{
122
+ botName: z.ZodString;
123
+ userAgentClass: z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>;
124
+ count: z.ZodNumber;
125
+ lastSeenAt: z.ZodString;
126
+ }, "strip", z.ZodTypeAny, {
127
+ count: number;
128
+ botName: string;
129
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
130
+ lastSeenAt: string;
131
+ }, {
132
+ count: number;
133
+ botName: string;
134
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
135
+ lastSeenAt: string;
136
+ }>, "many">;
137
+ daily: z.ZodArray<z.ZodObject<{
138
+ date: z.ZodString;
139
+ count: z.ZodNumber;
140
+ }, "strip", z.ZodTypeAny, {
141
+ date: string;
142
+ count: number;
143
+ }, {
144
+ date: string;
145
+ count: number;
146
+ }>, "many">;
147
+ }, "strip", z.ZodTypeAny, {
148
+ daily: {
149
+ date: string;
150
+ count: number;
151
+ }[];
152
+ byClass: {
153
+ count: number;
154
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
155
+ }[];
156
+ topCrawlers: {
157
+ count: number;
158
+ botName: string;
159
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
160
+ lastSeenAt: string;
161
+ }[];
162
+ }, {
163
+ daily: {
164
+ date: string;
165
+ count: number;
166
+ }[];
167
+ byClass: {
168
+ count: number;
169
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
170
+ }[];
171
+ topCrawlers: {
172
+ count: number;
173
+ botName: string;
174
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
175
+ lastSeenAt: string;
176
+ }[];
177
+ }>;
178
+ export type AeoContentCheck = z.infer<typeof aeoContentCheckSchema>;
179
+ export type AeoDocumentCheck = z.infer<typeof aeoDocumentCheckSchema>;
180
+ export type AeoReport = z.infer<typeof aeoReportSchema>;
181
+ export type AeoCrawlerStats = z.infer<typeof aeoCrawlerStatsSchema>;
182
+ //# sourceMappingURL=aeo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aeo.d.ts","sourceRoot":"","sources":["../../../src/shared/schemas/aeo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB,+HAAuB,CAAC;AACrD,eAAO,MAAM,oBAAoB,oGAA6B,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAOhC,CAAC;AAEH,qFAAqF;AACrF,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG1B,oFAAoF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpF,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ import { AEO_FINDINGS, USER_AGENT_CLASSES } from '../constants.js';
3
+ import { postStatusSchema, postTypeSchema } from './post.js';
4
+ import { siteDocumentKindSchema } from './site-document.js';
5
+ export const aeoFindingSchema = z.enum(AEO_FINDINGS);
6
+ export const userAgentClassSchema = z.enum(USER_AGENT_CLASSES);
7
+ /**
8
+ * One piece of content and everything the check found missing on it. `findings`
9
+ * is empty when the content passes; the admin renders the empty case as a pass
10
+ * rather than hiding the row, so a clean site still shows its coverage.
11
+ */
12
+ export const aeoContentCheckSchema = z.object({
13
+ id: z.string(),
14
+ slug: z.string(),
15
+ title: z.string(),
16
+ type: postTypeSchema,
17
+ status: postStatusSchema,
18
+ findings: z.array(aeoFindingSchema),
19
+ });
20
+ /** The same check applied to a site document, which has a kind instead of a slug. */
21
+ export const aeoDocumentCheckSchema = z.object({
22
+ kind: siteDocumentKindSchema,
23
+ findings: z.array(aeoFindingSchema),
24
+ });
25
+ export const aeoReportSchema = z.object({
26
+ posts: z.array(aeoContentCheckSchema),
27
+ documents: z.array(aeoDocumentCheckSchema),
28
+ /** How many pieces of content carry each finding, for the admin's summary strip. */
29
+ totals: z.record(aeoFindingSchema, z.number().int()),
30
+ checkedAt: z.string(),
31
+ });
32
+ /** Crawler activity, read straight from the visit log's user-agent class. */
33
+ export const aeoCrawlerStatsSchema = z.object({
34
+ byClass: z.array(z.object({ userAgentClass: userAgentClassSchema, count: z.number().int() })),
35
+ topCrawlers: z.array(z.object({
36
+ botName: z.string(),
37
+ userAgentClass: userAgentClassSchema,
38
+ count: z.number().int(),
39
+ lastSeenAt: z.string(),
40
+ })),
41
+ daily: z.array(z.object({ date: z.string(), count: z.number().int() })),
42
+ });
43
+ //# sourceMappingURL=aeo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aeo.js","sourceRoot":"","sources":["../../../src/shared/schemas/aeo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACpC,CAAC,CAAC;AAEH,qFAAqF;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,sBAAsB;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;IAC1C,oFAAoF;IACpF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7F,WAAW,EAAE,CAAC,CAAC,KAAK,CAClB,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CACH;IACD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;CACxE,CAAC,CAAC"}
@@ -0,0 +1,277 @@
1
+ import { z } from 'zod';
2
+ export declare const consentDecisionSchema: z.ZodEnum<["accepted", "partial", "declined"]>;
3
+ export declare const visitEventInputSchema: z.ZodObject<{
4
+ pathname: z.ZodString;
5
+ referrer: z.ZodOptional<z.ZodString>;
6
+ sessionId: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ pathname: string;
9
+ sessionId: string;
10
+ referrer?: string | undefined;
11
+ }, {
12
+ pathname: string;
13
+ sessionId: string;
14
+ referrer?: string | undefined;
15
+ }>;
16
+ export declare const consentEventInputSchema: z.ZodObject<{
17
+ sessionId: z.ZodString;
18
+ decision: z.ZodEnum<["accepted", "partial", "declined"]>;
19
+ analytics: z.ZodBoolean;
20
+ performance: z.ZodBoolean;
21
+ }, "strip", z.ZodTypeAny, {
22
+ sessionId: string;
23
+ decision: "accepted" | "partial" | "declined";
24
+ analytics: boolean;
25
+ performance: boolean;
26
+ }, {
27
+ sessionId: string;
28
+ decision: "accepted" | "partial" | "declined";
29
+ analytics: boolean;
30
+ performance: boolean;
31
+ }>;
32
+ export declare const pageVisitRecordSchema: z.ZodObject<{
33
+ id: z.ZodString;
34
+ visitedAt: z.ZodString;
35
+ pathname: z.ZodString;
36
+ referrer: z.ZodNullable<z.ZodString>;
37
+ country: z.ZodNullable<z.ZodString>;
38
+ isBot: z.ZodBoolean;
39
+ botName: z.ZodNullable<z.ZodString>;
40
+ botScore: z.ZodNullable<z.ZodNumber>;
41
+ /** AEO (0.1): which kind of agent this was, for crawler attribution. */
42
+ userAgentClass: z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>;
43
+ sessionId: z.ZodNullable<z.ZodString>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ id: string;
46
+ referrer: string | null;
47
+ pathname: string;
48
+ sessionId: string | null;
49
+ visitedAt: string;
50
+ country: string | null;
51
+ isBot: boolean;
52
+ botName: string | null;
53
+ botScore: number | null;
54
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
55
+ }, {
56
+ id: string;
57
+ referrer: string | null;
58
+ pathname: string;
59
+ sessionId: string | null;
60
+ visitedAt: string;
61
+ country: string | null;
62
+ isBot: boolean;
63
+ botName: string | null;
64
+ botScore: number | null;
65
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
66
+ }>;
67
+ export declare const visitListQuerySchema: z.ZodObject<{
68
+ page: z.ZodDefault<z.ZodNumber>;
69
+ pageSize: z.ZodDefault<z.ZodNumber>;
70
+ } & {
71
+ isBot: z.ZodOptional<z.ZodEffects<z.ZodEnum<["true", "false", "1", "0"]>, boolean, "0" | "true" | "false" | "1">>;
72
+ userAgentClass: z.ZodOptional<z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>>;
73
+ pathname: z.ZodOptional<z.ZodString>;
74
+ country: z.ZodOptional<z.ZodString>;
75
+ search: z.ZodOptional<z.ZodString>;
76
+ }, "strip", z.ZodTypeAny, {
77
+ page: number;
78
+ pageSize: number;
79
+ search?: string | undefined;
80
+ pathname?: string | undefined;
81
+ country?: string | undefined;
82
+ isBot?: boolean | undefined;
83
+ userAgentClass?: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot" | undefined;
84
+ }, {
85
+ page?: number | undefined;
86
+ pageSize?: number | undefined;
87
+ search?: string | undefined;
88
+ pathname?: string | undefined;
89
+ country?: string | undefined;
90
+ isBot?: "0" | "true" | "false" | "1" | undefined;
91
+ userAgentClass?: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot" | undefined;
92
+ }>;
93
+ /**
94
+ * The caps differ per endpoint: visit stats allow up to 90 days, consent stats
95
+ * up to 365. Each route passes its own cap.
96
+ */
97
+ export declare function statsQuerySchema(maxDays: number): z.ZodObject<{
98
+ days: z.ZodDefault<z.ZodNumber>;
99
+ }, "strip", z.ZodTypeAny, {
100
+ days: number;
101
+ }, {
102
+ days?: number | undefined;
103
+ }>;
104
+ export declare const VISIT_STATS_MAX_DAYS = 90;
105
+ export declare const CONSENT_STATS_MAX_DAYS = 365;
106
+ export declare const visitStatsSchema: z.ZodObject<{
107
+ total: z.ZodNumber;
108
+ humans: z.ZodNumber;
109
+ bots: z.ZodNumber;
110
+ topPages: z.ZodArray<z.ZodObject<{
111
+ pathname: z.ZodString;
112
+ count: z.ZodNumber;
113
+ }, "strip", z.ZodTypeAny, {
114
+ count: number;
115
+ pathname: string;
116
+ }, {
117
+ count: number;
118
+ pathname: string;
119
+ }>, "many">;
120
+ topCountries: z.ZodArray<z.ZodObject<{
121
+ country: z.ZodString;
122
+ count: z.ZodNumber;
123
+ }, "strip", z.ZodTypeAny, {
124
+ count: number;
125
+ country: string;
126
+ }, {
127
+ count: number;
128
+ country: string;
129
+ }>, "many">;
130
+ topReferrers: z.ZodArray<z.ZodObject<{
131
+ referrer: z.ZodString;
132
+ count: z.ZodNumber;
133
+ }, "strip", z.ZodTypeAny, {
134
+ referrer: string;
135
+ count: number;
136
+ }, {
137
+ referrer: string;
138
+ count: number;
139
+ }>, "many">;
140
+ topBots: z.ZodArray<z.ZodObject<{
141
+ botName: z.ZodString;
142
+ count: z.ZodNumber;
143
+ }, "strip", z.ZodTypeAny, {
144
+ count: number;
145
+ botName: string;
146
+ }, {
147
+ count: number;
148
+ botName: string;
149
+ }>, "many">;
150
+ /** AEO (0.1): the same totals split by agent class, so crawler traffic reads separately. */
151
+ byUserAgentClass: z.ZodArray<z.ZodObject<{
152
+ userAgentClass: z.ZodEnum<["human", "ai-crawler", "search-crawler", "social-crawler", "seo-crawler", "other-bot"]>;
153
+ count: z.ZodNumber;
154
+ }, "strip", z.ZodTypeAny, {
155
+ count: number;
156
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
157
+ }, {
158
+ count: number;
159
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
160
+ }>, "many">;
161
+ daily: z.ZodArray<z.ZodObject<{
162
+ date: z.ZodString;
163
+ count: z.ZodNumber;
164
+ }, "strip", z.ZodTypeAny, {
165
+ date: string;
166
+ count: number;
167
+ }, {
168
+ date: string;
169
+ count: number;
170
+ }>, "many">;
171
+ }, "strip", z.ZodTypeAny, {
172
+ total: number;
173
+ daily: {
174
+ date: string;
175
+ count: number;
176
+ }[];
177
+ humans: number;
178
+ bots: number;
179
+ topPages: {
180
+ count: number;
181
+ pathname: string;
182
+ }[];
183
+ topCountries: {
184
+ count: number;
185
+ country: string;
186
+ }[];
187
+ topReferrers: {
188
+ referrer: string;
189
+ count: number;
190
+ }[];
191
+ topBots: {
192
+ count: number;
193
+ botName: string;
194
+ }[];
195
+ byUserAgentClass: {
196
+ count: number;
197
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
198
+ }[];
199
+ }, {
200
+ total: number;
201
+ daily: {
202
+ date: string;
203
+ count: number;
204
+ }[];
205
+ humans: number;
206
+ bots: number;
207
+ topPages: {
208
+ count: number;
209
+ pathname: string;
210
+ }[];
211
+ topCountries: {
212
+ count: number;
213
+ country: string;
214
+ }[];
215
+ topReferrers: {
216
+ referrer: string;
217
+ count: number;
218
+ }[];
219
+ topBots: {
220
+ count: number;
221
+ botName: string;
222
+ }[];
223
+ byUserAgentClass: {
224
+ count: number;
225
+ userAgentClass: "human" | "ai-crawler" | "search-crawler" | "social-crawler" | "seo-crawler" | "other-bot";
226
+ }[];
227
+ }>;
228
+ export declare const consentStatsSchema: z.ZodObject<{
229
+ accepted: z.ZodNumber;
230
+ partial: z.ZodNumber;
231
+ declined: z.ZodNumber;
232
+ analyticsOptIn: z.ZodNumber;
233
+ performanceOptIn: z.ZodNumber;
234
+ daily: z.ZodArray<z.ZodObject<{
235
+ date: z.ZodString;
236
+ decision: z.ZodEnum<["accepted", "partial", "declined"]>;
237
+ count: z.ZodNumber;
238
+ }, "strip", z.ZodTypeAny, {
239
+ date: string;
240
+ count: number;
241
+ decision: "accepted" | "partial" | "declined";
242
+ }, {
243
+ date: string;
244
+ count: number;
245
+ decision: "accepted" | "partial" | "declined";
246
+ }>, "many">;
247
+ }, "strip", z.ZodTypeAny, {
248
+ accepted: number;
249
+ partial: number;
250
+ declined: number;
251
+ daily: {
252
+ date: string;
253
+ count: number;
254
+ decision: "accepted" | "partial" | "declined";
255
+ }[];
256
+ analyticsOptIn: number;
257
+ performanceOptIn: number;
258
+ }, {
259
+ accepted: number;
260
+ partial: number;
261
+ declined: number;
262
+ daily: {
263
+ date: string;
264
+ count: number;
265
+ decision: "accepted" | "partial" | "declined";
266
+ }[];
267
+ analyticsOptIn: number;
268
+ performanceOptIn: number;
269
+ }>;
270
+ export type VisitEventInput = z.infer<typeof visitEventInputSchema>;
271
+ export type ConsentEventInput = z.infer<typeof consentEventInputSchema>;
272
+ export type PageVisitRecord = z.infer<typeof pageVisitRecordSchema>;
273
+ export type VisitListQuery = z.infer<typeof visitListQuerySchema>;
274
+ export type StatsQuery = z.infer<ReturnType<typeof statsQuerySchema>>;
275
+ export type VisitStats = z.infer<typeof visitStatsSchema>;
276
+ export type ConsentStats = z.infer<typeof consentStatsSchema>;
277
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/shared/schemas/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,qBAAqB,gDAA4B,CAAC;AAU/D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;IAShC,wEAAwE;;;;;;;;;;;;;;;;;;;;;;;;;EAGxE,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM;;;;;;GAI/C;AAED,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAQ3B,4FAA4F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK5F,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import { CONSENT_DECISIONS, USER_AGENT_CLASSES } from '../constants.js';
3
+ import { paginationQuerySchema, queryBoolSchema } from './pagination.js';
4
+ export const consentDecisionSchema = z.enum(CONSENT_DECISIONS);
5
+ /**
6
+ * Duplicated from schemas/aeo.ts on purpose: analytics owns the column, AEO
7
+ * owns the report, and a cross-import between the two schema files for one
8
+ * enum would tie the visit record to the AEO surface. Both derive from the
9
+ * same USER_AGENT_CLASSES constant, so they cannot drift.
10
+ */
11
+ const visitUserAgentClassSchema = z.enum(USER_AGENT_CLASSES);
12
+ export const visitEventInputSchema = z.object({
13
+ pathname: z.string().min(1).max(2000),
14
+ referrer: z.string().max(2000).optional(),
15
+ sessionId: z.string().min(1).max(200),
16
+ });
17
+ export const consentEventInputSchema = z.object({
18
+ sessionId: z.string().min(1).max(200),
19
+ decision: consentDecisionSchema,
20
+ analytics: z.boolean(),
21
+ performance: z.boolean(),
22
+ });
23
+ export const pageVisitRecordSchema = z.object({
24
+ id: z.string(),
25
+ visitedAt: z.string(),
26
+ pathname: z.string(),
27
+ referrer: z.string().nullable(),
28
+ country: z.string().nullable(),
29
+ isBot: z.boolean(),
30
+ botName: z.string().nullable(),
31
+ botScore: z.number().int().nullable(),
32
+ /** AEO (0.1): which kind of agent this was, for crawler attribution. */
33
+ userAgentClass: visitUserAgentClassSchema,
34
+ sessionId: z.string().nullable(),
35
+ });
36
+ export const visitListQuerySchema = paginationQuerySchema.extend({
37
+ isBot: queryBoolSchema.optional(),
38
+ userAgentClass: visitUserAgentClassSchema.optional(),
39
+ pathname: z.string().optional(),
40
+ country: z.string().optional(),
41
+ search: z.string().optional(),
42
+ });
43
+ /**
44
+ * The caps differ per endpoint: visit stats allow up to 90 days, consent stats
45
+ * up to 365. Each route passes its own cap.
46
+ */
47
+ export function statsQuerySchema(maxDays) {
48
+ return z.object({
49
+ days: z.coerce.number().int().min(1).max(maxDays).default(30),
50
+ });
51
+ }
52
+ export const VISIT_STATS_MAX_DAYS = 90;
53
+ export const CONSENT_STATS_MAX_DAYS = 365;
54
+ export const visitStatsSchema = z.object({
55
+ total: z.number().int(),
56
+ humans: z.number().int(),
57
+ bots: z.number().int(),
58
+ topPages: z.array(z.object({ pathname: z.string(), count: z.number().int() })),
59
+ topCountries: z.array(z.object({ country: z.string(), count: z.number().int() })),
60
+ topReferrers: z.array(z.object({ referrer: z.string(), count: z.number().int() })),
61
+ topBots: z.array(z.object({ botName: z.string(), count: z.number().int() })),
62
+ /** AEO (0.1): the same totals split by agent class, so crawler traffic reads separately. */
63
+ byUserAgentClass: z.array(z.object({ userAgentClass: visitUserAgentClassSchema, count: z.number().int() })),
64
+ daily: z.array(z.object({ date: z.string(), count: z.number().int() })),
65
+ });
66
+ export const consentStatsSchema = z.object({
67
+ accepted: z.number().int(),
68
+ partial: z.number().int(),
69
+ declined: z.number().int(),
70
+ analyticsOptIn: z.number().int(),
71
+ performanceOptIn: z.number().int(),
72
+ daily: z.array(z.object({ date: z.string(), decision: consentDecisionSchema, count: z.number().int() })),
73
+ });
74
+ //# sourceMappingURL=analytics.js.map