@v-ibe/core 0.1.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/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/DI/__tests__/scoped-container-dependencies.test.d.ts +1 -0
- package/dist/DI/bootstrap.d.ts +18 -0
- package/dist/DI/decorators/inject.d.ts +37 -0
- package/dist/DI/decorators/inject.js +45 -0
- package/dist/DI/decorators/service.d.ts +24 -0
- package/dist/DI/decorators/service.js +13 -0
- package/dist/DI/di-container.d.ts +53 -0
- package/dist/DI/di-container.js +158 -0
- package/dist/DI/lifecycle.d.ts +37 -0
- package/dist/DI/lifecycle.js +6 -0
- package/dist/DI/scoped-container.d.ts +68 -0
- package/dist/DI/scoped-container.js +193 -0
- package/dist/DI/service-metadata.d.ts +32 -0
- package/dist/DI/service-metadata.js +31 -0
- package/dist/DI/types.d.ts +4 -0
- package/dist/behaviors/__tests__/behavior-system.test.d.ts +1 -0
- package/dist/behaviors/behavior-manager.d.ts +60 -0
- package/dist/behaviors/behavior-manager.js +131 -0
- package/dist/behaviors/behavior-registry.d.ts +68 -0
- package/dist/behaviors/behavior-registry.js +105 -0
- package/dist/behaviors/constants.d.ts +16 -0
- package/dist/behaviors/constants.js +8 -0
- package/dist/behaviors/decorators.d.ts +87 -0
- package/dist/behaviors/decorators.js +46 -0
- package/dist/behaviors/index.d.ts +4 -0
- package/dist/components/__tests__/host.test.d.ts +1 -0
- package/dist/components/app-tree.d.ts +49 -0
- package/dist/components/app-tree.js +122 -0
- package/dist/components/base-component.d.ts +85 -0
- package/dist/components/base-component.js +438 -0
- package/dist/components/decorators/component.d.ts +27 -0
- package/dist/components/decorators/component.js +47 -0
- package/dist/components/decorators/prop.d.ts +14 -0
- package/dist/components/decorators/prop.js +37 -0
- package/dist/components/types.d.ts +26 -0
- package/dist/core.d.ts +23 -0
- package/dist/core.js +8 -0
- package/dist/custom-components/__tests__/for.test.d.ts +1 -0
- package/dist/custom-components/__tests__/show.test.d.ts +1 -0
- package/dist/custom-components/for.d.ts +58 -0
- package/dist/custom-components/for.js +313 -0
- package/dist/custom-components/index.d.ts +2 -0
- package/dist/custom-components/show.d.ts +78 -0
- package/dist/custom-components/show.js +88 -0
- package/dist/data-management/cache/cache-invalidate.decorator.d.ts +35 -0
- package/dist/data-management/cache/cache-invalidate.decorator.js +21 -0
- package/dist/data-management/cache/cache-metadata.d.ts +15 -0
- package/dist/data-management/cache/cache-provider.interface.d.ts +67 -0
- package/dist/data-management/cache/cache-tags.decorator.d.ts +52 -0
- package/dist/data-management/cache/cache-tags.decorator.js +13 -0
- package/dist/data-management/cache/cache-update.decorator.d.ts +28 -0
- package/dist/data-management/cache/cache-update.decorator.js +21 -0
- package/dist/data-management/cache/cache.decorator.d.ts +28 -0
- package/dist/data-management/cache/cache.decorator.js +13 -0
- package/dist/data-management/cache/index.d.ts +11 -0
- package/dist/data-management/cache/local-storage-cache.d.ts +40 -0
- package/dist/data-management/cache/local-storage-cache.js +268 -0
- package/dist/data-management/cache/memory-cache.d.ts +37 -0
- package/dist/data-management/cache/memory-cache.js +149 -0
- package/dist/data-management/cache/session-storage-cache.d.ts +35 -0
- package/dist/data-management/cache/session-storage-cache.js +242 -0
- package/dist/data-management/cache/ttl.decorator.d.ts +31 -0
- package/dist/data-management/cache/ttl.decorator.js +34 -0
- package/dist/data-management/decorators/consume.d.ts +29 -0
- package/dist/data-management/decorators/consume.js +28 -0
- package/dist/data-management/decorators/id.d.ts +28 -0
- package/dist/data-management/decorators/id.js +19 -0
- package/dist/data-management/decorators/model.d.ts +48 -0
- package/dist/data-management/decorators/model.js +24 -0
- package/dist/data-management/decorators/prop.d.ts +43 -0
- package/dist/data-management/decorators/prop.js +32 -0
- package/dist/data-management/index.d.ts +13 -0
- package/dist/data-management/store/json-to-model.d.ts +45 -0
- package/dist/data-management/store/json-to-model.js +36 -0
- package/dist/data-management/store/store.d.ts +108 -0
- package/dist/data-management/store/store.js +207 -0
- package/dist/data-management/store/types.d.ts +53 -0
- package/dist/events-handler/decorators/emit.d.ts +29 -0
- package/dist/events-handler/decorators/emit.js +51 -0
- package/dist/events-handler/event-decorators.d.ts +1 -0
- package/dist/events-handler/event-emitter.service.d.ts +21 -0
- package/dist/events-handler/event-emitter.service.js +85 -0
- package/dist/events-handler/event-types.d.ts +12 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.js +121 -0
- package/dist/jsx/dynamic/__tests__/granular-array-renderer.test.d.ts +1 -0
- package/dist/jsx/dynamic/__tests__/jsx-array-rendering.test.d.ts +1 -0
- package/dist/jsx/dynamic/array-renderer.d.ts +2 -0
- package/dist/jsx/dynamic/array-renderer.js +133 -0
- package/dist/jsx/dynamic/child-renderer.d.ts +1 -0
- package/dist/jsx/dynamic/child-renderer.js +180 -0
- package/dist/jsx/dynamic/dom-utils.d.ts +5 -0
- package/dist/jsx/dynamic/dom-utils.js +22 -0
- package/dist/jsx/dynamic/granular-array-renderer.d.ts +16 -0
- package/dist/jsx/dynamic/granular-array-renderer.js +153 -0
- package/dist/jsx/dynamic/node-renderer.d.ts +2 -0
- package/dist/jsx/dynamic/props-handler.d.ts +3 -0
- package/dist/jsx/dynamic/props-handler.js +281 -0
- package/dist/jsx/dynamic/text-renderer.d.ts +2 -0
- package/dist/jsx/jsx-dev-runtime.d.ts +2 -0
- package/dist/jsx/jsx-runtime.d.ts +3 -0
- package/dist/jsx/types.d.ts +35 -0
- package/dist/jsx/types.js +4 -0
- package/dist/jsx-dev-runtime.d.ts +2 -0
- package/dist/jsx-dev-runtime.js +8 -0
- package/dist/jsx-runtime.d.ts +2 -0
- package/dist/jsx-runtime.js +11 -0
- package/dist/reactivity/__tests__/context-stack.test.d.ts +1 -0
- package/dist/reactivity/__tests__/nested-effects-untrack.test.d.ts +22 -0
- package/dist/reactivity/context-scope.d.ts +57 -0
- package/dist/reactivity/context-scope.js +35 -0
- package/dist/reactivity/decorators/__tests__/ctx-integration.test.d.ts +5 -0
- package/dist/reactivity/decorators/__tests__/ctx-loop.test.d.ts +10 -0
- package/dist/reactivity/decorators/__tests__/state-intelligent.test.d.ts +1 -0
- package/dist/reactivity/decorators/computed.d.ts +6 -0
- package/dist/reactivity/decorators/computed.js +17 -0
- package/dist/reactivity/decorators/create-event-decorator.d.ts +5 -0
- package/dist/reactivity/decorators/create-event-decorator.js +28 -0
- package/dist/reactivity/decorators/ctx.d.ts +9 -0
- package/dist/reactivity/decorators/ctx.js +91 -0
- package/dist/reactivity/decorators/effect.d.ts +9 -0
- package/dist/reactivity/decorators/effect.js +24 -0
- package/dist/reactivity/decorators/resource.d.ts +48 -0
- package/dist/reactivity/decorators/resource.js +20 -0
- package/dist/reactivity/decorators/state.d.ts +8 -0
- package/dist/reactivity/decorators/state.js +68 -0
- package/dist/reactivity/decorators/store.d.ts +6 -0
- package/dist/reactivity/decorators/store.js +25 -0
- package/dist/reactivity/phase-scheduler.d.ts +81 -0
- package/dist/reactivity/phase-scheduler.js +88 -0
- package/dist/reactivity/phase-scheduler.test.d.ts +1 -0
- package/dist/reactivity/reactive-cache.d.ts +21 -0
- package/dist/reactivity/reactive-cache.js +31 -0
- package/dist/reactivity/reactive-cache.test.d.ts +1 -0
- package/dist/reactivity/reactive-context.d.ts +152 -0
- package/dist/reactivity/reactive-context.js +184 -0
- package/dist/reactivity/signals/__tests__/composicion-automatica.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-1-estructura-basica.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-2-registro-subscribers.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-3-notificaciones-basicas.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-4-comparacion-valores.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-5-tracking-automatico.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-6-anti-glitch.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-7-objetos-anidados.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite/nivel-8-observable-array-support.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/composite-shallow-tracking.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/effect.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-1-estructura-basica.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-2-metodos-mutadores.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-3-tracking-por-indice.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-4-tracking-length.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-5-tracking-mutation.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-6-metodos-no-mutadores.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-7-composicion-bidireccional.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-8-proxies.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/reactive-array/nivel-9-derived-cache-optimization.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/resource.test.d.ts +1 -0
- package/dist/reactivity/signals/__tests__/signal.test.d.ts +1 -0
- package/dist/reactivity/signals/array-strategies.d.ts +120 -0
- package/dist/reactivity/signals/array-strategies.js +261 -0
- package/dist/reactivity/signals/composite.d.ts +89 -0
- package/dist/reactivity/signals/composite.js +145 -0
- package/dist/reactivity/signals/computed.d.ts +61 -0
- package/dist/reactivity/signals/computed.js +107 -0
- package/dist/reactivity/signals/computed.test.d.ts +1 -0
- package/dist/reactivity/signals/derived.d.ts +10 -0
- package/dist/reactivity/signals/derived.js +24 -0
- package/dist/reactivity/signals/effect.d.ts +27 -0
- package/dist/reactivity/signals/effect.js +46 -0
- package/dist/reactivity/signals/event.d.ts +9 -0
- package/dist/reactivity/signals/event.js +15 -0
- package/dist/reactivity/signals/reactive-array.d.ts +133 -0
- package/dist/reactivity/signals/reactive-array.js +490 -0
- package/dist/reactivity/signals/reactive-proxy.d.ts +54 -0
- package/dist/reactivity/signals/reactive-proxy.js +299 -0
- package/dist/reactivity/signals/reactive-tracking.test.d.ts +1 -0
- package/dist/reactivity/signals/resource.d.ts +9 -0
- package/dist/reactivity/signals/resource.js +58 -0
- package/dist/reactivity/signals/signal.d.ts +39 -0
- package/dist/reactivity/signals/signal.js +56 -0
- package/dist/reactivity/signals/subscription-management.test.d.ts +1 -0
- package/dist/reactivity/types.d.ts +12 -0
- package/dist/router/__tests__/link-behavior-active-class.test.d.ts +1 -0
- package/dist/router/__tests__/loop-detector.test.d.ts +1 -0
- package/dist/router/__tests__/params-container-resolution.test.d.ts +1 -0
- package/dist/router/__tests__/router-generated-routes.test.d.ts +1 -0
- package/dist/router/__tests__/router-params-granular.test.d.ts +1 -0
- package/dist/router/__tests__/router-params-simple.test.d.ts +1 -0
- package/dist/router/__tests__/router-query-params.test.d.ts +1 -0
- package/dist/router/__tests__/router-route-candidates.test.d.ts +1 -0
- package/dist/router/__tests__/routeview-app-articles.test.d.ts +1 -0
- package/dist/router/__tests__/routeview-debug.test.d.ts +1 -0
- package/dist/router/__tests__/routeview-integration.test.d.ts +1 -0
- package/dist/router/__tests__/routeview-this.test.d.ts +1 -0
- package/dist/router/decorators/base-policy.d.ts +141 -0
- package/dist/router/decorators/base-policy.js +63 -0
- package/dist/router/decorators/index.d.ts +6 -0
- package/dist/router/decorators/params.d.ts +31 -0
- package/dist/router/decorators/params.js +97 -0
- package/dist/router/decorators/route-metadata.d.ts +11 -0
- package/dist/router/decorators/route-metadata.js +23 -0
- package/dist/router/decorators/route.d.ts +39 -0
- package/dist/router/decorators/route.js +7 -0
- package/dist/router/link.behavior.d.ts +87 -0
- package/dist/router/link.behavior.js +227 -0
- package/dist/router/policy-evaluator.d.ts +81 -0
- package/dist/router/policy-evaluator.js +209 -0
- package/dist/router/route-view.d.ts +56 -0
- package/dist/router/route-view.js +156 -0
- package/dist/router/router.d.ts +67 -0
- package/dist/router/router.js +308 -0
- package/dist/router/static-analysis/index.d.ts +37 -0
- package/dist/router/static-analysis/parser.d.ts +14 -0
- package/dist/router/static-analysis/parser.js +147 -0
- package/dist/router/static-analysis/scanner.d.ts +27 -0
- package/dist/router/static-analysis/scanner.js +91 -0
- package/dist/router/trie.d.ts +14 -0
- package/dist/router/trie.js +126 -0
- package/dist/router/trie.types.d.ts +36 -0
- package/dist/styles/base-style-sheet.d.ts +96 -0
- package/dist/styles/base-style-sheet.js +149 -0
- package/dist/styles/decorators/factories.d.ts +76 -0
- package/dist/styles/decorators/factories.js +11 -0
- package/dist/styles/decorators/keyframes.d.ts +238 -0
- package/dist/styles/decorators/keyframes.js +79 -0
- package/dist/styles/decorators/rule.d.ts +177 -0
- package/dist/styles/decorators/rule.js +72 -0
- package/dist/styles/decorators/scope.d.ts +66 -0
- package/dist/styles/decorators/scope.js +17 -0
- package/dist/styles/decorators/style.d.ts +1 -0
- package/dist/styles/decorators/style.js +20 -0
- package/dist/styles/decorators/useStyles.d.ts +5 -0
- package/dist/styles/decorators/useStyles.js +29 -0
- package/dist/styles/global-styles-registry.d.ts +72 -0
- package/dist/styles/global-styles-registry.js +155 -0
- package/dist/types.d.ts +1 -0
- package/dist/vite-plugins/__tests__/jsx-control-flow-transform.test.d.ts +1 -0
- package/dist/vite-plugins/index.d.ts +4 -0
- package/dist/vite-plugins/index.js +10 -0
- package/dist/vite-plugins/jsx-contextual.d.ts +7 -0
- package/dist/vite-plugins/jsx-contextual.js +53 -0
- package/dist/vite-plugins/jsx-control-flow-transform.d.ts +60 -0
- package/dist/vite-plugins/jsx-control-flow-transform.js +180 -0
- package/dist/vite-plugins/jsx-signals.d.ts +2 -0
- package/dist/vite-plugins/jsx-signals.js +124 -0
- package/dist/vite-plugins/router/route-generator-plugin.d.ts +63 -0
- package/dist/vite-plugins/router/route-generator-plugin.js +310 -0
- package/package.json +85 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CacheProvider } from './cache-provider.interface';
|
|
2
|
+
export type Constructor<T> = new (...args: any[]) => T;
|
|
3
|
+
export type TagExtractor = (result: any, args: any[]) => string[];
|
|
4
|
+
/**
|
|
5
|
+
* @CacheUpdate Decorator
|
|
6
|
+
*
|
|
7
|
+
* Actualiza las entradas del cache que coincidan con los tags extraídos del resultado
|
|
8
|
+
* de un método. Útil para mantener el cache sincronizado después de operaciones de
|
|
9
|
+
* actualización (PUT, PATCH, etc.).
|
|
10
|
+
*
|
|
11
|
+
* Preserva el TTL original de cada entrada del cache.
|
|
12
|
+
*
|
|
13
|
+
* @param ProviderClass - La clase del cache provider a usar
|
|
14
|
+
* @param tagExtractor - Función que extrae tags del resultado y argumentos
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* @CacheUpdate(
|
|
19
|
+
* LocalStorageCache,
|
|
20
|
+
* (result) => [`user:${result.id}`]
|
|
21
|
+
* )
|
|
22
|
+
* async updateUser(userId: string, data: any): Promise<User> {
|
|
23
|
+
* const response = await this.httpClient.put(`/users/${userId}`, data);
|
|
24
|
+
* return response.data;
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function CacheUpdate(ProviderClass: Constructor<CacheProvider>, tagExtractor: TagExtractor): (originalMethod: Function, context: ClassMethodDecoratorContext) => (this: any, ...args: any[]) => Promise<any>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function CacheUpdate(ProviderClass, tagExtractor) {
|
|
2
|
+
return function(originalMethod, context) {
|
|
3
|
+
return async function(...args) {
|
|
4
|
+
const result = await originalMethod.apply(this, args);
|
|
5
|
+
const provider = this.__container.get(ProviderClass);
|
|
6
|
+
if (!provider) {
|
|
7
|
+
console.warn(`[CacheUpdate] Provider ${ProviderClass.name} not found in DI container`);
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
const tags = tagExtractor(result, args);
|
|
11
|
+
if (!tags || tags.length === 0) {
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
provider.updateByTags(tags, result);
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
CacheUpdate
|
|
21
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Constructor } from '../../DI/types';
|
|
2
|
+
import { CacheProvider } from './cache-provider.interface';
|
|
3
|
+
/**
|
|
4
|
+
* @Cache DECORATOR
|
|
5
|
+
*
|
|
6
|
+
* Define qué cache provider usar para un método.
|
|
7
|
+
* El provider debe estar decorado con @Service.
|
|
8
|
+
*
|
|
9
|
+
* Si no se especifica @Cache, se usa MemoryCache por defecto.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @Cache - Define el provider de cache para un método
|
|
13
|
+
*
|
|
14
|
+
* @param ProviderClass - Clase del cache provider (debe tener @Service)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Cache en LocalStorage
|
|
18
|
+
* @Cache(LocalStorageCache)
|
|
19
|
+
* @TTL(5000)
|
|
20
|
+
* async getUserPreferences() { }
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // Cache en SessionStorage
|
|
24
|
+
* @Cache(SessionStorageCache)
|
|
25
|
+
* @TTL(3000)
|
|
26
|
+
* async getFilterState() { }
|
|
27
|
+
*/
|
|
28
|
+
export declare function Cache<T extends CacheProvider>(ProviderClass: Constructor<T>): (target: any, context: ClassMethodDecoratorContext) => void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function Cache(ProviderClass) {
|
|
2
|
+
return function(target, context) {
|
|
3
|
+
const metadata = context.metadata;
|
|
4
|
+
const methodName = String(context.name);
|
|
5
|
+
if (!metadata.cacheProviders) {
|
|
6
|
+
metadata.cacheProviders = {};
|
|
7
|
+
}
|
|
8
|
+
metadata.cacheProviders[methodName] = ProviderClass;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
Cache
|
|
13
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { CacheProvider, CacheEntry } from './cache-provider.interface';
|
|
2
|
+
export { MemoryCache } from './memory-cache';
|
|
3
|
+
export { LocalStorageCache } from './local-storage-cache';
|
|
4
|
+
export { SessionStorageCache } from './session-storage-cache';
|
|
5
|
+
export { Cache } from './cache.decorator';
|
|
6
|
+
export { TTL } from './ttl.decorator';
|
|
7
|
+
export { CacheTags } from './cache-tags.decorator';
|
|
8
|
+
export type { TagExtractor } from './cache-tags.decorator';
|
|
9
|
+
export { getCacheMetadata, setCacheProviderClass, setTagExtractor } from './cache-metadata';
|
|
10
|
+
export { CacheUpdate } from './cache-update.decorator';
|
|
11
|
+
export { CacheInvalidate } from './cache-invalidate.decorator';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CacheProvider, CacheEntry } from './cache-provider.interface';
|
|
2
|
+
/**
|
|
3
|
+
* LOCALSTORAGE CACHE PROVIDER
|
|
4
|
+
*
|
|
5
|
+
* Provider de cache en LocalStorage.
|
|
6
|
+
*
|
|
7
|
+
* CARACTERÍSTICAS:
|
|
8
|
+
* - Persistente (sobrevive recargas y cierres de navegador)
|
|
9
|
+
* - Límite ~5-10MB (depende del navegador)
|
|
10
|
+
* - Sincrónico (puede bloquear si hay mucha data)
|
|
11
|
+
* - Ideal para: preferencias de usuario, datos que persisten entre sesiones
|
|
12
|
+
*
|
|
13
|
+
* IMPORTANTE: Los datos deben ser serializables a JSON.
|
|
14
|
+
*/
|
|
15
|
+
export declare class LocalStorageCache implements CacheProvider {
|
|
16
|
+
private readonly prefix;
|
|
17
|
+
private readonly tagIndexKey;
|
|
18
|
+
get tagIndex(): Map<string, Set<string>>;
|
|
19
|
+
get cache(): Map<string, CacheEntry<any>>;
|
|
20
|
+
private getStorageKey;
|
|
21
|
+
private getTagIndex;
|
|
22
|
+
private saveTagIndex;
|
|
23
|
+
get<T>(key: string): T | null;
|
|
24
|
+
set<T>(key: string, value: T, ttl: number, tags?: string[]): void;
|
|
25
|
+
delete(key: string): void;
|
|
26
|
+
clear(): void;
|
|
27
|
+
invalidatePattern(pattern: RegExp): void;
|
|
28
|
+
invalidateTag(tag: string): void;
|
|
29
|
+
getKeysByTag(tag: string): string[];
|
|
30
|
+
updateByTags<T>(tags: string[], value: T): void;
|
|
31
|
+
invalidateTags(tags: string[]): void;
|
|
32
|
+
/**
|
|
33
|
+
* Limpia entradas expiradas (útil para liberar espacio).
|
|
34
|
+
*/
|
|
35
|
+
clearExpired(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Lifecycle hook - se ejecuta cuando el container se destruye
|
|
38
|
+
*/
|
|
39
|
+
onDestroy(): void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { Service } from "../../DI/decorators/service.js";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
6
|
+
var __typeError = (msg) => {
|
|
7
|
+
throw TypeError(msg);
|
|
8
|
+
};
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
11
|
+
var __decoratorStart = (base) => [, , , __create(null)];
|
|
12
|
+
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
13
|
+
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
14
|
+
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
15
|
+
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
16
|
+
var __runInitializers = (array, flags, self, value) => {
|
|
17
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
var __decorateElement = (array, flags, name, decorators, target, extra) => {
|
|
21
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
22
|
+
var j = 0;
|
|
23
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
24
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc(target, name));
|
|
25
|
+
__name(target, name);
|
|
26
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
27
|
+
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
|
|
28
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
29
|
+
__expectFn(it) && (target = it);
|
|
30
|
+
}
|
|
31
|
+
return __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
32
|
+
};
|
|
33
|
+
var _LocalStorageCache_decorators, _init;
|
|
34
|
+
_LocalStorageCache_decorators = [Service];
|
|
35
|
+
class LocalStorageCache {
|
|
36
|
+
constructor() {
|
|
37
|
+
this.prefix = "cache";
|
|
38
|
+
this.tagIndexKey = "cache:tagIndex";
|
|
39
|
+
}
|
|
40
|
+
// Exposed for CacheUpdate decorator
|
|
41
|
+
get tagIndex() {
|
|
42
|
+
return this.getTagIndex();
|
|
43
|
+
}
|
|
44
|
+
// Exposed for CacheUpdate decorator
|
|
45
|
+
get cache() {
|
|
46
|
+
const cacheMap = /* @__PURE__ */ new Map();
|
|
47
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
48
|
+
const storageKey = localStorage.key(i);
|
|
49
|
+
if (storageKey && storageKey.startsWith(`${this.prefix}:`)) {
|
|
50
|
+
try {
|
|
51
|
+
const item = localStorage.getItem(storageKey);
|
|
52
|
+
if (item) {
|
|
53
|
+
const key = storageKey.substring(this.prefix.length + 1);
|
|
54
|
+
cacheMap.set(key, JSON.parse(item));
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return cacheMap;
|
|
61
|
+
}
|
|
62
|
+
getStorageKey(key) {
|
|
63
|
+
return `${this.prefix}:${key}`;
|
|
64
|
+
}
|
|
65
|
+
getTagIndex() {
|
|
66
|
+
try {
|
|
67
|
+
const data = localStorage.getItem(this.tagIndexKey);
|
|
68
|
+
if (!data) {
|
|
69
|
+
return /* @__PURE__ */ new Map();
|
|
70
|
+
}
|
|
71
|
+
const parsed = JSON.parse(data);
|
|
72
|
+
return new Map(
|
|
73
|
+
Object.entries(parsed).map(([tag, keys]) => [tag, new Set(keys)])
|
|
74
|
+
);
|
|
75
|
+
} catch {
|
|
76
|
+
return /* @__PURE__ */ new Map();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
saveTagIndex(tagIndex) {
|
|
80
|
+
try {
|
|
81
|
+
const obj = {};
|
|
82
|
+
tagIndex.forEach((keys, tag) => {
|
|
83
|
+
obj[tag] = Array.from(keys);
|
|
84
|
+
});
|
|
85
|
+
localStorage.setItem(this.tagIndexKey, JSON.stringify(obj));
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error("[LocalStorageCache] Error saving tag index:", error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
get(key) {
|
|
91
|
+
try {
|
|
92
|
+
const storageKey = this.getStorageKey(key);
|
|
93
|
+
const item = localStorage.getItem(storageKey);
|
|
94
|
+
if (!item) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const entry = JSON.parse(item);
|
|
98
|
+
const now = Date.now();
|
|
99
|
+
const age = now - entry.timestamp;
|
|
100
|
+
if (age > entry.ttl) {
|
|
101
|
+
this.delete(key);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return entry.value;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error("[LocalStorageCache] Error getting item:", error);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
set(key, value, ttl, tags = []) {
|
|
111
|
+
try {
|
|
112
|
+
const storageKey = this.getStorageKey(key);
|
|
113
|
+
const entry = {
|
|
114
|
+
value,
|
|
115
|
+
timestamp: Date.now(),
|
|
116
|
+
ttl,
|
|
117
|
+
tags
|
|
118
|
+
};
|
|
119
|
+
const serialized = JSON.stringify(entry);
|
|
120
|
+
localStorage.setItem(storageKey, serialized);
|
|
121
|
+
if (tags.length > 0) {
|
|
122
|
+
const tagIndex = this.getTagIndex();
|
|
123
|
+
tags.forEach((tag) => {
|
|
124
|
+
if (!tagIndex.has(tag)) {
|
|
125
|
+
tagIndex.set(tag, /* @__PURE__ */ new Set());
|
|
126
|
+
}
|
|
127
|
+
tagIndex.get(tag).add(key);
|
|
128
|
+
});
|
|
129
|
+
this.saveTagIndex(tagIndex);
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error("[LocalStorageCache] Error setting item:", error);
|
|
133
|
+
this.clearExpired();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
delete(key) {
|
|
137
|
+
try {
|
|
138
|
+
const storageKey = this.getStorageKey(key);
|
|
139
|
+
const item = localStorage.getItem(storageKey);
|
|
140
|
+
if (item) {
|
|
141
|
+
const entry = JSON.parse(item);
|
|
142
|
+
if (entry.tags && entry.tags.length > 0) {
|
|
143
|
+
const tagIndex = this.getTagIndex();
|
|
144
|
+
entry.tags.forEach((tag) => {
|
|
145
|
+
tagIndex.get(tag)?.delete(key);
|
|
146
|
+
if (tagIndex.get(tag)?.size === 0) {
|
|
147
|
+
tagIndex.delete(tag);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
this.saveTagIndex(tagIndex);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
localStorage.removeItem(storageKey);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.error("[LocalStorageCache] Error deleting item:", error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
clear() {
|
|
159
|
+
const keysToRemove = [];
|
|
160
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
161
|
+
const key = localStorage.key(i);
|
|
162
|
+
if (key && key.startsWith(`${this.prefix}:`)) {
|
|
163
|
+
keysToRemove.push(key);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
keysToRemove.forEach((key) => localStorage.removeItem(key));
|
|
167
|
+
localStorage.removeItem(this.tagIndexKey);
|
|
168
|
+
}
|
|
169
|
+
invalidatePattern(pattern) {
|
|
170
|
+
const keysToRemove = [];
|
|
171
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
172
|
+
const storageKey = localStorage.key(i);
|
|
173
|
+
if (storageKey && storageKey.startsWith(`${this.prefix}:`)) {
|
|
174
|
+
const key = storageKey.substring(this.prefix.length + 1);
|
|
175
|
+
if (pattern.test(key)) {
|
|
176
|
+
keysToRemove.push(key);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
keysToRemove.forEach((key) => this.delete(key));
|
|
181
|
+
}
|
|
182
|
+
invalidateTag(tag) {
|
|
183
|
+
const tagIndex = this.getTagIndex();
|
|
184
|
+
const keysToInvalidate = tagIndex.get(tag);
|
|
185
|
+
if (!keysToInvalidate) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const keys = Array.from(keysToInvalidate);
|
|
189
|
+
keys.forEach((key) => this.delete(key));
|
|
190
|
+
}
|
|
191
|
+
getKeysByTag(tag) {
|
|
192
|
+
const tagIndex = this.getTagIndex();
|
|
193
|
+
const keys = tagIndex.get(tag);
|
|
194
|
+
return keys ? Array.from(keys) : [];
|
|
195
|
+
}
|
|
196
|
+
updateByTags(tags, value) {
|
|
197
|
+
const tagIndex = this.getTagIndex();
|
|
198
|
+
const keysToUpdate = /* @__PURE__ */ new Set();
|
|
199
|
+
tags.forEach((tag) => {
|
|
200
|
+
const keys = tagIndex.get(tag);
|
|
201
|
+
if (keys) {
|
|
202
|
+
keys.forEach((key) => keysToUpdate.add(key));
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
keysToUpdate.forEach((key) => {
|
|
206
|
+
const storageKey = this.getStorageKey(key);
|
|
207
|
+
const item = localStorage.getItem(storageKey);
|
|
208
|
+
if (item) {
|
|
209
|
+
try {
|
|
210
|
+
const fullEntry = JSON.parse(item);
|
|
211
|
+
this.set(key, value, fullEntry.ttl, fullEntry.tags);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
console.error(`[LocalStorageCache] Error parsing entry for ${key}:`, error);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
invalidateTags(tags) {
|
|
219
|
+
const tagIndex = this.getTagIndex();
|
|
220
|
+
const keysToInvalidate = /* @__PURE__ */ new Set();
|
|
221
|
+
tags.forEach((tag) => {
|
|
222
|
+
const keys = tagIndex.get(tag);
|
|
223
|
+
if (keys) {
|
|
224
|
+
keys.forEach((key) => keysToInvalidate.add(key));
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
keysToInvalidate.forEach((key) => this.delete(key));
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Limpia entradas expiradas (útil para liberar espacio).
|
|
231
|
+
*/
|
|
232
|
+
clearExpired() {
|
|
233
|
+
const now = Date.now();
|
|
234
|
+
const keysToRemove = [];
|
|
235
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
236
|
+
const storageKey = localStorage.key(i);
|
|
237
|
+
if (storageKey && storageKey.startsWith(`${this.prefix}:`)) {
|
|
238
|
+
try {
|
|
239
|
+
const item = localStorage.getItem(storageKey);
|
|
240
|
+
if (item) {
|
|
241
|
+
const entry = JSON.parse(item);
|
|
242
|
+
const age = now - entry.timestamp;
|
|
243
|
+
if (age > entry.ttl) {
|
|
244
|
+
const key = storageKey.substring(this.prefix.length + 1);
|
|
245
|
+
keysToRemove.push(key);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
} catch (error) {
|
|
249
|
+
const key = storageKey.substring(this.prefix.length + 1);
|
|
250
|
+
keysToRemove.push(key);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
keysToRemove.forEach((key) => this.delete(key));
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Lifecycle hook - se ejecuta cuando el container se destruye
|
|
258
|
+
*/
|
|
259
|
+
onDestroy() {
|
|
260
|
+
this.clearExpired();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
_init = __decoratorStart();
|
|
264
|
+
LocalStorageCache = __decorateElement(_init, 0, "LocalStorageCache", _LocalStorageCache_decorators, LocalStorageCache);
|
|
265
|
+
__runInitializers(_init, 1, LocalStorageCache);
|
|
266
|
+
export {
|
|
267
|
+
LocalStorageCache
|
|
268
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CacheProvider, CacheEntry } from './cache-provider.interface';
|
|
2
|
+
/**
|
|
3
|
+
* MEMORY CACHE PROVIDER
|
|
4
|
+
*
|
|
5
|
+
* Provider de cache en memoria (RAM).
|
|
6
|
+
*
|
|
7
|
+
* CARACTERÍSTICAS:
|
|
8
|
+
* - Rápido (acceso directo a Map)
|
|
9
|
+
* - No persistente (se pierde al recargar)
|
|
10
|
+
* - Ideal para: datos temporales, sesión actual
|
|
11
|
+
*
|
|
12
|
+
* Este es el provider por defecto cuando no se especifica @Cache.
|
|
13
|
+
*/
|
|
14
|
+
export declare class MemoryCache implements CacheProvider {
|
|
15
|
+
cache: Map<string, CacheEntry<any>>;
|
|
16
|
+
tagIndex: Map<string, Set<string>>;
|
|
17
|
+
get<T>(key: string): T | null;
|
|
18
|
+
set<T>(key: string, value: T, ttl: number, tags?: string[]): void;
|
|
19
|
+
delete(key: string): void;
|
|
20
|
+
clear(): void;
|
|
21
|
+
invalidatePattern(pattern: RegExp): void;
|
|
22
|
+
invalidateTag(tag: string): void;
|
|
23
|
+
getKeysByTag(tag: string): string[];
|
|
24
|
+
updateByTags<T>(tags: string[], value: T): void;
|
|
25
|
+
invalidateTags(tags: string[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Método de utilidad para debugging.
|
|
28
|
+
*/
|
|
29
|
+
getStats(): {
|
|
30
|
+
size: number;
|
|
31
|
+
keys: string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Lifecycle hook - se ejecuta cuando el container se destruye
|
|
35
|
+
*/
|
|
36
|
+
onDestroy(): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Service } from "../../DI/decorators/service.js";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
6
|
+
var __typeError = (msg) => {
|
|
7
|
+
throw TypeError(msg);
|
|
8
|
+
};
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
11
|
+
var __decoratorStart = (base) => [, , , __create(null)];
|
|
12
|
+
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
13
|
+
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
14
|
+
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
15
|
+
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
16
|
+
var __runInitializers = (array, flags, self, value) => {
|
|
17
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
var __decorateElement = (array, flags, name, decorators, target, extra) => {
|
|
21
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
22
|
+
var j = 0;
|
|
23
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
24
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc(target, name));
|
|
25
|
+
__name(target, name);
|
|
26
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
27
|
+
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
|
|
28
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
29
|
+
__expectFn(it) && (target = it);
|
|
30
|
+
}
|
|
31
|
+
return __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
32
|
+
};
|
|
33
|
+
var _MemoryCache_decorators, _init;
|
|
34
|
+
_MemoryCache_decorators = [Service];
|
|
35
|
+
class MemoryCache {
|
|
36
|
+
constructor() {
|
|
37
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
38
|
+
this.tagIndex = /* @__PURE__ */ new Map();
|
|
39
|
+
}
|
|
40
|
+
// tag → cache keys
|
|
41
|
+
get(key) {
|
|
42
|
+
const entry = this.cache.get(key);
|
|
43
|
+
if (!entry) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
const age = now - entry.timestamp;
|
|
48
|
+
if (age > entry.ttl) {
|
|
49
|
+
this.delete(key);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return entry.value;
|
|
53
|
+
}
|
|
54
|
+
set(key, value, ttl, tags = []) {
|
|
55
|
+
this.cache.set(key, {
|
|
56
|
+
value,
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
ttl,
|
|
59
|
+
tags
|
|
60
|
+
});
|
|
61
|
+
tags.forEach((tag) => {
|
|
62
|
+
if (!this.tagIndex.has(tag)) {
|
|
63
|
+
this.tagIndex.set(tag, /* @__PURE__ */ new Set());
|
|
64
|
+
}
|
|
65
|
+
this.tagIndex.get(tag).add(key);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
delete(key) {
|
|
69
|
+
const entry = this.cache.get(key);
|
|
70
|
+
if (entry) {
|
|
71
|
+
entry.tags.forEach((tag) => {
|
|
72
|
+
this.tagIndex.get(tag)?.delete(key);
|
|
73
|
+
if (this.tagIndex.get(tag)?.size === 0) {
|
|
74
|
+
this.tagIndex.delete(tag);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
this.cache.delete(key);
|
|
79
|
+
}
|
|
80
|
+
clear() {
|
|
81
|
+
this.cache.clear();
|
|
82
|
+
this.tagIndex.clear();
|
|
83
|
+
}
|
|
84
|
+
invalidatePattern(pattern) {
|
|
85
|
+
for (const key of this.cache.keys()) {
|
|
86
|
+
if (pattern.test(key)) {
|
|
87
|
+
this.delete(key);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
invalidateTag(tag) {
|
|
92
|
+
const keysToInvalidate = this.tagIndex.get(tag);
|
|
93
|
+
if (!keysToInvalidate) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const keys = Array.from(keysToInvalidate);
|
|
97
|
+
keys.forEach((key) => this.delete(key));
|
|
98
|
+
}
|
|
99
|
+
getKeysByTag(tag) {
|
|
100
|
+
const keys = this.tagIndex.get(tag);
|
|
101
|
+
return keys ? Array.from(keys) : [];
|
|
102
|
+
}
|
|
103
|
+
updateByTags(tags, value) {
|
|
104
|
+
const keysToUpdate = /* @__PURE__ */ new Set();
|
|
105
|
+
tags.forEach((tag) => {
|
|
106
|
+
const keys = this.tagIndex.get(tag);
|
|
107
|
+
if (keys) {
|
|
108
|
+
keys.forEach((key) => keysToUpdate.add(key));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
keysToUpdate.forEach((key) => {
|
|
112
|
+
const entry = this.cache.get(key);
|
|
113
|
+
if (entry) {
|
|
114
|
+
this.set(key, value, entry.ttl, entry.tags);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
invalidateTags(tags) {
|
|
119
|
+
const keysToInvalidate = /* @__PURE__ */ new Set();
|
|
120
|
+
tags.forEach((tag) => {
|
|
121
|
+
const keys = this.tagIndex.get(tag);
|
|
122
|
+
if (keys) {
|
|
123
|
+
keys.forEach((key) => keysToInvalidate.add(key));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
keysToInvalidate.forEach((key) => this.delete(key));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Método de utilidad para debugging.
|
|
130
|
+
*/
|
|
131
|
+
getStats() {
|
|
132
|
+
return {
|
|
133
|
+
size: this.cache.size,
|
|
134
|
+
keys: Array.from(this.cache.keys())
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Lifecycle hook - se ejecuta cuando el container se destruye
|
|
139
|
+
*/
|
|
140
|
+
onDestroy() {
|
|
141
|
+
this.clear();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
_init = __decoratorStart();
|
|
145
|
+
MemoryCache = __decorateElement(_init, 0, "MemoryCache", _MemoryCache_decorators, MemoryCache);
|
|
146
|
+
__runInitializers(_init, 1, MemoryCache);
|
|
147
|
+
export {
|
|
148
|
+
MemoryCache
|
|
149
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CacheProvider } from './cache-provider.interface';
|
|
2
|
+
/**
|
|
3
|
+
* SESSIONSTORAGE CACHE PROVIDER
|
|
4
|
+
*
|
|
5
|
+
* Provider de cache en SessionStorage.
|
|
6
|
+
*
|
|
7
|
+
* CARACTERÍSTICAS:
|
|
8
|
+
* - Persistente solo durante la sesión del navegador
|
|
9
|
+
* - Se limpia al cerrar la pestaña/ventana
|
|
10
|
+
* - Límite ~5-10MB (depende del navegador)
|
|
11
|
+
* - Ideal para: datos temporales de la sesión, estado de UI
|
|
12
|
+
*
|
|
13
|
+
* IMPORTANTE: Los datos deben ser serializables a JSON.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SessionStorageCache implements CacheProvider {
|
|
16
|
+
private readonly prefix;
|
|
17
|
+
private readonly tagIndexKey;
|
|
18
|
+
private getStorageKey;
|
|
19
|
+
private getTagIndex;
|
|
20
|
+
private saveTagIndex;
|
|
21
|
+
get<T>(key: string): T | null;
|
|
22
|
+
set<T>(key: string, value: T, ttl: number, tags?: string[]): void;
|
|
23
|
+
delete(key: string): void;
|
|
24
|
+
clear(): void;
|
|
25
|
+
invalidatePattern(pattern: RegExp): void;
|
|
26
|
+
invalidateTag(tag: string): void;
|
|
27
|
+
getKeysByTag(tag: string): string[];
|
|
28
|
+
updateByTags<T>(tags: string[], value: T): void;
|
|
29
|
+
invalidateTags(tags: string[]): void;
|
|
30
|
+
clearExpired(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Lifecycle hook - se ejecuta cuando el container se destruye
|
|
33
|
+
*/
|
|
34
|
+
onDestroy(): void;
|
|
35
|
+
}
|