@revealui/core 0.2.0 → 0.3.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/README.md +137 -30
- 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 +30 -29
- package/dist/api/rate-limit.d.ts.map +1 -1
- package/dist/api/rate-limit.js +79 -4
- 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 +5 -4
- 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/app-cache.d.ts +5 -0
- package/dist/caching/app-cache.d.ts.map +1 -1
- package/dist/caching/app-cache.js +9 -1
- package/dist/caching/cdn-config.d.ts +2 -2
- package/dist/caching/cdn-config.d.ts.map +1 -1
- package/dist/caching/cdn-config.js +5 -15
- package/dist/caching/edge-cache.d.ts +1 -1
- package/dist/caching/edge-cache.d.ts.map +1 -1
- package/dist/caching/edge-cache.js +44 -11
- 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/caching/service-worker.d.ts +10 -18
- package/dist/caching/service-worker.d.ts.map +1 -1
- package/dist/caching/service-worker.js +5 -4
- 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 +178 -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/auth.d.ts +0 -4
- package/dist/client/admin/utils/auth.d.ts.map +1 -1
- package/dist/client/admin/utils/auth.js +0 -6
- 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 +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -2
- 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/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 +2 -4
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +9 -7
- 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 +18 -17
- 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 +26 -0
- package/dist/database/safe-parse.d.ts.map +1 -0
- package/dist/database/safe-parse.js +42 -0
- package/dist/database/ssl-config.d.ts.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 +18 -13
- package/dist/dataloader.d.ts.map +1 -1
- package/dist/dataloader.js +16 -2
- package/dist/error-handling/circuit-breaker.d.ts +1 -1
- package/dist/error-handling/circuit-breaker.d.ts.map +1 -1
- package/dist/error-handling/circuit-breaker.js +11 -3
- package/dist/error-handling/error-boundary.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.d.ts +6 -5
- package/dist/error-handling/error-reporter.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.js +26 -41
- 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 +3 -5
- package/dist/error-handling/index.d.ts.map +1 -1
- package/dist/error-handling/index.js +2 -5
- package/dist/error-handling/retry.d.ts.map +1 -1
- package/dist/error-handling/retry.js +13 -8
- package/dist/factories/builders.d.ts.map +1 -1
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/features.d.ts +5 -5
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +6 -5
- 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/index.d.ts +0 -3
- package/dist/generated/types/index.d.ts.map +1 -1
- package/dist/generated/types/index.js +0 -7
- 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 +4 -2
- package/dist/globals/index.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -6
- package/dist/instance/RevealUIInstance.d.ts.map +1 -1
- package/dist/instance/RevealUIInstance.js +50 -69
- 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 +4 -4
- package/dist/instance/methods/delete.d.ts.map +1 -1
- package/dist/instance/methods/delete.js +5 -5
- 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/hooks.js +3 -1
- package/dist/instance/methods/update.d.ts.map +1 -1
- package/dist/instance/methods/update.js +4 -4
- 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 +33 -7
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +119 -16
- 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 +1 -5
- package/dist/observability/health-check.d.ts.map +1 -1
- package/dist/observability/health-check.js +37 -43
- 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/optimization/asset-optimizer.d.ts +6 -2
- package/dist/optimization/asset-optimizer.d.ts.map +1 -1
- package/dist/optimization/asset-optimizer.js +31 -7
- package/dist/optimization/bundle-analyzer.d.ts +1 -1
- package/dist/optimization/bundle-analyzer.d.ts.map +1 -1
- package/dist/optimization/bundle-analyzer.js +29 -5
- package/dist/optimization/code-splitting.d.ts +0 -23
- package/dist/optimization/code-splitting.d.ts.map +1 -1
- package/dist/optimization/code-splitting.js +0 -29
- 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 -5
- 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 +15 -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/audit.d.ts +1 -1
- package/dist/security/audit.d.ts.map +1 -1
- package/dist/security/audit.js +4 -2
- package/dist/security/auth.d.ts +29 -160
- package/dist/security/auth.d.ts.map +1 -1
- package/dist/security/auth.js +150 -367
- package/dist/security/authorization.d.ts +7 -31
- package/dist/security/authorization.d.ts.map +1 -1
- package/dist/security/authorization.js +72 -14
- package/dist/security/encryption.d.ts +56 -44
- package/dist/security/encryption.d.ts.map +1 -1
- package/dist/security/encryption.js +128 -100
- package/dist/security/gdpr-storage.d.ts +102 -0
- package/dist/security/gdpr-storage.d.ts.map +1 -0
- package/dist/security/gdpr-storage.js +65 -0
- package/dist/security/gdpr.d.ts +57 -37
- package/dist/security/gdpr.d.ts.map +1 -1
- package/dist/security/gdpr.js +155 -94
- package/dist/security/headers.d.ts +4 -2
- package/dist/security/headers.d.ts.map +1 -1
- package/dist/security/headers.js +35 -17
- 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/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.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 +0 -2
- package/dist/types/generated.d.ts.map +1 -1
- package/dist/types/generated.js +0 -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 +59 -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/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 +39 -16
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Query Result Caching
|
|
2
|
+
* Query Result Caching
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* In-memory Map-based cache for database queries. No external dependencies
|
|
5
|
+
* (Redis, Memcached, etc.) — RevealUI uses PostgreSQL + ElectricSQL/PGlite
|
|
6
|
+
* for all persistence and sync.
|
|
5
7
|
*/
|
|
6
8
|
import { logger } from '../observability/logger.js';
|
|
7
|
-
|
|
8
|
-
class RedisCache {
|
|
9
|
+
class QueryCache {
|
|
9
10
|
cache = new Map();
|
|
10
11
|
stats = {
|
|
11
12
|
hits: 0,
|
|
@@ -14,7 +15,7 @@ class RedisCache {
|
|
|
14
15
|
deletes: 0,
|
|
15
16
|
hitRate: 0,
|
|
16
17
|
};
|
|
17
|
-
|
|
18
|
+
get(key) {
|
|
18
19
|
const entry = this.cache.get(key);
|
|
19
20
|
if (!entry) {
|
|
20
21
|
this.stats.misses++;
|
|
@@ -31,17 +32,14 @@ class RedisCache {
|
|
|
31
32
|
this.updateHitRate();
|
|
32
33
|
return entry.value;
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
set(key, value, ttlSeconds) {
|
|
35
36
|
this.cache.set(key, {
|
|
36
37
|
value,
|
|
37
|
-
expires: Date.now() +
|
|
38
|
+
expires: Date.now() + ttlSeconds * 1000,
|
|
38
39
|
});
|
|
39
40
|
this.stats.sets++;
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
-
await this.set(key, value, ttl);
|
|
43
|
-
}
|
|
44
|
-
async del(...keys) {
|
|
42
|
+
del(...keys) {
|
|
45
43
|
let deleted = 0;
|
|
46
44
|
for (const key of keys) {
|
|
47
45
|
if (this.cache.delete(key)) {
|
|
@@ -51,11 +49,11 @@ class RedisCache {
|
|
|
51
49
|
}
|
|
52
50
|
return deleted;
|
|
53
51
|
}
|
|
54
|
-
|
|
52
|
+
keys(pattern) {
|
|
55
53
|
const regex = new RegExp(pattern.replace('*', '.*'));
|
|
56
54
|
return Array.from(this.cache.keys()).filter((key) => regex.test(key));
|
|
57
55
|
}
|
|
58
|
-
|
|
56
|
+
clear() {
|
|
59
57
|
this.cache.clear();
|
|
60
58
|
}
|
|
61
59
|
getStats() {
|
|
@@ -66,7 +64,7 @@ class RedisCache {
|
|
|
66
64
|
this.stats.hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
|
-
const
|
|
67
|
+
const cache = new QueryCache();
|
|
70
68
|
/**
|
|
71
69
|
* Cache a query result
|
|
72
70
|
*/
|
|
@@ -75,7 +73,7 @@ export async function cacheQuery(key, queryFn, options = {}) {
|
|
|
75
73
|
prefix = 'query', } = options;
|
|
76
74
|
const cacheKey = `${prefix}:${key}`;
|
|
77
75
|
// Try cache first
|
|
78
|
-
const cached =
|
|
76
|
+
const cached = cache.get(cacheKey);
|
|
79
77
|
if (cached) {
|
|
80
78
|
try {
|
|
81
79
|
return JSON.parse(cached);
|
|
@@ -89,7 +87,7 @@ export async function cacheQuery(key, queryFn, options = {}) {
|
|
|
89
87
|
const result = await queryFn();
|
|
90
88
|
// Cache result
|
|
91
89
|
try {
|
|
92
|
-
|
|
90
|
+
cache.set(cacheKey, JSON.stringify(result), ttl);
|
|
93
91
|
}
|
|
94
92
|
catch (error) {
|
|
95
93
|
logger.error('Cache set error', error instanceof Error ? error : new Error(String(error)));
|
|
@@ -100,37 +98,37 @@ export async function cacheQuery(key, queryFn, options = {}) {
|
|
|
100
98
|
/**
|
|
101
99
|
* Invalidate cache by key
|
|
102
100
|
*/
|
|
103
|
-
export
|
|
104
|
-
|
|
101
|
+
export function invalidateCache(key) {
|
|
102
|
+
cache.del(key);
|
|
105
103
|
}
|
|
106
104
|
/**
|
|
107
105
|
* Invalidate cache by pattern
|
|
108
106
|
*/
|
|
109
|
-
export
|
|
110
|
-
const keys =
|
|
107
|
+
export function invalidateCachePattern(pattern) {
|
|
108
|
+
const keys = cache.keys(pattern);
|
|
111
109
|
if (keys.length > 0) {
|
|
112
|
-
|
|
110
|
+
cache.del(...keys);
|
|
113
111
|
}
|
|
114
112
|
}
|
|
115
113
|
/**
|
|
116
114
|
* Invalidate cache by tags
|
|
117
115
|
*/
|
|
118
|
-
export
|
|
116
|
+
export function invalidateCacheTags(tags) {
|
|
119
117
|
for (const tag of tags) {
|
|
120
|
-
|
|
118
|
+
invalidateCachePattern(`*:tag:${tag}:*`);
|
|
121
119
|
}
|
|
122
120
|
}
|
|
123
121
|
/**
|
|
124
122
|
* Clear all cache
|
|
125
123
|
*/
|
|
126
|
-
export
|
|
127
|
-
|
|
124
|
+
export function clearCache() {
|
|
125
|
+
cache.clear();
|
|
128
126
|
}
|
|
129
127
|
/**
|
|
130
128
|
* Get cache statistics
|
|
131
129
|
*/
|
|
132
130
|
export function getCacheStats() {
|
|
133
|
-
return
|
|
131
|
+
return cache.getStats();
|
|
134
132
|
}
|
|
135
133
|
/**
|
|
136
134
|
* Cache for list queries
|
|
@@ -164,20 +162,20 @@ export async function cacheCount(resource, filters, queryFn, ttl = 300) {
|
|
|
164
162
|
/**
|
|
165
163
|
* Invalidate resource cache
|
|
166
164
|
*/
|
|
167
|
-
export
|
|
168
|
-
|
|
165
|
+
export function invalidateResource(resource) {
|
|
166
|
+
invalidateCachePattern(`*:${resource}:*`);
|
|
169
167
|
}
|
|
170
168
|
/**
|
|
171
169
|
* Warm cache with data
|
|
172
170
|
*/
|
|
173
|
-
export
|
|
174
|
-
|
|
171
|
+
export function warmCache(key, data, ttl = 300) {
|
|
172
|
+
cache.set(`query:${key}`, JSON.stringify(data), ttl);
|
|
175
173
|
}
|
|
176
174
|
/**
|
|
177
175
|
* Get cached value without executing query
|
|
178
176
|
*/
|
|
179
|
-
export
|
|
180
|
-
const cached =
|
|
177
|
+
export function getCached(key) {
|
|
178
|
+
const cached = cache.get(`query:${key}`);
|
|
181
179
|
if (!cached)
|
|
182
180
|
return null;
|
|
183
181
|
try {
|
|
@@ -190,8 +188,8 @@ export async function getCached(key) {
|
|
|
190
188
|
/**
|
|
191
189
|
* Check if key exists in cache
|
|
192
190
|
*/
|
|
193
|
-
export
|
|
194
|
-
const cached =
|
|
191
|
+
export function cacheExists(key) {
|
|
192
|
+
const cached = cache.get(`query:${key}`);
|
|
195
193
|
return cached !== null;
|
|
196
194
|
}
|
|
197
195
|
/**
|
|
@@ -229,20 +227,20 @@ export async function cacheSWR(key, queryFn, options = {}) {
|
|
|
229
227
|
const cacheKey = `query:${key}`;
|
|
230
228
|
const staleKey = `${cacheKey}:stale`;
|
|
231
229
|
// Try fresh cache
|
|
232
|
-
const cached =
|
|
230
|
+
const cached = cache.get(cacheKey);
|
|
233
231
|
if (cached) {
|
|
234
232
|
return JSON.parse(cached);
|
|
235
233
|
}
|
|
236
234
|
// Try stale cache while revalidating
|
|
237
|
-
const stale =
|
|
235
|
+
const stale = cache.get(staleKey);
|
|
238
236
|
if (stale) {
|
|
239
237
|
// Return stale data immediately
|
|
240
238
|
const staleData = JSON.parse(stale);
|
|
241
239
|
// Revalidate in background
|
|
242
240
|
queryFn()
|
|
243
241
|
.then((fresh) => {
|
|
244
|
-
|
|
245
|
-
|
|
242
|
+
cache.set(cacheKey, JSON.stringify(fresh), ttl);
|
|
243
|
+
cache.set(staleKey, JSON.stringify(fresh), staleTime);
|
|
246
244
|
})
|
|
247
245
|
.catch((error) => {
|
|
248
246
|
logger.error('SWR revalidation error', error instanceof Error ? error : new Error(String(error)));
|
|
@@ -252,9 +250,7 @@ export async function cacheSWR(key, queryFn, options = {}) {
|
|
|
252
250
|
// No cache, execute query
|
|
253
251
|
const result = await queryFn();
|
|
254
252
|
// Cache both fresh and stale
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
redis.setex(staleKey, staleTime, JSON.stringify(result)),
|
|
258
|
-
]);
|
|
253
|
+
cache.set(cacheKey, JSON.stringify(result), ttl);
|
|
254
|
+
cache.set(staleKey, JSON.stringify(result), staleTime);
|
|
259
255
|
return result;
|
|
260
256
|
}
|
|
@@ -203,6 +203,7 @@ export interface CacheStats {
|
|
|
203
203
|
export declare class CacheStatsTracker {
|
|
204
204
|
private hits;
|
|
205
205
|
private misses;
|
|
206
|
+
private _cacheSize;
|
|
206
207
|
/**
|
|
207
208
|
* Record cache hit
|
|
208
209
|
*/
|
|
@@ -211,6 +212,10 @@ export declare class CacheStatsTracker {
|
|
|
211
212
|
* Record cache miss
|
|
212
213
|
*/
|
|
213
214
|
recordMiss(): void;
|
|
215
|
+
/**
|
|
216
|
+
* Update the reported cache size (call from the cache implementation)
|
|
217
|
+
*/
|
|
218
|
+
setCacheSize(size: number): void;
|
|
214
219
|
/**
|
|
215
220
|
* Get statistics
|
|
216
221
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-cache.d.ts","sourceRoot":"","sources":["../../src/caching/app-cache.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"app-cache.d.ts","sourceRoot":"","sources":["../../src/caching/app-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -365,6 +365,7 @@ export class CachePersistence {
|
|
|
365
365
|
export class CacheStatsTracker {
|
|
366
366
|
hits = 0;
|
|
367
367
|
misses = 0;
|
|
368
|
+
_cacheSize = 0;
|
|
368
369
|
/**
|
|
369
370
|
* Record cache hit
|
|
370
371
|
*/
|
|
@@ -377,6 +378,12 @@ export class CacheStatsTracker {
|
|
|
377
378
|
recordMiss() {
|
|
378
379
|
this.misses++;
|
|
379
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Update the reported cache size (call from the cache implementation)
|
|
383
|
+
*/
|
|
384
|
+
setCacheSize(size) {
|
|
385
|
+
this._cacheSize = size;
|
|
386
|
+
}
|
|
380
387
|
/**
|
|
381
388
|
* Get statistics
|
|
382
389
|
*/
|
|
@@ -388,7 +395,7 @@ export class CacheStatsTracker {
|
|
|
388
395
|
misses: this.misses,
|
|
389
396
|
hitRate,
|
|
390
397
|
totalQueries,
|
|
391
|
-
cacheSize:
|
|
398
|
+
cacheSize: this._cacheSize,
|
|
392
399
|
};
|
|
393
400
|
}
|
|
394
401
|
/**
|
|
@@ -397,6 +404,7 @@ export class CacheStatsTracker {
|
|
|
397
404
|
reset() {
|
|
398
405
|
this.hits = 0;
|
|
399
406
|
this.misses = 0;
|
|
407
|
+
this._cacheSize = 0;
|
|
400
408
|
}
|
|
401
409
|
}
|
|
402
410
|
/**
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* CDN Cache Configuration
|
|
8
8
|
*/
|
|
9
9
|
export interface CDNCacheConfig {
|
|
10
|
-
provider?: 'cloudflare' | 'vercel' | '
|
|
10
|
+
provider?: 'cloudflare' | 'vercel' | 'fastly' | 'custom';
|
|
11
11
|
zones?: string[];
|
|
12
12
|
ttl?: number;
|
|
13
13
|
staleWhileRevalidate?: number;
|
|
@@ -77,7 +77,7 @@ export declare const CDN_CACHE_PRESETS: {
|
|
|
77
77
|
* CDN Purge Configuration
|
|
78
78
|
*/
|
|
79
79
|
export interface CDNPurgeConfig {
|
|
80
|
-
provider: 'cloudflare' | 'vercel' | '
|
|
80
|
+
provider: 'cloudflare' | 'vercel' | 'fastly';
|
|
81
81
|
apiKey?: string;
|
|
82
82
|
apiSecret?: string;
|
|
83
83
|
zoneId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,YAAY,GAAG,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,8 +113,6 @@ export async function purgeCDNCache(urls, config) {
|
|
|
113
113
|
return purgeCloudflare(urls, config);
|
|
114
114
|
case 'vercel':
|
|
115
115
|
return purgeVercel(urls, config);
|
|
116
|
-
case 'cloudfront':
|
|
117
|
-
return purgeCloudFront(urls, config);
|
|
118
116
|
case 'fastly':
|
|
119
117
|
return purgeFastly(urls, config);
|
|
120
118
|
default:
|
|
@@ -133,6 +131,7 @@ async function purgeCloudflare(urls, config) {
|
|
|
133
131
|
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
134
132
|
method: 'POST',
|
|
135
133
|
headers: {
|
|
134
|
+
// biome-ignore lint/style/useNamingConvention: HTTP header convention
|
|
136
135
|
Authorization: `Bearer ${apiKey}`,
|
|
137
136
|
'Content-Type': 'application/json',
|
|
138
137
|
},
|
|
@@ -165,6 +164,7 @@ async function purgeVercel(urls, config) {
|
|
|
165
164
|
const response = await fetch('https://api.vercel.com/v1/purge', {
|
|
166
165
|
method: 'POST',
|
|
167
166
|
headers: {
|
|
167
|
+
// biome-ignore lint/style/useNamingConvention: HTTP header convention
|
|
168
168
|
Authorization: `Bearer ${apiKey}`,
|
|
169
169
|
'Content-Type': 'application/json',
|
|
170
170
|
},
|
|
@@ -185,18 +185,6 @@ async function purgeVercel(urls, config) {
|
|
|
185
185
|
};
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
|
-
/**
|
|
189
|
-
* Purge CloudFront cache
|
|
190
|
-
*/
|
|
191
|
-
async function purgeCloudFront(_urls, _config) {
|
|
192
|
-
// Would require AWS SDK
|
|
193
|
-
// Placeholder implementation
|
|
194
|
-
return {
|
|
195
|
-
success: false,
|
|
196
|
-
purged: 0,
|
|
197
|
-
errors: ['CloudFront purge requires AWS SDK integration'],
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
188
|
/**
|
|
201
189
|
* Purge Fastly cache
|
|
202
190
|
*/
|
|
@@ -242,6 +230,7 @@ export async function purgeCacheByTag(tags, config) {
|
|
|
242
230
|
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
243
231
|
method: 'POST',
|
|
244
232
|
headers: {
|
|
233
|
+
// biome-ignore lint/style/useNamingConvention: HTTP header convention
|
|
245
234
|
Authorization: `Bearer ${apiKey}`,
|
|
246
235
|
'Content-Type': 'application/json',
|
|
247
236
|
},
|
|
@@ -277,6 +266,7 @@ export async function purgeAllCache(config) {
|
|
|
277
266
|
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
278
267
|
method: 'POST',
|
|
279
268
|
headers: {
|
|
269
|
+
// biome-ignore lint/style/useNamingConvention: HTTP header convention
|
|
280
270
|
Authorization: `Bearer ${apiKey}`,
|
|
281
271
|
'Content-Type': 'application/json',
|
|
282
272
|
},
|
|
@@ -329,7 +319,7 @@ export async function warmCDNCache(urls, options = {}) {
|
|
|
329
319
|
}
|
|
330
320
|
const warmed = results.filter((r) => r.success).length;
|
|
331
321
|
const failed = results.filter((r) => !r.success).length;
|
|
332
|
-
const errors = results.
|
|
322
|
+
const errors = results.flatMap((r) => (r.error ? [r.error] : []));
|
|
333
323
|
return { warmed, failed, errors };
|
|
334
324
|
}
|
|
335
325
|
/**
|
|
@@ -89,7 +89,7 @@ export declare function createEdgeCachedFetch(config?: EdgeCacheConfig): <T>(url
|
|
|
89
89
|
/**
|
|
90
90
|
* Unstable cache wrapper (Next.js 14+)
|
|
91
91
|
*/
|
|
92
|
-
export declare function createCachedFunction<TArgs extends unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>,
|
|
92
|
+
export declare function createCachedFunction<TArgs extends unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>, options?: {
|
|
93
93
|
tags?: string[];
|
|
94
94
|
revalidate?: number | false;
|
|
95
95
|
}): (...args: TArgs) => Promise<TReturn>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-cache.d.ts","sourceRoot":"","sources":["../../src/caching/edge-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"edge-cache.d.ts","sourceRoot":"","sources":["../../src/caching/edge-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,25 +47,37 @@ export async function generateStaticParams(fetchFn, mapFn) {
|
|
|
47
47
|
* Revalidate tag
|
|
48
48
|
*/
|
|
49
49
|
export async function revalidateTag(tag, secret) {
|
|
50
|
+
const baseUrl = process.env.NEXT_PUBLIC_URL;
|
|
51
|
+
if (!baseUrl) {
|
|
52
|
+
logger.warn('revalidateTag skipped: NEXT_PUBLIC_URL is not configured', { tag });
|
|
53
|
+
return { revalidated: false, error: 'NEXT_PUBLIC_URL is not configured' };
|
|
54
|
+
}
|
|
50
55
|
try {
|
|
51
|
-
const url = new URL('/api/revalidate',
|
|
52
|
-
|
|
56
|
+
const url = new URL('/api/revalidate', baseUrl);
|
|
57
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
53
58
|
if (secret) {
|
|
54
|
-
|
|
59
|
+
headers['x-revalidate-secret'] = secret;
|
|
55
60
|
}
|
|
56
61
|
const response = await fetch(url.toString(), {
|
|
57
62
|
method: 'POST',
|
|
63
|
+
headers,
|
|
64
|
+
body: JSON.stringify({ tag }),
|
|
58
65
|
});
|
|
59
66
|
const data = await response.json();
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
logger.warn('revalidateTag failed', { tag, status: response.status, error: data.error });
|
|
69
|
+
}
|
|
60
70
|
return {
|
|
61
71
|
revalidated: response.ok,
|
|
62
72
|
error: data.error,
|
|
63
73
|
};
|
|
64
74
|
}
|
|
65
75
|
catch (error) {
|
|
76
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
77
|
+
logger.warn('revalidateTag error', { tag, error: message });
|
|
66
78
|
return {
|
|
67
79
|
revalidated: false,
|
|
68
|
-
error:
|
|
80
|
+
error: message,
|
|
69
81
|
};
|
|
70
82
|
}
|
|
71
83
|
}
|
|
@@ -73,14 +85,21 @@ export async function revalidateTag(tag, secret) {
|
|
|
73
85
|
* Revalidate path
|
|
74
86
|
*/
|
|
75
87
|
export async function revalidatePath(path, secret) {
|
|
88
|
+
const baseUrl = process.env.NEXT_PUBLIC_URL;
|
|
89
|
+
if (!baseUrl) {
|
|
90
|
+
logger.warn('revalidatePath skipped: NEXT_PUBLIC_URL is not configured', { path });
|
|
91
|
+
return { revalidated: false, error: 'NEXT_PUBLIC_URL is not configured' };
|
|
92
|
+
}
|
|
76
93
|
try {
|
|
77
|
-
const url = new URL('/api/revalidate',
|
|
78
|
-
|
|
94
|
+
const url = new URL('/api/revalidate', baseUrl);
|
|
95
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
79
96
|
if (secret) {
|
|
80
|
-
|
|
97
|
+
headers['x-revalidate-secret'] = secret;
|
|
81
98
|
}
|
|
82
99
|
const response = await fetch(url.toString(), {
|
|
83
100
|
method: 'POST',
|
|
101
|
+
headers,
|
|
102
|
+
body: JSON.stringify({ path }),
|
|
84
103
|
});
|
|
85
104
|
const data = await response.json();
|
|
86
105
|
return {
|
|
@@ -172,10 +191,24 @@ export function createEdgeCachedFetch(config = {}) {
|
|
|
172
191
|
/**
|
|
173
192
|
* Unstable cache wrapper (Next.js 14+)
|
|
174
193
|
*/
|
|
175
|
-
export function createCachedFunction(fn,
|
|
176
|
-
//
|
|
177
|
-
|
|
178
|
-
|
|
194
|
+
export function createCachedFunction(fn, options = {}) {
|
|
195
|
+
// If revalidation is disabled, bypass cache entirely
|
|
196
|
+
if (options.revalidate === false) {
|
|
197
|
+
return fn;
|
|
198
|
+
}
|
|
199
|
+
const ttlMs = (options.revalidate ?? 60) * 1000;
|
|
200
|
+
const cache = new Map();
|
|
201
|
+
return async (...args) => {
|
|
202
|
+
const key = JSON.stringify(args);
|
|
203
|
+
const now = Date.now();
|
|
204
|
+
const cached = cache.get(key);
|
|
205
|
+
if (cached && now < cached.expiresAt) {
|
|
206
|
+
return cached.value;
|
|
207
|
+
}
|
|
208
|
+
const value = await fn(...args);
|
|
209
|
+
cache.set(key, { value, expiresAt: now + ttlMs });
|
|
210
|
+
return value;
|
|
211
|
+
};
|
|
179
212
|
}
|
|
180
213
|
export class EdgeRateLimiter {
|
|
181
214
|
config;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/caching/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,iBAAiB,CAAC"}
|
|
@@ -110,26 +110,11 @@ export declare function getServiceWorkerState(): Promise<{
|
|
|
110
110
|
active: boolean;
|
|
111
111
|
controller: boolean;
|
|
112
112
|
}>;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
*/
|
|
116
|
-
export declare function useServiceWorker(config?: ServiceWorkerConfig): {
|
|
117
|
-
register: () => Promise<null>;
|
|
113
|
+
export interface ServiceWorkerHelper {
|
|
114
|
+
register: () => Promise<ServiceWorkerRegistration | null>;
|
|
118
115
|
unregister: () => Promise<boolean>;
|
|
119
116
|
update: () => Promise<void>;
|
|
120
117
|
skipWaitingAndActivate: () => Promise<void>;
|
|
121
|
-
state: {
|
|
122
|
-
registered: boolean;
|
|
123
|
-
installing: boolean;
|
|
124
|
-
waiting: boolean;
|
|
125
|
-
active: boolean;
|
|
126
|
-
controller: boolean;
|
|
127
|
-
};
|
|
128
|
-
} | {
|
|
129
|
-
register: () => Promise<ServiceWorkerRegistration | null>;
|
|
130
|
-
unregister: typeof unregisterServiceWorker;
|
|
131
|
-
update: typeof updateServiceWorker;
|
|
132
|
-
skipWaitingAndActivate: typeof skipWaitingAndActivate;
|
|
133
118
|
state: Promise<{
|
|
134
119
|
registered: boolean;
|
|
135
120
|
installing: boolean;
|
|
@@ -137,7 +122,14 @@ export declare function useServiceWorker(config?: ServiceWorkerConfig): {
|
|
|
137
122
|
active: boolean;
|
|
138
123
|
controller: boolean;
|
|
139
124
|
}>;
|
|
140
|
-
}
|
|
125
|
+
}
|
|
126
|
+
/** @deprecated Use `createServiceWorkerHelper` instead */
|
|
127
|
+
export type ServiceWorkerHook = ServiceWorkerHelper;
|
|
128
|
+
/**
|
|
129
|
+
* Create service worker helper with registration, update, and state methods.
|
|
130
|
+
* Not a React hook — safe to call conditionally or outside components.
|
|
131
|
+
*/
|
|
132
|
+
export declare function createServiceWorkerHelper(config?: ServiceWorkerConfig): ServiceWorkerHelper;
|
|
141
133
|
/**
|
|
142
134
|
* Offline detection
|
|
143
135
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-worker.d.ts","sourceRoot":"","sources":["../../src/caching/service-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAA;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,iBAAiB,EAAE,mBAI/B,CAAA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,GAAE,mBAAuC,GAC9C,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CA6C3C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAehE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAczD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB5D;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;CAenB,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAA;AAEpF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,aAAa,CAAA;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAgCtD,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAA;AAEV;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBvF;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAC,CAmBD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAWlE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;CACpB,CAAC,CAwCD;AAED
|
|
1
|
+
{"version":3,"file":"service-worker.d.ts","sourceRoot":"","sources":["../../src/caching/service-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -302,22 +302,23 @@ export async function getServiceWorkerState() {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
/**
|
|
305
|
-
*
|
|
305
|
+
* Create service worker helper with registration, update, and state methods.
|
|
306
|
+
* Not a React hook — safe to call conditionally or outside components.
|
|
306
307
|
*/
|
|
307
|
-
export function
|
|
308
|
+
export function createServiceWorkerHelper(config) {
|
|
308
309
|
if (typeof window === 'undefined') {
|
|
309
310
|
return {
|
|
310
311
|
register: async () => null,
|
|
311
312
|
unregister: async () => false,
|
|
312
313
|
update: async () => { },
|
|
313
314
|
skipWaitingAndActivate: async () => { },
|
|
314
|
-
state: {
|
|
315
|
+
state: Promise.resolve({
|
|
315
316
|
registered: false,
|
|
316
317
|
installing: false,
|
|
317
318
|
waiting: false,
|
|
318
319
|
active: false,
|
|
319
320
|
controller: false,
|
|
320
|
-
},
|
|
321
|
+
}),
|
|
321
322
|
};
|
|
322
323
|
}
|
|
323
324
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../../src/client/admin/RichText.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../../src/client/admin/RichText.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAED,YAAY,EAAE,eAAe,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboard.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/components/AdminDashboard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EAGb,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"AdminDashboard.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/components/AdminDashboard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EAGb,MAAM,yBAAyB,CAAC;AAUjC,UAAU,mBAAmB;IAC3B,MAAM,EAAE,YAAY,CAAC;CACtB;AA+VD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CAqS7D"}
|