sqs-partial-batch-processor 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -4
- package/lib/index.d.ts +7 -1
- package/lib/index.js +32 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -17,9 +17,10 @@ This library intentionally does **not** parse message bodies, validate schemas,
|
|
|
17
17
|
|
|
18
18
|
## Requirements
|
|
19
19
|
|
|
20
|
-
- Node.js **20+**
|
|
20
|
+
- Node.js **20+** (runtime requirement)
|
|
21
|
+
- Module system: published as **CommonJS** (`"module": "CommonJS"`). Usable from both CJS and ESM runtimes.
|
|
21
22
|
- Lambda SQS event source mapping has **Report batch item failures** enabled.
|
|
22
|
-
See
|
|
23
|
+
See: [AWS Lambda SQS error handling docs](https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting)
|
|
23
24
|
|
|
24
25
|
## Installation
|
|
25
26
|
|
|
@@ -63,9 +64,38 @@ export const handler = async (event: SQSEvent) =>
|
|
|
63
64
|
|
|
64
65
|
Both `processPartialBatch` and `processPartialBatchWithResult` accept an optional `options` object:
|
|
65
66
|
|
|
66
|
-
- `concurrency?: number` (default: `1`):
|
|
67
|
-
- `
|
|
67
|
+
- `concurrency?: number` (default: `1`): maximum parallelism. Must be a finite integer `>= 1` (`1` = sequential, `> 1` = bounded concurrency). If invalid, the function throws (`RangeError` for `< 1`, `TypeError` for non-integer / non-finite).
|
|
68
|
+
- **Tip**: start with `1` and increase gradually while watching downstream limits (external API rate limits, DB connection pools, and Lambda reserved concurrency). SQS batches are typically small, so a large value rarely helps.
|
|
69
|
+
- **Note**: when `concurrency > 1`, the order of `batchItemFailures` is **not guaranteed**. Tests should compare as a set, not by array order.
|
|
70
|
+
- `onRecordError?: (record, error) => void`: called when a record is treated as failed (useful for structured logs / metrics).
|
|
71
|
+
- Example (structured log / metrics hook):
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { processPartialBatch } from 'sqs-partial-batch-processor';
|
|
75
|
+
import type { SQSEvent } from 'aws-lambda';
|
|
76
|
+
|
|
77
|
+
export const handler = async (event: SQSEvent) =>
|
|
78
|
+
processPartialBatch(
|
|
79
|
+
event,
|
|
80
|
+
async (record) => {
|
|
81
|
+
// ...
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
onRecordError: (record, error) => {
|
|
85
|
+
console.log(JSON.stringify({
|
|
86
|
+
level: 'error',
|
|
87
|
+
msg: 'record failed',
|
|
88
|
+
messageId: record.messageId,
|
|
89
|
+
// Avoid logging sensitive contents from record.body.
|
|
90
|
+
error: error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) },
|
|
91
|
+
}));
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
68
97
|
- `mapMessageId?: (record) => string`: customize the `itemIdentifier` (defaults to `record.messageId`).
|
|
98
|
+
- Typical uses: align the identifier with an **application-level id** (e.g., an id stored in `messageAttributes` or the parsed payload), or normalize identifiers across FIFO/standard queues for easier correlation.
|
|
69
99
|
|
|
70
100
|
## License
|
|
71
101
|
|
package/lib/index.d.ts
CHANGED
|
@@ -4,7 +4,13 @@ import type { SQSBatchResponse, SQSEvent, SQSRecord } from 'aws-lambda';
|
|
|
4
4
|
*/
|
|
5
5
|
export interface ProcessPartialBatchOptions {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Maximum number of records processed in parallel.
|
|
8
|
+
*
|
|
9
|
+
* - `1`: sequential processing
|
|
10
|
+
* - `> 1`: bounded concurrency pool (order of `batchItemFailures` is not guaranteed)
|
|
11
|
+
*
|
|
12
|
+
* @throws {RangeError} When `concurrency` is less than 1.
|
|
13
|
+
* @throws {TypeError} When `concurrency` is not a finite integer.
|
|
8
14
|
* Order of entries in {@link SQSBatchResponse.batchItemFailures} is not guaranteed.
|
|
9
15
|
* @default 1
|
|
10
16
|
*/
|
package/lib/index.js
CHANGED
|
@@ -1,18 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.processPartialBatchWithResult = exports.processPartialBatch = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a single `batchItemFailures` entry for a failed record.
|
|
6
|
+
* @param itemIdentifier The identifier reported back to Lambda.
|
|
7
|
+
*/
|
|
4
8
|
const itemFailure = (itemIdentifier) => ({
|
|
5
9
|
itemIdentifier,
|
|
6
10
|
});
|
|
11
|
+
/**
|
|
12
|
+
* Resolves and validates the `concurrency` option.
|
|
13
|
+
*
|
|
14
|
+
* @param value User-provided concurrency.
|
|
15
|
+
* @returns A validated concurrency value (defaults to `1`).
|
|
16
|
+
* @throws {RangeError} When `value` is less than 1.
|
|
17
|
+
* @throws {TypeError} When `value` is not a finite integer.
|
|
18
|
+
*/
|
|
19
|
+
const resolveConcurrency = (value) => {
|
|
20
|
+
if (value === undefined) {
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
if (!Number.isFinite(value) || !Number.isInteger(value)) {
|
|
24
|
+
throw new TypeError('concurrency must be a finite integer');
|
|
25
|
+
}
|
|
26
|
+
if (value < 1) {
|
|
27
|
+
throw new RangeError('concurrency must be >= 1');
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
7
31
|
/**
|
|
8
32
|
* Runs `fn` over `items` with at most `concurrency` parallel workers.
|
|
9
33
|
* Each worker pulls the next index until none remain.
|
|
34
|
+
*
|
|
35
|
+
* @param items Items to process.
|
|
36
|
+
* @param concurrency Maximum parallel workers (must be `>= 1`).
|
|
37
|
+
* @param fn Async handler invoked for each item.
|
|
10
38
|
*/
|
|
11
39
|
const runWithConcurrency = async (items, concurrency, fn) => {
|
|
12
40
|
if (items.length === 0) {
|
|
13
41
|
return;
|
|
14
42
|
}
|
|
15
|
-
const limit = Math.min(
|
|
43
|
+
const limit = Math.min(concurrency, items.length);
|
|
16
44
|
let next = 0;
|
|
17
45
|
const takeNextIndex = () => {
|
|
18
46
|
const index = next;
|
|
@@ -43,7 +71,7 @@ const runWithConcurrency = async (items, concurrency, fn) => {
|
|
|
43
71
|
* `batchItemFailures`; successful records are not listed.
|
|
44
72
|
*/
|
|
45
73
|
const processPartialBatch = async (event, processRecord, options) => {
|
|
46
|
-
const concurrency = options?.concurrency
|
|
74
|
+
const concurrency = resolveConcurrency(options?.concurrency);
|
|
47
75
|
const batchItemFailures = [];
|
|
48
76
|
const handle = async (record) => {
|
|
49
77
|
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
@@ -73,7 +101,7 @@ exports.processPartialBatch = processPartialBatch;
|
|
|
73
101
|
* If `processRecord` throws, the record is still treated as failed and `onRecordError` is invoked when set.
|
|
74
102
|
*/
|
|
75
103
|
const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
76
|
-
const concurrency = options?.concurrency
|
|
104
|
+
const concurrency = resolveConcurrency(options?.concurrency);
|
|
77
105
|
const batchItemFailures = [];
|
|
78
106
|
const handle = async (record) => {
|
|
79
107
|
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
@@ -107,4 +135,4 @@ const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
|
107
135
|
return { batchItemFailures };
|
|
108
136
|
};
|
|
109
137
|
exports.processPartialBatchWithResult = processPartialBatchWithResult;
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeUJBLE1BQU0sV0FBVyxHQUFHLENBQUMsY0FBc0IsRUFBOEIsRUFBRSxDQUFDLENBQUM7SUFDM0UsY0FBYztDQUNmLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixLQUFtQixFQUNuQixXQUFtQixFQUNuQixFQUE4QixFQUNmLEVBQUU7SUFDakIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRWIsTUFBTSxhQUFhLEdBQUcsR0FBdUIsRUFBRTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNWLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDaEMsT0FBTyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7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QUM7UUFDRCxJQUFJLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7SUFFRixJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUM7QUF0Q1csUUFBQSw2QkFBNkIsaUNBc0N4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSwgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSBhbmQge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIGdyZWF0ZXIgdGhhbiAxLCByZWNvcmRzIGFyZSBwcm9jZXNzZWQgd2l0aCBhIGJvdW5kZWQgY29uY3VycmVuY3kgcG9vbC5cbiAgICogT3JkZXIgb2YgZW50cmllcyBpbiB7QGxpbmsgU1FTQmF0Y2hSZXNwb25zZS5iYXRjaEl0ZW1GYWlsdXJlc30gaXMgbm90IGd1YXJhbnRlZWQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHJlY29yZCBpcyB0cmVhdGVkIGFzIGZhaWxlZCAodGhyb3duIGVycm9yIG9yIGB7IG9rOiBmYWxzZSB9YCkuXG4gICAqIFVzZSBmb3IgbG9nZ2luZzsgdGhlIGxpYnJhcnkgZG9lcyBub3Qgd3JpdGUgdG8gYGNvbnNvbGVgIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBvblJlY29yZEVycm9yPzogKHJlY29yZDogU1FTUmVjb3JkLCBlcnJvcjogdW5rbm93bikgPT4gdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIGBpdGVtSWRlbnRpZmllcmAgZm9yIGEgcmVjb3JkLiBEZWZhdWx0cyB0byBgcmVjb3JkLm1lc3NhZ2VJZGAuXG4gICAqL1xuICByZWFkb25seSBtYXBNZXNzYWdlSWQ/OiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IHN0cmluZztcbn1cblxuY29uc3QgaXRlbUZhaWx1cmUgPSAoaXRlbUlkZW50aWZpZXI6IHN0cmluZyk6IHsgaXRlbUlkZW50aWZpZXI6IHN0cmluZyB9ID0+ICh7XG4gIGl0ZW1JZGVudGlmaWVyLFxufSk7XG5cbi8qKlxuICogUnVucyBgZm5gIG92ZXIgYGl0ZW1zYCB3aXRoIGF0IG1vc3QgYGNvbmN1cnJlbmN5YCBwYXJhbGxlbCB3b3JrZXJzLlxuICogRWFjaCB3b3JrZXIgcHVsbHMgdGhlIG5leHQgaW5kZXggdW50aWwgbm9uZSByZW1haW4uXG4gKi9cbmNvbnN0IHJ1bldpdGhDb25jdXJyZW5jeSA9IGFzeW5jIDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgY29uY3VycmVuY3k6IG51bWJlcixcbiAgZm46IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCBjb25jdXJyZW5jeSksIGl0ZW1zLmxlbmd0aCk7XG4gIGxldCBuZXh0ID0gMDtcblxuICBjb25zdCB0YWtlTmV4dEluZGV4ID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBuZXh0O1xuICAgIG5leHQgKz0gMTtcbiAgICBpZiAoaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH07XG5cbiAgY29uc3Qgd29ya2VyczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAobGV0IHcgPSAwOyB3IDwgbGltaXQ7IHcrKykge1xuICAgIHdvcmtlcnMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHdvcmtJbmRleCA9IHRha2VOZXh0SW5kZXgoKTtcbiAgICAgIHdoaWxlICh3b3JrSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbd29ya0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBmbihpdGVtKTtcbiAgICAgICAgd29ya0luZGV4ID0gdGFrZU5leHRJbmRleCgpO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xufTtcblxuLyoqXG4gKiBSdW5zIGBwcm9jZXNzUmVjb3JkYCBmb3IgZWFjaCBTUVMgcmVjb3JkLiBUaHJvd24gZXJyb3JzIGFyZSBtYXBwZWQgdG9cbiAqIGBiYXRjaEl0ZW1GYWlsdXJlc2A7IHN1Y2Nlc3NmdWwgcmVjb3JkcyBhcmUgbm90IGxpc3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NQYXJ0aWFsQmF0Y2ggPSBhc3luYyAoXG4gIGV2ZW50OiBTUVNFdmVudCxcbiAgcHJvY2Vzc1JlY29yZDogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zPzogUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsXG4pOiBQcm9taXNlPFNRU0JhdGNoUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zPy5jb25jdXJyZW5jeSA/PyAxO1xuICBjb25zdCBiYXRjaEl0ZW1GYWlsdXJlczogeyBpdGVtSWRlbnRpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIGNvbnN0IGhhbmRsZSA9IGFzeW5jIChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGlkID0gb3B0aW9ucz8ubWFwTWVzc2FnZUlkPy4ocmVjb3JkKSA/PyByZWNvcmQubWVzc2FnZUlkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9jZXNzUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zPy5vblJlY29yZEVycm9yKSB7XG4gICAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoSXRlbUZhaWx1cmVzLnB1c2goaXRlbUZhaWx1cmUoaWQpKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDw9IDEpIHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgICBhd2FpdCBoYW5kbGUocmVjb3JkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgcnVuV2l0aENvbmN1cnJlbmN5KGV2ZW50LlJlY29yZHMsIGNvbmN1cnJlbmN5LCBoYW5kbGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgcHJvY2Vzc1BhcnRpYWxCYXRjaH0sIGJ1dCB1c2VzIGEgUmVzdWx0LXN0eWxlIGNhbGxiYWNrIChubyB0aHJvdyBmb3IgY29udHJvbCBmbG93KS5cbiAqIElmIGBwcm9jZXNzUmVjb3JkYCB0aHJvd3MsIHRoZSByZWNvcmQgaXMgc3RpbGwgdHJlYXRlZCBhcyBmYWlsZWQgYW5kIGBvblJlY29yZEVycm9yYCBpcyBpbnZva2VkIHdoZW4gc2V0LlxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc1BhcnRpYWxCYXRjaFdpdGhSZXN1bHQgPSBhc3luYyAoXG4gIGV2ZW50OiBTUVNFdmVudCxcbiAgcHJvY2Vzc1JlY29yZDogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBQcm9taXNlPHsgb2s6IHRydWUgfSB8IHsgb2s6IGZhbHNlIH0+LFxuICBvcHRpb25zPzogUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsXG4pOiBQcm9taXNlPFNRU0JhdGNoUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zPy5jb25jdXJyZW5jeSA/PyAxO1xuICBjb25zdCBiYXRjaEl0ZW1GYWlsdXJlczogeyBpdGVtSWRlbnRpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIGNvbnN0IGhhbmRsZSA9IGFzeW5jIChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGlkID0gb3B0aW9ucz8ubWFwTWVzc2FnZUlkPy4ocmVjb3JkKSA/PyByZWNvcmQubWVzc2FnZUlkO1xuICAgIGxldCByZXN1bHQ6IHsgb2s6IHRydWUgfSB8IHsgb2s6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJlY29yZEVycm9yKHJlY29yZCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lm9rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5vblJlY29yZEVycm9yKSB7XG4gICAgICBvcHRpb25zLm9uUmVjb3JkRXJyb3IocmVjb3JkLCBuZXcgRXJyb3IoJ3Byb2Nlc3NSZWNvcmQgcmV0dXJuZWQgeyBvazogZmFsc2UgfScpKTtcbiAgICB9XG4gICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICB9O1xuXG4gIGlmIChjb25jdXJyZW5jeSA8PSAxKSB7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnQuUmVjb3Jkcykge1xuICAgICAgYXdhaXQgaGFuZGxlKHJlY29yZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGF3YWl0IHJ1bldpdGhDb25jdXJyZW5jeShldmVudC5SZWNvcmRzLCBjb25jdXJyZW5jeSwgaGFuZGxlKTtcbiAgfVxuXG4gIHJldHVybiB7IGJhdGNoSXRlbUZhaWx1cmVzIH07XG59O1xuIl19
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0JBOzs7R0FHRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsY0FBc0IsRUFBOEIsRUFBRSxDQUFDLENBQUM7SUFDM0UsY0FBYztDQUNmLENBQUMsQ0FBQztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBeUIsRUFBVSxFQUFFO0lBQy9ELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixLQUFtQixFQUNuQixXQUFtQixFQUNuQixFQUE4QixFQUNmLEVBQUU7SUFDakIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViLE1BQU0sYUFBYSxHQUFHLEdBQXVCLEVBQUU7UUFDN0MsTUFBTSxLQUFL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ZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSwgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSBhbmQge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHByb2Nlc3NlZCBpbiBwYXJhbGxlbC5cbiAgICpcbiAgICogLSBgMWA6IHNlcXVlbnRpYWwgcHJvY2Vzc2luZ1xuICAgKiAtIGA+IDFgOiBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wgKG9yZGVyIG9mIGBiYXRjaEl0ZW1GYWlsdXJlc2AgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAqXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYGNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4gMS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBXaGVuIGBjb25jdXJyZW5jeWAgaXMgbm90IGEgZmluaXRlIGludGVnZXIuXG4gICAqIE9yZGVyIG9mIGVudHJpZXMgaW4ge0BsaW5rIFNRU0JhdGNoUmVzcG9uc2UuYmF0Y2hJdGVtRmFpbHVyZXN9IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBjb25jdXJyZW5jeT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgdHJlYXRlZCBhcyBmYWlsZWQgKHRocm93biBlcnJvciBvciBgeyBvazogZmFsc2UgfWApLlxuICAgKiBVc2UgZm9yIGxvZ2dpbmc7IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHdyaXRlIHRvIGBjb25zb2xlYCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgb25SZWNvcmRFcnJvcj86IChyZWNvcmQ6IFNRU1JlY29yZCwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciBgaXRlbUlkZW50aWZpZXJgIGZvciBhIHJlY29yZC4gRGVmYXVsdHMgdG8gYHJlY29yZC5tZXNzYWdlSWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFwTWVzc2FnZUlkPzogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSBgYmF0Y2hJdGVtRmFpbHVyZXNgIGVudHJ5IGZvciBhIGZhaWxlZCByZWNvcmQuXG4gKiBAcGFyYW0gaXRlbUlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgcmVwb3J0ZWQgYmFjayB0byBMYW1iZGEuXG4gKi9cbmNvbnN0IGl0ZW1GYWlsdXJlID0gKGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcpOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfSA9PiAoe1xuICBpdGVtSWRlbnRpZmllcixcbn0pO1xuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgdGhlIGBjb25jdXJyZW5jeWAgb3B0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBVc2VyLXByb3ZpZGVkIGNvbmN1cnJlbmN5LlxuICogQHJldHVybnMgQSB2YWxpZGF0ZWQgY29uY3VycmVuY3kgdmFsdWUgKGRlZmF1bHRzIHRvIGAxYCkuXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIDEuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gYHZhbHVlYCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuY29uc3QgcmVzb2x2ZUNvbmN1cnJlbmN5ID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb25jdXJyZW5jeSBtdXN0IGJlIGEgZmluaXRlIGludGVnZXInKTtcbiAgfVxuICBpZiAodmFsdWUgPCAxKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2NvbmN1cnJlbmN5IG11c3QgYmUgPj0gMScpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUnVucyBgZm5gIG92ZXIgYGl0ZW1zYCB3aXRoIGF0IG1vc3QgYGNvbmN1cnJlbmN5YCBwYXJhbGxlbCB3b3JrZXJzLlxuICogRWFjaCB3b3JrZXIgcHVsbHMgdGhlIG5leHQgaW5kZXggdW50aWwgbm9uZSByZW1haW4uXG4gKlxuICogQHBhcmFtIGl0ZW1zIEl0ZW1zIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0gY29uY3VycmVuY3kgTWF4aW11bSBwYXJhbGxlbCB3b3JrZXJzIChtdXN0IGJlIGA+PSAxYCkuXG4gKiBAcGFyYW0gZm4gQXN5bmMgaGFuZGxlciBpbnZva2VkIGZvciBlYWNoIGl0ZW0uXG4gKi9cbmNvbnN0IHJ1bldpdGhDb25jdXJyZW5jeSA9IGFzeW5jIDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgY29uY3VycmVuY3k6IG51bWJlcixcbiAgZm46IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihjb25jdXJyZW5jeSwgaXRlbXMubGVuZ3RoKTtcbiAgbGV0IG5leHQgPSAwO1xuXG4gIGNvbnN0IHRha2VOZXh0SW5kZXggPSAoKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IG5leHQ7XG4gICAgbmV4dCArPSAxO1xuICAgIGlmIChpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfTtcblxuICBjb25zdCB3b3JrZXJzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChsZXQgdyA9IDA7IHcgPCBsaW1pdDsgdysrKSB7XG4gICAgd29ya2Vycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgd29ya0luZGV4ID0gdGFrZU5leHRJbmRleCgpO1xuICAgICAgd2hpbGUgKHdvcmtJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1t3b3JrSW5kZXhdO1xuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZuKGl0ZW0pO1xuICAgICAgICB3b3JrSW5kZXggPSB0YWtlTmV4dEluZGV4KCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG59O1xuXG4vKipcbiAqIFJ1bnMgYHByb2Nlc3NSZWNvcmRgIGZvciBlYWNoIFNRUyByZWNvcmQuIFRocm93biBlcnJvcnMgYXJlIG1hcHBlZCB0b1xuICogYGJhdGNoSXRlbUZhaWx1cmVzYDsgc3VjY2Vzc2Z1bCByZWNvcmRzIGFyZSBub3QgbGlzdGVkLlxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc1BhcnRpYWxCYXRjaCA9IGFzeW5jIChcbiAgZXZlbnQ6IFNRU0V2ZW50LFxuICBwcm9jZXNzUmVjb3JkOiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IFByb21pc2U8dm9pZD4sXG4gIG9wdGlvbnM/OiBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyxcbik6IFByb21pc2U8U1FTQmF0Y2hSZXNwb25zZT4gPT4ge1xuICBjb25zdCBjb25jdXJyZW5jeSA9IHJlc29sdmVDb25jdXJyZW5jeShvcHRpb25zPy5jb25jdXJyZW5jeSk7XG4gIGNvbnN0IGJhdGNoSXRlbUZhaWx1cmVzOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfVtdID0gW107XG5cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3NSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJlY29yZEVycm9yKHJlY29yZCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICAgIH1cbiAgfTtcblxuICBpZiAoY29uY3VycmVuY3kgPD0gMSkge1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZShyZWNvcmQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBydW5XaXRoQ29uY3VycmVuY3koZXZlbnQuUmVjb3JkcywgY29uY3VycmVuY3ksIGhhbmRsZSk7XG4gIH1cblxuICByZXR1cm4geyBiYXRjaEl0ZW1GYWlsdXJlcyB9O1xufTtcblxuLyoqXG4gKiBMaWtlIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSwgYnV0IHVzZXMgYSBSZXN1bHQtc3R5bGUgY2FsbGJhY2sgKG5vIHRocm93IGZvciBjb250cm9sIGZsb3cpLlxuICogSWYgYHByb2Nlc3NSZWNvcmRgIHRocm93cywgdGhlIHJlY29yZCBpcyBzdGlsbCB0cmVhdGVkIGFzIGZhaWxlZCBhbmQgYG9uUmVjb3JkRXJyb3JgIGlzIGludm9rZWQgd2hlbiBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFydGlhbEJhdGNoV2l0aFJlc3VsdCA9IGFzeW5jIChcbiAgZXZlbnQ6IFNRU0V2ZW50LFxuICBwcm9jZXNzUmVjb3JkOiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IFByb21pc2U8eyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2UgfT4sXG4gIG9wdGlvbnM/OiBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyxcbik6IFByb21pc2U8U1FTQmF0Y2hSZXNwb25zZT4gPT4ge1xuICBjb25zdCBjb25jdXJyZW5jeSA9IHJlc29sdmVDb25jdXJyZW5jeShvcHRpb25zPy5jb25jdXJyZW5jeSk7XG4gIGNvbnN0IGJhdGNoSXRlbUZhaWx1cmVzOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfVtdID0gW107XG5cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgbGV0IHJlc3VsdDogeyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc1JlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucz8ub25SZWNvcmRFcnJvcikge1xuICAgICAgICBvcHRpb25zLm9uUmVjb3JkRXJyb3IocmVjb3JkLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIG5ldyBFcnJvcigncHJvY2Vzc1JlY29yZCByZXR1cm5lZCB7IG9rOiBmYWxzZSB9JykpO1xuICAgIH1cbiAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gIH07XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDw9IDEpIHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgICBhd2FpdCBoYW5kbGUocmVjb3JkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgcnVuV2l0aENvbmN1cnJlbmN5KGV2ZW50LlJlY29yZHMsIGNvbmN1cnJlbmN5LCBoYW5kbGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG4iXX0=
|
package/package.json
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"eslint-plugin-import": "^2.32.0",
|
|
43
43
|
"jest": "^30.4.2",
|
|
44
44
|
"jest-junit": "^17",
|
|
45
|
-
"projen": "^0.99.
|
|
45
|
+
"projen": "^0.99.70",
|
|
46
46
|
"ts-jest": "^29.4.11",
|
|
47
47
|
"ts-node": "^10.9.2",
|
|
48
48
|
"typescript": "5.9.x"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"publishConfig": {
|
|
66
66
|
"access": "public"
|
|
67
67
|
},
|
|
68
|
-
"version": "0.
|
|
68
|
+
"version": "0.2.0",
|
|
69
69
|
"jest": {
|
|
70
70
|
"coverageProvider": "v8",
|
|
71
71
|
"testMatch": [
|