@fgv/ts-utils 5.1.0-32 → 5.1.0-34

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 (64) hide show
  1. package/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/dist/packlets/base/result.js +24 -8
  4. package/dist/packlets/base/result.js.map +1 -1
  5. package/dist/packlets/collections/index.js +1 -0
  6. package/dist/packlets/collections/index.js.map +1 -1
  7. package/dist/packlets/collections/readOnlyConvertingResultMap.js.map +1 -1
  8. package/dist/packlets/collections/retainingRingBuffer.js +159 -0
  9. package/dist/packlets/collections/retainingRingBuffer.js.map +1 -0
  10. package/dist/packlets/conversion/baseConverter.js +5 -2
  11. package/dist/packlets/conversion/baseConverter.js.map +1 -1
  12. package/dist/packlets/conversion/basicConverters.js +12 -4
  13. package/dist/packlets/conversion/basicConverters.js.map +1 -1
  14. package/dist/packlets/conversion/converter.js.map +1 -1
  15. package/dist/packlets/logging/logger.js +2 -10
  16. package/dist/packlets/logging/logger.js.map +1 -1
  17. package/dist/packlets/logging/retainingLogger.js +18 -65
  18. package/dist/packlets/logging/retainingLogger.js.map +1 -1
  19. package/dist/packlets/logging-interface/index.js +11 -0
  20. package/dist/packlets/logging-interface/index.js.map +1 -0
  21. package/dist/ts-utils.d.ts +210 -40
  22. package/lib/index.d.ts +2 -2
  23. package/lib/index.d.ts.map +1 -1
  24. package/lib/index.js +2 -1
  25. package/lib/index.js.map +1 -1
  26. package/lib/packlets/base/result.d.ts +37 -10
  27. package/lib/packlets/base/result.d.ts.map +1 -1
  28. package/lib/packlets/base/result.js +24 -8
  29. package/lib/packlets/base/result.js.map +1 -1
  30. package/lib/packlets/collections/index.d.ts +1 -0
  31. package/lib/packlets/collections/index.d.ts.map +1 -1
  32. package/lib/packlets/collections/index.js +1 -0
  33. package/lib/packlets/collections/index.js.map +1 -1
  34. package/lib/packlets/collections/readOnlyConvertingResultMap.d.ts +1 -1
  35. package/lib/packlets/collections/readOnlyConvertingResultMap.d.ts.map +1 -1
  36. package/lib/packlets/collections/readOnlyConvertingResultMap.js.map +1 -1
  37. package/lib/packlets/collections/retainingRingBuffer.d.ts +147 -0
  38. package/lib/packlets/collections/retainingRingBuffer.d.ts.map +1 -0
  39. package/lib/packlets/collections/retainingRingBuffer.js +163 -0
  40. package/lib/packlets/collections/retainingRingBuffer.js.map +1 -0
  41. package/lib/packlets/conversion/baseConverter.d.ts +4 -1
  42. package/lib/packlets/conversion/baseConverter.d.ts.map +1 -1
  43. package/lib/packlets/conversion/baseConverter.js +5 -2
  44. package/lib/packlets/conversion/baseConverter.js.map +1 -1
  45. package/lib/packlets/conversion/basicConverters.d.ts +3 -0
  46. package/lib/packlets/conversion/basicConverters.d.ts.map +1 -1
  47. package/lib/packlets/conversion/basicConverters.js +12 -4
  48. package/lib/packlets/conversion/basicConverters.js.map +1 -1
  49. package/lib/packlets/conversion/converter.d.ts +4 -1
  50. package/lib/packlets/conversion/converter.d.ts.map +1 -1
  51. package/lib/packlets/conversion/converter.js.map +1 -1
  52. package/lib/packlets/logging/logger.d.ts +2 -85
  53. package/lib/packlets/logging/logger.d.ts.map +1 -1
  54. package/lib/packlets/logging/logger.js +3 -12
  55. package/lib/packlets/logging/logger.js.map +1 -1
  56. package/lib/packlets/logging/retainingLogger.d.ts +8 -28
  57. package/lib/packlets/logging/retainingLogger.d.ts.map +1 -1
  58. package/lib/packlets/logging/retainingLogger.js +18 -65
  59. package/lib/packlets/logging/retainingLogger.js.map +1 -1
  60. package/lib/packlets/logging-interface/index.d.ts +87 -0
  61. package/lib/packlets/logging-interface/index.d.ts.map +1 -0
  62. package/lib/packlets/logging-interface/index.js +14 -0
  63. package/lib/packlets/logging-interface/index.js.map +1 -0
  64. package/package.json +3 -3
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Minimal structural contract a {@link RetainingRingBuffer} record must satisfy:
3
+ * a monotonic `seq` the buffer pages on. Records carry their own `seq` (assigned
4
+ * by the caller) so the buffer is agnostic about how records are minted — a logger
5
+ * assigns `seq` from its own counter, an observability layer assigns a library-global
6
+ * `seq` shared across several buffers, etc.
7
+ * @public
8
+ */
9
+ export interface IRetainedRecord {
10
+ /**
11
+ * Monotonic sequence number, assigned by the caller. The buffer requires
12
+ * **strictly increasing** `seq` across successive {@link RetainingRingBuffer.push | push}
13
+ * calls — `sinceSeq` cursor paging uses a strict `seq > sinceSeq` filter, so
14
+ * duplicate `seq` values held by a consumer cursor would never be re-yielded
15
+ * if pushed afterward. {@link RetainingRingBuffer.lastSeq | lastSeq} likewise
16
+ * advances only past values strictly greater than its current value.
17
+ */
18
+ readonly seq: number;
19
+ }
20
+ /**
21
+ * Query options for {@link RetainingRingBuffer.query}.
22
+ * @public
23
+ */
24
+ export interface IRetainingRingBufferQuery<T extends IRetainedRecord> {
25
+ /**
26
+ * If supplied, only records with `seq > sinceSeq` are returned, enabling
27
+ * incremental paging from a previously-held cursor.
28
+ */
29
+ readonly sinceSeq?: number;
30
+ /**
31
+ * If supplied, returns at most this many records — the most recent N (tail),
32
+ * still ordered oldest-first.
33
+ */
34
+ readonly limit?: number;
35
+ /**
36
+ * If supplied, only records for which the predicate returns `true` are
37
+ * returned. Applied before `limit`, so `limit` bounds the filtered tail.
38
+ */
39
+ readonly filter?: (record: T) => boolean;
40
+ }
41
+ /**
42
+ * Construction options for {@link RetainingRingBuffer}.
43
+ * @public
44
+ */
45
+ export interface IRetainingRingBufferCreateParams {
46
+ /**
47
+ * The maximum number of records retained before the oldest is overwritten.
48
+ * Defaults to `1000`. Normalized to a positive integer: a fractional value is
49
+ * floored toward the integer below (`2.9` → `2`), and a non-finite or sub-1
50
+ * value is floored to `1` (the ring requires a positive integer capacity to
51
+ * be well-defined).
52
+ */
53
+ readonly maxRecords?: number;
54
+ }
55
+ /**
56
+ * A generic bounded most-recent-N ring of records, with monotonic-`seq` cursor
57
+ * paging and predicate filtering.
58
+ *
59
+ * @remarks
60
+ * The buffer is a pure storage substrate: the caller mints each record (assigning
61
+ * its own `seq` and any other fields) and {@link RetainingRingBuffer.push | push}es
62
+ * it. The buffer never reshapes a record — it only retains, evicts the oldest when
63
+ * full (O(1), no `shift()` re-indexing regardless of capacity), and answers queries.
64
+ *
65
+ * Separating record minting from retention lets one `seq` authority feed several
66
+ * buffers consistently (e.g. an observability layer that assigns a library-global
67
+ * `seq` and fans the same record out to multiple retaining stores), and lets a
68
+ * single-authority consumer (e.g. a logger) own its own `seq` counter. It is the
69
+ * shared mechanism beneath `RetainingLogger` and
70
+ * any schema-aware observation store.
71
+ *
72
+ * @public
73
+ */
74
+ export declare class RetainingRingBuffer<T extends IRetainedRecord> {
75
+ /**
76
+ * The fixed ring capacity — the maximum number of records retained before the
77
+ * oldest is overwritten. A positive integer (see the constructor normalization).
78
+ * @internal
79
+ */
80
+ private readonly _capacity;
81
+ /**
82
+ * The backing store, used as a circular buffer. Grows lazily up to `_capacity`,
83
+ * after which records overwrite the oldest slot in place — eviction is O(1), with
84
+ * no `shift()` re-indexing regardless of capacity.
85
+ * @internal
86
+ */
87
+ private _buffer;
88
+ /**
89
+ * Index of the oldest retained record within `_buffer` once the ring is full.
90
+ * @internal
91
+ */
92
+ private _head;
93
+ /**
94
+ * The number of valid records currently retained (`<= _capacity`).
95
+ * @internal
96
+ */
97
+ private _count;
98
+ /**
99
+ * The highest `seq` ever pushed; monotonic, stable across eviction and
100
+ * {@link RetainingRingBuffer.clear | clear()}.
101
+ * @internal
102
+ */
103
+ private _lastSeq;
104
+ /**
105
+ * Creates a new retaining ring buffer.
106
+ * @param params - {@link IRetainingRingBufferCreateParams | Construction options}.
107
+ */
108
+ constructor(params?: IRetainingRingBufferCreateParams);
109
+ /**
110
+ * The number of records currently retained.
111
+ */
112
+ get size(): number;
113
+ /**
114
+ * The highest `seq` pushed so far. A client can hold this value and pass it as
115
+ * `sinceSeq` to page only records pushed afterward. Stable across eviction and
116
+ * {@link RetainingRingBuffer.clear | clear()}.
117
+ */
118
+ get lastSeq(): number;
119
+ /**
120
+ * The retained records, oldest-first.
121
+ */
122
+ get records(): ReadonlyArray<T>;
123
+ /**
124
+ * Retains a record, evicting the oldest if the ring is full.
125
+ * @param record - The record to retain. Its `seq` should be greater than the
126
+ * `seq` of the previously-pushed record so cursor paging stays monotonic.
127
+ * @returns The same record, for call-site chaining.
128
+ */
129
+ push(record: T): T;
130
+ /**
131
+ * Returns retained records, oldest-first, optionally filtered and paged.
132
+ * @param query - {@link IRetainingRingBufferQuery | Filtering and paging options}.
133
+ * @returns The matching records, oldest-first.
134
+ */
135
+ query(query?: IRetainingRingBufferQuery<T>): ReadonlyArray<T>;
136
+ /**
137
+ * Clears all retained records. Does NOT reset {@link RetainingRingBuffer.lastSeq | lastSeq},
138
+ * so a client holding a `sinceSeq` cursor never re-sees a sequence number.
139
+ */
140
+ clear(): void;
141
+ /**
142
+ * Materializes the ring into a plain oldest-first array.
143
+ * @internal
144
+ */
145
+ private _toOrderedArray;
146
+ }
147
+ //# sourceMappingURL=retainingRingBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retainingRingBuffer.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/retainingRingBuffer.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,eAAe;IAClE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAmB,CAAC,CAAC,SAAS,eAAe;IACxD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,CAAW;IAE1B;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAa;IAE1B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAa;IAE3B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAa;IAE7B;;;OAGG;gBACgB,MAAM,CAAC,EAAE,gCAAgC;IAQ5D;;OAEG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACH,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,CAErC;IAED;;;;;OAKG;IACI,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IAgBzB;;;;OAIG;IACI,KAAK,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAepE;;;OAGG;IACI,KAAK,IAAI,IAAI;IAMpB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2026 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.RetainingRingBuffer = void 0;
25
+ /**
26
+ * A generic bounded most-recent-N ring of records, with monotonic-`seq` cursor
27
+ * paging and predicate filtering.
28
+ *
29
+ * @remarks
30
+ * The buffer is a pure storage substrate: the caller mints each record (assigning
31
+ * its own `seq` and any other fields) and {@link RetainingRingBuffer.push | push}es
32
+ * it. The buffer never reshapes a record — it only retains, evicts the oldest when
33
+ * full (O(1), no `shift()` re-indexing regardless of capacity), and answers queries.
34
+ *
35
+ * Separating record minting from retention lets one `seq` authority feed several
36
+ * buffers consistently (e.g. an observability layer that assigns a library-global
37
+ * `seq` and fans the same record out to multiple retaining stores), and lets a
38
+ * single-authority consumer (e.g. a logger) own its own `seq` counter. It is the
39
+ * shared mechanism beneath `RetainingLogger` and
40
+ * any schema-aware observation store.
41
+ *
42
+ * @public
43
+ */
44
+ class RetainingRingBuffer {
45
+ /**
46
+ * Creates a new retaining ring buffer.
47
+ * @param params - {@link IRetainingRingBufferCreateParams | Construction options}.
48
+ */
49
+ constructor(params) {
50
+ var _a;
51
+ /**
52
+ * The backing store, used as a circular buffer. Grows lazily up to `_capacity`,
53
+ * after which records overwrite the oldest slot in place — eviction is O(1), with
54
+ * no `shift()` re-indexing regardless of capacity.
55
+ * @internal
56
+ */
57
+ this._buffer = [];
58
+ /**
59
+ * Index of the oldest retained record within `_buffer` once the ring is full.
60
+ * @internal
61
+ */
62
+ this._head = 0;
63
+ /**
64
+ * The number of valid records currently retained (`<= _capacity`).
65
+ * @internal
66
+ */
67
+ this._count = 0;
68
+ /**
69
+ * The highest `seq` ever pushed; monotonic, stable across eviction and
70
+ * {@link RetainingRingBuffer.clear | clear()}.
71
+ * @internal
72
+ */
73
+ this._lastSeq = 0;
74
+ const maxRecords = (_a = params === null || params === void 0 ? void 0 : params.maxRecords) !== null && _a !== void 0 ? _a : 1000;
75
+ // The ring requires a positive integer capacity to be well-defined; a non-finite
76
+ // or sub-1 value would make the modular index arithmetic meaningless, so floor it
77
+ // to a sane minimum of 1 rather than crash on degenerate input.
78
+ this._capacity = Number.isFinite(maxRecords) && maxRecords >= 1 ? Math.floor(maxRecords) : 1;
79
+ }
80
+ /**
81
+ * The number of records currently retained.
82
+ */
83
+ get size() {
84
+ return this._count;
85
+ }
86
+ /**
87
+ * The highest `seq` pushed so far. A client can hold this value and pass it as
88
+ * `sinceSeq` to page only records pushed afterward. Stable across eviction and
89
+ * {@link RetainingRingBuffer.clear | clear()}.
90
+ */
91
+ get lastSeq() {
92
+ return this._lastSeq;
93
+ }
94
+ /**
95
+ * The retained records, oldest-first.
96
+ */
97
+ get records() {
98
+ return this._toOrderedArray();
99
+ }
100
+ /**
101
+ * Retains a record, evicting the oldest if the ring is full.
102
+ * @param record - The record to retain. Its `seq` should be greater than the
103
+ * `seq` of the previously-pushed record so cursor paging stays monotonic.
104
+ * @returns The same record, for call-site chaining.
105
+ */
106
+ push(record) {
107
+ if (record.seq > this._lastSeq) {
108
+ this._lastSeq = record.seq;
109
+ }
110
+ if (this._count < this._capacity) {
111
+ // Still filling: append to the next free slot (head stays 0 during this phase).
112
+ this._buffer.push(record);
113
+ this._count += 1;
114
+ }
115
+ else {
116
+ // Full: overwrite the oldest record in place and advance the head.
117
+ this._buffer[this._head] = record;
118
+ this._head = (this._head + 1) % this._capacity;
119
+ }
120
+ return record;
121
+ }
122
+ /**
123
+ * Returns retained records, oldest-first, optionally filtered and paged.
124
+ * @param query - {@link IRetainingRingBufferQuery | Filtering and paging options}.
125
+ * @returns The matching records, oldest-first.
126
+ */
127
+ query(query) {
128
+ let result = this._toOrderedArray();
129
+ if ((query === null || query === void 0 ? void 0 : query.sinceSeq) !== undefined) {
130
+ const sinceSeq = query.sinceSeq;
131
+ result = result.filter((r) => r.seq > sinceSeq);
132
+ }
133
+ if ((query === null || query === void 0 ? void 0 : query.filter) !== undefined) {
134
+ result = result.filter(query.filter);
135
+ }
136
+ if ((query === null || query === void 0 ? void 0 : query.limit) !== undefined && result.length > query.limit) {
137
+ result = result.slice(result.length - query.limit);
138
+ }
139
+ return result;
140
+ }
141
+ /**
142
+ * Clears all retained records. Does NOT reset {@link RetainingRingBuffer.lastSeq | lastSeq},
143
+ * so a client holding a `sinceSeq` cursor never re-sees a sequence number.
144
+ */
145
+ clear() {
146
+ this._buffer = [];
147
+ this._head = 0;
148
+ this._count = 0;
149
+ }
150
+ /**
151
+ * Materializes the ring into a plain oldest-first array.
152
+ * @internal
153
+ */
154
+ _toOrderedArray() {
155
+ const result = [];
156
+ for (let i = 0; i < this._count; i++) {
157
+ result.push(this._buffer[(this._head + i) % this._capacity]);
158
+ }
159
+ return result;
160
+ }
161
+ }
162
+ exports.RetainingRingBuffer = RetainingRingBuffer;
163
+ //# sourceMappingURL=retainingRingBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retainingRingBuffer.js","sourceRoot":"","sources":["../../../src/packlets/collections/retainingRingBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Minimal structural contract a {@link RetainingRingBuffer} record must satisfy:\n * a monotonic `seq` the buffer pages on. Records carry their own `seq` (assigned\n * by the caller) so the buffer is agnostic about how records are minted — a logger\n * assigns `seq` from its own counter, an observability layer assigns a library-global\n * `seq` shared across several buffers, etc.\n * @public\n */\nexport interface IRetainedRecord {\n /**\n * Monotonic sequence number, assigned by the caller. The buffer requires\n * **strictly increasing** `seq` across successive {@link RetainingRingBuffer.push | push}\n * calls — `sinceSeq` cursor paging uses a strict `seq > sinceSeq` filter, so\n * duplicate `seq` values held by a consumer cursor would never be re-yielded\n * if pushed afterward. {@link RetainingRingBuffer.lastSeq | lastSeq} likewise\n * advances only past values strictly greater than its current value.\n */\n readonly seq: number;\n}\n\n/**\n * Query options for {@link RetainingRingBuffer.query}.\n * @public\n */\nexport interface IRetainingRingBufferQuery<T extends IRetainedRecord> {\n /**\n * If supplied, only records with `seq > sinceSeq` are returned, enabling\n * incremental paging from a previously-held cursor.\n */\n readonly sinceSeq?: number;\n /**\n * If supplied, returns at most this many records — the most recent N (tail),\n * still ordered oldest-first.\n */\n readonly limit?: number;\n /**\n * If supplied, only records for which the predicate returns `true` are\n * returned. Applied before `limit`, so `limit` bounds the filtered tail.\n */\n readonly filter?: (record: T) => boolean;\n}\n\n/**\n * Construction options for {@link RetainingRingBuffer}.\n * @public\n */\nexport interface IRetainingRingBufferCreateParams {\n /**\n * The maximum number of records retained before the oldest is overwritten.\n * Defaults to `1000`. Normalized to a positive integer: a fractional value is\n * floored toward the integer below (`2.9` → `2`), and a non-finite or sub-1\n * value is floored to `1` (the ring requires a positive integer capacity to\n * be well-defined).\n */\n readonly maxRecords?: number;\n}\n\n/**\n * A generic bounded most-recent-N ring of records, with monotonic-`seq` cursor\n * paging and predicate filtering.\n *\n * @remarks\n * The buffer is a pure storage substrate: the caller mints each record (assigning\n * its own `seq` and any other fields) and {@link RetainingRingBuffer.push | push}es\n * it. The buffer never reshapes a record — it only retains, evicts the oldest when\n * full (O(1), no `shift()` re-indexing regardless of capacity), and answers queries.\n *\n * Separating record minting from retention lets one `seq` authority feed several\n * buffers consistently (e.g. an observability layer that assigns a library-global\n * `seq` and fans the same record out to multiple retaining stores), and lets a\n * single-authority consumer (e.g. a logger) own its own `seq` counter. It is the\n * shared mechanism beneath `RetainingLogger` and\n * any schema-aware observation store.\n *\n * @public\n */\nexport class RetainingRingBuffer<T extends IRetainedRecord> {\n /**\n * The fixed ring capacity — the maximum number of records retained before the\n * oldest is overwritten. A positive integer (see the constructor normalization).\n * @internal\n */\n private readonly _capacity: number;\n\n /**\n * The backing store, used as a circular buffer. Grows lazily up to `_capacity`,\n * after which records overwrite the oldest slot in place — eviction is O(1), with\n * no `shift()` re-indexing regardless of capacity.\n * @internal\n */\n private _buffer: T[] = [];\n\n /**\n * Index of the oldest retained record within `_buffer` once the ring is full.\n * @internal\n */\n private _head: number = 0;\n\n /**\n * The number of valid records currently retained (`<= _capacity`).\n * @internal\n */\n private _count: number = 0;\n\n /**\n * The highest `seq` ever pushed; monotonic, stable across eviction and\n * {@link RetainingRingBuffer.clear | clear()}.\n * @internal\n */\n private _lastSeq: number = 0;\n\n /**\n * Creates a new retaining ring buffer.\n * @param params - {@link IRetainingRingBufferCreateParams | Construction options}.\n */\n public constructor(params?: IRetainingRingBufferCreateParams) {\n const maxRecords = params?.maxRecords ?? 1000;\n // The ring requires a positive integer capacity to be well-defined; a non-finite\n // or sub-1 value would make the modular index arithmetic meaningless, so floor it\n // to a sane minimum of 1 rather than crash on degenerate input.\n this._capacity = Number.isFinite(maxRecords) && maxRecords >= 1 ? Math.floor(maxRecords) : 1;\n }\n\n /**\n * The number of records currently retained.\n */\n public get size(): number {\n return this._count;\n }\n\n /**\n * The highest `seq` pushed so far. A client can hold this value and pass it as\n * `sinceSeq` to page only records pushed afterward. Stable across eviction and\n * {@link RetainingRingBuffer.clear | clear()}.\n */\n public get lastSeq(): number {\n return this._lastSeq;\n }\n\n /**\n * The retained records, oldest-first.\n */\n public get records(): ReadonlyArray<T> {\n return this._toOrderedArray();\n }\n\n /**\n * Retains a record, evicting the oldest if the ring is full.\n * @param record - The record to retain. Its `seq` should be greater than the\n * `seq` of the previously-pushed record so cursor paging stays monotonic.\n * @returns The same record, for call-site chaining.\n */\n public push(record: T): T {\n if (record.seq > this._lastSeq) {\n this._lastSeq = record.seq;\n }\n if (this._count < this._capacity) {\n // Still filling: append to the next free slot (head stays 0 during this phase).\n this._buffer.push(record);\n this._count += 1;\n } else {\n // Full: overwrite the oldest record in place and advance the head.\n this._buffer[this._head] = record;\n this._head = (this._head + 1) % this._capacity;\n }\n return record;\n }\n\n /**\n * Returns retained records, oldest-first, optionally filtered and paged.\n * @param query - {@link IRetainingRingBufferQuery | Filtering and paging options}.\n * @returns The matching records, oldest-first.\n */\n public query(query?: IRetainingRingBufferQuery<T>): ReadonlyArray<T> {\n let result: ReadonlyArray<T> = this._toOrderedArray();\n if (query?.sinceSeq !== undefined) {\n const sinceSeq = query.sinceSeq;\n result = result.filter((r) => r.seq > sinceSeq);\n }\n if (query?.filter !== undefined) {\n result = result.filter(query.filter);\n }\n if (query?.limit !== undefined && result.length > query.limit) {\n result = result.slice(result.length - query.limit);\n }\n return result;\n }\n\n /**\n * Clears all retained records. Does NOT reset {@link RetainingRingBuffer.lastSeq | lastSeq},\n * so a client holding a `sinceSeq` cursor never re-sees a sequence number.\n */\n public clear(): void {\n this._buffer = [];\n this._head = 0;\n this._count = 0;\n }\n\n /**\n * Materializes the ring into a plain oldest-first array.\n * @internal\n */\n private _toOrderedArray(): T[] {\n const result: T[] = [];\n for (let i = 0; i < this._count; i++) {\n result.push(this._buffer[(this._head + i) % this._capacity]);\n }\n return result;\n }\n}\n"]}
@@ -77,10 +77,13 @@ export declare class BaseConverter<T, TC = unknown> implements Converter<T, TC>
77
77
  * @param from - The `unknown` to be converted
78
78
  * @param context - An optional conversion context of type `<TC>` to be used in
79
79
  * the conversion.
80
+ * @param selfOverride - An optional override for the `self` reference passed to the
81
+ * converter function, enabling outer converters (e.g. discriminated-object) to thread
82
+ * themselves through to per-arm converters for recursive parsing.
80
83
  * @returns A {@link Result} with a {@link Success} and a value on success or an
81
84
  * {@link Failure} with a a message on failure.
82
85
  */
83
- convert(from: unknown, context?: TC): Result<T>;
86
+ convert(from: unknown, context?: TC, selfOverride?: Converter<T, TC>): Result<T>;
84
87
  /**
85
88
  * Converts from `unknown` to `<T>` or `undefined`, as appropriate.
86
89
  *
@@ -1 +1 @@
1
- {"version":3,"file":"baseConverter.d.ts","sourceRoot":"","sources":["../../../src/packlets/conversion/baseConverter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"baseConverter.d.ts","sourceRoot":"","sources":["../../../src/packlets/conversion/baseConverter.ts"],"names":[],"mappings":"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"}
@@ -64,11 +64,14 @@ class BaseConverter {
64
64
  * @param from - The `unknown` to be converted
65
65
  * @param context - An optional conversion context of type `<TC>` to be used in
66
66
  * the conversion.
67
+ * @param selfOverride - An optional override for the `self` reference passed to the
68
+ * converter function, enabling outer converters (e.g. discriminated-object) to thread
69
+ * themselves through to per-arm converters for recursive parsing.
67
70
  * @returns A {@link Result} with a {@link Success} and a value on success or an
68
71
  * {@link Failure} with a a message on failure.
69
72
  */
70
- convert(from, context) {
71
- return this._converter(from, this, context !== null && context !== void 0 ? context : this._defaultContext);
73
+ convert(from, context, selfOverride) {
74
+ return this._converter(from, selfOverride !== null && selfOverride !== void 0 ? selfOverride : this, context !== null && context !== void 0 ? context : this._defaultContext);
72
75
  }
73
76
  /**
74
77
  * Converts from `unknown` to `<T>` or `undefined`, as appropriate.
@@ -1 +1 @@
1
- {"version":3,"file":"baseConverter.js","sourceRoot":"","sources":["../../../src/packlets/conversion/baseConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { Brand, Result, fail, mapResults, succeed } from '../base';\nimport {\n ConstraintOptions,\n ConversionErrorFormatter,\n Converter,\n ConverterTraits,\n DefaultingConverter,\n OnError\n} from './converter';\nimport { GenericDefaultingConverter } from './defaultingConverter';\n\n/**\n * Internal helper that recursively unwraps converter and array types.\n * @internal\n */\ntype InnerInferredType<TCONV> = TCONV extends Converter<infer TTO>\n ? TTO extends Array<infer TTOELEM>\n ? InnerInferredType<TTOELEM>[]\n : TTO\n : TCONV extends Array<infer TELEM>\n ? InnerInferredType<TELEM>[]\n : TCONV;\n\n/**\n * Infers the type that will be returned by an instantiated converter. Works\n * for complex as well as simple types, including nested arrays.\n * @example `Infer<typeof Converters.mapOf(Converters.stringArray)>` is `Map<string, string[]>`\n * @public\n */\nexport type Infer<TCONV> = TCONV extends Converter<infer TTO, unknown> ? InnerInferredType<TTO> : never;\n\n/**\n * Deprecated name for {@link Conversion.Infer | Infer\n * } retained for compatibility.\n * @deprecated Use {@link Conversion.Infer | Infer} instead.\n * @public\n */\nexport type ConvertedToType<TCONV> = Infer<TCONV>;\n\n/**\n * Helper type to extract the result type from a {@link Converter | Converter}.\n * For simple single-level extraction. For complex nested types, use {@link Conversion.Infer | Infer}.\n * @public\n */\nexport type ConverterResultType<C> = C extends Converter<infer T, unknown> ? T : never;\n\n/**\n * Helper type to map a tuple of {@link Converter | Converters} to a tuple of their result types.\n * @public\n */\nexport type ConverterResultTypes<T extends readonly Converter<unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Converter<infer R, unknown> ? R : never;\n};\n\n/**\n * Function signature for a converter function.\n * @public\n */\nexport type ConverterFunc<T, TC> = (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>;\n\n/**\n * Base templated wrapper to simplify creation of new {@link Converter}s.\n * @public\n */\nexport class BaseConverter<T, TC = unknown> implements Converter<T, TC> {\n /**\n * @internal\n */\n protected readonly _defaultContext?: TC;\n /**\n * @internal\n */\n protected _isOptional: boolean = false;\n /**\n * @internal\n */\n protected _brand?: string;\n\n private readonly _converter: (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>;\n\n /**\n * Constructs a new {@link Converter} which uses the supplied function to perform the conversion.\n * @param converter - The conversion function to be applied.\n * @param defaultContext - Optional conversion context to be used by default.\n * @param traits - Optional {@link Conversion.ConverterTraits | traits} to be assigned to the resulting\n * converter.\n */\n public constructor(converter: ConverterFunc<T, TC>, defaultContext?: TC, traits?: ConverterTraits) {\n this._converter = converter;\n this._defaultContext = defaultContext;\n this._isOptional = traits?.isOptional === true;\n this._brand = traits?.brand;\n }\n\n /**\n * Indicates whether this element is explicitly optional.\n */\n public get isOptional(): boolean {\n return this._isOptional;\n }\n\n /**\n * Returns the brand for a branded type.\n */\n public get brand(): string | undefined {\n return this._brand;\n }\n\n /**\n * Converts from `unknown` to `<T>`. For objects and arrays, is guaranteed\n * to return a new entity, with any unrecognized properties removed.\n * @param from - The `unknown` to be converted\n * @param context - An optional conversion context of type `<TC>` to be used in\n * the conversion.\n * @returns A {@link Result} with a {@link Success} and a value on success or an\n * {@link Failure} with a a message on failure.\n */\n public convert(from: unknown, context?: TC): Result<T> {\n return this._converter(from, this, context ?? this._defaultContext);\n }\n\n /**\n * Converts from `unknown` to `<T>` or `undefined`, as appropriate.\n *\n * @remarks\n * If `onError` is `failOnError`, the converter succeeds for\n * `undefined` or any convertible value, but reports an error\n * if it encounters a value that cannot be converted.\n *\n * If `onError` is `ignoreErrors` (default) then values that\n * cannot be converted result in a successful return of `undefined`.\n * @param from - The `unknown` to be converted\n * @param context - An optional conversion context of type `<TC>` to be used in\n * the conversion.\n * @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).\n * @returns A {@link Result} with a {@link Success} and a value on success or an\n * {@link Failure} with a a message on failure.\n */\n public convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined> {\n const result = this._converter(from, this, this._context(context));\n if (result.isFailure()) {\n onError = onError ?? 'ignoreErrors';\n return from === undefined || onError === 'ignoreErrors' ? succeed(undefined) : result;\n }\n return result;\n }\n\n /**\n * Creates a {@link Converter} for an optional value.\n *\n * @remarks\n * If `onError` is `failOnError`, the resulting converter will accept `undefined`\n * or a convertible value, but report an error if it encounters a value that cannot be\n * converted.\n *\n * If `onError` is `ignoreErrors` (default) then values that cannot be converted will\n * result in a successful return of `undefined`.\n *\n * @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).\n * @returns A new {@link Converter} returning `<T|undefined>`.\n */\n public optional(onError?: OnError): Converter<T | undefined, TC> {\n return new BaseConverter((from: unknown, __self: Converter<T | undefined, TC>, context?: TC) => {\n onError = onError ?? 'failOnError';\n return this.convertOptional(from, this._context(context), onError);\n })._with(this._traits({ isOptional: true }));\n }\n\n /**\n * Creates a {@link Converter} which applies a (possibly) mapping conversion to\n * the converted value of this {@link Converter}.\n * @param mapper - A function which maps from the the result type `<T>` of this\n * converter to a new result type `<T2>`.\n * @returns A new {@link Converter} returning `<T2>`.\n */\n public map<T2>(mapper: (from: T, context?: TC) => Result<T2>): Converter<T2, TC> {\n return new BaseConverter<T2, TC>((from: unknown, __self: Converter<T2, TC>, context?: TC) => {\n const innerResult = this._converter(from, this, this._context(context));\n if (innerResult.isSuccess()) {\n return mapper(innerResult.value, this._context(context));\n }\n return fail(innerResult.message);\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies an additional supplied\n * converter to the result of this converter.\n *\n * @param mapConverter - The {@link Converter} to be applied to the\n * converted result from this {@link Converter}.\n * @returns A new {@link Converter} returning `<T2>`.\n */\n public mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC> {\n return new BaseConverter<T2, TC>((from: unknown, __self: Converter<T2, TC>, context?: TC) => {\n const innerResult = this._converter(from, this, this._context(context));\n if (innerResult.isSuccess()) {\n return mapConverter.convert(innerResult.value, this._context(context));\n }\n return fail(innerResult.message);\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which maps the individual items of a collection\n * resulting from this {@link Converter} using the supplied map function.\n *\n * @remarks\n * Fails if `from` is not an array.\n *\n * @param mapper - The map function to be applied to each element of the\n * result of this {@link Converter}.\n * @returns A new {@link Converter} returning `<TI[]>`.\n */\n public mapItems<TI>(mapper: (from: unknown, context?: TC) => Result<TI>): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(items.map((i) => mapper(i, this._context(context))));\n }\n return fail('Cannot map items - not an array');\n });\n });\n }\n\n /**\n * Creates a {@link Converter} which maps the individual items of a collection\n * resulting from this {@link Converter} using the supplied {@link Converter}.\n *\n * @remarks\n * Fails if `from` is not an array.\n *\n * @param mapConverter - The {@link Converter} to be applied to each element of the\n * result of this {@link Converter}.\n * @returns A new {@link Converter} returning `<TI[]>`.\n */\n public mapConvertItems<TI>(mapConverter: Converter<TI, unknown>): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(items.map((i) => mapConverter.convert(i, this._context(context))));\n }\n return fail('Cannot map items - not an array');\n });\n });\n }\n\n /**\n * Creates a {@link Converter | Converter} which applies a supplied action after\n * conversion. The supplied action is always called regardless of success or failure\n * of the base conversion and is allowed to mutate the return type.\n * @param action - The action to be applied.\n */\n public withAction<TI>(action: (result: Result<T>, context?: TC) => Result<TI>): Converter<TI, TC> {\n return new BaseConverter<TI, TC>((from: unknown, __self: Converter<TI, TC>, context?: TC) => {\n return action(this._converter(from, this, this._context(context)), this._context(context));\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies a supplied type guard to the conversion\n * result.\n * @param guard - The type guard function to apply.\n * @param message - Optional message to be reported if the type guard fails.\n * @returns A new {@link Converter} returning `<TI>`.\n */\n public withTypeGuard<TI>(\n guard: (from: unknown, context?: TC) => from is TI,\n message?: string\n ): Converter<TI, TC> {\n return new BaseConverter<TI, TC>((from: unknown, __self: Converter<TI, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((inner) => {\n message = message ?? 'invalid type';\n return guard(inner, this._context(context))\n ? succeed(inner)\n : fail(`${message}: ${JSON.stringify(from)}`);\n });\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies a supplied type guard to each member of\n * the conversion result from this converter.\n *\n * @remarks\n * Fails if the conversion result is not an array or if any member fails the\n * type guard.\n * @param guard - The type guard function to apply to each element.\n * @param message - Optional message to be reported if the type guard fails.\n * @returns A new {@link Converter} returning `<TI>`.\n */\n public withItemTypeGuard<TI>(\n guard: (from: unknown, context?: TC) => from is TI,\n message?: string\n ): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(\n items.map((i) => {\n message = message ?? 'invalid type';\n return guard(i, this._context(context))\n ? succeed(i)\n : fail(`${message}: ${JSON.stringify(from)}`);\n })\n );\n }\n return fail('Cannot guard item type - not an array');\n });\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies an optional constraint to the result\n * of this conversion. If this {@link Converter} (the base converter) succeeds, the new\n * converter calls a supplied constraint evaluation function with the conversion, which\n * fails the entire conversion if the constraint function returns either `false` or\n * {@link Failure | Failure<T>}.\n *\n * @param constraint - Constraint evaluation function.\n * @param options - {@link Conversion.ConstraintOptions | Options} for constraint evaluation.\n * @returns A new {@link Converter} returning `<T>`.\n */\n public withConstraint(\n constraint: (val: T, context?: TC) => boolean | Result<T>,\n options?: ConstraintOptions\n ): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n const result = this._converter(from, this, this._context(context));\n if (result.isSuccess()) {\n const constraintResult = constraint(result.value, this._context(context));\n if (typeof constraintResult === 'boolean') {\n return constraintResult\n ? result\n : fail(\n `\"${JSON.stringify(result.value)}\": ${options?.description ?? 'does not meet constraint'}`\n );\n }\n return constraintResult;\n }\n return result;\n })._with(this._traits());\n }\n\n /**\n * Returns a converter which adds a brand to the type to prevent mismatched usage\n * of simple types.\n * @param brand - The brand to be applied to the result value.\n * @returns A {@link Converter} returning `Brand<T, B>`.\n */\n public withBrand<B extends string>(brand: B): Converter<Brand<T, B>, TC> {\n if (this._brand) {\n throw new Error(`Cannot replace existing brand \"${this._brand}\" with \"${brand}\".`);\n }\n\n return new BaseConverter<Brand<T, B>, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((v) => {\n return succeed(v as Brand<T, B>);\n });\n })._with(this._traits({ brand }));\n }\n\n /**\n * Returns a Converter which always succeeds with a default value rather than failing.\n * @param defaultValue - The default value to use if conversion fails.\n */\n public withDefault<TD = T>(defaultValue: TD): DefaultingConverter<T, TD, TC> {\n return new GenericDefaultingConverter<T, TD, TC>(this, defaultValue);\n }\n\n public or(other: Converter<T, TC>): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onFailure(() => {\n return other.convert(from, this._context(context));\n });\n });\n }\n\n /**\n * @internal\n */\n protected _context(supplied?: TC): TC | undefined {\n return supplied ?? this._defaultContext;\n }\n\n /**\n * Creates a new {@link Converter} which is derived from this one but which returns an\n * error message formatted by the supplied formatter if the conversion fails.\n * @param formatter - The formatter to be applied.\n * @returns A new {@link Converter} returning `<T>`.\n */\n public withFormattedError(formatter: ConversionErrorFormatter<TC>): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onFailure((msg) => {\n return fail(formatter(from, msg, this._context(context)));\n });\n })._with(this._traits());\n }\n\n /**\n * @internal\n */\n protected _traits(traits?: Partial<ConverterTraits>): ConverterTraits {\n return {\n isOptional: this.isOptional,\n brand: this.brand,\n ...(traits ?? {})\n };\n }\n\n /**\n * @internal\n */\n protected _with(traits: Partial<ConverterTraits>): this {\n this._isOptional = traits.isOptional === true;\n this._brand = traits.brand;\n return this;\n }\n}\n"]}
1
+ {"version":3,"file":"baseConverter.js","sourceRoot":"","sources":["../../../src/packlets/conversion/baseConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { Brand, Result, fail, mapResults, succeed } from '../base';\nimport {\n ConstraintOptions,\n ConversionErrorFormatter,\n Converter,\n ConverterTraits,\n DefaultingConverter,\n OnError\n} from './converter';\nimport { GenericDefaultingConverter } from './defaultingConverter';\n\n/**\n * Internal helper that recursively unwraps converter and array types.\n * @internal\n */\ntype InnerInferredType<TCONV> = TCONV extends Converter<infer TTO>\n ? TTO extends Array<infer TTOELEM>\n ? InnerInferredType<TTOELEM>[]\n : TTO\n : TCONV extends Array<infer TELEM>\n ? InnerInferredType<TELEM>[]\n : TCONV;\n\n/**\n * Infers the type that will be returned by an instantiated converter. Works\n * for complex as well as simple types, including nested arrays.\n * @example `Infer<typeof Converters.mapOf(Converters.stringArray)>` is `Map<string, string[]>`\n * @public\n */\nexport type Infer<TCONV> = TCONV extends Converter<infer TTO, unknown> ? InnerInferredType<TTO> : never;\n\n/**\n * Deprecated name for {@link Conversion.Infer | Infer\n * } retained for compatibility.\n * @deprecated Use {@link Conversion.Infer | Infer} instead.\n * @public\n */\nexport type ConvertedToType<TCONV> = Infer<TCONV>;\n\n/**\n * Helper type to extract the result type from a {@link Converter | Converter}.\n * For simple single-level extraction. For complex nested types, use {@link Conversion.Infer | Infer}.\n * @public\n */\nexport type ConverterResultType<C> = C extends Converter<infer T, unknown> ? T : never;\n\n/**\n * Helper type to map a tuple of {@link Converter | Converters} to a tuple of their result types.\n * @public\n */\nexport type ConverterResultTypes<T extends readonly Converter<unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Converter<infer R, unknown> ? R : never;\n};\n\n/**\n * Function signature for a converter function.\n * @public\n */\nexport type ConverterFunc<T, TC> = (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>;\n\n/**\n * Base templated wrapper to simplify creation of new {@link Converter}s.\n * @public\n */\nexport class BaseConverter<T, TC = unknown> implements Converter<T, TC> {\n /**\n * @internal\n */\n protected readonly _defaultContext?: TC;\n /**\n * @internal\n */\n protected _isOptional: boolean = false;\n /**\n * @internal\n */\n protected _brand?: string;\n\n private readonly _converter: (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>;\n\n /**\n * Constructs a new {@link Converter} which uses the supplied function to perform the conversion.\n * @param converter - The conversion function to be applied.\n * @param defaultContext - Optional conversion context to be used by default.\n * @param traits - Optional {@link Conversion.ConverterTraits | traits} to be assigned to the resulting\n * converter.\n */\n public constructor(converter: ConverterFunc<T, TC>, defaultContext?: TC, traits?: ConverterTraits) {\n this._converter = converter;\n this._defaultContext = defaultContext;\n this._isOptional = traits?.isOptional === true;\n this._brand = traits?.brand;\n }\n\n /**\n * Indicates whether this element is explicitly optional.\n */\n public get isOptional(): boolean {\n return this._isOptional;\n }\n\n /**\n * Returns the brand for a branded type.\n */\n public get brand(): string | undefined {\n return this._brand;\n }\n\n /**\n * Converts from `unknown` to `<T>`. For objects and arrays, is guaranteed\n * to return a new entity, with any unrecognized properties removed.\n * @param from - The `unknown` to be converted\n * @param context - An optional conversion context of type `<TC>` to be used in\n * the conversion.\n * @param selfOverride - An optional override for the `self` reference passed to the\n * converter function, enabling outer converters (e.g. discriminated-object) to thread\n * themselves through to per-arm converters for recursive parsing.\n * @returns A {@link Result} with a {@link Success} and a value on success or an\n * {@link Failure} with a a message on failure.\n */\n public convert(from: unknown, context?: TC, selfOverride?: Converter<T, TC>): Result<T> {\n return this._converter(from, selfOverride ?? this, context ?? this._defaultContext);\n }\n\n /**\n * Converts from `unknown` to `<T>` or `undefined`, as appropriate.\n *\n * @remarks\n * If `onError` is `failOnError`, the converter succeeds for\n * `undefined` or any convertible value, but reports an error\n * if it encounters a value that cannot be converted.\n *\n * If `onError` is `ignoreErrors` (default) then values that\n * cannot be converted result in a successful return of `undefined`.\n * @param from - The `unknown` to be converted\n * @param context - An optional conversion context of type `<TC>` to be used in\n * the conversion.\n * @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).\n * @returns A {@link Result} with a {@link Success} and a value on success or an\n * {@link Failure} with a a message on failure.\n */\n public convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined> {\n const result = this._converter(from, this, this._context(context));\n if (result.isFailure()) {\n onError = onError ?? 'ignoreErrors';\n return from === undefined || onError === 'ignoreErrors' ? succeed(undefined) : result;\n }\n return result;\n }\n\n /**\n * Creates a {@link Converter} for an optional value.\n *\n * @remarks\n * If `onError` is `failOnError`, the resulting converter will accept `undefined`\n * or a convertible value, but report an error if it encounters a value that cannot be\n * converted.\n *\n * If `onError` is `ignoreErrors` (default) then values that cannot be converted will\n * result in a successful return of `undefined`.\n *\n * @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).\n * @returns A new {@link Converter} returning `<T|undefined>`.\n */\n public optional(onError?: OnError): Converter<T | undefined, TC> {\n return new BaseConverter((from: unknown, __self: Converter<T | undefined, TC>, context?: TC) => {\n onError = onError ?? 'failOnError';\n return this.convertOptional(from, this._context(context), onError);\n })._with(this._traits({ isOptional: true }));\n }\n\n /**\n * Creates a {@link Converter} which applies a (possibly) mapping conversion to\n * the converted value of this {@link Converter}.\n * @param mapper - A function which maps from the the result type `<T>` of this\n * converter to a new result type `<T2>`.\n * @returns A new {@link Converter} returning `<T2>`.\n */\n public map<T2>(mapper: (from: T, context?: TC) => Result<T2>): Converter<T2, TC> {\n return new BaseConverter<T2, TC>((from: unknown, __self: Converter<T2, TC>, context?: TC) => {\n const innerResult = this._converter(from, this, this._context(context));\n if (innerResult.isSuccess()) {\n return mapper(innerResult.value, this._context(context));\n }\n return fail(innerResult.message);\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies an additional supplied\n * converter to the result of this converter.\n *\n * @param mapConverter - The {@link Converter} to be applied to the\n * converted result from this {@link Converter}.\n * @returns A new {@link Converter} returning `<T2>`.\n */\n public mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC> {\n return new BaseConverter<T2, TC>((from: unknown, __self: Converter<T2, TC>, context?: TC) => {\n const innerResult = this._converter(from, this, this._context(context));\n if (innerResult.isSuccess()) {\n return mapConverter.convert(innerResult.value, this._context(context));\n }\n return fail(innerResult.message);\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which maps the individual items of a collection\n * resulting from this {@link Converter} using the supplied map function.\n *\n * @remarks\n * Fails if `from` is not an array.\n *\n * @param mapper - The map function to be applied to each element of the\n * result of this {@link Converter}.\n * @returns A new {@link Converter} returning `<TI[]>`.\n */\n public mapItems<TI>(mapper: (from: unknown, context?: TC) => Result<TI>): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(items.map((i) => mapper(i, this._context(context))));\n }\n return fail('Cannot map items - not an array');\n });\n });\n }\n\n /**\n * Creates a {@link Converter} which maps the individual items of a collection\n * resulting from this {@link Converter} using the supplied {@link Converter}.\n *\n * @remarks\n * Fails if `from` is not an array.\n *\n * @param mapConverter - The {@link Converter} to be applied to each element of the\n * result of this {@link Converter}.\n * @returns A new {@link Converter} returning `<TI[]>`.\n */\n public mapConvertItems<TI>(mapConverter: Converter<TI, unknown>): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(items.map((i) => mapConverter.convert(i, this._context(context))));\n }\n return fail('Cannot map items - not an array');\n });\n });\n }\n\n /**\n * Creates a {@link Converter | Converter} which applies a supplied action after\n * conversion. The supplied action is always called regardless of success or failure\n * of the base conversion and is allowed to mutate the return type.\n * @param action - The action to be applied.\n */\n public withAction<TI>(action: (result: Result<T>, context?: TC) => Result<TI>): Converter<TI, TC> {\n return new BaseConverter<TI, TC>((from: unknown, __self: Converter<TI, TC>, context?: TC) => {\n return action(this._converter(from, this, this._context(context)), this._context(context));\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies a supplied type guard to the conversion\n * result.\n * @param guard - The type guard function to apply.\n * @param message - Optional message to be reported if the type guard fails.\n * @returns A new {@link Converter} returning `<TI>`.\n */\n public withTypeGuard<TI>(\n guard: (from: unknown, context?: TC) => from is TI,\n message?: string\n ): Converter<TI, TC> {\n return new BaseConverter<TI, TC>((from: unknown, __self: Converter<TI, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((inner) => {\n message = message ?? 'invalid type';\n return guard(inner, this._context(context))\n ? succeed(inner)\n : fail(`${message}: ${JSON.stringify(from)}`);\n });\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies a supplied type guard to each member of\n * the conversion result from this converter.\n *\n * @remarks\n * Fails if the conversion result is not an array or if any member fails the\n * type guard.\n * @param guard - The type guard function to apply to each element.\n * @param message - Optional message to be reported if the type guard fails.\n * @returns A new {@link Converter} returning `<TI>`.\n */\n public withItemTypeGuard<TI>(\n guard: (from: unknown, context?: TC) => from is TI,\n message?: string\n ): Converter<TI[], TC> {\n return new BaseConverter<TI[], TC>((from: unknown, __self: Converter<TI[], TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((items) => {\n if (Array.isArray(items)) {\n return mapResults(\n items.map((i) => {\n message = message ?? 'invalid type';\n return guard(i, this._context(context))\n ? succeed(i)\n : fail(`${message}: ${JSON.stringify(from)}`);\n })\n );\n }\n return fail('Cannot guard item type - not an array');\n });\n })._with(this._traits());\n }\n\n /**\n * Creates a {@link Converter} which applies an optional constraint to the result\n * of this conversion. If this {@link Converter} (the base converter) succeeds, the new\n * converter calls a supplied constraint evaluation function with the conversion, which\n * fails the entire conversion if the constraint function returns either `false` or\n * {@link Failure | Failure<T>}.\n *\n * @param constraint - Constraint evaluation function.\n * @param options - {@link Conversion.ConstraintOptions | Options} for constraint evaluation.\n * @returns A new {@link Converter} returning `<T>`.\n */\n public withConstraint(\n constraint: (val: T, context?: TC) => boolean | Result<T>,\n options?: ConstraintOptions\n ): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n const result = this._converter(from, this, this._context(context));\n if (result.isSuccess()) {\n const constraintResult = constraint(result.value, this._context(context));\n if (typeof constraintResult === 'boolean') {\n return constraintResult\n ? result\n : fail(\n `\"${JSON.stringify(result.value)}\": ${options?.description ?? 'does not meet constraint'}`\n );\n }\n return constraintResult;\n }\n return result;\n })._with(this._traits());\n }\n\n /**\n * Returns a converter which adds a brand to the type to prevent mismatched usage\n * of simple types.\n * @param brand - The brand to be applied to the result value.\n * @returns A {@link Converter} returning `Brand<T, B>`.\n */\n public withBrand<B extends string>(brand: B): Converter<Brand<T, B>, TC> {\n if (this._brand) {\n throw new Error(`Cannot replace existing brand \"${this._brand}\" with \"${brand}\".`);\n }\n\n return new BaseConverter<Brand<T, B>, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onSuccess((v) => {\n return succeed(v as Brand<T, B>);\n });\n })._with(this._traits({ brand }));\n }\n\n /**\n * Returns a Converter which always succeeds with a default value rather than failing.\n * @param defaultValue - The default value to use if conversion fails.\n */\n public withDefault<TD = T>(defaultValue: TD): DefaultingConverter<T, TD, TC> {\n return new GenericDefaultingConverter<T, TD, TC>(this, defaultValue);\n }\n\n public or(other: Converter<T, TC>): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onFailure(() => {\n return other.convert(from, this._context(context));\n });\n });\n }\n\n /**\n * @internal\n */\n protected _context(supplied?: TC): TC | undefined {\n return supplied ?? this._defaultContext;\n }\n\n /**\n * Creates a new {@link Converter} which is derived from this one but which returns an\n * error message formatted by the supplied formatter if the conversion fails.\n * @param formatter - The formatter to be applied.\n * @returns A new {@link Converter} returning `<T>`.\n */\n public withFormattedError(formatter: ConversionErrorFormatter<TC>): Converter<T, TC> {\n return new BaseConverter<T, TC>((from: unknown, __self: Converter<T, TC>, context?: TC) => {\n return this._converter(from, this, this._context(context)).onFailure((msg) => {\n return fail(formatter(from, msg, this._context(context)));\n });\n })._with(this._traits());\n }\n\n /**\n * @internal\n */\n protected _traits(traits?: Partial<ConverterTraits>): ConverterTraits {\n return {\n isOptional: this.isOptional,\n brand: this.brand,\n ...(traits ?? {})\n };\n }\n\n /**\n * @internal\n */\n protected _with(traits: Partial<ConverterTraits>): this {\n this._isOptional = traits.isOptional === true;\n this._brand = traits.brand;\n return this;\n }\n}\n"]}
@@ -460,6 +460,9 @@ export type DiscriminatedObjectConverters<T, TD extends string = string, TC = un
460
460
  *
461
461
  * If the source is not an object, the discriminator property is missing, or the discriminator has
462
462
  * a value not present in the converters, conversion fails and returns {@link Failure | Failure} with more information.
463
+ *
464
+ * The `self` reference of the outer converter is threaded through to per-arm converter invocations,
465
+ * enabling recursive discriminated-union parsers where arms recurse via `self`.
463
466
  * @param discriminatorProp - Name of the property used to discriminate types.
464
467
  * @param converters - {@link Converters.DiscriminatedObjectConverters | String-keyed record of converters and validators}
465
468
  * to invoke, where each key corresponds to a value of the discriminator property.
@@ -1 +1 @@
1
- {"version":3,"file":"basicConverters.d.ts","sourceRoot":"","sources":["../../../src/packlets/conversion/basicConverters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"basicConverters.d.ts","sourceRoot":"","sources":["../../../src/packlets/conversion/basicConverters.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAA0B,MAAM,eAAe,CAAC;AACxF,OAAO,EAAiB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE,eAAuC,CAAC;AAE7D;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAQ3F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACnD,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAC1C,OAAO,CAAC,EAAE,MAAM,GACf,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAejC;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAQnE;AAED;;;;;GAKG;AAEH,eAAO,MAAM,KAAK,gBAAU,CAAC;AAE7B;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAM5C,CAAC;AAgBH;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAoB,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,CAAqB,CAAC;AAExF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,UAAU,GAAG,KAAkB,GACvC,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAc7B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,EAC/B,oBAAoB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GACxD,oBAAoB,IAAI,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAE1C;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACvC,oBAAoB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GACxD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAOlB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACzC,oBAAoB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GACxD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAUlB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAExF;AAED;;;;;;;GAOG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,GACjC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAOlB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,CAAqB,CAAC;AAExF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,EAAE,OAAO,CAA+B,CAAC;AAEpG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACnC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACtD,OAAO,GAAE,OAAwB,GAChC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAkBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACrC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAC9C,OAAO,GAAE,OAAuB,GAC/B,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAmBpB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,CAAmB,CAAC;AAEzE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,CAAmB,CAAC;AAEzE;;;;;GAKG;AAEH,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,OAAO;IAC5E;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAClE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAClE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAC9C,OAAO,EAAE,MAAM,GAAG,QAAQ,GACzB,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAClE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAC9C,OAAO,EAAE,qBAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,GACrC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AA4ChC;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAC/D,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAC/D,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAC9C,OAAO,EAAE,MAAM,GAAG,QAAQ,GACzB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE7B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAC/D,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAC9C,OAAO,EAAE,qBAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,GACrC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AA2C7B;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC,EACvC,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAOlB;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACrC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAWlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAC7C,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAW9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAYlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAC3C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAuB9B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACpC,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,EAClC,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAClC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EACpC,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,EAClC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GACpB,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAc1B;;;GAGG;AACH,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAExF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAC1C,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,EAClC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACxC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAC1C,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,EAClC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GACpB,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAiB1B;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CAAC,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,OAAO,IAAI,MAAM,CAC7F,EAAE,EACF,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,OAAO,EAC7E,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,6BAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,GAC/C,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAqBlB"}
@@ -570,6 +570,9 @@ function strictObject(properties, opt) {
570
570
  *
571
571
  * If the source is not an object, the discriminator property is missing, or the discriminator has
572
572
  * a value not present in the converters, conversion fails and returns {@link Failure | Failure} with more information.
573
+ *
574
+ * The `self` reference of the outer converter is threaded through to per-arm converter invocations,
575
+ * enabling recursive discriminated-union parsers where arms recurse via `self`.
573
576
  * @param discriminatorProp - Name of the property used to discriminate types.
574
577
  * @param converters - {@link Converters.DiscriminatedObjectConverters | String-keyed record of converters and validators}
575
578
  * to invoke, where each key corresponds to a value of the discriminator property.
@@ -577,7 +580,7 @@ function strictObject(properties, opt) {
577
580
  * @public
578
581
  */
579
582
  function discriminatedObject(discriminatorProp, converters) {
580
- return new baseConverter_1.BaseConverter((from) => {
583
+ return new baseConverter_1.BaseConverter((from, self, context) => {
581
584
  if (typeof from !== 'object' || Array.isArray(from) || from === null) {
582
585
  return (0, base_1.fail)(`Not a discriminated object: "${JSON.stringify(from)}"`);
583
586
  }
@@ -585,11 +588,16 @@ function discriminatedObject(discriminatorProp, converters) {
585
588
  return (0, base_1.fail)(`Discriminator property ${discriminatorProp} not present in "${JSON.stringify(from)}"`);
586
589
  }
587
590
  const discriminatorValue = from[discriminatorProp];
588
- const converter = converters[discriminatorValue];
589
- if (converter === undefined) {
591
+ const arm = converters[discriminatorValue];
592
+ if (arm === undefined) {
590
593
  return (0, base_1.fail)(`No converter for discriminator ${discriminatorProp}="${discriminatorValue}"`);
591
594
  }
592
- return converter.convert(from);
595
+ // Thread the outer self and context through to the arm so that recursive
596
+ // discriminated-union parsers can reach the outer dispatcher via self.
597
+ if (isValidator(arm)) {
598
+ return arm.convert(from, context);
599
+ }
600
+ return arm.convert(from, context, self);
593
601
  });
594
602
  }
595
603
  //# sourceMappingURL=basicConverters.js.map