@angular-cool/repository 21.0.6 → 21.0.7

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
- OR
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 { rxResource } from '@angular/core/rxjs-interop';
2
- import { ReplaySubject, BehaviorSubject, firstValueFrom } from 'rxjs';
1
+ import { computed } from '@angular/core';
2
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
3
+ import { ReplaySubject, BehaviorSubject, firstValueFrom, map, 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,30 @@ class ResourceRepositoryImpl {
60
64
  this._cacheStore = new Map();
61
65
  }
62
66
  get(key) {
63
- const resource = rxResource({
64
- params: () => key(),
65
- stream: ({ params }) => {
66
- const cacheKey = this._createCacheKey(params);
67
- let cache = this._cacheStore.get(cacheKey);
68
- if (!cache) {
69
- cache = new ResourceCache(((p) => () => this.options.loader(p))(params), this.options.maxAge ?? DEFAULT_MAX_AGE);
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
  }
76
- });
77
- return Object.assign(resource.asReadonly().value, {
75
+ // Do not wait for it to load
76
+ cache.keepDataFreshAsync();
77
+ return cache;
78
+ }));
79
+ const resultSignal = toSignal(cacheObservable
80
+ .pipe(switchMap(_ => _.getValueObservable())));
81
+ const isLoadingSignal = toSignal(cacheObservable
82
+ .pipe(switchMap(_ => _.isLoadingObservable())));
83
+ return Object.assign(resultSignal, {
78
84
  reload: async () => {
79
85
  await this.reload(key());
80
86
  },
81
87
  set: async (value) => {
82
88
  await this.setValue(key(), value);
83
- }
89
+ },
90
+ isLoading: computed(() => isLoadingSignal() ?? true),
84
91
  });
85
92
  }
86
93
  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 } 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 // Do not wait for it to load\n cache.keepDataFreshAsync();\n\n return cache;\n }),\n );\n\n const resultSignal = toSignal(cacheObservable\n .pipe(\n switchMap(_ => _.getValueObservable()),\n ));\n\n const isLoadingSignal = toSignal(cacheObservable\n .pipe(\n switchMap(_ => _.isLoadingObservable()),\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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@angular-cool/repository",
3
3
  "description": "Cool stateful signal repository for angular",
4
- "version": "21.0.6",
4
+ "version": "21.0.7",
5
5
  "peerDependencies": {
6
6
  "@angular/common": ">=21.0.0",
7
7
  "@angular/core": ">=21.0.0"
@@ -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> {