@molecule/app-angular 1.0.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.
Files changed (110) hide show
  1. package/LICENSE +115 -0
  2. package/dist/i18n-reactive.d.ts +41 -0
  3. package/dist/i18n-reactive.d.ts.map +1 -0
  4. package/dist/i18n-reactive.js +46 -0
  5. package/dist/i18n-reactive.js.map +1 -0
  6. package/dist/index.d.ts +84 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +84 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/providers.d.ts +96 -0
  11. package/dist/providers.d.ts.map +1 -0
  12. package/dist/providers.js +144 -0
  13. package/dist/providers.js.map +1 -0
  14. package/dist/services/async-state.service.d.ts +50 -0
  15. package/dist/services/async-state.service.d.ts.map +1 -0
  16. package/dist/services/async-state.service.js +109 -0
  17. package/dist/services/async-state.service.js.map +1 -0
  18. package/dist/services/auth.service.d.ts +105 -0
  19. package/dist/services/auth.service.d.ts.map +1 -0
  20. package/dist/services/auth.service.js +124 -0
  21. package/dist/services/auth.service.js.map +1 -0
  22. package/dist/services/capacitor-app.service.d.ts +46 -0
  23. package/dist/services/capacitor-app.service.d.ts.map +1 -0
  24. package/dist/services/capacitor-app.service.js +53 -0
  25. package/dist/services/capacitor-app.service.js.map +1 -0
  26. package/dist/services/change-password.service.d.ts +37 -0
  27. package/dist/services/change-password.service.d.ts.map +1 -0
  28. package/dist/services/change-password.service.js +34 -0
  29. package/dist/services/change-password.service.js.map +1 -0
  30. package/dist/services/device.service.d.ts +35 -0
  31. package/dist/services/device.service.d.ts.map +1 -0
  32. package/dist/services/device.service.js +29 -0
  33. package/dist/services/device.service.js.map +1 -0
  34. package/dist/services/forms.service.d.ts +237 -0
  35. package/dist/services/forms.service.d.ts.map +1 -0
  36. package/dist/services/forms.service.js +280 -0
  37. package/dist/services/forms.service.js.map +1 -0
  38. package/dist/services/http.service.d.ts +118 -0
  39. package/dist/services/http.service.d.ts.map +1 -0
  40. package/dist/services/http.service.js +171 -0
  41. package/dist/services/http.service.js.map +1 -0
  42. package/dist/services/i18n.service.d.ts +111 -0
  43. package/dist/services/i18n.service.d.ts.map +1 -0
  44. package/dist/services/i18n.service.js +135 -0
  45. package/dist/services/i18n.service.js.map +1 -0
  46. package/dist/services/index.d.ts +27 -0
  47. package/dist/services/index.d.ts.map +1 -0
  48. package/dist/services/index.js +27 -0
  49. package/dist/services/index.js.map +1 -0
  50. package/dist/services/logger.service.d.ts +79 -0
  51. package/dist/services/logger.service.d.ts.map +1 -0
  52. package/dist/services/logger.service.js +110 -0
  53. package/dist/services/logger.service.js.map +1 -0
  54. package/dist/services/login.service.d.ts +37 -0
  55. package/dist/services/login.service.d.ts.map +1 -0
  56. package/dist/services/login.service.js +34 -0
  57. package/dist/services/login.service.js.map +1 -0
  58. package/dist/services/oauth.service.d.ts +110 -0
  59. package/dist/services/oauth.service.d.ts.map +1 -0
  60. package/dist/services/oauth.service.js +214 -0
  61. package/dist/services/oauth.service.js.map +1 -0
  62. package/dist/services/password-reset.service.d.ts +41 -0
  63. package/dist/services/password-reset.service.d.ts.map +1 -0
  64. package/dist/services/password-reset.service.js +45 -0
  65. package/dist/services/password-reset.service.js.map +1 -0
  66. package/dist/services/platform.service.d.ts +39 -0
  67. package/dist/services/platform.service.d.ts.map +1 -0
  68. package/dist/services/platform.service.js +33 -0
  69. package/dist/services/platform.service.js.map +1 -0
  70. package/dist/services/promise.service.d.ts +40 -0
  71. package/dist/services/promise.service.d.ts.map +1 -0
  72. package/dist/services/promise.service.js +85 -0
  73. package/dist/services/promise.service.js.map +1 -0
  74. package/dist/services/push.service.d.ts +45 -0
  75. package/dist/services/push.service.d.ts.map +1 -0
  76. package/dist/services/push.service.js +64 -0
  77. package/dist/services/push.service.js.map +1 -0
  78. package/dist/services/router.service.d.ts +114 -0
  79. package/dist/services/router.service.d.ts.map +1 -0
  80. package/dist/services/router.service.js +142 -0
  81. package/dist/services/router.service.js.map +1 -0
  82. package/dist/services/signup.service.d.ts +37 -0
  83. package/dist/services/signup.service.d.ts.map +1 -0
  84. package/dist/services/signup.service.js +34 -0
  85. package/dist/services/signup.service.js.map +1 -0
  86. package/dist/services/state.service.d.ts +82 -0
  87. package/dist/services/state.service.d.ts.map +1 -0
  88. package/dist/services/state.service.js +122 -0
  89. package/dist/services/state.service.js.map +1 -0
  90. package/dist/services/storage.service.d.ts +111 -0
  91. package/dist/services/storage.service.d.ts.map +1 -0
  92. package/dist/services/storage.service.js +167 -0
  93. package/dist/services/storage.service.js.map +1 -0
  94. package/dist/services/theme.service.d.ts +89 -0
  95. package/dist/services/theme.service.d.ts.map +1 -0
  96. package/dist/services/theme.service.js +116 -0
  97. package/dist/services/theme.service.js.map +1 -0
  98. package/dist/services/version.service.d.ts +44 -0
  99. package/dist/services/version.service.d.ts.map +1 -0
  100. package/dist/services/version.service.js +63 -0
  101. package/dist/services/version.service.js.map +1 -0
  102. package/dist/tokens.d.ts +47 -0
  103. package/dist/tokens.d.ts.map +1 -0
  104. package/dist/tokens.js +39 -0
  105. package/dist/tokens.js.map +1 -0
  106. package/dist/types.d.ts +42 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +7 -0
  109. package/dist/types.js.map +1 -0
  110. package/package.json +61 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Angular service for state management.
3
+ *
4
+ * @module
5
+ */
6
+ import { type OnDestroy } from '@angular/core';
7
+ import { type Observable } from 'rxjs';
8
+ import type { StateProvider, Store } from '@molecule/app-state';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Angular service for state management.
12
+ *
13
+ * Wraps molecule state stores and exposes them as RxJS observables.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * @Component({
18
+ * selector: 'app-counter',
19
+ * template: `
20
+ * <div>Count: {{ count$ | async }}</div>
21
+ * <button (click)="increment()">Increment</button>
22
+ * `
23
+ * })
24
+ * export class CounterComponent {
25
+ * count$ = this.stateService.select(counterStore, s => s.count)
26
+ *
27
+ * constructor(private stateService: MoleculeStateService) {}
28
+ *
29
+ * increment() {
30
+ * counterStore.setState(s => ({ count: s.count + 1 }))
31
+ * }
32
+ * }
33
+ * ```
34
+ */
35
+ export declare class MoleculeStateService implements OnDestroy {
36
+ private provider;
37
+ private subscriptions;
38
+ private subjects;
39
+ constructor(provider: StateProvider);
40
+ /**
41
+ * Get an observable of the full store state.
42
+ *
43
+ * @param store - The store to observe
44
+ * @returns Observable of the store state
45
+ */
46
+ observe<T>(store: Store<T>): Observable<T>;
47
+ /**
48
+ * Select a piece of state from a store.
49
+ *
50
+ * @param store - The store to select from
51
+ * @param selector - Selector function
52
+ * @returns Observable of the selected state
53
+ */
54
+ select<T, S>(store: Store<T>, selector: (state: T) => S): Observable<S>;
55
+ /**
56
+ * Get the current snapshot of a store's state.
57
+ *
58
+ * @param store - The store
59
+ * @returns The result.
60
+ */
61
+ snapshot<T>(store: Store<T>): T;
62
+ /**
63
+ * Update a store's state.
64
+ *
65
+ * @param store - The store to update
66
+ * @param partial - Partial state or updater function
67
+ */
68
+ update<T>(store: Store<T>, partial: Partial<T> | ((state: T) => Partial<T>)): void;
69
+ /**
70
+ * Gets or creates a BehaviorSubject for the given store.
71
+ * @param store - The data store to observe.
72
+ * @returns The BehaviorSubject tracking the store state.
73
+ */
74
+ private getOrCreateSubject;
75
+ /**
76
+ * Cleans up all store subscriptions and completes subjects on service destruction.
77
+ */
78
+ ngOnDestroy(): void;
79
+ static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeStateService, never>;
80
+ static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeStateService>;
81
+ }
82
+ //# sourceMappingURL=state.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.service.d.ts","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAElF,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAMa,oBAAqB,YAAW,SAAS;IAIhB,OAAO,CAAC,QAAQ;IAHpD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAsD;gBAE1B,QAAQ,EAAE,aAAa;IAEnE;;;;;OAKG;IACH,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAI1C;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAIvE;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAI/B;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAIlF;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,WAAW,IAAI,IAAI;yCAvER,oBAAoB;6CAApB,oBAAoB;CAgFhC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Angular service for state management.
3
+ *
4
+ * @module
5
+ */
6
+ import { Inject, Injectable } from '@angular/core';
7
+ import { BehaviorSubject, distinctUntilChanged, map } from 'rxjs';
8
+ import { STATE_PROVIDER } from '../tokens.js';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Angular service for state management.
12
+ *
13
+ * Wraps molecule state stores and exposes them as RxJS observables.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * @Component({
18
+ * selector: 'app-counter',
19
+ * template: `
20
+ * <div>Count: {{ count$ | async }}</div>
21
+ * <button (click)="increment()">Increment</button>
22
+ * `
23
+ * })
24
+ * export class CounterComponent {
25
+ * count$ = this.stateService.select(counterStore, s => s.count)
26
+ *
27
+ * constructor(private stateService: MoleculeStateService) {}
28
+ *
29
+ * increment() {
30
+ * counterStore.setState(s => ({ count: s.count + 1 }))
31
+ * }
32
+ * }
33
+ * ```
34
+ */
35
+ /**
36
+ * Molecule State Service class.
37
+ */
38
+ export class MoleculeStateService {
39
+ constructor(provider) {
40
+ this.provider = provider;
41
+ this.subscriptions = new Map();
42
+ this.subjects = new Map();
43
+ }
44
+ /**
45
+ * Get an observable of the full store state.
46
+ *
47
+ * @param store - The store to observe
48
+ * @returns Observable of the store state
49
+ */
50
+ observe(store) {
51
+ return this.getOrCreateSubject(store).asObservable();
52
+ }
53
+ /**
54
+ * Select a piece of state from a store.
55
+ *
56
+ * @param store - The store to select from
57
+ * @param selector - Selector function
58
+ * @returns Observable of the selected state
59
+ */
60
+ select(store, selector) {
61
+ return this.observe(store).pipe(map(selector), distinctUntilChanged());
62
+ }
63
+ /**
64
+ * Get the current snapshot of a store's state.
65
+ *
66
+ * @param store - The store
67
+ * @returns The result.
68
+ */
69
+ snapshot(store) {
70
+ return store.getState();
71
+ }
72
+ /**
73
+ * Update a store's state.
74
+ *
75
+ * @param store - The store to update
76
+ * @param partial - Partial state or updater function
77
+ */
78
+ update(store, partial) {
79
+ store.setState(partial);
80
+ }
81
+ /**
82
+ * Gets or creates a BehaviorSubject for the given store.
83
+ * @param store - The data store to observe.
84
+ * @returns The BehaviorSubject tracking the store state.
85
+ */
86
+ getOrCreateSubject(store) {
87
+ let subject = this.subjects.get(store);
88
+ if (!subject) {
89
+ subject = new BehaviorSubject(store.getState());
90
+ this.subjects.set(store, subject);
91
+ const unsubscribe = store.subscribe(() => {
92
+ subject.next(store.getState());
93
+ });
94
+ this.subscriptions.set(store, unsubscribe);
95
+ }
96
+ return subject;
97
+ }
98
+ /**
99
+ * Cleans up all store subscriptions and completes subjects on service destruction.
100
+ */
101
+ ngOnDestroy() {
102
+ // Clean up all subscriptions
103
+ this.subscriptions.forEach((unsubscribe) => unsubscribe());
104
+ this.subscriptions.clear();
105
+ // Complete all subjects
106
+ this.subjects.forEach((subject) => subject.complete());
107
+ this.subjects.clear();
108
+ }
109
+ static { this.ɵfac = function MoleculeStateService_Factory(__ngFactoryType__) { /* @ts-ignore */
110
+ return new (__ngFactoryType__ || MoleculeStateService)(i0.ɵɵinject(STATE_PROVIDER)); }; }
111
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MoleculeStateService, factory: MoleculeStateService.ɵfac, providedIn: 'root' }); }
112
+ }
113
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MoleculeStateService, [{
114
+ type: Injectable,
115
+ args: [{
116
+ providedIn: 'root',
117
+ }]
118
+ }], () => [{ type: undefined, decorators: [{
119
+ type: Inject,
120
+ args: [STATE_PROVIDER]
121
+ }] }], null); })();
122
+ //# sourceMappingURL=state.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.service.js","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAmB,MAAM,MAAM,CAAA;AAIlF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAI/B,YAA4C,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;QAH3D,kBAAa,GAAG,IAAI,GAAG,EAA8B,CAAA;QACrD,aAAQ,GAAG,IAAI,GAAG,EAA4C,CAAA;IAEA,CAAC;IAEvE;;;;;OAKG;IACH,OAAO,CAAI,KAAe;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,YAAY,EAAmB,CAAA;IACvE,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAO,KAAe,EAAE,QAAyB;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAA;IACxE,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAI,KAAe;QACzB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAI,KAAe,EAAE,OAAgD;QACzE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAI,KAAe;QAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAuB,CAAmC,CAAA;QAE1F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,eAAe,CAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAuB,EAAE,OAAmC,CAAC,CAAA;YAE/E,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACvC,OAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;YACjC,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAuB,EAAE,WAAW,CAAC,CAAA;QAC9D,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,6BAA6B;QAC7B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAE1B,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;;qCA/EU,oBAAoB,cAIX,cAAc;uEAJvB,oBAAoB,WAApB,oBAAoB,mBALnB,MAAM;;iFAKP,oBAAoB;cANhC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;sBAQc,MAAM;uBAAC,cAAc"}
@@ -0,0 +1,111 @@
1
+ import { BehaviorSubject, type Observable } from 'rxjs';
2
+ import type { StorageProvider } from '@molecule/app-storage';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * State for a storage value.
6
+ */
7
+ export interface StorageValueState<T> {
8
+ value: T | undefined;
9
+ loading: boolean;
10
+ error: Error | null;
11
+ }
12
+ /**
13
+ * Angular service for storage.
14
+ *
15
+ * Wraps molecule storage provider and returns RxJS observables.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * @Component({
20
+ * selector: 'app-settings',
21
+ * template: `
22
+ * <div *ngIf="themeState$ | async as state">
23
+ * <select
24
+ * [value]="state.value"
25
+ * (change)="setTheme($event.target.value)"
26
+ * [disabled]="state.loading"
27
+ * >
28
+ * <option value="light">Light</option>
29
+ * <option value="dark">Dark</option>
30
+ * </select>
31
+ * </div>
32
+ * `
33
+ * })
34
+ * export class SettingsComponent implements OnInit {
35
+ * themeState$ = new BehaviorSubject<StorageValueState<string>>({
36
+ * value: 'light',
37
+ * loading: true,
38
+ * error: null
39
+ * })
40
+ *
41
+ * constructor(private storageService: MoleculeStorageService) {}
42
+ *
43
+ * ngOnInit() {
44
+ * this.storageService.get<string>('theme').subscribe(value => {
45
+ * this.themeState$.next({ value: value ?? 'light', loading: false, error: null })
46
+ * })
47
+ * }
48
+ *
49
+ * setTheme(theme: string) {
50
+ * this.storageService.set('theme', theme).subscribe()
51
+ * }
52
+ * }
53
+ * ```
54
+ */
55
+ export declare class MoleculeStorageService {
56
+ private provider;
57
+ constructor(provider: StorageProvider);
58
+ /**
59
+ * Get a value from storage.
60
+ *
61
+ * @param key - Storage key
62
+ * @returns Observable of the value
63
+ */
64
+ get<T>(key: string): Observable<T | null>;
65
+ /**
66
+ * Set a value in storage.
67
+ *
68
+ * @param key - Storage key
69
+ * @param value - Value to store
70
+ * @returns Observable that completes when done
71
+ */
72
+ set<T>(key: string, value: T): Observable<void>;
73
+ /**
74
+ * Remove a value from storage.
75
+ *
76
+ * @param key - Storage key
77
+ * @returns Observable that completes when done
78
+ */
79
+ remove(key: string): Observable<void>;
80
+ /**
81
+ * Clear all values from storage.
82
+ *
83
+ * @returns Observable that completes when done
84
+ */
85
+ clear(): Observable<void>;
86
+ /**
87
+ * Get all keys in storage.
88
+ *
89
+ * @returns Observable of key array
90
+ */
91
+ keys(): Observable<string[]>;
92
+ /**
93
+ * Create a reactive storage value with auto-loading.
94
+ *
95
+ * @param key - Storage key
96
+ * @param defaultValue - Default value if not found
97
+ * @returns BehaviorSubject that syncs with storage
98
+ */
99
+ createValue<T>(key: string, defaultValue: T): BehaviorSubject<StorageValueState<T>>;
100
+ /**
101
+ * Update a reactive storage value.
102
+ *
103
+ * @param key - Storage key
104
+ * @param value - New value
105
+ * @param state - State subject to update
106
+ */
107
+ updateValue<T>(key: string, value: T, state: BehaviorSubject<StorageValueState<T>>): void;
108
+ static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeStorageService, never>;
109
+ static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeStorageService>;
110
+ }
111
+ //# sourceMappingURL=storage.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;;AAI5D;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAMa,sBAAsB;IACK,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEvE;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC;IAIzC;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC;IAI/C;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACH,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC;IAIzB;;;;OAIG;IACH,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;IAI5B;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA4BnF;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;yCA9F9E,sBAAsB;6CAAtB,sBAAsB;CA0GlC"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Angular service for storage.
3
+ *
4
+ * @module
5
+ */
6
+ import { Inject, Injectable } from '@angular/core';
7
+ import { BehaviorSubject, from } from 'rxjs';
8
+ import { STORAGE_PROVIDER } from '../tokens.js';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Angular service for storage.
12
+ *
13
+ * Wraps molecule storage provider and returns RxJS observables.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * @Component({
18
+ * selector: 'app-settings',
19
+ * template: `
20
+ * <div *ngIf="themeState$ | async as state">
21
+ * <select
22
+ * [value]="state.value"
23
+ * (change)="setTheme($event.target.value)"
24
+ * [disabled]="state.loading"
25
+ * >
26
+ * <option value="light">Light</option>
27
+ * <option value="dark">Dark</option>
28
+ * </select>
29
+ * </div>
30
+ * `
31
+ * })
32
+ * export class SettingsComponent implements OnInit {
33
+ * themeState$ = new BehaviorSubject<StorageValueState<string>>({
34
+ * value: 'light',
35
+ * loading: true,
36
+ * error: null
37
+ * })
38
+ *
39
+ * constructor(private storageService: MoleculeStorageService) {}
40
+ *
41
+ * ngOnInit() {
42
+ * this.storageService.get<string>('theme').subscribe(value => {
43
+ * this.themeState$.next({ value: value ?? 'light', loading: false, error: null })
44
+ * })
45
+ * }
46
+ *
47
+ * setTheme(theme: string) {
48
+ * this.storageService.set('theme', theme).subscribe()
49
+ * }
50
+ * }
51
+ * ```
52
+ */
53
+ /**
54
+ * Molecule Storage Service class.
55
+ */
56
+ export class MoleculeStorageService {
57
+ constructor(provider) {
58
+ this.provider = provider;
59
+ }
60
+ /**
61
+ * Get a value from storage.
62
+ *
63
+ * @param key - Storage key
64
+ * @returns Observable of the value
65
+ */
66
+ get(key) {
67
+ return from(this.provider.get(key));
68
+ }
69
+ /**
70
+ * Set a value in storage.
71
+ *
72
+ * @param key - Storage key
73
+ * @param value - Value to store
74
+ * @returns Observable that completes when done
75
+ */
76
+ set(key, value) {
77
+ return from(this.provider.set(key, value));
78
+ }
79
+ /**
80
+ * Remove a value from storage.
81
+ *
82
+ * @param key - Storage key
83
+ * @returns Observable that completes when done
84
+ */
85
+ remove(key) {
86
+ return from(this.provider.remove(key));
87
+ }
88
+ /**
89
+ * Clear all values from storage.
90
+ *
91
+ * @returns Observable that completes when done
92
+ */
93
+ clear() {
94
+ return from(this.provider.clear());
95
+ }
96
+ /**
97
+ * Get all keys in storage.
98
+ *
99
+ * @returns Observable of key array
100
+ */
101
+ keys() {
102
+ return from(this.provider.keys());
103
+ }
104
+ /**
105
+ * Create a reactive storage value with auto-loading.
106
+ *
107
+ * @param key - Storage key
108
+ * @param defaultValue - Default value if not found
109
+ * @returns BehaviorSubject that syncs with storage
110
+ */
111
+ createValue(key, defaultValue) {
112
+ const state = new BehaviorSubject({
113
+ value: defaultValue,
114
+ loading: true,
115
+ error: null,
116
+ });
117
+ // Load initial value
118
+ this.get(key).subscribe({
119
+ next: (value) => {
120
+ state.next({
121
+ value: value ?? defaultValue,
122
+ loading: false,
123
+ error: null,
124
+ });
125
+ },
126
+ error: (error) => {
127
+ state.next({
128
+ value: defaultValue,
129
+ loading: false,
130
+ error,
131
+ });
132
+ },
133
+ });
134
+ return state;
135
+ }
136
+ /**
137
+ * Update a reactive storage value.
138
+ *
139
+ * @param key - Storage key
140
+ * @param value - New value
141
+ * @param state - State subject to update
142
+ */
143
+ updateValue(key, value, state) {
144
+ state.next({ ...state.value, loading: true });
145
+ this.set(key, value).subscribe({
146
+ next: () => {
147
+ state.next({ value, loading: false, error: null });
148
+ },
149
+ error: (error) => {
150
+ state.next({ ...state.value, loading: false, error });
151
+ },
152
+ });
153
+ }
154
+ static { this.ɵfac = function MoleculeStorageService_Factory(__ngFactoryType__) { /* @ts-ignore */
155
+ return new (__ngFactoryType__ || MoleculeStorageService)(i0.ɵɵinject(STORAGE_PROVIDER)); }; }
156
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MoleculeStorageService, factory: MoleculeStorageService.ɵfac, providedIn: 'root' }); }
157
+ }
158
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MoleculeStorageService, [{
159
+ type: Injectable,
160
+ args: [{
161
+ providedIn: 'root',
162
+ }]
163
+ }], () => [{ type: undefined, decorators: [{
164
+ type: Inject,
165
+ args: [STORAGE_PROVIDER]
166
+ }] }], null); })();
167
+ //# sourceMappingURL=storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Angular service for theming.
3
+ *
4
+ * @module
5
+ */
6
+ import { type OnDestroy } from '@angular/core';
7
+ import { type Observable } from 'rxjs';
8
+ import type { Theme, ThemeProvider } from '@molecule/app-theme';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Angular service for theming.
12
+ *
13
+ * Wraps molecule theme provider and exposes state as RxJS observables.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * @Component({
18
+ * selector: 'app-root',
19
+ * template: `
20
+ * <div [style.background]="(theme$ | async)?.colors.background">
21
+ * <button (click)="toggleTheme()">
22
+ * Theme: {{ themeName$ | async }}
23
+ * </button>
24
+ * </div>
25
+ * `
26
+ * })
27
+ * export class AppComponent {
28
+ * theme$ = this.themeService.theme$
29
+ * themeName$ = this.themeService.themeName$
30
+ *
31
+ * constructor(private themeService: MoleculeThemeService) {}
32
+ *
33
+ * toggleTheme() {
34
+ * this.themeService.toggleTheme()
35
+ * }
36
+ * }
37
+ * ```
38
+ */
39
+ export declare class MoleculeThemeService implements OnDestroy {
40
+ private provider;
41
+ private themeSubject;
42
+ private themeNameSubject;
43
+ private unsubscribe;
44
+ /**
45
+ * Observable of the current theme.
46
+ */
47
+ theme$: Observable<Theme>;
48
+ /**
49
+ * Observable of the current theme name.
50
+ */
51
+ themeName$: Observable<string>;
52
+ /**
53
+ * Observable of the theme mode (light/dark).
54
+ */
55
+ mode$: Observable<'light' | 'dark'>;
56
+ constructor(provider: ThemeProvider);
57
+ /**
58
+ * Get the current theme snapshot.
59
+ * @returns The result.
60
+ */
61
+ get theme(): Theme;
62
+ /**
63
+ * Get the current theme name snapshot.
64
+ * @returns The result.
65
+ */
66
+ get themeName(): string;
67
+ /**
68
+ * Get available themes.
69
+ * @returns The result.
70
+ */
71
+ get themes(): Theme[];
72
+ /**
73
+ * Set the current theme.
74
+ *
75
+ * @param name - Theme name
76
+ */
77
+ setTheme(name: string): void;
78
+ /**
79
+ * Toggle to the next theme.
80
+ */
81
+ toggleTheme(): void;
82
+ /**
83
+ * Cleans up subscriptions and completes subjects on service destruction.
84
+ */
85
+ ngOnDestroy(): void;
86
+ static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeThemeService, never>;
87
+ static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeThemeService>;
88
+ }
89
+ //# sourceMappingURL=theme.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.service.d.ts","sourceRoot":"","sources":["../../src/services/theme.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAMa,oBAAqB,YAAW,SAAS;IAoBhB,OAAO,CAAC,QAAQ;IAnBpD,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,WAAW,CAA4B;IAE/C;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IAEzB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAE9B;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,CAAA;gBAES,QAAQ,EAAE,aAAa;IAkBnE;;;OAGG;IACH,IAAI,KAAK,IAAI,KAAK,CAEjB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,KAAK,EAAE,CAEpB;IAED;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;OAEG;IACH,WAAW,IAAI,IAAI;yCArFR,oBAAoB;6CAApB,oBAAoB;CA0FhC"}