@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.
- package/dist/api/compression.d.ts.map +1 -1
- package/dist/api/payload-optimization.d.ts.map +1 -1
- package/dist/api/rate-limit.d.ts +29 -28
- package/dist/api/rate-limit.d.ts.map +1 -1
- package/dist/api/rate-limit.js +63 -3
- package/dist/api/response-cache.d.ts.map +1 -1
- package/dist/api/response-cache.js +1 -1
- package/dist/api/rest.d.ts.map +1 -1
- package/dist/api/rest.js +3 -2
- package/dist/auth/access.d.ts.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/cache/query-cache.d.ts +12 -10
- package/dist/cache/query-cache.d.ts.map +1 -1
- package/dist/cache/query-cache.js +38 -42
- package/dist/caching/index.d.ts +6 -0
- package/dist/caching/index.d.ts.map +1 -0
- package/dist/caching/index.js +5 -0
- package/dist/client/admin/RichText.d.ts +1 -1
- package/dist/client/admin/RichText.d.ts.map +1 -1
- package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -1
- package/dist/client/admin/components/AdminDashboard.js +195 -205
- package/dist/client/admin/components/CollectionList.d.ts.map +1 -1
- package/dist/client/admin/components/DocumentForm.d.ts.map +1 -1
- package/dist/client/admin/components/DocumentForm.js +130 -6
- package/dist/client/admin/components/GlobalForm.d.ts.map +1 -1
- package/dist/client/admin/context/ServerFunctionContext.d.ts +8 -0
- package/dist/client/admin/context/ServerFunctionContext.d.ts.map +1 -0
- package/dist/client/admin/context/ServerFunctionContext.js +15 -0
- package/dist/client/admin/i18n/en.d.ts.map +1 -1
- package/dist/client/admin/index.d.ts +1 -0
- package/dist/client/admin/index.d.ts.map +1 -1
- package/dist/client/admin/index.js +1 -0
- package/dist/client/admin/layout.d.ts +1 -1
- package/dist/client/admin/layout.d.ts.map +1 -1
- package/dist/client/admin/layout.js +3 -2
- package/dist/client/admin/page.d.ts.map +1 -1
- package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
- package/dist/client/admin/utils/apiClient.js +0 -4
- package/dist/client/admin/utils/index.d.ts +0 -1
- package/dist/client/admin/utils/index.d.ts.map +1 -1
- package/dist/client/admin/utils/index.js +0 -1
- package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -1
- package/dist/client/hooks.d.ts.map +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/richtext/RichTextEditor.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageNodeComponent.js +0 -1
- package/dist/client/richtext/components/ImageUploadButton.d.ts +2 -0
- package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageUploadButton.js +30 -15
- package/dist/client/richtext/index.d.ts.map +1 -1
- package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -1
- package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -1
- package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.js +1 -3
- package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -1
- package/dist/client/ui/index.d.ts.map +1 -1
- package/dist/client/ui/index.js +1 -1
- package/dist/collections/CollectionOperations.d.ts +7 -7
- package/dist/collections/CollectionOperations.d.ts.map +1 -1
- package/dist/collections/CollectionOperations.js +15 -1
- package/dist/collections/hooks.d.ts.map +1 -1
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/operations/create.d.ts +4 -5
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +35 -6
- package/dist/collections/operations/createMany.d.ts +12 -0
- package/dist/collections/operations/createMany.d.ts.map +1 -0
- package/dist/collections/operations/createMany.js +43 -0
- package/dist/collections/operations/delete.d.ts +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +31 -2
- package/dist/collections/operations/deleteMany.d.ts +11 -0
- package/dist/collections/operations/deleteMany.d.ts.map +1 -0
- package/dist/collections/operations/deleteMany.js +50 -0
- package/dist/collections/operations/fieldHooks.d.ts +2 -2
- package/dist/collections/operations/fieldHooks.d.ts.map +1 -1
- package/dist/collections/operations/fieldHooks.js +4 -4
- package/dist/collections/operations/find.d.ts +2 -4
- package/dist/collections/operations/find.d.ts.map +1 -1
- package/dist/collections/operations/find.js +115 -8
- package/dist/collections/operations/findById.d.ts +3 -4
- package/dist/collections/operations/findById.d.ts.map +1 -1
- package/dist/collections/operations/findById.js +53 -1
- package/dist/collections/operations/sqlAdapter.d.ts +23 -0
- package/dist/collections/operations/sqlAdapter.d.ts.map +1 -0
- package/dist/collections/operations/sqlAdapter.js +76 -0
- package/dist/collections/operations/update.d.ts +3 -5
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +103 -11
- package/dist/collections/operations/updateMany.d.ts +11 -0
- package/dist/collections/operations/updateMany.d.ts.map +1 -0
- package/dist/collections/operations/updateMany.js +52 -0
- package/dist/collections/registry.d.ts +12 -0
- package/dist/collections/registry.d.ts.map +1 -0
- package/dist/collections/registry.js +38 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/utils.d.ts +0 -10
- package/dist/config/utils.d.ts.map +1 -1
- package/dist/config/utils.js +0 -13
- package/dist/database/index.d.ts +3 -0
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +1 -5
- package/dist/database/safe-parse.d.ts.map +1 -1
- package/dist/database/ssl-config.d.ts.map +1 -1
- package/dist/database/type-adapter.d.ts.map +1 -1
- package/dist/database/universal-postgres.d.ts.map +1 -1
- package/dist/database/universal-postgres.js +6 -1
- package/dist/dataloader.d.ts.map +1 -1
- package/dist/error-handling/error-boundary.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.d.ts +1 -1
- package/dist/error-handling/error-reporter.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.js +19 -5
- package/dist/error-handling/fallback-components.d.ts.map +1 -1
- package/dist/error-handling/fallback-components.js +1 -1
- package/dist/error-handling/index.d.ts +2 -4
- package/dist/error-handling/index.d.ts.map +1 -1
- package/dist/error-handling/index.js +1 -4
- package/dist/factories/builders.d.ts.map +1 -1
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/features.d.ts +7 -7
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +2 -2
- package/dist/fieldTraversal.d.ts.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/getDefaultValue.d.ts.map +1 -1
- package/dist/fields/getFieldPaths.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/generated/types/cms.d.ts.map +1 -1
- package/dist/generated/types/cms.js +0 -1
- package/dist/generated/types/neon.d.ts.map +1 -1
- package/dist/generated/types/neon.js +4 -2
- package/dist/globals/GlobalOperations.d.ts.map +1 -1
- package/dist/globals/GlobalOperations.js +16 -4
- package/dist/globals/index.d.ts.map +1 -1
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -5
- package/dist/instance/RevealUIInstance.d.ts.map +1 -1
- package/dist/instance/RevealUIInstance.js +6 -19
- package/dist/instance/index.d.ts.map +1 -1
- package/dist/instance/logger.d.ts.map +1 -1
- package/dist/instance/methods/create.d.ts.map +1 -1
- package/dist/instance/methods/create.js +0 -3
- package/dist/instance/methods/delete.d.ts.map +1 -1
- package/dist/instance/methods/delete.js +1 -4
- package/dist/instance/methods/find.d.ts.map +1 -1
- package/dist/instance/methods/find.js +0 -3
- package/dist/instance/methods/findById.d.ts.map +1 -1
- package/dist/instance/methods/findById.js +0 -3
- package/dist/instance/methods/hooks.d.ts.map +1 -1
- package/dist/instance/methods/update.d.ts.map +1 -1
- package/dist/instance/methods/update.js +0 -3
- package/dist/jobs/index.d.ts +16 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +14 -0
- package/dist/jobs/queue.d.ts +57 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +134 -0
- package/dist/license-encryption.d.ts +21 -0
- package/dist/license-encryption.d.ts.map +1 -0
- package/dist/license-encryption.js +74 -0
- package/dist/license.d.ts +26 -3
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +87 -7
- package/dist/monitoring/alerts.d.ts +4 -4
- package/dist/monitoring/alerts.d.ts.map +1 -1
- package/dist/monitoring/cleanup-manager.d.ts.map +1 -1
- package/dist/monitoring/health-monitor.d.ts.map +1 -1
- package/dist/monitoring/index.d.ts.map +1 -1
- package/dist/monitoring/process-registry.d.ts.map +1 -1
- package/dist/monitoring/query-monitor.d.ts.map +1 -1
- package/dist/monitoring/types.d.ts.map +1 -1
- package/dist/monitoring/zombie-detector.d.ts.map +1 -1
- package/dist/monitoring/zombie-detector.js +5 -0
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/utilities.d.ts.map +1 -1
- package/dist/nextjs/withRevealUI.d.ts.map +1 -1
- package/dist/observability/alerts.d.ts.map +1 -1
- package/dist/observability/alerts.js +1 -2
- package/dist/observability/health-check.d.ts +0 -4
- package/dist/observability/health-check.d.ts.map +1 -1
- package/dist/observability/health-check.js +0 -36
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +1 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/tracing.d.ts.map +1 -1
- package/dist/observability/tracing.js +0 -1
- package/dist/plugins/form-builder.d.ts.map +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/nested-docs.d.ts +4 -0
- package/dist/plugins/nested-docs.d.ts.map +1 -1
- package/dist/plugins/nested-docs.js +50 -6
- package/dist/plugins/redirects.d.ts.map +1 -1
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/queryBuilder.d.ts.map +1 -1
- package/dist/queries/queryBuilder.js +13 -5
- package/dist/relationships/analyzer.d.ts.map +1 -1
- package/dist/relationships/analyzer.js +8 -0
- package/dist/relationships/index.d.ts.map +1 -1
- package/dist/relationships/populate-core.d.ts +57 -0
- package/dist/relationships/populate-core.d.ts.map +1 -0
- package/dist/relationships/populate-core.js +116 -0
- package/dist/relationships/populate-helpers.d.ts +5 -51
- package/dist/relationships/populate-helpers.d.ts.map +1 -1
- package/dist/relationships/populate-helpers.js +4 -109
- package/dist/relationships/population.d.ts +1 -9
- package/dist/relationships/population.d.ts.map +1 -1
- package/dist/relationships/population.js +8 -3
- package/dist/revealui.d.ts.map +1 -1
- package/dist/richtext/exports/client/rcc.d.ts.map +1 -1
- package/dist/richtext/exports/client/rcc.js +1 -1
- package/dist/richtext/exports/server/rsc.d.ts +17 -0
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
- package/dist/richtext/exports/server/rsc.js +61 -5
- package/dist/richtext/index.d.ts.map +1 -1
- package/dist/richtext/lexical.d.ts.map +1 -1
- package/dist/security/index.d.ts +3 -16
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +3 -16
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/renderPage.d.ts.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -4
- package/dist/storage/vercel-blob.d.ts.map +1 -1
- package/dist/storage/vercel-blob.js +3 -0
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/types/access.d.ts.map +1 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/cms.d.ts.map +1 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +1 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/extensions.d.ts.map +1 -1
- package/dist/types/frontend.d.ts.map +1 -1
- package/dist/types/generated.d.ts.map +1 -1
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces/app.d.ts.map +1 -1
- package/dist/types/jobs.d.ts.map +1 -1
- package/dist/types/legacy.d.ts.map +1 -1
- package/dist/types/plugins.d.ts.map +1 -1
- package/dist/types/query.d.ts.map +1 -1
- package/dist/types/request.d.ts.map +1 -1
- package/dist/types/richtext.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +60 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/user.d.ts.map +1 -1
- package/dist/utils/access-conversion.d.ts.map +1 -1
- package/dist/utils/api-wrapper.d.ts.map +1 -1
- package/dist/utils/api-wrapper.js +1 -1
- package/dist/utils/block-conversion.d.ts.map +1 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/deep-clone.js +0 -1
- package/dist/utils/error-responses.d.ts.map +1 -1
- package/dist/utils/error-responses.js +2 -3
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +103 -0
- package/dist/utils/field-conversion.d.ts +1 -1
- package/dist/utils/field-conversion.d.ts.map +1 -1
- package/dist/utils/flattenResult.d.ts.map +1 -1
- package/dist/utils/flattenResult.js +0 -1
- package/dist/utils/getBlockSelect.d.ts.map +1 -1
- package/dist/utils/getSelectMode.d.ts.map +1 -1
- package/dist/utils/isValidID.d.ts.map +1 -1
- package/dist/utils/json-parsing.d.ts.map +1 -1
- package/dist/utils/logger-client.d.ts.map +1 -1
- package/dist/utils/logger-server.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/request-context.d.ts.map +1 -1
- package/dist/utils/stripUnselectedFields.d.ts.map +1 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/package.json +58 -26
- package/dist/caching/app-cache.d.ts +0 -237
- package/dist/caching/app-cache.d.ts.map +0 -1
- package/dist/caching/app-cache.js +0 -430
- package/dist/caching/cdn-config.d.ts +0 -155
- package/dist/caching/cdn-config.d.ts.map +0 -1
- package/dist/caching/cdn-config.js +0 -411
- package/dist/caching/edge-cache.d.ts +0 -177
- package/dist/caching/edge-cache.d.ts.map +0 -1
- package/dist/caching/edge-cache.js +0 -385
- package/dist/caching/service-worker.d.ts +0 -154
- package/dist/caching/service-worker.d.ts.map +0 -1
- package/dist/caching/service-worker.js +0 -437
- package/dist/client/admin/utils/auth.d.ts +0 -23
- package/dist/client/admin/utils/auth.d.ts.map +0 -1
- package/dist/client/admin/utils/auth.js +0 -52
- package/dist/client/http/client.d.ts +0 -15
- package/dist/client/http/client.d.ts.map +0 -1
- package/dist/client/http/client.js +0 -49
- package/dist/client/http/fetchBanner.d.ts +0 -18
- package/dist/client/http/fetchBanner.d.ts.map +0 -1
- package/dist/client/http/fetchBanner.js +0 -44
- package/dist/client/http/fetchCard.d.ts +0 -18
- package/dist/client/http/fetchCard.d.ts.map +0 -1
- package/dist/client/http/fetchCard.js +0 -46
- package/dist/client/http/fetchEvents.d.ts +0 -18
- package/dist/client/http/fetchEvents.d.ts.map +0 -1
- package/dist/client/http/fetchEvents.js +0 -44
- package/dist/client/http/fetchHero.d.ts +0 -17
- package/dist/client/http/fetchHero.d.ts.map +0 -1
- package/dist/client/http/fetchHero.js +0 -55
- package/dist/client/http/fetchMainInfos.d.ts +0 -17
- package/dist/client/http/fetchMainInfos.d.ts.map +0 -1
- package/dist/client/http/fetchMainInfos.js +0 -44
- package/dist/client/http/fetchVideos.d.ts +0 -13
- package/dist/client/http/fetchVideos.d.ts.map +0 -1
- package/dist/client/http/fetchVideos.js +0 -36
- package/dist/client/http/index.d.ts +0 -19
- package/dist/client/http/index.d.ts.map +0 -1
- package/dist/client/http/index.js +0 -11
- package/dist/error-handling/circuit-breaker.d.ts +0 -262
- package/dist/error-handling/circuit-breaker.d.ts.map +0 -1
- package/dist/error-handling/circuit-breaker.js +0 -542
- package/dist/error-handling/retry.d.ts +0 -194
- package/dist/error-handling/retry.d.ts.map +0 -1
- package/dist/error-handling/retry.js +0 -450
- package/dist/errors/index.d.ts +0 -23
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -40
- package/dist/generated/agents/index.d.ts +0 -8
- package/dist/generated/agents/index.d.ts.map +0 -1
- package/dist/generated/agents/index.js +0 -7
- package/dist/generated/components/index.d.ts +0 -8
- package/dist/generated/components/index.d.ts.map +0 -1
- package/dist/generated/components/index.js +0 -7
- package/dist/generated/functions/index.d.ts +0 -8
- package/dist/generated/functions/index.d.ts.map +0 -1
- package/dist/generated/functions/index.js +0 -7
- package/dist/generated/hooks/index.d.ts +0 -8
- package/dist/generated/hooks/index.d.ts.map +0 -1
- package/dist/generated/hooks/index.js +0 -7
- package/dist/generated/plans/index.d.ts +0 -8
- package/dist/generated/plans/index.d.ts.map +0 -1
- package/dist/generated/plans/index.js +0 -7
- package/dist/generated/prompts/index.d.ts +0 -8
- package/dist/generated/prompts/index.d.ts.map +0 -1
- package/dist/generated/prompts/index.js +0 -7
- package/dist/generated/tools/index.d.ts +0 -8
- package/dist/generated/tools/index.d.ts.map +0 -1
- package/dist/generated/tools/index.js +0 -7
- package/dist/generated/types/supabase.d.ts +0 -193
- package/dist/generated/types/supabase.d.ts.map +0 -1
- package/dist/generated/types/supabase.js +0 -5
- package/dist/optimization/asset-optimizer.d.ts +0 -202
- package/dist/optimization/asset-optimizer.d.ts.map +0 -1
- package/dist/optimization/asset-optimizer.js +0 -312
- package/dist/optimization/build-optimizer.d.ts +0 -202
- package/dist/optimization/build-optimizer.d.ts.map +0 -1
- package/dist/optimization/build-optimizer.js +0 -271
- package/dist/optimization/bundle-analyzer.d.ts +0 -98
- package/dist/optimization/bundle-analyzer.d.ts.map +0 -1
- package/dist/optimization/bundle-analyzer.js +0 -322
- package/dist/optimization/code-splitting.d.ts +0 -131
- package/dist/optimization/code-splitting.d.ts.map +0 -1
- package/dist/optimization/code-splitting.js +0 -277
- package/dist/plugin/index.d.ts +0 -12
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js +0 -4
- package/dist/security/audit.d.ts +0 -188
- package/dist/security/audit.d.ts.map +0 -1
- package/dist/security/audit.js +0 -431
- package/dist/security/auth.d.ts +0 -241
- package/dist/security/auth.d.ts.map +0 -1
- package/dist/security/auth.js +0 -476
- package/dist/security/authorization.d.ts +0 -235
- package/dist/security/authorization.d.ts.map +0 -1
- package/dist/security/authorization.js +0 -434
- package/dist/security/encryption.d.ts +0 -214
- package/dist/security/encryption.d.ts.map +0 -1
- package/dist/security/encryption.js +0 -517
- package/dist/security/gdpr.d.ts +0 -300
- package/dist/security/gdpr.d.ts.map +0 -1
- package/dist/security/gdpr.js +0 -465
- package/dist/security/headers.d.ts +0 -182
- package/dist/security/headers.d.ts.map +0 -1
- package/dist/security/headers.js +0 -402
- package/dist/utils/jwt-validation.d.ts +0 -14
- package/dist/utils/jwt-validation.d.ts.map +0 -1
- package/dist/utils/jwt-validation.js +0 -36
- package/dist/utils/request-headers.d.ts +0 -15
- package/dist/utils/request-headers.d.ts.map +0 -1
- package/dist/utils/request-headers.js +0 -31
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Edge Caching and ISR (Incremental Static Regeneration)
|
|
3
|
-
*
|
|
4
|
-
* Utilities for Next.js edge caching, ISR, and on-demand revalidation
|
|
5
|
-
*/
|
|
6
|
-
import type { NextRequest, NextResponse } from 'next/server';
|
|
7
|
-
/**
|
|
8
|
-
* ISR Configuration
|
|
9
|
-
*/
|
|
10
|
-
export interface ISRConfig {
|
|
11
|
-
revalidate?: number | false;
|
|
12
|
-
tags?: string[];
|
|
13
|
-
dynamicParams?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export declare const ISR_PRESETS: {
|
|
16
|
-
readonly always: {
|
|
17
|
-
readonly revalidate: 0;
|
|
18
|
-
};
|
|
19
|
-
readonly minute: {
|
|
20
|
-
readonly revalidate: 60;
|
|
21
|
-
};
|
|
22
|
-
readonly fiveMinutes: {
|
|
23
|
-
readonly revalidate: 300;
|
|
24
|
-
};
|
|
25
|
-
readonly hourly: {
|
|
26
|
-
readonly revalidate: 3600;
|
|
27
|
-
};
|
|
28
|
-
readonly daily: {
|
|
29
|
-
readonly revalidate: 86400;
|
|
30
|
-
};
|
|
31
|
-
readonly never: {
|
|
32
|
-
readonly revalidate: false;
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Generate static params for ISR
|
|
37
|
-
*/
|
|
38
|
-
export declare function generateStaticParams<T>(fetchFn: () => Promise<T[]>, mapFn: (item: T) => Record<string, string>): Promise<Array<Record<string, string>>>;
|
|
39
|
-
/**
|
|
40
|
-
* Revalidate tag
|
|
41
|
-
*/
|
|
42
|
-
export declare function revalidateTag(tag: string, secret?: string): Promise<{
|
|
43
|
-
revalidated: boolean;
|
|
44
|
-
error?: string;
|
|
45
|
-
}>;
|
|
46
|
-
/**
|
|
47
|
-
* Revalidate path
|
|
48
|
-
*/
|
|
49
|
-
export declare function revalidatePath(path: string, secret?: string): Promise<{
|
|
50
|
-
revalidated: boolean;
|
|
51
|
-
error?: string;
|
|
52
|
-
}>;
|
|
53
|
-
/**
|
|
54
|
-
* Revalidate multiple paths
|
|
55
|
-
*/
|
|
56
|
-
export declare function revalidatePaths(paths: string[], secret?: string): Promise<{
|
|
57
|
-
revalidated: number;
|
|
58
|
-
failed: number;
|
|
59
|
-
errors: Array<{
|
|
60
|
-
path: string;
|
|
61
|
-
error: string;
|
|
62
|
-
}>;
|
|
63
|
-
}>;
|
|
64
|
-
/**
|
|
65
|
-
* Revalidate multiple tags
|
|
66
|
-
*/
|
|
67
|
-
export declare function revalidateTags(tags: string[], secret?: string): Promise<{
|
|
68
|
-
revalidated: number;
|
|
69
|
-
failed: number;
|
|
70
|
-
errors: Array<{
|
|
71
|
-
tag: string;
|
|
72
|
-
error: string;
|
|
73
|
-
}>;
|
|
74
|
-
}>;
|
|
75
|
-
/**
|
|
76
|
-
* Edge middleware cache configuration
|
|
77
|
-
*/
|
|
78
|
-
export interface EdgeCacheConfig {
|
|
79
|
-
cache?: 'force-cache' | 'no-cache' | 'no-store' | 'only-if-cached';
|
|
80
|
-
next?: {
|
|
81
|
-
revalidate?: number | false;
|
|
82
|
-
tags?: string[];
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create edge cached fetch
|
|
87
|
-
*/
|
|
88
|
-
export declare function createEdgeCachedFetch(config?: EdgeCacheConfig): <T>(url: string, options?: RequestInit) => Promise<T>;
|
|
89
|
-
/**
|
|
90
|
-
* Unstable cache wrapper (Next.js 14+)
|
|
91
|
-
*/
|
|
92
|
-
export declare function createCachedFunction<TArgs extends unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>, _options?: {
|
|
93
|
-
tags?: string[];
|
|
94
|
-
revalidate?: number | false;
|
|
95
|
-
}): (...args: TArgs) => Promise<TReturn>;
|
|
96
|
-
/**
|
|
97
|
-
* Edge rate limiting with cache
|
|
98
|
-
*/
|
|
99
|
-
export interface EdgeRateLimitConfig {
|
|
100
|
-
limit: number;
|
|
101
|
-
window: number;
|
|
102
|
-
key?: (request: NextRequest) => string;
|
|
103
|
-
}
|
|
104
|
-
export declare class EdgeRateLimiter {
|
|
105
|
-
private config;
|
|
106
|
-
private cache;
|
|
107
|
-
constructor(config: EdgeRateLimitConfig);
|
|
108
|
-
/**
|
|
109
|
-
* Check rate limit
|
|
110
|
-
*/
|
|
111
|
-
check(request: NextRequest): {
|
|
112
|
-
allowed: boolean;
|
|
113
|
-
limit: number;
|
|
114
|
-
remaining: number;
|
|
115
|
-
reset: number;
|
|
116
|
-
};
|
|
117
|
-
/**
|
|
118
|
-
* Clean up expired entries
|
|
119
|
-
*/
|
|
120
|
-
cleanup(): void;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Edge geolocation caching
|
|
124
|
-
*/
|
|
125
|
-
export interface GeoLocation {
|
|
126
|
-
country?: string;
|
|
127
|
-
region?: string;
|
|
128
|
-
city?: string;
|
|
129
|
-
latitude?: number;
|
|
130
|
-
longitude?: number;
|
|
131
|
-
}
|
|
132
|
-
export declare function getGeoLocation(request: NextRequest): GeoLocation | null;
|
|
133
|
-
/**
|
|
134
|
-
* Edge A/B testing with cache
|
|
135
|
-
*/
|
|
136
|
-
export declare function getABTestVariant(request: NextRequest, testName: string, variants: string[]): string;
|
|
137
|
-
/**
|
|
138
|
-
* Edge personalization cache
|
|
139
|
-
*/
|
|
140
|
-
export interface PersonalizationConfig {
|
|
141
|
-
userId?: string;
|
|
142
|
-
preferences?: Record<string, unknown>;
|
|
143
|
-
location?: GeoLocation;
|
|
144
|
-
device?: 'mobile' | 'tablet' | 'desktop';
|
|
145
|
-
variant?: string;
|
|
146
|
-
}
|
|
147
|
-
export declare function getPersonalizationConfig(request: NextRequest): PersonalizationConfig;
|
|
148
|
-
/**
|
|
149
|
-
* Edge cache headers helper
|
|
150
|
-
*/
|
|
151
|
-
export declare function setEdgeCacheHeaders(response: NextResponse, config: {
|
|
152
|
-
maxAge?: number;
|
|
153
|
-
sMaxAge?: number;
|
|
154
|
-
staleWhileRevalidate?: number;
|
|
155
|
-
tags?: string[];
|
|
156
|
-
}): NextResponse;
|
|
157
|
-
/**
|
|
158
|
-
* Preload links for critical resources
|
|
159
|
-
*/
|
|
160
|
-
export declare function addPreloadLinks(response: NextResponse, resources: Array<{
|
|
161
|
-
href: string;
|
|
162
|
-
as: string;
|
|
163
|
-
type?: string;
|
|
164
|
-
crossorigin?: boolean;
|
|
165
|
-
}>): NextResponse;
|
|
166
|
-
/**
|
|
167
|
-
* Cache warming for ISR pages
|
|
168
|
-
*/
|
|
169
|
-
export declare function warmISRCache(paths: string[], baseURL?: string): Promise<{
|
|
170
|
-
warmed: number;
|
|
171
|
-
failed: number;
|
|
172
|
-
errors: Array<{
|
|
173
|
-
path: string;
|
|
174
|
-
error: string;
|
|
175
|
-
}>;
|
|
176
|
-
}>;
|
|
177
|
-
//# sourceMappingURL=edge-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edge-cache.d.ts","sourceRoot":"","sources":["../../src/caching/edge-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Edge Caching and ISR (Incremental Static Regeneration)
|
|
3
|
-
*
|
|
4
|
-
* Utilities for Next.js edge caching, ISR, and on-demand revalidation
|
|
5
|
-
*/
|
|
6
|
-
import { logger } from '../observability/logger.js';
|
|
7
|
-
export const ISR_PRESETS = {
|
|
8
|
-
// Revalidate every request
|
|
9
|
-
always: {
|
|
10
|
-
revalidate: 0,
|
|
11
|
-
},
|
|
12
|
-
// Revalidate every minute
|
|
13
|
-
minute: {
|
|
14
|
-
revalidate: 60,
|
|
15
|
-
},
|
|
16
|
-
// Revalidate every 5 minutes
|
|
17
|
-
fiveMinutes: {
|
|
18
|
-
revalidate: 300,
|
|
19
|
-
},
|
|
20
|
-
// Revalidate every hour
|
|
21
|
-
hourly: {
|
|
22
|
-
revalidate: 3600,
|
|
23
|
-
},
|
|
24
|
-
// Revalidate daily
|
|
25
|
-
daily: {
|
|
26
|
-
revalidate: 86400,
|
|
27
|
-
},
|
|
28
|
-
// Never revalidate (static)
|
|
29
|
-
never: {
|
|
30
|
-
revalidate: false,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Generate static params for ISR
|
|
35
|
-
*/
|
|
36
|
-
export async function generateStaticParams(fetchFn, mapFn) {
|
|
37
|
-
try {
|
|
38
|
-
const items = await fetchFn();
|
|
39
|
-
return items.map(mapFn);
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
logger.error('Failed to generate static params', error instanceof Error ? error : new Error(String(error)));
|
|
43
|
-
return [];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Revalidate tag
|
|
48
|
-
*/
|
|
49
|
-
export async function revalidateTag(tag, secret) {
|
|
50
|
-
try {
|
|
51
|
-
const url = new URL('/api/revalidate', process.env.NEXT_PUBLIC_URL || 'http://localhost:3000');
|
|
52
|
-
const headers = { 'Content-Type': 'application/json' };
|
|
53
|
-
if (secret) {
|
|
54
|
-
headers['x-revalidate-secret'] = secret;
|
|
55
|
-
}
|
|
56
|
-
const response = await fetch(url.toString(), {
|
|
57
|
-
method: 'POST',
|
|
58
|
-
headers,
|
|
59
|
-
body: JSON.stringify({ tag }),
|
|
60
|
-
});
|
|
61
|
-
const data = await response.json();
|
|
62
|
-
return {
|
|
63
|
-
revalidated: response.ok,
|
|
64
|
-
error: data.error,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
return {
|
|
69
|
-
revalidated: false,
|
|
70
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Revalidate path
|
|
76
|
-
*/
|
|
77
|
-
export async function revalidatePath(path, secret) {
|
|
78
|
-
try {
|
|
79
|
-
const url = new URL('/api/revalidate', process.env.NEXT_PUBLIC_URL || 'http://localhost:3000');
|
|
80
|
-
const headers = { 'Content-Type': 'application/json' };
|
|
81
|
-
if (secret) {
|
|
82
|
-
headers['x-revalidate-secret'] = secret;
|
|
83
|
-
}
|
|
84
|
-
const response = await fetch(url.toString(), {
|
|
85
|
-
method: 'POST',
|
|
86
|
-
headers,
|
|
87
|
-
body: JSON.stringify({ path }),
|
|
88
|
-
});
|
|
89
|
-
const data = await response.json();
|
|
90
|
-
return {
|
|
91
|
-
revalidated: response.ok,
|
|
92
|
-
error: data.error,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
return {
|
|
97
|
-
revalidated: false,
|
|
98
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Revalidate multiple paths
|
|
104
|
-
*/
|
|
105
|
-
export async function revalidatePaths(paths, secret) {
|
|
106
|
-
const results = await Promise.allSettled(paths.map((path) => revalidatePath(path, secret)));
|
|
107
|
-
let revalidated = 0;
|
|
108
|
-
let failed = 0;
|
|
109
|
-
const errors = [];
|
|
110
|
-
for (let i = 0; i < results.length; i++) {
|
|
111
|
-
const result = results[i];
|
|
112
|
-
const path = paths[i];
|
|
113
|
-
if (!(result && path)) {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
if (result.status === 'fulfilled' && result.value.revalidated) {
|
|
117
|
-
revalidated++;
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
failed++;
|
|
121
|
-
const error = result.status === 'fulfilled'
|
|
122
|
-
? result.value.error || 'Unknown error'
|
|
123
|
-
: String(result.reason) || 'Unknown error';
|
|
124
|
-
errors.push({ path, error });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return { revalidated, failed, errors };
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Revalidate multiple tags
|
|
131
|
-
*/
|
|
132
|
-
export async function revalidateTags(tags, secret) {
|
|
133
|
-
const results = await Promise.allSettled(tags.map((tag) => revalidateTag(tag, secret)));
|
|
134
|
-
let revalidated = 0;
|
|
135
|
-
let failed = 0;
|
|
136
|
-
const errors = [];
|
|
137
|
-
for (let i = 0; i < results.length; i++) {
|
|
138
|
-
const result = results[i];
|
|
139
|
-
const tag = tags[i];
|
|
140
|
-
if (!(result && tag)) {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
if (result.status === 'fulfilled' && result.value.revalidated) {
|
|
144
|
-
revalidated++;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
failed++;
|
|
148
|
-
const error = result.status === 'fulfilled'
|
|
149
|
-
? result.value.error || 'Unknown error'
|
|
150
|
-
: String(result.reason) || 'Unknown error';
|
|
151
|
-
errors.push({ tag, error });
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return { revalidated, failed, errors };
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Create edge cached fetch
|
|
158
|
-
*/
|
|
159
|
-
export function createEdgeCachedFetch(config = {}) {
|
|
160
|
-
return async (url, options) => {
|
|
161
|
-
const fetchOptions = {
|
|
162
|
-
...options,
|
|
163
|
-
...config,
|
|
164
|
-
next: {
|
|
165
|
-
...options?.next,
|
|
166
|
-
...config.next,
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
const response = await fetch(url, fetchOptions);
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
throw new Error(`Fetch failed: ${response.statusText}`);
|
|
172
|
-
}
|
|
173
|
-
return response.json();
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Unstable cache wrapper (Next.js 14+)
|
|
178
|
-
*/
|
|
179
|
-
export function createCachedFunction(fn, _options = {}) {
|
|
180
|
-
// In production, this would use Next.js unstable_cache
|
|
181
|
-
// For now, return the function as-is
|
|
182
|
-
return fn;
|
|
183
|
-
}
|
|
184
|
-
export class EdgeRateLimiter {
|
|
185
|
-
config;
|
|
186
|
-
cache = new Map();
|
|
187
|
-
constructor(config) {
|
|
188
|
-
this.config = config;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Check rate limit
|
|
192
|
-
*/
|
|
193
|
-
check(request) {
|
|
194
|
-
const key = this.config.key
|
|
195
|
-
? this.config.key(request)
|
|
196
|
-
: request.headers.get('x-forwarded-for') || 'unknown';
|
|
197
|
-
const now = Date.now();
|
|
198
|
-
let entry = this.cache.get(key);
|
|
199
|
-
// Reset if window expired
|
|
200
|
-
if (!entry || now > entry.resetTime) {
|
|
201
|
-
entry = {
|
|
202
|
-
count: 0,
|
|
203
|
-
resetTime: now + this.config.window,
|
|
204
|
-
};
|
|
205
|
-
this.cache.set(key, entry);
|
|
206
|
-
}
|
|
207
|
-
// Increment count
|
|
208
|
-
entry.count++;
|
|
209
|
-
const allowed = entry.count <= this.config.limit;
|
|
210
|
-
const remaining = Math.max(0, this.config.limit - entry.count);
|
|
211
|
-
return {
|
|
212
|
-
allowed,
|
|
213
|
-
limit: this.config.limit,
|
|
214
|
-
remaining,
|
|
215
|
-
reset: entry.resetTime,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Clean up expired entries
|
|
220
|
-
*/
|
|
221
|
-
cleanup() {
|
|
222
|
-
const now = Date.now();
|
|
223
|
-
for (const [key, entry] of this.cache.entries()) {
|
|
224
|
-
if (now > entry.resetTime) {
|
|
225
|
-
this.cache.delete(key);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
export function getGeoLocation(request) {
|
|
231
|
-
// Vercel edge headers
|
|
232
|
-
const country = request.headers.get('x-vercel-ip-country');
|
|
233
|
-
const region = request.headers.get('x-vercel-ip-country-region');
|
|
234
|
-
const city = request.headers.get('x-vercel-ip-city');
|
|
235
|
-
const latitude = request.headers.get('x-vercel-ip-latitude');
|
|
236
|
-
const longitude = request.headers.get('x-vercel-ip-longitude');
|
|
237
|
-
if (!country) {
|
|
238
|
-
// Cloudflare headers
|
|
239
|
-
const cfCountry = request.headers.get('cf-ipcountry');
|
|
240
|
-
if (cfCountry) {
|
|
241
|
-
return {
|
|
242
|
-
country: cfCountry,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
return null;
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
country: country || undefined,
|
|
249
|
-
region: region || undefined,
|
|
250
|
-
city: city ? decodeURIComponent(city) : undefined,
|
|
251
|
-
latitude: latitude ? parseFloat(latitude) : undefined,
|
|
252
|
-
longitude: longitude ? parseFloat(longitude) : undefined,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Edge A/B testing with cache
|
|
257
|
-
*/
|
|
258
|
-
export function getABTestVariant(request, testName, variants) {
|
|
259
|
-
// Check cookie first
|
|
260
|
-
const cookieName = `ab-test-${testName}`;
|
|
261
|
-
const cookieVariant = request.cookies.get(cookieName)?.value;
|
|
262
|
-
if (cookieVariant && variants.includes(cookieVariant)) {
|
|
263
|
-
return cookieVariant;
|
|
264
|
-
}
|
|
265
|
-
// Assign variant based on IP hash
|
|
266
|
-
const ip = request.headers.get('x-forwarded-for') || 'unknown';
|
|
267
|
-
const hash = simpleHash(ip + testName);
|
|
268
|
-
const variantIndex = hash % variants.length;
|
|
269
|
-
const variant = variants[variantIndex];
|
|
270
|
-
if (!variant) {
|
|
271
|
-
throw new Error('No variant found for A/B test');
|
|
272
|
-
}
|
|
273
|
-
return variant;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Simple hash function
|
|
277
|
-
*/
|
|
278
|
-
function simpleHash(str) {
|
|
279
|
-
let hash = 0;
|
|
280
|
-
for (let i = 0; i < str.length; i++) {
|
|
281
|
-
const char = str.charCodeAt(i);
|
|
282
|
-
hash = (hash << 5) - hash + char;
|
|
283
|
-
hash = hash & hash;
|
|
284
|
-
}
|
|
285
|
-
return Math.abs(hash);
|
|
286
|
-
}
|
|
287
|
-
export function getPersonalizationConfig(request) {
|
|
288
|
-
const userAgent = request.headers.get('user-agent') || '';
|
|
289
|
-
const device = getDeviceType(userAgent);
|
|
290
|
-
const location = getGeoLocation(request);
|
|
291
|
-
return {
|
|
292
|
-
userId: request.cookies.get('user-id')?.value,
|
|
293
|
-
location: location || undefined,
|
|
294
|
-
device,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Detect device type
|
|
299
|
-
*/
|
|
300
|
-
function getDeviceType(userAgent) {
|
|
301
|
-
if (/mobile/i.test(userAgent) && !/tablet|ipad/i.test(userAgent)) {
|
|
302
|
-
return 'mobile';
|
|
303
|
-
}
|
|
304
|
-
if (/tablet|ipad/i.test(userAgent)) {
|
|
305
|
-
return 'tablet';
|
|
306
|
-
}
|
|
307
|
-
return 'desktop';
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Edge cache headers helper
|
|
311
|
-
*/
|
|
312
|
-
export function setEdgeCacheHeaders(response, config) {
|
|
313
|
-
const cacheControl = [];
|
|
314
|
-
if (config.maxAge !== undefined) {
|
|
315
|
-
cacheControl.push(`max-age=${config.maxAge}`);
|
|
316
|
-
}
|
|
317
|
-
if (config.sMaxAge !== undefined) {
|
|
318
|
-
cacheControl.push(`s-maxage=${config.sMaxAge}`);
|
|
319
|
-
}
|
|
320
|
-
if (config.staleWhileRevalidate !== undefined) {
|
|
321
|
-
cacheControl.push(`stale-while-revalidate=${config.staleWhileRevalidate}`);
|
|
322
|
-
}
|
|
323
|
-
if (cacheControl.length > 0) {
|
|
324
|
-
response.headers.set('Cache-Control', cacheControl.join(', '));
|
|
325
|
-
}
|
|
326
|
-
if (config.tags && config.tags.length > 0) {
|
|
327
|
-
response.headers.set('Cache-Tag', config.tags.join(','));
|
|
328
|
-
}
|
|
329
|
-
return response;
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Preload links for critical resources
|
|
333
|
-
*/
|
|
334
|
-
export function addPreloadLinks(response, resources) {
|
|
335
|
-
const links = resources.map((resource) => {
|
|
336
|
-
const attrs = [`<${resource.href}>`, `rel="preload"`, `as="${resource.as}"`];
|
|
337
|
-
if (resource.type) {
|
|
338
|
-
attrs.push(`type="${resource.type}"`);
|
|
339
|
-
}
|
|
340
|
-
if (resource.crossorigin) {
|
|
341
|
-
attrs.push('crossorigin');
|
|
342
|
-
}
|
|
343
|
-
return attrs.join('; ');
|
|
344
|
-
});
|
|
345
|
-
if (links.length > 0) {
|
|
346
|
-
response.headers.set('Link', links.join(', '));
|
|
347
|
-
}
|
|
348
|
-
return response;
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Cache warming for ISR pages
|
|
352
|
-
*/
|
|
353
|
-
export async function warmISRCache(paths, baseURL = process.env.NEXT_PUBLIC_URL || 'http://localhost:3000') {
|
|
354
|
-
const results = await Promise.allSettled(paths.map(async (path) => {
|
|
355
|
-
const url = new URL(path, baseURL);
|
|
356
|
-
const response = await fetch(url.toString());
|
|
357
|
-
if (!response.ok) {
|
|
358
|
-
throw new Error(`${response.status} ${response.statusText}`);
|
|
359
|
-
}
|
|
360
|
-
return true;
|
|
361
|
-
}));
|
|
362
|
-
let warmed = 0;
|
|
363
|
-
let failed = 0;
|
|
364
|
-
const errors = [];
|
|
365
|
-
for (let i = 0; i < results.length; i++) {
|
|
366
|
-
const result = results[i];
|
|
367
|
-
const path = paths[i];
|
|
368
|
-
if (!(result && path)) {
|
|
369
|
-
continue;
|
|
370
|
-
}
|
|
371
|
-
if (result.status === 'fulfilled') {
|
|
372
|
-
warmed++;
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
failed++;
|
|
376
|
-
errors.push({
|
|
377
|
-
path,
|
|
378
|
-
error: result.reason instanceof Error
|
|
379
|
-
? result.reason.message
|
|
380
|
-
: String(result.reason) || 'Unknown error',
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
return { warmed, failed, errors };
|
|
385
|
-
}
|