@actuate-media/cms-core 0.10.4 → 0.11.1

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 (418) hide show
  1. package/dist/__tests__/actions/document-crud.test.js +5 -1
  2. package/dist/__tests__/actions/document-crud.test.js.map +1 -1
  3. package/dist/__tests__/api/admin-contracts.test.js +1 -0
  4. package/dist/__tests__/api/admin-contracts.test.js.map +1 -1
  5. package/dist/__tests__/api/public-globals.test.js +8 -4
  6. package/dist/__tests__/api/public-globals.test.js.map +1 -1
  7. package/dist/__tests__/auth/password.test.js.map +1 -1
  8. package/dist/__tests__/auth/session.test.js.map +1 -1
  9. package/dist/__tests__/codegen/generate-types.test.js.map +1 -1
  10. package/dist/__tests__/next.test.js +1 -3
  11. package/dist/__tests__/next.test.js.map +1 -1
  12. package/dist/__tests__/scheduling/scheduling.test.js +28 -4
  13. package/dist/__tests__/scheduling/scheduling.test.js.map +1 -1
  14. package/dist/__tests__/security/access.test.js +1 -1
  15. package/dist/__tests__/security/access.test.js.map +1 -1
  16. package/dist/__tests__/security/audit.test.d.ts +2 -0
  17. package/dist/__tests__/security/audit.test.d.ts.map +1 -0
  18. package/dist/__tests__/security/audit.test.js +50 -0
  19. package/dist/__tests__/security/audit.test.js.map +1 -0
  20. package/dist/__tests__/security/client-ip.test.d.ts +2 -0
  21. package/dist/__tests__/security/client-ip.test.d.ts.map +1 -0
  22. package/dist/__tests__/security/client-ip.test.js +37 -0
  23. package/dist/__tests__/security/client-ip.test.js.map +1 -0
  24. package/dist/__tests__/security/csrf.test.js.map +1 -1
  25. package/dist/__tests__/security/ip-allowlist.test.d.ts +2 -0
  26. package/dist/__tests__/security/ip-allowlist.test.d.ts.map +1 -0
  27. package/dist/__tests__/security/ip-allowlist.test.js +40 -0
  28. package/dist/__tests__/security/ip-allowlist.test.js.map +1 -0
  29. package/dist/__tests__/security/rate-limit.test.js.map +1 -1
  30. package/dist/__tests__/security/reauth.test.js.map +1 -1
  31. package/dist/__tests__/security/redact.test.d.ts +2 -0
  32. package/dist/__tests__/security/redact.test.d.ts.map +1 -0
  33. package/dist/__tests__/security/redact.test.js +31 -0
  34. package/dist/__tests__/security/redact.test.js.map +1 -0
  35. package/dist/__tests__/security/sanitize.test.js.map +1 -1
  36. package/dist/__tests__/security/secret-storage.test.d.ts +2 -0
  37. package/dist/__tests__/security/secret-storage.test.d.ts.map +1 -0
  38. package/dist/__tests__/security/secret-storage.test.js +42 -0
  39. package/dist/__tests__/security/secret-storage.test.js.map +1 -0
  40. package/dist/__tests__/security/upload-magic.test.d.ts +2 -0
  41. package/dist/__tests__/security/upload-magic.test.d.ts.map +1 -0
  42. package/dist/__tests__/security/upload-magic.test.js +55 -0
  43. package/dist/__tests__/security/upload-magic.test.js.map +1 -0
  44. package/dist/__tests__/server-site.test.d.ts +2 -0
  45. package/dist/__tests__/server-site.test.d.ts.map +1 -0
  46. package/dist/__tests__/server-site.test.js +123 -0
  47. package/dist/__tests__/server-site.test.js.map +1 -0
  48. package/dist/__tests__/site.test.js +5 -2
  49. package/dist/__tests__/site.test.js.map +1 -1
  50. package/dist/__tests__/webhooks/webhooks.test.js.map +1 -1
  51. package/dist/a11y/index.d.ts +1 -1
  52. package/dist/a11y/index.d.ts.map +1 -1
  53. package/dist/a11y/index.js +23 -20
  54. package/dist/a11y/index.js.map +1 -1
  55. package/dist/actions.d.ts +1 -1
  56. package/dist/actions.d.ts.map +1 -1
  57. package/dist/actions.js +211 -68
  58. package/dist/actions.js.map +1 -1
  59. package/dist/api/handler-factory.d.ts.map +1 -1
  60. package/dist/api/handler-factory.js +76 -14
  61. package/dist/api/handler-factory.js.map +1 -1
  62. package/dist/api/handlers.d.ts.map +1 -1
  63. package/dist/api/handlers.js +952 -220
  64. package/dist/api/handlers.js.map +1 -1
  65. package/dist/api/index.d.ts.map +1 -1
  66. package/dist/api/index.js.map +1 -1
  67. package/dist/api/openapi.d.ts.map +1 -1
  68. package/dist/api/openapi.js +182 -23
  69. package/dist/api/openapi.js.map +1 -1
  70. package/dist/api/router.d.ts +6 -6
  71. package/dist/api/router.d.ts.map +1 -1
  72. package/dist/api/router.js +27 -10
  73. package/dist/api/router.js.map +1 -1
  74. package/dist/auth/index.d.ts +12 -12
  75. package/dist/auth/index.d.ts.map +1 -1
  76. package/dist/auth/index.js +9 -9
  77. package/dist/auth/index.js.map +1 -1
  78. package/dist/auth/mfa-pending.d.ts +24 -0
  79. package/dist/auth/mfa-pending.d.ts.map +1 -0
  80. package/dist/auth/mfa-pending.js +38 -0
  81. package/dist/auth/mfa-pending.js.map +1 -0
  82. package/dist/auth/oauth.d.ts +25 -3
  83. package/dist/auth/oauth.d.ts.map +1 -1
  84. package/dist/auth/oauth.js +118 -21
  85. package/dist/auth/oauth.js.map +1 -1
  86. package/dist/auth/password.d.ts +1 -1
  87. package/dist/auth/password.d.ts.map +1 -1
  88. package/dist/auth/password.js +14 -14
  89. package/dist/auth/password.js.map +1 -1
  90. package/dist/auth/providers/github.d.ts +1 -1
  91. package/dist/auth/providers/github.d.ts.map +1 -1
  92. package/dist/auth/providers/github.js +2 -2
  93. package/dist/auth/providers/github.js.map +1 -1
  94. package/dist/auth/providers/google.d.ts +1 -1
  95. package/dist/auth/providers/google.d.ts.map +1 -1
  96. package/dist/auth/providers/google.js +2 -2
  97. package/dist/auth/providers/google.js.map +1 -1
  98. package/dist/auth/providers/microsoft.d.ts +1 -1
  99. package/dist/auth/providers/microsoft.d.ts.map +1 -1
  100. package/dist/auth/providers/microsoft.js +2 -2
  101. package/dist/auth/providers/microsoft.js.map +1 -1
  102. package/dist/auth/reset-email.d.ts.map +1 -1
  103. package/dist/auth/reset-email.js +1 -1
  104. package/dist/auth/reset-email.js.map +1 -1
  105. package/dist/auth/reset.d.ts.map +1 -1
  106. package/dist/auth/reset.js +34 -10
  107. package/dist/auth/reset.js.map +1 -1
  108. package/dist/auth/session.d.ts +9 -2
  109. package/dist/auth/session.d.ts.map +1 -1
  110. package/dist/auth/session.js +26 -8
  111. package/dist/auth/session.js.map +1 -1
  112. package/dist/auth/totp.d.ts.map +1 -1
  113. package/dist/auth/totp.js +8 -2
  114. package/dist/auth/totp.js.map +1 -1
  115. package/dist/backup/index.d.ts +2 -2
  116. package/dist/backup/index.d.ts.map +1 -1
  117. package/dist/backup/index.js +5 -5
  118. package/dist/backup/index.js.map +1 -1
  119. package/dist/cache/index.d.ts +1 -1
  120. package/dist/cache/index.d.ts.map +1 -1
  121. package/dist/cache/index.js +1 -1
  122. package/dist/cache/index.js.map +1 -1
  123. package/dist/client.d.ts +1 -1
  124. package/dist/client.d.ts.map +1 -1
  125. package/dist/client.js +8 -8
  126. package/dist/client.js.map +1 -1
  127. package/dist/codegen/index.d.ts +1 -1
  128. package/dist/codegen/index.d.ts.map +1 -1
  129. package/dist/codegen/index.js +170 -174
  130. package/dist/codegen/index.js.map +1 -1
  131. package/dist/collections/index.d.ts +1 -1
  132. package/dist/collections/index.d.ts.map +1 -1
  133. package/dist/collections/index.js.map +1 -1
  134. package/dist/config/define.d.ts +2 -2
  135. package/dist/config/define.d.ts.map +1 -1
  136. package/dist/config/define.js +1 -1
  137. package/dist/config/define.js.map +1 -1
  138. package/dist/config/index.d.ts +3 -3
  139. package/dist/config/index.d.ts.map +1 -1
  140. package/dist/config/index.js +32 -18
  141. package/dist/config/index.js.map +1 -1
  142. package/dist/config/types.d.ts +26 -26
  143. package/dist/config/types.d.ts.map +1 -1
  144. package/dist/content/ai-api.d.ts.map +1 -1
  145. package/dist/content/ai-api.js +8 -2
  146. package/dist/content/ai-api.js.map +1 -1
  147. package/dist/content/content-graph.d.ts +1 -1
  148. package/dist/content/content-graph.d.ts.map +1 -1
  149. package/dist/content/content-graph.js +7 -7
  150. package/dist/content/content-graph.js.map +1 -1
  151. package/dist/content/extract.js +13 -13
  152. package/dist/content/extract.js.map +1 -1
  153. package/dist/content/index.d.ts +7 -7
  154. package/dist/content/index.d.ts.map +1 -1
  155. package/dist/content/index.js +4 -4
  156. package/dist/content/index.js.map +1 -1
  157. package/dist/content/structured-data.d.ts +3 -3
  158. package/dist/content/structured-data.d.ts.map +1 -1
  159. package/dist/content/structured-data.js +65 -67
  160. package/dist/content/structured-data.js.map +1 -1
  161. package/dist/db/adapters/mysql.d.ts.map +1 -1
  162. package/dist/db/adapters/mysql.js.map +1 -1
  163. package/dist/db/adapters/postgres.d.ts.map +1 -1
  164. package/dist/db/adapters/postgres.js.map +1 -1
  165. package/dist/db/adapters/sqlite.d.ts.map +1 -1
  166. package/dist/db/adapters/sqlite.js.map +1 -1
  167. package/dist/db/create-adapter.d.ts.map +1 -1
  168. package/dist/db/create-adapter.js.map +1 -1
  169. package/dist/db/index.d.ts +1 -1
  170. package/dist/db/index.d.ts.map +1 -1
  171. package/dist/db/index.js +1 -1
  172. package/dist/db/index.js.map +1 -1
  173. package/dist/db.d.ts +1 -1
  174. package/dist/db.d.ts.map +1 -1
  175. package/dist/db.js +1 -1
  176. package/dist/db.js.map +1 -1
  177. package/dist/fields/index.d.ts +2 -2
  178. package/dist/fields/index.d.ts.map +1 -1
  179. package/dist/fields/index.js +51 -47
  180. package/dist/fields/index.js.map +1 -1
  181. package/dist/forms/analytics.d.ts.map +1 -1
  182. package/dist/forms/analytics.js.map +1 -1
  183. package/dist/forms/attribution.d.ts.map +1 -1
  184. package/dist/forms/attribution.js +7 -2
  185. package/dist/forms/attribution.js.map +1 -1
  186. package/dist/forms/index.d.ts.map +1 -1
  187. package/dist/forms/index.js.map +1 -1
  188. package/dist/graphql/index.d.ts.map +1 -1
  189. package/dist/graphql/index.js.map +1 -1
  190. package/dist/graphql/resolvers.d.ts.map +1 -1
  191. package/dist/graphql/resolvers.js +17 -21
  192. package/dist/graphql/resolvers.js.map +1 -1
  193. package/dist/graphql/schema-builder.d.ts.map +1 -1
  194. package/dist/graphql/schema-builder.js.map +1 -1
  195. package/dist/health/index.d.ts +2 -2
  196. package/dist/health/index.d.ts.map +1 -1
  197. package/dist/health/index.js +9 -9
  198. package/dist/health/index.js.map +1 -1
  199. package/dist/i18n/index.d.ts +1 -1
  200. package/dist/i18n/index.d.ts.map +1 -1
  201. package/dist/i18n/index.js +2 -2
  202. package/dist/i18n/index.js.map +1 -1
  203. package/dist/index.d.ts +78 -76
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +44 -42
  206. package/dist/index.js.map +1 -1
  207. package/dist/media/index.d.ts +2 -2
  208. package/dist/media/index.d.ts.map +1 -1
  209. package/dist/media/index.js +1 -1
  210. package/dist/media/index.js.map +1 -1
  211. package/dist/media/optimize.d.ts.map +1 -1
  212. package/dist/media/optimize.js +7 -4
  213. package/dist/media/optimize.js.map +1 -1
  214. package/dist/middleware.d.ts.map +1 -1
  215. package/dist/middleware.js +21 -34
  216. package/dist/middleware.js.map +1 -1
  217. package/dist/multisite/index.d.ts.map +1 -1
  218. package/dist/multisite/index.js +4 -4
  219. package/dist/multisite/index.js.map +1 -1
  220. package/dist/next/preview.d.ts.map +1 -1
  221. package/dist/next/preview.js.map +1 -1
  222. package/dist/next.d.ts.map +1 -1
  223. package/dist/next.js +4 -5
  224. package/dist/next.js.map +1 -1
  225. package/dist/notifications/index.d.ts +1 -1
  226. package/dist/notifications/index.d.ts.map +1 -1
  227. package/dist/notifications/index.js +5 -5
  228. package/dist/notifications/index.js.map +1 -1
  229. package/dist/page-builder/__tests__/a11y-fix.test.js +1 -5
  230. package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -1
  231. package/dist/page-builder/__tests__/blocks.test.js +108 -1
  232. package/dist/page-builder/__tests__/blocks.test.js.map +1 -1
  233. package/dist/page-builder/__tests__/design-scorer.test.js +44 -11
  234. package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -1
  235. package/dist/page-builder/__tests__/schema.test.js +12 -12
  236. package/dist/page-builder/__tests__/schema.test.js.map +1 -1
  237. package/dist/page-builder/__tests__/seo-analyzer.test.js +27 -13
  238. package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -1
  239. package/dist/page-builder/ai-pipeline.d.ts.map +1 -1
  240. package/dist/page-builder/ai-pipeline.js +1 -3
  241. package/dist/page-builder/ai-pipeline.js.map +1 -1
  242. package/dist/page-builder/blocks.d.ts +18 -1
  243. package/dist/page-builder/blocks.d.ts.map +1 -1
  244. package/dist/page-builder/blocks.js +67 -11
  245. package/dist/page-builder/blocks.js.map +1 -1
  246. package/dist/page-builder/design-scorer.d.ts.map +1 -1
  247. package/dist/page-builder/design-scorer.js +249 -41
  248. package/dist/page-builder/design-scorer.js.map +1 -1
  249. package/dist/page-builder/index.d.ts +3 -3
  250. package/dist/page-builder/index.d.ts.map +1 -1
  251. package/dist/page-builder/index.js +2 -2
  252. package/dist/page-builder/index.js.map +1 -1
  253. package/dist/page-builder/seo-analyzer.d.ts.map +1 -1
  254. package/dist/page-builder/seo-analyzer.js +252 -56
  255. package/dist/page-builder/seo-analyzer.js.map +1 -1
  256. package/dist/page-builder/templates.d.ts.map +1 -1
  257. package/dist/page-builder/templates.js +45 -16
  258. package/dist/page-builder/templates.js.map +1 -1
  259. package/dist/page-builder/tree.d.ts.map +1 -1
  260. package/dist/page-builder/tree.js.map +1 -1
  261. package/dist/page-builder/validate.js.map +1 -1
  262. package/dist/presence/index.d.ts.map +1 -1
  263. package/dist/presence/index.js +2 -2
  264. package/dist/presence/index.js.map +1 -1
  265. package/dist/preview/index.d.ts.map +1 -1
  266. package/dist/preview/index.js.map +1 -1
  267. package/dist/privacy/index.d.ts +1 -1
  268. package/dist/privacy/index.d.ts.map +1 -1
  269. package/dist/privacy/index.js +3 -3
  270. package/dist/privacy/index.js.map +1 -1
  271. package/dist/relationships/index.d.ts.map +1 -1
  272. package/dist/relationships/index.js +1 -1
  273. package/dist/relationships/index.js.map +1 -1
  274. package/dist/scheduling/index.d.ts +2 -2
  275. package/dist/scheduling/index.d.ts.map +1 -1
  276. package/dist/scheduling/index.js +3 -1
  277. package/dist/scheduling/index.js.map +1 -1
  278. package/dist/search/index.d.ts.map +1 -1
  279. package/dist/search/index.js +1 -3
  280. package/dist/search/index.js.map +1 -1
  281. package/dist/security/access.d.ts +4 -4
  282. package/dist/security/access.d.ts.map +1 -1
  283. package/dist/security/access.js +11 -15
  284. package/dist/security/access.js.map +1 -1
  285. package/dist/security/anomaly-detection.d.ts.map +1 -1
  286. package/dist/security/anomaly-detection.js +5 -5
  287. package/dist/security/anomaly-detection.js.map +1 -1
  288. package/dist/security/api-key-enhanced.d.ts +2 -2
  289. package/dist/security/api-key-enhanced.d.ts.map +1 -1
  290. package/dist/security/api-key-enhanced.js +5 -5
  291. package/dist/security/api-key-enhanced.js.map +1 -1
  292. package/dist/security/audit.d.ts.map +1 -1
  293. package/dist/security/audit.js +8 -4
  294. package/dist/security/audit.js.map +1 -1
  295. package/dist/security/breach-check.js.map +1 -1
  296. package/dist/security/captcha.d.ts.map +1 -1
  297. package/dist/security/captcha.js.map +1 -1
  298. package/dist/security/client-ip.d.ts +33 -0
  299. package/dist/security/client-ip.d.ts.map +1 -0
  300. package/dist/security/client-ip.js +42 -0
  301. package/dist/security/client-ip.js.map +1 -0
  302. package/dist/security/cors.d.ts +1 -1
  303. package/dist/security/cors.d.ts.map +1 -1
  304. package/dist/security/cors.js +12 -12
  305. package/dist/security/cors.js.map +1 -1
  306. package/dist/security/csp-nonces.js +11 -11
  307. package/dist/security/csp-nonces.js.map +1 -1
  308. package/dist/security/csrf.js +2 -2
  309. package/dist/security/csrf.js.map +1 -1
  310. package/dist/security/encrypted-fields.d.ts.map +1 -1
  311. package/dist/security/encrypted-fields.js +7 -4
  312. package/dist/security/encrypted-fields.js.map +1 -1
  313. package/dist/security/headers.d.ts.map +1 -1
  314. package/dist/security/headers.js +12 -12
  315. package/dist/security/headers.js.map +1 -1
  316. package/dist/security/index.d.ts +39 -32
  317. package/dist/security/index.d.ts.map +1 -1
  318. package/dist/security/index.js +25 -20
  319. package/dist/security/index.js.map +1 -1
  320. package/dist/security/internal-keys.d.ts +15 -0
  321. package/dist/security/internal-keys.d.ts.map +1 -0
  322. package/dist/security/internal-keys.js +33 -0
  323. package/dist/security/internal-keys.js.map +1 -0
  324. package/dist/security/ip-allowlist.d.ts +13 -1
  325. package/dist/security/ip-allowlist.d.ts.map +1 -1
  326. package/dist/security/ip-allowlist.js +117 -11
  327. package/dist/security/ip-allowlist.js.map +1 -1
  328. package/dist/security/middleware.d.ts +2 -2
  329. package/dist/security/middleware.d.ts.map +1 -1
  330. package/dist/security/middleware.js +11 -11
  331. package/dist/security/middleware.js.map +1 -1
  332. package/dist/security/rate-limit.d.ts.map +1 -1
  333. package/dist/security/rate-limit.js +50 -18
  334. package/dist/security/rate-limit.js.map +1 -1
  335. package/dist/security/reauth.d.ts +1 -1
  336. package/dist/security/reauth.d.ts.map +1 -1
  337. package/dist/security/reauth.js.map +1 -1
  338. package/dist/security/redact.d.ts +12 -0
  339. package/dist/security/redact.d.ts.map +1 -0
  340. package/dist/security/redact.js +44 -0
  341. package/dist/security/redact.js.map +1 -0
  342. package/dist/security/safe-fetch.d.ts +35 -0
  343. package/dist/security/safe-fetch.d.ts.map +1 -0
  344. package/dist/security/safe-fetch.js +45 -0
  345. package/dist/security/safe-fetch.js.map +1 -0
  346. package/dist/security/sanitize.d.ts.map +1 -1
  347. package/dist/security/sanitize.js +40 -8
  348. package/dist/security/sanitize.js.map +1 -1
  349. package/dist/security/secret-storage.d.ts +22 -0
  350. package/dist/security/secret-storage.d.ts.map +1 -0
  351. package/dist/security/secret-storage.js +75 -0
  352. package/dist/security/secret-storage.js.map +1 -0
  353. package/dist/security/security-txt.d.ts.map +1 -1
  354. package/dist/security/security-txt.js +2 -2
  355. package/dist/security/security-txt.js.map +1 -1
  356. package/dist/security/session-limits.d.ts +1 -1
  357. package/dist/security/session-limits.d.ts.map +1 -1
  358. package/dist/security/session-limits.js +1 -1
  359. package/dist/security/session-limits.js.map +1 -1
  360. package/dist/security/upload.d.ts +23 -4
  361. package/dist/security/upload.d.ts.map +1 -1
  362. package/dist/security/upload.js +118 -23
  363. package/dist/security/upload.js.map +1 -1
  364. package/dist/security/webhook.d.ts.map +1 -1
  365. package/dist/security/webhook.js +12 -8
  366. package/dist/security/webhook.js.map +1 -1
  367. package/dist/seo/analysis.d.ts.map +1 -1
  368. package/dist/seo/analysis.js +25 -13
  369. package/dist/seo/analysis.js.map +1 -1
  370. package/dist/seo/index.d.ts +9 -9
  371. package/dist/seo/index.d.ts.map +1 -1
  372. package/dist/seo/index.js +4 -4
  373. package/dist/seo/index.js.map +1 -1
  374. package/dist/seo/llms-txt.js +1 -3
  375. package/dist/seo/llms-txt.js.map +1 -1
  376. package/dist/server-site.d.ts +54 -0
  377. package/dist/server-site.d.ts.map +1 -0
  378. package/dist/server-site.js +147 -0
  379. package/dist/server-site.js.map +1 -0
  380. package/dist/setup/index.d.ts.map +1 -1
  381. package/dist/setup/index.js.map +1 -1
  382. package/dist/site.d.ts.map +1 -1
  383. package/dist/site.js +26 -4
  384. package/dist/site.js.map +1 -1
  385. package/dist/storage/index.d.ts +20 -10
  386. package/dist/storage/index.d.ts.map +1 -1
  387. package/dist/storage/index.js +6 -3
  388. package/dist/storage/index.js.map +1 -1
  389. package/dist/templates/index.d.ts.map +1 -1
  390. package/dist/templates/index.js +3 -3
  391. package/dist/templates/index.js.map +1 -1
  392. package/dist/upgrade/changelog.d.ts +1 -1
  393. package/dist/upgrade/changelog.d.ts.map +1 -1
  394. package/dist/upgrade/changelog.js +12 -12
  395. package/dist/upgrade/changelog.js.map +1 -1
  396. package/dist/upgrade/index.d.ts +6 -6
  397. package/dist/upgrade/index.d.ts.map +1 -1
  398. package/dist/upgrade/index.js +3 -3
  399. package/dist/upgrade/index.js.map +1 -1
  400. package/dist/upgrade/upgrade-pr.d.ts.map +1 -1
  401. package/dist/upgrade/upgrade-pr.js +36 -36
  402. package/dist/upgrade/upgrade-pr.js.map +1 -1
  403. package/dist/upgrade/version-check.d.ts +1 -1
  404. package/dist/upgrade/version-check.d.ts.map +1 -1
  405. package/dist/upgrade/version-check.js +13 -13
  406. package/dist/upgrade/version-check.js.map +1 -1
  407. package/dist/webhooks/index.d.ts +1 -1
  408. package/dist/webhooks/index.d.ts.map +1 -1
  409. package/dist/webhooks/index.js +24 -13
  410. package/dist/webhooks/index.js.map +1 -1
  411. package/dist/workflow/index.d.ts.map +1 -1
  412. package/dist/workflow/index.js.map +1 -1
  413. package/dist/workflows/index.d.ts +1 -1
  414. package/dist/workflows/index.d.ts.map +1 -1
  415. package/dist/workflows/index.js +3 -3
  416. package/dist/workflows/index.js.map +1 -1
  417. package/package.json +1 -1
  418. package/prisma/seed.ts +31 -31
@@ -0,0 +1,45 @@
1
+ import { validateWebhookUrl } from './webhook.js';
2
+ export class SsrfBlockedError extends Error {
3
+ url;
4
+ reason;
5
+ constructor(url, reason) {
6
+ super(`SSRF blocked: ${reason} (url=${url})`);
7
+ this.name = 'SsrfBlockedError';
8
+ this.url = url;
9
+ this.reason = reason;
10
+ }
11
+ }
12
+ export async function safeFetch(url, options = {}) {
13
+ const { timeoutMs = 5000, followRedirects = false, maxRedirects = 3, ...init } = options;
14
+ let currentUrl = url;
15
+ let hops = 0;
16
+ while (true) {
17
+ const check = validateWebhookUrl(currentUrl);
18
+ if (!check.valid) {
19
+ throw new SsrfBlockedError(currentUrl, check.error ?? 'URL rejected by SSRF policy');
20
+ }
21
+ const response = await fetch(currentUrl, {
22
+ ...init,
23
+ redirect: 'manual',
24
+ signal: init.signal ?? AbortSignal.timeout(timeoutMs),
25
+ });
26
+ const isRedirect = response.status >= 300 && response.status < 400;
27
+ if (!isRedirect || !followRedirects) {
28
+ return response;
29
+ }
30
+ if (hops >= maxRedirects) {
31
+ throw new SsrfBlockedError(currentUrl, `exceeded ${maxRedirects} redirects`);
32
+ }
33
+ const location = response.headers.get('location');
34
+ if (!location)
35
+ return response;
36
+ try {
37
+ currentUrl = new URL(location, currentUrl).toString();
38
+ }
39
+ catch {
40
+ throw new SsrfBlockedError(location, 'invalid Location header');
41
+ }
42
+ hops += 1;
43
+ }
44
+ }
45
+ //# sourceMappingURL=safe-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-fetch.js","sourceRoot":"","sources":["../../src/security/safe-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AA+BjD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,GAAG,CAAQ;IACX,MAAM,CAAQ;IACvB,YAAY,GAAW,EAAE,MAAc;QACrC,KAAK,CAAC,iBAAiB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,UAA4B,EAAE;IACzE,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,eAAe,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IAExF,IAAI,UAAU,GAAG,GAAG,CAAA;IACpB,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;QAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAA;QACtF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YACvC,GAAG,IAAI;YACP,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACtD,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;QAClE,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,IAAI,IAAI,IAAI,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,YAAY,YAAY,YAAY,CAAC,CAAA;QAC9E,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAE9B,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,IAAI,CAAC,CAAA;IACX,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/security/sanitize.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,oBAAoB,UAKzB,CAAC;AAEF,QAAA,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAKnD,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAaR;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/security/sanitize.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,QAAA,MAAM,oBAAoB,UAqCzB,CAAA;AAED,QAAA,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAKnD,CAAA;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAa5E;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAA"}
@@ -1,15 +1,47 @@
1
1
  import sanitize from 'sanitize-html';
2
2
  const DEFAULT_ALLOWED_TAGS = [
3
- "p", "br", "b", "i", "em", "strong", "a", "ul", "ol", "li",
4
- "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "code", "pre",
5
- "img", "figure", "figcaption", "table", "thead", "tbody", "tr", "th", "td",
6
- "span", "div", "hr", "sub", "sup", "s", "u", "mark",
3
+ 'p',
4
+ 'br',
5
+ 'b',
6
+ 'i',
7
+ 'em',
8
+ 'strong',
9
+ 'a',
10
+ 'ul',
11
+ 'ol',
12
+ 'li',
13
+ 'h1',
14
+ 'h2',
15
+ 'h3',
16
+ 'h4',
17
+ 'h5',
18
+ 'h6',
19
+ 'blockquote',
20
+ 'code',
21
+ 'pre',
22
+ 'img',
23
+ 'figure',
24
+ 'figcaption',
25
+ 'table',
26
+ 'thead',
27
+ 'tbody',
28
+ 'tr',
29
+ 'th',
30
+ 'td',
31
+ 'span',
32
+ 'div',
33
+ 'hr',
34
+ 'sub',
35
+ 'sup',
36
+ 's',
37
+ 'u',
38
+ 'mark',
7
39
  ];
8
40
  const DEFAULT_ALLOWED_ATTRS = {
9
- a: ["href", "title", "target", "rel"],
10
- img: ["src", "alt", "title", "width", "height", "loading"],
11
- td: ["colspan", "rowspan"],
12
- th: ["colspan", "rowspan", "scope"],
41
+ a: ['href', 'title', 'target', 'rel'],
42
+ img: ['src', 'alt', 'title', 'width', 'height', 'loading'],
43
+ td: ['colspan', 'rowspan'],
44
+ th: ['colspan', 'rowspan', 'scope'],
13
45
  };
14
46
  /** Sanitize HTML content. Strips dangerous tags/attributes while preserving safe content. */
15
47
  export function sanitizeHtml(html, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/security/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAQrC,MAAM,oBAAoB,GAAG;IAC3B,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK;IAC/D,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC1E,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM;CACpD,CAAC;AAEF,MAAM,qBAAqB,GAA6B;IACtD,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;IACrC,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAC1D,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,6FAA6F;AAC7F,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAyB;IAEzB,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,WAAW,IAAI,oBAAoB,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,CAAC;IAElE,OAAO,QAAQ,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,KAAK;QACxB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/security/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAQpC,MAAM,oBAAoB,GAAG;IAC3B,GAAG;IACH,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,QAAQ;IACR,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,YAAY;IACZ,MAAM;IACN,KAAK;IACL,KAAK;IACL,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,OAAO;IACP,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,GAAG;IACH,GAAG;IACH,MAAM;CACP,CAAA;AAED,MAAM,qBAAqB,GAA6B;IACtD,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;IACrC,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAC1D,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;CACpC,CAAA;AAED,6FAA6F;AAC7F,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAyB;IAClE,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,WAAW,IAAI,oBAAoB,CAAA;IACzD,MAAM,KAAK,GAAG,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,CAAA;IAEjE,OAAO,QAAQ,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,KAAK;QACxB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAA;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1E,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Encrypt a value for storage. Returns the original value unchanged when no
3
+ * encryption key is configured (development convenience). Production deployments
4
+ * MUST set `CMS_ENCRYPTION_KEY` — see `security.mdc`.
5
+ */
6
+ export declare function encryptSecret(plaintext: string): Promise<string>;
7
+ /**
8
+ * Decrypt a value that was stored via `encryptSecret`. Plaintext values
9
+ * (written before encryption was enabled, or written by a deployment without
10
+ * the key) are returned unchanged.
11
+ */
12
+ export declare function decryptSecret(stored: string): Promise<string>;
13
+ /** True when the value is stored encrypted (and therefore needs decryption). */
14
+ export declare function isEncrypted(value: string): boolean;
15
+ /**
16
+ * Encrypt each string element in an array. Returns the array unchanged when
17
+ * encryption is disabled. Used for things like TOTP backup codes.
18
+ */
19
+ export declare function encryptStringArray(values: string[]): Promise<string[]>;
20
+ /** Decrypt each element in an array stored via `encryptStringArray`. */
21
+ export declare function decryptStringArray(values: string[]): Promise<string[]>;
22
+ //# sourceMappingURL=secret-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-storage.d.ts","sourceRoot":"","sources":["../../src/security/secret-storage.ts"],"names":[],"mappings":"AAiCA;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMtE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5E;AAED,wEAAwE;AACxE,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5E"}
@@ -0,0 +1,75 @@
1
+ import { encryptField, decryptField } from './encrypted-fields.js';
2
+ /**
3
+ * High-level helpers for storing per-user secrets (TOTP secret, OAuth tokens,
4
+ * webhook signing keys) at rest. Wraps the raw `encryptField`/`decryptField`
5
+ * primitives so callers don't have to plumb `CMS_ENCRYPTION_KEY` through every
6
+ * code path.
7
+ *
8
+ * Encrypted values are tagged with a version prefix so we can rotate keys or
9
+ * change the encoding without breaking existing rows. Plaintext values written
10
+ * before encryption was enabled are passed through unchanged on read so
11
+ * upgrades don't break existing data — call `migrateSecret()` when you want
12
+ * to opportunistically re-encrypt them on next access.
13
+ */
14
+ const PREFIX = 'enc:v1:';
15
+ function getKey() {
16
+ const key = process.env.CMS_ENCRYPTION_KEY;
17
+ if (!key)
18
+ return null;
19
+ // 32 bytes = 64 hex chars
20
+ if (key.length !== 64) {
21
+ console.warn('[actuate][crypto] CMS_ENCRYPTION_KEY must be 64 hex characters (32 bytes); got ' +
22
+ key.length +
23
+ '. Falling back to plaintext storage. Generate with: ' +
24
+ "node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"");
25
+ return null;
26
+ }
27
+ return key;
28
+ }
29
+ /**
30
+ * Encrypt a value for storage. Returns the original value unchanged when no
31
+ * encryption key is configured (development convenience). Production deployments
32
+ * MUST set `CMS_ENCRYPTION_KEY` — see `security.mdc`.
33
+ */
34
+ export async function encryptSecret(plaintext) {
35
+ if (!plaintext)
36
+ return plaintext;
37
+ const key = getKey();
38
+ if (!key)
39
+ return plaintext;
40
+ const ciphertext = await encryptField(plaintext, key);
41
+ return PREFIX + ciphertext;
42
+ }
43
+ /**
44
+ * Decrypt a value that was stored via `encryptSecret`. Plaintext values
45
+ * (written before encryption was enabled, or written by a deployment without
46
+ * the key) are returned unchanged.
47
+ */
48
+ export async function decryptSecret(stored) {
49
+ if (!stored)
50
+ return stored;
51
+ if (!stored.startsWith(PREFIX))
52
+ return stored;
53
+ const key = getKey();
54
+ if (!key) {
55
+ throw new Error('CMS_ENCRYPTION_KEY is required to decrypt this value but is not set. ' +
56
+ 'Configure the same key used at write time.');
57
+ }
58
+ return decryptField(stored.slice(PREFIX.length), key);
59
+ }
60
+ /** True when the value is stored encrypted (and therefore needs decryption). */
61
+ export function isEncrypted(value) {
62
+ return typeof value === 'string' && value.startsWith(PREFIX);
63
+ }
64
+ /**
65
+ * Encrypt each string element in an array. Returns the array unchanged when
66
+ * encryption is disabled. Used for things like TOTP backup codes.
67
+ */
68
+ export async function encryptStringArray(values) {
69
+ return Promise.all(values.map((v) => encryptSecret(v)));
70
+ }
71
+ /** Decrypt each element in an array stored via `encryptStringArray`. */
72
+ export async function decryptStringArray(values) {
73
+ return Promise.all(values.map((v) => decryptSecret(v)));
74
+ }
75
+ //# sourceMappingURL=secret-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-storage.js","sourceRoot":"","sources":["../../src/security/secret-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAElE;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB,SAAS,MAAM;IACb,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,0BAA0B;IAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CACV,iFAAiF;YAC/E,GAAG,CAAC,MAAM;YACV,sDAAsD;YACtD,4EAA4E,CAC/E,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,OAAO,MAAM,GAAG,UAAU,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,uEAAuE;YACrE,4CAA4C,CAC/C,CAAA;IACH,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;AACvD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAgB;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACzD,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAgB;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACzD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"security-txt.d.ts","sourceRoot":"","sources":["../../src/security/security-txt.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAerE"}
1
+ {"version":3,"file":"security-txt.d.ts","sourceRoot":"","sources":["../../src/security/security-txt.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,IAAI,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAerE"}
@@ -8,12 +8,12 @@ export function generateSecurityTxt(config) {
8
8
  if (config.acknowledgments)
9
9
  lines.push(`Acknowledgments: ${config.acknowledgments}`);
10
10
  if (config.preferredLanguages?.length) {
11
- lines.push(`Preferred-Languages: ${config.preferredLanguages.join(", ")}`);
11
+ lines.push(`Preferred-Languages: ${config.preferredLanguages.join(', ')}`);
12
12
  }
13
13
  if (config.canonical)
14
14
  lines.push(`Canonical: ${config.canonical}`);
15
15
  if (config.policy)
16
16
  lines.push(`Policy: ${config.policy}`);
17
- return lines.join("\n") + "\n";
17
+ return lines.join('\n') + '\n';
18
18
  }
19
19
  //# sourceMappingURL=security-txt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-txt.js","sourceRoot":"","sources":["../../src/security/security-txt.ts"],"names":[],"mappings":"AAUA,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEvD,IAAI,MAAM,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"security-txt.js","sourceRoot":"","sources":["../../src/security/security-txt.ts"],"names":[],"mappings":"AAUA,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACxC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAEtD,IAAI,MAAM,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACrE,IAAI,MAAM,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;IACpF,IAAI,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC"}
@@ -7,7 +7,7 @@ export interface SessionInfo {
7
7
  }
8
8
  export interface SessionLimitConfig {
9
9
  maxConcurrentSessions: number;
10
- strategy: "deny_new" | "revoke_oldest";
10
+ strategy: 'deny_new' | 'revoke_oldest';
11
11
  }
12
12
  /** Enforce concurrent session limits, returning sessions to revoke if any. */
13
13
  export declare function enforceSessionLimits(activeSessions: SessionInfo[], config: SessionLimitConfig): {
@@ -1 +1 @@
1
- {"version":3,"file":"session-limits.d.ts","sourceRoot":"","sources":["../../src/security/session-limits.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,GAAG,eAAe,CAAC;CACxC;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,WAAW,EAAE,EAC7B,MAAM,EAAE,kBAAkB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBlD"}
1
+ {"version":3,"file":"session-limits.d.ts","sourceRoot":"","sources":["../../src/security/session-limits.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,QAAQ,EAAE,UAAU,GAAG,eAAe,CAAA;CACvC;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,WAAW,EAAE,EAC7B,MAAM,EAAE,kBAAkB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAclD"}
@@ -3,7 +3,7 @@ export function enforceSessionLimits(activeSessions, config) {
3
3
  if (activeSessions.length < config.maxConcurrentSessions) {
4
4
  return { allowed: true, sessionsToRevoke: [] };
5
5
  }
6
- if (config.strategy === "deny_new") {
6
+ if (config.strategy === 'deny_new') {
7
7
  return { allowed: false, sessionsToRevoke: [] };
8
8
  }
9
9
  const sorted = [...activeSessions].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
@@ -1 +1 @@
1
- {"version":3,"file":"session-limits.js","sourceRoot":"","sources":["../../src/security/session-limits.ts"],"names":[],"mappings":"AAaA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAClC,cAA6B,EAC7B,MAA0B;IAE1B,IAAI,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CACxD,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"session-limits.js","sourceRoot":"","sources":["../../src/security/session-limits.ts"],"names":[],"mappings":"AAaA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAClC,cAA6B,EAC7B,MAA0B;IAE1B,IAAI,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAA;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAA;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAEhE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAA;AACtD,CAAC"}
@@ -5,9 +5,28 @@ export interface FileValidationResult {
5
5
  }
6
6
  declare const ALLOWED_IMAGE_TYPES: Set<string>;
7
7
  declare const ALLOWED_DOCUMENT_TYPES: Set<string>;
8
- /** Validate a file's MIME type against an allowlist. */
9
- export declare function validateMimeType(mimeType: string, allowedTypes?: Set<string>): FileValidationResult;
10
- /** Check a file's magic bytes to detect its true MIME type. */
11
- export declare function checkMagicBytes(buffer: Uint8Array): string | undefined;
8
+ /**
9
+ * Validate a file's declared MIME type against an allowlist.
10
+ *
11
+ * Accepts either an array (typical caller form) or a Set (legacy form).
12
+ * Returns a plain boolean to make call-sites read naturally:
13
+ *
14
+ * if (!validateMimeType(file.type, ALLOWED)) return badRequest(...)
15
+ */
16
+ export declare function validateMimeType(mimeType: string, allowedTypes?: ReadonlyArray<string> | ReadonlySet<string>): boolean;
17
+ /**
18
+ * Check a file's magic bytes against the declared mime type. Returns
19
+ * `{ valid: true, detectedMimeType }` when the bytes match the declared type
20
+ * (or when we have no signature to check), and `{ valid: false, error }`
21
+ * otherwise.
22
+ *
23
+ * For container formats (WebP, AVIF) we additionally inspect the inner
24
+ * sub-type — a generic RIFF header would otherwise let `.wav` files masquerade
25
+ * as `.webp` and bypass image-only checks.
26
+ *
27
+ * For SVG (which is XML, not a binary signature) we look for `<svg` near the
28
+ * start of the file. A leading XML declaration or BOM is allowed.
29
+ */
30
+ export declare function checkMagicBytes(input: ArrayBuffer | Uint8Array | Buffer, declaredMimeType: string): FileValidationResult;
12
31
  export { ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES };
13
32
  //# sourceMappingURL=upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/security/upload.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,QAAA,MAAM,mBAAmB,aAEvB,CAAC;AAEH,QAAA,MAAM,sBAAsB,aAI1B,CAAC;AAUH,wDAAwD;AACxD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,oBAAoB,CAMtB;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,SAAS,CAMpB;AAED,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/security/upload.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,QAAA,MAAM,mBAAmB,aAOvB,CAAA;AAEF,QAAA,MAAM,sBAAsB,aAM1B,CAAA;AAEF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GACzD,OAAO,CAOT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,EACxC,gBAAgB,EAAE,MAAM,GACvB,oBAAoB,CA6BtB;AAgED,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,CAAA"}
@@ -1,34 +1,129 @@
1
1
  const ALLOWED_IMAGE_TYPES = new Set([
2
- "image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml", "image/avif",
2
+ 'image/jpeg',
3
+ 'image/png',
4
+ 'image/gif',
5
+ 'image/webp',
6
+ 'image/svg+xml',
7
+ 'image/avif',
3
8
  ]);
4
9
  const ALLOWED_DOCUMENT_TYPES = new Set([
5
- "application/pdf", "text/plain", "text/csv",
6
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
7
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
10
+ 'application/pdf',
11
+ 'text/plain',
12
+ 'text/csv',
13
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
14
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
8
15
  ]);
9
- const MAGIC_BYTES = [
10
- { mime: "image/jpeg", bytes: [0xFF, 0xD8, 0xFF] },
11
- { mime: "image/png", bytes: [0x89, 0x50, 0x4E, 0x47] },
12
- { mime: "image/gif", bytes: [0x47, 0x49, 0x46] },
13
- { mime: "image/webp", bytes: [0x52, 0x49, 0x46, 0x46] },
14
- { mime: "application/pdf", bytes: [0x25, 0x50, 0x44, 0x46] },
15
- ];
16
- /** Validate a file's MIME type against an allowlist. */
16
+ /**
17
+ * Validate a file's declared MIME type against an allowlist.
18
+ *
19
+ * Accepts either an array (typical caller form) or a Set (legacy form).
20
+ * Returns a plain boolean to make call-sites read naturally:
21
+ *
22
+ * if (!validateMimeType(file.type, ALLOWED)) return badRequest(...)
23
+ */
17
24
  export function validateMimeType(mimeType, allowedTypes) {
18
- const allowed = allowedTypes ?? new Set([...ALLOWED_IMAGE_TYPES, ...ALLOWED_DOCUMENT_TYPES]);
19
- if (!allowed.has(mimeType)) {
20
- return { valid: false, error: `MIME type "${mimeType}" is not allowed` };
25
+ const allowed = allowedTypes
26
+ ? allowedTypes instanceof Set
27
+ ? allowedTypes
28
+ : new Set(allowedTypes)
29
+ : new Set([...ALLOWED_IMAGE_TYPES, ...ALLOWED_DOCUMENT_TYPES]);
30
+ return allowed.has(mimeType);
31
+ }
32
+ /**
33
+ * Check a file's magic bytes against the declared mime type. Returns
34
+ * `{ valid: true, detectedMimeType }` when the bytes match the declared type
35
+ * (or when we have no signature to check), and `{ valid: false, error }`
36
+ * otherwise.
37
+ *
38
+ * For container formats (WebP, AVIF) we additionally inspect the inner
39
+ * sub-type — a generic RIFF header would otherwise let `.wav` files masquerade
40
+ * as `.webp` and bypass image-only checks.
41
+ *
42
+ * For SVG (which is XML, not a binary signature) we look for `<svg` near the
43
+ * start of the file. A leading XML declaration or BOM is allowed.
44
+ */
45
+ export function checkMagicBytes(input, declaredMimeType) {
46
+ const bytes = toUint8(input);
47
+ const detected = detectMimeType(bytes);
48
+ // No signature for the declared type — accept (caller is expected to have
49
+ // already checked the allowlist).
50
+ if (detected === null) {
51
+ return { valid: true };
52
+ }
53
+ if (detected === declaredMimeType) {
54
+ return { valid: true, detectedMimeType: detected };
55
+ }
56
+ // Some legitimate aliases:
57
+ // image/jpg ↔ image/jpeg
58
+ // image/x-png ↔ image/png
59
+ if ((detected === 'image/jpeg' && declaredMimeType === 'image/jpg') ||
60
+ (detected === 'image/png' && declaredMimeType === 'image/x-png')) {
61
+ return { valid: true, detectedMimeType: detected };
21
62
  }
22
- return { valid: true };
63
+ return {
64
+ valid: false,
65
+ error: `Declared "${declaredMimeType}" but content looks like "${detected}"`,
66
+ detectedMimeType: detected,
67
+ };
23
68
  }
24
- /** Check a file's magic bytes to detect its true MIME type. */
25
- export function checkMagicBytes(buffer) {
26
- for (const entry of MAGIC_BYTES) {
27
- const matches = entry.bytes.every((byte, i) => buffer[i] === byte);
28
- if (matches)
29
- return entry.mime;
69
+ function toUint8(input) {
70
+ if (input instanceof Uint8Array)
71
+ return input;
72
+ return new Uint8Array(input);
73
+ }
74
+ /** Returns the detected mime type, or null when the bytes don't match a known signature. */
75
+ function detectMimeType(b) {
76
+ if (b.length < 4)
77
+ return null;
78
+ if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff)
79
+ return 'image/jpeg';
80
+ if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
81
+ return 'image/png';
82
+ // GIF: full 6-byte signature ("GIF87a" or "GIF89a"), not just "GIF".
83
+ if (b[0] === 0x47 &&
84
+ b[1] === 0x49 &&
85
+ b[2] === 0x46 &&
86
+ b[3] === 0x38 &&
87
+ (b[4] === 0x37 || b[4] === 0x39) &&
88
+ b[5] === 0x61)
89
+ return 'image/gif';
90
+ // RIFF + 4-byte size + format identifier ("WEBP" / "WAVE" / "AVI ").
91
+ if (b.length >= 12 && b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46) {
92
+ if (b[8] === 0x57 && b[9] === 0x45 && b[10] === 0x42 && b[11] === 0x50)
93
+ return 'image/webp';
94
+ if (b[8] === 0x57 && b[9] === 0x41 && b[10] === 0x56 && b[11] === 0x45)
95
+ return 'audio/wav';
96
+ }
97
+ // AVIF / HEIC: ISO BMFF "ftyp" box at offset 4 with brand at offset 8.
98
+ if (b.length >= 12 && b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {
99
+ const brand = String.fromCharCode(b[8] ?? 0, b[9] ?? 0, b[10] ?? 0, b[11] ?? 0);
100
+ if (brand === 'avif' || brand === 'avis')
101
+ return 'image/avif';
102
+ if (brand === 'mp42' || brand === 'isom' || brand === 'iso2')
103
+ return 'video/mp4';
104
+ }
105
+ // PDF
106
+ if (b[0] === 0x25 && b[1] === 0x50 && b[2] === 0x44 && b[3] === 0x46)
107
+ return 'application/pdf';
108
+ // OGG
109
+ if (b[0] === 0x4f && b[1] === 0x67 && b[2] === 0x67 && b[3] === 0x53)
110
+ return 'audio/ogg';
111
+ // MP3 — either "ID3" tag or a frame sync (0xFFE).
112
+ if (b[0] === 0x49 && b[1] === 0x44 && b[2] === 0x33)
113
+ return 'audio/mpeg';
114
+ if (b[0] === 0xff && (b[1] & 0xe0) === 0xe0)
115
+ return 'audio/mpeg';
116
+ // WebM / Matroska EBML header
117
+ if (b[0] === 0x1a && b[1] === 0x45 && b[2] === 0xdf && b[3] === 0xa3)
118
+ return 'video/webm';
119
+ // SVG: scan the first 1024 bytes for a "<svg" tag. Accept optional XML
120
+ // declaration / BOM / whitespace / comments.
121
+ const head = new TextDecoder('utf-8', { fatal: false }).decode(b.slice(0, 1024)).trimStart();
122
+ if (head.toLowerCase().includes('<svg') ||
123
+ (head.startsWith('<?xml') && head.toLowerCase().includes('<svg'))) {
124
+ return 'image/svg+xml';
30
125
  }
31
- return undefined;
126
+ return null;
32
127
  }
33
128
  export { ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES };
34
129
  //# sourceMappingURL=upload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/security/upload.ts"],"names":[],"mappings":"AAMA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY;CACpF,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,iBAAiB,EAAE,YAAY,EAAE,UAAU;IAC3C,yEAAyE;IACzE,mEAAmE;CACpE,CAAC,CAAC;AAEH,MAAM,WAAW,GAA6C;IAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IACjD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IACtD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IAChD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IACvD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;CAC7D,CAAC;AAEF,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,YAA0B;IAE1B,MAAM,OAAO,GAAG,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,mBAAmB,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,QAAQ,kBAAkB,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAC7B,MAAkB;IAElB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACnE,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/security/upload.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/security/webhook.ts"],"names":[],"mappings":"AAYA,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBlF;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BjE"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/security/webhook.ts"],"names":[],"mappings":"AAYA,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBlF;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8BjE"}
@@ -13,21 +13,21 @@ const PRIVATE_RANGES = [
13
13
  export function validateWebhookUrl(url) {
14
14
  try {
15
15
  const parsed = new URL(url);
16
- if (!["https:", "http:"].includes(parsed.protocol)) {
17
- return { valid: false, error: "Only HTTP(S) protocols are allowed" };
16
+ if (!['https:', 'http:'].includes(parsed.protocol)) {
17
+ return { valid: false, error: 'Only HTTP(S) protocols are allowed' };
18
18
  }
19
- if (parsed.hostname === "localhost" || parsed.hostname === "0.0.0.0") {
20
- return { valid: false, error: "Localhost URLs are not allowed" };
19
+ if (parsed.hostname === 'localhost' || parsed.hostname === '0.0.0.0') {
20
+ return { valid: false, error: 'Localhost URLs are not allowed' };
21
21
  }
22
22
  for (const range of PRIVATE_RANGES) {
23
23
  if (range.test(parsed.hostname)) {
24
- return { valid: false, error: "Private/internal IP addresses are not allowed" };
24
+ return { valid: false, error: 'Private/internal IP addresses are not allowed' };
25
25
  }
26
26
  }
27
27
  return { valid: true };
28
28
  }
29
29
  catch {
30
- return { valid: false, error: "Invalid URL" };
30
+ return { valid: false, error: 'Invalid URL' };
31
31
  }
32
32
  }
33
33
  /** Resolve a hostname and verify the resulting IP isn't in a private range. */
@@ -38,12 +38,16 @@ export async function resolveAndCheck(hostname) {
38
38
  const v4 = await resolve4(hostname);
39
39
  ips.push(...v4);
40
40
  }
41
- catch { /* no A records */ }
41
+ catch {
42
+ /* no A records */
43
+ }
42
44
  try {
43
45
  const v6 = await resolve6(hostname);
44
46
  ips.push(...v6);
45
47
  }
46
- catch { /* no AAAA records */ }
48
+ catch {
49
+ /* no AAAA records */
50
+ }
47
51
  if (ips.length === 0) {
48
52
  return { safe: false, error: `DNS resolution failed for ${hostname}` };
49
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/security/webhook.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG;IACrB,OAAO;IACP,4BAA4B;IAC5B,aAAa;IACb,QAAQ;IACR,MAAM;IACN,aAAa;IACb,OAAO;IACP,SAAS;IACT,SAAS;CACV,CAAC;AAEF,+FAA+F;AAC/F,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;QACvE,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;QACnE,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;YAClF,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB;IAEhB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,QAAQ,EAAE,EAAE,CAAC;IACzE,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/security/webhook.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG;IACrB,OAAO;IACP,4BAA4B;IAC5B,aAAa;IACb,QAAQ;IACR,MAAM;IACN,aAAa;IACb,OAAO;IACP,SAAS;IACT,SAAS;CACV,CAAA;AAED,+FAA+F;AAC/F,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAE3B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAA;QACtE,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAA;QAClE,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAA;YACjF,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB;IAEhB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;IAEhE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACnC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACnC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,QAAQ,EAAE,EAAE,CAAA;IACxE,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/seo/analysis.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,WAAW,GAAG,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAA;IACxD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AA8DD,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AA0FD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CA2YtE;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAwCpE"}
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/seo/analysis.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,WAAW,GAAG,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAA;IACxD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AA8DD,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAa5D;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AA6FD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAsZtE;AAID;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAsCpE"}