@revealui/core 0.2.1 → 0.5.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 (395) hide show
  1. package/dist/api/compression.d.ts.map +1 -1
  2. package/dist/api/payload-optimization.d.ts.map +1 -1
  3. package/dist/api/rate-limit.d.ts +29 -28
  4. package/dist/api/rate-limit.d.ts.map +1 -1
  5. package/dist/api/rate-limit.js +63 -3
  6. package/dist/api/response-cache.d.ts.map +1 -1
  7. package/dist/api/response-cache.js +1 -1
  8. package/dist/api/rest.d.ts.map +1 -1
  9. package/dist/api/rest.js +3 -2
  10. package/dist/auth/access.d.ts.map +1 -1
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/cache/query-cache.d.ts +12 -10
  13. package/dist/cache/query-cache.d.ts.map +1 -1
  14. package/dist/cache/query-cache.js +38 -42
  15. package/dist/caching/index.d.ts +6 -0
  16. package/dist/caching/index.d.ts.map +1 -0
  17. package/dist/caching/index.js +5 -0
  18. package/dist/client/admin/RichText.d.ts +1 -1
  19. package/dist/client/admin/RichText.d.ts.map +1 -1
  20. package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -1
  21. package/dist/client/admin/components/AdminDashboard.js +195 -205
  22. package/dist/client/admin/components/CollectionList.d.ts.map +1 -1
  23. package/dist/client/admin/components/DocumentForm.d.ts.map +1 -1
  24. package/dist/client/admin/components/DocumentForm.js +130 -6
  25. package/dist/client/admin/components/GlobalForm.d.ts.map +1 -1
  26. package/dist/client/admin/context/ServerFunctionContext.d.ts +8 -0
  27. package/dist/client/admin/context/ServerFunctionContext.d.ts.map +1 -0
  28. package/dist/client/admin/context/ServerFunctionContext.js +15 -0
  29. package/dist/client/admin/i18n/en.d.ts.map +1 -1
  30. package/dist/client/admin/index.d.ts +1 -0
  31. package/dist/client/admin/index.d.ts.map +1 -1
  32. package/dist/client/admin/index.js +1 -0
  33. package/dist/client/admin/layout.d.ts +1 -1
  34. package/dist/client/admin/layout.d.ts.map +1 -1
  35. package/dist/client/admin/layout.js +3 -2
  36. package/dist/client/admin/page.d.ts.map +1 -1
  37. package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
  38. package/dist/client/admin/utils/apiClient.js +0 -4
  39. package/dist/client/admin/utils/index.d.ts +0 -1
  40. package/dist/client/admin/utils/index.d.ts.map +1 -1
  41. package/dist/client/admin/utils/index.js +0 -1
  42. package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -1
  43. package/dist/client/hooks.d.ts.map +1 -1
  44. package/dist/client/index.d.ts.map +1 -1
  45. package/dist/client/richtext/RichTextEditor.d.ts.map +1 -1
  46. package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -1
  47. package/dist/client/richtext/components/ImageNodeComponent.js +0 -1
  48. package/dist/client/richtext/components/ImageUploadButton.d.ts +2 -0
  49. package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -1
  50. package/dist/client/richtext/components/ImageUploadButton.js +30 -15
  51. package/dist/client/richtext/index.d.ts.map +1 -1
  52. package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -1
  53. package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -1
  54. package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -1
  55. package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -1
  56. package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -1
  57. package/dist/client/richtext/plugins/FloatingToolbarPlugin.js +1 -3
  58. package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -1
  59. package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -1
  60. package/dist/client/ui/index.d.ts.map +1 -1
  61. package/dist/client/ui/index.js +1 -1
  62. package/dist/collections/CollectionOperations.d.ts +7 -7
  63. package/dist/collections/CollectionOperations.d.ts.map +1 -1
  64. package/dist/collections/CollectionOperations.js +15 -1
  65. package/dist/collections/hooks.d.ts.map +1 -1
  66. package/dist/collections/index.d.ts.map +1 -1
  67. package/dist/collections/operations/create.d.ts +4 -5
  68. package/dist/collections/operations/create.d.ts.map +1 -1
  69. package/dist/collections/operations/create.js +35 -6
  70. package/dist/collections/operations/createMany.d.ts +12 -0
  71. package/dist/collections/operations/createMany.d.ts.map +1 -0
  72. package/dist/collections/operations/createMany.js +43 -0
  73. package/dist/collections/operations/delete.d.ts +1 -1
  74. package/dist/collections/operations/delete.d.ts.map +1 -1
  75. package/dist/collections/operations/delete.js +31 -2
  76. package/dist/collections/operations/deleteMany.d.ts +11 -0
  77. package/dist/collections/operations/deleteMany.d.ts.map +1 -0
  78. package/dist/collections/operations/deleteMany.js +50 -0
  79. package/dist/collections/operations/fieldHooks.d.ts +2 -2
  80. package/dist/collections/operations/fieldHooks.d.ts.map +1 -1
  81. package/dist/collections/operations/fieldHooks.js +4 -4
  82. package/dist/collections/operations/find.d.ts +2 -4
  83. package/dist/collections/operations/find.d.ts.map +1 -1
  84. package/dist/collections/operations/find.js +115 -8
  85. package/dist/collections/operations/findById.d.ts +3 -4
  86. package/dist/collections/operations/findById.d.ts.map +1 -1
  87. package/dist/collections/operations/findById.js +53 -1
  88. package/dist/collections/operations/sqlAdapter.d.ts +23 -0
  89. package/dist/collections/operations/sqlAdapter.d.ts.map +1 -0
  90. package/dist/collections/operations/sqlAdapter.js +76 -0
  91. package/dist/collections/operations/update.d.ts +3 -5
  92. package/dist/collections/operations/update.d.ts.map +1 -1
  93. package/dist/collections/operations/update.js +103 -11
  94. package/dist/collections/operations/updateMany.d.ts +11 -0
  95. package/dist/collections/operations/updateMany.d.ts.map +1 -0
  96. package/dist/collections/operations/updateMany.js +52 -0
  97. package/dist/collections/registry.d.ts +12 -0
  98. package/dist/collections/registry.d.ts.map +1 -0
  99. package/dist/collections/registry.js +38 -0
  100. package/dist/config/index.d.ts.map +1 -1
  101. package/dist/config/runtime.d.ts.map +1 -1
  102. package/dist/config/utils.d.ts +0 -10
  103. package/dist/config/utils.d.ts.map +1 -1
  104. package/dist/config/utils.js +0 -13
  105. package/dist/database/index.d.ts +3 -0
  106. package/dist/database/index.d.ts.map +1 -1
  107. package/dist/database/index.js +1 -5
  108. package/dist/database/safe-parse.d.ts.map +1 -1
  109. package/dist/database/ssl-config.d.ts.map +1 -1
  110. package/dist/database/type-adapter.d.ts.map +1 -1
  111. package/dist/database/universal-postgres.d.ts.map +1 -1
  112. package/dist/database/universal-postgres.js +6 -1
  113. package/dist/dataloader.d.ts.map +1 -1
  114. package/dist/error-handling/error-boundary.d.ts.map +1 -1
  115. package/dist/error-handling/error-reporter.d.ts +1 -1
  116. package/dist/error-handling/error-reporter.d.ts.map +1 -1
  117. package/dist/error-handling/error-reporter.js +19 -5
  118. package/dist/error-handling/fallback-components.d.ts.map +1 -1
  119. package/dist/error-handling/fallback-components.js +1 -1
  120. package/dist/error-handling/index.d.ts +2 -4
  121. package/dist/error-handling/index.d.ts.map +1 -1
  122. package/dist/error-handling/index.js +1 -4
  123. package/dist/factories/builders.d.ts.map +1 -1
  124. package/dist/factories/index.d.ts.map +1 -1
  125. package/dist/features.d.ts +7 -7
  126. package/dist/features.d.ts.map +1 -1
  127. package/dist/features.js +2 -2
  128. package/dist/fieldTraversal.d.ts.map +1 -1
  129. package/dist/fields/config/types.d.ts.map +1 -1
  130. package/dist/fields/getDefaultValue.d.ts.map +1 -1
  131. package/dist/fields/getFieldPaths.d.ts.map +1 -1
  132. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
  133. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  134. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  135. package/dist/generated/types/cms.d.ts.map +1 -1
  136. package/dist/generated/types/cms.js +0 -1
  137. package/dist/generated/types/neon.d.ts.map +1 -1
  138. package/dist/generated/types/neon.js +4 -2
  139. package/dist/globals/GlobalOperations.d.ts.map +1 -1
  140. package/dist/globals/GlobalOperations.js +16 -4
  141. package/dist/globals/index.d.ts.map +1 -1
  142. package/dist/index.d.ts +15 -4
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +15 -5
  145. package/dist/instance/RevealUIInstance.d.ts.map +1 -1
  146. package/dist/instance/RevealUIInstance.js +6 -19
  147. package/dist/instance/index.d.ts.map +1 -1
  148. package/dist/instance/logger.d.ts.map +1 -1
  149. package/dist/instance/methods/create.d.ts.map +1 -1
  150. package/dist/instance/methods/create.js +0 -3
  151. package/dist/instance/methods/delete.d.ts.map +1 -1
  152. package/dist/instance/methods/delete.js +1 -4
  153. package/dist/instance/methods/find.d.ts.map +1 -1
  154. package/dist/instance/methods/find.js +0 -3
  155. package/dist/instance/methods/findById.d.ts.map +1 -1
  156. package/dist/instance/methods/findById.js +0 -3
  157. package/dist/instance/methods/hooks.d.ts.map +1 -1
  158. package/dist/instance/methods/update.d.ts.map +1 -1
  159. package/dist/instance/methods/update.js +0 -3
  160. package/dist/jobs/index.d.ts +16 -0
  161. package/dist/jobs/index.d.ts.map +1 -0
  162. package/dist/jobs/index.js +14 -0
  163. package/dist/jobs/queue.d.ts +57 -0
  164. package/dist/jobs/queue.d.ts.map +1 -0
  165. package/dist/jobs/queue.js +134 -0
  166. package/dist/license-encryption.d.ts +21 -0
  167. package/dist/license-encryption.d.ts.map +1 -0
  168. package/dist/license-encryption.js +74 -0
  169. package/dist/license.d.ts +26 -3
  170. package/dist/license.d.ts.map +1 -1
  171. package/dist/license.js +87 -7
  172. package/dist/monitoring/alerts.d.ts +4 -4
  173. package/dist/monitoring/alerts.d.ts.map +1 -1
  174. package/dist/monitoring/cleanup-manager.d.ts.map +1 -1
  175. package/dist/monitoring/health-monitor.d.ts.map +1 -1
  176. package/dist/monitoring/index.d.ts.map +1 -1
  177. package/dist/monitoring/process-registry.d.ts.map +1 -1
  178. package/dist/monitoring/query-monitor.d.ts.map +1 -1
  179. package/dist/monitoring/types.d.ts.map +1 -1
  180. package/dist/monitoring/zombie-detector.d.ts.map +1 -1
  181. package/dist/monitoring/zombie-detector.js +5 -0
  182. package/dist/nextjs/index.d.ts.map +1 -1
  183. package/dist/nextjs/utilities.d.ts.map +1 -1
  184. package/dist/nextjs/withRevealUI.d.ts.map +1 -1
  185. package/dist/observability/alerts.d.ts.map +1 -1
  186. package/dist/observability/alerts.js +1 -2
  187. package/dist/observability/health-check.d.ts +0 -4
  188. package/dist/observability/health-check.d.ts.map +1 -1
  189. package/dist/observability/health-check.js +0 -36
  190. package/dist/observability/index.d.ts.map +1 -1
  191. package/dist/observability/logger.d.ts.map +1 -1
  192. package/dist/observability/logger.js +1 -1
  193. package/dist/observability/metrics.d.ts.map +1 -1
  194. package/dist/observability/tracing.d.ts.map +1 -1
  195. package/dist/observability/tracing.js +0 -1
  196. package/dist/plugins/form-builder.d.ts.map +1 -1
  197. package/dist/plugins/index.d.ts.map +1 -1
  198. package/dist/plugins/nested-docs.d.ts +4 -0
  199. package/dist/plugins/nested-docs.d.ts.map +1 -1
  200. package/dist/plugins/nested-docs.js +50 -6
  201. package/dist/plugins/redirects.d.ts.map +1 -1
  202. package/dist/queries/index.d.ts.map +1 -1
  203. package/dist/queries/queryBuilder.d.ts.map +1 -1
  204. package/dist/queries/queryBuilder.js +13 -5
  205. package/dist/relationships/analyzer.d.ts.map +1 -1
  206. package/dist/relationships/analyzer.js +8 -0
  207. package/dist/relationships/index.d.ts.map +1 -1
  208. package/dist/relationships/populate-core.d.ts +57 -0
  209. package/dist/relationships/populate-core.d.ts.map +1 -0
  210. package/dist/relationships/populate-core.js +116 -0
  211. package/dist/relationships/populate-helpers.d.ts +5 -51
  212. package/dist/relationships/populate-helpers.d.ts.map +1 -1
  213. package/dist/relationships/populate-helpers.js +4 -109
  214. package/dist/relationships/population.d.ts +1 -9
  215. package/dist/relationships/population.d.ts.map +1 -1
  216. package/dist/relationships/population.js +8 -3
  217. package/dist/revealui.d.ts.map +1 -1
  218. package/dist/richtext/exports/client/rcc.d.ts.map +1 -1
  219. package/dist/richtext/exports/client/rcc.js +1 -1
  220. package/dist/richtext/exports/server/rsc.d.ts +17 -0
  221. package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
  222. package/dist/richtext/exports/server/rsc.js +61 -5
  223. package/dist/richtext/index.d.ts.map +1 -1
  224. package/dist/richtext/lexical.d.ts.map +1 -1
  225. package/dist/security/index.d.ts +3 -16
  226. package/dist/security/index.d.ts.map +1 -1
  227. package/dist/security/index.js +3 -16
  228. package/dist/server/index.d.ts.map +1 -1
  229. package/dist/server/renderPage.d.ts.map +1 -1
  230. package/dist/storage/index.d.ts +1 -0
  231. package/dist/storage/index.d.ts.map +1 -1
  232. package/dist/storage/index.js +2 -4
  233. package/dist/storage/vercel-blob.d.ts.map +1 -1
  234. package/dist/storage/vercel-blob.js +3 -0
  235. package/dist/translations/index.d.ts.map +1 -1
  236. package/dist/types/access.d.ts.map +1 -1
  237. package/dist/types/api.d.ts.map +1 -1
  238. package/dist/types/cms.d.ts.map +1 -1
  239. package/dist/types/config.d.ts.map +1 -1
  240. package/dist/types/core.d.ts +1 -1
  241. package/dist/types/core.d.ts.map +1 -1
  242. package/dist/types/extensions.d.ts.map +1 -1
  243. package/dist/types/frontend.d.ts.map +1 -1
  244. package/dist/types/generated.d.ts.map +1 -1
  245. package/dist/types/hooks.d.ts.map +1 -1
  246. package/dist/types/index.d.ts +1 -1
  247. package/dist/types/index.d.ts.map +1 -1
  248. package/dist/types/interfaces/app.d.ts.map +1 -1
  249. package/dist/types/jobs.d.ts.map +1 -1
  250. package/dist/types/legacy.d.ts.map +1 -1
  251. package/dist/types/plugins.d.ts.map +1 -1
  252. package/dist/types/query.d.ts.map +1 -1
  253. package/dist/types/request.d.ts.map +1 -1
  254. package/dist/types/richtext.d.ts.map +1 -1
  255. package/dist/types/runtime.d.ts +60 -1
  256. package/dist/types/runtime.d.ts.map +1 -1
  257. package/dist/types/schema.d.ts.map +1 -1
  258. package/dist/types/user.d.ts.map +1 -1
  259. package/dist/utils/access-conversion.d.ts.map +1 -1
  260. package/dist/utils/api-wrapper.d.ts.map +1 -1
  261. package/dist/utils/api-wrapper.js +1 -1
  262. package/dist/utils/block-conversion.d.ts.map +1 -1
  263. package/dist/utils/cache.d.ts.map +1 -1
  264. package/dist/utils/deep-clone.js +0 -1
  265. package/dist/utils/error-responses.d.ts.map +1 -1
  266. package/dist/utils/error-responses.js +2 -3
  267. package/dist/utils/errors.d.ts +36 -0
  268. package/dist/utils/errors.d.ts.map +1 -1
  269. package/dist/utils/errors.js +103 -0
  270. package/dist/utils/field-conversion.d.ts +1 -1
  271. package/dist/utils/field-conversion.d.ts.map +1 -1
  272. package/dist/utils/flattenResult.d.ts.map +1 -1
  273. package/dist/utils/flattenResult.js +0 -1
  274. package/dist/utils/getBlockSelect.d.ts.map +1 -1
  275. package/dist/utils/getSelectMode.d.ts.map +1 -1
  276. package/dist/utils/isValidID.d.ts.map +1 -1
  277. package/dist/utils/json-parsing.d.ts.map +1 -1
  278. package/dist/utils/logger-client.d.ts.map +1 -1
  279. package/dist/utils/logger-server.d.ts.map +1 -1
  280. package/dist/utils/logger.d.ts.map +1 -1
  281. package/dist/utils/request-context.d.ts.map +1 -1
  282. package/dist/utils/stripUnselectedFields.d.ts.map +1 -1
  283. package/dist/utils/type-guards.d.ts.map +1 -1
  284. package/package.json +58 -26
  285. package/dist/caching/app-cache.d.ts +0 -237
  286. package/dist/caching/app-cache.d.ts.map +0 -1
  287. package/dist/caching/app-cache.js +0 -430
  288. package/dist/caching/cdn-config.d.ts +0 -155
  289. package/dist/caching/cdn-config.d.ts.map +0 -1
  290. package/dist/caching/cdn-config.js +0 -411
  291. package/dist/caching/edge-cache.d.ts +0 -177
  292. package/dist/caching/edge-cache.d.ts.map +0 -1
  293. package/dist/caching/edge-cache.js +0 -385
  294. package/dist/caching/service-worker.d.ts +0 -154
  295. package/dist/caching/service-worker.d.ts.map +0 -1
  296. package/dist/caching/service-worker.js +0 -437
  297. package/dist/client/admin/utils/auth.d.ts +0 -23
  298. package/dist/client/admin/utils/auth.d.ts.map +0 -1
  299. package/dist/client/admin/utils/auth.js +0 -52
  300. package/dist/client/http/client.d.ts +0 -15
  301. package/dist/client/http/client.d.ts.map +0 -1
  302. package/dist/client/http/client.js +0 -49
  303. package/dist/client/http/fetchBanner.d.ts +0 -18
  304. package/dist/client/http/fetchBanner.d.ts.map +0 -1
  305. package/dist/client/http/fetchBanner.js +0 -44
  306. package/dist/client/http/fetchCard.d.ts +0 -18
  307. package/dist/client/http/fetchCard.d.ts.map +0 -1
  308. package/dist/client/http/fetchCard.js +0 -46
  309. package/dist/client/http/fetchEvents.d.ts +0 -18
  310. package/dist/client/http/fetchEvents.d.ts.map +0 -1
  311. package/dist/client/http/fetchEvents.js +0 -44
  312. package/dist/client/http/fetchHero.d.ts +0 -17
  313. package/dist/client/http/fetchHero.d.ts.map +0 -1
  314. package/dist/client/http/fetchHero.js +0 -55
  315. package/dist/client/http/fetchMainInfos.d.ts +0 -17
  316. package/dist/client/http/fetchMainInfos.d.ts.map +0 -1
  317. package/dist/client/http/fetchMainInfos.js +0 -44
  318. package/dist/client/http/fetchVideos.d.ts +0 -13
  319. package/dist/client/http/fetchVideos.d.ts.map +0 -1
  320. package/dist/client/http/fetchVideos.js +0 -36
  321. package/dist/client/http/index.d.ts +0 -19
  322. package/dist/client/http/index.d.ts.map +0 -1
  323. package/dist/client/http/index.js +0 -11
  324. package/dist/error-handling/circuit-breaker.d.ts +0 -262
  325. package/dist/error-handling/circuit-breaker.d.ts.map +0 -1
  326. package/dist/error-handling/circuit-breaker.js +0 -542
  327. package/dist/error-handling/retry.d.ts +0 -194
  328. package/dist/error-handling/retry.d.ts.map +0 -1
  329. package/dist/error-handling/retry.js +0 -450
  330. package/dist/errors/index.d.ts +0 -23
  331. package/dist/errors/index.d.ts.map +0 -1
  332. package/dist/errors/index.js +0 -40
  333. package/dist/generated/agents/index.d.ts +0 -8
  334. package/dist/generated/agents/index.d.ts.map +0 -1
  335. package/dist/generated/agents/index.js +0 -7
  336. package/dist/generated/components/index.d.ts +0 -8
  337. package/dist/generated/components/index.d.ts.map +0 -1
  338. package/dist/generated/components/index.js +0 -7
  339. package/dist/generated/functions/index.d.ts +0 -8
  340. package/dist/generated/functions/index.d.ts.map +0 -1
  341. package/dist/generated/functions/index.js +0 -7
  342. package/dist/generated/hooks/index.d.ts +0 -8
  343. package/dist/generated/hooks/index.d.ts.map +0 -1
  344. package/dist/generated/hooks/index.js +0 -7
  345. package/dist/generated/plans/index.d.ts +0 -8
  346. package/dist/generated/plans/index.d.ts.map +0 -1
  347. package/dist/generated/plans/index.js +0 -7
  348. package/dist/generated/prompts/index.d.ts +0 -8
  349. package/dist/generated/prompts/index.d.ts.map +0 -1
  350. package/dist/generated/prompts/index.js +0 -7
  351. package/dist/generated/tools/index.d.ts +0 -8
  352. package/dist/generated/tools/index.d.ts.map +0 -1
  353. package/dist/generated/tools/index.js +0 -7
  354. package/dist/generated/types/supabase.d.ts +0 -193
  355. package/dist/generated/types/supabase.d.ts.map +0 -1
  356. package/dist/generated/types/supabase.js +0 -5
  357. package/dist/optimization/asset-optimizer.d.ts +0 -202
  358. package/dist/optimization/asset-optimizer.d.ts.map +0 -1
  359. package/dist/optimization/asset-optimizer.js +0 -312
  360. package/dist/optimization/build-optimizer.d.ts +0 -202
  361. package/dist/optimization/build-optimizer.d.ts.map +0 -1
  362. package/dist/optimization/build-optimizer.js +0 -271
  363. package/dist/optimization/bundle-analyzer.d.ts +0 -98
  364. package/dist/optimization/bundle-analyzer.d.ts.map +0 -1
  365. package/dist/optimization/bundle-analyzer.js +0 -322
  366. package/dist/optimization/code-splitting.d.ts +0 -131
  367. package/dist/optimization/code-splitting.d.ts.map +0 -1
  368. package/dist/optimization/code-splitting.js +0 -277
  369. package/dist/plugin/index.d.ts +0 -12
  370. package/dist/plugin/index.d.ts.map +0 -1
  371. package/dist/plugin/index.js +0 -4
  372. package/dist/security/audit.d.ts +0 -188
  373. package/dist/security/audit.d.ts.map +0 -1
  374. package/dist/security/audit.js +0 -431
  375. package/dist/security/auth.d.ts +0 -241
  376. package/dist/security/auth.d.ts.map +0 -1
  377. package/dist/security/auth.js +0 -476
  378. package/dist/security/authorization.d.ts +0 -235
  379. package/dist/security/authorization.d.ts.map +0 -1
  380. package/dist/security/authorization.js +0 -434
  381. package/dist/security/encryption.d.ts +0 -214
  382. package/dist/security/encryption.d.ts.map +0 -1
  383. package/dist/security/encryption.js +0 -517
  384. package/dist/security/gdpr.d.ts +0 -300
  385. package/dist/security/gdpr.d.ts.map +0 -1
  386. package/dist/security/gdpr.js +0 -465
  387. package/dist/security/headers.d.ts +0 -182
  388. package/dist/security/headers.d.ts.map +0 -1
  389. package/dist/security/headers.js +0 -402
  390. package/dist/utils/jwt-validation.d.ts +0 -14
  391. package/dist/utils/jwt-validation.d.ts.map +0 -1
  392. package/dist/utils/jwt-validation.js +0 -36
  393. package/dist/utils/request-headers.d.ts +0 -15
  394. package/dist/utils/request-headers.d.ts.map +0 -1
  395. package/dist/utils/request-headers.js +0 -31
@@ -1,155 +0,0 @@
1
- /**
2
- * CDN Configuration and Cache Management
3
- *
4
- * Utilities for CDN caching, edge caching, and cache invalidation
5
- */
6
- /**
7
- * CDN Cache Configuration
8
- */
9
- export interface CDNCacheConfig {
10
- provider?: 'cloudflare' | 'vercel' | 'fastly' | 'custom';
11
- zones?: string[];
12
- ttl?: number;
13
- staleWhileRevalidate?: number;
14
- staleIfError?: number;
15
- bypassCache?: boolean;
16
- cacheKey?: string[];
17
- varyHeaders?: string[];
18
- }
19
- export declare const DEFAULT_CDN_CONFIG: CDNCacheConfig;
20
- /**
21
- * Generate Cache-Control header
22
- */
23
- export declare function generateCacheControl(config: {
24
- maxAge?: number;
25
- sMaxAge?: number;
26
- staleWhileRevalidate?: number;
27
- staleIfError?: number;
28
- public?: boolean;
29
- private?: boolean;
30
- immutable?: boolean;
31
- noCache?: boolean;
32
- noStore?: boolean;
33
- }): string;
34
- /**
35
- * Cache presets for different asset types
36
- */
37
- export declare const CDN_CACHE_PRESETS: {
38
- readonly immutable: {
39
- readonly maxAge: 31536000;
40
- readonly sMaxAge: 31536000;
41
- readonly public: true;
42
- readonly immutable: true;
43
- };
44
- readonly static: {
45
- readonly maxAge: 2592000;
46
- readonly sMaxAge: 31536000;
47
- readonly staleWhileRevalidate: 86400;
48
- readonly public: true;
49
- };
50
- readonly api: {
51
- readonly maxAge: 0;
52
- readonly sMaxAge: 60;
53
- readonly staleWhileRevalidate: 30;
54
- readonly public: true;
55
- };
56
- readonly page: {
57
- readonly maxAge: 0;
58
- readonly sMaxAge: 300;
59
- readonly staleWhileRevalidate: 60;
60
- readonly public: true;
61
- };
62
- readonly private: {
63
- readonly maxAge: 300;
64
- readonly private: true;
65
- readonly staleWhileRevalidate: 60;
66
- };
67
- readonly noCache: {
68
- readonly noStore: true;
69
- };
70
- readonly revalidate: {
71
- readonly maxAge: 0;
72
- readonly sMaxAge: 0;
73
- readonly noCache: true;
74
- };
75
- };
76
- /**
77
- * CDN Purge Configuration
78
- */
79
- export interface CDNPurgeConfig {
80
- provider: 'cloudflare' | 'vercel' | 'fastly';
81
- apiKey?: string;
82
- apiSecret?: string;
83
- zoneId?: string;
84
- distributionId?: string;
85
- }
86
- /**
87
- * Purge CDN cache
88
- */
89
- export declare function purgeCDNCache(urls: string[], config: CDNPurgeConfig): Promise<{
90
- success: boolean;
91
- purged: number;
92
- errors?: string[];
93
- }>;
94
- /**
95
- * Purge by cache tag
96
- */
97
- export declare function purgeCacheByTag(tags: string[], config: CDNPurgeConfig): Promise<{
98
- success: boolean;
99
- purged: number;
100
- errors?: string[];
101
- }>;
102
- /**
103
- * Purge everything
104
- */
105
- export declare function purgeAllCache(config: CDNPurgeConfig): Promise<{
106
- success: boolean;
107
- errors?: string[];
108
- }>;
109
- /**
110
- * CDN cache warming
111
- */
112
- export declare function warmCDNCache(urls: string[], options?: {
113
- concurrency?: number;
114
- headers?: Record<string, string>;
115
- }): Promise<{
116
- warmed: number;
117
- failed: number;
118
- errors: string[];
119
- }>;
120
- /**
121
- * Generate cache tags
122
- */
123
- export declare function generateCacheTags(resource: {
124
- type: string;
125
- id?: string | number;
126
- related?: string[];
127
- }): string[];
128
- /**
129
- * Edge cache configuration for Vercel
130
- */
131
- export declare function generateVercelCacheConfig(preset: keyof typeof CDN_CACHE_PRESETS): {
132
- headers: {
133
- 'Cache-Control': string;
134
- 'CDN-Cache-Control': string;
135
- 'Vercel-CDN-Cache-Control': string;
136
- };
137
- };
138
- /**
139
- * Edge cache configuration for Cloudflare
140
- */
141
- export declare function generateCloudflareConfig(preset: keyof typeof CDN_CACHE_PRESETS, options?: {
142
- cacheTags?: string[];
143
- bypassOnCookie?: string;
144
- }): {
145
- headers: Record<string, string>;
146
- };
147
- /**
148
- * Check if response should be cached
149
- */
150
- export declare function shouldCacheResponse(status: number, headers: Headers): boolean;
151
- /**
152
- * Calculate cache TTL from headers
153
- */
154
- export declare function getCacheTTL(headers: Headers): number;
155
- //# sourceMappingURL=cdn-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"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"}
@@ -1,411 +0,0 @@
1
- /**
2
- * CDN Configuration and Cache Management
3
- *
4
- * Utilities for CDN caching, edge caching, and cache invalidation
5
- */
6
- export const DEFAULT_CDN_CONFIG = {
7
- provider: 'vercel',
8
- ttl: 31536000, // 1 year for static assets
9
- staleWhileRevalidate: 86400, // 1 day
10
- staleIfError: 604800, // 1 week
11
- bypassCache: false,
12
- cacheKey: ['url', 'headers.accept', 'headers.accept-encoding'],
13
- varyHeaders: ['Accept', 'Accept-Encoding'],
14
- };
15
- /**
16
- * Generate Cache-Control header
17
- */
18
- export function generateCacheControl(config) {
19
- const directives = [];
20
- // Visibility
21
- if (config.noStore) {
22
- directives.push('no-store');
23
- return directives.join(', ');
24
- }
25
- if (config.noCache) {
26
- directives.push('no-cache');
27
- return directives.join(', ');
28
- }
29
- if (config.public) {
30
- directives.push('public');
31
- }
32
- else if (config.private) {
33
- directives.push('private');
34
- }
35
- // Max age
36
- if (config.maxAge !== undefined) {
37
- directives.push(`max-age=${config.maxAge}`);
38
- }
39
- // Shared max age (CDN)
40
- if (config.sMaxAge !== undefined) {
41
- directives.push(`s-maxage=${config.sMaxAge}`);
42
- }
43
- // Stale-while-revalidate
44
- if (config.staleWhileRevalidate !== undefined) {
45
- directives.push(`stale-while-revalidate=${config.staleWhileRevalidate}`);
46
- }
47
- // Stale-if-error
48
- if (config.staleIfError !== undefined) {
49
- directives.push(`stale-if-error=${config.staleIfError}`);
50
- }
51
- // Immutable
52
- if (config.immutable) {
53
- directives.push('immutable');
54
- }
55
- return directives.join(', ');
56
- }
57
- /**
58
- * Cache presets for different asset types
59
- */
60
- export const CDN_CACHE_PRESETS = {
61
- // Static assets with hashed filenames (immutable)
62
- immutable: {
63
- maxAge: 31536000, // 1 year
64
- sMaxAge: 31536000,
65
- public: true,
66
- immutable: true,
67
- },
68
- // Static assets (images, fonts)
69
- static: {
70
- maxAge: 2592000, // 30 days
71
- sMaxAge: 31536000, // 1 year on CDN
72
- staleWhileRevalidate: 86400, // 1 day
73
- public: true,
74
- },
75
- // API responses (short-lived)
76
- api: {
77
- maxAge: 0,
78
- sMaxAge: 60, // 1 minute on CDN
79
- staleWhileRevalidate: 30,
80
- public: true,
81
- },
82
- // HTML pages (dynamic)
83
- page: {
84
- maxAge: 0,
85
- sMaxAge: 300, // 5 minutes on CDN
86
- staleWhileRevalidate: 60,
87
- public: true,
88
- },
89
- // User-specific data
90
- private: {
91
- maxAge: 300, // 5 minutes
92
- private: true,
93
- staleWhileRevalidate: 60,
94
- },
95
- // No caching
96
- noCache: {
97
- noStore: true,
98
- },
99
- // Revalidate every request
100
- revalidate: {
101
- maxAge: 0,
102
- sMaxAge: 0,
103
- noCache: true,
104
- },
105
- };
106
- /**
107
- * Purge CDN cache
108
- */
109
- export async function purgeCDNCache(urls, config) {
110
- const { provider } = config;
111
- switch (provider) {
112
- case 'cloudflare':
113
- return purgeCloudflare(urls, config);
114
- case 'vercel':
115
- return purgeVercel(urls, config);
116
- case 'fastly':
117
- return purgeFastly(urls, config);
118
- default:
119
- throw new Error(`Unsupported CDN provider: ${provider}`);
120
- }
121
- }
122
- /**
123
- * Purge Cloudflare cache
124
- */
125
- async function purgeCloudflare(urls, config) {
126
- const { apiKey, zoneId } = config;
127
- if (!(apiKey && zoneId)) {
128
- throw new Error('Cloudflare API key and zone ID required');
129
- }
130
- try {
131
- const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
132
- method: 'POST',
133
- headers: {
134
- Authorization: `Bearer ${apiKey}`,
135
- 'Content-Type': 'application/json',
136
- },
137
- body: JSON.stringify({ files: urls }),
138
- });
139
- const data = await response.json();
140
- return {
141
- success: data.success,
142
- purged: urls.length,
143
- errors: data.errors,
144
- };
145
- }
146
- catch (error) {
147
- return {
148
- success: false,
149
- purged: 0,
150
- errors: [error instanceof Error ? error.message : 'Unknown error'],
151
- };
152
- }
153
- }
154
- /**
155
- * Purge Vercel cache
156
- */
157
- async function purgeVercel(urls, config) {
158
- const { apiKey } = config;
159
- if (!apiKey) {
160
- throw new Error('Vercel API token required');
161
- }
162
- try {
163
- const response = await fetch('https://api.vercel.com/v1/purge', {
164
- method: 'POST',
165
- headers: {
166
- Authorization: `Bearer ${apiKey}`,
167
- 'Content-Type': 'application/json',
168
- },
169
- body: JSON.stringify({ urls }),
170
- });
171
- const data = await response.json();
172
- return {
173
- success: response.ok,
174
- purged: urls.length,
175
- errors: data.error ? [data.error.message] : undefined,
176
- };
177
- }
178
- catch (error) {
179
- return {
180
- success: false,
181
- purged: 0,
182
- errors: [error instanceof Error ? error.message : 'Unknown error'],
183
- };
184
- }
185
- }
186
- /**
187
- * Purge Fastly cache
188
- */
189
- async function purgeFastly(urls, config) {
190
- const { apiKey } = config;
191
- if (!apiKey) {
192
- throw new Error('Fastly API key required');
193
- }
194
- try {
195
- const results = await Promise.all(urls.map(async (url) => {
196
- const response = await fetch(url, {
197
- method: 'PURGE',
198
- headers: {
199
- 'Fastly-Key': apiKey,
200
- },
201
- });
202
- return response.ok;
203
- }));
204
- const purged = results.filter(Boolean).length;
205
- return {
206
- success: purged === urls.length,
207
- purged,
208
- };
209
- }
210
- catch (error) {
211
- return {
212
- success: false,
213
- purged: 0,
214
- errors: [error instanceof Error ? error.message : 'Unknown error'],
215
- };
216
- }
217
- }
218
- /**
219
- * Purge by cache tag
220
- */
221
- export async function purgeCacheByTag(tags, config) {
222
- const { provider, apiKey, zoneId } = config;
223
- if (provider === 'cloudflare') {
224
- if (!(apiKey && zoneId)) {
225
- throw new Error('Cloudflare API key and zone ID required');
226
- }
227
- try {
228
- const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
229
- method: 'POST',
230
- headers: {
231
- Authorization: `Bearer ${apiKey}`,
232
- 'Content-Type': 'application/json',
233
- },
234
- body: JSON.stringify({ tags }),
235
- });
236
- const data = await response.json();
237
- return {
238
- success: data.success,
239
- purged: tags.length,
240
- errors: data.errors,
241
- };
242
- }
243
- catch (error) {
244
- return {
245
- success: false,
246
- purged: 0,
247
- errors: [error instanceof Error ? error.message : 'Unknown error'],
248
- };
249
- }
250
- }
251
- throw new Error(`Cache tag purging not supported for ${provider}`);
252
- }
253
- /**
254
- * Purge everything
255
- */
256
- export async function purgeAllCache(config) {
257
- const { provider, apiKey, zoneId } = config;
258
- if (provider === 'cloudflare') {
259
- if (!(apiKey && zoneId)) {
260
- throw new Error('Cloudflare API key and zone ID required');
261
- }
262
- try {
263
- const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
264
- method: 'POST',
265
- headers: {
266
- Authorization: `Bearer ${apiKey}`,
267
- 'Content-Type': 'application/json',
268
- },
269
- body: JSON.stringify({ purge_everything: true }),
270
- });
271
- const data = await response.json();
272
- return {
273
- success: data.success,
274
- errors: data.errors,
275
- };
276
- }
277
- catch (error) {
278
- return {
279
- success: false,
280
- errors: [error instanceof Error ? error.message : 'Unknown error'],
281
- };
282
- }
283
- }
284
- throw new Error(`Purge all not supported for ${provider}`);
285
- }
286
- /**
287
- * CDN cache warming
288
- */
289
- export async function warmCDNCache(urls, options = {}) {
290
- const { concurrency = 5, headers = {} } = options;
291
- const results = [];
292
- const chunks = [];
293
- // Split into chunks
294
- for (let i = 0; i < urls.length; i += concurrency) {
295
- chunks.push(urls.slice(i, i + concurrency));
296
- }
297
- // Warm cache in chunks
298
- for (const chunk of chunks) {
299
- const chunkResults = await Promise.all(chunk.map(async (url) => {
300
- try {
301
- const response = await fetch(url, { headers });
302
- return {
303
- success: response.ok,
304
- error: response.ok ? undefined : `${response.status} ${response.statusText}`,
305
- };
306
- }
307
- catch (error) {
308
- return {
309
- success: false,
310
- error: error instanceof Error ? error.message : 'Unknown error',
311
- };
312
- }
313
- }));
314
- results.push(...chunkResults);
315
- }
316
- const warmed = results.filter((r) => r.success).length;
317
- const failed = results.filter((r) => !r.success).length;
318
- const errors = results.flatMap((r) => (r.error ? [r.error] : []));
319
- return { warmed, failed, errors };
320
- }
321
- /**
322
- * Generate cache tags
323
- */
324
- export function generateCacheTags(resource) {
325
- const tags = [];
326
- // Type tag
327
- tags.push(resource.type);
328
- // ID tag
329
- if (resource.id) {
330
- tags.push(`${resource.type}:${resource.id}`);
331
- }
332
- // Related tags
333
- if (resource.related) {
334
- tags.push(...resource.related);
335
- }
336
- return tags;
337
- }
338
- /**
339
- * Edge cache configuration for Vercel
340
- */
341
- export function generateVercelCacheConfig(preset) {
342
- const config = CDN_CACHE_PRESETS[preset];
343
- const cacheControl = generateCacheControl(config);
344
- return {
345
- headers: {
346
- 'Cache-Control': cacheControl,
347
- 'CDN-Cache-Control': cacheControl,
348
- 'Vercel-CDN-Cache-Control': cacheControl,
349
- },
350
- };
351
- }
352
- /**
353
- * Edge cache configuration for Cloudflare
354
- */
355
- export function generateCloudflareConfig(preset, options = {}) {
356
- const config = CDN_CACHE_PRESETS[preset];
357
- const cacheControl = generateCacheControl(config);
358
- const headers = {
359
- 'Cache-Control': cacheControl,
360
- };
361
- // Cache tags
362
- if (options.cacheTags && options.cacheTags.length > 0) {
363
- headers['Cache-Tag'] = options.cacheTags.join(',');
364
- }
365
- // Bypass on cookie
366
- if (options.bypassOnCookie) {
367
- headers['Cache-Control'] = `${cacheControl}, bypass=${options.bypassOnCookie}`;
368
- }
369
- return { headers };
370
- }
371
- /**
372
- * Check if response should be cached
373
- */
374
- export function shouldCacheResponse(status, headers) {
375
- // Don't cache errors
376
- if (status >= 400) {
377
- return false;
378
- }
379
- // Check Cache-Control header
380
- const cacheControl = headers.get('cache-control') || '';
381
- if (cacheControl.includes('no-store') ||
382
- cacheControl.includes('no-cache') ||
383
- cacheControl.includes('private')) {
384
- return false;
385
- }
386
- return true;
387
- }
388
- /**
389
- * Calculate cache TTL from headers
390
- */
391
- export function getCacheTTL(headers) {
392
- const cacheControl = headers.get('cache-control') || '';
393
- // Check s-maxage first (CDN)
394
- const sMaxAgeMatch = cacheControl.match(/s-maxage=(\d+)/);
395
- if (sMaxAgeMatch?.[1]) {
396
- return parseInt(sMaxAgeMatch[1], 10);
397
- }
398
- // Check max-age
399
- const maxAgeMatch = cacheControl.match(/max-age=(\d+)/);
400
- if (maxAgeMatch?.[1]) {
401
- return parseInt(maxAgeMatch[1], 10);
402
- }
403
- // Check Expires header
404
- const expires = headers.get('expires');
405
- if (expires) {
406
- const expiresDate = new Date(expires);
407
- const now = new Date();
408
- return Math.max(0, Math.floor((expiresDate.getTime() - now.getTime()) / 1000));
409
- }
410
- return 0;
411
- }