patron-oop 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE.md +7 -0
  3. package/README.md +9 -0
  4. package/commitizen.cjs +50 -0
  5. package/dist/patron.d.ts +173 -0
  6. package/dist/patron.js +363 -0
  7. package/dist/patron.js.map +1 -0
  8. package/dist/patron.mjs +346 -0
  9. package/dist/patron.mjs.map +1 -0
  10. package/eslint.config.mjs +36 -0
  11. package/package.json +48 -0
  12. package/rollup.config.js +35 -0
  13. package/src/Cache.test.ts +20 -0
  14. package/src/Cache.ts +31 -0
  15. package/src/CacheType.ts +4 -0
  16. package/src/Chain.test.ts +72 -0
  17. package/src/Chain.ts +79 -0
  18. package/src/ChainType.ts +7 -0
  19. package/src/Factory.test.ts +16 -0
  20. package/src/Factory.ts +21 -0
  21. package/src/FactoryDynamic.ts +11 -0
  22. package/src/FactoryType.ts +3 -0
  23. package/src/FactoryWithFactories.ts +25 -0
  24. package/src/Guest.test.ts +13 -0
  25. package/src/Guest.ts +11 -0
  26. package/src/GuestAware.ts +11 -0
  27. package/src/GuestAwareType.ts +5 -0
  28. package/src/GuestCast.ts +20 -0
  29. package/src/GuestExecutorType.ts +3 -0
  30. package/src/GuestInTheMiddle.test.ts +71 -0
  31. package/src/GuestInTheMiddle.ts +20 -0
  32. package/src/GuestPool.test.ts +41 -0
  33. package/src/GuestPool.ts +46 -0
  34. package/src/GuestSync.test.ts +11 -0
  35. package/src/GuestSync.ts +14 -0
  36. package/src/GuestType.ts +10 -0
  37. package/src/GuestValueType.ts +5 -0
  38. package/src/Patron.test.ts +20 -0
  39. package/src/Patron.ts +17 -0
  40. package/src/PatronOnce.test.ts +18 -0
  41. package/src/PatronOnce.ts +30 -0
  42. package/src/PatronPool.test.ts +26 -0
  43. package/src/PatronPool.ts +76 -0
  44. package/src/PoolType.ts +7 -0
  45. package/src/Source.test.ts +13 -0
  46. package/src/Source.ts +20 -0
  47. package/src/SourceType.ts +4 -0
  48. package/src/index.ts +16 -0
  49. package/tsconfig.json +26 -0
@@ -0,0 +1,346 @@
1
+ var __defProp$5 = Object.defineProperty;
2
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ const poolSets = /* @__PURE__ */ new Map();
5
+ const removePatronFromPools = (patron) => {
6
+ poolSets.forEach((pool) => {
7
+ pool.delete(patron);
8
+ });
9
+ };
10
+ class PatronPool {
11
+ constructor(initiator) {
12
+ this.initiator = initiator;
13
+ __publicField$5(this, "patrons", /* @__PURE__ */ new Set());
14
+ __publicField$5(this, "receive");
15
+ poolSets.set(this, this.patrons);
16
+ let lastMicrotask = null;
17
+ const doReceive = (value, options) => {
18
+ this.patrons.forEach((target) => {
19
+ this.sendValueToGuest(value, target, options);
20
+ });
21
+ };
22
+ this.receive = (value, options) => {
23
+ const currentMicroTask = () => {
24
+ if (currentMicroTask === lastMicrotask) {
25
+ doReceive(value, options);
26
+ }
27
+ };
28
+ lastMicrotask = currentMicroTask;
29
+ queueMicrotask(currentMicroTask);
30
+ return this;
31
+ };
32
+ }
33
+ add(shouldBePatron) {
34
+ if (shouldBePatron.introduction && shouldBePatron.introduction() === "patron") {
35
+ this.patrons.add(shouldBePatron);
36
+ }
37
+ return this;
38
+ }
39
+ remove(patron) {
40
+ this.patrons.delete(patron);
41
+ return this;
42
+ }
43
+ distribute(receiving, possiblePatron) {
44
+ this.add(possiblePatron);
45
+ this.sendValueToGuest(receiving, possiblePatron, {});
46
+ return this;
47
+ }
48
+ sendValueToGuest(value, guest, options) {
49
+ guest.receive(value, {
50
+ ...options,
51
+ data: {
52
+ ...options?.data ?? {},
53
+ initiator: this.initiator,
54
+ pool: this
55
+ }
56
+ });
57
+ }
58
+ }
59
+
60
+ var __defProp$4 = Object.defineProperty;
61
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
62
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, key + "" , value);
63
+ class Cache {
64
+ constructor(initiator, defaultValue = null, theCache = null) {
65
+ this.defaultValue = defaultValue;
66
+ this.theCache = theCache;
67
+ __publicField$4(this, "pool");
68
+ this.pool = new PatronPool(initiator);
69
+ }
70
+ receive(value, options) {
71
+ this.theCache = value;
72
+ this.pool.receive(value, options);
73
+ return this;
74
+ }
75
+ receiving(guest) {
76
+ if (this.theCache !== null) {
77
+ guest.receive(this.theCache);
78
+ } else if (this.defaultValue !== null) {
79
+ guest.receive(this.defaultValue);
80
+ }
81
+ this.pool.add(guest);
82
+ return this;
83
+ }
84
+ }
85
+
86
+ class Guest {
87
+ constructor(receiver) {
88
+ this.receiver = receiver;
89
+ }
90
+ receive(value, options) {
91
+ this.receiver(value, options);
92
+ return this;
93
+ }
94
+ }
95
+
96
+ var __defProp$3 = Object.defineProperty;
97
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
98
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
99
+ class GuestPool {
100
+ constructor(initiator) {
101
+ __publicField$3(this, "guests", /* @__PURE__ */ new Set());
102
+ __publicField$3(this, "patronPool");
103
+ this.patronPool = new PatronPool(initiator);
104
+ }
105
+ receive(value, options) {
106
+ this.deliverToGuests(value, options);
107
+ this.patronPool.receive(value, options);
108
+ return this;
109
+ }
110
+ add(guest) {
111
+ if (!guest.introduction || guest.introduction() === "guest") {
112
+ this.guests.add(guest);
113
+ }
114
+ this.patronPool.add(guest);
115
+ return this;
116
+ }
117
+ remove(patron) {
118
+ this.guests.delete(patron);
119
+ this.patronPool.remove(patron);
120
+ return this;
121
+ }
122
+ distribute(receiving, possiblePatron) {
123
+ this.add(possiblePatron);
124
+ this.receive(receiving);
125
+ return this;
126
+ }
127
+ deliverToGuests(value, options) {
128
+ this.guests.forEach((target) => {
129
+ target.receive(value, options);
130
+ });
131
+ this.guests.clear();
132
+ }
133
+ }
134
+
135
+ class GuestInTheMiddle {
136
+ constructor(baseGuest, middleFn) {
137
+ this.baseGuest = baseGuest;
138
+ this.middleFn = middleFn;
139
+ }
140
+ introduction() {
141
+ if (!this.baseGuest.introduction) {
142
+ return "guest";
143
+ }
144
+ return this.baseGuest.introduction();
145
+ }
146
+ receive(value, options) {
147
+ this.middleFn(value, options);
148
+ return this;
149
+ }
150
+ }
151
+
152
+ var __defProp$2 = Object.defineProperty;
153
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
154
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
155
+ class Chain {
156
+ constructor() {
157
+ __publicField$2(this, "theChain");
158
+ __publicField$2(this, "keysKnown", /* @__PURE__ */ new Set());
159
+ __publicField$2(this, "keysFilled", /* @__PURE__ */ new Set());
160
+ __publicField$2(this, "filledChainPool", new GuestPool(this));
161
+ this.theChain = new Cache(this, {});
162
+ }
163
+ resultArray(guest) {
164
+ this.filledChainPool.add(
165
+ new GuestInTheMiddle(
166
+ guest,
167
+ (value) => Object.values(value)
168
+ )
169
+ );
170
+ if (this.isChainFilled()) {
171
+ this.theChain.receiving(
172
+ new Guest((chain) => {
173
+ this.filledChainPool.receive(Object.values(chain));
174
+ })
175
+ );
176
+ }
177
+ return this;
178
+ }
179
+ result(guest) {
180
+ if (this.isChainFilled()) {
181
+ this.filledChainPool.add(guest);
182
+ this.theChain.receiving(
183
+ new Guest((chain) => {
184
+ this.filledChainPool.receive(chain);
185
+ })
186
+ );
187
+ } else {
188
+ this.filledChainPool.add(guest);
189
+ }
190
+ return this;
191
+ }
192
+ receiveKey(key) {
193
+ this.keysKnown.add(key);
194
+ return new Guest((value) => {
195
+ queueMicrotask(() => {
196
+ this.theChain.receiving(
197
+ new Guest((chain) => {
198
+ this.keysFilled.add(key);
199
+ const lastChain = {
200
+ ...chain,
201
+ [key]: value
202
+ };
203
+ this.theChain.receive(lastChain);
204
+ if (this.isChainFilled()) {
205
+ this.filledChainPool.receive(lastChain);
206
+ }
207
+ })
208
+ );
209
+ });
210
+ });
211
+ }
212
+ isChainFilled() {
213
+ return this.keysFilled.size > 0 && this.keysFilled.size === this.keysKnown.size;
214
+ }
215
+ }
216
+
217
+ class Factory {
218
+ constructor(constructorFn) {
219
+ this.constructorFn = constructorFn;
220
+ }
221
+ create(...args) {
222
+ return new this.constructorFn(
223
+ ...args
224
+ );
225
+ }
226
+ }
227
+
228
+ class FactoryDynamic {
229
+ constructor(creationFn) {
230
+ this.creationFn = creationFn;
231
+ }
232
+ create(...args) {
233
+ return this.creationFn(...args);
234
+ }
235
+ }
236
+
237
+ class FactoryWithFactories {
238
+ constructor(constructorFn, factories = {}) {
239
+ this.constructorFn = constructorFn;
240
+ this.factories = factories;
241
+ }
242
+ create(...args) {
243
+ return new this.constructorFn(
244
+ ...args,
245
+ this.factories
246
+ );
247
+ }
248
+ }
249
+
250
+ class GuestAware {
251
+ constructor(guestReceiver) {
252
+ this.guestReceiver = guestReceiver;
253
+ }
254
+ receiving(guest) {
255
+ this.guestReceiver(guest);
256
+ return guest;
257
+ }
258
+ }
259
+
260
+ class GuestCast {
261
+ constructor(sourceGuest, targetGuest) {
262
+ this.sourceGuest = sourceGuest;
263
+ this.targetGuest = targetGuest;
264
+ }
265
+ introduction() {
266
+ if (!this.sourceGuest.introduction) {
267
+ return "guest";
268
+ }
269
+ return this.sourceGuest.introduction();
270
+ }
271
+ receive(value, options) {
272
+ this.targetGuest.receive(value, options);
273
+ return this;
274
+ }
275
+ }
276
+
277
+ class GuestSync {
278
+ constructor(theValue) {
279
+ this.theValue = theValue;
280
+ }
281
+ receive(value) {
282
+ this.theValue = value;
283
+ return this;
284
+ }
285
+ value() {
286
+ return this.theValue;
287
+ }
288
+ }
289
+
290
+ class Patron {
291
+ constructor(willBePatron) {
292
+ this.willBePatron = willBePatron;
293
+ }
294
+ introduction() {
295
+ return "patron";
296
+ }
297
+ receive(value, options) {
298
+ this.willBePatron.receive(value, options);
299
+ return this;
300
+ }
301
+ }
302
+
303
+ var __defProp$1 = Object.defineProperty;
304
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
305
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, key + "" , value);
306
+ class PatronOnce {
307
+ constructor(baseGuest) {
308
+ this.baseGuest = baseGuest;
309
+ __publicField$1(this, "received", false);
310
+ }
311
+ introduction() {
312
+ return "patron";
313
+ }
314
+ receive(value, options) {
315
+ if (!this.received) {
316
+ this.baseGuest.receive(value, options);
317
+ }
318
+ const data = options?.data;
319
+ if (data?.pool) {
320
+ data.pool.remove(this);
321
+ }
322
+ return this;
323
+ }
324
+ }
325
+
326
+ var __defProp = Object.defineProperty;
327
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
328
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
329
+ class Source {
330
+ constructor(sourceDocument) {
331
+ this.sourceDocument = sourceDocument;
332
+ __publicField(this, "pool", new PatronPool(this));
333
+ }
334
+ receive(value) {
335
+ this.sourceDocument = value;
336
+ this.pool.receive(this.sourceDocument);
337
+ return this;
338
+ }
339
+ receiving(guest) {
340
+ this.pool.distribute(this.sourceDocument, guest);
341
+ return this;
342
+ }
343
+ }
344
+
345
+ export { Cache, Chain, Factory, FactoryDynamic, FactoryWithFactories, Guest, GuestAware, GuestCast, GuestInTheMiddle, GuestPool, GuestSync, Patron, PatronOnce, PatronPool, Source, removePatronFromPools };
346
+ //# sourceMappingURL=patron.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patron.mjs","sources":["../src/PatronPool.ts","../src/Cache.ts","../src/Guest.ts","../src/GuestPool.ts","../src/GuestInTheMiddle.ts","../src/Chain.ts","../src/Factory.ts","../src/FactoryDynamic.ts","../src/FactoryWithFactories.ts","../src/GuestAware.ts","../src/GuestCast.ts","../src/GuestSync.ts","../src/Patron.ts","../src/PatronOnce.ts","../src/Source.ts"],"sourcesContent":["import { PoolType } from \"./PoolType\";\nimport { GuestType, ReceiveOptions } from \"./GuestType\";\n\nconst poolSets = new Map<PoolType, Set<GuestType>>();\n\n/**\n * Удалить патрон из всех пулов\n */\nexport const removePatronFromPools = (patron: GuestType) => {\n poolSets.forEach((pool) => {\n pool.delete(patron);\n });\n};\n\nexport class PatronPool<T> implements PoolType<T> {\n private patrons = new Set<GuestType<T>>();\n\n public receive: (value: T, options?: ReceiveOptions) => this;\n\n public constructor(private initiator: unknown) {\n poolSets.set(this, this.patrons);\n\n let lastMicrotask: (() => void) | null = null;\n const doReceive = (value: T, options?: ReceiveOptions) => {\n this.patrons.forEach((target) => {\n this.sendValueToGuest(value, target, options);\n });\n };\n this.receive = (value: T, options?: ReceiveOptions) => {\n const currentMicroTask = () => {\n if (currentMicroTask === lastMicrotask) {\n doReceive(value, options);\n }\n };\n lastMicrotask = currentMicroTask;\n queueMicrotask(currentMicroTask);\n return this;\n };\n }\n\n public add(shouldBePatron: GuestType<T>) {\n if (\n shouldBePatron.introduction &&\n shouldBePatron.introduction() === \"patron\"\n ) {\n this.patrons.add(shouldBePatron);\n }\n return this;\n }\n\n public remove(patron: GuestType<T>) {\n this.patrons.delete(patron);\n return this;\n }\n\n public distribute(receiving: T, possiblePatron: GuestType<T>): this {\n this.add(possiblePatron);\n this.sendValueToGuest(receiving, possiblePatron, {});\n return this;\n }\n\n private sendValueToGuest(\n value: T,\n guest: GuestType<T>,\n options?: ReceiveOptions,\n ) {\n guest.receive(value, {\n ...options,\n data: {\n ...((options?.data as Record<string, unknown>) ?? {}),\n initiator: this.initiator,\n pool: this,\n },\n });\n }\n}\n","import { PatronPool } from \"./PatronPool\";\nimport { CacheType } from \"./CacheType\";\nimport { GuestType, ReceiveOptions } from \"./GuestType\";\n\nexport class Cache<T> implements CacheType<T> {\n private pool: PatronPool<T>;\n\n public constructor(\n initiator: unknown,\n private defaultValue: T | null = null,\n private theCache: T | null = null,\n ) {\n this.pool = new PatronPool<T>(initiator);\n }\n\n public receive(value: T, options?: ReceiveOptions): this {\n this.theCache = value;\n this.pool.receive(value, options);\n return this;\n }\n\n public receiving(guest: GuestType<T>): this {\n if (this.theCache !== null) {\n guest.receive(this.theCache);\n } else if (this.defaultValue !== null) {\n guest.receive(this.defaultValue);\n }\n this.pool.add(guest);\n return this;\n }\n}\n","import { GuestExecutorType } from \"./GuestExecutorType\";\nimport { GuestType, ReceiveOptions } from \"./GuestType\";\n\nexport class Guest<T> implements GuestType<T> {\n public constructor(private receiver: GuestExecutorType<T>) {}\n\n public receive(value: T, options?: ReceiveOptions) {\n this.receiver(value, options);\n return this;\n }\n}\n","import { PatronPool } from \"./PatronPool\";\nimport { PoolType } from \"./PoolType\";\nimport { GuestType, ReceiveOptions } from \"./GuestType\";\n\nexport class GuestPool<T> implements GuestType<T>, PoolType<T> {\n private guests = new Set<GuestType<T>>();\n\n private patronPool: PatronPool<T>;\n\n public constructor(initiator: unknown) {\n this.patronPool = new PatronPool(initiator);\n }\n\n public receive(value: T, options?: ReceiveOptions): this {\n this.deliverToGuests(value, options);\n this.patronPool.receive(value, options);\n return this;\n }\n\n public add(guest: GuestType<T>): this {\n if (!guest.introduction || guest.introduction() === \"guest\") {\n this.guests.add(guest);\n }\n this.patronPool.add(guest);\n return this;\n }\n\n public remove(patron: GuestType<T>): this {\n this.guests.delete(patron);\n this.patronPool.remove(patron);\n return this;\n }\n\n public distribute(receiving: T, possiblePatron: GuestType<T>): this {\n this.add(possiblePatron);\n this.receive(receiving);\n return this;\n }\n\n private deliverToGuests(value: T, options?: ReceiveOptions) {\n this.guests.forEach((target) => {\n target.receive(value, options);\n });\n this.guests.clear();\n }\n}\n","import { GuestType, ReceiveOptions } from \"./GuestType\";\n\nexport class GuestInTheMiddle<T> implements GuestType<T> {\n public constructor(\n private baseGuest: GuestType<unknown>,\n private middleFn: (value: T, options?: ReceiveOptions) => void,\n ) {}\n\n introduction() {\n if (!this.baseGuest.introduction) {\n return \"guest\";\n }\n return this.baseGuest.introduction();\n }\n\n receive(value: T, options?: ReceiveOptions): this {\n this.middleFn(value, options);\n return this;\n }\n}\n","import { Cache } from \"./Cache\";\nimport { Guest } from \"./Guest\";\nimport { GuestPool } from \"./GuestPool\";\nimport { ChainType } from \"./ChainType\";\nimport { GuestInTheMiddle } from \"./GuestInTheMiddle\";\nimport { GuestType } from \"./GuestType\";\n\nexport class Chain<T> implements ChainType<T> {\n private theChain: Cache<Record<string, unknown>>;\n\n private keysKnown = new Set();\n\n private keysFilled = new Set();\n\n private filledChainPool = new GuestPool(this);\n\n public constructor() {\n this.theChain = new Cache<Record<string, unknown>>(this, {});\n }\n\n public resultArray(guest: GuestType<T>) {\n this.filledChainPool.add(\n new GuestInTheMiddle(guest, (value: Record<string, unknown>) =>\n Object.values(value),\n ),\n );\n if (this.isChainFilled()) {\n this.theChain.receiving(\n new Guest((chain) => {\n this.filledChainPool.receive(Object.values(chain));\n }),\n );\n }\n\n return this;\n }\n\n public result(guest: GuestType<T>) {\n if (this.isChainFilled()) {\n this.filledChainPool.add(guest);\n this.theChain.receiving(\n new Guest((chain) => {\n this.filledChainPool.receive(chain);\n }),\n );\n } else {\n this.filledChainPool.add(guest);\n }\n return this;\n }\n\n public receiveKey<R>(key: string): GuestType<R> {\n this.keysKnown.add(key);\n return new Guest((value) => {\n // Обернул в очередь чтобы можно было синхронно наполнить очередь известных ключей\n queueMicrotask(() => {\n this.theChain.receiving(\n new Guest((chain) => {\n this.keysFilled.add(key);\n const lastChain = {\n ...chain,\n [key]: value,\n };\n this.theChain.receive(lastChain);\n if (this.isChainFilled()) {\n this.filledChainPool.receive(lastChain);\n }\n }),\n );\n });\n });\n }\n\n private isChainFilled() {\n return (\n this.keysFilled.size > 0 && this.keysFilled.size === this.keysKnown.size\n );\n }\n}\n","import { FactoryType } from \"./FactoryType\";\n\ninterface Constructable<T> {\n new (...args: unknown[]): T;\n}\n\ninterface Prototyped<T> {\n prototype: T;\n}\n\nexport class Factory<T> implements FactoryType<T> {\n public constructor(private constructorFn: Prototyped<T>) {}\n\n public create<R extends unknown[], CT = null>(\n ...args: R\n ): CT extends null ? T : CT {\n return new (this.constructorFn as Constructable<T>)(\n ...args,\n ) as CT extends null ? T : CT;\n }\n}\n","import { FactoryType } from \"./FactoryType\";\n\nexport class FactoryDynamic<T> implements FactoryType<T> {\n public constructor(private creationFn: (...args: unknown[]) => T) {}\n\n public create<R extends unknown[], CT = null>(\n ...args: R\n ): CT extends null ? T : CT {\n return this.creationFn(...args) as CT extends null ? T : CT;\n }\n}\n","import { FactoryType } from \"./FactoryType\";\n\ninterface Constructable<T> {\n new (...args: unknown[]): T;\n}\n\ninterface Prototyped<T> {\n prototype: T;\n}\n\nexport class FactoryWithFactories<T> implements FactoryType<T> {\n public constructor(\n private constructorFn: Prototyped<T>,\n private factories: Record<string, unknown> = {},\n ) {}\n\n public create<R extends unknown[], CT = null>(\n ...args: R\n ): CT extends null ? T : CT {\n return new (this.constructorFn as Constructable<T>)(\n ...args,\n this.factories,\n ) as CT extends null ? T : CT;\n }\n}\n","import { GuestType } from \"./GuestType\";\nimport { GuestAwareType } from \"./GuestAwareType\";\n\nexport class GuestAware<T = unknown> implements GuestAwareType<T> {\n public constructor(private guestReceiver: (guest: GuestType<T>) => void) {}\n\n public receiving(guest: GuestType<T>): GuestType<T> {\n this.guestReceiver(guest);\n return guest;\n }\n}\n","import { GuestType, ReceiveOptions } from \"./GuestType\";\n\nexport class GuestCast<T> implements GuestType<T> {\n public constructor(\n private sourceGuest: GuestType<unknown>,\n private targetGuest: GuestType<T>,\n ) {}\n\n introduction() {\n if (!this.sourceGuest.introduction) {\n return \"guest\";\n }\n return this.sourceGuest.introduction();\n }\n\n receive(value: T, options?: ReceiveOptions): this {\n this.targetGuest.receive(value, options);\n return this;\n }\n}\n","import { GuestValueType } from \"./GuestValueType\";\n\nexport class GuestSync<T> implements GuestValueType<T> {\n public constructor(private theValue: T) {}\n\n public receive(value: T): this {\n this.theValue = value;\n return this;\n }\n\n public value() {\n return this.theValue;\n }\n}\n","import { GuestType, ReceiveOptions } from \"./GuestType\";\n\n/**\n * Патрон - это постоянный посетитель\n */\nexport class Patron<T> implements GuestType<T> {\n public constructor(private willBePatron: GuestType<T>) {}\n\n public introduction() {\n return \"patron\" as const;\n }\n\n public receive(value: T, options?: ReceiveOptions): this {\n this.willBePatron.receive(value, options);\n return this;\n }\n}\n","import { GuestType, ReceiveOptions } from \"./GuestType\";\nimport { PoolType } from \"./PoolType\";\n\ntype PoolAware = {\n pool?: PoolType;\n};\n\nexport class PatronOnce<T> implements GuestType<T> {\n private received = false;\n\n public constructor(private baseGuest: GuestType<T>) {}\n\n public introduction() {\n return \"patron\" as const;\n }\n\n public receive(value: T, options?: ReceiveOptions): this {\n if (!this.received) {\n this.baseGuest.receive(value, options);\n }\n\n const data = options?.data as PoolAware;\n // Если есть пул, то удаляем себя из пула\n if (data?.pool) {\n data.pool.remove(this);\n }\n\n return this;\n }\n}\n","import { GuestType } from \"./GuestType\";\nimport { PatronPool } from \"./PatronPool\";\nimport { SourceType } from \"./SourceType\";\n\nexport class Source<T> implements SourceType<T> {\n private pool = new PatronPool(this);\n\n public constructor(private sourceDocument: T) {}\n\n public receive(value: T): this {\n this.sourceDocument = value;\n this.pool.receive(this.sourceDocument);\n return this;\n }\n\n public receiving(guest: GuestType<T>): this {\n this.pool.distribute(this.sourceDocument, guest);\n return this;\n }\n}\n"],"names":["__publicField"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import typescriptEslint from "@typescript-eslint/eslint-plugin";
2
+ import tsParser from "@typescript-eslint/parser";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import js from "@eslint/js";
6
+ import { FlatCompat } from "@eslint/eslintrc";
7
+ import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const compat = new FlatCompat({
12
+ baseDirectory: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ allConfig: js.configs.all,
15
+ });
16
+
17
+ export default [
18
+ {
19
+ ignores: ["**/node_modules", "**/dist"],
20
+ },
21
+ ...compat.extends(
22
+ "eslint:recommended",
23
+ "plugin:@typescript-eslint/eslint-recommended",
24
+ "plugin:@typescript-eslint/recommended",
25
+ ),
26
+ {
27
+ plugins: {
28
+ "@typescript-eslint": typescriptEslint,
29
+ },
30
+
31
+ languageOptions: {
32
+ parser: tsParser,
33
+ },
34
+ },
35
+ eslintPluginPrettierRecommended,
36
+ ];
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "patron-oop",
3
+ "version": "1.1.0",
4
+ "description": "",
5
+ "type": "module",
6
+ "main": "dist/patron.js",
7
+ "module": "dist/patron.mjs",
8
+ "typings": "dist/patron.d.ts",
9
+ "scripts": {
10
+ "build": "rollup -c",
11
+ "lint": "eslint src",
12
+ "lint-fix": "eslint src --fix",
13
+ "test": "vitest",
14
+ "cz": "git add . && git cz",
15
+ "test-debug": "env DEBUG=app:* vitest",
16
+ "release": "standard-version --no-verify"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/kosukhin/patron.git"
21
+ },
22
+ "private": false,
23
+ "devDependencies": {
24
+ "@eslint/eslintrc": "^3.1.0",
25
+ "@eslint/js": "^9.12.0",
26
+ "@typescript-eslint/eslint-plugin": "^8.8.1",
27
+ "@typescript-eslint/parser": "^8.8.1",
28
+ "cz-customizable": "^7.0.0",
29
+ "esbuild": "^0.24.0",
30
+ "eslint": "^9.12.0",
31
+ "eslint-config-prettier": "^9.1.0",
32
+ "eslint-plugin-prettier": "^5.2.1",
33
+ "prettier": "3.3.3",
34
+ "rollup": "^4.24.0",
35
+ "rollup-plugin-dts": "^6.1.1",
36
+ "rollup-plugin-esbuild": "^6.1.1",
37
+ "standard-version": "^9.5.0",
38
+ "vitest": "^2.1.2"
39
+ },
40
+ "config": {
41
+ "commitizen": {
42
+ "path": "./node_modules/cz-customizable"
43
+ },
44
+ "cz-customizable": {
45
+ "config": "./commitizen.cjs"
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,35 @@
1
+ import dts from "rollup-plugin-dts";
2
+ import esbuild from "rollup-plugin-esbuild";
3
+
4
+ const name = "dist/patron";
5
+
6
+ const bundle = (config) => ({
7
+ ...config,
8
+ input: "src/index.ts",
9
+ external: (id) => !/^[./]/.test(id),
10
+ });
11
+
12
+ export default [
13
+ bundle({
14
+ plugins: [esbuild()],
15
+ output: [
16
+ {
17
+ file: `${name}.js`,
18
+ format: "cjs",
19
+ sourcemap: true,
20
+ },
21
+ {
22
+ file: `${name}.mjs`,
23
+ format: "es",
24
+ sourcemap: true,
25
+ },
26
+ ],
27
+ }),
28
+ bundle({
29
+ plugins: [dts()],
30
+ output: {
31
+ file: `${name}.d.ts`,
32
+ format: "es",
33
+ },
34
+ }),
35
+ ];
@@ -0,0 +1,20 @@
1
+ import { expect, test } from "vitest";
2
+ import { Cache } from "./Cache";
3
+ import { Guest } from "./Guest";
4
+
5
+ test("value works", () => {
6
+ const value = new Cache(null);
7
+ value.receive(2);
8
+ value.receiving(
9
+ new Guest((latestValue: number) => {
10
+ expect(latestValue).toBe(2);
11
+ }),
12
+ );
13
+
14
+ value.receive(4);
15
+ value.receiving(
16
+ new Guest((latestValue: number) => {
17
+ expect(latestValue).toBe(4);
18
+ }),
19
+ );
20
+ });
package/src/Cache.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { PatronPool } from "./PatronPool";
2
+ import { CacheType } from "./CacheType";
3
+ import { GuestType, ReceiveOptions } from "./GuestType";
4
+
5
+ export class Cache<T> implements CacheType<T> {
6
+ private pool: PatronPool<T>;
7
+
8
+ public constructor(
9
+ initiator: unknown,
10
+ private defaultValue: T | null = null,
11
+ private theCache: T | null = null,
12
+ ) {
13
+ this.pool = new PatronPool<T>(initiator);
14
+ }
15
+
16
+ public receive(value: T, options?: ReceiveOptions): this {
17
+ this.theCache = value;
18
+ this.pool.receive(value, options);
19
+ return this;
20
+ }
21
+
22
+ public receiving(guest: GuestType<T>): this {
23
+ if (this.theCache !== null) {
24
+ guest.receive(this.theCache);
25
+ } else if (this.defaultValue !== null) {
26
+ guest.receive(this.defaultValue);
27
+ }
28
+ this.pool.add(guest);
29
+ return this;
30
+ }
31
+ }
@@ -0,0 +1,4 @@
1
+ import { GuestAwareType } from "./GuestAwareType";
2
+ import { GuestType } from "./GuestType";
3
+
4
+ export type CacheType<T = unknown> = GuestType<T> & GuestAwareType<T>;
@@ -0,0 +1,72 @@
1
+ import { expect, test } from "vitest";
2
+ import { Chain } from "./Chain";
3
+ import { Patron } from "./Patron";
4
+ import { Guest } from "./Guest";
5
+ import { Source } from "./Source";
6
+
7
+ test("chain guest returns 2 values after result guest", () => {
8
+ const one = new Source(1);
9
+ const two = new Source(2);
10
+ const chain = new Chain<{ one: number; two: number }>();
11
+
12
+ chain.result(
13
+ new Guest((value) => {
14
+ expect(Object.values(value).join()).toBe("1,2");
15
+ }),
16
+ );
17
+
18
+ one.receiving(chain.receiveKey("one"));
19
+ two.receiving(chain.receiveKey("two"));
20
+ });
21
+
22
+ test("chain guest returns 2 values before result guest", () => {
23
+ const one = new Source(1);
24
+ const two = new Source(2);
25
+ const chain = new Chain<{ one: number; two: number }>();
26
+
27
+ one.receiving(chain.receiveKey("one"));
28
+ two.receiving(chain.receiveKey("two"));
29
+
30
+ chain.result(
31
+ new Guest((value) => {
32
+ expect(Object.values(value).join()).toBe("1,2");
33
+ }),
34
+ );
35
+ });
36
+
37
+ test("chain with patron", () => {
38
+ const one = new Source(1);
39
+ const two = new Source(2);
40
+ const chain = new Chain<{ one: number; two: number }>();
41
+
42
+ one.receiving(new Patron(chain.receiveKey("one")));
43
+ two.receiving(new Patron(chain.receiveKey("two")));
44
+
45
+ one.receive(3);
46
+ one.receive(4);
47
+
48
+ chain.result(
49
+ new Patron(
50
+ new Guest((value) => {
51
+ expect(Object.values(value).length).toBe(2);
52
+ }),
53
+ ),
54
+ );
55
+ });
56
+
57
+ test("chain as array", () => {
58
+ const one = new Source(1);
59
+ const two = new Source(2);
60
+ const chain = new Chain<[number, number]>();
61
+
62
+ one.receiving(new Patron(chain.receiveKey("0")));
63
+ two.receiving(new Patron(chain.receiveKey("1")));
64
+
65
+ chain.resultArray(
66
+ new Patron(
67
+ new Guest((value) => {
68
+ expect(JSON.stringify(value)).toBe("[1, 2]");
69
+ }),
70
+ ),
71
+ );
72
+ });