@angular-cool/repository 21.0.8 → 21.0.9
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
CHANGED
|
@@ -64,7 +64,7 @@ export class MyComponent {
|
|
|
64
64
|
|
|
65
65
|
```html
|
|
66
66
|
@if (myItem.isLoading()) {
|
|
67
|
-
|
|
67
|
+
<div>Loading</div>
|
|
68
68
|
}
|
|
69
69
|
```
|
|
70
70
|
|
|
@@ -96,6 +96,12 @@ await this._myService.items.updateValue(this.idParam(), val => {
|
|
|
96
96
|
});
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
+
### Remove value
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
await this._myService.items.remove(this.idParam());
|
|
103
|
+
```
|
|
104
|
+
|
|
99
105
|
## License
|
|
100
106
|
|
|
101
107
|
> The MIT License (MIT)
|
|
@@ -51,6 +51,11 @@ class ResourceCache {
|
|
|
51
51
|
invalidate() {
|
|
52
52
|
this._validUntil = null;
|
|
53
53
|
}
|
|
54
|
+
async removeAsync() {
|
|
55
|
+
await this.setValueAsync(undefined);
|
|
56
|
+
this._valueSubject.complete();
|
|
57
|
+
this._isLoadingSubject.complete();
|
|
58
|
+
}
|
|
54
59
|
_setIsLoading(isLoading) {
|
|
55
60
|
this._isLoading = isLoading;
|
|
56
61
|
this._isLoadingSubject.next(isLoading);
|
|
@@ -90,9 +95,24 @@ class ResourceRepositoryImpl {
|
|
|
90
95
|
set: async (value) => {
|
|
91
96
|
await this.setValue(key(), value);
|
|
92
97
|
},
|
|
98
|
+
update: async (valueUpdater) => {
|
|
99
|
+
await this.updateValue(key(), valueUpdater);
|
|
100
|
+
},
|
|
101
|
+
remove: async () => {
|
|
102
|
+
await this.remove(key());
|
|
103
|
+
},
|
|
93
104
|
isLoading: computed(() => isLoadingSignal() ?? true),
|
|
94
105
|
});
|
|
95
106
|
}
|
|
107
|
+
async remove(key) {
|
|
108
|
+
const cacheKey = this._createCacheKey(key);
|
|
109
|
+
const cache = this._cacheStore.get(cacheKey);
|
|
110
|
+
if (!cache) {
|
|
111
|
+
throw new Error(`No cache found for the given key: ${key}`);
|
|
112
|
+
}
|
|
113
|
+
await cache.removeAsync();
|
|
114
|
+
this._cacheStore.delete(cacheKey);
|
|
115
|
+
}
|
|
96
116
|
async reload(key) {
|
|
97
117
|
const cacheKey = this._createCacheKey(key);
|
|
98
118
|
const cache = this._cacheStore.get(cacheKey);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-cool-repository.mjs","sources":["../../../projects/repository/src/lib/resource-cache.ts","../../../projects/repository/src/lib/resource-repository.ts","../../../projects/repository/src/public-api.ts","../../../projects/repository/src/angular-cool-repository.ts"],"sourcesContent":["import { BehaviorSubject, firstValueFrom, ReplaySubject } from 'rxjs';\n\nexport class ResourceCache<TItem> {\n private _valueSubject = new ReplaySubject<TItem | undefined>(1);\n\n private _isLoading = false;\n private _isLoadingSubject = new BehaviorSubject<boolean>(false);\n\n private _validUntil: number | null = null;\n\n public get isInvalid(): boolean {\n return this._validUntil === null || Date.now() > this._validUntil;\n }\n\n constructor(\n private loader: () => Promise<TItem | undefined>,\n private maxAge: number,\n ) {\n }\n\n public getValueObservable() {\n return this._valueSubject.asObservable();\n }\n\n public isLoadingObservable() {\n return this._isLoadingSubject.asObservable();\n }\n\n public async keepDataFreshAsync() {\n if (!this.isInvalid) {\n return;\n }\n\n await this._reloadValueAsync();\n }\n\n private async _reloadValueAsync(): Promise<void> {\n if (this._isLoading) {\n await firstValueFrom(this._isLoadingSubject);\n\n return;\n }\n\n this._setIsLoading(true);\n\n try {\n const data = await this.loader();\n\n await this.setValueAsync(data);\n } finally {\n this._setIsLoading(false);\n }\n }\n\n public async setValueAsync(value: TItem | undefined) {\n this._validUntil = Date.now() + this.maxAge;\n this._valueSubject.next(value);\n }\n\n public async getValueAsync(): Promise<TItem | undefined> {\n await this.keepDataFreshAsync();\n\n return firstValueFrom(this._valueSubject);\n }\n\n public invalidate() {\n this._validUntil = null;\n }\n\n private _setIsLoading(isLoading: boolean) {\n this._isLoading = isLoading;\n this._isLoadingSubject.next(isLoading);\n }\n}\n","import { computed, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ResourceCache } from './resource-cache';\nimport { ResourceRepositorySignal } from '../interface/resource-repository-signal.interface';\nimport { ResourceRepository, ResourceRepositoryOptions } from '../interface/resource-repository.interface';\nimport { map, switchMap, tap } from 'rxjs';\n\nconst DEFAULT_MAX_AGE = 5 * 60 * 1000;\n\ntype CacheKey = string;\n\nexport class ResourceRepositoryImpl<TParams, TItem> implements ResourceRepository<TParams, TItem> {\n private _cacheStore = new Map<CacheKey, ResourceCache<TItem>>();\n\n constructor(private options: ResourceRepositoryOptions<TParams, TItem>) {\n }\n\n public get(key: Signal<TParams>): ResourceRepositorySignal<TItem | undefined> {\n const cacheObservable = toObservable(key)\n .pipe(\n map(keyValue => {\n const cacheKey = this._createCacheKey(keyValue);\n\n let cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n cache = new ResourceCache(\n ((p) => () => this.options.loader(p))(keyValue),\n this.options.maxAge ?? DEFAULT_MAX_AGE,\n );\n\n this._cacheStore.set(cacheKey, cache);\n }\n\n return cache;\n }),\n );\n\n const resultSignal = toSignal(\n cacheObservable\n .pipe(\n tap(cache => {\n // Do not wait for it to load\n cache.keepDataFreshAsync();\n }),\n switchMap(_ => _.getValueObservable()),\n ),\n {\n equal: () => false,\n }\n );\n\n const isLoadingSignal = toSignal(\n cacheObservable\n .pipe(\n switchMap(_ => _.isLoadingObservable()),\n )\n );\n\n return Object.assign(resultSignal, {\n reload: async () => {\n await this.reload(key());\n },\n set: async (value: TItem | undefined) => {\n await this.setValue(key(), value as TItem);\n },\n isLoading: computed<boolean>(() => isLoadingSignal() ?? true),\n } satisfies Omit<ResourceRepositorySignal<TItem | undefined>, keyof Signal<TItem | undefined>>);\n }\n\n public async reload(key: TParams): Promise<void> {\n const cacheKey = this._createCacheKey(key);\n\n const cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n cache.invalidate();\n\n await cache.keepDataFreshAsync();\n }\n\n public async getValue(key: TParams): Promise<TItem | undefined> {\n const cacheKey = this._createCacheKey(key);\n\n const cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n return await cache.getValueAsync();\n }\n\n public async setValue(key: TParams, value: TItem): Promise<void> {\n const cacheKey = this._createCacheKey(key);\n\n let cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n await cache.setValueAsync(value);\n }\n\n public async updateValue(key: TParams, updateFn: (value: TItem | undefined) => Promise<TItem>): Promise<void> {\n const value = await this.getValue(key);\n\n await this.setValue(key, await updateFn(value));\n }\n\n private _createCacheKey(params: TParams): CacheKey {\n return (this.options.cacheKeyGenerator ?? JSON.stringify)(params) as CacheKey;\n }\n}\n","import { ResourceRepository, ResourceRepositoryOptions } from './interface/resource-repository.interface';\nimport { ResourceRepositoryImpl } from './lib/resource-repository';\n\nexport * from './interface/resource-repository-signal.interface';\nexport * from './interface/resource-repository.interface';\n\n/**\n * Creates a new instance of a ResourceRepository with the specified options.\n *\n * @param {ResourceRepositoryOptions<TParams, TItem>} options - The configuration options for the resource repository.\n * @return {ResourceRepository<TParams, TItem>} A new instance of ResourceRepository configured with the given options.\n */\nexport function resourceRepository<TParams, TItem>(options: ResourceRepositoryOptions<TParams, TItem>): ResourceRepository<TParams, TItem> {\n return new ResourceRepositoryImpl<TParams, TItem>(options);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"angular-cool-repository.mjs","sources":["../../../projects/repository/src/lib/resource-cache.ts","../../../projects/repository/src/lib/resource-repository.ts","../../../projects/repository/src/public-api.ts","../../../projects/repository/src/angular-cool-repository.ts"],"sourcesContent":["import { BehaviorSubject, firstValueFrom, ReplaySubject } from 'rxjs';\n\nexport class ResourceCache<TItem> {\n private _valueSubject = new ReplaySubject<TItem | undefined>(1);\n\n private _isLoading = false;\n private _isLoadingSubject = new BehaviorSubject<boolean>(false);\n\n private _validUntil: number | null = null;\n\n public get isInvalid(): boolean {\n return this._validUntil === null || Date.now() > this._validUntil;\n }\n\n constructor(\n private loader: () => Promise<TItem | undefined>,\n private maxAge: number,\n ) {\n }\n\n public getValueObservable() {\n return this._valueSubject.asObservable();\n }\n\n public isLoadingObservable() {\n return this._isLoadingSubject.asObservable();\n }\n\n public async keepDataFreshAsync() {\n if (!this.isInvalid) {\n return;\n }\n\n await this._reloadValueAsync();\n }\n\n private async _reloadValueAsync(): Promise<void> {\n if (this._isLoading) {\n await firstValueFrom(this._isLoadingSubject);\n\n return;\n }\n\n this._setIsLoading(true);\n\n try {\n const data = await this.loader();\n\n await this.setValueAsync(data);\n } finally {\n this._setIsLoading(false);\n }\n }\n\n public async setValueAsync(value: TItem | undefined) {\n this._validUntil = Date.now() + this.maxAge;\n this._valueSubject.next(value);\n }\n\n public async getValueAsync(): Promise<TItem | undefined> {\n await this.keepDataFreshAsync();\n\n return firstValueFrom(this._valueSubject);\n }\n\n public invalidate() {\n this._validUntil = null;\n }\n\n public async removeAsync() {\n await this.setValueAsync(undefined);\n\n this._valueSubject.complete();\n this._isLoadingSubject.complete();\n }\n\n private _setIsLoading(isLoading: boolean) {\n this._isLoading = isLoading;\n this._isLoadingSubject.next(isLoading);\n }\n}\n","import { computed, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ResourceCache } from './resource-cache';\nimport { ResourceRepositorySignal } from '../interface/resource-repository-signal.interface';\nimport { ResourceRepository, ResourceRepositoryOptions } from '../interface/resource-repository.interface';\nimport { map, switchMap, tap } from 'rxjs';\n\nconst DEFAULT_MAX_AGE = 5 * 60 * 1000;\n\ntype CacheKey = string;\n\nexport class ResourceRepositoryImpl<TParams, TItem> implements ResourceRepository<TParams, TItem> {\n private _cacheStore = new Map<CacheKey, ResourceCache<TItem>>();\n\n constructor(private options: ResourceRepositoryOptions<TParams, TItem>) {\n }\n\n public get(key: Signal<TParams>): ResourceRepositorySignal<TItem | undefined> {\n const cacheObservable = toObservable(key)\n .pipe(\n map(keyValue => {\n const cacheKey = this._createCacheKey(keyValue);\n\n let cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n cache = new ResourceCache(\n ((p) => () => this.options.loader(p))(keyValue),\n this.options.maxAge ?? DEFAULT_MAX_AGE,\n );\n\n this._cacheStore.set(cacheKey, cache);\n }\n\n return cache;\n }),\n );\n\n const resultSignal = toSignal(\n cacheObservable\n .pipe(\n tap(cache => {\n // Do not wait for it to load\n cache.keepDataFreshAsync();\n }),\n switchMap(_ => _.getValueObservable()),\n ),\n {\n equal: () => false,\n }\n );\n\n const isLoadingSignal = toSignal(\n cacheObservable\n .pipe(\n switchMap(_ => _.isLoadingObservable()),\n )\n );\n\n return Object.assign(resultSignal, {\n reload: async () => {\n await this.reload(key());\n },\n set: async (value: TItem | undefined) => {\n await this.setValue(key(), value as TItem);\n },\n update: async (valueUpdater: (currentValue: TItem | undefined) => Promise<TItem | undefined>) => {\n await this.updateValue(key(), valueUpdater);\n },\n remove: async () => {\n await this.remove(key());\n },\n isLoading: computed<boolean>(() => isLoadingSignal() ?? true),\n } satisfies Omit<ResourceRepositorySignal<TItem | undefined>, keyof Signal<TItem | undefined>>);\n }\n\n public async remove(key: TParams): Promise<void> {\n const cacheKey = this._createCacheKey(key);\n\n const cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n await cache.removeAsync();\n\n this._cacheStore.delete(cacheKey);\n }\n\n public async reload(key: TParams): Promise<void> {\n const cacheKey = this._createCacheKey(key);\n\n const cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n cache.invalidate();\n\n await cache.keepDataFreshAsync();\n }\n\n public async getValue(key: TParams): Promise<TItem | undefined> {\n const cacheKey = this._createCacheKey(key);\n\n const cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n return await cache.getValueAsync();\n }\n\n public async setValue(key: TParams, value: TItem | undefined): Promise<void> {\n const cacheKey = this._createCacheKey(key);\n\n let cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n throw new Error(`No cache found for the given key: ${key}`);\n }\n\n await cache.setValueAsync(value);\n }\n\n public async updateValue(key: TParams, updateFn: (value: TItem | undefined) => Promise<TItem | undefined>): Promise<void> {\n const value = await this.getValue(key);\n\n await this.setValue(key, await updateFn(value));\n }\n\n private _createCacheKey(params: TParams): CacheKey {\n return (this.options.cacheKeyGenerator ?? JSON.stringify)(params) as CacheKey;\n }\n}\n","import { ResourceRepository, ResourceRepositoryOptions } from './interface/resource-repository.interface';\nimport { ResourceRepositoryImpl } from './lib/resource-repository';\n\nexport * from './interface/resource-repository-signal.interface';\nexport * from './interface/resource-repository.interface';\n\n/**\n * Creates a new instance of a ResourceRepository with the specified options.\n *\n * @param {ResourceRepositoryOptions<TParams, TItem>} options - The configuration options for the resource repository.\n * @return {ResourceRepository<TParams, TItem>} A new instance of ResourceRepository configured with the given options.\n */\nexport function resourceRepository<TParams, TItem>(options: ResourceRepositoryOptions<TParams, TItem>): ResourceRepository<TParams, TItem> {\n return new ResourceRepositoryImpl<TParams, TItem>(options);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -8,7 +8,15 @@ interface ResourceRepositorySignal<T> extends Signal<T> {
|
|
|
8
8
|
/**
|
|
9
9
|
* Sets current value.
|
|
10
10
|
*/
|
|
11
|
-
readonly set: (value: T) => Promise<void>;
|
|
11
|
+
readonly set: (value: T | undefined) => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Updates current value.
|
|
14
|
+
*/
|
|
15
|
+
readonly update: (valueUpdater: (current: T | undefined) => Promise<T | undefined>) => Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Removes current resource
|
|
18
|
+
*/
|
|
19
|
+
readonly remove: () => Promise<void>;
|
|
12
20
|
/**
|
|
13
21
|
* true if resource is currently loading.
|
|
14
22
|
*/
|
|
@@ -23,6 +31,13 @@ interface ResourceRepository<TParams, TItem> {
|
|
|
23
31
|
* @return {ResourceRepositorySignal<TItem | undefined>} A read-only signal containing the item associated with the provided key, already cached.
|
|
24
32
|
*/
|
|
25
33
|
get(key: Signal<TParams>): ResourceRepositorySignal<TItem | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Remove a resource cache
|
|
36
|
+
*
|
|
37
|
+
* @param {TParams} key - The key used to identify the specific cache entry to reload.
|
|
38
|
+
* @return {Promise<void>} A promise that resolves when the cache has been refreshed.
|
|
39
|
+
*/
|
|
40
|
+
remove(key: TParams): Promise<void>;
|
|
26
41
|
/**
|
|
27
42
|
* Reloads the cache associated with the given key, ensuring it is updated with fresh data.
|
|
28
43
|
*
|