@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,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Configuration and Cache Management
|
|
3
|
-
*
|
|
4
|
-
* Utilities for CDN caching, edge caching, and cache invalidation
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* CDN Cache Configuration
|
|
8
|
-
*/
|
|
9
|
-
export interface CDNCacheConfig {
|
|
10
|
-
provider?: 'cloudflare' | 'vercel' | 'fastly' | 'custom';
|
|
11
|
-
zones?: string[];
|
|
12
|
-
ttl?: number;
|
|
13
|
-
staleWhileRevalidate?: number;
|
|
14
|
-
staleIfError?: number;
|
|
15
|
-
bypassCache?: boolean;
|
|
16
|
-
cacheKey?: string[];
|
|
17
|
-
varyHeaders?: string[];
|
|
18
|
-
}
|
|
19
|
-
export declare const DEFAULT_CDN_CONFIG: CDNCacheConfig;
|
|
20
|
-
/**
|
|
21
|
-
* Generate Cache-Control header
|
|
22
|
-
*/
|
|
23
|
-
export declare function generateCacheControl(config: {
|
|
24
|
-
maxAge?: number;
|
|
25
|
-
sMaxAge?: number;
|
|
26
|
-
staleWhileRevalidate?: number;
|
|
27
|
-
staleIfError?: number;
|
|
28
|
-
public?: boolean;
|
|
29
|
-
private?: boolean;
|
|
30
|
-
immutable?: boolean;
|
|
31
|
-
noCache?: boolean;
|
|
32
|
-
noStore?: boolean;
|
|
33
|
-
}): string;
|
|
34
|
-
/**
|
|
35
|
-
* Cache presets for different asset types
|
|
36
|
-
*/
|
|
37
|
-
export declare const CDN_CACHE_PRESETS: {
|
|
38
|
-
readonly immutable: {
|
|
39
|
-
readonly maxAge: 31536000;
|
|
40
|
-
readonly sMaxAge: 31536000;
|
|
41
|
-
readonly public: true;
|
|
42
|
-
readonly immutable: true;
|
|
43
|
-
};
|
|
44
|
-
readonly static: {
|
|
45
|
-
readonly maxAge: 2592000;
|
|
46
|
-
readonly sMaxAge: 31536000;
|
|
47
|
-
readonly staleWhileRevalidate: 86400;
|
|
48
|
-
readonly public: true;
|
|
49
|
-
};
|
|
50
|
-
readonly api: {
|
|
51
|
-
readonly maxAge: 0;
|
|
52
|
-
readonly sMaxAge: 60;
|
|
53
|
-
readonly staleWhileRevalidate: 30;
|
|
54
|
-
readonly public: true;
|
|
55
|
-
};
|
|
56
|
-
readonly page: {
|
|
57
|
-
readonly maxAge: 0;
|
|
58
|
-
readonly sMaxAge: 300;
|
|
59
|
-
readonly staleWhileRevalidate: 60;
|
|
60
|
-
readonly public: true;
|
|
61
|
-
};
|
|
62
|
-
readonly private: {
|
|
63
|
-
readonly maxAge: 300;
|
|
64
|
-
readonly private: true;
|
|
65
|
-
readonly staleWhileRevalidate: 60;
|
|
66
|
-
};
|
|
67
|
-
readonly noCache: {
|
|
68
|
-
readonly noStore: true;
|
|
69
|
-
};
|
|
70
|
-
readonly revalidate: {
|
|
71
|
-
readonly maxAge: 0;
|
|
72
|
-
readonly sMaxAge: 0;
|
|
73
|
-
readonly noCache: true;
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* CDN Purge Configuration
|
|
78
|
-
*/
|
|
79
|
-
export interface CDNPurgeConfig {
|
|
80
|
-
provider: 'cloudflare' | 'vercel' | 'fastly';
|
|
81
|
-
apiKey?: string;
|
|
82
|
-
apiSecret?: string;
|
|
83
|
-
zoneId?: string;
|
|
84
|
-
distributionId?: string;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Purge CDN cache
|
|
88
|
-
*/
|
|
89
|
-
export declare function purgeCDNCache(urls: string[], config: CDNPurgeConfig): Promise<{
|
|
90
|
-
success: boolean;
|
|
91
|
-
purged: number;
|
|
92
|
-
errors?: string[];
|
|
93
|
-
}>;
|
|
94
|
-
/**
|
|
95
|
-
* Purge by cache tag
|
|
96
|
-
*/
|
|
97
|
-
export declare function purgeCacheByTag(tags: string[], config: CDNPurgeConfig): Promise<{
|
|
98
|
-
success: boolean;
|
|
99
|
-
purged: number;
|
|
100
|
-
errors?: string[];
|
|
101
|
-
}>;
|
|
102
|
-
/**
|
|
103
|
-
* Purge everything
|
|
104
|
-
*/
|
|
105
|
-
export declare function purgeAllCache(config: CDNPurgeConfig): Promise<{
|
|
106
|
-
success: boolean;
|
|
107
|
-
errors?: string[];
|
|
108
|
-
}>;
|
|
109
|
-
/**
|
|
110
|
-
* CDN cache warming
|
|
111
|
-
*/
|
|
112
|
-
export declare function warmCDNCache(urls: string[], options?: {
|
|
113
|
-
concurrency?: number;
|
|
114
|
-
headers?: Record<string, string>;
|
|
115
|
-
}): Promise<{
|
|
116
|
-
warmed: number;
|
|
117
|
-
failed: number;
|
|
118
|
-
errors: string[];
|
|
119
|
-
}>;
|
|
120
|
-
/**
|
|
121
|
-
* Generate cache tags
|
|
122
|
-
*/
|
|
123
|
-
export declare function generateCacheTags(resource: {
|
|
124
|
-
type: string;
|
|
125
|
-
id?: string | number;
|
|
126
|
-
related?: string[];
|
|
127
|
-
}): string[];
|
|
128
|
-
/**
|
|
129
|
-
* Edge cache configuration for Vercel
|
|
130
|
-
*/
|
|
131
|
-
export declare function generateVercelCacheConfig(preset: keyof typeof CDN_CACHE_PRESETS): {
|
|
132
|
-
headers: {
|
|
133
|
-
'Cache-Control': string;
|
|
134
|
-
'CDN-Cache-Control': string;
|
|
135
|
-
'Vercel-CDN-Cache-Control': string;
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
/**
|
|
139
|
-
* Edge cache configuration for Cloudflare
|
|
140
|
-
*/
|
|
141
|
-
export declare function generateCloudflareConfig(preset: keyof typeof CDN_CACHE_PRESETS, options?: {
|
|
142
|
-
cacheTags?: string[];
|
|
143
|
-
bypassOnCookie?: string;
|
|
144
|
-
}): {
|
|
145
|
-
headers: Record<string, string>;
|
|
146
|
-
};
|
|
147
|
-
/**
|
|
148
|
-
* Check if response should be cached
|
|
149
|
-
*/
|
|
150
|
-
export declare function shouldCacheResponse(status: number, headers: Headers): boolean;
|
|
151
|
-
/**
|
|
152
|
-
* Calculate cache TTL from headers
|
|
153
|
-
*/
|
|
154
|
-
export declare function getCacheTTL(headers: Headers): number;
|
|
155
|
-
//# sourceMappingURL=cdn-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,411 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Configuration and Cache Management
|
|
3
|
-
*
|
|
4
|
-
* Utilities for CDN caching, edge caching, and cache invalidation
|
|
5
|
-
*/
|
|
6
|
-
export const DEFAULT_CDN_CONFIG = {
|
|
7
|
-
provider: 'vercel',
|
|
8
|
-
ttl: 31536000, // 1 year for static assets
|
|
9
|
-
staleWhileRevalidate: 86400, // 1 day
|
|
10
|
-
staleIfError: 604800, // 1 week
|
|
11
|
-
bypassCache: false,
|
|
12
|
-
cacheKey: ['url', 'headers.accept', 'headers.accept-encoding'],
|
|
13
|
-
varyHeaders: ['Accept', 'Accept-Encoding'],
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Generate Cache-Control header
|
|
17
|
-
*/
|
|
18
|
-
export function generateCacheControl(config) {
|
|
19
|
-
const directives = [];
|
|
20
|
-
// Visibility
|
|
21
|
-
if (config.noStore) {
|
|
22
|
-
directives.push('no-store');
|
|
23
|
-
return directives.join(', ');
|
|
24
|
-
}
|
|
25
|
-
if (config.noCache) {
|
|
26
|
-
directives.push('no-cache');
|
|
27
|
-
return directives.join(', ');
|
|
28
|
-
}
|
|
29
|
-
if (config.public) {
|
|
30
|
-
directives.push('public');
|
|
31
|
-
}
|
|
32
|
-
else if (config.private) {
|
|
33
|
-
directives.push('private');
|
|
34
|
-
}
|
|
35
|
-
// Max age
|
|
36
|
-
if (config.maxAge !== undefined) {
|
|
37
|
-
directives.push(`max-age=${config.maxAge}`);
|
|
38
|
-
}
|
|
39
|
-
// Shared max age (CDN)
|
|
40
|
-
if (config.sMaxAge !== undefined) {
|
|
41
|
-
directives.push(`s-maxage=${config.sMaxAge}`);
|
|
42
|
-
}
|
|
43
|
-
// Stale-while-revalidate
|
|
44
|
-
if (config.staleWhileRevalidate !== undefined) {
|
|
45
|
-
directives.push(`stale-while-revalidate=${config.staleWhileRevalidate}`);
|
|
46
|
-
}
|
|
47
|
-
// Stale-if-error
|
|
48
|
-
if (config.staleIfError !== undefined) {
|
|
49
|
-
directives.push(`stale-if-error=${config.staleIfError}`);
|
|
50
|
-
}
|
|
51
|
-
// Immutable
|
|
52
|
-
if (config.immutable) {
|
|
53
|
-
directives.push('immutable');
|
|
54
|
-
}
|
|
55
|
-
return directives.join(', ');
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Cache presets for different asset types
|
|
59
|
-
*/
|
|
60
|
-
export const CDN_CACHE_PRESETS = {
|
|
61
|
-
// Static assets with hashed filenames (immutable)
|
|
62
|
-
immutable: {
|
|
63
|
-
maxAge: 31536000, // 1 year
|
|
64
|
-
sMaxAge: 31536000,
|
|
65
|
-
public: true,
|
|
66
|
-
immutable: true,
|
|
67
|
-
},
|
|
68
|
-
// Static assets (images, fonts)
|
|
69
|
-
static: {
|
|
70
|
-
maxAge: 2592000, // 30 days
|
|
71
|
-
sMaxAge: 31536000, // 1 year on CDN
|
|
72
|
-
staleWhileRevalidate: 86400, // 1 day
|
|
73
|
-
public: true,
|
|
74
|
-
},
|
|
75
|
-
// API responses (short-lived)
|
|
76
|
-
api: {
|
|
77
|
-
maxAge: 0,
|
|
78
|
-
sMaxAge: 60, // 1 minute on CDN
|
|
79
|
-
staleWhileRevalidate: 30,
|
|
80
|
-
public: true,
|
|
81
|
-
},
|
|
82
|
-
// HTML pages (dynamic)
|
|
83
|
-
page: {
|
|
84
|
-
maxAge: 0,
|
|
85
|
-
sMaxAge: 300, // 5 minutes on CDN
|
|
86
|
-
staleWhileRevalidate: 60,
|
|
87
|
-
public: true,
|
|
88
|
-
},
|
|
89
|
-
// User-specific data
|
|
90
|
-
private: {
|
|
91
|
-
maxAge: 300, // 5 minutes
|
|
92
|
-
private: true,
|
|
93
|
-
staleWhileRevalidate: 60,
|
|
94
|
-
},
|
|
95
|
-
// No caching
|
|
96
|
-
noCache: {
|
|
97
|
-
noStore: true,
|
|
98
|
-
},
|
|
99
|
-
// Revalidate every request
|
|
100
|
-
revalidate: {
|
|
101
|
-
maxAge: 0,
|
|
102
|
-
sMaxAge: 0,
|
|
103
|
-
noCache: true,
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Purge CDN cache
|
|
108
|
-
*/
|
|
109
|
-
export async function purgeCDNCache(urls, config) {
|
|
110
|
-
const { provider } = config;
|
|
111
|
-
switch (provider) {
|
|
112
|
-
case 'cloudflare':
|
|
113
|
-
return purgeCloudflare(urls, config);
|
|
114
|
-
case 'vercel':
|
|
115
|
-
return purgeVercel(urls, config);
|
|
116
|
-
case 'fastly':
|
|
117
|
-
return purgeFastly(urls, config);
|
|
118
|
-
default:
|
|
119
|
-
throw new Error(`Unsupported CDN provider: ${provider}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Purge Cloudflare cache
|
|
124
|
-
*/
|
|
125
|
-
async function purgeCloudflare(urls, config) {
|
|
126
|
-
const { apiKey, zoneId } = config;
|
|
127
|
-
if (!(apiKey && zoneId)) {
|
|
128
|
-
throw new Error('Cloudflare API key and zone ID required');
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
132
|
-
method: 'POST',
|
|
133
|
-
headers: {
|
|
134
|
-
Authorization: `Bearer ${apiKey}`,
|
|
135
|
-
'Content-Type': 'application/json',
|
|
136
|
-
},
|
|
137
|
-
body: JSON.stringify({ files: urls }),
|
|
138
|
-
});
|
|
139
|
-
const data = await response.json();
|
|
140
|
-
return {
|
|
141
|
-
success: data.success,
|
|
142
|
-
purged: urls.length,
|
|
143
|
-
errors: data.errors,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
return {
|
|
148
|
-
success: false,
|
|
149
|
-
purged: 0,
|
|
150
|
-
errors: [error instanceof Error ? error.message : 'Unknown error'],
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Purge Vercel cache
|
|
156
|
-
*/
|
|
157
|
-
async function purgeVercel(urls, config) {
|
|
158
|
-
const { apiKey } = config;
|
|
159
|
-
if (!apiKey) {
|
|
160
|
-
throw new Error('Vercel API token required');
|
|
161
|
-
}
|
|
162
|
-
try {
|
|
163
|
-
const response = await fetch('https://api.vercel.com/v1/purge', {
|
|
164
|
-
method: 'POST',
|
|
165
|
-
headers: {
|
|
166
|
-
Authorization: `Bearer ${apiKey}`,
|
|
167
|
-
'Content-Type': 'application/json',
|
|
168
|
-
},
|
|
169
|
-
body: JSON.stringify({ urls }),
|
|
170
|
-
});
|
|
171
|
-
const data = await response.json();
|
|
172
|
-
return {
|
|
173
|
-
success: response.ok,
|
|
174
|
-
purged: urls.length,
|
|
175
|
-
errors: data.error ? [data.error.message] : undefined,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
catch (error) {
|
|
179
|
-
return {
|
|
180
|
-
success: false,
|
|
181
|
-
purged: 0,
|
|
182
|
-
errors: [error instanceof Error ? error.message : 'Unknown error'],
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Purge Fastly cache
|
|
188
|
-
*/
|
|
189
|
-
async function purgeFastly(urls, config) {
|
|
190
|
-
const { apiKey } = config;
|
|
191
|
-
if (!apiKey) {
|
|
192
|
-
throw new Error('Fastly API key required');
|
|
193
|
-
}
|
|
194
|
-
try {
|
|
195
|
-
const results = await Promise.all(urls.map(async (url) => {
|
|
196
|
-
const response = await fetch(url, {
|
|
197
|
-
method: 'PURGE',
|
|
198
|
-
headers: {
|
|
199
|
-
'Fastly-Key': apiKey,
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
return response.ok;
|
|
203
|
-
}));
|
|
204
|
-
const purged = results.filter(Boolean).length;
|
|
205
|
-
return {
|
|
206
|
-
success: purged === urls.length,
|
|
207
|
-
purged,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
return {
|
|
212
|
-
success: false,
|
|
213
|
-
purged: 0,
|
|
214
|
-
errors: [error instanceof Error ? error.message : 'Unknown error'],
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Purge by cache tag
|
|
220
|
-
*/
|
|
221
|
-
export async function purgeCacheByTag(tags, config) {
|
|
222
|
-
const { provider, apiKey, zoneId } = config;
|
|
223
|
-
if (provider === 'cloudflare') {
|
|
224
|
-
if (!(apiKey && zoneId)) {
|
|
225
|
-
throw new Error('Cloudflare API key and zone ID required');
|
|
226
|
-
}
|
|
227
|
-
try {
|
|
228
|
-
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
229
|
-
method: 'POST',
|
|
230
|
-
headers: {
|
|
231
|
-
Authorization: `Bearer ${apiKey}`,
|
|
232
|
-
'Content-Type': 'application/json',
|
|
233
|
-
},
|
|
234
|
-
body: JSON.stringify({ tags }),
|
|
235
|
-
});
|
|
236
|
-
const data = await response.json();
|
|
237
|
-
return {
|
|
238
|
-
success: data.success,
|
|
239
|
-
purged: tags.length,
|
|
240
|
-
errors: data.errors,
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
catch (error) {
|
|
244
|
-
return {
|
|
245
|
-
success: false,
|
|
246
|
-
purged: 0,
|
|
247
|
-
errors: [error instanceof Error ? error.message : 'Unknown error'],
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
throw new Error(`Cache tag purging not supported for ${provider}`);
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Purge everything
|
|
255
|
-
*/
|
|
256
|
-
export async function purgeAllCache(config) {
|
|
257
|
-
const { provider, apiKey, zoneId } = config;
|
|
258
|
-
if (provider === 'cloudflare') {
|
|
259
|
-
if (!(apiKey && zoneId)) {
|
|
260
|
-
throw new Error('Cloudflare API key and zone ID required');
|
|
261
|
-
}
|
|
262
|
-
try {
|
|
263
|
-
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
264
|
-
method: 'POST',
|
|
265
|
-
headers: {
|
|
266
|
-
Authorization: `Bearer ${apiKey}`,
|
|
267
|
-
'Content-Type': 'application/json',
|
|
268
|
-
},
|
|
269
|
-
body: JSON.stringify({ purge_everything: true }),
|
|
270
|
-
});
|
|
271
|
-
const data = await response.json();
|
|
272
|
-
return {
|
|
273
|
-
success: data.success,
|
|
274
|
-
errors: data.errors,
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
return {
|
|
279
|
-
success: false,
|
|
280
|
-
errors: [error instanceof Error ? error.message : 'Unknown error'],
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
throw new Error(`Purge all not supported for ${provider}`);
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* CDN cache warming
|
|
288
|
-
*/
|
|
289
|
-
export async function warmCDNCache(urls, options = {}) {
|
|
290
|
-
const { concurrency = 5, headers = {} } = options;
|
|
291
|
-
const results = [];
|
|
292
|
-
const chunks = [];
|
|
293
|
-
// Split into chunks
|
|
294
|
-
for (let i = 0; i < urls.length; i += concurrency) {
|
|
295
|
-
chunks.push(urls.slice(i, i + concurrency));
|
|
296
|
-
}
|
|
297
|
-
// Warm cache in chunks
|
|
298
|
-
for (const chunk of chunks) {
|
|
299
|
-
const chunkResults = await Promise.all(chunk.map(async (url) => {
|
|
300
|
-
try {
|
|
301
|
-
const response = await fetch(url, { headers });
|
|
302
|
-
return {
|
|
303
|
-
success: response.ok,
|
|
304
|
-
error: response.ok ? undefined : `${response.status} ${response.statusText}`,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
catch (error) {
|
|
308
|
-
return {
|
|
309
|
-
success: false,
|
|
310
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
}));
|
|
314
|
-
results.push(...chunkResults);
|
|
315
|
-
}
|
|
316
|
-
const warmed = results.filter((r) => r.success).length;
|
|
317
|
-
const failed = results.filter((r) => !r.success).length;
|
|
318
|
-
const errors = results.flatMap((r) => (r.error ? [r.error] : []));
|
|
319
|
-
return { warmed, failed, errors };
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Generate cache tags
|
|
323
|
-
*/
|
|
324
|
-
export function generateCacheTags(resource) {
|
|
325
|
-
const tags = [];
|
|
326
|
-
// Type tag
|
|
327
|
-
tags.push(resource.type);
|
|
328
|
-
// ID tag
|
|
329
|
-
if (resource.id) {
|
|
330
|
-
tags.push(`${resource.type}:${resource.id}`);
|
|
331
|
-
}
|
|
332
|
-
// Related tags
|
|
333
|
-
if (resource.related) {
|
|
334
|
-
tags.push(...resource.related);
|
|
335
|
-
}
|
|
336
|
-
return tags;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Edge cache configuration for Vercel
|
|
340
|
-
*/
|
|
341
|
-
export function generateVercelCacheConfig(preset) {
|
|
342
|
-
const config = CDN_CACHE_PRESETS[preset];
|
|
343
|
-
const cacheControl = generateCacheControl(config);
|
|
344
|
-
return {
|
|
345
|
-
headers: {
|
|
346
|
-
'Cache-Control': cacheControl,
|
|
347
|
-
'CDN-Cache-Control': cacheControl,
|
|
348
|
-
'Vercel-CDN-Cache-Control': cacheControl,
|
|
349
|
-
},
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Edge cache configuration for Cloudflare
|
|
354
|
-
*/
|
|
355
|
-
export function generateCloudflareConfig(preset, options = {}) {
|
|
356
|
-
const config = CDN_CACHE_PRESETS[preset];
|
|
357
|
-
const cacheControl = generateCacheControl(config);
|
|
358
|
-
const headers = {
|
|
359
|
-
'Cache-Control': cacheControl,
|
|
360
|
-
};
|
|
361
|
-
// Cache tags
|
|
362
|
-
if (options.cacheTags && options.cacheTags.length > 0) {
|
|
363
|
-
headers['Cache-Tag'] = options.cacheTags.join(',');
|
|
364
|
-
}
|
|
365
|
-
// Bypass on cookie
|
|
366
|
-
if (options.bypassOnCookie) {
|
|
367
|
-
headers['Cache-Control'] = `${cacheControl}, bypass=${options.bypassOnCookie}`;
|
|
368
|
-
}
|
|
369
|
-
return { headers };
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Check if response should be cached
|
|
373
|
-
*/
|
|
374
|
-
export function shouldCacheResponse(status, headers) {
|
|
375
|
-
// Don't cache errors
|
|
376
|
-
if (status >= 400) {
|
|
377
|
-
return false;
|
|
378
|
-
}
|
|
379
|
-
// Check Cache-Control header
|
|
380
|
-
const cacheControl = headers.get('cache-control') || '';
|
|
381
|
-
if (cacheControl.includes('no-store') ||
|
|
382
|
-
cacheControl.includes('no-cache') ||
|
|
383
|
-
cacheControl.includes('private')) {
|
|
384
|
-
return false;
|
|
385
|
-
}
|
|
386
|
-
return true;
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Calculate cache TTL from headers
|
|
390
|
-
*/
|
|
391
|
-
export function getCacheTTL(headers) {
|
|
392
|
-
const cacheControl = headers.get('cache-control') || '';
|
|
393
|
-
// Check s-maxage first (CDN)
|
|
394
|
-
const sMaxAgeMatch = cacheControl.match(/s-maxage=(\d+)/);
|
|
395
|
-
if (sMaxAgeMatch?.[1]) {
|
|
396
|
-
return parseInt(sMaxAgeMatch[1], 10);
|
|
397
|
-
}
|
|
398
|
-
// Check max-age
|
|
399
|
-
const maxAgeMatch = cacheControl.match(/max-age=(\d+)/);
|
|
400
|
-
if (maxAgeMatch?.[1]) {
|
|
401
|
-
return parseInt(maxAgeMatch[1], 10);
|
|
402
|
-
}
|
|
403
|
-
// Check Expires header
|
|
404
|
-
const expires = headers.get('expires');
|
|
405
|
-
if (expires) {
|
|
406
|
-
const expiresDate = new Date(expires);
|
|
407
|
-
const now = new Date();
|
|
408
|
-
return Math.max(0, Math.floor((expiresDate.getTime() - now.getTime()) / 1000));
|
|
409
|
-
}
|
|
410
|
-
return 0;
|
|
411
|
-
}
|