@fireflysemantics/slice 16.2.14 → 16.2.16

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
@@ -1,19 +1,29 @@
1
- [![Build Status](https://travis-ci.org/fireflysemantics/slice.svg?branch=master)](https://travis-ci.org/fireflysemantics/slice)
2
-
3
1
  ![Slice](slicelogo.png)
4
2
 
5
3
  # @fireflysemantics/slice
6
4
 
7
- Lightweight Javascript Reactive State Management for Web Applications.
5
+ Lightweight Javascript Reactive State Management for Angular Applications.
8
6
 
9
7
  If you like the [@fireflysemantics/slice API](https://fireflysemantics.github.io/slice/doc/) please star our [Github Repository](https://github.com/fireflysemantics/slice).
10
8
 
11
9
  # Install
12
10
 
13
- Install Slice with peer dependencies:
11
+
12
+ Install Slice with the `nanoid` peer dependency:
13
+
14
+ - `v17.0.x` for Angular 17
15
+ - `v16.2.x` for Angular 16
16
+ - `v15.2.x` for Angular 15
17
+
18
+ So for example for an Angular 15 project run.
19
+
20
+ ```
21
+ npm i @fireflysemantics/slice@15.2.x nanoid
22
+ ```
23
+ For Angular 17 run.
14
24
 
15
25
  ```
16
- npm i @fireflysemantics/slice tslib rxjs nanoid
26
+ npm i @fireflysemantics/slice@lastest nanoid
17
27
  ```
18
28
 
19
29
  # Firefly Semantics Slice Development Center Media and Documentation
@@ -0,0 +1,145 @@
1
+ import { ReplaySubject } from 'rxjs';
2
+ export class OStore {
3
+ constructor(start) {
4
+ /**
5
+ * Map of Key Value pair entries
6
+ * containing values store in this store.
7
+ */
8
+ this.entries = new Map();
9
+ /**
10
+ * Map of replay subject id to `ReplaySubject` instance.
11
+ */
12
+ this.subjects = new Map();
13
+ if (start) {
14
+ this.S = start;
15
+ const keys = Object.keys(start);
16
+ keys.forEach((k) => {
17
+ const ovr = start[k];
18
+ this.post(ovr, ovr.value);
19
+ ovr.obs = this.observe(ovr);
20
+ });
21
+ }
22
+ }
23
+ /**
24
+ * Reset the state of the OStore to the
25
+ * values or reset provided in the constructor
26
+ * {@link OStoreStart} instance.
27
+ */
28
+ reset() {
29
+ if (this.S) {
30
+ const keys = Object.keys(this.S);
31
+ keys.forEach((k) => {
32
+ const ovr = this.S[k];
33
+ this.put(ovr, ovr.reset ? ovr.reset : ovr.value);
34
+ });
35
+ }
36
+ }
37
+ /**
38
+ * Set create a key value pair entry and creates a
39
+ * corresponding replay subject instance that will
40
+ * be used to broadcast updates.
41
+ *
42
+ * @param key The key identifying the value
43
+ * @param value The value
44
+ */
45
+ post(key, value) {
46
+ this.entries.set(key, value);
47
+ this.subjects.set(key, new ReplaySubject(1));
48
+ //Emit immediately so that Observers can receive
49
+ //the value straight away.
50
+ const subject = this.subjects.get(key);
51
+ if (subject) {
52
+ subject.next(value);
53
+ }
54
+ }
55
+ /**
56
+ * Update a value and notify subscribers.
57
+ *
58
+ * @param key
59
+ * @param value
60
+ */
61
+ put(key, value) {
62
+ this.entries.set(key, value);
63
+ const subject = this.subjects.get(key);
64
+ if (subject) {
65
+ subject.next(value);
66
+ }
67
+ }
68
+ /**
69
+ * Deletes both the value entry and the corresponding {@link ReplaySubject}.
70
+ * Will unsubscribe the {@link ReplaySubject} prior to deleting it,
71
+ * severing communication with corresponding {@link Observable}s.
72
+ *
73
+ * @param key
74
+ */
75
+ delete(key) {
76
+ //===========================================
77
+ // Delete the entry
78
+ //===========================================
79
+ this.entries.delete(key);
80
+ const subject = this.subjects.get(key);
81
+ if (subject) {
82
+ subject.next(undefined);
83
+ }
84
+ }
85
+ /**
86
+ * Clear all entries.
87
+ *
88
+ * Note that
89
+ * this will call delete for on all
90
+ * keys defined which also also
91
+ * unsubscribes and deletes
92
+ * all the sbujects.
93
+ */
94
+ clear() {
95
+ for (let key of this.entries.keys()) {
96
+ this.delete(key);
97
+ }
98
+ }
99
+ /**
100
+ * Observe changes to the values.
101
+ *
102
+ * @param key
103
+ * @return An {@link Observable} of the value
104
+ */
105
+ observe(key) {
106
+ return this.subjects.get(key)
107
+ ? this.subjects.get(key).asObservable()
108
+ : undefined;
109
+ }
110
+ /**
111
+ * Check whether a value exists.
112
+ *
113
+ * @param key
114
+ * @return True if the entry exists ( Is not null or undefined ) and false otherwise.
115
+ */
116
+ exists(key) {
117
+ return !!this.entries.get(key);
118
+ }
119
+ /**
120
+ * Retrieve a snapshot of the
121
+ * value.
122
+ *
123
+ * @param key
124
+ * @return A snapshot of the value corresponding to the key.
125
+ */
126
+ snapshot(key) {
127
+ return this.entries.get(key);
128
+ }
129
+ /**
130
+ * Indicates whether the store is empty.
131
+ * @return true if the store is empty, false otherwise.
132
+ */
133
+ isEmpty() {
134
+ return Array.from(this.entries.values()).length == 0;
135
+ }
136
+ /**
137
+ * Returns the number of key value pairs contained.
138
+ *
139
+ * @return the number of entries in the store.
140
+ */
141
+ count() {
142
+ return Array.from(this.entries.values()).length;
143
+ }
144
+ }
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT1N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9PU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQTJCakQsTUFBTSxPQUFPLE1BQU07SUFPakIsWUFBWSxLQUFrQjtRQTJCOUI7OztXQUdHO1FBQ0ksWUFBTyxHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTFDOztXQUVHO1FBQ0ssYUFBUSxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBbkN6RCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxDQUFDLEdBQU0sS0FBSyxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFrQixDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqQixNQUFNLEdBQUcsR0FBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFD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QUFDO0lBQ2xELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheVN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBJbml0aWFsaXplIGh0ZSBzdG9yZSB3aXRoIHRoaXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVSZXNldCB7XG4gIHZhbHVlOiBhbnk7XG4gIHJlc2V0PzogYW55O1xufVxuXG4vKipcbiAqIE9TdG9yZSBLZXkgVmFsdWUgUmVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNWYWx1ZVJlc2V0IHtcbiAgdmFsdWU6IGFueTtcbiAgcmVzZXQ/OiBhbnk7XG4gIG9icz86IE9ic2VydmFibGU8YW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlPYnNWYWx1ZVJlc2V0IHtcbiAgW2tleTogc3RyaW5nXTogT2JzVmFsdWVSZXNldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPU3RvcmVTdGFydCB7XG4gIFtrZXk6IHN0cmluZ106IFZhbHVlUmVzZXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBPU3RvcmU8RSBleHRlbmRzIEtleU9ic1ZhbHVlUmVzZXQ+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IGtleXMgYW5kIHZhbHVlc1xuICAgKiBwYXNzZWQgaW4gdmlhIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIFMhOiBFO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXJ0OiBPU3RvcmVTdGFydCkge1xuICAgIGlmIChzdGFydCkge1xuICAgICAgdGhpcy5TID0gPEU+c3RhcnQ7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RhcnQpO1xuICAgICAga2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG92ciA9IHN0YXJ0W2tdIGFzIE9ic1ZhbHVlUmVzZXQ7XG4gICAgICAgIHRoaXMucG9zdChvdnIsIG92ci52YWx1ZSk7XG4gICAgICAgIG92ci5vYnMgPSB0aGlzLm9ic2VydmUob3ZyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIE9TdG9yZSB0byB0aGVcbiAgICogdmFsdWVzIG9yIHJlc2V0IHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgKiB7QGxpbmsgT1N0b3JlU3RhcnR9IGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLlMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLlMpO1xuICAgICAga2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG92cjogT2JzVmFsdWVSZXNldCA9IHRoaXMuU1trXTtcbiAgICAgICAgdGhpcy5wdXQob3ZyLCBvdnIucmVzZXQgPyBvdnIucmVzZXQgOiBvdnIudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBvZiBLZXkgVmFsdWUgcGFpciBlbnRyaWVzXG4gICAqIGNvbnRhaW5pbmcgdmFsdWVzIHN0b3JlIGluIHRoaXMgc3RvcmUuXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogTWFwPGFueSwgYW55PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogTWFwIG9mIHJlcGxheSBzdWJqZWN0IGlkIHRvIGBSZXBsYXlTdWJqZWN0YCBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3ViamVjdHM6IE1hcDxhbnksIFJlcGxheVN1YmplY3Q8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFNldCBjcmVhdGUgYSBrZXkgdmFsdWUgcGFpciBlbnRyeSBhbmQgY3JlYXRlcyBhXG4gICAqIGNvcnJlc3BvbmRpbmcgcmVwbGF5IHN1YmplY3QgaW5zdGFuY2UgdGhhdCB3aWxsXG4gICAqIGJlIHVzZWQgdG8gYnJvYWRjYXN0IHVwZGF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwb3N0KGtleTogT2JzVmFsdWVSZXNldCwgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5zdWJqZWN0cy5zZXQoa2V5LCBuZXcgUmVwbGF5U3ViamVjdCgxKSk7XG4gICAgLy9FbWl0IGltbWVkaWF0ZWx5IHNvIHRoYXQgT2JzZXJ2ZXJzIGNhbiByZWNlaXZlXG4gICAgLy90aGUgdmFsdWUgc3RyYWlnaHQgYXdheS5cbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5nZXQoa2V5KTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgc3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHZhbHVlIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgcHV0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5nZXQoa2V5KTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgc3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBib3RoIHRoZSB2YWx1ZSBlbnRyeSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFJlcGxheVN1YmplY3R9LlxuICAgKiBXaWxsIHVuc3Vic2NyaWJlIHRoZSB7QGxpbmsgUmVwbGF5U3ViamVjdH0gcHJpb3IgdG8gZGVsZXRpbmcgaXQsXG4gICAqIHNldmVyaW5nIGNvbW11bmljYXRpb24gd2l0aCBjb3JyZXNwb25kaW5nIHtAbGluayBPYnNlcnZhYmxlfXMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICovXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBhbnkpIHtcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBEZWxldGUgdGhlIGVudHJ5XG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnN1YmplY3RzLmdldChrZXkpO1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICBzdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGVudHJpZXMuICBcbiAgICogXG4gICAqIE5vdGUgdGhhdCBcbiAgICogdGhpcyB3aWxsIGNhbGwgZGVsZXRlIGZvciBvbiBhbGxcbiAgICoga2V5cyBkZWZpbmVkIHdoaWNoIGFsc28gYWxzbyBcbiAgICogdW5zdWJzY3JpYmVzIGFuZCBkZWxldGVzIFxuICAgKiBhbGwgdGhlIHNidWplY3RzLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIGZvciAobGV0IGtleSBvZiB0aGlzLmVudHJpZXMua2V5cygpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgY2hhbmdlcyB0byB0aGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm4gQW4ge0BsaW5rIE9ic2VydmFibGV9IG9mIHRoZSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIG9ic2VydmUoa2V5OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RzLmdldChrZXkpXG4gICAgICA/IHRoaXMuc3ViamVjdHMuZ2V0KGtleSkhLmFzT2JzZXJ2YWJsZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGEgdmFsdWUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgZXhpc3RzICggSXMgbm90IG51bGwgb3IgdW5kZWZpbmVkICkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBleGlzdHMoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBzbmFwc2hvdCBvZiB0aGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkuXG4gICAqL1xuICBwdWJsaWMgc25hcHNob3Qoa2V5OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXkgdmFsdWUgcGFpcnMgY29udGFpbmVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc3RvcmUuXG4gICAqL1xuICBwdWJsaWMgY291bnQoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGg7XG4gIH1cbn1cbiJdfQ==