@angular-cool/repository 21.0.6 → 21.0.8
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
|
@@ -60,12 +60,22 @@ export class MyComponent {
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
+
### Show loading indicator
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
@if (myItem.isLoading()) {
|
|
67
|
+
<div>Loading</div>
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
63
71
|
### Manually update value if needed
|
|
64
72
|
|
|
65
73
|
```typescript
|
|
66
74
|
this.myItem.set(newValue); // Updates the signal for all subscribers
|
|
67
75
|
```
|
|
68
|
-
|
|
76
|
+
|
|
77
|
+
OR
|
|
78
|
+
|
|
69
79
|
```typescript
|
|
70
80
|
await this._myService.items.setValue(this.idParam(), myValue); // Updates the signal for all subscribers
|
|
71
81
|
```
|
|
@@ -81,7 +91,7 @@ const value = await this._myService.items.getValue(this.idParam());
|
|
|
81
91
|
```typescript
|
|
82
92
|
await this._myService.items.updateValue(this.idParam(), val => {
|
|
83
93
|
// modify val
|
|
84
|
-
|
|
94
|
+
|
|
85
95
|
return val;
|
|
86
96
|
});
|
|
87
97
|
```
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { computed } from '@angular/core';
|
|
2
|
+
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { ReplaySubject, BehaviorSubject, firstValueFrom, map, tap, switchMap } from 'rxjs';
|
|
3
4
|
|
|
4
5
|
class ResourceCache {
|
|
5
6
|
get isInvalid() {
|
|
@@ -16,6 +17,9 @@ class ResourceCache {
|
|
|
16
17
|
getValueObservable() {
|
|
17
18
|
return this._valueSubject.asObservable();
|
|
18
19
|
}
|
|
20
|
+
isLoadingObservable() {
|
|
21
|
+
return this._isLoadingSubject.asObservable();
|
|
22
|
+
}
|
|
19
23
|
async keepDataFreshAsync() {
|
|
20
24
|
if (!this.isInvalid) {
|
|
21
25
|
return;
|
|
@@ -60,27 +64,33 @@ class ResourceRepositoryImpl {
|
|
|
60
64
|
this._cacheStore = new Map();
|
|
61
65
|
}
|
|
62
66
|
get(key) {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this._cacheStore.set(cacheKey, cache);
|
|
71
|
-
}
|
|
72
|
-
// Do not wait for it to load
|
|
73
|
-
cache.keepDataFreshAsync();
|
|
74
|
-
return cache.getValueObservable();
|
|
67
|
+
const cacheObservable = toObservable(key)
|
|
68
|
+
.pipe(map(keyValue => {
|
|
69
|
+
const cacheKey = this._createCacheKey(keyValue);
|
|
70
|
+
let cache = this._cacheStore.get(cacheKey);
|
|
71
|
+
if (!cache) {
|
|
72
|
+
cache = new ResourceCache(((p) => () => this.options.loader(p))(keyValue), this.options.maxAge ?? DEFAULT_MAX_AGE);
|
|
73
|
+
this._cacheStore.set(cacheKey, cache);
|
|
75
74
|
}
|
|
75
|
+
return cache;
|
|
76
|
+
}));
|
|
77
|
+
const resultSignal = toSignal(cacheObservable
|
|
78
|
+
.pipe(tap(cache => {
|
|
79
|
+
// Do not wait for it to load
|
|
80
|
+
cache.keepDataFreshAsync();
|
|
81
|
+
}), switchMap(_ => _.getValueObservable())), {
|
|
82
|
+
equal: () => false,
|
|
76
83
|
});
|
|
77
|
-
|
|
84
|
+
const isLoadingSignal = toSignal(cacheObservable
|
|
85
|
+
.pipe(switchMap(_ => _.isLoadingObservable())));
|
|
86
|
+
return Object.assign(resultSignal, {
|
|
78
87
|
reload: async () => {
|
|
79
88
|
await this.reload(key());
|
|
80
89
|
},
|
|
81
90
|
set: async (value) => {
|
|
82
91
|
await this.setValue(key(), value);
|
|
83
|
-
}
|
|
92
|
+
},
|
|
93
|
+
isLoading: computed(() => isLoadingSignal() ?? true),
|
|
84
94
|
});
|
|
85
95
|
}
|
|
86
96
|
async reload(key) {
|
|
@@ -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 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 { Signal } from '@angular/core';\nimport { rxResource } 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';\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 resource = rxResource<TItem | undefined, TParams>({\n params: () => key(),\n stream: ({ params }) => {\n const cacheKey = this._createCacheKey(params);\n\n let cache = this._cacheStore.get(cacheKey);\n\n if (!cache) {\n cache = new ResourceCache(\n ((p) => () => this.options.loader(p))(params),\n this.options.maxAge ?? DEFAULT_MAX_AGE,\n );\n\n this._cacheStore.set(cacheKey, cache);\n }\n\n // Do not wait for it to load\n cache.keepDataFreshAsync();\n\n return cache.getValueObservable();\n }\n });\n\n return Object.assign(resource.asReadonly().value as ResourceRepositorySignal<TItem | undefined>, {\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 });\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 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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"}
|
package/package.json
CHANGED
|
@@ -9,6 +9,10 @@ interface ResourceRepositorySignal<T> extends Signal<T> {
|
|
|
9
9
|
* Sets current value.
|
|
10
10
|
*/
|
|
11
11
|
readonly set: (value: T) => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* true if resource is currently loading.
|
|
14
|
+
*/
|
|
15
|
+
readonly isLoading: Signal<boolean>;
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
interface ResourceRepository<TParams, TItem> {
|