@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,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application-Level Caching
|
|
3
|
-
*
|
|
4
|
-
* Utilities for React Query, SWR, and application-level cache management
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* React Query Configuration
|
|
8
|
-
*/
|
|
9
|
-
export interface ReactQueryConfig {
|
|
10
|
-
defaultOptions?: {
|
|
11
|
-
queries?: {
|
|
12
|
-
staleTime?: number;
|
|
13
|
-
cacheTime?: number;
|
|
14
|
-
refetchOnWindowFocus?: boolean;
|
|
15
|
-
refetchOnReconnect?: boolean;
|
|
16
|
-
refetchOnMount?: boolean;
|
|
17
|
-
retry?: number | boolean;
|
|
18
|
-
retryDelay?: number | ((attemptIndex: number) => number);
|
|
19
|
-
};
|
|
20
|
-
mutations?: {
|
|
21
|
-
retry?: number | boolean;
|
|
22
|
-
retryDelay?: number | ((attemptIndex: number) => number);
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
export declare const DEFAULT_REACT_QUERY_CONFIG: ReactQueryConfig;
|
|
27
|
-
/**
|
|
28
|
-
* SWR Configuration
|
|
29
|
-
*/
|
|
30
|
-
export interface SWRConfig {
|
|
31
|
-
revalidateOnFocus?: boolean;
|
|
32
|
-
revalidateOnReconnect?: boolean;
|
|
33
|
-
refreshInterval?: number;
|
|
34
|
-
dedupingInterval?: number;
|
|
35
|
-
loadingTimeout?: number;
|
|
36
|
-
errorRetryInterval?: number;
|
|
37
|
-
errorRetryCount?: number;
|
|
38
|
-
focusThrottleInterval?: number;
|
|
39
|
-
shouldRetryOnError?: boolean;
|
|
40
|
-
keepPreviousData?: boolean;
|
|
41
|
-
}
|
|
42
|
-
export declare const DEFAULT_SWR_CONFIG: SWRConfig;
|
|
43
|
-
/**
|
|
44
|
-
* Cache Key Generator
|
|
45
|
-
*/
|
|
46
|
-
export declare class CacheKeyGenerator {
|
|
47
|
-
private prefix;
|
|
48
|
-
constructor(prefix?: string);
|
|
49
|
-
/**
|
|
50
|
-
* Generate key for list queries
|
|
51
|
-
*/
|
|
52
|
-
list(resource: string, filters?: Record<string, unknown>): string[];
|
|
53
|
-
/**
|
|
54
|
-
* Generate key for detail queries
|
|
55
|
-
*/
|
|
56
|
-
detail(resource: string, id: string | number): string[];
|
|
57
|
-
/**
|
|
58
|
-
* Generate key for custom queries
|
|
59
|
-
*/
|
|
60
|
-
custom(...parts: (string | number | Record<string, unknown>)[]): string[];
|
|
61
|
-
/**
|
|
62
|
-
* Generate key for infinite queries
|
|
63
|
-
*/
|
|
64
|
-
infinite(resource: string, filters?: Record<string, unknown>): string[];
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Cache Invalidation Strategies
|
|
68
|
-
*/
|
|
69
|
-
export declare class CacheInvalidator {
|
|
70
|
-
/**
|
|
71
|
-
* Invalidate by resource
|
|
72
|
-
*/
|
|
73
|
-
static byResource(resource: string): string[];
|
|
74
|
-
/**
|
|
75
|
-
* Invalidate by ID
|
|
76
|
-
*/
|
|
77
|
-
static byId(resource: string, id: string | number): string[];
|
|
78
|
-
/**
|
|
79
|
-
* Invalidate lists
|
|
80
|
-
*/
|
|
81
|
-
static lists(resource: string): string[];
|
|
82
|
-
/**
|
|
83
|
-
* Invalidate infinite queries
|
|
84
|
-
*/
|
|
85
|
-
static infinite(resource: string): string[];
|
|
86
|
-
/**
|
|
87
|
-
* Invalidate all
|
|
88
|
-
*/
|
|
89
|
-
static all(): string[];
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Optimistic Update Helper
|
|
93
|
-
*/
|
|
94
|
-
export declare class OptimisticUpdater<_T> {
|
|
95
|
-
/**
|
|
96
|
-
* Update list (add item)
|
|
97
|
-
*/
|
|
98
|
-
static addToList<T>(oldData: T[] | undefined, newItem: T): T[];
|
|
99
|
-
/**
|
|
100
|
-
* Update list (remove item)
|
|
101
|
-
*/
|
|
102
|
-
static removeFromList<T extends {
|
|
103
|
-
id: string | number;
|
|
104
|
-
}>(oldData: T[] | undefined, id: string | number): T[];
|
|
105
|
-
/**
|
|
106
|
-
* Update list (update item)
|
|
107
|
-
*/
|
|
108
|
-
static updateInList<T extends {
|
|
109
|
-
id: string | number;
|
|
110
|
-
}>(oldData: T[] | undefined, id: string | number, updates: Partial<T>): T[];
|
|
111
|
-
/**
|
|
112
|
-
* Update detail
|
|
113
|
-
*/
|
|
114
|
-
static updateDetail<T>(oldData: T | undefined, updates: Partial<T>): T | undefined;
|
|
115
|
-
/**
|
|
116
|
-
* Update paginated list
|
|
117
|
-
*/
|
|
118
|
-
static updatePaginatedList<T extends {
|
|
119
|
-
id: string | number;
|
|
120
|
-
}>(oldData: {
|
|
121
|
-
pages: Array<{
|
|
122
|
-
data: T[];
|
|
123
|
-
}>;
|
|
124
|
-
pageParams: unknown[];
|
|
125
|
-
} | undefined, id: string | number, updates: Partial<T>): {
|
|
126
|
-
pages: {
|
|
127
|
-
data: T[];
|
|
128
|
-
}[];
|
|
129
|
-
pageParams: unknown[];
|
|
130
|
-
} | undefined;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Cache Prefetch Helper
|
|
134
|
-
*/
|
|
135
|
-
export interface PrefetchConfig {
|
|
136
|
-
staleTime?: number;
|
|
137
|
-
cacheTime?: number;
|
|
138
|
-
}
|
|
139
|
-
export declare class CachePrefetcher {
|
|
140
|
-
/**
|
|
141
|
-
* Prefetch on hover
|
|
142
|
-
*/
|
|
143
|
-
static onHover(prefetchFn: () => Promise<unknown>, delay?: number): {
|
|
144
|
-
onMouseEnter: () => void;
|
|
145
|
-
onMouseLeave: () => void;
|
|
146
|
-
};
|
|
147
|
-
/**
|
|
148
|
-
* Prefetch on visibility
|
|
149
|
-
*/
|
|
150
|
-
static onVisible(element: HTMLElement | null, prefetchFn: () => Promise<unknown>, options?: IntersectionObserverInit): () => void;
|
|
151
|
-
/**
|
|
152
|
-
* Prefetch on idle
|
|
153
|
-
*/
|
|
154
|
-
static onIdle(prefetchFn: () => Promise<unknown>): void;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Cache Persistence
|
|
158
|
-
*/
|
|
159
|
-
export interface CachePersistenceConfig {
|
|
160
|
-
key: string;
|
|
161
|
-
storage?: 'localStorage' | 'sessionStorage' | 'indexedDB';
|
|
162
|
-
version?: number;
|
|
163
|
-
maxAge?: number;
|
|
164
|
-
}
|
|
165
|
-
export declare class CachePersistence {
|
|
166
|
-
private config;
|
|
167
|
-
constructor(config: CachePersistenceConfig);
|
|
168
|
-
/**
|
|
169
|
-
* Save to storage
|
|
170
|
-
*/
|
|
171
|
-
save(data: unknown): Promise<void>;
|
|
172
|
-
/**
|
|
173
|
-
* Load from storage
|
|
174
|
-
*/
|
|
175
|
-
load(): Promise<unknown | null>;
|
|
176
|
-
/**
|
|
177
|
-
* Remove from storage
|
|
178
|
-
*/
|
|
179
|
-
remove(): Promise<void>;
|
|
180
|
-
/**
|
|
181
|
-
* Save to IndexedDB
|
|
182
|
-
*/
|
|
183
|
-
private saveToIndexedDB;
|
|
184
|
-
/**
|
|
185
|
-
* Load from IndexedDB
|
|
186
|
-
*/
|
|
187
|
-
private loadFromIndexedDB;
|
|
188
|
-
/**
|
|
189
|
-
* Remove from IndexedDB
|
|
190
|
-
*/
|
|
191
|
-
private removeFromIndexedDB;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Cache Statistics
|
|
195
|
-
*/
|
|
196
|
-
export interface CacheStats {
|
|
197
|
-
hits: number;
|
|
198
|
-
misses: number;
|
|
199
|
-
hitRate: number;
|
|
200
|
-
totalQueries: number;
|
|
201
|
-
cacheSize: number;
|
|
202
|
-
}
|
|
203
|
-
export declare class CacheStatsTracker {
|
|
204
|
-
private hits;
|
|
205
|
-
private misses;
|
|
206
|
-
/**
|
|
207
|
-
* Record cache hit
|
|
208
|
-
*/
|
|
209
|
-
recordHit(): void;
|
|
210
|
-
/**
|
|
211
|
-
* Record cache miss
|
|
212
|
-
*/
|
|
213
|
-
recordMiss(): void;
|
|
214
|
-
/**
|
|
215
|
-
* Get statistics
|
|
216
|
-
*/
|
|
217
|
-
getStats(): CacheStats;
|
|
218
|
-
/**
|
|
219
|
-
* Reset statistics
|
|
220
|
-
*/
|
|
221
|
-
reset(): void;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Query dedupe helper
|
|
225
|
-
*/
|
|
226
|
-
export declare class QueryDeduplicator {
|
|
227
|
-
private pending;
|
|
228
|
-
/**
|
|
229
|
-
* Deduplicate query
|
|
230
|
-
*/
|
|
231
|
-
dedupe<T>(key: string, queryFn: () => Promise<T>): Promise<T>;
|
|
232
|
-
/**
|
|
233
|
-
* Clear pending queries
|
|
234
|
-
*/
|
|
235
|
-
clear(): void;
|
|
236
|
-
}
|
|
237
|
-
//# sourceMappingURL=app-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-cache.d.ts","sourceRoot":"","sources":["../../src/caching/app-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application-Level Caching
|
|
3
|
-
*
|
|
4
|
-
* Utilities for React Query, SWR, and application-level cache management
|
|
5
|
-
*/
|
|
6
|
-
import { logger } from '../observability/logger.js';
|
|
7
|
-
export const DEFAULT_REACT_QUERY_CONFIG = {
|
|
8
|
-
defaultOptions: {
|
|
9
|
-
queries: {
|
|
10
|
-
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
11
|
-
cacheTime: 1000 * 60 * 30, // 30 minutes
|
|
12
|
-
refetchOnWindowFocus: true,
|
|
13
|
-
refetchOnReconnect: true,
|
|
14
|
-
refetchOnMount: true,
|
|
15
|
-
retry: 3,
|
|
16
|
-
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
17
|
-
},
|
|
18
|
-
mutations: {
|
|
19
|
-
retry: 3,
|
|
20
|
-
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
export const DEFAULT_SWR_CONFIG = {
|
|
25
|
-
revalidateOnFocus: true,
|
|
26
|
-
revalidateOnReconnect: true,
|
|
27
|
-
refreshInterval: 0,
|
|
28
|
-
dedupingInterval: 2000,
|
|
29
|
-
loadingTimeout: 3000,
|
|
30
|
-
errorRetryInterval: 5000,
|
|
31
|
-
errorRetryCount: 3,
|
|
32
|
-
focusThrottleInterval: 5000,
|
|
33
|
-
shouldRetryOnError: true,
|
|
34
|
-
keepPreviousData: false,
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Cache Key Generator
|
|
38
|
-
*/
|
|
39
|
-
export class CacheKeyGenerator {
|
|
40
|
-
prefix;
|
|
41
|
-
constructor(prefix = 'app') {
|
|
42
|
-
this.prefix = prefix;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Generate key for list queries
|
|
46
|
-
*/
|
|
47
|
-
list(resource, filters) {
|
|
48
|
-
const key = [this.prefix, resource, 'list'];
|
|
49
|
-
if (filters && Object.keys(filters).length > 0) {
|
|
50
|
-
key.push(JSON.stringify(filters));
|
|
51
|
-
}
|
|
52
|
-
return key;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Generate key for detail queries
|
|
56
|
-
*/
|
|
57
|
-
detail(resource, id) {
|
|
58
|
-
return [this.prefix, resource, 'detail', String(id)];
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Generate key for custom queries
|
|
62
|
-
*/
|
|
63
|
-
custom(...parts) {
|
|
64
|
-
return [
|
|
65
|
-
this.prefix,
|
|
66
|
-
...parts.map((part) => (typeof part === 'object' ? JSON.stringify(part) : String(part))),
|
|
67
|
-
];
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Generate key for infinite queries
|
|
71
|
-
*/
|
|
72
|
-
infinite(resource, filters) {
|
|
73
|
-
const key = [this.prefix, resource, 'infinite'];
|
|
74
|
-
if (filters && Object.keys(filters).length > 0) {
|
|
75
|
-
key.push(JSON.stringify(filters));
|
|
76
|
-
}
|
|
77
|
-
return key;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Cache Invalidation Strategies
|
|
82
|
-
*/
|
|
83
|
-
export class CacheInvalidator {
|
|
84
|
-
/**
|
|
85
|
-
* Invalidate by resource
|
|
86
|
-
*/
|
|
87
|
-
static byResource(resource) {
|
|
88
|
-
return ['app', resource];
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Invalidate by ID
|
|
92
|
-
*/
|
|
93
|
-
static byId(resource, id) {
|
|
94
|
-
return ['app', resource, 'detail', String(id)];
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Invalidate lists
|
|
98
|
-
*/
|
|
99
|
-
static lists(resource) {
|
|
100
|
-
return ['app', resource, 'list'];
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Invalidate infinite queries
|
|
104
|
-
*/
|
|
105
|
-
static infinite(resource) {
|
|
106
|
-
return ['app', resource, 'infinite'];
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Invalidate all
|
|
110
|
-
*/
|
|
111
|
-
static all() {
|
|
112
|
-
return ['app'];
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Optimistic Update Helper
|
|
117
|
-
*/
|
|
118
|
-
export class OptimisticUpdater {
|
|
119
|
-
/**
|
|
120
|
-
* Update list (add item)
|
|
121
|
-
*/
|
|
122
|
-
static addToList(oldData, newItem) {
|
|
123
|
-
if (!oldData)
|
|
124
|
-
return [newItem];
|
|
125
|
-
return [...oldData, newItem];
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Update list (remove item)
|
|
129
|
-
*/
|
|
130
|
-
static removeFromList(oldData, id) {
|
|
131
|
-
if (!oldData)
|
|
132
|
-
return [];
|
|
133
|
-
return oldData.filter((item) => item.id !== id);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Update list (update item)
|
|
137
|
-
*/
|
|
138
|
-
static updateInList(oldData, id, updates) {
|
|
139
|
-
if (!oldData)
|
|
140
|
-
return [];
|
|
141
|
-
return oldData.map((item) => (item.id === id ? { ...item, ...updates } : item));
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Update detail
|
|
145
|
-
*/
|
|
146
|
-
static updateDetail(oldData, updates) {
|
|
147
|
-
if (!oldData)
|
|
148
|
-
return undefined;
|
|
149
|
-
return { ...oldData, ...updates };
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Update paginated list
|
|
153
|
-
*/
|
|
154
|
-
static updatePaginatedList(oldData, id, updates) {
|
|
155
|
-
if (!oldData)
|
|
156
|
-
return undefined;
|
|
157
|
-
return {
|
|
158
|
-
...oldData,
|
|
159
|
-
pages: oldData.pages.map((page) => ({
|
|
160
|
-
...page,
|
|
161
|
-
data: page.data.map((item) => (item.id === id ? { ...item, ...updates } : item)),
|
|
162
|
-
})),
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
export class CachePrefetcher {
|
|
167
|
-
/**
|
|
168
|
-
* Prefetch on hover
|
|
169
|
-
*/
|
|
170
|
-
static onHover(prefetchFn, delay = 300) {
|
|
171
|
-
let timeout = null;
|
|
172
|
-
return {
|
|
173
|
-
onMouseEnter: () => {
|
|
174
|
-
timeout = setTimeout(() => {
|
|
175
|
-
prefetchFn();
|
|
176
|
-
}, delay);
|
|
177
|
-
},
|
|
178
|
-
onMouseLeave: () => {
|
|
179
|
-
if (timeout) {
|
|
180
|
-
clearTimeout(timeout);
|
|
181
|
-
timeout = null;
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Prefetch on visibility
|
|
188
|
-
*/
|
|
189
|
-
static onVisible(element, prefetchFn, options) {
|
|
190
|
-
if (!element || typeof IntersectionObserver === 'undefined') {
|
|
191
|
-
return () => { };
|
|
192
|
-
}
|
|
193
|
-
const observer = new IntersectionObserver((entries) => {
|
|
194
|
-
for (const entry of entries) {
|
|
195
|
-
if (entry.isIntersecting) {
|
|
196
|
-
prefetchFn();
|
|
197
|
-
observer.disconnect();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}, options);
|
|
201
|
-
observer.observe(element);
|
|
202
|
-
return () => observer.disconnect();
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Prefetch on idle
|
|
206
|
-
*/
|
|
207
|
-
static onIdle(prefetchFn) {
|
|
208
|
-
if ('requestIdleCallback' in window) {
|
|
209
|
-
window.requestIdleCallback(() => prefetchFn());
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
setTimeout(() => prefetchFn(), 1);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
export class CachePersistence {
|
|
217
|
-
config;
|
|
218
|
-
constructor(config) {
|
|
219
|
-
this.config = {
|
|
220
|
-
storage: 'localStorage',
|
|
221
|
-
version: 1,
|
|
222
|
-
maxAge: 1000 * 60 * 60 * 24, // 1 day
|
|
223
|
-
...config,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Save to storage
|
|
228
|
-
*/
|
|
229
|
-
async save(data) {
|
|
230
|
-
const entry = {
|
|
231
|
-
data,
|
|
232
|
-
version: this.config.version,
|
|
233
|
-
timestamp: Date.now(),
|
|
234
|
-
};
|
|
235
|
-
try {
|
|
236
|
-
if (this.config.storage === 'indexedDB') {
|
|
237
|
-
await this.saveToIndexedDB(entry);
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
241
|
-
storage.setItem(this.config.key, JSON.stringify(entry));
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
logger.error('Cache persistence save failed', error instanceof Error ? error : new Error(String(error)));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Load from storage
|
|
250
|
-
*/
|
|
251
|
-
async load() {
|
|
252
|
-
try {
|
|
253
|
-
let entry;
|
|
254
|
-
if (this.config.storage === 'indexedDB') {
|
|
255
|
-
entry = await this.loadFromIndexedDB();
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
259
|
-
const stored = storage.getItem(this.config.key);
|
|
260
|
-
if (!stored)
|
|
261
|
-
return null;
|
|
262
|
-
entry = JSON.parse(stored);
|
|
263
|
-
}
|
|
264
|
-
if (!entry)
|
|
265
|
-
return null;
|
|
266
|
-
// Check version
|
|
267
|
-
if (entry.version !== this.config.version) {
|
|
268
|
-
await this.remove();
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
// Check age
|
|
272
|
-
const age = Date.now() - entry.timestamp;
|
|
273
|
-
if (age > this.config.maxAge) {
|
|
274
|
-
await this.remove();
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
277
|
-
return entry.data;
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
logger.error('Cache persistence load failed', error instanceof Error ? error : new Error(String(error)));
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Remove from storage
|
|
286
|
-
*/
|
|
287
|
-
async remove() {
|
|
288
|
-
try {
|
|
289
|
-
if (this.config.storage === 'indexedDB') {
|
|
290
|
-
await this.removeFromIndexedDB();
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
294
|
-
storage.removeItem(this.config.key);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
logger.error('Cache persistence remove failed', error instanceof Error ? error : new Error(String(error)));
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Save to IndexedDB
|
|
303
|
-
*/
|
|
304
|
-
async saveToIndexedDB(entry) {
|
|
305
|
-
return new Promise((resolve, reject) => {
|
|
306
|
-
const request = indexedDB.open('app-cache', 1);
|
|
307
|
-
request.onerror = () => reject(request.error);
|
|
308
|
-
request.onsuccess = () => {
|
|
309
|
-
const db = request.result;
|
|
310
|
-
const transaction = db.transaction(['cache'], 'readwrite');
|
|
311
|
-
const store = transaction.objectStore('cache');
|
|
312
|
-
const putRequest = store.put(entry, this.config.key);
|
|
313
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
314
|
-
putRequest.onsuccess = () => resolve();
|
|
315
|
-
};
|
|
316
|
-
request.onupgradeneeded = (event) => {
|
|
317
|
-
const db = event.target.result;
|
|
318
|
-
if (!db.objectStoreNames.contains('cache')) {
|
|
319
|
-
db.createObjectStore('cache');
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Load from IndexedDB
|
|
326
|
-
*/
|
|
327
|
-
async loadFromIndexedDB() {
|
|
328
|
-
return new Promise((resolve, reject) => {
|
|
329
|
-
const request = indexedDB.open('app-cache', 1);
|
|
330
|
-
request.onerror = () => reject(request.error);
|
|
331
|
-
request.onsuccess = () => {
|
|
332
|
-
const db = request.result;
|
|
333
|
-
const transaction = db.transaction(['cache'], 'readonly');
|
|
334
|
-
const store = transaction.objectStore('cache');
|
|
335
|
-
const getRequest = store.get(this.config.key);
|
|
336
|
-
getRequest.onerror = () => reject(getRequest.error);
|
|
337
|
-
getRequest.onsuccess = () => resolve(getRequest.result || null);
|
|
338
|
-
};
|
|
339
|
-
request.onupgradeneeded = (event) => {
|
|
340
|
-
const db = event.target.result;
|
|
341
|
-
if (!db.objectStoreNames.contains('cache')) {
|
|
342
|
-
db.createObjectStore('cache');
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Remove from IndexedDB
|
|
349
|
-
*/
|
|
350
|
-
async removeFromIndexedDB() {
|
|
351
|
-
return new Promise((resolve, reject) => {
|
|
352
|
-
const request = indexedDB.open('app-cache', 1);
|
|
353
|
-
request.onerror = () => reject(request.error);
|
|
354
|
-
request.onsuccess = () => {
|
|
355
|
-
const db = request.result;
|
|
356
|
-
const transaction = db.transaction(['cache'], 'readwrite');
|
|
357
|
-
const store = transaction.objectStore('cache');
|
|
358
|
-
const deleteRequest = store.delete(this.config.key);
|
|
359
|
-
deleteRequest.onerror = () => reject(deleteRequest.error);
|
|
360
|
-
deleteRequest.onsuccess = () => resolve();
|
|
361
|
-
};
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
export class CacheStatsTracker {
|
|
366
|
-
hits = 0;
|
|
367
|
-
misses = 0;
|
|
368
|
-
/**
|
|
369
|
-
* Record cache hit
|
|
370
|
-
*/
|
|
371
|
-
recordHit() {
|
|
372
|
-
this.hits++;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Record cache miss
|
|
376
|
-
*/
|
|
377
|
-
recordMiss() {
|
|
378
|
-
this.misses++;
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Get statistics
|
|
382
|
-
*/
|
|
383
|
-
getStats() {
|
|
384
|
-
const totalQueries = this.hits + this.misses;
|
|
385
|
-
const hitRate = totalQueries > 0 ? (this.hits / totalQueries) * 100 : 0;
|
|
386
|
-
return {
|
|
387
|
-
hits: this.hits,
|
|
388
|
-
misses: this.misses,
|
|
389
|
-
hitRate,
|
|
390
|
-
totalQueries,
|
|
391
|
-
cacheSize: 0, // Would need cache implementation
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Reset statistics
|
|
396
|
-
*/
|
|
397
|
-
reset() {
|
|
398
|
-
this.hits = 0;
|
|
399
|
-
this.misses = 0;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Query dedupe helper
|
|
404
|
-
*/
|
|
405
|
-
export class QueryDeduplicator {
|
|
406
|
-
pending = new Map();
|
|
407
|
-
/**
|
|
408
|
-
* Deduplicate query
|
|
409
|
-
*/
|
|
410
|
-
async dedupe(key, queryFn) {
|
|
411
|
-
// Check if query is already pending
|
|
412
|
-
const existing = this.pending.get(key);
|
|
413
|
-
if (existing) {
|
|
414
|
-
return existing;
|
|
415
|
-
}
|
|
416
|
-
// Execute query
|
|
417
|
-
const promise = queryFn();
|
|
418
|
-
// Store pending query
|
|
419
|
-
this.pending.set(key, promise);
|
|
420
|
-
// Remove from pending when done
|
|
421
|
-
promise.then(() => this.pending.delete(key)).catch(() => this.pending.delete(key));
|
|
422
|
-
return promise;
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Clear pending queries
|
|
426
|
-
*/
|
|
427
|
-
clear() {
|
|
428
|
-
this.pending.clear();
|
|
429
|
-
}
|
|
430
|
-
}
|