@revealui/core 0.0.1-pre.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -202
- package/README.md +108 -152
- package/dist/api/compression.d.ts +83 -0
- package/dist/api/compression.d.ts.map +1 -0
- package/dist/api/compression.js +233 -0
- package/dist/api/payload-optimization.d.ts +138 -0
- package/dist/api/payload-optimization.d.ts.map +1 -0
- package/dist/api/payload-optimization.js +320 -0
- package/dist/api/rate-limit.d.ts +113 -0
- package/dist/api/rate-limit.d.ts.map +1 -0
- package/dist/api/rate-limit.js +316 -0
- package/dist/api/response-cache.d.ts +125 -0
- package/dist/api/response-cache.d.ts.map +1 -0
- package/dist/api/response-cache.js +335 -0
- package/dist/api/rest.d.ts +54 -0
- package/dist/api/rest.d.ts.map +1 -0
- package/dist/api/rest.js +464 -0
- package/dist/auth/access.d.ts +25 -0
- package/dist/auth/access.d.ts.map +1 -0
- package/dist/auth/access.js +20 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/cache/query-cache.d.ts +98 -0
- package/dist/cache/query-cache.d.ts.map +1 -0
- package/dist/cache/query-cache.js +260 -0
- package/dist/caching/app-cache.d.ts +237 -0
- package/dist/caching/app-cache.d.ts.map +1 -0
- package/dist/caching/app-cache.js +430 -0
- package/dist/caching/cdn-config.d.ts +155 -0
- package/dist/caching/cdn-config.d.ts.map +1 -0
- package/dist/caching/cdn-config.js +411 -0
- package/dist/caching/edge-cache.d.ts +177 -0
- package/dist/caching/edge-cache.d.ts.map +1 -0
- package/dist/caching/edge-cache.js +385 -0
- package/dist/caching/service-worker.d.ts +154 -0
- package/dist/caching/service-worker.d.ts.map +1 -0
- package/dist/caching/service-worker.js +437 -0
- package/dist/client/admin/RichText.d.ts +12 -0
- package/dist/client/admin/RichText.d.ts.map +1 -0
- package/dist/client/admin/RichText.js +5 -0
- package/dist/client/admin/components/AdminDashboard.d.ts +7 -0
- package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -0
- package/dist/client/admin/components/AdminDashboard.js +318 -0
- package/dist/client/admin/components/CollectionList.d.ts +16 -0
- package/dist/client/admin/components/CollectionList.d.ts.map +1 -0
- package/dist/client/admin/components/CollectionList.js +67 -0
- package/dist/client/admin/components/DocumentForm.d.ts +11 -0
- package/dist/client/admin/components/DocumentForm.d.ts.map +1 -0
- package/dist/client/admin/components/DocumentForm.js +99 -0
- package/dist/client/admin/components/GlobalForm.d.ts +11 -0
- package/dist/client/admin/components/GlobalForm.d.ts.map +1 -0
- package/dist/client/admin/components/GlobalForm.js +74 -0
- package/dist/client/admin/i18n/en.d.ts +25 -0
- package/dist/client/admin/i18n/en.d.ts.map +1 -0
- package/dist/client/admin/i18n/en.js +25 -0
- package/dist/client/admin/index.d.ts +10 -0
- package/dist/client/admin/index.d.ts.map +1 -0
- package/dist/client/admin/index.js +10 -0
- package/dist/client/admin/layout.d.ts +10 -0
- package/dist/client/admin/layout.d.ts.map +1 -0
- package/dist/client/admin/layout.js +6 -0
- package/dist/client/admin/page.d.ts +38 -0
- package/dist/client/admin/page.d.ts.map +1 -0
- package/dist/client/admin/page.js +15 -0
- package/dist/client/admin/utils/apiClient.d.ts +110 -0
- package/dist/client/admin/utils/apiClient.d.ts.map +1 -0
- package/dist/client/admin/utils/apiClient.js +220 -0
- package/dist/client/admin/utils/auth.d.ts +23 -0
- package/dist/client/admin/utils/auth.d.ts.map +1 -0
- package/dist/client/admin/utils/auth.js +52 -0
- package/dist/client/admin/utils/index.d.ts +6 -0
- package/dist/client/admin/utils/index.d.ts.map +1 -0
- package/dist/client/admin/utils/index.js +5 -0
- package/dist/client/admin/utils/serializeConfig.d.ts +7 -0
- package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -0
- package/dist/client/admin/utils/serializeConfig.js +35 -0
- package/dist/client/hooks.d.ts +18 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +29 -0
- package/dist/client/http/client.d.ts +15 -0
- package/dist/client/http/client.d.ts.map +1 -0
- package/dist/client/http/client.js +49 -0
- package/dist/client/http/fetchBanner.d.ts +18 -0
- package/dist/client/http/fetchBanner.d.ts.map +1 -0
- package/dist/client/http/fetchBanner.js +44 -0
- package/dist/client/http/fetchCard.d.ts +18 -0
- package/dist/client/http/fetchCard.d.ts.map +1 -0
- package/dist/client/http/fetchCard.js +46 -0
- package/dist/client/http/fetchEvents.d.ts +18 -0
- package/dist/client/http/fetchEvents.d.ts.map +1 -0
- package/dist/client/http/fetchEvents.js +44 -0
- package/dist/client/http/fetchHero.d.ts +17 -0
- package/dist/client/http/fetchHero.d.ts.map +1 -0
- package/dist/client/http/fetchHero.js +55 -0
- package/dist/client/http/fetchMainInfos.d.ts +17 -0
- package/dist/client/http/fetchMainInfos.d.ts.map +1 -0
- package/dist/client/http/fetchMainInfos.js +44 -0
- package/dist/client/http/fetchVideos.d.ts +13 -0
- package/dist/client/http/fetchVideos.d.ts.map +1 -0
- package/dist/client/http/fetchVideos.js +36 -0
- package/dist/client/http/index.d.ts +19 -0
- package/dist/client/http/index.d.ts.map +1 -0
- package/dist/client/http/index.js +11 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/client/richtext/RichTextEditor.d.ts +48 -0
- package/dist/client/richtext/RichTextEditor.d.ts.map +1 -0
- package/dist/client/richtext/RichTextEditor.js +360 -0
- package/dist/client/richtext/components/ImageNodeComponent.d.ts +9 -0
- package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -0
- package/dist/client/richtext/components/ImageNodeComponent.js +99 -0
- package/dist/client/richtext/components/ImageUploadButton.d.ts +11 -0
- package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -0
- package/dist/client/richtext/components/ImageUploadButton.js +103 -0
- package/dist/client/richtext/index.d.ts +92 -0
- package/dist/client/richtext/index.d.ts.map +1 -0
- package/dist/client/richtext/index.js +74 -0
- package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts +20 -0
- package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -0
- package/dist/client/richtext/nodes/DecoratorBlockNode.js +29 -0
- package/dist/client/richtext/nodes/ImageNode.d.ts +51 -0
- package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -0
- package/dist/client/richtext/nodes/ImageNode.js +95 -0
- package/dist/client/richtext/plugins/CollaborationPlugin.d.ts +13 -0
- package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/CollaborationPlugin.js +8 -0
- package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts +4 -0
- package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/CursorsOverlayPlugin.js +50 -0
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts +7 -0
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.js +248 -0
- package/dist/client/richtext/plugins/ImagePlugin.d.ts +3 -0
- package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/ImagePlugin.js +73 -0
- package/dist/client/richtext/plugins/PastePlugin.d.ts +2 -0
- package/dist/client/richtext/plugins/PastePlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/PastePlugin.js +36 -0
- package/dist/client/richtext/plugins/ToolbarPlugin.d.ts +8 -0
- package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -0
- package/dist/client/richtext/plugins/ToolbarPlugin.js +204 -0
- package/dist/client/ui/index.d.ts +111 -0
- package/dist/client/ui/index.d.ts.map +1 -0
- package/dist/client/ui/index.js +130 -0
- package/dist/collections/CollectionOperations.d.ts +27 -0
- package/dist/collections/CollectionOperations.d.ts.map +1 -0
- package/dist/collections/CollectionOperations.js +34 -0
- package/dist/collections/hooks.d.ts +11 -0
- package/dist/collections/hooks.d.ts.map +1 -0
- package/dist/collections/hooks.js +35 -0
- package/dist/collections/index.d.ts +2 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +1 -0
- package/dist/collections/operations/create.d.ts +10 -0
- package/dist/collections/operations/create.d.ts.map +1 -0
- package/dist/collections/operations/create.js +101 -0
- package/dist/collections/operations/delete.d.ts +10 -0
- package/dist/collections/operations/delete.d.ts.map +1 -0
- package/dist/collections/operations/delete.js +16 -0
- package/dist/collections/operations/fieldHooks.d.ts +21 -0
- package/dist/collections/operations/fieldHooks.d.ts.map +1 -0
- package/dist/collections/operations/fieldHooks.js +51 -0
- package/dist/collections/operations/find.d.ts +10 -0
- package/dist/collections/operations/find.d.ts.map +1 -0
- package/dist/collections/operations/find.js +124 -0
- package/dist/collections/operations/findById.d.ts +15 -0
- package/dist/collections/operations/findById.d.ts.map +1 -0
- package/dist/collections/operations/findById.js +59 -0
- package/dist/collections/operations/update.d.ts +10 -0
- package/dist/collections/operations/update.d.ts.map +1 -0
- package/dist/collections/operations/update.js +134 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +61 -0
- package/dist/config/runtime.d.ts +22 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +32 -0
- package/dist/config/utils.d.ts +12 -0
- package/dist/config/utils.d.ts.map +1 -0
- package/dist/config/utils.js +34 -0
- package/dist/database/index.d.ts +1 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +6 -0
- package/dist/database/safe-parse.d.ts +26 -0
- package/dist/database/safe-parse.d.ts.map +1 -0
- package/dist/database/safe-parse.js +42 -0
- package/dist/database/ssl-config.d.ts +9 -0
- package/dist/database/ssl-config.d.ts.map +1 -0
- package/dist/database/ssl-config.js +7 -0
- package/dist/database/type-adapter.d.ts +113 -0
- package/dist/database/type-adapter.d.ts.map +1 -0
- package/dist/database/type-adapter.js +97 -0
- package/dist/database/universal-postgres.d.ts +45 -0
- package/dist/database/universal-postgres.d.ts.map +1 -0
- package/dist/database/universal-postgres.js +526 -0
- package/dist/dataloader.d.ts +26 -0
- package/dist/dataloader.d.ts.map +1 -0
- package/dist/dataloader.js +176 -0
- package/dist/error-handling/circuit-breaker.d.ts +262 -0
- package/dist/error-handling/circuit-breaker.d.ts.map +1 -0
- package/dist/error-handling/circuit-breaker.js +542 -0
- package/dist/error-handling/error-boundary.d.ts +94 -0
- package/dist/error-handling/error-boundary.d.ts.map +1 -0
- package/dist/error-handling/error-boundary.js +285 -0
- package/dist/error-handling/error-reporter.d.ts +214 -0
- package/dist/error-handling/error-reporter.d.ts.map +1 -0
- package/dist/error-handling/error-reporter.js +477 -0
- package/dist/error-handling/fallback-components.d.ts +131 -0
- package/dist/error-handling/fallback-components.d.ts.map +1 -0
- package/dist/error-handling/fallback-components.js +371 -0
- package/dist/error-handling/index.d.ts +16 -0
- package/dist/error-handling/index.d.ts.map +1 -0
- package/dist/error-handling/index.js +15 -0
- package/dist/error-handling/retry.d.ts +194 -0
- package/dist/error-handling/retry.d.ts.map +1 -0
- package/dist/error-handling/retry.js +450 -0
- package/dist/errors/index.d.ts +23 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +40 -0
- package/dist/factories/builders.d.ts +50 -0
- package/dist/factories/builders.d.ts.map +1 -0
- package/dist/factories/builders.js +77 -0
- package/dist/factories/index.d.ts +2 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +1 -0
- package/dist/features.d.ts +86 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +92 -0
- package/dist/fieldTraversal.d.ts +26 -0
- package/dist/fieldTraversal.d.ts.map +1 -0
- package/dist/fieldTraversal.js +132 -0
- package/dist/fields/config/types.d.ts +48 -0
- package/dist/fields/config/types.d.ts.map +1 -0
- package/dist/fields/config/types.js +20 -0
- package/dist/fields/getDefaultValue.d.ts +16 -0
- package/dist/fields/getDefaultValue.d.ts.map +1 -0
- package/dist/fields/getDefaultValue.js +20 -0
- package/dist/fields/getFieldPaths.d.ts +25 -0
- package/dist/fields/getFieldPaths.d.ts.map +1 -0
- package/dist/fields/getFieldPaths.js +23 -0
- package/dist/fields/hooks/afterRead/index.d.ts +36 -0
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -0
- package/dist/fields/hooks/afterRead/index.js +70 -0
- package/dist/fields/hooks/afterRead/promise.d.ts +46 -0
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -0
- package/dist/fields/hooks/afterRead/promise.js +178 -0
- package/dist/fields/hooks/afterRead/traverseFields.d.ts +44 -0
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -0
- package/dist/fields/hooks/afterRead/traverseFields.js +37 -0
- package/dist/generated/agents/index.d.ts +8 -0
- package/dist/generated/agents/index.d.ts.map +1 -0
- package/dist/generated/agents/index.js +7 -0
- package/dist/generated/components/index.d.ts +8 -0
- package/dist/generated/components/index.d.ts.map +1 -0
- package/dist/generated/components/index.js +7 -0
- package/dist/generated/functions/index.d.ts +8 -0
- package/dist/generated/functions/index.d.ts.map +1 -0
- package/dist/generated/functions/index.js +7 -0
- package/dist/generated/hooks/index.d.ts +8 -0
- package/dist/generated/hooks/index.d.ts.map +1 -0
- package/dist/generated/hooks/index.js +7 -0
- package/dist/generated/index.d.ts +10 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +9 -0
- package/dist/generated/plans/index.d.ts +8 -0
- package/dist/generated/plans/index.d.ts.map +1 -0
- package/dist/generated/plans/index.js +7 -0
- package/dist/generated/prompts/index.d.ts +8 -0
- package/dist/generated/prompts/index.d.ts.map +1 -0
- package/dist/generated/prompts/index.js +7 -0
- package/dist/generated/tools/index.d.ts +8 -0
- package/dist/generated/tools/index.d.ts.map +1 -0
- package/dist/generated/tools/index.js +7 -0
- package/dist/generated/types/cms.d.ts +1766 -0
- package/dist/generated/types/cms.d.ts.map +1 -0
- package/dist/generated/types/cms.js +12 -0
- package/dist/generated/types/index.d.ts +16 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +21 -0
- package/dist/generated/types/neon.d.ts +11 -0
- package/dist/generated/types/neon.d.ts.map +1 -0
- package/dist/generated/types/neon.js +11 -0
- package/dist/generated/types/supabase.d.ts +193 -0
- package/dist/generated/types/supabase.d.ts.map +1 -0
- package/dist/generated/types/supabase.js +5 -0
- package/dist/globals/GlobalOperations.d.ts +24 -0
- package/dist/globals/GlobalOperations.d.ts.map +1 -0
- package/dist/globals/GlobalOperations.js +149 -0
- package/dist/globals/index.d.ts +2 -0
- package/dist/globals/index.d.ts.map +1 -0
- package/dist/globals/index.js +1 -0
- package/dist/index.d.ts +64 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -33
- package/dist/instance/RevealUIInstance.d.ts +6 -0
- package/dist/instance/RevealUIInstance.d.ts.map +1 -0
- package/dist/instance/RevealUIInstance.js +306 -0
- package/dist/instance/index.d.ts +3 -0
- package/dist/instance/index.d.ts.map +1 -0
- package/dist/instance/index.js +2 -0
- package/dist/instance/logger.d.ts +31 -0
- package/dist/instance/logger.d.ts.map +1 -0
- package/dist/instance/logger.js +42 -0
- package/dist/instance/methods/create.d.ts +10 -0
- package/dist/instance/methods/create.d.ts.map +1 -0
- package/dist/instance/methods/create.js +41 -0
- package/dist/instance/methods/delete.d.ts +10 -0
- package/dist/instance/methods/delete.d.ts.map +1 -0
- package/dist/instance/methods/delete.js +27 -0
- package/dist/instance/methods/find.d.ts +10 -0
- package/dist/instance/methods/find.d.ts.map +1 -0
- package/dist/instance/methods/find.js +23 -0
- package/dist/instance/methods/findById.d.ts +13 -0
- package/dist/instance/methods/findById.d.ts.map +1 -0
- package/dist/instance/methods/findById.js +23 -0
- package/dist/instance/methods/hooks.d.ts +14 -0
- package/dist/instance/methods/hooks.d.ts.map +1 -0
- package/dist/instance/methods/hooks.js +34 -0
- package/dist/instance/methods/update.d.ts +10 -0
- package/dist/instance/methods/update.d.ts.map +1 -0
- package/dist/instance/methods/update.js +45 -0
- package/dist/license.d.ts +82 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +193 -0
- package/dist/monitoring/alerts.d.ts +118 -0
- package/dist/monitoring/alerts.d.ts.map +1 -0
- package/dist/monitoring/alerts.js +324 -0
- package/dist/monitoring/cleanup-manager.d.ts +71 -0
- package/dist/monitoring/cleanup-manager.d.ts.map +1 -0
- package/dist/monitoring/cleanup-manager.js +226 -0
- package/dist/monitoring/health-monitor.d.ts +22 -0
- package/dist/monitoring/health-monitor.d.ts.map +1 -0
- package/dist/monitoring/health-monitor.js +142 -0
- package/dist/monitoring/index.d.ts +14 -0
- package/dist/monitoring/index.d.ts.map +1 -0
- package/dist/monitoring/index.js +17 -0
- package/dist/monitoring/process-registry.d.ts +97 -0
- package/dist/monitoring/process-registry.d.ts.map +1 -0
- package/dist/monitoring/process-registry.js +222 -0
- package/dist/monitoring/query-monitor.d.ts +153 -0
- package/dist/monitoring/query-monitor.d.ts.map +1 -0
- package/dist/monitoring/query-monitor.js +209 -0
- package/dist/monitoring/types.d.ts +231 -0
- package/dist/monitoring/types.d.ts.map +1 -0
- package/dist/monitoring/types.js +42 -0
- package/dist/monitoring/zombie-detector.d.ts +81 -0
- package/dist/monitoring/zombie-detector.d.ts.map +1 -0
- package/dist/monitoring/zombie-detector.js +231 -0
- package/dist/nextjs/index.d.ts +4 -0
- package/dist/nextjs/index.d.ts.map +1 -0
- package/dist/nextjs/index.js +3 -0
- package/dist/nextjs/utilities.d.ts +5 -0
- package/dist/nextjs/utilities.d.ts.map +1 -0
- package/dist/nextjs/utilities.js +16 -0
- package/dist/nextjs/withRevealUI.d.ts +20 -0
- package/dist/nextjs/withRevealUI.d.ts.map +1 -0
- package/dist/nextjs/withRevealUI.js +181 -0
- package/dist/observability/alerts.d.ts +138 -0
- package/dist/observability/alerts.d.ts.map +1 -0
- package/dist/observability/alerts.js +390 -0
- package/dist/observability/health-check.d.ts +95 -0
- package/dist/observability/health-check.d.ts.map +1 -0
- package/dist/observability/health-check.js +375 -0
- package/dist/observability/index.d.ts +12 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +11 -0
- package/dist/observability/logger.d.ts +47 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +140 -0
- package/dist/observability/metrics.d.ts +205 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +429 -0
- package/dist/observability/tracing.d.ts +149 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +381 -0
- package/dist/optimization/asset-optimizer.d.ts +202 -0
- package/dist/optimization/asset-optimizer.d.ts.map +1 -0
- package/dist/optimization/asset-optimizer.js +312 -0
- package/dist/optimization/build-optimizer.d.ts +202 -0
- package/dist/optimization/build-optimizer.d.ts.map +1 -0
- package/dist/optimization/build-optimizer.js +271 -0
- package/dist/optimization/bundle-analyzer.d.ts +98 -0
- package/dist/optimization/bundle-analyzer.d.ts.map +1 -0
- package/dist/optimization/bundle-analyzer.js +322 -0
- package/dist/optimization/code-splitting.d.ts +131 -0
- package/dist/optimization/code-splitting.d.ts.map +1 -0
- package/dist/optimization/code-splitting.js +277 -0
- package/dist/plugin/index.d.ts +12 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +4 -0
- package/dist/plugins/form-builder.d.ts +115 -0
- package/dist/plugins/form-builder.d.ts.map +1 -0
- package/dist/plugins/form-builder.js +239 -0
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/nested-docs.d.ts +8 -0
- package/dist/plugins/nested-docs.d.ts.map +1 -0
- package/dist/plugins/nested-docs.js +67 -0
- package/dist/plugins/redirects.d.ts +17 -0
- package/dist/plugins/redirects.d.ts.map +1 -0
- package/dist/plugins/redirects.js +62 -0
- package/dist/queries/index.d.ts +2 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +1 -0
- package/dist/queries/queryBuilder.d.ts +47 -0
- package/dist/queries/queryBuilder.d.ts.map +1 -0
- package/dist/queries/queryBuilder.js +255 -0
- package/dist/relationships/analyzer.d.ts +39 -0
- package/dist/relationships/analyzer.d.ts.map +1 -0
- package/dist/relationships/analyzer.js +127 -0
- package/dist/relationships/index.d.ts +3 -0
- package/dist/relationships/index.d.ts.map +1 -0
- package/dist/relationships/index.js +2 -0
- package/dist/relationships/populate-helpers.d.ts +104 -0
- package/dist/relationships/populate-helpers.d.ts.map +1 -0
- package/dist/relationships/populate-helpers.js +187 -0
- package/dist/relationships/population.d.ts +42 -0
- package/dist/relationships/population.d.ts.map +1 -0
- package/dist/relationships/population.js +188 -0
- package/dist/revealui.d.ts +46 -0
- package/dist/revealui.d.ts.map +1 -0
- package/dist/revealui.js +92 -0
- package/dist/richtext/exports/client/rcc.d.ts +37 -0
- package/dist/richtext/exports/client/rcc.d.ts.map +1 -0
- package/dist/richtext/exports/client/rcc.js +182 -0
- package/dist/richtext/exports/server/rsc.d.ts +117 -0
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -0
- package/dist/richtext/exports/server/rsc.js +288 -0
- package/dist/richtext/index.d.ts +161 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +243 -0
- package/dist/richtext/lexical.d.ts +23 -0
- package/dist/richtext/lexical.d.ts.map +1 -0
- package/dist/richtext/lexical.js +35 -0
- package/dist/security/audit.d.ts +188 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +431 -0
- package/dist/security/auth.d.ts +241 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +476 -0
- package/dist/security/authorization.d.ts +235 -0
- package/dist/security/authorization.d.ts.map +1 -0
- package/dist/security/authorization.js +434 -0
- package/dist/security/encryption.d.ts +214 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +517 -0
- package/dist/security/gdpr.d.ts +300 -0
- package/dist/security/gdpr.d.ts.map +1 -0
- package/dist/security/gdpr.js +465 -0
- package/dist/security/headers.d.ts +182 -0
- package/dist/security/headers.d.ts.map +1 -0
- package/dist/security/headers.js +402 -0
- package/dist/security/index.d.ts +19 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +18 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/server/renderPage.d.ts +69 -0
- package/dist/server/renderPage.d.ts.map +1 -0
- package/dist/server/renderPage.js +109 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/vercel-blob.d.ts +17 -0
- package/dist/storage/vercel-blob.d.ts.map +1 -0
- package/dist/storage/vercel-blob.js +83 -0
- package/dist/translations/index.d.ts +17 -0
- package/dist/translations/index.d.ts.map +1 -0
- package/dist/translations/index.js +1 -0
- package/dist/types/access.d.ts +67 -0
- package/dist/types/access.d.ts.map +1 -0
- package/dist/types/access.js +8 -0
- package/dist/types/api.d.ts +57 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +8 -0
- package/dist/types/cms.d.ts +8 -0
- package/dist/types/cms.d.ts.map +1 -0
- package/dist/types/cms.js +6 -0
- package/dist/types/config.d.ts +152 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +9 -0
- package/dist/types/core.d.ts +11 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +9 -0
- package/dist/types/extensions.d.ts +116 -0
- package/dist/types/extensions.d.ts.map +1 -0
- package/dist/types/extensions.js +8 -0
- package/dist/types/frontend.d.ts +53 -0
- package/dist/types/frontend.d.ts.map +1 -0
- package/dist/types/frontend.js +7 -0
- package/dist/types/generated.d.ts +12 -0
- package/dist/types/generated.d.ts.map +1 -0
- package/dist/types/generated.js +10 -0
- package/dist/types/hooks.d.ts +53 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +8 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +61 -0
- package/dist/types/interfaces/app.d.ts +50 -0
- package/dist/types/interfaces/app.d.ts.map +1 -0
- package/dist/types/interfaces/app.js +5 -0
- package/dist/types/jobs.d.ts +112 -0
- package/dist/types/jobs.d.ts.map +1 -0
- package/dist/types/jobs.js +7 -0
- package/dist/types/legacy.d.ts +147 -0
- package/dist/types/legacy.d.ts.map +1 -0
- package/dist/types/legacy.js +8 -0
- package/dist/types/plugins.d.ts +17 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/plugins.js +8 -0
- package/dist/types/query.d.ts +99 -0
- package/dist/types/query.d.ts.map +1 -0
- package/dist/types/query.js +24 -0
- package/dist/types/request.d.ts +40 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +8 -0
- package/dist/types/richtext.d.ts +23 -0
- package/dist/types/richtext.d.ts.map +1 -0
- package/dist/types/richtext.js +8 -0
- package/dist/types/runtime.d.ts +216 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +9 -0
- package/dist/types/schema.d.ts +9 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +7 -0
- package/dist/types/user.d.ts +48 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +8 -0
- package/dist/utils/access-conversion.d.ts +17 -0
- package/dist/utils/access-conversion.d.ts.map +1 -0
- package/dist/utils/access-conversion.js +96 -0
- package/dist/utils/api-wrapper.d.ts +63 -0
- package/dist/utils/api-wrapper.d.ts.map +1 -0
- package/dist/utils/api-wrapper.js +151 -0
- package/dist/utils/block-conversion.d.ts +21 -0
- package/dist/utils/block-conversion.d.ts.map +1 -0
- package/dist/utils/block-conversion.js +109 -0
- package/dist/utils/cache.d.ts +86 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +154 -0
- package/dist/utils/deep-clone.d.ts +25 -0
- package/dist/utils/deep-clone.d.ts.map +1 -0
- package/dist/utils/deep-clone.js +115 -0
- package/dist/utils/error-responses.d.ts +57 -0
- package/dist/utils/error-responses.d.ts.map +1 -0
- package/dist/utils/error-responses.js +96 -0
- package/dist/utils/errors.d.ts +97 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +397 -0
- package/dist/utils/field-conversion.d.ts +40 -0
- package/dist/utils/field-conversion.d.ts.map +1 -0
- package/dist/utils/field-conversion.js +275 -0
- package/dist/utils/flattenResult.d.ts +7 -0
- package/dist/utils/flattenResult.d.ts.map +1 -0
- package/dist/utils/flattenResult.js +23 -0
- package/dist/utils/getBlockSelect.d.ts +12 -0
- package/dist/utils/getBlockSelect.d.ts.map +1 -0
- package/dist/utils/getBlockSelect.js +12 -0
- package/dist/utils/getSelectMode.d.ts +8 -0
- package/dist/utils/getSelectMode.d.ts.map +1 -0
- package/dist/utils/getSelectMode.js +21 -0
- package/dist/utils/isValidID.d.ts +5 -0
- package/dist/utils/isValidID.d.ts.map +1 -0
- package/dist/utils/isValidID.js +13 -0
- package/dist/utils/json-parsing.d.ts +48 -0
- package/dist/utils/json-parsing.d.ts.map +1 -0
- package/dist/utils/json-parsing.js +130 -0
- package/dist/utils/jwt-validation.d.ts +14 -0
- package/dist/utils/jwt-validation.d.ts.map +1 -0
- package/dist/utils/jwt-validation.js +36 -0
- package/dist/utils/logger-client.d.ts +32 -0
- package/dist/utils/logger-client.d.ts.map +1 -0
- package/dist/utils/logger-client.js +55 -0
- package/dist/utils/logger-server.d.ts +32 -0
- package/dist/utils/logger-server.d.ts.map +1 -0
- package/dist/utils/logger-server.js +68 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +12 -0
- package/dist/utils/request-context.d.ts +143 -0
- package/dist/utils/request-context.d.ts.map +1 -0
- package/dist/utils/request-context.js +168 -0
- package/dist/utils/request-headers.d.ts +15 -0
- package/dist/utils/request-headers.d.ts.map +1 -0
- package/dist/utils/request-headers.js +31 -0
- package/dist/utils/stripUnselectedFields.d.ts +10 -0
- package/dist/utils/stripUnselectedFields.d.ts.map +1 -0
- package/dist/utils/stripUnselectedFields.js +20 -0
- package/dist/utils/type-guards.d.ts +33 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +63 -0
- package/dist/utils/user.d.ts +14 -0
- package/dist/utils/user.d.ts.map +1 -0
- package/dist/utils/user.js +15 -0
- package/package.json +241 -724
- package/LICENSE_SUMMARY.md +0 -55
- package/NOTICE +0 -34
- package/dist/exports/RenderErrorPage.js +0 -3
- package/dist/exports/__internal.js +0 -3
- package/dist/exports/abort.js +0 -3
- package/dist/exports/bin-entry.js +0 -5
- package/dist/exports/client.js +0 -3
- package/dist/exports/config.js +0 -1
- package/dist/exports/helpers.js +0 -1
- package/dist/exports/index.js +0 -33
- package/dist/exports/plugin.js +0 -3
- package/dist/exports/prerender.js +0 -3
- package/dist/exports/router.js +0 -3
- package/dist/exports/routing.js +0 -3
- package/dist/exports/server.js +0 -3
- package/dist/exports/setup.js +0 -3
- package/dist/exports/types.js +0 -1
- package/dist/integration/styles.css +0 -141
- package/dist/shared/RenderErrorPage.d.ts +0 -3
- package/dist/shared/RenderErrorPage.js +0 -3
- package/dist/shared/abort.js +0 -3
- package/dist/shared/route/routing.js +0 -3
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Rate Limiting
|
|
3
|
+
*
|
|
4
|
+
* Implements rate limiting to prevent API abuse
|
|
5
|
+
*/
|
|
6
|
+
import { type NextRequest, NextResponse } from 'next/server';
|
|
7
|
+
interface RateLimitConfig {
|
|
8
|
+
windowMs: number;
|
|
9
|
+
maxRequests: number;
|
|
10
|
+
keyGenerator?: (request: NextRequest) => string;
|
|
11
|
+
skip?: (request: NextRequest) => boolean;
|
|
12
|
+
handler?: (request: NextRequest) => NextResponse;
|
|
13
|
+
}
|
|
14
|
+
interface RateLimitEntry {
|
|
15
|
+
count: number;
|
|
16
|
+
resetTime: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if rate limit exceeded
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkRateLimit(request: NextRequest, config: RateLimitConfig): {
|
|
22
|
+
allowed: boolean;
|
|
23
|
+
limit: number;
|
|
24
|
+
remaining: number;
|
|
25
|
+
resetTime: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Create rate limit middleware
|
|
29
|
+
*/
|
|
30
|
+
export declare function createRateLimitMiddleware(config: RateLimitConfig): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
31
|
+
/**
|
|
32
|
+
* Cleanup expired rate limit entries across all stores
|
|
33
|
+
*/
|
|
34
|
+
export declare function cleanupRateLimits(): number;
|
|
35
|
+
/**
|
|
36
|
+
* Start rate limit cleanup interval
|
|
37
|
+
*/
|
|
38
|
+
export declare function startRateLimitCleanup(intervalMs?: number): NodeJS.Timeout;
|
|
39
|
+
/**
|
|
40
|
+
* Get rate limit stats
|
|
41
|
+
*/
|
|
42
|
+
export declare function getRateLimitStats(): {
|
|
43
|
+
total: number;
|
|
44
|
+
active: number;
|
|
45
|
+
expired: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Rate limit presets
|
|
49
|
+
*/
|
|
50
|
+
export declare const RATE_LIMIT_PRESETS: {
|
|
51
|
+
readonly veryStrict: {
|
|
52
|
+
readonly windowMs: number;
|
|
53
|
+
readonly maxRequests: 10;
|
|
54
|
+
};
|
|
55
|
+
readonly strict: {
|
|
56
|
+
readonly windowMs: number;
|
|
57
|
+
readonly maxRequests: 30;
|
|
58
|
+
};
|
|
59
|
+
readonly standard: {
|
|
60
|
+
readonly windowMs: number;
|
|
61
|
+
readonly maxRequests: 100;
|
|
62
|
+
};
|
|
63
|
+
readonly relaxed: {
|
|
64
|
+
readonly windowMs: number;
|
|
65
|
+
readonly maxRequests: 500;
|
|
66
|
+
};
|
|
67
|
+
readonly hourly: {
|
|
68
|
+
readonly windowMs: number;
|
|
69
|
+
readonly maxRequests: 1000;
|
|
70
|
+
};
|
|
71
|
+
readonly daily: {
|
|
72
|
+
readonly windowMs: number;
|
|
73
|
+
readonly maxRequests: 10000;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Rate limit by user ID
|
|
78
|
+
*/
|
|
79
|
+
export declare function createUserRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
80
|
+
/**
|
|
81
|
+
* Rate limit by API key
|
|
82
|
+
*/
|
|
83
|
+
export declare function createAPIKeyRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
84
|
+
/**
|
|
85
|
+
* Rate limit by endpoint
|
|
86
|
+
*/
|
|
87
|
+
export declare function createEndpointRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
88
|
+
export declare function checkSlidingWindowRateLimit(request: NextRequest, config: RateLimitConfig): {
|
|
89
|
+
allowed: boolean;
|
|
90
|
+
limit: number;
|
|
91
|
+
remaining: number;
|
|
92
|
+
};
|
|
93
|
+
export declare function checkTokenBucketRateLimit(request: NextRequest, config: RateLimitConfig & {
|
|
94
|
+
refillRate: number;
|
|
95
|
+
}): {
|
|
96
|
+
allowed: boolean;
|
|
97
|
+
limit: number;
|
|
98
|
+
remaining: number;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Clear rate limit for specific key
|
|
102
|
+
*/
|
|
103
|
+
export declare function clearRateLimit(key: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Clear all rate limits
|
|
106
|
+
*/
|
|
107
|
+
export declare function clearAllRateLimits(): void;
|
|
108
|
+
/**
|
|
109
|
+
* Get rate limit info for key
|
|
110
|
+
*/
|
|
111
|
+
export declare function getRateLimitInfo(key: string): RateLimitEntry | null;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAA;IAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAA;IACxC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,CAAA;CACjD;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACtB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CA0CA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,IACjD,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAiBtE;AA8BD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,GAAE,MAAc,GAAG,MAAM,CAAC,OAAO,CAOhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB;;;;EAkBhC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;CAoCrB,CAAA;AAEV;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aAhKxD,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAyKtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aA9K1D,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAsLtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aA3L5D,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAqMtE;AAWD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACtB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CA4BA;AAYD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/C;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAqCA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEnE"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Rate Limiting
|
|
3
|
+
*
|
|
4
|
+
* Implements rate limiting to prevent API abuse
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from 'next/server';
|
|
7
|
+
import { logger } from '../observability/logger.js';
|
|
8
|
+
// In-memory store (replace with Redis in production)
|
|
9
|
+
const rateLimitStore = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Default key generator (by IP address)
|
|
12
|
+
*/
|
|
13
|
+
function defaultKeyGenerator(request) {
|
|
14
|
+
// Try to get real IP from headers
|
|
15
|
+
const forwarded = request.headers.get('x-forwarded-for');
|
|
16
|
+
const realIp = request.headers.get('x-real-ip');
|
|
17
|
+
if (forwarded) {
|
|
18
|
+
const parts = forwarded.split(',');
|
|
19
|
+
return parts[0]?.trim() || 'unknown';
|
|
20
|
+
}
|
|
21
|
+
if (realIp) {
|
|
22
|
+
return realIp;
|
|
23
|
+
}
|
|
24
|
+
// Fallback to unknown (NextRequest doesn't have ip property)
|
|
25
|
+
return 'unknown';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if rate limit exceeded
|
|
29
|
+
*/
|
|
30
|
+
export function checkRateLimit(request, config) {
|
|
31
|
+
const { windowMs, maxRequests, keyGenerator = defaultKeyGenerator, skip } = config;
|
|
32
|
+
// Skip rate limiting if configured
|
|
33
|
+
if (skip?.(request)) {
|
|
34
|
+
return {
|
|
35
|
+
allowed: true,
|
|
36
|
+
limit: maxRequests,
|
|
37
|
+
remaining: maxRequests,
|
|
38
|
+
resetTime: Date.now() + windowMs,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Get key
|
|
42
|
+
const key = keyGenerator(request);
|
|
43
|
+
// Get or create entry
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
let entry = rateLimitStore.get(key);
|
|
46
|
+
// Reset if window expired
|
|
47
|
+
if (!entry || now > entry.resetTime) {
|
|
48
|
+
entry = {
|
|
49
|
+
count: 0,
|
|
50
|
+
resetTime: now + windowMs,
|
|
51
|
+
};
|
|
52
|
+
rateLimitStore.set(key, entry);
|
|
53
|
+
}
|
|
54
|
+
// Increment count
|
|
55
|
+
entry.count++;
|
|
56
|
+
// Check limit
|
|
57
|
+
const allowed = entry.count <= maxRequests;
|
|
58
|
+
const remaining = Math.max(0, maxRequests - entry.count);
|
|
59
|
+
return {
|
|
60
|
+
allowed,
|
|
61
|
+
limit: maxRequests,
|
|
62
|
+
remaining,
|
|
63
|
+
resetTime: entry.resetTime,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create rate limit middleware
|
|
68
|
+
*/
|
|
69
|
+
export function createRateLimitMiddleware(config) {
|
|
70
|
+
return async (request, next) => {
|
|
71
|
+
const result = checkRateLimit(request, config);
|
|
72
|
+
// Set rate limit headers
|
|
73
|
+
const response = result.allowed
|
|
74
|
+
? await next()
|
|
75
|
+
: config.handler
|
|
76
|
+
? config.handler(request)
|
|
77
|
+
: createRateLimitResponse(result);
|
|
78
|
+
// Add rate limit headers
|
|
79
|
+
response.headers.set('X-RateLimit-Limit', result.limit.toString());
|
|
80
|
+
response.headers.set('X-RateLimit-Remaining', result.remaining.toString());
|
|
81
|
+
response.headers.set('X-RateLimit-Reset', new Date(result.resetTime).toISOString());
|
|
82
|
+
return response;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create rate limit exceeded response
|
|
87
|
+
*/
|
|
88
|
+
function createRateLimitResponse(result) {
|
|
89
|
+
const retryAfter = Math.ceil((result.resetTime - Date.now()) / 1000);
|
|
90
|
+
return NextResponse.json({
|
|
91
|
+
error: 'Too Many Requests',
|
|
92
|
+
message: 'Rate limit exceeded. Please try again later.',
|
|
93
|
+
limit: result.limit,
|
|
94
|
+
remaining: result.remaining,
|
|
95
|
+
resetTime: new Date(result.resetTime).toISOString(),
|
|
96
|
+
retryAfter,
|
|
97
|
+
}, {
|
|
98
|
+
status: 429,
|
|
99
|
+
headers: {
|
|
100
|
+
'Retry-After': retryAfter.toString(),
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Cleanup expired rate limit entries across all stores
|
|
106
|
+
*/
|
|
107
|
+
export function cleanupRateLimits() {
|
|
108
|
+
const now = Date.now();
|
|
109
|
+
let cleaned = 0;
|
|
110
|
+
for (const [key, entry] of rateLimitStore.entries()) {
|
|
111
|
+
if (now > entry.resetTime) {
|
|
112
|
+
rateLimitStore.delete(key);
|
|
113
|
+
cleaned++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Evict stale sliding window entries (no timestamps within last hour)
|
|
117
|
+
for (const [key, entry] of slidingWindowStore.entries()) {
|
|
118
|
+
entry.timestamps = entry.timestamps.filter((ts) => now - ts < 3_600_000);
|
|
119
|
+
if (entry.timestamps.length === 0) {
|
|
120
|
+
slidingWindowStore.delete(key);
|
|
121
|
+
cleaned++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Evict stale token bucket entries (idle for more than 1 hour)
|
|
125
|
+
for (const [key, entry] of tokenBucketStore.entries()) {
|
|
126
|
+
if (now - entry.lastRefill > 3_600_000) {
|
|
127
|
+
tokenBucketStore.delete(key);
|
|
128
|
+
cleaned++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return cleaned;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Start rate limit cleanup interval
|
|
135
|
+
*/
|
|
136
|
+
export function startRateLimitCleanup(intervalMs = 60000) {
|
|
137
|
+
return setInterval(() => {
|
|
138
|
+
const cleaned = cleanupRateLimits();
|
|
139
|
+
if (cleaned > 0) {
|
|
140
|
+
logger.info('Cleaned up expired rate limit entries', { count: cleaned });
|
|
141
|
+
}
|
|
142
|
+
}, intervalMs);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get rate limit stats
|
|
146
|
+
*/
|
|
147
|
+
export function getRateLimitStats() {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
let active = 0;
|
|
150
|
+
let expired = 0;
|
|
151
|
+
for (const entry of rateLimitStore.values()) {
|
|
152
|
+
if (now > entry.resetTime) {
|
|
153
|
+
expired++;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
active++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
total: rateLimitStore.size,
|
|
161
|
+
active,
|
|
162
|
+
expired,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Rate limit presets
|
|
167
|
+
*/
|
|
168
|
+
export const RATE_LIMIT_PRESETS = {
|
|
169
|
+
// Very strict (10 requests per minute)
|
|
170
|
+
veryStrict: {
|
|
171
|
+
windowMs: 60 * 1000,
|
|
172
|
+
maxRequests: 10,
|
|
173
|
+
},
|
|
174
|
+
// Strict (30 requests per minute)
|
|
175
|
+
strict: {
|
|
176
|
+
windowMs: 60 * 1000,
|
|
177
|
+
maxRequests: 30,
|
|
178
|
+
},
|
|
179
|
+
// Standard (100 requests per minute)
|
|
180
|
+
standard: {
|
|
181
|
+
windowMs: 60 * 1000,
|
|
182
|
+
maxRequests: 100,
|
|
183
|
+
},
|
|
184
|
+
// Relaxed (500 requests per minute)
|
|
185
|
+
relaxed: {
|
|
186
|
+
windowMs: 60 * 1000,
|
|
187
|
+
maxRequests: 500,
|
|
188
|
+
},
|
|
189
|
+
// Per hour (1000 requests per hour)
|
|
190
|
+
hourly: {
|
|
191
|
+
windowMs: 60 * 60 * 1000,
|
|
192
|
+
maxRequests: 1000,
|
|
193
|
+
},
|
|
194
|
+
// Per day (10000 requests per day)
|
|
195
|
+
daily: {
|
|
196
|
+
windowMs: 24 * 60 * 60 * 1000,
|
|
197
|
+
maxRequests: 10000,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Rate limit by user ID
|
|
202
|
+
*/
|
|
203
|
+
export function createUserRateLimit(config) {
|
|
204
|
+
return createRateLimitMiddleware({
|
|
205
|
+
...config,
|
|
206
|
+
keyGenerator: (request) => {
|
|
207
|
+
// Get user ID from auth header or session
|
|
208
|
+
const userId = request.headers.get('x-user-id') || 'anonymous';
|
|
209
|
+
return `user:${userId}`;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Rate limit by API key
|
|
215
|
+
*/
|
|
216
|
+
export function createAPIKeyRateLimit(config) {
|
|
217
|
+
return createRateLimitMiddleware({
|
|
218
|
+
...config,
|
|
219
|
+
keyGenerator: (request) => {
|
|
220
|
+
const apiKey = request.headers.get('x-api-key') || 'unknown';
|
|
221
|
+
return `apikey:${apiKey}`;
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Rate limit by endpoint
|
|
227
|
+
*/
|
|
228
|
+
export function createEndpointRateLimit(config) {
|
|
229
|
+
return createRateLimitMiddleware({
|
|
230
|
+
...config,
|
|
231
|
+
keyGenerator: (request) => {
|
|
232
|
+
const ip = defaultKeyGenerator(request);
|
|
233
|
+
const url = new URL(request.url);
|
|
234
|
+
const path = url.pathname;
|
|
235
|
+
return `${ip}:${path}`;
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
const slidingWindowStore = new Map();
|
|
240
|
+
export function checkSlidingWindowRateLimit(request, config) {
|
|
241
|
+
const { windowMs, maxRequests, keyGenerator = defaultKeyGenerator } = config;
|
|
242
|
+
const key = keyGenerator(request);
|
|
243
|
+
const now = Date.now();
|
|
244
|
+
// Get or create entry
|
|
245
|
+
let entry = slidingWindowStore.get(key);
|
|
246
|
+
if (!entry) {
|
|
247
|
+
entry = { timestamps: [] };
|
|
248
|
+
slidingWindowStore.set(key, entry);
|
|
249
|
+
}
|
|
250
|
+
// Remove expired timestamps
|
|
251
|
+
entry.timestamps = entry.timestamps.filter((ts) => now - ts < windowMs);
|
|
252
|
+
// Check limit
|
|
253
|
+
const allowed = entry.timestamps.length < maxRequests;
|
|
254
|
+
if (allowed) {
|
|
255
|
+
entry.timestamps.push(now);
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
allowed,
|
|
259
|
+
limit: maxRequests,
|
|
260
|
+
remaining: Math.max(0, maxRequests - entry.timestamps.length),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const tokenBucketStore = new Map();
|
|
264
|
+
export function checkTokenBucketRateLimit(request, config) {
|
|
265
|
+
const { maxRequests, refillRate, windowMs, keyGenerator = defaultKeyGenerator } = config;
|
|
266
|
+
const key = keyGenerator(request);
|
|
267
|
+
const now = Date.now();
|
|
268
|
+
// Get or create entry
|
|
269
|
+
let entry = tokenBucketStore.get(key);
|
|
270
|
+
if (!entry) {
|
|
271
|
+
entry = {
|
|
272
|
+
tokens: maxRequests,
|
|
273
|
+
lastRefill: now,
|
|
274
|
+
};
|
|
275
|
+
tokenBucketStore.set(key, entry);
|
|
276
|
+
}
|
|
277
|
+
// Refill tokens
|
|
278
|
+
const timePassed = now - entry.lastRefill;
|
|
279
|
+
const tokensToAdd = Math.floor((timePassed / windowMs) * refillRate);
|
|
280
|
+
if (tokensToAdd > 0) {
|
|
281
|
+
entry.tokens = Math.min(maxRequests, entry.tokens + tokensToAdd);
|
|
282
|
+
entry.lastRefill = now;
|
|
283
|
+
}
|
|
284
|
+
// Check if tokens available
|
|
285
|
+
const allowed = entry.tokens > 0;
|
|
286
|
+
if (allowed) {
|
|
287
|
+
entry.tokens--;
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
allowed,
|
|
291
|
+
limit: maxRequests,
|
|
292
|
+
remaining: entry.tokens,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Clear rate limit for specific key
|
|
297
|
+
*/
|
|
298
|
+
export function clearRateLimit(key) {
|
|
299
|
+
rateLimitStore.delete(key);
|
|
300
|
+
slidingWindowStore.delete(key);
|
|
301
|
+
tokenBucketStore.delete(key);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Clear all rate limits
|
|
305
|
+
*/
|
|
306
|
+
export function clearAllRateLimits() {
|
|
307
|
+
rateLimitStore.clear();
|
|
308
|
+
slidingWindowStore.clear();
|
|
309
|
+
tokenBucketStore.clear();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get rate limit info for key
|
|
313
|
+
*/
|
|
314
|
+
export function getRateLimitInfo(key) {
|
|
315
|
+
return rateLimitStore.get(key) || null;
|
|
316
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Response Caching Layer
|
|
3
|
+
*
|
|
4
|
+
* Implements HTTP caching for API responses
|
|
5
|
+
*/
|
|
6
|
+
import { type NextRequest, NextResponse } from 'next/server';
|
|
7
|
+
interface CacheOptions {
|
|
8
|
+
ttl?: number;
|
|
9
|
+
staleWhileRevalidate?: number;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
vary?: string[];
|
|
12
|
+
private?: boolean;
|
|
13
|
+
noStore?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate cache key from request
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateCacheKey(request: NextRequest): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get cached response
|
|
21
|
+
*/
|
|
22
|
+
export declare function getCachedResponse(request: NextRequest): Promise<NextResponse | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Set cached response
|
|
25
|
+
*/
|
|
26
|
+
export declare function setCachedResponse(request: NextRequest, response: NextResponse, options?: CacheOptions): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Invalidate cache by key
|
|
29
|
+
*/
|
|
30
|
+
export declare function invalidateCacheKey(key: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Invalidate cache by pattern
|
|
33
|
+
*/
|
|
34
|
+
export declare function invalidateCachePattern(pattern: string): number;
|
|
35
|
+
/**
|
|
36
|
+
* Invalidate cache by tags
|
|
37
|
+
*/
|
|
38
|
+
export declare function invalidateCacheTags(tags: string[]): number;
|
|
39
|
+
/**
|
|
40
|
+
* Clear all cache
|
|
41
|
+
*/
|
|
42
|
+
export declare function clearCache(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Set Cache-Control headers
|
|
45
|
+
*/
|
|
46
|
+
export declare function setCacheHeaders(response: NextResponse, options: CacheOptions): NextResponse;
|
|
47
|
+
/**
|
|
48
|
+
* Create caching middleware
|
|
49
|
+
*/
|
|
50
|
+
export declare function createCacheMiddleware(options?: CacheOptions): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
51
|
+
/**
|
|
52
|
+
* Get cache statistics
|
|
53
|
+
*/
|
|
54
|
+
export declare function getCacheStats(): {
|
|
55
|
+
totalEntries: number;
|
|
56
|
+
validEntries: number;
|
|
57
|
+
expiredEntries: number;
|
|
58
|
+
totalSize: number;
|
|
59
|
+
averageSize: number;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Purge expired entries
|
|
63
|
+
*/
|
|
64
|
+
export declare function purgeExpiredCache(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Start cache cleanup interval
|
|
67
|
+
*/
|
|
68
|
+
export declare function startCacheCleanup(intervalMs?: number): NodeJS.Timeout;
|
|
69
|
+
/**
|
|
70
|
+
* Cache response with ETag
|
|
71
|
+
*/
|
|
72
|
+
export declare function withETag(response: NextResponse, content: string): NextResponse;
|
|
73
|
+
/**
|
|
74
|
+
* Check if request has matching ETag
|
|
75
|
+
*/
|
|
76
|
+
export declare function checkETag(request: NextRequest, etag: string): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Create 304 Not Modified response
|
|
79
|
+
*/
|
|
80
|
+
export declare function createNotModifiedResponse(): NextResponse;
|
|
81
|
+
/**
|
|
82
|
+
* Cache presets for common scenarios
|
|
83
|
+
*/
|
|
84
|
+
export declare const CACHE_PRESETS: {
|
|
85
|
+
readonly noCache: {
|
|
86
|
+
readonly noStore: true;
|
|
87
|
+
};
|
|
88
|
+
readonly short: {
|
|
89
|
+
readonly ttl: 60;
|
|
90
|
+
readonly staleWhileRevalidate: 30;
|
|
91
|
+
};
|
|
92
|
+
readonly medium: {
|
|
93
|
+
readonly ttl: 300;
|
|
94
|
+
readonly staleWhileRevalidate: 60;
|
|
95
|
+
};
|
|
96
|
+
readonly long: {
|
|
97
|
+
readonly ttl: 3600;
|
|
98
|
+
readonly staleWhileRevalidate: 300;
|
|
99
|
+
};
|
|
100
|
+
readonly veryLong: {
|
|
101
|
+
readonly ttl: 86400;
|
|
102
|
+
readonly staleWhileRevalidate: 3600;
|
|
103
|
+
};
|
|
104
|
+
readonly immutable: {
|
|
105
|
+
readonly ttl: 31536000;
|
|
106
|
+
readonly private: false;
|
|
107
|
+
};
|
|
108
|
+
readonly private: {
|
|
109
|
+
readonly ttl: 300;
|
|
110
|
+
readonly private: true;
|
|
111
|
+
};
|
|
112
|
+
readonly public: {
|
|
113
|
+
readonly ttl: 3600;
|
|
114
|
+
readonly private: false;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Cache API response
|
|
119
|
+
*/
|
|
120
|
+
export declare function cacheAPIResponse<T>(key: string, responseFn: () => Promise<T>, options?: CacheOptions): Promise<{
|
|
121
|
+
data: T;
|
|
122
|
+
cached: boolean;
|
|
123
|
+
}>;
|
|
124
|
+
export {};
|
|
125
|
+
//# sourceMappingURL=response-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-cache.d.ts","sourceRoot":"","sources":["../../src/api/response-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAiBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAW7D;AAyBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0B1F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAW1D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,CA6B3F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,YAAiB,IAChD,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAqBtE;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;;EA0B5B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAc1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,GAAE,MAAc,GAAG,MAAM,CAAC,OAAO,CAO5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAQ9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,YAAY,CAKxD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChB,CAAA;AAEV;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC5B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCvC"}
|