valyrian.js 7.2.12 → 8.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 (161) hide show
  1. package/README.md +6 -6
  2. package/dist/flux-store/index.d.ts +32 -0
  3. package/dist/flux-store/index.d.ts.map +1 -0
  4. package/dist/flux-store/index.js +258 -0
  5. package/dist/flux-store/index.js.map +7 -0
  6. package/dist/flux-store/index.min.js +1 -0
  7. package/dist/flux-store/index.min.js.map +1 -0
  8. package/dist/flux-store/index.mjs +237 -0
  9. package/dist/flux-store/index.mjs.map +7 -0
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +32 -50
  12. package/dist/hooks/index.js.map +3 -3
  13. package/dist/hooks/index.min.js +1 -0
  14. package/dist/hooks/index.min.js.map +1 -0
  15. package/dist/hooks/index.mjs +33 -51
  16. package/dist/hooks/index.mjs.map +3 -3
  17. package/dist/index.d.ts +6 -4
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +105 -88
  20. package/dist/index.js.map +3 -3
  21. package/dist/index.min.js +1 -1
  22. package/dist/index.min.js.map +1 -1
  23. package/dist/index.mjs +105 -88
  24. package/dist/index.mjs.map +3 -3
  25. package/dist/native-store/index.d.ts +14 -0
  26. package/dist/native-store/index.d.ts.map +1 -0
  27. package/dist/native-store/index.js +103 -0
  28. package/dist/native-store/index.js.map +7 -0
  29. package/dist/native-store/index.min.js +1 -0
  30. package/dist/native-store/index.min.js.map +1 -0
  31. package/dist/native-store/index.mjs +82 -0
  32. package/dist/native-store/index.mjs.map +7 -0
  33. package/dist/node/index.d.ts.map +1 -1
  34. package/dist/node/index.js +124 -10
  35. package/dist/node/index.js.map +4 -4
  36. package/dist/node/index.mjs +124 -10
  37. package/dist/node/index.mjs.map +4 -4
  38. package/dist/node/node.sw.js +152 -0
  39. package/dist/node/utils/inline.d.ts.map +1 -1
  40. package/dist/node/utils/node.sw.js +152 -0
  41. package/dist/node/utils/session-storage.d.ts +22 -0
  42. package/dist/node/utils/session-storage.d.ts.map +1 -0
  43. package/dist/node/utils/sw.d.ts.map +1 -1
  44. package/dist/node/utils/tree-adapter.d.ts +4 -0
  45. package/dist/node/utils/tree-adapter.d.ts.map +1 -1
  46. package/dist/pulse-store/index.d.ts +13 -0
  47. package/dist/pulse-store/index.d.ts.map +1 -0
  48. package/dist/pulse-store/index.js +143 -0
  49. package/dist/pulse-store/index.js.map +7 -0
  50. package/dist/pulse-store/index.min.js +1 -0
  51. package/dist/pulse-store/index.min.js.map +1 -0
  52. package/dist/pulse-store/index.mjs +122 -0
  53. package/dist/pulse-store/index.mjs.map +7 -0
  54. package/dist/request/index.d.ts.map +1 -1
  55. package/dist/request/index.js +63 -84
  56. package/dist/request/index.js.map +2 -2
  57. package/dist/request/index.min.js +1 -0
  58. package/dist/request/index.min.js.map +1 -0
  59. package/dist/request/index.mjs +63 -84
  60. package/dist/request/index.mjs.map +2 -2
  61. package/dist/router/index.d.ts +32 -31
  62. package/dist/router/index.d.ts.map +1 -1
  63. package/dist/router/index.js +247 -96
  64. package/dist/router/index.js.map +3 -3
  65. package/dist/router/index.min.js +1 -0
  66. package/dist/router/index.min.js.map +1 -0
  67. package/dist/router/index.mjs +247 -96
  68. package/dist/router/index.mjs.map +3 -3
  69. package/dist/signals/index.d.ts +6 -0
  70. package/dist/signals/index.d.ts.map +1 -0
  71. package/dist/signals/index.js +92 -0
  72. package/dist/signals/index.js.map +7 -0
  73. package/dist/signals/index.min.js +1 -0
  74. package/dist/signals/index.min.js.map +1 -0
  75. package/dist/signals/index.mjs +71 -0
  76. package/dist/signals/index.mjs.map +7 -0
  77. package/dist/suspense/index.d.ts +6 -0
  78. package/dist/suspense/index.d.ts.map +1 -0
  79. package/dist/suspense/index.js +67 -0
  80. package/dist/suspense/index.js.map +7 -0
  81. package/dist/suspense/index.min.js +1 -0
  82. package/dist/suspense/index.min.js.map +1 -0
  83. package/dist/suspense/index.mjs +46 -0
  84. package/dist/suspense/index.mjs.map +7 -0
  85. package/dist/sw/index.min.js +1 -0
  86. package/dist/sw/index.min.js.map +1 -0
  87. package/dist/translate/index.d.ts +19 -0
  88. package/dist/translate/index.d.ts.map +1 -0
  89. package/dist/translate/index.js +150 -0
  90. package/dist/translate/index.js.map +7 -0
  91. package/dist/translate/index.min.js +1 -0
  92. package/dist/translate/index.min.js.map +1 -0
  93. package/dist/translate/index.mjs +129 -0
  94. package/dist/translate/index.mjs.map +7 -0
  95. package/dist/tsconfig.tsbuildinfo +1 -1
  96. package/dist/utils/deep-freeze.d.ts +3 -0
  97. package/dist/utils/deep-freeze.d.ts.map +1 -0
  98. package/dist/utils/getter-setter.d.ts +3 -0
  99. package/dist/utils/getter-setter.d.ts.map +1 -0
  100. package/dist/utils/has-changed.d.ts +2 -0
  101. package/dist/utils/has-changed.d.ts.map +1 -0
  102. package/dist/utils/index.d.ts +4 -0
  103. package/dist/utils/index.d.ts.map +1 -0
  104. package/dist/utils/index.js +138 -0
  105. package/dist/utils/index.js.map +7 -0
  106. package/dist/utils/index.min.js +1 -0
  107. package/dist/utils/index.min.js.map +1 -0
  108. package/dist/utils/index.mjs +115 -0
  109. package/dist/utils/index.mjs.map +7 -0
  110. package/lib/flux-store/index.ts +301 -0
  111. package/lib/hooks/index.ts +36 -56
  112. package/lib/index.ts +120 -110
  113. package/lib/native-store/index.ts +106 -0
  114. package/lib/node/index.ts +3 -1
  115. package/lib/node/utils/node.sw.js +152 -0
  116. package/lib/node/utils/session-storage.ts +117 -0
  117. package/lib/node/utils/sw.ts +34 -10
  118. package/lib/node/utils/tree-adapter.ts +18 -0
  119. package/lib/pulse-store/index.ts +181 -0
  120. package/lib/request/index.ts +81 -111
  121. package/lib/router/index.ts +349 -162
  122. package/lib/signals/index.ts +98 -0
  123. package/lib/suspense/index.ts +57 -0
  124. package/lib/translate/index.ts +156 -0
  125. package/lib/utils/deep-freeze.ts +54 -0
  126. package/lib/utils/getter-setter.ts +40 -0
  127. package/lib/utils/has-changed.ts +43 -0
  128. package/lib/utils/index.ts +3 -0
  129. package/package.json +38 -57
  130. package/tsconfig.json +1 -1
  131. package/dist/dataset/index.d.ts +0 -24
  132. package/dist/dataset/index.d.ts.map +0 -1
  133. package/dist/dataset/index.js +0 -178
  134. package/dist/dataset/index.js.map +0 -7
  135. package/dist/dataset/index.mjs +0 -157
  136. package/dist/dataset/index.mjs.map +0 -7
  137. package/dist/node/node.sw.tpl +0 -133
  138. package/dist/node/utils/node.sw.tpl +0 -133
  139. package/dist/proxy-signal/index.d.ts +0 -23
  140. package/dist/proxy-signal/index.d.ts.map +0 -1
  141. package/dist/proxy-signal/index.js +0 -138
  142. package/dist/proxy-signal/index.js.map +0 -7
  143. package/dist/proxy-signal/index.mjs +0 -117
  144. package/dist/proxy-signal/index.mjs.map +0 -7
  145. package/dist/signal/index.d.ts +0 -9
  146. package/dist/signal/index.d.ts.map +0 -1
  147. package/dist/signal/index.js +0 -76
  148. package/dist/signal/index.js.map +0 -7
  149. package/dist/signal/index.mjs +0 -55
  150. package/dist/signal/index.mjs.map +0 -7
  151. package/dist/store/index.d.ts +0 -16
  152. package/dist/store/index.d.ts.map +0 -1
  153. package/dist/store/index.js +0 -93
  154. package/dist/store/index.js.map +0 -7
  155. package/dist/store/index.mjs +0 -72
  156. package/dist/store/index.mjs.map +0 -7
  157. package/lib/dataset/index.ts +0 -193
  158. package/lib/node/utils/node.sw.tpl +0 -133
  159. package/lib/proxy-signal/index.ts +0 -187
  160. package/lib/signal/index.ts +0 -86
  161. package/lib/store/index.ts +0 -101
package/README.md CHANGED
@@ -36,9 +36,9 @@ Lightweight steel to forge PWAs. (Minimal Frontend Framework with server side re
36
36
 
37
37
  ## Table of Contents
38
38
 
39
- * [Tests](#tests)
40
- * [Contributing](#contributing)
41
- * [Legal](#legal)
39
+ * [Tests](#tests)
40
+ * [Contributing](#contributing)
41
+ * [Legal](#legal)
42
42
 
43
43
  ## Tests
44
44
 
@@ -48,9 +48,9 @@ For development use `yarn dev:test`
48
48
 
49
49
  ## Contributing
50
50
 
51
- * Use prettify and eslint to lint your code.
52
- * Add tests for any new or changed functionality.
53
- * Update the readme with an example if you add or change any functionality.
51
+ * Use prettify and eslint to lint your code.
52
+ * Add tests for any new or changed functionality.
53
+ * Update the readme with an example if you add or change any functionality.
54
54
 
55
55
  ## Legal
56
56
 
@@ -0,0 +1,32 @@
1
+ interface StoreOptions {
2
+ state?: Record<string, any> | (() => Record<string, any>);
3
+ mutations?: Record<string, (state: Record<string, any>, ...args: any[]) => void>;
4
+ actions?: Record<string, (store: FluxStore, ...args: any[]) => any>;
5
+ getters?: Record<string, (state: Record<string, any>, getters: Record<string, any>, globalState?: any, globalGetters?: any) => any>;
6
+ modules?: Record<string, StoreOptions>;
7
+ shouldFreeze?: boolean;
8
+ namespace?: string;
9
+ rootStore?: FluxStore;
10
+ }
11
+ export declare class FluxStore {
12
+ state: Record<string, any>;
13
+ getters: Record<string, any>;
14
+ private init;
15
+ rootStore: FluxStore | null;
16
+ namespace: string | null;
17
+ constructor({ state, mutations, actions, getters, modules, shouldFreeze, namespace, rootStore }?: StoreOptions);
18
+ private keyExists;
19
+ private isFunction;
20
+ private getStore;
21
+ private isUnfrozen;
22
+ commit(mutation: string, ...args: any[]): void;
23
+ dispatch(action: string, ...args: any[]): Promise<any>;
24
+ trigger(event: string, ...args: any[]): void;
25
+ on(event: string, listener: Function): () => void;
26
+ off(event: string, listener: Function): void;
27
+ use(plugin: Function, ...options: any[]): void;
28
+ registerModule(namespace: string, module: StoreOptions): void;
29
+ unregisterModule(namespace: string): void;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/flux-store/index.ts"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAE1D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;IAEjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EAEN,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,GAAG,KAAK,GAAG,CAC1G,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAGD,qBAAa,SAAS;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,CAUV;IAEK,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGpB,EACV,KAAU,EACV,SAAc,EACd,OAAY,EACZ,OAAY,EACZ,OAAY,EACZ,YAAmB,EACnB,SAAS,EACT,SAAS,EACV,GAAE,YAAiB;IAsHpB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,UAAU;IAOX,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAcjC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAc5D,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAKrC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAWpC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAWrC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE;IAUvC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAiBtD,gBAAgB,CAAC,SAAS,EAAE,MAAM;CAe1C"}
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // lib/flux-store/index.ts
21
+ var flux_store_exports = {};
22
+ __export(flux_store_exports, {
23
+ FluxStore: () => FluxStore
24
+ });
25
+ module.exports = __toCommonJS(flux_store_exports);
26
+ var import_valyrian = require("valyrian.js");
27
+ var import_utils = require("valyrian.js/utils");
28
+ var FluxStore = class _FluxStore {
29
+ state;
30
+ getters;
31
+ init;
32
+ // eslint-disable-next-line no-use-before-define
33
+ rootStore;
34
+ namespace;
35
+ // eslint-disable-next-line sonarjs/cognitive-complexity
36
+ constructor({
37
+ state = {},
38
+ mutations = {},
39
+ actions = {},
40
+ getters = {},
41
+ modules = {},
42
+ shouldFreeze = true,
43
+ namespace,
44
+ rootStore
45
+ } = {}) {
46
+ const localState = typeof state === "function" ? state() : state;
47
+ this.state = new Proxy(localState || {}, {
48
+ // Every time we try to access a property from the state we try to deep freeze the property
49
+ // to prevent direct modifications to the state
50
+ get: (state2, prop) => {
51
+ if ((this.rootStore || this).init.modules[prop]) {
52
+ return state2[prop];
53
+ }
54
+ if (shouldFreeze) {
55
+ if (this.init.frozen) {
56
+ return (0, import_utils.deepFreeze)(state2[prop]);
57
+ }
58
+ const newState = (0, import_utils.deepCloneUnfreeze)(state2);
59
+ for (const key of Reflect.ownKeys(newState)) {
60
+ localState[key] = newState[key];
61
+ }
62
+ }
63
+ return state2[prop];
64
+ },
65
+ // If the user tries to set directly it will throw an error, only if we have unfrozen the state via commit
66
+ // this will proceed to set the value
67
+ set: (state2, prop, value) => {
68
+ this.isUnfrozen();
69
+ const old = state2[prop];
70
+ state2[prop] = value;
71
+ if (this.namespace) {
72
+ prop = `${this.namespace}.${prop}`;
73
+ }
74
+ (this.rootStore || this).trigger("set", prop, value, old);
75
+ return true;
76
+ },
77
+ // If the user tries to delete directly it will throw an error, only if we have unfrozen the state via commit
78
+ // this will proceed to delete the property
79
+ deleteProperty: (state2, prop) => {
80
+ this.isUnfrozen();
81
+ const old = state2[prop];
82
+ Reflect.deleteProperty(state2, prop);
83
+ if (this.namespace) {
84
+ prop = `${this.namespace}.${prop}`;
85
+ }
86
+ (this.rootStore || this).trigger("delete", prop, old);
87
+ return true;
88
+ }
89
+ });
90
+ this.rootStore = rootStore || null;
91
+ this.namespace = namespace || null;
92
+ this.init = {
93
+ frozen: true,
94
+ plugins: [],
95
+ modules: {},
96
+ childModuleNamespaces: Object.keys(modules || {}),
97
+ listeners: {
98
+ set: [],
99
+ delete: [],
100
+ beforecommit: [],
101
+ commit: [],
102
+ beforedispatch: [],
103
+ dispatch: [],
104
+ getter: [],
105
+ addlistener: [],
106
+ removelistener: [],
107
+ plugin: [],
108
+ registerModule: [],
109
+ unregisterModule: []
110
+ },
111
+ getters: getters || {},
112
+ mutations: mutations || {},
113
+ actions: actions || {}
114
+ };
115
+ this.getters = new Proxy(getters || {}, {
116
+ // When we try to get a property of the getter we will call the original
117
+ // getter method passing the state as first argument and the other getters as second
118
+ // if we try to get a non existent getter it will fail silently as if
119
+ // we were trying to get an undefined property
120
+ get: (getters2, getter) => {
121
+ try {
122
+ const { store, key } = this.getStore(this, getter);
123
+ if (store instanceof _FluxStore && store.init.getters[key]) {
124
+ const value = store.init.getters[key](store.state, store.getters, this.state, this.getters);
125
+ if (this.namespace) {
126
+ getter = `${this.namespace}.${getter}`;
127
+ }
128
+ (this.rootStore || this).trigger("getter", getter, value);
129
+ return value;
130
+ }
131
+ } catch (error) {
132
+ return;
133
+ }
134
+ }
135
+ });
136
+ if (modules) {
137
+ Object.keys(modules).forEach((namespace2) => {
138
+ const n = this.namespace ? `${this.namespace}.${namespace2}` : namespace2;
139
+ (this.rootStore || this).registerModule(n, modules[namespace2]);
140
+ });
141
+ }
142
+ }
143
+ keyExists(objectname, object, key) {
144
+ if (!object[key]) {
145
+ throw new Error(`The ${objectname} "${key}" does not exists.`);
146
+ }
147
+ }
148
+ isFunction(type, callback) {
149
+ if (typeof callback !== "function") {
150
+ throw new Error(`You need to provide a valid function as ${type}.`);
151
+ }
152
+ }
153
+ // Giving a dot based namespace this method will be used to find the module to be called
154
+ getStore(store, namespace) {
155
+ let key = namespace;
156
+ if (key.indexOf(".") > -1) {
157
+ const parts = key.split(".");
158
+ key = parts.pop();
159
+ const moduleName = parts.join(".");
160
+ this.keyExists("module", store.init.modules, moduleName);
161
+ store = store.init.modules[moduleName];
162
+ }
163
+ return {
164
+ store,
165
+ key
166
+ };
167
+ }
168
+ isUnfrozen() {
169
+ if (this.init.frozen) {
170
+ throw new Error("You need to commit a mutation to change the state");
171
+ }
172
+ }
173
+ // This method unfroze the state and process a mutation
174
+ commit(mutation, ...args) {
175
+ const { store, key } = this.getStore(this, mutation);
176
+ this.keyExists("mutation", store.init.mutations, key);
177
+ store.init.frozen = false;
178
+ this.trigger("beforecommit", mutation, ...args);
179
+ store.init.mutations[key](store.state, ...args);
180
+ this.trigger("commit", mutation, ...args);
181
+ store.init.frozen = true;
182
+ (0, import_valyrian.debouncedUpdate)();
183
+ }
184
+ // This method will dispatch an action
185
+ async dispatch(action, ...args) {
186
+ const { store, key } = this.getStore(this, action);
187
+ this.keyExists("action", store.init.actions, key);
188
+ this.trigger("beforedispatch", action, ...args);
189
+ try {
190
+ const result = await store.init.actions[key](store, ...args);
191
+ this.trigger("dispatch", action, ...args);
192
+ return result;
193
+ } finally {
194
+ (0, import_valyrian.debouncedUpdate)();
195
+ }
196
+ }
197
+ // This method will trigger an event
198
+ trigger(event, ...args) {
199
+ this.init.listeners[event].forEach((callback) => callback(this, ...args));
200
+ }
201
+ // This method will add a listener to the store
202
+ on(event, listener) {
203
+ this.isFunction("listener", listener);
204
+ this.keyExists("event", this.init.listeners, event);
205
+ if (this.init.listeners[event].indexOf(listener) === -1) {
206
+ this.init.listeners[event].push(listener);
207
+ this.trigger("addlistener", event, listener);
208
+ }
209
+ return () => this.off(event, listener);
210
+ }
211
+ // Remove a listener from the store
212
+ off(event, listener) {
213
+ this.isFunction("listener", listener);
214
+ this.keyExists("event", this.init.listeners, event);
215
+ const index = this.init.listeners[event].indexOf(listener);
216
+ if (index > -1) {
217
+ this.init.listeners[event].splice(index, 1);
218
+ this.trigger("removelistener", event, listener);
219
+ }
220
+ }
221
+ // This method will add a plugin to the store
222
+ use(plugin, ...options) {
223
+ this.isFunction("plugin", plugin);
224
+ if (this.init.plugins.indexOf(plugin) === -1) {
225
+ plugin(this, ...options);
226
+ this.init.plugins.push(plugin);
227
+ this.trigger("plugin", plugin, ...options);
228
+ }
229
+ }
230
+ // This method will register a module to the store
231
+ registerModule(namespace, module2) {
232
+ const rootStore = this;
233
+ if (rootStore.init.modules[namespace]) {
234
+ throw new Error(`A module with the namespace "${namespace}" is already registered.`);
235
+ }
236
+ const newStore = new _FluxStore({ ...module2, rootStore, namespace });
237
+ rootStore.init.frozen = false;
238
+ rootStore.init.modules[namespace] = newStore;
239
+ rootStore.state[namespace] = newStore.state;
240
+ rootStore.init.frozen = true;
241
+ rootStore.trigger("registerModule", namespace, module2, newStore);
242
+ (0, import_valyrian.debouncedUpdate)();
243
+ }
244
+ // This method will unregister a module from the store
245
+ unregisterModule(namespace) {
246
+ const rootStore = this;
247
+ const store = rootStore.init.modules[namespace];
248
+ if (store) {
249
+ store.init.childModuleNamespaces.forEach((n) => rootStore.unregisterModule(`${namespace}.${n}`));
250
+ rootStore.init.frozen = false;
251
+ Reflect.deleteProperty(rootStore.init.modules, namespace);
252
+ Reflect.deleteProperty(rootStore.state, namespace);
253
+ rootStore.init.frozen = true;
254
+ rootStore.trigger("unregisterModule", namespace, store);
255
+ (0, import_valyrian.debouncedUpdate)();
256
+ }
257
+ }
258
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/flux-store/index.ts"],
4
+ "sourcesContent": ["import { debouncedUpdate } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze } from \"valyrian.js/utils\";\n\ninterface StoreOptions {\n state?: Record<string, any> | (() => Record<string, any>);\n // eslint-disable-next-line no-unused-vars\n mutations?: Record<string, (state: Record<string, any>, ...args: any[]) => void>;\n // eslint-disable-next-line no-unused-vars, no-use-before-define\n actions?: Record<string, (store: FluxStore, ...args: any[]) => any>;\n getters?: Record<\n string,\n // eslint-disable-next-line no-unused-vars\n (state: Record<string, any>, getters: Record<string, any>, globalState?: any, globalGetters?: any) => any\n >;\n modules?: Record<string, StoreOptions>;\n shouldFreeze?: boolean;\n namespace?: string;\n // eslint-disable-next-line no-use-before-define\n rootStore?: FluxStore;\n}\n\n// This is the store entity\nexport class FluxStore {\n public state: Record<string, any>;\n public getters: Record<string, any>;\n private init: {\n frozen: boolean;\n plugins: Function[];\n // eslint-disable-next-line no-use-before-define\n modules: Record<string, FluxStore>;\n childModuleNamespaces: string[];\n listeners: Record<string, Function[]>;\n getters: StoreOptions[\"getters\"];\n mutations: StoreOptions[\"mutations\"];\n actions: StoreOptions[\"actions\"];\n };\n // eslint-disable-next-line no-use-before-define\n public rootStore: FluxStore | null;\n public namespace: string | null;\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n constructor({\n state = {},\n mutations = {},\n actions = {},\n getters = {},\n modules = {},\n shouldFreeze = true,\n namespace,\n rootStore\n }: StoreOptions = {}) {\n // Initialize the localState for this store\n const localState = typeof state === \"function\" ? state() : state;\n\n // We create a proxy for the state\n this.state = new Proxy(localState || {}, {\n // Every time we try to access a property from the state we try to deep freeze the property\n // to prevent direct modifications to the state\n get: (state, prop: string) => {\n if ((this.rootStore || this).init.modules[prop]) {\n return state[prop];\n }\n if (shouldFreeze) {\n // We are accessing a property from outside the store\n if (this.init.frozen) {\n return deepFreeze(state[prop]);\n }\n\n // We are accessing a property from inside the store\n // So we need to unfreeze the state\n const newState = deepCloneUnfreeze(state);\n for (const key of Reflect.ownKeys(newState)) {\n localState[key] = newState[key];\n }\n }\n return state[prop];\n },\n // If the user tries to set directly it will throw an error, only if we have unfrozen the state via commit\n // this will proceed to set the value\n set: (state, prop: string, value: any) => {\n this.isUnfrozen();\n const old = state[prop];\n state[prop] = value;\n if (this.namespace) {\n prop = `${this.namespace}.${prop}`;\n }\n (this.rootStore || this).trigger(\"set\", prop, value, old);\n return true;\n },\n // If the user tries to delete directly it will throw an error, only if we have unfrozen the state via commit\n // this will proceed to delete the property\n deleteProperty: (state, prop: string) => {\n this.isUnfrozen();\n const old = state[prop];\n Reflect.deleteProperty(state, prop);\n if (this.namespace) {\n prop = `${this.namespace}.${prop}`;\n }\n (this.rootStore || this).trigger(\"delete\", prop, old);\n return true;\n }\n });\n\n // If this is a store been attached to another store\n // this will have the rootStore for future reference\n this.rootStore = rootStore || null;\n\n // If this is a store been attached to another store\n // this will have the namespace attached\n this.namespace = namespace || null;\n\n // We initialize the store with the initial values\n this.init = {\n frozen: true,\n plugins: [],\n modules: {},\n childModuleNamespaces: Object.keys(modules || {}),\n listeners: {\n set: [],\n delete: [],\n beforecommit: [],\n commit: [],\n beforedispatch: [],\n dispatch: [],\n getter: [],\n addlistener: [],\n removelistener: [],\n plugin: [],\n registerModule: [],\n unregisterModule: []\n },\n getters: getters || {},\n mutations: mutations || {},\n actions: actions || {}\n };\n\n // We create a proxy for the getters\n this.getters = new Proxy(getters || {}, {\n // When we try to get a property of the getter we will call the original\n // getter method passing the state as first argument and the other getters as second\n // if we try to get a non existent getter it will fail silently as if\n // we were trying to get an undefined property\n get: (getters, getter: string) => {\n try {\n const { store, key } = this.getStore(this, getter);\n if (store instanceof FluxStore && store.init.getters![key]) {\n const value = store.init.getters![key](store.state, store.getters, this.state, this.getters);\n if (this.namespace) {\n getter = `${this.namespace}.${getter}`;\n }\n (this.rootStore || this).trigger(\"getter\", getter, value);\n return value;\n }\n } catch (error) {\n return;\n }\n }\n });\n\n // Finally we attach the initial modules\n if (modules) {\n Object.keys(modules).forEach((namespace) => {\n const n = this.namespace ? `${this.namespace}.${namespace}` : namespace;\n (this.rootStore || this).registerModule(n, modules[namespace]);\n });\n }\n }\n\n private keyExists(objectname: string, object: Record<string, any>, key: string) {\n if (!object[key]) {\n throw new Error(`The ${objectname} \"${key}\" does not exists.`);\n }\n }\n\n private isFunction(type: string, callback: Function) {\n if (typeof callback !== \"function\") {\n throw new Error(`You need to provide a valid function as ${type}.`);\n }\n }\n\n // Giving a dot based namespace this method will be used to find the module to be called\n private getStore(store: FluxStore, namespace: string) {\n let key = namespace;\n if (key.indexOf(\".\") > -1) {\n const parts = key.split(\".\");\n key = parts.pop()!;\n const moduleName = parts.join(\".\");\n this.keyExists(\"module\", store.init.modules, moduleName);\n store = store.init.modules[moduleName];\n }\n return {\n store,\n key\n };\n }\n\n private isUnfrozen() {\n if (this.init.frozen) {\n throw new Error(\"You need to commit a mutation to change the state\");\n }\n }\n\n // This method unfroze the state and process a mutation\n public commit(mutation: string, ...args: any[]) {\n const { store, key } = this.getStore(this, mutation);\n this.keyExists(\"mutation\", store.init.mutations!, key);\n store.init.frozen = false;\n this.trigger(\"beforecommit\", mutation, ...args);\n store.init.mutations![key](store.state, ...args);\n this.trigger(\"commit\", mutation, ...args);\n store.init.frozen = true;\n\n // We call the debounced update to notify the changes\n debouncedUpdate();\n }\n\n // This method will dispatch an action\n public async dispatch(action: string, ...args: any[]): Promise<any> {\n const { store, key } = this.getStore(this, action);\n this.keyExists(\"action\", store.init.actions!, key);\n this.trigger(\"beforedispatch\", action, ...args);\n try {\n const result = await store.init.actions![key](store, ...args);\n this.trigger(\"dispatch\", action, ...args);\n return result;\n } finally {\n debouncedUpdate();\n }\n }\n\n // This method will trigger an event\n public trigger(event: string, ...args: any[]) {\n this.init.listeners[event].forEach((callback) => callback(this, ...args));\n }\n\n // This method will add a listener to the store\n public on(event: string, listener: Function) {\n this.isFunction(\"listener\", listener);\n this.keyExists(\"event\", this.init.listeners, event);\n if (this.init.listeners[event].indexOf(listener) === -1) {\n this.init.listeners[event].push(listener);\n this.trigger(\"addlistener\", event, listener);\n }\n return () => this.off(event, listener);\n }\n\n // Remove a listener from the store\n public off(event: string, listener: Function) {\n this.isFunction(\"listener\", listener);\n this.keyExists(\"event\", this.init.listeners, event);\n const index = this.init.listeners[event].indexOf(listener);\n if (index > -1) {\n this.init.listeners[event].splice(index, 1);\n this.trigger(\"removelistener\", event, listener);\n }\n }\n\n // This method will add a plugin to the store\n public use(plugin: Function, ...options: any[]) {\n this.isFunction(\"plugin\", plugin);\n if (this.init.plugins.indexOf(plugin) === -1) {\n plugin(this, ...options);\n this.init.plugins.push(plugin);\n this.trigger(\"plugin\", plugin, ...options);\n }\n }\n\n // This method will register a module to the store\n public registerModule(namespace: string, module: StoreOptions) {\n const rootStore = this;\n if (rootStore.init.modules[namespace]) {\n throw new Error(`A module with the namespace \"${namespace}\" is already registered.`);\n }\n const newStore = new FluxStore({ ...module, rootStore, namespace });\n rootStore.init.frozen = false;\n rootStore.init.modules[namespace] = newStore;\n rootStore.state[namespace] = newStore.state;\n rootStore.init.frozen = true;\n rootStore.trigger(\"registerModule\", namespace, module, newStore);\n\n // We call the debounced update to notify the changes\n debouncedUpdate();\n }\n\n // This method will unregister a module from the store\n public unregisterModule(namespace: string) {\n const rootStore = this;\n const store = rootStore.init.modules[namespace];\n if (store) {\n store.init.childModuleNamespaces.forEach((n) => rootStore.unregisterModule(`${namespace}.${n}`));\n rootStore.init.frozen = false;\n Reflect.deleteProperty(rootStore.init.modules, namespace);\n Reflect.deleteProperty(rootStore.state, namespace);\n rootStore.init.frozen = true;\n rootStore.trigger(\"unregisterModule\", namespace, store);\n\n // We call the debounced update to notify the changes\n debouncedUpdate();\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["state", "getters", "namespace", "module"]
7
+ }
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r={};((t,i)=>{for(var s in i)e(t,s,{get:i[s],enumerable:!0})})(r,{FluxStore:()=>h});var n,o=(n=r,((r,n,o,a)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let c of i(n))s.call(r,c)||c===o||e(r,c,{get:()=>n[c],enumerable:!(a=t(n,c))||a.enumerable});return r})(e({},"__esModule",{value:!0}),n)),a=require("valyrian.js"),c=require("valyrian.js/utils"),h=class e{state;getters;init;rootStore;namespace;constructor({state:t={},mutations:i={},actions:s={},getters:r={},modules:n={},shouldFreeze:o=!0,namespace:a,rootStore:h}={}){const l="function"==typeof t?t():t;this.state=new Proxy(l||{},{get:(e,t)=>{if((this.rootStore||this).init.modules[t])return e[t];if(o){if(this.init.frozen)return(0,c.deepFreeze)(e[t]);const i=(0,c.deepCloneUnfreeze)(e);for(const e of Reflect.ownKeys(i))l[e]=i[e]}return e[t]},set:(e,t,i)=>{this.isUnfrozen();const s=e[t];return e[t]=i,this.namespace&&(t=`${this.namespace}.${t}`),(this.rootStore||this).trigger("set",t,i,s),!0},deleteProperty:(e,t)=>{this.isUnfrozen();const i=e[t];return Reflect.deleteProperty(e,t),this.namespace&&(t=`${this.namespace}.${t}`),(this.rootStore||this).trigger("delete",t,i),!0}}),this.rootStore=h||null,this.namespace=a||null,this.init={frozen:!0,plugins:[],modules:{},childModuleNamespaces:Object.keys(n||{}),listeners:{set:[],delete:[],beforecommit:[],commit:[],beforedispatch:[],dispatch:[],getter:[],addlistener:[],removelistener:[],plugin:[],registerModule:[],unregisterModule:[]},getters:r||{},mutations:i||{},actions:s||{}},this.getters=new Proxy(r||{},{get:(t,i)=>{try{const{store:t,key:s}=this.getStore(this,i);if(t instanceof e&&t.init.getters[s]){const e=t.init.getters[s](t.state,t.getters,this.state,this.getters);return this.namespace&&(i=`${this.namespace}.${i}`),(this.rootStore||this).trigger("getter",i,e),e}}catch(e){return}}}),n&&Object.keys(n).forEach(e=>{const t=this.namespace?`${this.namespace}.${e}`:e;(this.rootStore||this).registerModule(t,n[e])})}keyExists(e,t,i){if(!t[i])throw new Error(`The ${e} "${i}" does not exists.`)}isFunction(e,t){if("function"!=typeof t)throw new Error(`You need to provide a valid function as ${e}.`)}getStore(e,t){let i=t;if(i.indexOf(".")>-1){const t=i.split(".");i=t.pop();const s=t.join(".");this.keyExists("module",e.init.modules,s),e=e.init.modules[s]}return{store:e,key:i}}isUnfrozen(){if(this.init.frozen)throw new Error("You need to commit a mutation to change the state")}commit(e,...t){const{store:i,key:s}=this.getStore(this,e);this.keyExists("mutation",i.init.mutations,s),i.init.frozen=!1,this.trigger("beforecommit",e,...t),i.init.mutations[s](i.state,...t),this.trigger("commit",e,...t),i.init.frozen=!0,(0,a.debouncedUpdate)()}async dispatch(e,...t){const{store:i,key:s}=this.getStore(this,e);this.keyExists("action",i.init.actions,s),this.trigger("beforedispatch",e,...t);try{const r=await i.init.actions[s](i,...t);return this.trigger("dispatch",e,...t),r}finally{(0,a.debouncedUpdate)()}}trigger(e,...t){this.init.listeners[e].forEach(e=>e(this,...t))}on(e,t){return this.isFunction("listener",t),this.keyExists("event",this.init.listeners,e),-1===this.init.listeners[e].indexOf(t)&&(this.init.listeners[e].push(t),this.trigger("addlistener",e,t)),()=>this.off(e,t)}off(e,t){this.isFunction("listener",t),this.keyExists("event",this.init.listeners,e);const i=this.init.listeners[e].indexOf(t);i>-1&&(this.init.listeners[e].splice(i,1),this.trigger("removelistener",e,t))}use(e,...t){this.isFunction("plugin",e),-1===this.init.plugins.indexOf(e)&&(e(this,...t),this.init.plugins.push(e),this.trigger("plugin",e,...t))}registerModule(t,i){const s=this;if(s.init.modules[t])throw new Error(`A module with the namespace "${t}" is already registered.`);const r=new e({...i,rootStore:s,namespace:t});s.init.frozen=!1,s.init.modules[t]=r,s.state[t]=r.state,s.init.frozen=!0,s.trigger("registerModule",t,i,r),(0,a.debouncedUpdate)()}unregisterModule(e){const t=this,i=t.init.modules[e];i&&(i.init.childModuleNamespaces.forEach(i=>t.unregisterModule(`${e}.${i}`)),t.init.frozen=!1,Reflect.deleteProperty(t.init.modules,e),Reflect.deleteProperty(t.state,e),t.init.frozen=!0,t.trigger("unregisterModule",e,i),(0,a.debouncedUpdate)())}};"undefined"!=typeof module?module.exports=o:self.ValyrianFluxStore=o})();//# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmbHV4X3N0b3JlX2V4cG9ydHMiLCJfX2V4cG9ydCIsIkZsdXhTdG9yZSIsIl9fRVhQT1JUU19fIiwiaW1wb3J0X3ZhbHlyaWFuIiwicmVxdWlyZSIsImltcG9ydF91dGlscyIsIl9GbHV4U3RvcmUiLCJzdGF0ZSIsImdldHRlcnMiLCJpbml0Iiwicm9vdFN0b3JlIiwibmFtZXNwYWNlIiwiY29uc3RydWN0b3IiLCJtdXRhdGlvbnMiLCJhY3Rpb25zIiwibW9kdWxlcyIsInNob3VsZEZyZWV6ZSIsImxvY2FsU3RhdGUiLCJ0aGlzIiwiUHJveHkiLCJnZXQiLCJwcm9wIiwiZnJvemVuIiwiZGVlcEZyZWV6ZSIsIm5ld1N0YXRlIiwiZGVlcENsb25lVW5mcmVlemUiLCJrZXkiLCJSZWZsZWN0Iiwib3duS2V5cyIsInNldCIsInZhbHVlIiwiaXNVbmZyb3plbiIsIm9sZCIsInRyaWdnZXIiLCJkZWxldGVQcm9wZXJ0eSIsInBsdWdpbnMiLCJjaGlsZE1vZHVsZU5hbWVzcGFjZXMiLCJPYmplY3QiLCJrZXlzIiwibGlzdGVuZXJzIiwiZGVsZXRlIiwiYmVmb3JlY29tbWl0IiwiY29tbWl0IiwiYmVmb3JlZGlzcGF0Y2giLCJkaXNwYXRjaCIsImdldHRlciIsImFkZGxpc3RlbmVyIiwicmVtb3ZlbGlzdGVuZXIiLCJwbHVnaW4iLCJyZWdpc3Rlck1vZHVsZSIsInVucmVnaXN0ZXJNb2R1bGUiLCJzdG9yZSIsImdldFN0b3JlIiwiZXJyb3IiLCJmb3JFYWNoIiwibiIsImtleUV4aXN0cyIsIm9iamVjdG5hbWUiLCJvYmplY3QiLCJFcnJvciIsImlzRnVuY3Rpb24iLCJ0eXBlIiwiY2FsbGJhY2siLCJpbmRleE9mIiwicGFydHMiLCJzcGxpdCIsInBvcCIsIm1vZHVsZU5hbWUiLCJqb2luIiwibXV0YXRpb24iLCJhcmdzIiwiZGVib3VuY2VkVXBkYXRlIiwiYWN0aW9uIiwicmVzdWx0IiwiZXZlbnQiLCJvbiIsImxpc3RlbmVyIiwicHVzaCIsIm9mZiIsImluZGV4Iiwic3BsaWNlIiwidXNlIiwib3B0aW9ucyIsIm1vZHVsZSIsIm5ld1N0b3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2ZsdXgtc3RvcmUvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVib3VuY2VkVXBkYXRlIH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSwgZGVlcEZyZWV6ZSB9IGZyb20gXCJ2YWx5cmlhbi5qcy91dGlsc1wiO1xuXG5pbnRlcmZhY2UgU3RvcmVPcHRpb25zIHtcbiAgc3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgKCgpID0+IFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgbXV0YXRpb25zPzogUmVjb3JkPHN0cmluZywgKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgYWN0aW9ucz86IFJlY29yZDxzdHJpbmcsIChzdG9yZTogRmx1eFN0b3JlLCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55PjtcbiAgZ2V0dGVycz86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBnZXR0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBnbG9iYWxTdGF0ZT86IGFueSwgZ2xvYmFsR2V0dGVycz86IGFueSkgPT4gYW55XG4gID47XG4gIG1vZHVsZXM/OiBSZWNvcmQ8c3RyaW5nLCBTdG9yZU9wdGlvbnM+O1xuICBzaG91bGRGcmVlemU/OiBib29sZWFuO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICByb290U3RvcmU/OiBGbHV4U3RvcmU7XG59XG5cbi8vIFRoaXMgaXMgdGhlIHN0b3JlIGVudGl0eVxuZXhwb3J0IGNsYXNzIEZsdXhTdG9yZSB7XG4gIHB1YmxpYyBzdGF0ZTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHVibGljIGdldHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByaXZhdGUgaW5pdDoge1xuICAgIGZyb3plbjogYm9vbGVhbjtcbiAgICBwbHVnaW5zOiBGdW5jdGlvbltdO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIEZsdXhTdG9yZT47XG4gICAgY2hpbGRNb2R1bGVOYW1lc3BhY2VzOiBzdHJpbmdbXTtcbiAgICBsaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uW10+O1xuICAgIGdldHRlcnM6IFN0b3JlT3B0aW9uc1tcImdldHRlcnNcIl07XG4gICAgbXV0YXRpb25zOiBTdG9yZU9wdGlvbnNbXCJtdXRhdGlvbnNcIl07XG4gICAgYWN0aW9uczogU3RvcmVPcHRpb25zW1wiYWN0aW9uc1wiXTtcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHB1YmxpYyByb290U3RvcmU6IEZsdXhTdG9yZSB8IG51bGw7XG4gIHB1YmxpYyBuYW1lc3BhY2U6IHN0cmluZyB8IG51bGw7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgY29uc3RydWN0b3Ioe1xuICAgIHN0YXRlID0ge30sXG4gICAgbXV0YXRpb25zID0ge30sXG4gICAgYWN0aW9ucyA9IHt9LFxuICAgIGdldHRlcnMgPSB7fSxcbiAgICBtb2R1bGVzID0ge30sXG4gICAgc2hvdWxkRnJlZXplID0gdHJ1ZSxcbiAgICBuYW1lc3BhY2UsXG4gICAgcm9vdFN0b3JlXG4gIH06IFN0b3JlT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbG9jYWxTdGF0ZSBmb3IgdGhpcyBzdG9yZVxuICAgIGNvbnN0IGxvY2FsU3RhdGUgPSB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHN0YXRlKCkgOiBzdGF0ZTtcblxuICAgIC8vIFdlIGNyZWF0ZSBhIHByb3h5IGZvciB0aGUgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0gbmV3IFByb3h5KGxvY2FsU3RhdGUgfHwge30sIHtcbiAgICAgIC8vIEV2ZXJ5IHRpbWUgd2UgdHJ5IHRvIGFjY2VzcyBhIHByb3BlcnR5IGZyb20gdGhlIHN0YXRlIHdlIHRyeSB0byBkZWVwIGZyZWV6ZSB0aGUgcHJvcGVydHlcbiAgICAgIC8vIHRvIHByZXZlbnQgZGlyZWN0IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlXG4gICAgICBnZXQ6IChzdGF0ZSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgodGhpcy5yb290U3RvcmUgfHwgdGhpcykuaW5pdC5tb2R1bGVzW3Byb3BdKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRGcmVlemUpIHtcbiAgICAgICAgICAvLyBXZSBhcmUgYWNjZXNzaW5nIGEgcHJvcGVydHkgZnJvbSBvdXRzaWRlIHRoZSBzdG9yZVxuICAgICAgICAgIGlmICh0aGlzLmluaXQuZnJvemVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVlcEZyZWV6ZShzdGF0ZVtwcm9wXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2UgYXJlIGFjY2Vzc2luZyBhIHByb3BlcnR5IGZyb20gaW5zaWRlIHRoZSBzdG9yZVxuICAgICAgICAgIC8vIFNvIHdlIG5lZWQgdG8gdW5mcmVlemUgdGhlIHN0YXRlXG4gICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShzdGF0ZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG5ld1N0YXRlKSkge1xuICAgICAgICAgICAgbG9jYWxTdGF0ZVtrZXldID0gbmV3U3RhdGVba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgICAgfSxcbiAgICAgIC8vIElmIHRoZSB1c2VyIHRyaWVzIHRvIHNldCBkaXJlY3RseSBpdCB3aWxsIHRocm93IGFuIGVycm9yLCBvbmx5IGlmIHdlIGhhdmUgdW5mcm96ZW4gdGhlIHN0YXRlIHZpYSBjb21taXRcbiAgICAgIC8vIHRoaXMgd2lsbCBwcm9jZWVkIHRvIHNldCB0aGUgdmFsdWVcbiAgICAgIHNldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc1VuZnJvemVuKCk7XG4gICAgICAgIGNvbnN0IG9sZCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBzdGF0ZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UpIHtcbiAgICAgICAgICBwcm9wID0gYCR7dGhpcy5uYW1lc3BhY2V9LiR7cHJvcH1gO1xuICAgICAgICB9XG4gICAgICAgICh0aGlzLnJvb3RTdG9yZSB8fCB0aGlzKS50cmlnZ2VyKFwic2V0XCIsIHByb3AsIHZhbHVlLCBvbGQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byBkZWxldGUgZGlyZWN0bHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciwgb25seSBpZiB3ZSBoYXZlIHVuZnJvemVuIHRoZSBzdGF0ZSB2aWEgY29tbWl0XG4gICAgICAvLyB0aGlzIHdpbGwgcHJvY2VlZCB0byBkZWxldGUgdGhlIHByb3BlcnR5XG4gICAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pc1VuZnJvemVuKCk7XG4gICAgICAgIGNvbnN0IG9sZCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHN0YXRlLCBwcm9wKTtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlKSB7XG4gICAgICAgICAgcHJvcCA9IGAke3RoaXMubmFtZXNwYWNlfS4ke3Byb3B9YDtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5yb290U3RvcmUgfHwgdGhpcykudHJpZ2dlcihcImRlbGV0ZVwiLCBwcm9wLCBvbGQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSBzdG9yZSBiZWVuIGF0dGFjaGVkIHRvIGFub3RoZXIgc3RvcmVcbiAgICAvLyB0aGlzIHdpbGwgaGF2ZSB0aGUgcm9vdFN0b3JlIGZvciBmdXR1cmUgcmVmZXJlbmNlXG4gICAgdGhpcy5yb290U3RvcmUgPSByb290U3RvcmUgfHwgbnVsbDtcblxuICAgIC8vIElmIHRoaXMgaXMgYSBzdG9yZSBiZWVuIGF0dGFjaGVkIHRvIGFub3RoZXIgc3RvcmVcbiAgICAvLyB0aGlzIHdpbGwgaGF2ZSB0aGUgbmFtZXNwYWNlIGF0dGFjaGVkXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2UgfHwgbnVsbDtcblxuICAgIC8vIFdlIGluaXRpYWxpemUgdGhlIHN0b3JlIHdpdGggdGhlIGluaXRpYWwgdmFsdWVzXG4gICAgdGhpcy5pbml0ID0ge1xuICAgICAgZnJvemVuOiB0cnVlLFxuICAgICAgcGx1Z2luczogW10sXG4gICAgICBtb2R1bGVzOiB7fSxcbiAgICAgIGNoaWxkTW9kdWxlTmFtZXNwYWNlczogT2JqZWN0LmtleXMobW9kdWxlcyB8fCB7fSksXG4gICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgc2V0OiBbXSxcbiAgICAgICAgZGVsZXRlOiBbXSxcbiAgICAgICAgYmVmb3JlY29tbWl0OiBbXSxcbiAgICAgICAgY29tbWl0OiBbXSxcbiAgICAgICAgYmVmb3JlZGlzcGF0Y2g6IFtdLFxuICAgICAgICBkaXNwYXRjaDogW10sXG4gICAgICAgIGdldHRlcjogW10sXG4gICAgICAgIGFkZGxpc3RlbmVyOiBbXSxcbiAgICAgICAgcmVtb3ZlbGlzdGVuZXI6IFtdLFxuICAgICAgICBwbHVnaW46IFtdLFxuICAgICAgICByZWdpc3Rlck1vZHVsZTogW10sXG4gICAgICAgIHVucmVnaXN0ZXJNb2R1bGU6IFtdXG4gICAgICB9LFxuICAgICAgZ2V0dGVyczogZ2V0dGVycyB8fCB7fSxcbiAgICAgIG11dGF0aW9uczogbXV0YXRpb25zIHx8IHt9LFxuICAgICAgYWN0aW9uczogYWN0aW9ucyB8fCB7fVxuICAgIH07XG5cbiAgICAvLyBXZSBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIGdldHRlcnNcbiAgICB0aGlzLmdldHRlcnMgPSBuZXcgUHJveHkoZ2V0dGVycyB8fCB7fSwge1xuICAgICAgLy8gV2hlbiB3ZSB0cnkgdG8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGdldHRlciB3ZSB3aWxsIGNhbGwgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBnZXR0ZXIgbWV0aG9kIHBhc3NpbmcgdGhlIHN0YXRlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGUgb3RoZXIgZ2V0dGVycyBhcyBzZWNvbmRcbiAgICAgIC8vIGlmIHdlIHRyeSB0byBnZXQgYSBub24gZXhpc3RlbnQgZ2V0dGVyIGl0IHdpbGwgZmFpbCBzaWxlbnRseSBhcyBpZlxuICAgICAgLy8gd2Ugd2VyZSB0cnlpbmcgdG8gZ2V0IGFuIHVuZGVmaW5lZCBwcm9wZXJ0eVxuICAgICAgZ2V0OiAoZ2V0dGVycywgZ2V0dGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHN0b3JlLCBrZXkgfSA9IHRoaXMuZ2V0U3RvcmUodGhpcywgZ2V0dGVyKTtcbiAgICAgICAgICBpZiAoc3RvcmUgaW5zdGFuY2VvZiBGbHV4U3RvcmUgJiYgc3RvcmUuaW5pdC5nZXR0ZXJzIVtrZXldKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0b3JlLmluaXQuZ2V0dGVycyFba2V5XShzdG9yZS5zdGF0ZSwgc3RvcmUuZ2V0dGVycywgdGhpcy5zdGF0ZSwgdGhpcy5nZXR0ZXJzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICBnZXR0ZXIgPSBgJHt0aGlzLm5hbWVzcGFjZX0uJHtnZXR0ZXJ9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh0aGlzLnJvb3RTdG9yZSB8fCB0aGlzKS50cmlnZ2VyKFwiZ2V0dGVyXCIsIGdldHRlciwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEZpbmFsbHkgd2UgYXR0YWNoIHRoZSBpbml0aWFsIG1vZHVsZXNcbiAgICBpZiAobW9kdWxlcykge1xuICAgICAgT2JqZWN0LmtleXMobW9kdWxlcykuZm9yRWFjaCgobmFtZXNwYWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLm5hbWVzcGFjZSA/IGAke3RoaXMubmFtZXNwYWNlfS4ke25hbWVzcGFjZX1gIDogbmFtZXNwYWNlO1xuICAgICAgICAodGhpcy5yb290U3RvcmUgfHwgdGhpcykucmVnaXN0ZXJNb2R1bGUobiwgbW9kdWxlc1tuYW1lc3BhY2VdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUga2V5RXhpc3RzKG9iamVjdG5hbWU6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZykge1xuICAgIGlmICghb2JqZWN0W2tleV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7b2JqZWN0bmFtZX0gXCIke2tleX1cIiBkb2VzIG5vdCBleGlzdHMuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0Z1bmN0aW9uKHR5cGU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBuZWVkIHRvIHByb3ZpZGUgYSB2YWxpZCBmdW5jdGlvbiBhcyAke3R5cGV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdpdmluZyBhIGRvdCBiYXNlZCBuYW1lc3BhY2UgdGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG1vZHVsZSB0byBiZSBjYWxsZWRcbiAgcHJpdmF0ZSBnZXRTdG9yZShzdG9yZTogRmx1eFN0b3JlLCBuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIGxldCBrZXkgPSBuYW1lc3BhY2U7XG4gICAgaWYgKGtleS5pbmRleE9mKFwiLlwiKSA+IC0xKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdChcIi5cIik7XG4gICAgICBrZXkgPSBwYXJ0cy5wb3AoKSE7XG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gcGFydHMuam9pbihcIi5cIik7XG4gICAgICB0aGlzLmtleUV4aXN0cyhcIm1vZHVsZVwiLCBzdG9yZS5pbml0Lm1vZHVsZXMsIG1vZHVsZU5hbWUpO1xuICAgICAgc3RvcmUgPSBzdG9yZS5pbml0Lm1vZHVsZXNbbW9kdWxlTmFtZV07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdG9yZSxcbiAgICAgIGtleVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzVW5mcm96ZW4oKSB7XG4gICAgaWYgKHRoaXMuaW5pdC5mcm96ZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNvbW1pdCBhIG11dGF0aW9uIHRvIGNoYW5nZSB0aGUgc3RhdGVcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgdW5mcm96ZSB0aGUgc3RhdGUgYW5kIHByb2Nlc3MgYSBtdXRhdGlvblxuICBwdWJsaWMgY29tbWl0KG11dGF0aW9uOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgeyBzdG9yZSwga2V5IH0gPSB0aGlzLmdldFN0b3JlKHRoaXMsIG11dGF0aW9uKTtcbiAgICB0aGlzLmtleUV4aXN0cyhcIm11dGF0aW9uXCIsIHN0b3JlLmluaXQubXV0YXRpb25zISwga2V5KTtcbiAgICBzdG9yZS5pbml0LmZyb3plbiA9IGZhbHNlO1xuICAgIHRoaXMudHJpZ2dlcihcImJlZm9yZWNvbW1pdFwiLCBtdXRhdGlvbiwgLi4uYXJncyk7XG4gICAgc3RvcmUuaW5pdC5tdXRhdGlvbnMhW2tleV0oc3RvcmUuc3RhdGUsIC4uLmFyZ3MpO1xuICAgIHRoaXMudHJpZ2dlcihcImNvbW1pdFwiLCBtdXRhdGlvbiwgLi4uYXJncyk7XG4gICAgc3RvcmUuaW5pdC5mcm96ZW4gPSB0cnVlO1xuXG4gICAgLy8gV2UgY2FsbCB0aGUgZGVib3VuY2VkIHVwZGF0ZSB0byBub3RpZnkgdGhlIGNoYW5nZXNcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIHdpbGwgZGlzcGF0Y2ggYW4gYWN0aW9uXG4gIHB1YmxpYyBhc3luYyBkaXNwYXRjaChhY3Rpb246IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgc3RvcmUsIGtleSB9ID0gdGhpcy5nZXRTdG9yZSh0aGlzLCBhY3Rpb24pO1xuICAgIHRoaXMua2V5RXhpc3RzKFwiYWN0aW9uXCIsIHN0b3JlLmluaXQuYWN0aW9ucyEsIGtleSk7XG4gICAgdGhpcy50cmlnZ2VyKFwiYmVmb3JlZGlzcGF0Y2hcIiwgYWN0aW9uLCAuLi5hcmdzKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmUuaW5pdC5hY3Rpb25zIVtrZXldKHN0b3JlLCAuLi5hcmdzKTtcbiAgICAgIHRoaXMudHJpZ2dlcihcImRpc3BhdGNoXCIsIGFjdGlvbiwgLi4uYXJncyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgYW4gZXZlbnRcbiAgcHVibGljIHRyaWdnZXIoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICB0aGlzLmluaXQubGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2sodGhpcywgLi4uYXJncykpO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2Qgd2lsbCBhZGQgYSBsaXN0ZW5lciB0byB0aGUgc3RvcmVcbiAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgIHRoaXMuaXNGdW5jdGlvbihcImxpc3RlbmVyXCIsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmtleUV4aXN0cyhcImV2ZW50XCIsIHRoaXMuaW5pdC5saXN0ZW5lcnMsIGV2ZW50KTtcbiAgICBpZiAodGhpcy5pbml0Lmxpc3RlbmVyc1tldmVudF0uaW5kZXhPZihsaXN0ZW5lcikgPT09IC0xKSB7XG4gICAgICB0aGlzLmluaXQubGlzdGVuZXJzW2V2ZW50XS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMudHJpZ2dlcihcImFkZGxpc3RlbmVyXCIsIGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB0aGlzLm9mZihldmVudCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSB0aGUgc3RvcmVcbiAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICB0aGlzLmlzRnVuY3Rpb24oXCJsaXN0ZW5lclwiLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5rZXlFeGlzdHMoXCJldmVudFwiLCB0aGlzLmluaXQubGlzdGVuZXJzLCBldmVudCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluaXQubGlzdGVuZXJzW2V2ZW50XS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pbml0Lmxpc3RlbmVyc1tldmVudF0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMudHJpZ2dlcihcInJlbW92ZWxpc3RlbmVyXCIsIGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBtZXRob2Qgd2lsbCBhZGQgYSBwbHVnaW4gdG8gdGhlIHN0b3JlXG4gIHB1YmxpYyB1c2UocGx1Z2luOiBGdW5jdGlvbiwgLi4ub3B0aW9uczogYW55W10pIHtcbiAgICB0aGlzLmlzRnVuY3Rpb24oXCJwbHVnaW5cIiwgcGx1Z2luKTtcbiAgICBpZiAodGhpcy5pbml0LnBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID09PSAtMSkge1xuICAgICAgcGx1Z2luKHRoaXMsIC4uLm9wdGlvbnMpO1xuICAgICAgdGhpcy5pbml0LnBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgdGhpcy50cmlnZ2VyKFwicGx1Z2luXCIsIHBsdWdpbiwgLi4ub3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBtZXRob2Qgd2lsbCByZWdpc3RlciBhIG1vZHVsZSB0byB0aGUgc3RvcmVcbiAgcHVibGljIHJlZ2lzdGVyTW9kdWxlKG5hbWVzcGFjZTogc3RyaW5nLCBtb2R1bGU6IFN0b3JlT3B0aW9ucykge1xuICAgIGNvbnN0IHJvb3RTdG9yZSA9IHRoaXM7XG4gICAgaWYgKHJvb3RTdG9yZS5pbml0Lm1vZHVsZXNbbmFtZXNwYWNlXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIG1vZHVsZSB3aXRoIHRoZSBuYW1lc3BhY2UgXCIke25hbWVzcGFjZX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1N0b3JlID0gbmV3IEZsdXhTdG9yZSh7IC4uLm1vZHVsZSwgcm9vdFN0b3JlLCBuYW1lc3BhY2UgfSk7XG4gICAgcm9vdFN0b3JlLmluaXQuZnJvemVuID0gZmFsc2U7XG4gICAgcm9vdFN0b3JlLmluaXQubW9kdWxlc1tuYW1lc3BhY2VdID0gbmV3U3RvcmU7XG4gICAgcm9vdFN0b3JlLnN0YXRlW25hbWVzcGFjZV0gPSBuZXdTdG9yZS5zdGF0ZTtcbiAgICByb290U3RvcmUuaW5pdC5mcm96ZW4gPSB0cnVlO1xuICAgIHJvb3RTdG9yZS50cmlnZ2VyKFwicmVnaXN0ZXJNb2R1bGVcIiwgbmFtZXNwYWNlLCBtb2R1bGUsIG5ld1N0b3JlKTtcblxuICAgIC8vIFdlIGNhbGwgdGhlIGRlYm91bmNlZCB1cGRhdGUgdG8gbm90aWZ5IHRoZSBjaGFuZ2VzXG4gICAgZGVib3VuY2VkVXBkYXRlKCk7XG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCB3aWxsIHVucmVnaXN0ZXIgYSBtb2R1bGUgZnJvbSB0aGUgc3RvcmVcbiAgcHVibGljIHVucmVnaXN0ZXJNb2R1bGUobmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb290U3RvcmUgPSB0aGlzO1xuICAgIGNvbnN0IHN0b3JlID0gcm9vdFN0b3JlLmluaXQubW9kdWxlc1tuYW1lc3BhY2VdO1xuICAgIGlmIChzdG9yZSkge1xuICAgICAgc3RvcmUuaW5pdC5jaGlsZE1vZHVsZU5hbWVzcGFjZXMuZm9yRWFjaCgobikgPT4gcm9vdFN0b3JlLnVucmVnaXN0ZXJNb2R1bGUoYCR7bmFtZXNwYWNlfS4ke259YCkpO1xuICAgICAgcm9vdFN0b3JlLmluaXQuZnJvemVuID0gZmFsc2U7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHJvb3RTdG9yZS5pbml0Lm1vZHVsZXMsIG5hbWVzcGFjZSk7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHJvb3RTdG9yZS5zdGF0ZSwgbmFtZXNwYWNlKTtcbiAgICAgIHJvb3RTdG9yZS5pbml0LmZyb3plbiA9IHRydWU7XG4gICAgICByb290U3RvcmUudHJpZ2dlcihcInVucmVnaXN0ZXJNb2R1bGVcIiwgbmFtZXNwYWNlLCBzdG9yZSk7XG5cbiAgICAgIC8vIFdlIGNhbGwgdGhlIGRlYm91bmNlZCB1cGRhdGUgdG8gbm90aWZ5IHRoZSBjaGFuZ2VzXG4gICAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsVUFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBSCxFLDBNQUFBSSxFQUFnQ0MsUUFBQSxlQUNoQ0MsRUFBOENELFFBQUEscUJBcUJqQ0gsRUFBTixNQUFNSyxFQUNKQyxNQUNBQyxRQUNDQyxLQVlEQyxVQUNBQyxVQUdQLFdBQUFDLEVBQVlMLE1BQ1ZBLEVBQVEsQ0FBQyxFQUFBTSxVQUNUQSxFQUFZLENBQUMsRUFBQUMsUUFDYkEsRUFBVSxDQUFDLEVBQUFOLFFBQ1hBLEVBQVUsQ0FBQyxFQUFBTyxRQUNYQSxFQUFVLENBQUMsRUFBQUMsYUFDWEEsR0FBZSxFQUFBTCxVQUNmQSxFQUFBRCxVQUNBQSxHQUNnQixDQUFDLEdBRWpCLE1BQU1PLEVBQThCLG1CQUFWVixFQUF1QkEsSUFBVUEsRUFHM0RXLEtBQUtYLE1BQVEsSUFBSVksTUFBTUYsR0FBYyxDQUFDLEVBQUcsQ0FHdkNHLElBQUssQ0FBQ2IsRUFBT2MsS0FDWCxJQUFLSCxLQUFLUixXQUFhUSxNQUFNVCxLQUFLTSxRQUFRTSxHQUN4QyxPQUFPZCxFQUFNYyxHQUVmLEdBQUlMLEVBQWMsQ0FFaEIsR0FBSUUsS0FBS1QsS0FBS2EsT0FDWixTQUFPakIsRUFBQWtCLFlBQVdoQixFQUFNYyxJQUsxQixNQUFNRyxHQUFBLEVBQVduQixFQUFBb0IsbUJBQWtCbEIsR0FDbkMsVUFBV21CLEtBQU9DLFFBQVFDLFFBQVFKLEdBQ2hDUCxFQUFXUyxHQUFPRixFQUFTRSxFQUUvQixDQUNBLE9BQU9uQixFQUFNYyxFQUFJLEVBSW5CUSxJQUFLLENBQUN0QixFQUFPYyxFQUFjUyxL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
@@ -0,0 +1,237 @@
1
+ // lib/flux-store/index.ts
2
+ import { debouncedUpdate } from "valyrian.js";
3
+ import { deepCloneUnfreeze, deepFreeze } from "valyrian.js/utils";
4
+ var FluxStore = class _FluxStore {
5
+ state;
6
+ getters;
7
+ init;
8
+ // eslint-disable-next-line no-use-before-define
9
+ rootStore;
10
+ namespace;
11
+ // eslint-disable-next-line sonarjs/cognitive-complexity
12
+ constructor({
13
+ state = {},
14
+ mutations = {},
15
+ actions = {},
16
+ getters = {},
17
+ modules = {},
18
+ shouldFreeze = true,
19
+ namespace,
20
+ rootStore
21
+ } = {}) {
22
+ const localState = typeof state === "function" ? state() : state;
23
+ this.state = new Proxy(localState || {}, {
24
+ // Every time we try to access a property from the state we try to deep freeze the property
25
+ // to prevent direct modifications to the state
26
+ get: (state2, prop) => {
27
+ if ((this.rootStore || this).init.modules[prop]) {
28
+ return state2[prop];
29
+ }
30
+ if (shouldFreeze) {
31
+ if (this.init.frozen) {
32
+ return deepFreeze(state2[prop]);
33
+ }
34
+ const newState = deepCloneUnfreeze(state2);
35
+ for (const key of Reflect.ownKeys(newState)) {
36
+ localState[key] = newState[key];
37
+ }
38
+ }
39
+ return state2[prop];
40
+ },
41
+ // If the user tries to set directly it will throw an error, only if we have unfrozen the state via commit
42
+ // this will proceed to set the value
43
+ set: (state2, prop, value) => {
44
+ this.isUnfrozen();
45
+ const old = state2[prop];
46
+ state2[prop] = value;
47
+ if (this.namespace) {
48
+ prop = `${this.namespace}.${prop}`;
49
+ }
50
+ (this.rootStore || this).trigger("set", prop, value, old);
51
+ return true;
52
+ },
53
+ // If the user tries to delete directly it will throw an error, only if we have unfrozen the state via commit
54
+ // this will proceed to delete the property
55
+ deleteProperty: (state2, prop) => {
56
+ this.isUnfrozen();
57
+ const old = state2[prop];
58
+ Reflect.deleteProperty(state2, prop);
59
+ if (this.namespace) {
60
+ prop = `${this.namespace}.${prop}`;
61
+ }
62
+ (this.rootStore || this).trigger("delete", prop, old);
63
+ return true;
64
+ }
65
+ });
66
+ this.rootStore = rootStore || null;
67
+ this.namespace = namespace || null;
68
+ this.init = {
69
+ frozen: true,
70
+ plugins: [],
71
+ modules: {},
72
+ childModuleNamespaces: Object.keys(modules || {}),
73
+ listeners: {
74
+ set: [],
75
+ delete: [],
76
+ beforecommit: [],
77
+ commit: [],
78
+ beforedispatch: [],
79
+ dispatch: [],
80
+ getter: [],
81
+ addlistener: [],
82
+ removelistener: [],
83
+ plugin: [],
84
+ registerModule: [],
85
+ unregisterModule: []
86
+ },
87
+ getters: getters || {},
88
+ mutations: mutations || {},
89
+ actions: actions || {}
90
+ };
91
+ this.getters = new Proxy(getters || {}, {
92
+ // When we try to get a property of the getter we will call the original
93
+ // getter method passing the state as first argument and the other getters as second
94
+ // if we try to get a non existent getter it will fail silently as if
95
+ // we were trying to get an undefined property
96
+ get: (getters2, getter) => {
97
+ try {
98
+ const { store, key } = this.getStore(this, getter);
99
+ if (store instanceof _FluxStore && store.init.getters[key]) {
100
+ const value = store.init.getters[key](store.state, store.getters, this.state, this.getters);
101
+ if (this.namespace) {
102
+ getter = `${this.namespace}.${getter}`;
103
+ }
104
+ (this.rootStore || this).trigger("getter", getter, value);
105
+ return value;
106
+ }
107
+ } catch (error) {
108
+ return;
109
+ }
110
+ }
111
+ });
112
+ if (modules) {
113
+ Object.keys(modules).forEach((namespace2) => {
114
+ const n = this.namespace ? `${this.namespace}.${namespace2}` : namespace2;
115
+ (this.rootStore || this).registerModule(n, modules[namespace2]);
116
+ });
117
+ }
118
+ }
119
+ keyExists(objectname, object, key) {
120
+ if (!object[key]) {
121
+ throw new Error(`The ${objectname} "${key}" does not exists.`);
122
+ }
123
+ }
124
+ isFunction(type, callback) {
125
+ if (typeof callback !== "function") {
126
+ throw new Error(`You need to provide a valid function as ${type}.`);
127
+ }
128
+ }
129
+ // Giving a dot based namespace this method will be used to find the module to be called
130
+ getStore(store, namespace) {
131
+ let key = namespace;
132
+ if (key.indexOf(".") > -1) {
133
+ const parts = key.split(".");
134
+ key = parts.pop();
135
+ const moduleName = parts.join(".");
136
+ this.keyExists("module", store.init.modules, moduleName);
137
+ store = store.init.modules[moduleName];
138
+ }
139
+ return {
140
+ store,
141
+ key
142
+ };
143
+ }
144
+ isUnfrozen() {
145
+ if (this.init.frozen) {
146
+ throw new Error("You need to commit a mutation to change the state");
147
+ }
148
+ }
149
+ // This method unfroze the state and process a mutation
150
+ commit(mutation, ...args) {
151
+ const { store, key } = this.getStore(this, mutation);
152
+ this.keyExists("mutation", store.init.mutations, key);
153
+ store.init.frozen = false;
154
+ this.trigger("beforecommit", mutation, ...args);
155
+ store.init.mutations[key](store.state, ...args);
156
+ this.trigger("commit", mutation, ...args);
157
+ store.init.frozen = true;
158
+ debouncedUpdate();
159
+ }
160
+ // This method will dispatch an action
161
+ async dispatch(action, ...args) {
162
+ const { store, key } = this.getStore(this, action);
163
+ this.keyExists("action", store.init.actions, key);
164
+ this.trigger("beforedispatch", action, ...args);
165
+ try {
166
+ const result = await store.init.actions[key](store, ...args);
167
+ this.trigger("dispatch", action, ...args);
168
+ return result;
169
+ } finally {
170
+ debouncedUpdate();
171
+ }
172
+ }
173
+ // This method will trigger an event
174
+ trigger(event, ...args) {
175
+ this.init.listeners[event].forEach((callback) => callback(this, ...args));
176
+ }
177
+ // This method will add a listener to the store
178
+ on(event, listener) {
179
+ this.isFunction("listener", listener);
180
+ this.keyExists("event", this.init.listeners, event);
181
+ if (this.init.listeners[event].indexOf(listener) === -1) {
182
+ this.init.listeners[event].push(listener);
183
+ this.trigger("addlistener", event, listener);
184
+ }
185
+ return () => this.off(event, listener);
186
+ }
187
+ // Remove a listener from the store
188
+ off(event, listener) {
189
+ this.isFunction("listener", listener);
190
+ this.keyExists("event", this.init.listeners, event);
191
+ const index = this.init.listeners[event].indexOf(listener);
192
+ if (index > -1) {
193
+ this.init.listeners[event].splice(index, 1);
194
+ this.trigger("removelistener", event, listener);
195
+ }
196
+ }
197
+ // This method will add a plugin to the store
198
+ use(plugin, ...options) {
199
+ this.isFunction("plugin", plugin);
200
+ if (this.init.plugins.indexOf(plugin) === -1) {
201
+ plugin(this, ...options);
202
+ this.init.plugins.push(plugin);
203
+ this.trigger("plugin", plugin, ...options);
204
+ }
205
+ }
206
+ // This method will register a module to the store
207
+ registerModule(namespace, module) {
208
+ const rootStore = this;
209
+ if (rootStore.init.modules[namespace]) {
210
+ throw new Error(`A module with the namespace "${namespace}" is already registered.`);
211
+ }
212
+ const newStore = new _FluxStore({ ...module, rootStore, namespace });
213
+ rootStore.init.frozen = false;
214
+ rootStore.init.modules[namespace] = newStore;
215
+ rootStore.state[namespace] = newStore.state;
216
+ rootStore.init.frozen = true;
217
+ rootStore.trigger("registerModule", namespace, module, newStore);
218
+ debouncedUpdate();
219
+ }
220
+ // This method will unregister a module from the store
221
+ unregisterModule(namespace) {
222
+ const rootStore = this;
223
+ const store = rootStore.init.modules[namespace];
224
+ if (store) {
225
+ store.init.childModuleNamespaces.forEach((n) => rootStore.unregisterModule(`${namespace}.${n}`));
226
+ rootStore.init.frozen = false;
227
+ Reflect.deleteProperty(rootStore.init.modules, namespace);
228
+ Reflect.deleteProperty(rootStore.state, namespace);
229
+ rootStore.init.frozen = true;
230
+ rootStore.trigger("unregisterModule", namespace, store);
231
+ debouncedUpdate();
232
+ }
233
+ }
234
+ };
235
+ export {
236
+ FluxStore
237
+ };