sqs-partial-batch-processor 0.1.11 → 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 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 the AWS docs: https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting
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`): bounded parallelism. Order of `batchItemFailures` is not guaranteed.
67
- - `onRecordError?: (record, error) => void`: called when a record is treated as failed (useful for logging/metrics).
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
- * When greater than 1, records are processed with a bounded concurrency pool.
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(Math.max(1, concurrency), items.length);
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 ?? 1;
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 ?? 1;
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
@@ -65,7 +65,7 @@
65
65
  "publishConfig": {
66
66
  "access": "public"
67
67
  },
68
- "version": "0.1.11",
68
+ "version": "0.2.0",
69
69
  "jest": {
70
70
  "coverageProvider": "v8",
71
71
  "testMatch": [