@actuate-media/cms-core 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 (431) hide show
  1. package/dist/__tests__/actions/document-crud.test.d.ts +2 -0
  2. package/dist/__tests__/actions/document-crud.test.d.ts.map +1 -0
  3. package/dist/__tests__/actions/document-crud.test.js +156 -0
  4. package/dist/__tests__/actions/document-crud.test.js.map +1 -0
  5. package/dist/__tests__/auth/password.test.d.ts +2 -0
  6. package/dist/__tests__/auth/password.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth/password.test.js +102 -0
  8. package/dist/__tests__/auth/password.test.js.map +1 -0
  9. package/dist/__tests__/auth/session.test.d.ts +2 -0
  10. package/dist/__tests__/auth/session.test.d.ts.map +1 -0
  11. package/dist/__tests__/auth/session.test.js +66 -0
  12. package/dist/__tests__/auth/session.test.js.map +1 -0
  13. package/dist/__tests__/codegen/generate-types.test.d.ts +2 -0
  14. package/dist/__tests__/codegen/generate-types.test.d.ts.map +1 -0
  15. package/dist/__tests__/codegen/generate-types.test.js +173 -0
  16. package/dist/__tests__/codegen/generate-types.test.js.map +1 -0
  17. package/dist/__tests__/scheduling/scheduling.test.d.ts +2 -0
  18. package/dist/__tests__/scheduling/scheduling.test.d.ts.map +1 -0
  19. package/dist/__tests__/scheduling/scheduling.test.js +84 -0
  20. package/dist/__tests__/scheduling/scheduling.test.js.map +1 -0
  21. package/dist/__tests__/security/access.test.d.ts +2 -0
  22. package/dist/__tests__/security/access.test.d.ts.map +1 -0
  23. package/dist/__tests__/security/access.test.js +181 -0
  24. package/dist/__tests__/security/access.test.js.map +1 -0
  25. package/dist/__tests__/security/csrf.test.d.ts +2 -0
  26. package/dist/__tests__/security/csrf.test.d.ts.map +1 -0
  27. package/dist/__tests__/security/csrf.test.js +40 -0
  28. package/dist/__tests__/security/csrf.test.js.map +1 -0
  29. package/dist/__tests__/security/rate-limit.test.d.ts +2 -0
  30. package/dist/__tests__/security/rate-limit.test.d.ts.map +1 -0
  31. package/dist/__tests__/security/rate-limit.test.js +62 -0
  32. package/dist/__tests__/security/rate-limit.test.js.map +1 -0
  33. package/dist/__tests__/security/reauth.test.d.ts +2 -0
  34. package/dist/__tests__/security/reauth.test.d.ts.map +1 -0
  35. package/dist/__tests__/security/reauth.test.js +30 -0
  36. package/dist/__tests__/security/reauth.test.js.map +1 -0
  37. package/dist/__tests__/security/sanitize.test.d.ts +2 -0
  38. package/dist/__tests__/security/sanitize.test.d.ts.map +1 -0
  39. package/dist/__tests__/security/sanitize.test.js +75 -0
  40. package/dist/__tests__/security/sanitize.test.js.map +1 -0
  41. package/dist/__tests__/webhooks/webhooks.test.d.ts +2 -0
  42. package/dist/__tests__/webhooks/webhooks.test.d.ts.map +1 -0
  43. package/dist/__tests__/webhooks/webhooks.test.js +96 -0
  44. package/dist/__tests__/webhooks/webhooks.test.js.map +1 -0
  45. package/dist/a11y/index.d.ts +25 -0
  46. package/dist/a11y/index.d.ts.map +1 -0
  47. package/dist/a11y/index.js +88 -0
  48. package/dist/a11y/index.js.map +1 -0
  49. package/dist/actions.d.ts +42 -0
  50. package/dist/actions.d.ts.map +1 -0
  51. package/dist/actions.js +391 -0
  52. package/dist/actions.js.map +1 -0
  53. package/dist/api/handler-factory.d.ts +7 -0
  54. package/dist/api/handler-factory.d.ts.map +1 -0
  55. package/dist/api/handler-factory.js +120 -0
  56. package/dist/api/handler-factory.js.map +1 -0
  57. package/dist/api/handlers.d.ts +4 -0
  58. package/dist/api/handlers.d.ts.map +1 -0
  59. package/dist/api/handlers.js +2119 -0
  60. package/dist/api/handlers.js.map +1 -0
  61. package/dist/api/index.d.ts +23 -0
  62. package/dist/api/index.d.ts.map +1 -0
  63. package/dist/api/index.js +57 -0
  64. package/dist/api/index.js.map +1 -0
  65. package/dist/api/openapi.d.ts +3 -0
  66. package/dist/api/openapi.d.ts.map +1 -0
  67. package/dist/api/openapi.js +348 -0
  68. package/dist/api/openapi.js.map +1 -0
  69. package/dist/auth/index.d.ts +11 -0
  70. package/dist/auth/index.d.ts.map +1 -0
  71. package/dist/auth/index.js +9 -0
  72. package/dist/auth/index.js.map +1 -0
  73. package/dist/auth/oauth.d.ts +84 -0
  74. package/dist/auth/oauth.d.ts.map +1 -0
  75. package/dist/auth/oauth.js +201 -0
  76. package/dist/auth/oauth.js.map +1 -0
  77. package/dist/auth/password.d.ts +13 -0
  78. package/dist/auth/password.d.ts.map +1 -0
  79. package/dist/auth/password.js +47 -0
  80. package/dist/auth/password.js.map +1 -0
  81. package/dist/auth/providers/github.d.ts +9 -0
  82. package/dist/auth/providers/github.d.ts.map +1 -0
  83. package/dist/auth/providers/github.js +10 -0
  84. package/dist/auth/providers/github.js.map +1 -0
  85. package/dist/auth/providers/google.d.ts +9 -0
  86. package/dist/auth/providers/google.d.ts.map +1 -0
  87. package/dist/auth/providers/google.js +10 -0
  88. package/dist/auth/providers/google.js.map +1 -0
  89. package/dist/auth/providers/microsoft.d.ts +9 -0
  90. package/dist/auth/providers/microsoft.d.ts.map +1 -0
  91. package/dist/auth/providers/microsoft.js +11 -0
  92. package/dist/auth/providers/microsoft.js.map +1 -0
  93. package/dist/auth/session.d.ts +21 -0
  94. package/dist/auth/session.d.ts.map +1 -0
  95. package/dist/auth/session.js +35 -0
  96. package/dist/auth/session.js.map +1 -0
  97. package/dist/auth/totp.d.ts +5 -0
  98. package/dist/auth/totp.d.ts.map +1 -0
  99. package/dist/auth/totp.js +86 -0
  100. package/dist/auth/totp.js.map +1 -0
  101. package/dist/backup/index.d.ts +19 -0
  102. package/dist/backup/index.d.ts.map +1 -0
  103. package/dist/backup/index.js +22 -0
  104. package/dist/backup/index.js.map +1 -0
  105. package/dist/cache/index.d.ts +15 -0
  106. package/dist/cache/index.d.ts.map +1 -0
  107. package/dist/cache/index.js +32 -0
  108. package/dist/cache/index.js.map +1 -0
  109. package/dist/client.d.ts +30 -0
  110. package/dist/client.d.ts.map +1 -0
  111. package/dist/client.js +50 -0
  112. package/dist/client.js.map +1 -0
  113. package/dist/codegen/index.d.ts +4 -0
  114. package/dist/codegen/index.d.ts.map +1 -0
  115. package/dist/codegen/index.js +370 -0
  116. package/dist/codegen/index.js.map +1 -0
  117. package/dist/collections/index.d.ts +17 -0
  118. package/dist/collections/index.d.ts.map +1 -0
  119. package/dist/collections/index.js +29 -0
  120. package/dist/collections/index.js.map +1 -0
  121. package/dist/config/index.d.ts +6 -0
  122. package/dist/config/index.d.ts.map +1 -0
  123. package/dist/config/index.js +74 -0
  124. package/dist/config/index.js.map +1 -0
  125. package/dist/config/types.d.ts +307 -0
  126. package/dist/config/types.d.ts.map +1 -0
  127. package/dist/config/types.js +3 -0
  128. package/dist/config/types.js.map +1 -0
  129. package/dist/content/ai-api.d.ts +21 -0
  130. package/dist/content/ai-api.d.ts.map +1 -0
  131. package/dist/content/ai-api.js +19 -0
  132. package/dist/content/ai-api.js.map +1 -0
  133. package/dist/content/content-graph.d.ts +25 -0
  134. package/dist/content/content-graph.d.ts.map +1 -0
  135. package/dist/content/content-graph.js +40 -0
  136. package/dist/content/content-graph.js.map +1 -0
  137. package/dist/content/extract.d.ts +7 -0
  138. package/dist/content/extract.d.ts.map +1 -0
  139. package/dist/content/extract.js +33 -0
  140. package/dist/content/extract.js.map +1 -0
  141. package/dist/content/index.d.ts +8 -0
  142. package/dist/content/index.d.ts.map +1 -0
  143. package/dist/content/index.js +5 -0
  144. package/dist/content/index.js.map +1 -0
  145. package/dist/content/structured-data.d.ts +80 -0
  146. package/dist/content/structured-data.d.ts.map +1 -0
  147. package/dist/content/structured-data.js +295 -0
  148. package/dist/content/structured-data.js.map +1 -0
  149. package/dist/db/adapters/mysql.d.ts +5 -0
  150. package/dist/db/adapters/mysql.d.ts.map +1 -0
  151. package/dist/db/adapters/mysql.js +18 -0
  152. package/dist/db/adapters/mysql.js.map +1 -0
  153. package/dist/db/adapters/postgres.d.ts +7 -0
  154. package/dist/db/adapters/postgres.d.ts.map +1 -0
  155. package/dist/db/adapters/postgres.js +20 -0
  156. package/dist/db/adapters/postgres.js.map +1 -0
  157. package/dist/db/adapters/sqlite.d.ts +5 -0
  158. package/dist/db/adapters/sqlite.d.ts.map +1 -0
  159. package/dist/db/adapters/sqlite.js +19 -0
  160. package/dist/db/adapters/sqlite.js.map +1 -0
  161. package/dist/db/create-adapter.d.ts +11 -0
  162. package/dist/db/create-adapter.d.ts.map +1 -0
  163. package/dist/db/create-adapter.js +43 -0
  164. package/dist/db/create-adapter.js.map +1 -0
  165. package/dist/db/index.d.ts +9 -0
  166. package/dist/db/index.d.ts.map +1 -0
  167. package/dist/db/index.js +5 -0
  168. package/dist/db/index.js.map +1 -0
  169. package/dist/db.d.ts +20 -0
  170. package/dist/db.d.ts.map +1 -0
  171. package/dist/db.js +35 -0
  172. package/dist/db.js.map +1 -0
  173. package/dist/fields/index.d.ts +15 -0
  174. package/dist/fields/index.d.ts.map +1 -0
  175. package/dist/fields/index.js +87 -0
  176. package/dist/fields/index.js.map +1 -0
  177. package/dist/forms/analytics.d.ts +62 -0
  178. package/dist/forms/analytics.d.ts.map +1 -0
  179. package/dist/forms/analytics.js +95 -0
  180. package/dist/forms/analytics.js.map +1 -0
  181. package/dist/forms/attribution.d.ts +29 -0
  182. package/dist/forms/attribution.d.ts.map +1 -0
  183. package/dist/forms/attribution.js +216 -0
  184. package/dist/forms/attribution.js.map +1 -0
  185. package/dist/forms/index.d.ts +5 -0
  186. package/dist/forms/index.d.ts.map +1 -0
  187. package/dist/forms/index.js +3 -0
  188. package/dist/forms/index.js.map +1 -0
  189. package/dist/graphql/index.d.ts +11 -0
  190. package/dist/graphql/index.d.ts.map +1 -0
  191. package/dist/graphql/index.js +58 -0
  192. package/dist/graphql/index.js.map +1 -0
  193. package/dist/graphql/resolvers.d.ts +8 -0
  194. package/dist/graphql/resolvers.d.ts.map +1 -0
  195. package/dist/graphql/resolvers.js +93 -0
  196. package/dist/graphql/resolvers.js.map +1 -0
  197. package/dist/graphql/schema-builder.d.ts +3 -0
  198. package/dist/graphql/schema-builder.d.ts.map +1 -0
  199. package/dist/graphql/schema-builder.js +103 -0
  200. package/dist/graphql/schema-builder.js.map +1 -0
  201. package/dist/health/index.d.ts +27 -0
  202. package/dist/health/index.d.ts.map +1 -0
  203. package/dist/health/index.js +43 -0
  204. package/dist/health/index.js.map +1 -0
  205. package/dist/i18n/index.d.ts +22 -0
  206. package/dist/i18n/index.d.ts.map +1 -0
  207. package/dist/i18n/index.js +37 -0
  208. package/dist/i18n/index.js.map +1 -0
  209. package/dist/index.d.ts +73 -0
  210. package/dist/index.d.ts.map +1 -0
  211. package/dist/index.js +81 -0
  212. package/dist/index.js.map +1 -0
  213. package/dist/media/index.d.ts +3 -0
  214. package/dist/media/index.d.ts.map +1 -0
  215. package/dist/media/index.js +2 -0
  216. package/dist/media/index.js.map +1 -0
  217. package/dist/media/optimize.d.ts +40 -0
  218. package/dist/media/optimize.d.ts.map +1 -0
  219. package/dist/media/optimize.js +137 -0
  220. package/dist/media/optimize.js.map +1 -0
  221. package/dist/middleware.d.ts +7 -0
  222. package/dist/middleware.d.ts.map +1 -0
  223. package/dist/middleware.js +86 -0
  224. package/dist/middleware.js.map +1 -0
  225. package/dist/multisite/index.d.ts +20 -0
  226. package/dist/multisite/index.d.ts.map +1 -0
  227. package/dist/multisite/index.js +26 -0
  228. package/dist/multisite/index.js.map +1 -0
  229. package/dist/next/preview.d.ts +10 -0
  230. package/dist/next/preview.d.ts.map +1 -0
  231. package/dist/next/preview.js +17 -0
  232. package/dist/next/preview.js.map +1 -0
  233. package/dist/next.d.ts +9 -0
  234. package/dist/next.d.ts.map +1 -0
  235. package/dist/next.js +35 -0
  236. package/dist/next.js.map +1 -0
  237. package/dist/notifications/index.d.ts +20 -0
  238. package/dist/notifications/index.d.ts.map +1 -0
  239. package/dist/notifications/index.js +22 -0
  240. package/dist/notifications/index.js.map +1 -0
  241. package/dist/presence/index.d.ts +24 -0
  242. package/dist/presence/index.d.ts.map +1 -0
  243. package/dist/presence/index.js +99 -0
  244. package/dist/presence/index.js.map +1 -0
  245. package/dist/preview/index.d.ts +14 -0
  246. package/dist/preview/index.d.ts.map +1 -0
  247. package/dist/preview/index.js +45 -0
  248. package/dist/preview/index.js.map +1 -0
  249. package/dist/privacy/index.d.ts +33 -0
  250. package/dist/privacy/index.d.ts.map +1 -0
  251. package/dist/privacy/index.js +15 -0
  252. package/dist/privacy/index.js.map +1 -0
  253. package/dist/relationships/index.d.ts +13 -0
  254. package/dist/relationships/index.d.ts.map +1 -0
  255. package/dist/relationships/index.js +12 -0
  256. package/dist/relationships/index.js.map +1 -0
  257. package/dist/scheduling/index.d.ts +44 -0
  258. package/dist/scheduling/index.d.ts.map +1 -0
  259. package/dist/scheduling/index.js +119 -0
  260. package/dist/scheduling/index.js.map +1 -0
  261. package/dist/search/index.d.ts +25 -0
  262. package/dist/search/index.d.ts.map +1 -0
  263. package/dist/search/index.js +168 -0
  264. package/dist/search/index.js.map +1 -0
  265. package/dist/security/access.d.ts +26 -0
  266. package/dist/security/access.d.ts.map +1 -0
  267. package/dist/security/access.js +92 -0
  268. package/dist/security/access.js.map +1 -0
  269. package/dist/security/anomaly-detection.d.ts +17 -0
  270. package/dist/security/anomaly-detection.d.ts.map +1 -0
  271. package/dist/security/anomaly-detection.js +17 -0
  272. package/dist/security/anomaly-detection.js.map +1 -0
  273. package/dist/security/api-key-enhanced.d.ts +25 -0
  274. package/dist/security/api-key-enhanced.d.ts.map +1 -0
  275. package/dist/security/api-key-enhanced.js +25 -0
  276. package/dist/security/api-key-enhanced.js.map +1 -0
  277. package/dist/security/audit.d.ts +39 -0
  278. package/dist/security/audit.d.ts.map +1 -0
  279. package/dist/security/audit.js +40 -0
  280. package/dist/security/audit.js.map +1 -0
  281. package/dist/security/breach-check.d.ts +3 -0
  282. package/dist/security/breach-check.d.ts.map +1 -0
  283. package/dist/security/breach-check.js +27 -0
  284. package/dist/security/breach-check.js.map +1 -0
  285. package/dist/security/cors.d.ts +11 -0
  286. package/dist/security/cors.d.ts.map +1 -0
  287. package/dist/security/cors.js +33 -0
  288. package/dist/security/cors.js.map +1 -0
  289. package/dist/security/csp-nonces.d.ts +5 -0
  290. package/dist/security/csp-nonces.d.ts.map +1 -0
  291. package/dist/security/csp-nonces.js +24 -0
  292. package/dist/security/csp-nonces.js.map +1 -0
  293. package/dist/security/csrf.d.ts +5 -0
  294. package/dist/security/csrf.d.ts.map +1 -0
  295. package/dist/security/csrf.js +20 -0
  296. package/dist/security/csrf.js.map +1 -0
  297. package/dist/security/encrypted-fields.d.ts +5 -0
  298. package/dist/security/encrypted-fields.d.ts.map +1 -0
  299. package/dist/security/encrypted-fields.js +40 -0
  300. package/dist/security/encrypted-fields.js.map +1 -0
  301. package/dist/security/headers.d.ts +11 -0
  302. package/dist/security/headers.d.ts.map +1 -0
  303. package/dist/security/headers.js +32 -0
  304. package/dist/security/headers.js.map +1 -0
  305. package/dist/security/index.d.ts +31 -0
  306. package/dist/security/index.d.ts.map +1 -0
  307. package/dist/security/index.js +20 -0
  308. package/dist/security/index.js.map +1 -0
  309. package/dist/security/ip-allowlist.d.ts +3 -0
  310. package/dist/security/ip-allowlist.d.ts.map +1 -0
  311. package/dist/security/ip-allowlist.js +35 -0
  312. package/dist/security/ip-allowlist.js.map +1 -0
  313. package/dist/security/middleware.d.ts +20 -0
  314. package/dist/security/middleware.d.ts.map +1 -0
  315. package/dist/security/middleware.js +45 -0
  316. package/dist/security/middleware.js.map +1 -0
  317. package/dist/security/rate-limit.d.ts +24 -0
  318. package/dist/security/rate-limit.d.ts.map +1 -0
  319. package/dist/security/rate-limit.js +84 -0
  320. package/dist/security/rate-limit.js.map +1 -0
  321. package/dist/security/reauth.d.ts +15 -0
  322. package/dist/security/reauth.d.ts.map +1 -0
  323. package/dist/security/reauth.js +38 -0
  324. package/dist/security/reauth.js.map +1 -0
  325. package/dist/security/sanitize.d.ts +13 -0
  326. package/dist/security/sanitize.d.ts.map +1 -0
  327. package/dist/security/sanitize.js +34 -0
  328. package/dist/security/sanitize.js.map +1 -0
  329. package/dist/security/security-txt.d.ts +12 -0
  330. package/dist/security/security-txt.d.ts.map +1 -0
  331. package/dist/security/security-txt.js +19 -0
  332. package/dist/security/security-txt.js.map +1 -0
  333. package/dist/security/session-limits.d.ts +17 -0
  334. package/dist/security/session-limits.d.ts.map +1 -0
  335. package/dist/security/session-limits.js +14 -0
  336. package/dist/security/session-limits.js.map +1 -0
  337. package/dist/security/upload.d.ts +13 -0
  338. package/dist/security/upload.d.ts.map +1 -0
  339. package/dist/security/upload.js +34 -0
  340. package/dist/security/upload.js.map +1 -0
  341. package/dist/security/webhook.d.ts +12 -0
  342. package/dist/security/webhook.d.ts.map +1 -0
  343. package/dist/security/webhook.js +38 -0
  344. package/dist/security/webhook.js.map +1 -0
  345. package/dist/seo/analysis.d.ts +66 -0
  346. package/dist/seo/analysis.d.ts.map +1 -0
  347. package/dist/seo/analysis.js +594 -0
  348. package/dist/seo/analysis.js.map +1 -0
  349. package/dist/seo/index.d.ts +9 -0
  350. package/dist/seo/index.d.ts.map +1 -0
  351. package/dist/seo/index.js +5 -0
  352. package/dist/seo/index.js.map +1 -0
  353. package/dist/seo/llms-txt.d.ts +16 -0
  354. package/dist/seo/llms-txt.d.ts.map +1 -0
  355. package/dist/seo/llms-txt.js +70 -0
  356. package/dist/seo/llms-txt.js.map +1 -0
  357. package/dist/seo/meta-tags.d.ts +33 -0
  358. package/dist/seo/meta-tags.d.ts.map +1 -0
  359. package/dist/seo/meta-tags.js +159 -0
  360. package/dist/seo/meta-tags.js.map +1 -0
  361. package/dist/seo/title-templates.d.ts +17 -0
  362. package/dist/seo/title-templates.d.ts.map +1 -0
  363. package/dist/seo/title-templates.js +28 -0
  364. package/dist/seo/title-templates.js.map +1 -0
  365. package/dist/setup/index.d.ts +38 -0
  366. package/dist/setup/index.d.ts.map +1 -0
  367. package/dist/setup/index.js +77 -0
  368. package/dist/setup/index.js.map +1 -0
  369. package/dist/storage/index.d.ts +11 -0
  370. package/dist/storage/index.d.ts.map +1 -0
  371. package/dist/storage/index.js +11 -0
  372. package/dist/storage/index.js.map +1 -0
  373. package/dist/templates/index.d.ts +16 -0
  374. package/dist/templates/index.d.ts.map +1 -0
  375. package/dist/templates/index.js +23 -0
  376. package/dist/templates/index.js.map +1 -0
  377. package/dist/upgrade/changelog.d.ts +13 -0
  378. package/dist/upgrade/changelog.d.ts.map +1 -0
  379. package/dist/upgrade/changelog.js +54 -0
  380. package/dist/upgrade/changelog.js.map +1 -0
  381. package/dist/upgrade/index.d.ts +7 -0
  382. package/dist/upgrade/index.d.ts.map +1 -0
  383. package/dist/upgrade/index.js +4 -0
  384. package/dist/upgrade/index.js.map +1 -0
  385. package/dist/upgrade/upgrade-pr.d.ts +16 -0
  386. package/dist/upgrade/upgrade-pr.d.ts.map +1 -0
  387. package/dist/upgrade/upgrade-pr.js +38 -0
  388. package/dist/upgrade/upgrade-pr.js.map +1 -0
  389. package/dist/upgrade/version-check.d.ts +17 -0
  390. package/dist/upgrade/version-check.d.ts.map +1 -0
  391. package/dist/upgrade/version-check.js +30 -0
  392. package/dist/upgrade/version-check.js.map +1 -0
  393. package/dist/webhooks/index.d.ts +46 -0
  394. package/dist/webhooks/index.d.ts.map +1 -0
  395. package/dist/webhooks/index.js +245 -0
  396. package/dist/webhooks/index.js.map +1 -0
  397. package/dist/workflow/index.d.ts +8 -0
  398. package/dist/workflow/index.d.ts.map +1 -0
  399. package/dist/workflow/index.js +56 -0
  400. package/dist/workflow/index.js.map +1 -0
  401. package/dist/workflows/index.d.ts +30 -0
  402. package/dist/workflows/index.d.ts.map +1 -0
  403. package/dist/workflows/index.js +14 -0
  404. package/dist/workflows/index.js.map +1 -0
  405. package/generated/browser.ts +109 -0
  406. package/generated/client.ts +133 -0
  407. package/generated/commonInputTypes.ts +709 -0
  408. package/generated/enums.ts +125 -0
  409. package/generated/internal/class.ts +376 -0
  410. package/generated/internal/prismaNamespace.ts +2617 -0
  411. package/generated/internal/prismaNamespaceBrowser.ts +611 -0
  412. package/generated/models/ApiKey.ts +1550 -0
  413. package/generated/models/AuditLog.ts +1206 -0
  414. package/generated/models/BackupRecord.ts +1250 -0
  415. package/generated/models/ContentLock.ts +1472 -0
  416. package/generated/models/ContentTemplate.ts +1416 -0
  417. package/generated/models/Document.ts +3005 -0
  418. package/generated/models/Folder.ts +1904 -0
  419. package/generated/models/FormSubmission.ts +1200 -0
  420. package/generated/models/InAppNotification.ts +1457 -0
  421. package/generated/models/Media.ts +2340 -0
  422. package/generated/models/MediaUsage.ts +1472 -0
  423. package/generated/models/OAuthAccount.ts +1463 -0
  424. package/generated/models/Redirect.ts +1284 -0
  425. package/generated/models/Session.ts +1492 -0
  426. package/generated/models/Site.ts +1206 -0
  427. package/generated/models/User.ts +3513 -0
  428. package/generated/models/Version.ts +1511 -0
  429. package/generated/models/WorkflowState.ts +1514 -0
  430. package/generated/models.ts +29 -0
  431. package/package.json +83 -0
@@ -0,0 +1,20 @@
1
+ import { type SecurityHeadersConfig } from "./headers";
2
+ import type { RateLimiter } from "./rate-limit";
3
+ export interface SecurityMiddlewareConfig {
4
+ headers?: SecurityHeadersConfig;
5
+ csrf?: {
6
+ enabled: boolean;
7
+ cookieName?: string;
8
+ };
9
+ rateLimit?: RateLimiter;
10
+ rateLimitKey?: (request: Request) => string;
11
+ }
12
+ export interface SecurityMiddlewareResult {
13
+ allowed: boolean;
14
+ headers: Record<string, string>;
15
+ error?: string;
16
+ status?: number;
17
+ }
18
+ /** Compose a security middleware pipeline that applies headers, CSRF, and rate limiting. */
19
+ export declare function applySecurityMiddleware(request: Request, config: SecurityMiddlewareConfig): Promise<SecurityMiddlewareResult>;
20
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/security/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4FAA4F;AAC5F,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CAiCnC"}
@@ -0,0 +1,45 @@
1
+ import { getSecurityHeaders } from "./headers";
2
+ import { validateToken as validateCsrf } from "./csrf";
3
+ /** Compose a security middleware pipeline that applies headers, CSRF, and rate limiting. */
4
+ export async function applySecurityMiddleware(request, config) {
5
+ const responseHeaders = getSecurityHeaders(config.headers);
6
+ if (config.rateLimit) {
7
+ const key = config.rateLimitKey?.(request) ?? getClientIp(request);
8
+ const result = await config.rateLimit.check(key);
9
+ if (!result.allowed) {
10
+ return {
11
+ allowed: false,
12
+ headers: responseHeaders,
13
+ error: "Rate limit exceeded",
14
+ status: 429,
15
+ };
16
+ }
17
+ responseHeaders["X-RateLimit-Remaining"] = String(result.remaining);
18
+ responseHeaders["X-RateLimit-Reset"] = result.resetAt.toISOString();
19
+ }
20
+ if (config.csrf?.enabled && isMutatingMethod(request.method)) {
21
+ const csrfToken = request.headers.get("x-csrf-token") ?? "";
22
+ const cookieName = config.csrf.cookieName ?? "__actuate_csrf";
23
+ const storedToken = parseCookie(request.headers.get("cookie") ?? "", cookieName);
24
+ if (!storedToken || !validateCsrf(csrfToken, storedToken)) {
25
+ return {
26
+ allowed: false,
27
+ headers: responseHeaders,
28
+ error: "Invalid CSRF token",
29
+ status: 403,
30
+ };
31
+ }
32
+ }
33
+ return { allowed: true, headers: responseHeaders };
34
+ }
35
+ function isMutatingMethod(method) {
36
+ return ["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase());
37
+ }
38
+ function getClientIp(request) {
39
+ return request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? "unknown";
40
+ }
41
+ function parseCookie(cookieHeader, name) {
42
+ const match = cookieHeader.match(new RegExp(`(?:^|;\\s*)${name}=([^;]*)`));
43
+ return match?.[1];
44
+ }
45
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/security/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA8B,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAiBvD,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAgB,EAChB,MAAgC;IAEhC,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,qBAAqB;gBAC5B,MAAM,EAAE,GAAG;aACZ,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,uBAAuB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,eAAe,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC;QAC9D,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;QACjF,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YAC1D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,oBAAoB;gBAC3B,MAAM,EAAE,GAAG;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACpF,CAAC;AAED,SAAS,WAAW,CAAC,YAAoB,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,CAAC;IAC3E,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface RateLimitResult {
2
+ allowed: boolean;
3
+ remaining: number;
4
+ resetAt: Date;
5
+ retryAfter?: number;
6
+ }
7
+ export interface RateLimiter {
8
+ check(key: string): Promise<RateLimitResult>;
9
+ reset(key: string): Promise<void>;
10
+ }
11
+ export interface RateLimitConfig {
12
+ windowMs: number;
13
+ maxRequests: number;
14
+ }
15
+ /** Create a rate limiter backed by an in-memory sliding window (for dev/single-process). */
16
+ export declare function createInMemoryRateLimiter(config: RateLimitConfig): RateLimiter;
17
+ /** Create a rate limiter backed by Upstash Redis (for serverless/production). */
18
+ export declare function createUpstashRateLimiter(config: RateLimitConfig): RateLimiter;
19
+ /**
20
+ * Create a rate limiter with automatic backend detection.
21
+ * Uses Upstash Redis if UPSTASH_REDIS_REST_URL is set, otherwise falls back to in-memory.
22
+ */
23
+ export declare function createRateLimiter(config: RateLimitConfig): RateLimiter;
24
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/security/rate-limit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CA4B9E;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAiD7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAStE"}
@@ -0,0 +1,84 @@
1
+ /** Create a rate limiter backed by an in-memory sliding window (for dev/single-process). */
2
+ export function createInMemoryRateLimiter(config) {
3
+ const windows = new Map();
4
+ return {
5
+ async check(key) {
6
+ const now = Date.now();
7
+ const entry = windows.get(key);
8
+ if (!entry || now > entry.resetAt) {
9
+ const resetAt = now + config.windowMs;
10
+ windows.set(key, { count: 1, resetAt });
11
+ return { allowed: true, remaining: config.maxRequests - 1, resetAt: new Date(resetAt) };
12
+ }
13
+ entry.count++;
14
+ const allowed = entry.count <= config.maxRequests;
15
+ return {
16
+ allowed,
17
+ remaining: Math.max(0, config.maxRequests - entry.count),
18
+ resetAt: new Date(entry.resetAt),
19
+ retryAfter: allowed ? undefined : Math.ceil((entry.resetAt - now) / 1000),
20
+ };
21
+ },
22
+ async reset(key) {
23
+ windows.delete(key);
24
+ },
25
+ };
26
+ }
27
+ /** Create a rate limiter backed by Upstash Redis (for serverless/production). */
28
+ export function createUpstashRateLimiter(config) {
29
+ const url = process.env.UPSTASH_REDIS_REST_URL;
30
+ const token = process.env.UPSTASH_REDIS_REST_TOKEN;
31
+ if (!url || !token) {
32
+ throw new Error('UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN are required');
33
+ }
34
+ async function redisCommand(command) {
35
+ const response = await fetch(`${url}`, {
36
+ method: 'POST',
37
+ headers: {
38
+ Authorization: `Bearer ${token}`,
39
+ 'Content-Type': 'application/json',
40
+ },
41
+ body: JSON.stringify(command),
42
+ });
43
+ const data = await response.json();
44
+ return data?.result;
45
+ }
46
+ const windowSec = Math.ceil(config.windowMs / 1000);
47
+ return {
48
+ async check(key) {
49
+ const redisKey = `ratelimit:${key}`;
50
+ const count = await redisCommand(['INCR', redisKey]);
51
+ if (count === 1) {
52
+ await redisCommand(['EXPIRE', redisKey, String(windowSec)]);
53
+ }
54
+ const ttl = await redisCommand(['TTL', redisKey]);
55
+ const resetAt = new Date(Date.now() + (ttl > 0 ? ttl * 1000 : config.windowMs));
56
+ const allowed = count <= config.maxRequests;
57
+ return {
58
+ allowed,
59
+ remaining: Math.max(0, config.maxRequests - count),
60
+ resetAt,
61
+ retryAfter: allowed ? undefined : ttl > 0 ? ttl : Math.ceil(config.windowMs / 1000),
62
+ };
63
+ },
64
+ async reset(key) {
65
+ await redisCommand(['DEL', `ratelimit:${key}`]);
66
+ },
67
+ };
68
+ }
69
+ /**
70
+ * Create a rate limiter with automatic backend detection.
71
+ * Uses Upstash Redis if UPSTASH_REDIS_REST_URL is set, otherwise falls back to in-memory.
72
+ */
73
+ export function createRateLimiter(config) {
74
+ if (process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN) {
75
+ try {
76
+ return createUpstashRateLimiter(config);
77
+ }
78
+ catch {
79
+ // Fallback to in-memory if Upstash init fails
80
+ }
81
+ }
82
+ return createInMemoryRateLimiter(config);
83
+ }
84
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/security/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ReauthConfig {
2
+ maxAgeSeconds: number;
3
+ requiredForActions: string[];
4
+ }
5
+ export interface ReauthContext {
6
+ lastAuthAt: Date;
7
+ action: string;
8
+ }
9
+ /** Check whether a sensitive action requires re-authentication. */
10
+ export declare function requiresReauth(context: ReauthContext, config: ReauthConfig): boolean;
11
+ /** Verify re-authentication credentials (password). */
12
+ export declare function verifyReauth(userId: string, credential: string, method: "password" | "totp", db?: any): Promise<boolean>;
13
+ /** Default configuration for sensitive actions requiring re-auth. */
14
+ export declare const DEFAULT_REAUTH_CONFIG: ReauthConfig;
15
+ //# sourceMappingURL=reauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reauth.d.ts","sourceRoot":"","sources":["../../src/security/reauth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,GACnB,OAAO,CAIT;AAED,uDAAuD;AACvD,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,GAAG,MAAM,EAC3B,EAAE,CAAC,EAAE,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,EAAE,YASnC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { verifyPassword } from '../auth/password';
2
+ /** Check whether a sensitive action requires re-authentication. */
3
+ export function requiresReauth(context, config) {
4
+ if (!config.requiredForActions.includes(context.action))
5
+ return false;
6
+ const elapsed = (Date.now() - context.lastAuthAt.getTime()) / 1000;
7
+ return elapsed > config.maxAgeSeconds;
8
+ }
9
+ /** Verify re-authentication credentials (password). */
10
+ export async function verifyReauth(userId, credential, method, db) {
11
+ if (method === 'totp') {
12
+ return false;
13
+ }
14
+ if (!db) {
15
+ const { getDB } = await import('../db');
16
+ db = getDB();
17
+ }
18
+ const user = await db.user.findUnique({
19
+ where: { id: userId },
20
+ select: { passwordHash: true, isActive: true },
21
+ });
22
+ if (!user || !user.isActive || !user.passwordHash) {
23
+ return false;
24
+ }
25
+ return verifyPassword(credential, user.passwordHash);
26
+ }
27
+ /** Default configuration for sensitive actions requiring re-auth. */
28
+ export const DEFAULT_REAUTH_CONFIG = {
29
+ maxAgeSeconds: 300,
30
+ requiredForActions: [
31
+ 'delete_user',
32
+ 'change_user_role',
33
+ 'change_settings',
34
+ 'export_data',
35
+ 'reset_password_other',
36
+ ],
37
+ };
38
+ //# sourceMappingURL=reauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reauth.js","sourceRoot":"","sources":["../../src/security/reauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYlD,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAC5B,OAAsB,EACtB,MAAoB;IAEpB,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IACnE,OAAO,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;AACxC,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,UAAkB,EAClB,MAA2B,EAC3B,EAAQ;IAER,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,EAAE,GAAG,KAAK,EAAE,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;QACrB,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,aAAa,EAAE,GAAG;IAClB,kBAAkB,EAAE;QAClB,aAAa;QACb,kBAAkB;QAClB,iBAAiB;QACjB,aAAa;QACb,sBAAsB;KACvB;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface SanitizeOptions {
2
+ allowedTags?: string[];
3
+ allowedAttributes?: Record<string, string[]>;
4
+ stripAll?: boolean;
5
+ }
6
+ declare const DEFAULT_ALLOWED_TAGS: string[];
7
+ declare const DEFAULT_ALLOWED_ATTRS: Record<string, string[]>;
8
+ /** Sanitize HTML content using DOMPurify. Strips dangerous tags/attributes while preserving safe content. */
9
+ export declare function sanitizeHtml(html: string, options?: SanitizeOptions): string;
10
+ /** Strip all HTML tags, returning plain text. */
11
+ export declare function stripHtml(html: string): string;
12
+ export { DEFAULT_ALLOWED_TAGS, DEFAULT_ALLOWED_ATTRS };
13
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +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,6GAA6G;AAC7G,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAgBR;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import DOMPurify from 'isomorphic-dompurify';
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",
7
+ ];
8
+ 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"],
13
+ };
14
+ /** Sanitize HTML content using DOMPurify. Strips dangerous tags/attributes while preserving safe content. */
15
+ export function sanitizeHtml(html, options) {
16
+ if (options?.stripAll) {
17
+ return DOMPurify.sanitize(html, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] });
18
+ }
19
+ const tags = options?.allowedTags ?? DEFAULT_ALLOWED_TAGS;
20
+ const attrConfig = options?.allowedAttributes ?? DEFAULT_ALLOWED_ATTRS;
21
+ const allAttrs = [...new Set(Object.values(attrConfig).flat())];
22
+ return DOMPurify.sanitize(html, {
23
+ ALLOWED_TAGS: tags,
24
+ ALLOWED_ATTR: allAttrs,
25
+ ALLOW_DATA_ATTR: false,
26
+ ADD_ATTR: ['target'],
27
+ });
28
+ }
29
+ /** Strip all HTML tags, returning plain text. */
30
+ export function stripHtml(html) {
31
+ return DOMPurify.sanitize(html, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }).trim();
32
+ }
33
+ export { DEFAULT_ALLOWED_TAGS, DEFAULT_ALLOWED_ATTRS };
34
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/security/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAQ7C,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,6GAA6G;AAC7G,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAyB;IAEzB,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,WAAW,IAAI,oBAAoB,CAAC;IAE1D,MAAM,UAAU,GAAG,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,CAAC;IACvE,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC9B,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,QAAQ;QACtB,eAAe,EAAE,KAAK;QACtB,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface SecurityTxtConfig {
2
+ contact: string;
3
+ expires: Date;
4
+ encryption?: string;
5
+ acknowledgments?: string;
6
+ preferredLanguages?: string[];
7
+ canonical?: string;
8
+ policy?: string;
9
+ }
10
+ /** Generate a security.txt file contents per RFC 9116. */
11
+ export declare function generateSecurityTxt(config: SecurityTxtConfig): string;
12
+ //# sourceMappingURL=security-txt.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,19 @@
1
+ /** Generate a security.txt file contents per RFC 9116. */
2
+ export function generateSecurityTxt(config) {
3
+ const lines = [];
4
+ lines.push(`Contact: ${config.contact}`);
5
+ lines.push(`Expires: ${config.expires.toISOString()}`);
6
+ if (config.encryption)
7
+ lines.push(`Encryption: ${config.encryption}`);
8
+ if (config.acknowledgments)
9
+ lines.push(`Acknowledgments: ${config.acknowledgments}`);
10
+ if (config.preferredLanguages?.length) {
11
+ lines.push(`Preferred-Languages: ${config.preferredLanguages.join(", ")}`);
12
+ }
13
+ if (config.canonical)
14
+ lines.push(`Canonical: ${config.canonical}`);
15
+ if (config.policy)
16
+ lines.push(`Policy: ${config.policy}`);
17
+ return lines.join("\n") + "\n";
18
+ }
19
+ //# sourceMappingURL=security-txt.js.map
@@ -0,0 +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"}
@@ -0,0 +1,17 @@
1
+ export interface SessionInfo {
2
+ sessionId: string;
3
+ userId: string;
4
+ createdAt: Date;
5
+ ipAddress?: string;
6
+ userAgent?: string;
7
+ }
8
+ export interface SessionLimitConfig {
9
+ maxConcurrentSessions: number;
10
+ strategy: "deny_new" | "revoke_oldest";
11
+ }
12
+ /** Enforce concurrent session limits, returning sessions to revoke if any. */
13
+ export declare function enforceSessionLimits(activeSessions: SessionInfo[], config: SessionLimitConfig): {
14
+ allowed: boolean;
15
+ sessionsToRevoke: string[];
16
+ };
17
+ //# sourceMappingURL=session-limits.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,14 @@
1
+ /** Enforce concurrent session limits, returning sessions to revoke if any. */
2
+ export function enforceSessionLimits(activeSessions, config) {
3
+ if (activeSessions.length < config.maxConcurrentSessions) {
4
+ return { allowed: true, sessionsToRevoke: [] };
5
+ }
6
+ if (config.strategy === "deny_new") {
7
+ return { allowed: false, sessionsToRevoke: [] };
8
+ }
9
+ const sorted = [...activeSessions].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
10
+ const excess = sorted.length - config.maxConcurrentSessions + 1;
11
+ const toRevoke = sorted.slice(0, excess).map((s) => s.sessionId);
12
+ return { allowed: true, sessionsToRevoke: toRevoke };
13
+ }
14
+ //# sourceMappingURL=session-limits.js.map
@@ -0,0 +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"}
@@ -0,0 +1,13 @@
1
+ export interface FileValidationResult {
2
+ valid: boolean;
3
+ error?: string;
4
+ detectedMimeType?: string;
5
+ }
6
+ declare const ALLOWED_IMAGE_TYPES: Set<string>;
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;
12
+ export { ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES };
13
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,34 @@
1
+ const ALLOWED_IMAGE_TYPES = new Set([
2
+ "image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml", "image/avif",
3
+ ]);
4
+ 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",
8
+ ]);
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. */
17
+ 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` };
21
+ }
22
+ return { valid: true };
23
+ }
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;
30
+ }
31
+ return undefined;
32
+ }
33
+ export { ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES };
34
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ /** Validate that a webhook URL does not target private/internal networks (SSRF prevention). */
2
+ export declare function validateWebhookUrl(url: string): {
3
+ valid: boolean;
4
+ error?: string;
5
+ };
6
+ /** Resolve a hostname and verify the resulting IP isn't in a private range. */
7
+ export declare function resolveAndCheck(_hostname: string): Promise<{
8
+ safe: boolean;
9
+ resolvedIp?: string;
10
+ error?: string;
11
+ }>;
12
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +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,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAGjE"}
@@ -0,0 +1,38 @@
1
+ const PRIVATE_RANGES = [
2
+ /^10\./,
3
+ /^172\.(1[6-9]|2\d|3[01])\./,
4
+ /^192\.168\./,
5
+ /^127\./,
6
+ /^0\./,
7
+ /^169\.254\./,
8
+ /^::1$/,
9
+ /^fc00:/i,
10
+ /^fe80:/i,
11
+ ];
12
+ /** Validate that a webhook URL does not target private/internal networks (SSRF prevention). */
13
+ export function validateWebhookUrl(url) {
14
+ try {
15
+ const parsed = new URL(url);
16
+ if (!["https:", "http:"].includes(parsed.protocol)) {
17
+ return { valid: false, error: "Only HTTP(S) protocols are allowed" };
18
+ }
19
+ if (parsed.hostname === "localhost" || parsed.hostname === "0.0.0.0") {
20
+ return { valid: false, error: "Localhost URLs are not allowed" };
21
+ }
22
+ for (const range of PRIVATE_RANGES) {
23
+ if (range.test(parsed.hostname)) {
24
+ return { valid: false, error: "Private/internal IP addresses are not allowed" };
25
+ }
26
+ }
27
+ return { valid: true };
28
+ }
29
+ catch {
30
+ return { valid: false, error: "Invalid URL" };
31
+ }
32
+ }
33
+ /** Resolve a hostname and verify the resulting IP isn't in a private range. */
34
+ export async function resolveAndCheck(_hostname) {
35
+ // TODO: DNS resolution + private range check
36
+ throw new Error("Not implemented");
37
+ }
38
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +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,SAAiB;IAEjB,6CAA6C;IAC7C,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,66 @@
1
+ export interface SEOAnalysisResult {
2
+ score: number;
3
+ checks: SEOCheck[];
4
+ }
5
+ export interface SEOCheck {
6
+ id: string;
7
+ category: 'keyphrase' | 'readability' | 'seo' | 'social';
8
+ title: string;
9
+ status: 'good' | 'improvement' | 'problem';
10
+ description: string;
11
+ }
12
+ export interface AnalysisInput {
13
+ title: string;
14
+ slug: string;
15
+ content: string;
16
+ metaTitle?: string;
17
+ metaDescription?: string;
18
+ focusKeyphrase?: string;
19
+ canonical?: string;
20
+ ogTitle?: string;
21
+ ogDescription?: string;
22
+ ogImage?: string;
23
+ isCornerstone?: boolean;
24
+ }
25
+ export interface ReadabilityResult {
26
+ fleschScore: number;
27
+ fleschLabel: string;
28
+ avgSentenceLength: number;
29
+ avgWordLength: number;
30
+ passiveVoicePercent: number;
31
+ wordCount: number;
32
+ sentenceCount: number;
33
+ paragraphCount: number;
34
+ readingTimeMinutes: number;
35
+ }
36
+ /** Remove all HTML tags, returning plain text. */
37
+ export declare function stripHtmlTags(html: string): string;
38
+ /**
39
+ * Estimate the syllable count of an English word.
40
+ *
41
+ * Heuristic: count vowel groups, subtract 1 for a trailing silent 'e',
42
+ * and clamp to a minimum of 1.
43
+ */
44
+ export declare function countSyllables(word: string): number;
45
+ /** Detect passive voice in a single sentence. */
46
+ export declare function detectPassiveVoice(sentence: string): boolean;
47
+ /** Split plain text into sentences. */
48
+ export declare function splitSentences(text: string): string[];
49
+ /** Split plain text into paragraphs (double newlines or `<p>` boundaries). */
50
+ export declare function splitParagraphs(text: string): string[];
51
+ /**
52
+ * Run a comprehensive SEO analysis on the given content and metadata.
53
+ *
54
+ * Returns a 0-100 score together with detailed per-check results across
55
+ * keyphrase, SEO, readability, and social categories.
56
+ */
57
+ export declare function analyzeContent(input: AnalysisInput): SEOAnalysisResult;
58
+ /**
59
+ * Calculate readability metrics for a block of plain text.
60
+ *
61
+ * Includes the Flesch reading ease score, average sentence/word lengths,
62
+ * passive voice percentage, word/sentence/paragraph counts, and estimated
63
+ * reading time.
64
+ */
65
+ export declare function calculateReadability(text: string): ReadabilityResult;
66
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +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"}