yummies 7.11.0 → 7.13.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 (159) hide show
  1. package/README.md +5 -87
  2. package/async.cjs +179 -48
  3. package/async.cjs.map +1 -1
  4. package/async.d.ts +125 -7
  5. package/async.js +180 -54
  6. package/async.js.map +1 -1
  7. package/chunk-CVq3Gv4J.cjs +50 -0
  8. package/chunk-YKewjYmz.js +37 -0
  9. package/common.cjs +48 -8
  10. package/common.cjs.map +1 -1
  11. package/common.d.ts +53 -2
  12. package/common.js +49 -11
  13. package/common.js.map +1 -1
  14. package/complex.cjs +275 -128
  15. package/complex.cjs.map +1 -1
  16. package/complex.d.ts +66 -0
  17. package/complex.js +275 -133
  18. package/complex.js.map +1 -1
  19. package/cookie.cjs +17 -7
  20. package/cookie.cjs.map +1 -1
  21. package/cookie.d.ts +26 -0
  22. package/cookie.js +18 -9
  23. package/cookie.js.map +1 -1
  24. package/css.cjs +163 -39
  25. package/css.cjs.map +1 -1
  26. package/css.d.ts +115 -6
  27. package/css.js +159 -41
  28. package/css.js.map +1 -1
  29. package/data.cjs +90 -55
  30. package/data.cjs.map +1 -1
  31. package/data.d.ts +50 -0
  32. package/data.js +91 -61
  33. package/data.js.map +1 -1
  34. package/date-time.cjs +594 -412
  35. package/date-time.cjs.map +1 -1
  36. package/date-time.d.ts +105 -0
  37. package/date-time.js +591 -421
  38. package/date-time.js.map +1 -1
  39. package/device.cjs +65 -23
  40. package/device.cjs.map +1 -1
  41. package/device.d.ts +49 -0
  42. package/device.js +66 -31
  43. package/device.js.map +1 -1
  44. package/encodings.cjs +275 -266
  45. package/encodings.cjs.map +1 -1
  46. package/encodings.d.ts +25 -0
  47. package/encodings.js +276 -268
  48. package/encodings.js.map +1 -1
  49. package/errors.cjs +36 -18
  50. package/errors.cjs.map +1 -1
  51. package/errors.d.ts +17 -0
  52. package/errors.js +35 -19
  53. package/errors.js.map +1 -1
  54. package/file.cjs +58 -24
  55. package/file.cjs.map +1 -1
  56. package/file.d.ts +32 -0
  57. package/file.js +59 -27
  58. package/file.js.map +1 -1
  59. package/format.cjs +125 -83
  60. package/format.cjs.map +1 -1
  61. package/format.d.ts +18 -0
  62. package/format.js +118 -82
  63. package/format.js.map +1 -1
  64. package/html.cjs +242 -137
  65. package/html.cjs.map +1 -1
  66. package/html.d.ts +81 -0
  67. package/html.js +239 -150
  68. package/html.js.map +1 -1
  69. package/id.cjs +90 -17
  70. package/id.cjs.map +1 -1
  71. package/id.d.ts +16 -0
  72. package/id.js +89 -24
  73. package/id.js.map +1 -1
  74. package/imports.cjs +57 -29
  75. package/imports.cjs.map +1 -1
  76. package/imports.d.ts +24 -0
  77. package/imports.js +56 -31
  78. package/imports.js.map +1 -1
  79. package/math.cjs +32 -6
  80. package/math.cjs.map +1 -1
  81. package/math.d.ts +33 -0
  82. package/math.js +33 -10
  83. package/math.js.map +1 -1
  84. package/media.cjs +291 -84
  85. package/media.cjs.map +1 -1
  86. package/media.d.ts +204 -2
  87. package/media.js +290 -93
  88. package/media.js.map +1 -1
  89. package/mobx.cjs +449 -193
  90. package/mobx.cjs.map +1 -1
  91. package/mobx.d.ts +108 -0
  92. package/mobx.js +447 -200
  93. package/mobx.js.map +1 -1
  94. package/ms.cjs +37 -10
  95. package/ms.cjs.map +1 -1
  96. package/ms.d.ts +16 -0
  97. package/ms.js +38 -13
  98. package/ms.js.map +1 -1
  99. package/number.cjs +29 -7
  100. package/number.cjs.map +1 -1
  101. package/number.d.ts +16 -0
  102. package/number.js +30 -9
  103. package/number.js.map +1 -1
  104. package/package.json +11 -3
  105. package/parser.cjs +117 -64
  106. package/parser.cjs.map +1 -1
  107. package/parser.d.ts +17 -0
  108. package/parser.js +111 -64
  109. package/parser.js.map +1 -1
  110. package/price.cjs +24 -18
  111. package/price.cjs.map +1 -1
  112. package/price.d.ts +24 -0
  113. package/price.js +25 -20
  114. package/price.js.map +1 -1
  115. package/random.cjs +95 -13
  116. package/random.cjs.map +1 -1
  117. package/random.d.ts +80 -0
  118. package/random.js +96 -22
  119. package/random.js.map +1 -1
  120. package/react.cjs +673 -214
  121. package/react.cjs.map +1 -1
  122. package/react.d.ts +21 -0
  123. package/react.js +674 -239
  124. package/react.js.map +1 -1
  125. package/sound.cjs +30 -9
  126. package/sound.cjs.map +1 -1
  127. package/sound.d.ts +16 -0
  128. package/sound.js +31 -11
  129. package/sound.js.map +1 -1
  130. package/storage.cjs +49 -50
  131. package/storage.cjs.map +1 -1
  132. package/storage.d.ts +24 -0
  133. package/storage.js +50 -53
  134. package/storage.js.map +1 -1
  135. package/text.cjs +67 -34
  136. package/text.cjs.map +1 -1
  137. package/text.d.ts +16 -0
  138. package/text.js +68 -37
  139. package/text.js.map +1 -1
  140. package/type-guard.cjs +292 -72
  141. package/type-guard.cjs.map +1 -1
  142. package/type-guard.d.ts +18 -0
  143. package/type-guard.js +288 -73
  144. package/type-guard.js.map +1 -1
  145. package/types.cjs +0 -2
  146. package/types.d.ts +41 -0
  147. package/types.global.cjs +0 -2
  148. package/types.global.d.ts +41 -0
  149. package/types.global.js +0 -2
  150. package/types.js +0 -2
  151. package/vibrate.cjs +47 -6
  152. package/vibrate.cjs.map +1 -1
  153. package/vibrate.d.ts +39 -1
  154. package/vibrate.js +48 -8
  155. package/vibrate.js.map +1 -1
  156. package/types.cjs.map +0 -1
  157. package/types.global.cjs.map +0 -1
  158. package/types.global.js.map +0 -1
  159. package/types.js.map +0 -1
package/complex.js CHANGED
@@ -1,139 +1,281 @@
1
- const createCounter = (processValue, initial = 0) => {
2
- const update = (counter) => {
3
- fn.value = processValue?.(counter) ?? counter;
4
- return fn.value;
5
- };
6
- const increment = () => update(++fn.counter);
7
- const decrement = () => update(--fn.counter);
8
- const fn = increment;
9
- fn.increment = increment;
10
- fn.decrement = decrement;
11
- fn.reset = () => {
12
- fn.counter = initial;
13
- fn.value = processValue?.(initial) ?? initial;
14
- };
15
- fn.reset();
16
- return fn;
1
+ //#region src/complex/counter.ts
2
+ /**
3
+ * Creates a callable counter object with increment, decrement and reset helpers.
4
+ *
5
+ * The returned function increments the internal numeric counter when called and
6
+ * exposes both the raw counter value and an optionally transformed `value`.
7
+ *
8
+ * @template TValue Public value type returned by the counter.
9
+ * @param processValue Optional mapper that transforms the numeric counter value.
10
+ * @param initial Initial numeric counter value.
11
+ * @returns Callable counter with state and control methods.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const counter = createCounter();
16
+ * counter.increment(); // 1
17
+ * ```
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const idCounter = createCounter((value) => `id-${value}`, 10);
22
+ * idCounter(); // 'id-11'
23
+ * ```
24
+ */
25
+ var createCounter = (processValue, initial = 0) => {
26
+ const update = (counter) => {
27
+ fn.value = processValue?.(counter) ?? counter;
28
+ return fn.value;
29
+ };
30
+ const increment = () => update(++fn.counter);
31
+ const decrement = () => update(--fn.counter);
32
+ const fn = increment;
33
+ fn.increment = increment;
34
+ fn.decrement = decrement;
35
+ fn.reset = () => {
36
+ fn.counter = initial;
37
+ fn.value = processValue?.(initial) ?? initial;
38
+ };
39
+ fn.reset();
40
+ return fn;
17
41
  };
18
- const createGlobalPoint = (accessSymbol) => {
19
- if (accessSymbol == null) {
20
- let storedValue;
21
- return {
22
- get: () => storedValue,
23
- unset: () => {
24
- storedValue = void 0;
25
- },
26
- set: (value) => {
27
- storedValue = value;
28
- return value;
29
- }
30
- };
31
- }
32
- const _globalThis = globalThis;
33
- return {
34
- get: () => _globalThis[accessSymbol],
35
- unset: () => {
36
- delete _globalThis[accessSymbol];
37
- },
38
- set: (value) => {
39
- _globalThis[accessSymbol] = value;
40
- return value;
41
- }
42
- };
42
+ //#endregion
43
+ //#region src/complex/global-point.ts
44
+ /**
45
+ * Creates a simple storage point that can live either in `globalThis` under a
46
+ * provided key or in a local closure when no key is given.
47
+ *
48
+ * @template TValue Stored value type.
49
+ * @param accessSymbol Optional global property name used for storage.
50
+ * @returns Getter/setter API for the stored value.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const point = createGlobalPoint<number>();
55
+ * point.set(10);
56
+ * ```
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const point = createGlobalPoint<string>('__token__');
61
+ * point.get();
62
+ * ```
63
+ */
64
+ var createGlobalPoint = (accessSymbol) => {
65
+ if (accessSymbol == null) {
66
+ let storedValue;
67
+ return {
68
+ get: () => storedValue,
69
+ unset: () => {
70
+ storedValue = void 0;
71
+ },
72
+ set: (value) => {
73
+ storedValue = value;
74
+ return value;
75
+ }
76
+ };
77
+ }
78
+ const _globalThis = globalThis;
79
+ return {
80
+ get: () => _globalThis[accessSymbol],
81
+ unset: () => {
82
+ delete _globalThis[accessSymbol];
83
+ },
84
+ set: (value) => {
85
+ _globalThis[accessSymbol] = value;
86
+ return value;
87
+ }
88
+ };
43
89
  };
44
- const createGlobalConfig = (defaultValue, accessSymbol) => {
45
- const globalPoint = createGlobalPoint(accessSymbol);
46
- return globalPoint.get() || globalPoint.set(defaultValue);
90
+ //#endregion
91
+ //#region src/complex/global-config.ts
92
+ /**
93
+ * Creates or reuses a globally accessible config object.
94
+ *
95
+ * The config is stored in a global point identified by `accessSymbol`, or in a
96
+ * local closure when no symbol is provided.
97
+ *
98
+ * @template T Config object type.
99
+ * @param defaultValue Default value used when no config has been created yet.
100
+ * @param accessSymbol Optional global key used to store the config.
101
+ * @returns Existing or newly initialized global config object.
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * const config = createGlobalConfig({ locale: 'en' }, '__app_config__');
106
+ * ```
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * const config = createGlobalConfig({ debug: false });
111
+ * config.debug;
112
+ * ```
113
+ */
114
+ var createGlobalConfig = (defaultValue, accessSymbol) => {
115
+ const globalPoint = createGlobalPoint(accessSymbol);
116
+ return globalPoint.get() || globalPoint.set(defaultValue);
47
117
  };
48
- const createGlobalDynamicConfig = (processFn, accessSymbol) => {
49
- const globalPoint = createGlobalPoint(accessSymbol);
50
- const getValue = () => {
51
- return globalPoint.get() ?? globalPoint.set(processFn(null, null));
52
- };
53
- return {
54
- get: getValue,
55
- set: globalPoint.set,
56
- unset: globalPoint.unset,
57
- update: (value) => {
58
- const currentValue = getValue();
59
- Object.assign(currentValue, processFn(value, currentValue));
60
- }
61
- };
118
+ /**
119
+ * Creates a mutable global config manager whose value is produced and updated
120
+ * through a custom processor function.
121
+ *
122
+ * @template T Config object type.
123
+ * @param processFn Function that builds the next config state from a partial change and current value.
124
+ * @param accessSymbol Optional global key used to store the config.
125
+ * @returns API for reading, replacing, resetting and partially updating the config.
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * const config = createGlobalDynamicConfig(
130
+ * (change, current) => ({ theme: 'light', ...current, ...change }),
131
+ * '__theme__',
132
+ * );
133
+ * ```
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * const config = createGlobalDynamicConfig((change, current) => ({ ...current, ...change }));
138
+ * config.update({ locale: 'ru' });
139
+ * ```
140
+ */
141
+ var createGlobalDynamicConfig = (processFn, accessSymbol) => {
142
+ const globalPoint = createGlobalPoint(accessSymbol);
143
+ const getValue = () => {
144
+ return globalPoint.get() ?? globalPoint.set(processFn(null, null));
145
+ };
146
+ return {
147
+ get: getValue,
148
+ set: globalPoint.set,
149
+ unset: globalPoint.unset,
150
+ update: (value) => {
151
+ const currentValue = getValue();
152
+ Object.assign(currentValue, processFn(value, currentValue));
153
+ }
154
+ };
62
155
  };
63
- class ModulesFactory {
64
- /**
65
- * Creates a new module factory.
66
- *
67
- * @param config Factory strategy and predefined dependencies.
68
- *
69
- * @example
70
- * ```ts
71
- * const factory = new ModulesFactory({
72
- * factory: (Module, deps) => new Module(deps),
73
- * });
74
- * ```
75
- *
76
- * @example
77
- * ```ts
78
- * const factory = new ModulesFactory({
79
- * factory: (Module, deps) => new Module(deps),
80
- * deps: { api },
81
- * });
82
- * ```
83
- */
84
- constructor(config) {
85
- this.config = config;
86
- }
87
- /**
88
- * Creates an instance of the provided class by merging predefined and
89
- * per-call dependencies.
90
- *
91
- * @template TInstance Instance type produced by the constructor.
92
- * @template TDeps Full dependency object expected by the constructor.
93
- * @param Constructor Class constructor receiving a single dependency object.
94
- * @param args Additional dependencies merged over predefined ones.
95
- * @returns Created class instance.
96
- *
97
- * @example
98
- * ```ts
99
- * const service = factory.create(UserService, { logger });
100
- * ```
101
- *
102
- * @example
103
- * ```ts
104
- * const store = factory.create(UserStore);
105
- * ```
106
- */
107
- create(Constructor, ...args) {
108
- return this.config.factory(Constructor, {
109
- ...this.config.deps,
110
- ...args[0]
111
- });
112
- }
113
- }
114
- const createPubSub = () => {
115
- const pubSub = ((...args) => {
116
- pubSub.lastPub = args;
117
- pubSub.subs.forEach((sub) => {
118
- sub(...args);
119
- });
120
- });
121
- pubSub.lastPub = void 0;
122
- pubSub.subs = [];
123
- pubSub.unsub = (sub) => {
124
- pubSub.subs = pubSub.subs.filter((it) => it !== sub);
125
- };
126
- pubSub.sub = (sub) => {
127
- pubSub.subs.push(sub);
128
- return () => pubSub.unsub(sub);
129
- };
130
- return pubSub;
156
+ //#endregion
157
+ //#region src/complex/modules-factory.ts
158
+ /**
159
+ * Universal factory for creating class instances with predefined and per-call
160
+ * dependencies.
161
+ *
162
+ * Works with classes whose constructor accepts a single dependency object.
163
+ *
164
+ * @template TPredefinedDeps Dependency shape that is always injected by the factory.
165
+ *
166
+ * @example
167
+ * ```
168
+ * const factory = new ModulesFactory({
169
+ * factory: (MyClass, deps) => new MyClass(deps),
170
+ * deps: { someDependency: new Dependency() }
171
+ * });
172
+ *
173
+ * const instance = factory.create(MyClass, { extraDependency: new ExtraDependency() });
174
+ * ```
175
+ *
176
+ * @example
177
+ * ```ts
178
+ * const factory = new ModulesFactory({
179
+ * factory: (Module, deps) => new Module(deps),
180
+ * });
181
+ * ```
182
+ *
183
+ * @example
184
+ * ```ts
185
+ * const service = factory.create(UserService, { api });
186
+ * ```
187
+ */
188
+ var ModulesFactory = class {
189
+ /**
190
+ * Creates a new module factory.
191
+ *
192
+ * @param config Factory strategy and predefined dependencies.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * const factory = new ModulesFactory({
197
+ * factory: (Module, deps) => new Module(deps),
198
+ * });
199
+ * ```
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * const factory = new ModulesFactory({
204
+ * factory: (Module, deps) => new Module(deps),
205
+ * deps: { api },
206
+ * });
207
+ * ```
208
+ */
209
+ constructor(config) {
210
+ this.config = config;
211
+ }
212
+ /**
213
+ * Creates an instance of the provided class by merging predefined and
214
+ * per-call dependencies.
215
+ *
216
+ * @template TInstance Instance type produced by the constructor.
217
+ * @template TDeps Full dependency object expected by the constructor.
218
+ * @param Constructor Class constructor receiving a single dependency object.
219
+ * @param args Additional dependencies merged over predefined ones.
220
+ * @returns Created class instance.
221
+ *
222
+ * @example
223
+ * ```ts
224
+ * const service = factory.create(UserService, { logger });
225
+ * ```
226
+ *
227
+ * @example
228
+ * ```ts
229
+ * const store = factory.create(UserStore);
230
+ * ```
231
+ */
232
+ create(Constructor, ...args) {
233
+ return this.config.factory(Constructor, {
234
+ ...this.config.deps,
235
+ ...args[0]
236
+ });
237
+ }
131
238
  };
132
- export {
133
- ModulesFactory,
134
- createCounter,
135
- createGlobalConfig,
136
- createGlobalDynamicConfig,
137
- createPubSub
239
+ //#endregion
240
+ //#region src/complex/pub-sub.ts
241
+ /**
242
+ * Creates a simple publish-subscribe dispatcher that stores the last published
243
+ * arguments and allows subscription management.
244
+ *
245
+ * @template PubArgs Argument tuple delivered to subscribers.
246
+ * @returns Callable publisher with subscribe and unsubscribe helpers.
247
+ *
248
+ * @example
249
+ * ```ts
250
+ * const pub = createPubSub<[string]>();
251
+ * pub('ready');
252
+ * ```
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const pub = createPubSub<[number]>();
257
+ * const unsub = pub.sub((value) => console.log(value));
258
+ * ```
259
+ */
260
+ var createPubSub = () => {
261
+ const pubSub = ((...args) => {
262
+ pubSub.lastPub = args;
263
+ pubSub.subs.forEach((sub) => {
264
+ sub(...args);
265
+ });
266
+ });
267
+ pubSub.lastPub = void 0;
268
+ pubSub.subs = [];
269
+ pubSub.unsub = (sub) => {
270
+ pubSub.subs = pubSub.subs.filter((it) => it !== sub);
271
+ };
272
+ pubSub.sub = (sub) => {
273
+ pubSub.subs.push(sub);
274
+ return () => pubSub.unsub(sub);
275
+ };
276
+ return pubSub;
138
277
  };
139
- //# sourceMappingURL=complex.js.map
278
+ //#endregion
279
+ export { ModulesFactory, createCounter, createGlobalConfig, createGlobalDynamicConfig, createPubSub };
280
+
281
+ //# sourceMappingURL=complex.js.map
package/complex.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"complex.js","sources":["../src/complex/counter.ts","../src/complex/global-point.ts","../src/complex/global-config.ts","../src/complex/modules-factory.ts","../src/complex/pub-sub.ts"],"sourcesContent":["export interface Counter<TValue = number> {\n (): TValue;\n counter: number;\n value: TValue;\n increment(): TValue;\n decrement(): TValue;\n reset(): void;\n}\n\n/**\n * @deprecated use {`Counter`}. Will be removed in next major release\n */\nexport interface CounterFn<TValue = number> extends Counter<TValue> {}\n\n/**\n * Creates a callable counter object with increment, decrement and reset helpers.\n *\n * The returned function increments the internal numeric counter when called and\n * exposes both the raw counter value and an optionally transformed `value`.\n *\n * @template TValue Public value type returned by the counter.\n * @param processValue Optional mapper that transforms the numeric counter value.\n * @param initial Initial numeric counter value.\n * @returns Callable counter with state and control methods.\n *\n * @example\n * ```ts\n * const counter = createCounter();\n * counter.increment(); // 1\n * ```\n *\n * @example\n * ```ts\n * const idCounter = createCounter((value) => `id-${value}`, 10);\n * idCounter(); // 'id-11'\n * ```\n */\nexport const createCounter = <TValue = number>(\n processValue?: (value: number) => TValue,\n initial: number = 0,\n): Counter<TValue> => {\n const update = (counter: number) => {\n fn.value = processValue?.(counter) ?? (counter as TValue);\n return fn.value;\n };\n\n const increment = () => update(++fn.counter);\n const decrement = () => update(--fn.counter);\n\n const fn: Counter<TValue> = increment as any;\n\n fn.increment = increment;\n fn.decrement = decrement;\n\n fn.reset = () => {\n fn.counter = initial;\n fn.value = processValue?.(initial) ?? (initial as TValue);\n };\n\n fn.reset();\n\n return fn as Counter<TValue>;\n};\n","import type { AnyObject } from 'yummies/types';\n\nexport interface GlobalPoint<TValue> {\n get(): TValue;\n set(value: TValue): TValue;\n unset(): void;\n}\n\n/**\n * Creates a simple storage point that can live either in `globalThis` under a\n * provided key or in a local closure when no key is given.\n *\n * @template TValue Stored value type.\n * @param accessSymbol Optional global property name used for storage.\n * @returns Getter/setter API for the stored value.\n *\n * @example\n * ```ts\n * const point = createGlobalPoint<number>();\n * point.set(10);\n * ```\n *\n * @example\n * ```ts\n * const point = createGlobalPoint<string>('__token__');\n * point.get();\n * ```\n */\nexport const createGlobalPoint = <TValue>(\n accessSymbol?: keyof any,\n): GlobalPoint<TValue> => {\n if (accessSymbol == null) {\n let storedValue: TValue | undefined;\n\n return {\n get: (): TValue => storedValue!,\n unset: () => {\n storedValue = undefined;\n },\n set: (value: TValue): TValue => {\n storedValue = value;\n return value;\n },\n };\n }\n\n const _globalThis = globalThis as AnyObject;\n\n return {\n get: (): TValue => _globalThis[accessSymbol],\n unset: () => {\n delete _globalThis[accessSymbol];\n },\n set: (value: TValue): TValue => {\n _globalThis[accessSymbol] = value;\n return value;\n },\n };\n};\n","import type { AnyObject, Maybe } from 'yummies/types';\nimport { createGlobalPoint } from './global-point.js';\n\n/**\n * Creates or reuses a globally accessible config object.\n *\n * The config is stored in a global point identified by `accessSymbol`, or in a\n * local closure when no symbol is provided.\n *\n * @template T Config object type.\n * @param defaultValue Default value used when no config has been created yet.\n * @param accessSymbol Optional global key used to store the config.\n * @returns Existing or newly initialized global config object.\n *\n * @example\n * ```ts\n * const config = createGlobalConfig({ locale: 'en' }, '__app_config__');\n * ```\n *\n * @example\n * ```ts\n * const config = createGlobalConfig({ debug: false });\n * config.debug;\n * ```\n */\nexport const createGlobalConfig = <T extends AnyObject>(\n defaultValue: T,\n accessSymbol?: keyof any,\n): T => {\n const globalPoint = createGlobalPoint<T>(accessSymbol);\n return globalPoint.get() || globalPoint.set(defaultValue);\n};\n\nexport interface GlobalDynamicConfig<TValue extends AnyObject> {\n get(): TValue;\n set(value: TValue): TValue;\n unset(): void;\n update(value: Partial<TValue>): void;\n}\n\n/**\n * Creates a mutable global config manager whose value is produced and updated\n * through a custom processor function.\n *\n * @template T Config object type.\n * @param processFn Function that builds the next config state from a partial change and current value.\n * @param accessSymbol Optional global key used to store the config.\n * @returns API for reading, replacing, resetting and partially updating the config.\n *\n * @example\n * ```ts\n * const config = createGlobalDynamicConfig(\n * (change, current) => ({ theme: 'light', ...current, ...change }),\n * '__theme__',\n * );\n * ```\n *\n * @example\n * ```ts\n * const config = createGlobalDynamicConfig((change, current) => ({ ...current, ...change }));\n * config.update({ locale: 'ru' });\n * ```\n */\nexport const createGlobalDynamicConfig = <T extends AnyObject>(\n processFn: (change: Maybe<Partial<T>>, current: Maybe<T>) => T,\n accessSymbol?: keyof any,\n): GlobalDynamicConfig<T> => {\n const globalPoint = createGlobalPoint<T>(accessSymbol);\n\n const getValue = () => {\n return globalPoint.get() ?? globalPoint.set(processFn(null, null))!;\n };\n\n return {\n get: getValue,\n set: globalPoint.set,\n unset: globalPoint.unset,\n update: (value: Partial<T>) => {\n const currentValue = getValue();\n Object.assign(currentValue, processFn(value, currentValue));\n },\n };\n};\n","import type { AnyObject, Class, EmptyObject, IsPartial } from 'yummies/types';\n\ntype ModuleLoaderConfig<TPredefinedDeps extends AnyObject = EmptyObject> = {\n factory<TInstance, TDeps extends TPredefinedDeps>(\n moduleClass: Class<TInstance, [TDeps]>,\n deps: TDeps,\n ): TInstance;\n} & (TPredefinedDeps extends EmptyObject\n ? { deps?: TPredefinedDeps }\n : { deps: TPredefinedDeps });\n\n/**\n * Universal factory for creating class instances with predefined and per-call\n * dependencies.\n *\n * Works with classes whose constructor accepts a single dependency object.\n *\n * @template TPredefinedDeps Dependency shape that is always injected by the factory.\n *\n * @example\n * ```\n * const factory = new ModulesFactory({\n * factory: (MyClass, deps) => new MyClass(deps),\n * deps: { someDependency: new Dependency() }\n * });\n *\n * const instance = factory.create(MyClass, { extraDependency: new ExtraDependency() });\n * ```\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * });\n * ```\n *\n * @example\n * ```ts\n * const service = factory.create(UserService, { api });\n * ```\n */\nexport class ModulesFactory<TPredefinedDeps extends AnyObject = EmptyObject> {\n /**\n * Creates a new module factory.\n *\n * @param config Factory strategy and predefined dependencies.\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * });\n * ```\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * deps: { api },\n * });\n * ```\n */\n constructor(private config: ModuleLoaderConfig<TPredefinedDeps>) {}\n\n /**\n * Creates an instance of the provided class by merging predefined and\n * per-call dependencies.\n *\n * @template TInstance Instance type produced by the constructor.\n * @template TDeps Full dependency object expected by the constructor.\n * @param Constructor Class constructor receiving a single dependency object.\n * @param args Additional dependencies merged over predefined ones.\n * @returns Created class instance.\n *\n * @example\n * ```ts\n * const service = factory.create(UserService, { logger });\n * ```\n *\n * @example\n * ```ts\n * const store = factory.create(UserStore);\n * ```\n */\n create<TInstance, TDeps extends TPredefinedDeps = TPredefinedDeps>(\n Constructor: Class<TInstance, [TDeps]>,\n ...args: IsPartial<Omit<TDeps, keyof TPredefinedDeps>> extends true\n ? [extraDeps?: Omit<TDeps, keyof TPredefinedDeps>]\n : [extraDeps: Omit<TDeps, keyof TPredefinedDeps>]\n ) {\n return this.config.factory(Constructor, {\n ...this.config.deps!,\n ...args[0],\n } as any);\n }\n}\n","export type SubFn<PubArgs extends any[] = any[]> = (...args: PubArgs) => void;\n\n/**\n * The Publish-Subscribe pattern, which allows objects to interact with each other\n * through an event system. Subscribers can subscribe to events and receive notifications\n * when these events occur. The last published data can be accessed through the `data` property.\n */\nexport interface PubSub<PubArgs extends any[] = any[]> {\n (...args: PubArgs): void;\n\n /**\n * Last published arguments\n */\n lastPub: PubArgs | undefined;\n\n /**\n * An array of subscriber functions (sub) that will be called\n * when an event is published. Each subscriber must match the type SubFn,\n * taking the arguments that will be passed to it when the publisher calls pub.\n */\n subs: SubFn<PubArgs>[];\n\n /**\n * A function to unsubscribe from events. When a subscriber function (sub) is passed,\n * it will be removed from the `subs` array, and will no longer receive notifications.\n */\n unsub(sub: SubFn<PubArgs>): void;\n /**\n * A function to subscribe to events. When a subscriber function (sub) is passed,\n * it will be added to the `subs` array, and will receive notifications when the publisher calls pub.\n * Returns a function that can be used to unsubscribe from events.\n */\n sub(sub: SubFn<PubArgs>): VoidFunction;\n}\n\n/**\n * Creates a simple publish-subscribe dispatcher that stores the last published\n * arguments and allows subscription management.\n *\n * @template PubArgs Argument tuple delivered to subscribers.\n * @returns Callable publisher with subscribe and unsubscribe helpers.\n *\n * @example\n * ```ts\n * const pub = createPubSub<[string]>();\n * pub('ready');\n * ```\n *\n * @example\n * ```ts\n * const pub = createPubSub<[number]>();\n * const unsub = pub.sub((value) => console.log(value));\n * ```\n */\nexport const createPubSub = <PubArgs extends any[] = any[]>() => {\n const pubSub = ((...args: PubArgs) => {\n pubSub.lastPub = args;\n pubSub.subs.forEach((sub) => {\n sub(...args);\n });\n }) as PubSub<PubArgs>;\n pubSub.lastPub = undefined;\n\n pubSub.subs = [];\n\n pubSub.unsub = (sub: SubFn<PubArgs>) => {\n pubSub.subs = pubSub.subs.filter((it) => it !== sub);\n };\n pubSub.sub = (sub: SubFn<PubArgs>) => {\n pubSub.subs.push(sub);\n return () => pubSub.unsub(sub);\n };\n\n return pubSub;\n};\n"],"names":[],"mappings":"AAqCO,MAAM,gBAAgB,CAC3B,cACA,UAAkB,MACE;AACpB,QAAM,SAAS,CAAC,YAAoB;AAClC,OAAG,QAAQ,eAAe,OAAO,KAAM;AACvC,WAAO,GAAG;AAAA,EACZ;AAEA,QAAM,YAAY,MAAM,OAAO,EAAE,GAAG,OAAO;AAC3C,QAAM,YAAY,MAAM,OAAO,EAAE,GAAG,OAAO;AAE3C,QAAM,KAAsB;AAE5B,KAAG,YAAY;AACf,KAAG,YAAY;AAEf,KAAG,QAAQ,MAAM;AACf,OAAG,UAAU;AACb,OAAG,QAAQ,eAAe,OAAO,KAAM;AAAA,EACzC;AAEA,KAAG,MAAA;AAEH,SAAO;AACT;AClCO,MAAM,oBAAoB,CAC/B,iBACwB;AACxB,MAAI,gBAAgB,MAAM;AACxB,QAAI;AAEJ,WAAO;AAAA,MACL,KAAK,MAAc;AAAA,MACnB,OAAO,MAAM;AACX,sBAAc;AAAA,MAChB;AAAA,MACA,KAAK,CAAC,UAA0B;AAC9B,sBAAc;AACd,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,cAAc;AAEpB,SAAO;AAAA,IACL,KAAK,MAAc,YAAY,YAAY;AAAA,IAC3C,OAAO,MAAM;AACX,aAAO,YAAY,YAAY;AAAA,IACjC;AAAA,IACA,KAAK,CAAC,UAA0B;AAC9B,kBAAY,YAAY,IAAI;AAC5B,aAAO;AAAA,IACT;AAAA,EAAA;AAEJ;ACjCO,MAAM,qBAAqB,CAChC,cACA,iBACM;AACN,QAAM,cAAc,kBAAqB,YAAY;AACrD,SAAO,YAAY,IAAA,KAAS,YAAY,IAAI,YAAY;AAC1D;AAgCO,MAAM,4BAA4B,CACvC,WACA,iBAC2B;AAC3B,QAAM,cAAc,kBAAqB,YAAY;AAErD,QAAM,WAAW,MAAM;AACrB,WAAO,YAAY,SAAS,YAAY,IAAI,UAAU,MAAM,IAAI,CAAC;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK,YAAY;AAAA,IACjB,OAAO,YAAY;AAAA,IACnB,QAAQ,CAAC,UAAsB;AAC7B,YAAM,eAAe,SAAA;AACrB,aAAO,OAAO,cAAc,UAAU,OAAO,YAAY,CAAC;AAAA,IAC5D;AAAA,EAAA;AAEJ;ACzCO,MAAM,eAAgE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB3E,YAAoB,QAA6C;AAA7C,SAAA,SAAA;AAAA,EAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBlE,OACE,gBACG,MAGH;AACA,WAAO,KAAK,OAAO,QAAQ,aAAa;AAAA,MACtC,GAAG,KAAK,OAAO;AAAA,MACf,GAAG,KAAK,CAAC;AAAA,IAAA,CACH;AAAA,EACV;AACF;ACzCO,MAAM,eAAe,MAAqC;AAC/D,QAAM,UAAU,IAAI,SAAkB;AACpC,WAAO,UAAU;AACjB,WAAO,KAAK,QAAQ,CAAC,QAAQ;AAC3B,UAAI,GAAG,IAAI;AAAA,IACb,CAAC;AAAA,EACH;AACA,SAAO,UAAU;AAEjB,SAAO,OAAO,CAAA;AAEd,SAAO,QAAQ,CAAC,QAAwB;AACtC,WAAO,OAAO,OAAO,KAAK,OAAO,CAAC,OAAO,OAAO,GAAG;AAAA,EACrD;AACA,SAAO,MAAM,CAAC,QAAwB;AACpC,WAAO,KAAK,KAAK,GAAG;AACpB,WAAO,MAAM,OAAO,MAAM,GAAG;AAAA,EAC/B;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"complex.js","names":[],"sources":["../src/complex/counter.ts","../src/complex/global-point.ts","../src/complex/global-config.ts","../src/complex/modules-factory.ts","../src/complex/pub-sub.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/complex\n *\n * ## Description\n *\n * Callable **counter** objects with increment, decrement, and reset for UI steppers, pagination,\n * and id generators. Values can be mapped on read so the public API stays typed while the internal\n * tick stays numeric. This file is the `counter` slice of the broader `yummies/complex` entry point.\n *\n * ## Usage\n *\n * ```ts\n * import { createCounter } from \"yummies/complex\";\n * ```\n */\n\nexport interface Counter<TValue = number> {\n (): TValue;\n counter: number;\n value: TValue;\n increment(): TValue;\n decrement(): TValue;\n reset(): void;\n}\n\n/**\n * @deprecated use {`Counter`}. Will be removed in next major release\n */\nexport interface CounterFn<TValue = number> extends Counter<TValue> {}\n\n/**\n * Creates a callable counter object with increment, decrement and reset helpers.\n *\n * The returned function increments the internal numeric counter when called and\n * exposes both the raw counter value and an optionally transformed `value`.\n *\n * @template TValue Public value type returned by the counter.\n * @param processValue Optional mapper that transforms the numeric counter value.\n * @param initial Initial numeric counter value.\n * @returns Callable counter with state and control methods.\n *\n * @example\n * ```ts\n * const counter = createCounter();\n * counter.increment(); // 1\n * ```\n *\n * @example\n * ```ts\n * const idCounter = createCounter((value) => `id-${value}`, 10);\n * idCounter(); // 'id-11'\n * ```\n */\nexport const createCounter = <TValue = number>(\n processValue?: (value: number) => TValue,\n initial: number = 0,\n): Counter<TValue> => {\n const update = (counter: number) => {\n fn.value = processValue?.(counter) ?? (counter as TValue);\n return fn.value;\n };\n\n const increment = () => update(++fn.counter);\n const decrement = () => update(--fn.counter);\n\n const fn: Counter<TValue> = increment as any;\n\n fn.increment = increment;\n fn.decrement = decrement;\n\n fn.reset = () => {\n fn.counter = initial;\n fn.value = processValue?.(initial) ?? (initial as TValue);\n };\n\n fn.reset();\n\n return fn as Counter<TValue>;\n};\n","/**\n * ---header-docs-section---\n * # yummies/complex\n *\n * ## Description\n *\n * Minimal **global or scoped storage** with `get` / `set` / `unset` semantics. When an access symbol\n * is provided the value lives on `globalThis`; otherwise it is isolated in a closure. Handy for\n * bridging non-React singletons, test doubles, or legacy globals without `window.foo =` sprawl.\n *\n * ## Usage\n *\n * ```ts\n * import { createGlobalPoint } from \"yummies/complex\";\n * ```\n */\n\nimport type { AnyObject } from 'yummies/types';\n\nexport interface GlobalPoint<TValue> {\n get(): TValue;\n set(value: TValue): TValue;\n unset(): void;\n}\n\n/**\n * Creates a simple storage point that can live either in `globalThis` under a\n * provided key or in a local closure when no key is given.\n *\n * @template TValue Stored value type.\n * @param accessSymbol Optional global property name used for storage.\n * @returns Getter/setter API for the stored value.\n *\n * @example\n * ```ts\n * const point = createGlobalPoint<number>();\n * point.set(10);\n * ```\n *\n * @example\n * ```ts\n * const point = createGlobalPoint<string>('__token__');\n * point.get();\n * ```\n */\nexport const createGlobalPoint = <TValue>(\n accessSymbol?: keyof any,\n): GlobalPoint<TValue> => {\n if (accessSymbol == null) {\n let storedValue: TValue | undefined;\n\n return {\n get: (): TValue => storedValue!,\n unset: () => {\n storedValue = undefined;\n },\n set: (value: TValue): TValue => {\n storedValue = value;\n return value;\n },\n };\n }\n\n const _globalThis = globalThis as AnyObject;\n\n return {\n get: (): TValue => _globalThis[accessSymbol],\n unset: () => {\n delete _globalThis[accessSymbol];\n },\n set: (value: TValue): TValue => {\n _globalThis[accessSymbol] = value;\n return value;\n },\n };\n};\n","/**\n * ---header-docs-section---\n * # yummies/complex\n *\n * ## Description\n *\n * **Singleton-style config** backed by either `globalThis` (keyed by symbol) or a module closure.\n * Use for app-wide feature flags, bootstrapped locale, or SSR-safe defaults without prop-drilling.\n * Pairs with `createGlobalPoint` for other global handles in the same `yummies/complex` package.\n *\n * ## Usage\n *\n * ```ts\n * import { createGlobalConfig } from \"yummies/complex\";\n * ```\n */\n\nimport type { AnyObject, Maybe } from 'yummies/types';\nimport { createGlobalPoint } from './global-point.js';\n\n/**\n * Creates or reuses a globally accessible config object.\n *\n * The config is stored in a global point identified by `accessSymbol`, or in a\n * local closure when no symbol is provided.\n *\n * @template T Config object type.\n * @param defaultValue Default value used when no config has been created yet.\n * @param accessSymbol Optional global key used to store the config.\n * @returns Existing or newly initialized global config object.\n *\n * @example\n * ```ts\n * const config = createGlobalConfig({ locale: 'en' }, '__app_config__');\n * ```\n *\n * @example\n * ```ts\n * const config = createGlobalConfig({ debug: false });\n * config.debug;\n * ```\n */\nexport const createGlobalConfig = <T extends AnyObject>(\n defaultValue: T,\n accessSymbol?: keyof any,\n): T => {\n const globalPoint = createGlobalPoint<T>(accessSymbol);\n return globalPoint.get() || globalPoint.set(defaultValue);\n};\n\nexport interface GlobalDynamicConfig<TValue extends AnyObject> {\n get(): TValue;\n set(value: TValue): TValue;\n unset(): void;\n update(value: Partial<TValue>): void;\n}\n\n/**\n * Creates a mutable global config manager whose value is produced and updated\n * through a custom processor function.\n *\n * @template T Config object type.\n * @param processFn Function that builds the next config state from a partial change and current value.\n * @param accessSymbol Optional global key used to store the config.\n * @returns API for reading, replacing, resetting and partially updating the config.\n *\n * @example\n * ```ts\n * const config = createGlobalDynamicConfig(\n * (change, current) => ({ theme: 'light', ...current, ...change }),\n * '__theme__',\n * );\n * ```\n *\n * @example\n * ```ts\n * const config = createGlobalDynamicConfig((change, current) => ({ ...current, ...change }));\n * config.update({ locale: 'ru' });\n * ```\n */\nexport const createGlobalDynamicConfig = <T extends AnyObject>(\n processFn: (change: Maybe<Partial<T>>, current: Maybe<T>) => T,\n accessSymbol?: keyof any,\n): GlobalDynamicConfig<T> => {\n const globalPoint = createGlobalPoint<T>(accessSymbol);\n\n const getValue = () => {\n return globalPoint.get() ?? globalPoint.set(processFn(null, null))!;\n };\n\n return {\n get: getValue,\n set: globalPoint.set,\n unset: globalPoint.unset,\n update: (value: Partial<T>) => {\n const currentValue = getValue();\n Object.assign(currentValue, processFn(value, currentValue));\n },\n };\n};\n","/**\n * ---header-docs-section---\n * # yummies/complex\n *\n * ## Description\n *\n * **Dependency-injection style factory** for classes that take a single deps object in their\n * constructor. Merges predefined singletons with per-call overrides so feature modules can be\n * constructed consistently in apps that avoid heavyweight DI containers.\n *\n * ## Usage\n *\n * ```ts\n * import { ModulesFactory } from \"yummies/complex\";\n * ```\n */\n\nimport type { AnyObject, Class, EmptyObject, IsPartial } from 'yummies/types';\n\ntype ModuleLoaderConfig<TPredefinedDeps extends AnyObject = EmptyObject> = {\n factory<TInstance, TDeps extends TPredefinedDeps>(\n moduleClass: Class<TInstance, [TDeps]>,\n deps: TDeps,\n ): TInstance;\n} & (TPredefinedDeps extends EmptyObject\n ? { deps?: TPredefinedDeps }\n : { deps: TPredefinedDeps });\n\n/**\n * Universal factory for creating class instances with predefined and per-call\n * dependencies.\n *\n * Works with classes whose constructor accepts a single dependency object.\n *\n * @template TPredefinedDeps Dependency shape that is always injected by the factory.\n *\n * @example\n * ```\n * const factory = new ModulesFactory({\n * factory: (MyClass, deps) => new MyClass(deps),\n * deps: { someDependency: new Dependency() }\n * });\n *\n * const instance = factory.create(MyClass, { extraDependency: new ExtraDependency() });\n * ```\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * });\n * ```\n *\n * @example\n * ```ts\n * const service = factory.create(UserService, { api });\n * ```\n */\nexport class ModulesFactory<TPredefinedDeps extends AnyObject = EmptyObject> {\n /**\n * Creates a new module factory.\n *\n * @param config Factory strategy and predefined dependencies.\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * });\n * ```\n *\n * @example\n * ```ts\n * const factory = new ModulesFactory({\n * factory: (Module, deps) => new Module(deps),\n * deps: { api },\n * });\n * ```\n */\n constructor(private config: ModuleLoaderConfig<TPredefinedDeps>) {}\n\n /**\n * Creates an instance of the provided class by merging predefined and\n * per-call dependencies.\n *\n * @template TInstance Instance type produced by the constructor.\n * @template TDeps Full dependency object expected by the constructor.\n * @param Constructor Class constructor receiving a single dependency object.\n * @param args Additional dependencies merged over predefined ones.\n * @returns Created class instance.\n *\n * @example\n * ```ts\n * const service = factory.create(UserService, { logger });\n * ```\n *\n * @example\n * ```ts\n * const store = factory.create(UserStore);\n * ```\n */\n create<TInstance, TDeps extends TPredefinedDeps = TPredefinedDeps>(\n Constructor: Class<TInstance, [TDeps]>,\n ...args: IsPartial<Omit<TDeps, keyof TPredefinedDeps>> extends true\n ? [extraDeps?: Omit<TDeps, keyof TPredefinedDeps>]\n : [extraDeps: Omit<TDeps, keyof TPredefinedDeps>]\n ) {\n return this.config.factory(Constructor, {\n ...this.config.deps!,\n ...args[0],\n } as any);\n }\n}\n","/**\n * ---header-docs-section---\n * # yummies/complex\n *\n * ## Description\n *\n * Tiny **publish–subscribe** bus: subscribers register callbacks, publishers broadcast arguments, and\n * the last payload remains readable for late subscribers. Simpler than full event emitters when you\n * only need in-memory fan-out inside a feature or view-model layer.\n *\n * ## Usage\n *\n * ```ts\n * import { createPubSub } from \"yummies/complex\";\n * ```\n */\n\nexport type SubFn<PubArgs extends any[] = any[]> = (...args: PubArgs) => void;\n\n/**\n * The Publish-Subscribe pattern, which allows objects to interact with each other\n * through an event system. Subscribers can subscribe to events and receive notifications\n * when these events occur. The last published data can be accessed through the `data` property.\n */\nexport interface PubSub<PubArgs extends any[] = any[]> {\n (...args: PubArgs): void;\n\n /**\n * Last published arguments\n */\n lastPub: PubArgs | undefined;\n\n /**\n * An array of subscriber functions (sub) that will be called\n * when an event is published. Each subscriber must match the type SubFn,\n * taking the arguments that will be passed to it when the publisher calls pub.\n */\n subs: SubFn<PubArgs>[];\n\n /**\n * A function to unsubscribe from events. When a subscriber function (sub) is passed,\n * it will be removed from the `subs` array, and will no longer receive notifications.\n */\n unsub(sub: SubFn<PubArgs>): void;\n /**\n * A function to subscribe to events. When a subscriber function (sub) is passed,\n * it will be added to the `subs` array, and will receive notifications when the publisher calls pub.\n * Returns a function that can be used to unsubscribe from events.\n */\n sub(sub: SubFn<PubArgs>): VoidFunction;\n}\n\n/**\n * Creates a simple publish-subscribe dispatcher that stores the last published\n * arguments and allows subscription management.\n *\n * @template PubArgs Argument tuple delivered to subscribers.\n * @returns Callable publisher with subscribe and unsubscribe helpers.\n *\n * @example\n * ```ts\n * const pub = createPubSub<[string]>();\n * pub('ready');\n * ```\n *\n * @example\n * ```ts\n * const pub = createPubSub<[number]>();\n * const unsub = pub.sub((value) => console.log(value));\n * ```\n */\nexport const createPubSub = <PubArgs extends any[] = any[]>() => {\n const pubSub = ((...args: PubArgs) => {\n pubSub.lastPub = args;\n pubSub.subs.forEach((sub) => {\n sub(...args);\n });\n }) as PubSub<PubArgs>;\n pubSub.lastPub = undefined;\n\n pubSub.subs = [];\n\n pubSub.unsub = (sub: SubFn<PubArgs>) => {\n pubSub.subs = pubSub.subs.filter((it) => it !== sub);\n };\n pubSub.sub = (sub: SubFn<PubArgs>) => {\n pubSub.subs.push(sub);\n return () => pubSub.unsub(sub);\n };\n\n return pubSub;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsDA,IAAa,iBACX,cACA,UAAkB,MACE;CACpB,MAAM,UAAU,YAAoB;AAClC,KAAG,QAAQ,eAAe,QAAQ,IAAK;AACvC,SAAO,GAAG;;CAGZ,MAAM,kBAAkB,OAAO,EAAE,GAAG,QAAQ;CAC5C,MAAM,kBAAkB,OAAO,EAAE,GAAG,QAAQ;CAE5C,MAAM,KAAsB;AAE5B,IAAG,YAAY;AACf,IAAG,YAAY;AAEf,IAAG,cAAc;AACf,KAAG,UAAU;AACb,KAAG,QAAQ,eAAe,QAAQ,IAAK;;AAGzC,IAAG,OAAO;AAEV,QAAO;;;;;;;;;;;;;;;;;;;;;;;;ACjCT,IAAa,qBACX,iBACwB;AACxB,KAAI,gBAAgB,MAAM;EACxB,IAAI;AAEJ,SAAO;GACL,WAAmB;GACnB,aAAa;AACX,kBAAc,KAAA;;GAEhB,MAAM,UAA0B;AAC9B,kBAAc;AACd,WAAO;;GAEV;;CAGH,MAAM,cAAc;AAEpB,QAAO;EACL,WAAmB,YAAY;EAC/B,aAAa;AACX,UAAO,YAAY;;EAErB,MAAM,UAA0B;AAC9B,eAAY,gBAAgB;AAC5B,UAAO;;EAEV;;;;;;;;;;;;;;;;;;;;;;;;;;AChCH,IAAa,sBACX,cACA,iBACM;CACN,MAAM,cAAc,kBAAqB,aAAa;AACtD,QAAO,YAAY,KAAK,IAAI,YAAY,IAAI,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;AAiC3D,IAAa,6BACX,WACA,iBAC2B;CAC3B,MAAM,cAAc,kBAAqB,aAAa;CAEtD,MAAM,iBAAiB;AACrB,SAAO,YAAY,KAAK,IAAI,YAAY,IAAI,UAAU,MAAM,KAAK,CAAC;;AAGpE,QAAO;EACL,KAAK;EACL,KAAK,YAAY;EACjB,OAAO,YAAY;EACnB,SAAS,UAAsB;GAC7B,MAAM,eAAe,UAAU;AAC/B,UAAO,OAAO,cAAc,UAAU,OAAO,aAAa,CAAC;;EAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxCH,IAAa,iBAAb,MAA6E;;;;;;;;;;;;;;;;;;;;;CAqB3E,YAAY,QAAqD;AAA7C,OAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;CAsBpB,OACE,aACA,GAAG,MAGH;AACA,SAAO,KAAK,OAAO,QAAQ,aAAa;GACtC,GAAG,KAAK,OAAO;GACf,GAAG,KAAK;GACT,CAAQ;;;;;;;;;;;;;;;;;;;;;;;;ACvCb,IAAa,qBAAoD;CAC/D,MAAM,WAAW,GAAG,SAAkB;AACpC,SAAO,UAAU;AACjB,SAAO,KAAK,SAAS,QAAQ;AAC3B,OAAI,GAAG,KAAK;IACZ;;AAEJ,QAAO,UAAU,KAAA;AAEjB,QAAO,OAAO,EAAE;AAEhB,QAAO,SAAS,QAAwB;AACtC,SAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,IAAI;;AAEtD,QAAO,OAAO,QAAwB;AACpC,SAAO,KAAK,KAAK,IAAI;AACrB,eAAa,OAAO,MAAM,IAAI;;AAGhC,QAAO"}
package/cookie.cjs CHANGED
@@ -1,10 +1,20 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const parseCookie = (cookiesString = document.cookie) => {
4
- return cookiesString.split(";").map((cookieString) => cookieString.trim().split("=")).reduce((acc, current) => {
5
- acc[current[0]] = current[1];
6
- return acc;
7
- }, {});
2
+ //#region src/cookie.ts
3
+ /**
4
+ * Parses a cookie string into an object with cookie names as keys.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * parseCookie('theme=dark; token=abc');
9
+ * ```
10
+ */
11
+ var parseCookie = (cookiesString = document.cookie) => {
12
+ return cookiesString.split(";").map((cookieString) => cookieString.trim().split("=")).reduce((acc, current) => {
13
+ acc[current[0]] = current[1];
14
+ return acc;
15
+ }, {});
8
16
  };
17
+ //#endregion
9
18
  exports.parseCookie = parseCookie;
10
- //# sourceMappingURL=cookie.cjs.map
19
+
20
+ //# sourceMappingURL=cookie.cjs.map
package/cookie.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cookie.cjs","sources":["../src/cookie.ts"],"sourcesContent":["import type { AnyObject } from 'yummies/types';\n\nexport const parseCookie = (cookiesString = document.cookie) => {\n return cookiesString\n .split(';')\n .map((cookieString) => cookieString.trim().split('='))\n .reduce<AnyObject>((acc, current) => {\n acc[current[0]] = current[1];\n return acc;\n }, {});\n};\n"],"names":[],"mappings":";;AAEO,MAAM,cAAc,CAAC,gBAAgB,SAAS,WAAW;AAC9D,SAAO,cACJ,MAAM,GAAG,EACT,IAAI,CAAC,iBAAiB,aAAa,KAAA,EAAO,MAAM,GAAG,CAAC,EACpD,OAAkB,CAAC,KAAK,YAAY;AACnC,QAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;AAC3B,WAAO;AAAA,EACT,GAAG,CAAA,CAAE;AACT;;"}
1
+ {"version":3,"file":"cookie.cjs","names":[],"sources":["../src/cookie.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/cookie\n *\n * ## Description\n *\n * Minimal helpers for reading the browser `document.cookie` string as a plain key/value map. This\n * avoids hand-rolled splitting and trimming at every call site and keeps parsing consistent across\n * the app. It is intentionally small: set paths, `Secure`, `SameSite`, and expiry are still handled\n * by your server or `document.cookie` writes elsewhere.\n *\n * ## Usage\n *\n * ```ts\n * import { parseCookie } from \"yummies/cookie\";\n * ```\n */\n\nimport type { AnyObject } from 'yummies/types';\n\n/**\n * Parses a cookie string into an object with cookie names as keys.\n *\n * @example\n * ```ts\n * parseCookie('theme=dark; token=abc');\n * ```\n */\nexport const parseCookie = (cookiesString = document.cookie) => {\n return cookiesString\n .split(';')\n .map((cookieString) => cookieString.trim().split('='))\n .reduce<AnyObject>((acc, current) => {\n acc[current[0]] = current[1];\n return acc;\n }, {});\n};\n"],"mappings":";;;;;;;;;;AA4BA,IAAa,eAAe,gBAAgB,SAAS,WAAW;AAC9D,QAAO,cACJ,MAAM,IAAI,CACV,KAAK,iBAAiB,aAAa,MAAM,CAAC,MAAM,IAAI,CAAC,CACrD,QAAmB,KAAK,YAAY;AACnC,MAAI,QAAQ,MAAM,QAAQ;AAC1B,SAAO;IACN,EAAE,CAAC"}
package/cookie.d.ts CHANGED
@@ -1,5 +1,31 @@
1
1
  import { AnyObject } from 'yummies/types';
2
2
 
3
+ /**
4
+ * ---header-docs-section---
5
+ * # yummies/cookie
6
+ *
7
+ * ## Description
8
+ *
9
+ * Minimal helpers for reading the browser `document.cookie` string as a plain key/value map. This
10
+ * avoids hand-rolled splitting and trimming at every call site and keeps parsing consistent across
11
+ * the app. It is intentionally small: set paths, `Secure`, `SameSite`, and expiry are still handled
12
+ * by your server or `document.cookie` writes elsewhere.
13
+ *
14
+ * ## Usage
15
+ *
16
+ * ```ts
17
+ * import { parseCookie } from "yummies/cookie";
18
+ * ```
19
+ */
20
+
21
+ /**
22
+ * Parses a cookie string into an object with cookie names as keys.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * parseCookie('theme=dark; token=abc');
27
+ * ```
28
+ */
3
29
  declare const parseCookie: (cookiesString?: string) => AnyObject;
4
30
 
5
31
  export { parseCookie };
package/cookie.js CHANGED
@@ -1,10 +1,19 @@
1
- const parseCookie = (cookiesString = document.cookie) => {
2
- return cookiesString.split(";").map((cookieString) => cookieString.trim().split("=")).reduce((acc, current) => {
3
- acc[current[0]] = current[1];
4
- return acc;
5
- }, {});
1
+ //#region src/cookie.ts
2
+ /**
3
+ * Parses a cookie string into an object with cookie names as keys.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * parseCookie('theme=dark; token=abc');
8
+ * ```
9
+ */
10
+ var parseCookie = (cookiesString = document.cookie) => {
11
+ return cookiesString.split(";").map((cookieString) => cookieString.trim().split("=")).reduce((acc, current) => {
12
+ acc[current[0]] = current[1];
13
+ return acc;
14
+ }, {});
6
15
  };
7
- export {
8
- parseCookie
9
- };
10
- //# sourceMappingURL=cookie.js.map
16
+ //#endregion
17
+ export { parseCookie };
18
+
19
+ //# sourceMappingURL=cookie.js.map
package/cookie.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cookie.js","sources":["../src/cookie.ts"],"sourcesContent":["import type { AnyObject } from 'yummies/types';\n\nexport const parseCookie = (cookiesString = document.cookie) => {\n return cookiesString\n .split(';')\n .map((cookieString) => cookieString.trim().split('='))\n .reduce<AnyObject>((acc, current) => {\n acc[current[0]] = current[1];\n return acc;\n }, {});\n};\n"],"names":[],"mappings":"AAEO,MAAM,cAAc,CAAC,gBAAgB,SAAS,WAAW;AAC9D,SAAO,cACJ,MAAM,GAAG,EACT,IAAI,CAAC,iBAAiB,aAAa,KAAA,EAAO,MAAM,GAAG,CAAC,EACpD,OAAkB,CAAC,KAAK,YAAY;AACnC,QAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;AAC3B,WAAO;AAAA,EACT,GAAG,CAAA,CAAE;AACT;"}
1
+ {"version":3,"file":"cookie.js","names":[],"sources":["../src/cookie.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/cookie\n *\n * ## Description\n *\n * Minimal helpers for reading the browser `document.cookie` string as a plain key/value map. This\n * avoids hand-rolled splitting and trimming at every call site and keeps parsing consistent across\n * the app. It is intentionally small: set paths, `Secure`, `SameSite`, and expiry are still handled\n * by your server or `document.cookie` writes elsewhere.\n *\n * ## Usage\n *\n * ```ts\n * import { parseCookie } from \"yummies/cookie\";\n * ```\n */\n\nimport type { AnyObject } from 'yummies/types';\n\n/**\n * Parses a cookie string into an object with cookie names as keys.\n *\n * @example\n * ```ts\n * parseCookie('theme=dark; token=abc');\n * ```\n */\nexport const parseCookie = (cookiesString = document.cookie) => {\n return cookiesString\n .split(';')\n .map((cookieString) => cookieString.trim().split('='))\n .reduce<AnyObject>((acc, current) => {\n acc[current[0]] = current[1];\n return acc;\n }, {});\n};\n"],"mappings":";;;;;;;;;AA4BA,IAAa,eAAe,gBAAgB,SAAS,WAAW;AAC9D,QAAO,cACJ,MAAM,IAAI,CACV,KAAK,iBAAiB,aAAa,MAAM,CAAC,MAAM,IAAI,CAAC,CACrD,QAAmB,KAAK,YAAY;AACnC,MAAI,QAAQ,MAAM,QAAQ;AAC1B,SAAO;IACN,EAAE,CAAC"}