athena-query-result-pager 0.2.8 → 0.3.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 +51 -36
- package/lib/index.d.ts +67 -32
- package/lib/index.js +55 -27
- package/package.json +19 -3
package/README.md
CHANGED
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|

|
|
4
4
|

|
|
5
5
|
|
|
6
|
-
Paginate AWS Athena
|
|
6
|
+
Paginate [AWS Athena](https://docs.aws.amazon.com/athena/latest/ug/v3-sdk.html) **`GetQueryResults`** calls with AWS SDK v3. This library walks **`NextToken`**, parses tabular rows with [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser), and forwards **`MaxResults`** and **`QueryResultType`** from **[PagerOptions](#options)** on every [`GetQueryResults`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/) request.
|
|
7
7
|
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- Exposes a simple static utility: `AthenaQueryResultPager.hasNextPage(...)`.
|
|
10
|
+
- Sends paginated Athena **`GetQueryResults`** requests (`NextToken` / **`MaxResults`**).
|
|
11
|
+
- Forwards **`QueryResultType`** from the pager constructor (`DATA_ROWS`, **`DATA_MANIFEST`**, etc.) on each request — suitable for CTAS / UNLOAD / INSERT manifest workflows when Athena allows it.
|
|
12
|
+
- Supports raw **`ParsedRow`** dictionaries and typed rows via **`RowParser<T>`** (including async generators).
|
|
13
|
+
- Async generators iterate **page-by-page** (**`iteratePages`**, **`iteratePagesWith`**) or **row-by-row** (**`iterateRows`**) without holding full result sets in memory.
|
|
14
|
+
- Fail-fast validation: **`maxResults`** must be an integer in **`1..1000`**; **`queryExecutionId`** must be non-empty ( **`fetchPage`**, **`fetchPageWith`** ).
|
|
15
|
+
- Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`reset()`** when reusing one pager across different executions (parser/header state).
|
|
17
16
|
|
|
18
17
|
## Installation
|
|
19
18
|
|
|
@@ -25,21 +24,30 @@ npm install athena-query-result-pager
|
|
|
25
24
|
yarn add athena-query-result-pager
|
|
26
25
|
```
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
```bash
|
|
28
|
+
pnpm add athena-query-result-pager
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Runtime dependencies (**direct** once you publish): `@aws-sdk/client-athena`, `athena-query-result-parser`. Your application typically already instantiates **`AthenaClient`** with credentials and Region.
|
|
29
32
|
|
|
30
33
|
## Usage
|
|
31
34
|
|
|
32
35
|
### Create a pager instance
|
|
33
36
|
|
|
37
|
+
**`AthenaQueryResultPager`** options are normalized at construction time (**defaults**: **`maxResults`** `1000`, **`queryResultType`** `QueryResultType.DATA_ROWS`). Both fields are populated on **`GetQueryResults`** for **`fetchPage`**, **`fetchPageWith`**, and all iterators built on those methods.
|
|
38
|
+
|
|
34
39
|
```ts
|
|
35
|
-
import { AthenaClient } from '@aws-sdk/client-athena';
|
|
40
|
+
import { AthenaClient, QueryResultType } from '@aws-sdk/client-athena';
|
|
36
41
|
import { AthenaQueryResultPager } from 'athena-query-result-pager';
|
|
37
42
|
|
|
38
43
|
const client = new AthenaClient({ region: 'us-east-1' });
|
|
39
44
|
const pager = new AthenaQueryResultPager(client, {
|
|
40
45
|
maxResults: 1000,
|
|
41
|
-
queryResultType:
|
|
46
|
+
queryResultType: QueryResultType.DATA_ROWS,
|
|
42
47
|
});
|
|
48
|
+
|
|
49
|
+
// Manifest-style outputs (only for supported Athena query types):
|
|
50
|
+
// new AthenaQueryResultPager(client, { queryResultType: QueryResultType.DATA_MANIFEST })
|
|
43
51
|
```
|
|
44
52
|
|
|
45
53
|
### Fetch one page (raw rows)
|
|
@@ -59,7 +67,10 @@ if (AthenaQueryResultPager.hasNextPage(page)) {
|
|
|
59
67
|
```ts
|
|
60
68
|
import type { RowParser } from 'athena-query-result-pager';
|
|
61
69
|
|
|
62
|
-
interface MyRow {
|
|
70
|
+
interface MyRow {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
}
|
|
63
74
|
const rowParser: RowParser<MyRow> = (row) => ({
|
|
64
75
|
id: row['id'] ?? '',
|
|
65
76
|
name: row['name'] ?? '',
|
|
@@ -72,7 +83,7 @@ const page = await pager.fetchPageWith('query-execution-id', rowParser);
|
|
|
72
83
|
### Iterate pages (async generator)
|
|
73
84
|
|
|
74
85
|
```ts
|
|
75
|
-
// Raw ParsedRow
|
|
86
|
+
// Raw ParsedRow pages
|
|
76
87
|
for await (const page of pager.iteratePages('query-execution-id')) {
|
|
77
88
|
console.log(page.rowCount, page.rows);
|
|
78
89
|
}
|
|
@@ -85,15 +96,17 @@ for await (const page of pager.iteratePagesWith('query-execution-id', rowParser)
|
|
|
85
96
|
|
|
86
97
|
### Iterate row by row (memory-efficient)
|
|
87
98
|
|
|
99
|
+
Requires a **`RowParser`** mapping **`ParsedRow`** to your row type (**`iterateRows`** wraps **`iteratePagesWith`**).
|
|
100
|
+
|
|
88
101
|
```ts
|
|
89
102
|
for await (const row of pager.iterateRows('query-execution-id', rowParser)) {
|
|
90
103
|
console.log(row);
|
|
91
104
|
}
|
|
92
105
|
```
|
|
93
106
|
|
|
94
|
-
### Reset before
|
|
107
|
+
### Reset before another execution
|
|
95
108
|
|
|
96
|
-
|
|
109
|
+
Reuse the same pager for a **new** **`queryExecutionId`** after resetting the bundled **`AthenaQueryResultParser`** header/skip logic:
|
|
97
110
|
|
|
98
111
|
```ts
|
|
99
112
|
pager.reset();
|
|
@@ -103,43 +116,45 @@ pager.reset();
|
|
|
103
116
|
|
|
104
117
|
### `PagerOptions`
|
|
105
118
|
|
|
106
|
-
-
|
|
107
|
-
- Default
|
|
108
|
-
- Valid range: integer
|
|
109
|
-
- Throws
|
|
110
|
-
-
|
|
111
|
-
-
|
|
119
|
+
- **`maxResults?: number`**
|
|
120
|
+
- Default **`1000`**.
|
|
121
|
+
- Valid range: integer **`1..1000`** (Athena **`GetQueryResults`** limit).
|
|
122
|
+
- Throws **`RangeError`** when invalid (**constructor**).
|
|
123
|
+
- **`queryResultType?: QueryResultType`**
|
|
124
|
+
- Same flag as Athena **`GetQueryResults` `QueryResultType`** ( **`DATA_ROWS`**, **`DATA_MANIFEST`**, … ). Import **`QueryResultType`** from **`@aws-sdk/client-athena`** when typing options.
|
|
125
|
+
- Default **`QueryResultType.DATA_ROWS`**.
|
|
126
|
+
- When set (**including default**), the value appears on **`fetchPage`**, **`fetchPageWith`**, and iterator-driven calls alongside **`MaxResults`**.
|
|
112
127
|
|
|
113
128
|
### Method input validation
|
|
114
129
|
|
|
115
|
-
-
|
|
116
|
-
-
|
|
130
|
+
- **`fetchPage(queryExecutionId, nextToken?)`**
|
|
131
|
+
- **`fetchPageWith(queryExecutionId, rowParser, nextToken?)`**
|
|
117
132
|
|
|
118
|
-
Both
|
|
133
|
+
Both throw if **`queryExecutionId`** is empty or whitespace-only (before invoking AWS).
|
|
119
134
|
|
|
120
135
|
## API
|
|
121
136
|
|
|
122
137
|
### `AthenaQueryResultPager`
|
|
123
138
|
|
|
124
139
|
- **`constructor(client: AthenaClient, options?: PagerOptions)`**
|
|
125
|
-
- **`fetchPage(queryExecutionId, nextToken?)`** →
|
|
126
|
-
- **`fetchPageWith<T>(queryExecutionId, rowParser, nextToken?)`** →
|
|
127
|
-
- **`iteratePages(queryExecutionId)`** →
|
|
128
|
-
- **`iteratePagesWith<T>(queryExecutionId, rowParser)`** →
|
|
129
|
-
- **`iterateRows<T>(queryExecutionId, rowParser)`** →
|
|
130
|
-
- **`reset()`** —
|
|
131
|
-
- **`static hasNextPage<T>(pageResult: PageResult<T>)`** →
|
|
140
|
+
- **`fetchPage(queryExecutionId, nextToken?)`** → **`Promise<PageResult<ParsedRow>>`**
|
|
141
|
+
- **`fetchPageWith<T>(queryExecutionId, rowParser, nextToken?)`** → **`Promise<PageResult<T>>`**
|
|
142
|
+
- **`iteratePages(queryExecutionId)`** → **`AsyncGenerator<PageResult<ParsedRow>>`**
|
|
143
|
+
- **`iteratePagesWith<T>(queryExecutionId, rowParser)`** → **`AsyncGenerator<PageResult<T>>`**
|
|
144
|
+
- **`iterateRows<T>(queryExecutionId, rowParser)`** → **`AsyncGenerator<T>`**
|
|
145
|
+
- **`reset()`** — new parser instance (**header row bookkeeping** resets).
|
|
146
|
+
- **`static hasNextPage<T>(pageResult: PageResult<T>)`** → **`boolean`**
|
|
132
147
|
|
|
133
148
|
### Types
|
|
134
149
|
|
|
135
|
-
- **`PageResult<T>`** —
|
|
136
|
-
- **`PagerOptions`** —
|
|
137
|
-
- **`ParsedRow`**, **`RowParser<T>`** — re-exported from
|
|
150
|
+
- **`PageResult<T>`** — **`{ rows: T[]; nextToken?: string; rowCount: number }`**
|
|
151
|
+
- **`PagerOptions`** — **`{ maxResults?: number; queryResultType?: QueryResultType }`** (**`QueryResultType`** from **`@aws-sdk/client-athena`**)
|
|
152
|
+
- **`ParsedRow`**, **`RowParser<T>`** — re-exported from **`athena-query-result-parser`**.
|
|
138
153
|
|
|
139
154
|
## Requirements
|
|
140
155
|
|
|
141
|
-
- Node.js
|
|
142
|
-
- AWS SDK v3
|
|
156
|
+
- Node.js **`>= 20.0.0`**
|
|
157
|
+
- AWS SDK for JavaScript v3 — **`@aws-sdk/client-athena`** (`AthenaClient`, **`QueryResultType`**)
|
|
143
158
|
|
|
144
159
|
## License
|
|
145
160
|
|
package/lib/index.d.ts
CHANGED
|
@@ -1,75 +1,110 @@
|
|
|
1
|
-
import { AthenaClient } from '@aws-sdk/client-athena';
|
|
1
|
+
import { AthenaClient, QueryResultType } from '@aws-sdk/client-athena';
|
|
2
2
|
import { type ParsedRow, type RowParser } from 'athena-query-result-parser';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* One page of Athena query rows after a {@link AthenaQueryResultPager} fetch or generator step.
|
|
5
|
+
*
|
|
6
|
+
* @typeParam T - Row representation; use {@link ParsedRow} or a type produced by {@link RowParser}.
|
|
5
7
|
*/
|
|
6
8
|
export interface PageResult<T> {
|
|
7
|
-
/** Parsed
|
|
9
|
+
/** Parsed rows for this page only. */
|
|
8
10
|
rows: T[];
|
|
9
|
-
/**
|
|
11
|
+
/** Continuation token for the following page (`undefined` when this is the last page). */
|
|
10
12
|
nextToken?: string;
|
|
11
|
-
/**
|
|
13
|
+
/** Same as `rows.length` for convenience. */
|
|
12
14
|
rowCount: number;
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
|
-
*
|
|
17
|
+
* Settings applied to every `GetQueryResults` invocation made by {@link AthenaQueryResultPager}.
|
|
16
18
|
*/
|
|
17
19
|
export interface PagerOptions {
|
|
18
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* `MaxResults` per request — must be an integer from 1 through 1000 (Athena limits).
|
|
22
|
+
* @defaultValue 1000
|
|
23
|
+
*/
|
|
19
24
|
maxResults?: number;
|
|
20
|
-
/**
|
|
21
|
-
|
|
25
|
+
/**
|
|
26
|
+
* `QueryResultType` forwarded to Athena (for example raw data rows versus manifest rows for CTAS/UNLOAD/INSERT outputs).
|
|
27
|
+
* @defaultValue `QueryResultType.DATA_ROWS`
|
|
28
|
+
*/
|
|
29
|
+
queryResultType?: QueryResultType;
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
32
|
+
* Paginates Athena `GetQueryResults` (AWS SDK for JavaScript v3): walks `NextToken` and parses tabular rows with
|
|
33
|
+
* `athena-query-result-parser` when needed.
|
|
34
|
+
*
|
|
35
|
+
* `maxResults` and `queryResultType` from the constructor are included on every `GetQueryResults` request.
|
|
36
|
+
*
|
|
37
|
+
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
26
38
|
*/
|
|
27
39
|
export declare class AthenaQueryResultPager {
|
|
28
40
|
/**
|
|
29
|
-
*
|
|
30
|
-
* @param pageResult -
|
|
41
|
+
* @typeParam T - Row type held in {@link PageResult.rows}.
|
|
42
|
+
* @param pageResult - The most recently retrieved page from `fetchPage`, `fetchPageWith`, or a page iterator.
|
|
43
|
+
* @returns `true` when {@link PageResult.nextToken} is defined and another page should be fetched.
|
|
31
44
|
*/
|
|
32
45
|
static hasNextPage<T>(pageResult: PageResult<T>): boolean;
|
|
33
46
|
private readonly client;
|
|
47
|
+
/** Normalized pager settings (every field set after merging defaults). */
|
|
34
48
|
private readonly options;
|
|
49
|
+
/** Stateful parser reused across calls; recreated by {@link AthenaQueryResultPager.reset}. */
|
|
35
50
|
private parser;
|
|
51
|
+
/**
|
|
52
|
+
* @param client - SDK v3 `AthenaClient` used to call `GetQueryResults`.
|
|
53
|
+
* @param options - Optional `MaxResults` and `QueryResultType`; defaults apply when omitted.
|
|
54
|
+
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
55
|
+
*/
|
|
36
56
|
constructor(client: AthenaClient, options?: PagerOptions);
|
|
37
57
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* @param
|
|
41
|
-
* @
|
|
58
|
+
* Retrieves a single results page using {@link AthenaQueryResultParser.parseResultSet} (dictionary-shaped rows).
|
|
59
|
+
*
|
|
60
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
61
|
+
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
62
|
+
* @returns Parsed rows plus pagination metadata from this response only.
|
|
63
|
+
* @throws {Error} When `queryExecutionId` is empty or whitespace only.
|
|
42
64
|
*/
|
|
43
65
|
fetchPage(queryExecutionId: string, nextToken?: string): Promise<PageResult<ParsedRow>>;
|
|
44
66
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* @
|
|
48
|
-
* @param
|
|
49
|
-
* @
|
|
67
|
+
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
68
|
+
*
|
|
69
|
+
* @typeParam T - Output type produced by `rowParser`.
|
|
70
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
71
|
+
* @param rowParser - Converts each dictionary row into `T`.
|
|
72
|
+
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
73
|
+
* @returns Transformed rows plus pagination metadata from this response only.
|
|
74
|
+
* @throws {Error} When `queryExecutionId` is empty or whitespace only.
|
|
50
75
|
*/
|
|
51
76
|
fetchPageWith<T>(queryExecutionId: string, rowParser: RowParser<T>, nextToken?: string): Promise<PageResult<T>>;
|
|
52
77
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
78
|
+
* Lazily walks all pages for an execution, yielding {@link PageResult} of {@link ParsedRow} each step.
|
|
79
|
+
*
|
|
80
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
81
|
+
* @yields One page at a time until AWS returns no `NextToken`.
|
|
55
82
|
*/
|
|
56
83
|
iteratePages(queryExecutionId: string): AsyncGenerator<PageResult<ParsedRow>>;
|
|
57
84
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* @
|
|
85
|
+
* Same as {@link AthenaQueryResultPager.iteratePages} but applies `rowParser` per row on every page.
|
|
86
|
+
*
|
|
87
|
+
* @typeParam T - Output type emitted in {@link PageResult.rows}.
|
|
88
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
89
|
+
* @param rowParser - Converts each parsed row into `T`.
|
|
90
|
+
* @yields Successive {@link PageResult} values whose `rows` are typed as `T`.
|
|
61
91
|
*/
|
|
62
92
|
iteratePagesWith<T>(queryExecutionId: string, rowParser: RowParser<T>): AsyncGenerator<PageResult<T>>;
|
|
63
93
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* @
|
|
94
|
+
* Flattens {@link AthenaQueryResultPager.iteratePagesWith} into individual `T` values (one row per `next()`).
|
|
95
|
+
*
|
|
96
|
+
* @typeParam T - Output type produced by `rowParser`.
|
|
97
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
98
|
+
* @param rowParser - Converts each parsed row into `T`.
|
|
99
|
+
* @yields Each data row in execution order without buffering the full result set in memory.
|
|
67
100
|
*/
|
|
68
101
|
iterateRows<T>(queryExecutionId: string, rowParser: RowParser<T>): AsyncGenerator<T>;
|
|
69
102
|
/**
|
|
70
|
-
*
|
|
103
|
+
* Instantiates a fresh {@link AthenaQueryResultParser} so header-row handling does not leak between queries.
|
|
104
|
+
*
|
|
105
|
+
* Call when reusing this pager for a different `queryExecutionId` than the previous parse sequence.
|
|
71
106
|
*/
|
|
72
107
|
reset(): void;
|
|
73
108
|
}
|
|
74
|
-
/** Re-
|
|
109
|
+
/** Re-exports `ParsedRow` and `RowParser` from the `athena-query-result-parser` package. */
|
|
75
110
|
export type { ParsedRow, RowParser };
|
package/lib/index.js
CHANGED
|
@@ -3,25 +3,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AthenaQueryResultPager = void 0;
|
|
4
4
|
const client_athena_1 = require("@aws-sdk/client-athena");
|
|
5
5
|
const athena_query_result_parser_1 = require("athena-query-result-parser");
|
|
6
|
-
/** Default maximum number of rows per
|
|
6
|
+
/** Default maximum number of result rows requested per {@link AthenaQueryResultPager} API call (`MaxResults`). */
|
|
7
7
|
const DEFAULT_MAX_RESULTS = 1000;
|
|
8
|
-
/** Minimum
|
|
8
|
+
/** Minimum `MaxResults` value allowed by Athena `GetQueryResults`. */
|
|
9
9
|
const MIN_MAX_RESULTS = 1;
|
|
10
|
+
/** Maximum `MaxResults` value allowed by Athena `GetQueryResults`. */
|
|
10
11
|
const MAX_MAX_RESULTS = 1000;
|
|
11
|
-
/** Default
|
|
12
|
-
const DEFAULT_QUERY_RESULT_TYPE =
|
|
12
|
+
/** Default `QueryResultType` forwarded to Athena `GetQueryResults`. */
|
|
13
|
+
const DEFAULT_QUERY_RESULT_TYPE = client_athena_1.QueryResultType.DATA_ROWS;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
15
|
+
* Paginates Athena `GetQueryResults` (AWS SDK for JavaScript v3): walks `NextToken` and parses tabular rows with
|
|
16
|
+
* `athena-query-result-parser` when needed.
|
|
17
|
+
*
|
|
18
|
+
* `maxResults` and `queryResultType` from the constructor are included on every `GetQueryResults` request.
|
|
19
|
+
*
|
|
20
|
+
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
16
21
|
*/
|
|
17
22
|
class AthenaQueryResultPager {
|
|
18
23
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param pageResult -
|
|
24
|
+
* @typeParam T - Row type held in {@link PageResult.rows}.
|
|
25
|
+
* @param pageResult - The most recently retrieved page from `fetchPage`, `fetchPageWith`, or a page iterator.
|
|
26
|
+
* @returns `true` when {@link PageResult.nextToken} is defined and another page should be fetched.
|
|
21
27
|
*/
|
|
22
28
|
static hasNextPage(pageResult) {
|
|
23
29
|
return pageResult.nextToken !== undefined;
|
|
24
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* @param client - SDK v3 `AthenaClient` used to call `GetQueryResults`.
|
|
33
|
+
* @param options - Optional `MaxResults` and `QueryResultType`; defaults apply when omitted.
|
|
34
|
+
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
35
|
+
*/
|
|
25
36
|
constructor(client, options = {}) {
|
|
26
37
|
const maxResults = options.maxResults ?? DEFAULT_MAX_RESULTS;
|
|
27
38
|
if (!Number.isInteger(maxResults) || maxResults < MIN_MAX_RESULTS || maxResults > MAX_MAX_RESULTS) {
|
|
@@ -35,10 +46,12 @@ class AthenaQueryResultPager {
|
|
|
35
46
|
this.parser = new athena_query_result_parser_1.AthenaQueryResultParser();
|
|
36
47
|
}
|
|
37
48
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* @param
|
|
41
|
-
* @
|
|
49
|
+
* Retrieves a single results page using {@link AthenaQueryResultParser.parseResultSet} (dictionary-shaped rows).
|
|
50
|
+
*
|
|
51
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
52
|
+
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
53
|
+
* @returns Parsed rows plus pagination metadata from this response only.
|
|
54
|
+
* @throws {Error} When `queryExecutionId` is empty or whitespace only.
|
|
42
55
|
*/
|
|
43
56
|
async fetchPage(queryExecutionId, nextToken) {
|
|
44
57
|
if (queryExecutionId.trim() === '') {
|
|
@@ -48,6 +61,7 @@ class AthenaQueryResultPager {
|
|
|
48
61
|
QueryExecutionId: queryExecutionId,
|
|
49
62
|
NextToken: nextToken,
|
|
50
63
|
MaxResults: this.options.maxResults,
|
|
64
|
+
QueryResultType: this.options.queryResultType,
|
|
51
65
|
};
|
|
52
66
|
const response = await this.client.send(new client_athena_1.GetQueryResultsCommand(input));
|
|
53
67
|
const rows = this.parser.parseResultSet(response.ResultSet);
|
|
@@ -58,11 +72,14 @@ class AthenaQueryResultPager {
|
|
|
58
72
|
};
|
|
59
73
|
}
|
|
60
74
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* @
|
|
64
|
-
* @param
|
|
65
|
-
* @
|
|
75
|
+
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
76
|
+
*
|
|
77
|
+
* @typeParam T - Output type produced by `rowParser`.
|
|
78
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
79
|
+
* @param rowParser - Converts each dictionary row into `T`.
|
|
80
|
+
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
81
|
+
* @returns Transformed rows plus pagination metadata from this response only.
|
|
82
|
+
* @throws {Error} When `queryExecutionId` is empty or whitespace only.
|
|
66
83
|
*/
|
|
67
84
|
async fetchPageWith(queryExecutionId, rowParser, nextToken) {
|
|
68
85
|
if (queryExecutionId.trim() === '') {
|
|
@@ -72,6 +89,7 @@ class AthenaQueryResultPager {
|
|
|
72
89
|
QueryExecutionId: queryExecutionId,
|
|
73
90
|
NextToken: nextToken,
|
|
74
91
|
MaxResults: this.options.maxResults,
|
|
92
|
+
QueryResultType: this.options.queryResultType,
|
|
75
93
|
};
|
|
76
94
|
const response = await this.client.send(new client_athena_1.GetQueryResultsCommand(input));
|
|
77
95
|
const rows = this.parser.parseResultSetWith(response.ResultSet, rowParser);
|
|
@@ -82,8 +100,10 @@ class AthenaQueryResultPager {
|
|
|
82
100
|
};
|
|
83
101
|
}
|
|
84
102
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
103
|
+
* Lazily walks all pages for an execution, yielding {@link PageResult} of {@link ParsedRow} each step.
|
|
104
|
+
*
|
|
105
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
106
|
+
* @yields One page at a time until AWS returns no `NextToken`.
|
|
87
107
|
*/
|
|
88
108
|
async *iteratePages(queryExecutionId) {
|
|
89
109
|
let nextToken;
|
|
@@ -94,9 +114,12 @@ class AthenaQueryResultPager {
|
|
|
94
114
|
} while (nextToken);
|
|
95
115
|
}
|
|
96
116
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* @
|
|
117
|
+
* Same as {@link AthenaQueryResultPager.iteratePages} but applies `rowParser` per row on every page.
|
|
118
|
+
*
|
|
119
|
+
* @typeParam T - Output type emitted in {@link PageResult.rows}.
|
|
120
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
121
|
+
* @param rowParser - Converts each parsed row into `T`.
|
|
122
|
+
* @yields Successive {@link PageResult} values whose `rows` are typed as `T`.
|
|
100
123
|
*/
|
|
101
124
|
async *iteratePagesWith(queryExecutionId, rowParser) {
|
|
102
125
|
let nextToken;
|
|
@@ -107,9 +130,12 @@ class AthenaQueryResultPager {
|
|
|
107
130
|
} while (nextToken);
|
|
108
131
|
}
|
|
109
132
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* @
|
|
133
|
+
* Flattens {@link AthenaQueryResultPager.iteratePagesWith} into individual `T` values (one row per `next()`).
|
|
134
|
+
*
|
|
135
|
+
* @typeParam T - Output type produced by `rowParser`.
|
|
136
|
+
* @param queryExecutionId - Athena query execution identifier.
|
|
137
|
+
* @param rowParser - Converts each parsed row into `T`.
|
|
138
|
+
* @yields Each data row in execution order without buffering the full result set in memory.
|
|
113
139
|
*/
|
|
114
140
|
async *iterateRows(queryExecutionId, rowParser) {
|
|
115
141
|
for await (const page of this.iteratePagesWith(queryExecutionId, rowParser)) {
|
|
@@ -119,11 +145,13 @@ class AthenaQueryResultPager {
|
|
|
119
145
|
}
|
|
120
146
|
}
|
|
121
147
|
/**
|
|
122
|
-
*
|
|
148
|
+
* Instantiates a fresh {@link AthenaQueryResultParser} so header-row handling does not leak between queries.
|
|
149
|
+
*
|
|
150
|
+
* Call when reusing this pager for a different `queryExecutionId` than the previous parse sequence.
|
|
123
151
|
*/
|
|
124
152
|
reset() {
|
|
125
153
|
this.parser = new athena_query_result_parser_1.AthenaQueryResultParser();
|
|
126
154
|
}
|
|
127
155
|
}
|
|
128
156
|
exports.AthenaQueryResultPager = AthenaQueryResultPager;
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWdIO0FBQ2hILDJFQUFxRztBQUVyRywrQ0FBK0M7QUFDL0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsNkRBQTZEO0FBQzdELE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFFN0IscURBQXFEO0FBQ3JELE1BQU0seUJBQXlCLEdBQUcsV0FBb0IsQ0FBQztBQXdCdkQ7OztHQUdHO0FBQ0gsTUFBYSxzQkFBc0I7SUFFakM7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBSSxVQUF5QjtRQUM3QyxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0lBQzVDLENBQUM7SUFNRCxZQUFZLE1BQW9CLEVBQUUsVUFBd0IsRUFBRTtRQUMxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsR0FBRyxlQUFlLElBQUksVUFBVSxHQUFHLGVBQWUsRUFBRSxDQUFDO1lBQ2xHLE1BQU0sSUFBSSxVQUFVLENBQ2xCLGlEQUFpRCxlQUFlLFFBQVEsZUFBZSxTQUFTLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNySCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixVQUFVO1lBQ1YsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLElBQUkseUJBQXlCO1NBQ3RFLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksb0RBQXVCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7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LENBQUM7WUFDNUUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLG9EQUF1QixFQUFFLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBdEpELHdEQXNKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0aGVuYUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgdHlwZSBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcbmltcG9ydCB7IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLCB0eXBlIFBhcnNlZFJvdywgdHlwZSBSb3dQYXJzZXIgfSBmcm9tICdhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcic7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGFuZCBtYXhpbXVtIGFsbG93ZWQgYnkgQXRoZW5hIEdldFF1ZXJ5UmVzdWx0cy4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBxdWVyeSByZXN1bHQgdHlwZSBmb3IgR2V0UXVlcnlSZXN1bHRzLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9ICdEQVRBX1JPV1MnIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgZm9yIGEgc2luZ2xlIHBhZ2Ugb2YgcXVlcnkgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVzdWx0PFQ+IHtcbiAgLyoqIFBhcnNlZCByb3cgZGF0YS4gKi9cbiAgcm93czogVFtdO1xuICAvKiogVG9rZW4gZm9yIHRoZSBuZXh0IHBhZ2UgKHVuZGVmaW5lZCBpZiBubyBtb3JlIHBhZ2VzKS4gKi9cbiAgbmV4dFRva2VuPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIHJvd3MgaW4gdGhpcyBwYWdlLiAqL1xuICByb3dDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBwYWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlck9wdGlvbnMge1xuICAvKiogTWF4aW11bSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZSAoZGVmYXVsdDogMTAwMCkuICovXG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIC8qKiBRdWVyeSByZXN1bHQgdHlwZSAoZGVmYXVsdDogJ0RBVEFfUk9XUycpLiAqL1xuICBxdWVyeVJlc3VsdFR5cGU/OiAnREFUQV9ST1dTJztcbn1cblxuLyoqXG4gKiBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyXG4gKiBGZXRjaGVzIEF0aGVuYSBxdWVyeSByZXN1bHRzIHBhZ2UgYnkgcGFnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIge1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYSBuZXh0IHBhZ2UuXG4gICAqIEBwYXJhbSBwYWdlUmVzdWx0IC0gUHJldmlvdXMgcGFnZSByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgaGFzTmV4dFBhZ2U8VD4ocGFnZVJlc3VsdDogUGFnZVJlc3VsdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlUmVzdWx0Lm5leHRUb2tlbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxQYWdlck9wdGlvbnM+O1xuICBwcml2YXRlIHBhcnNlcjogQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXI7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBBdGhlbmFDbGllbnQsIG9wdGlvbnM6IFBhZ2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbWF4UmVzdWx0cyA9IG9wdGlvbnMubWF4UmVzdWx0cyA/PyBERUZBVUxUX01BWF9SRVNVTFRTO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZXN1bHRzKSB8fCBtYXhSZXN1bHRzIDwgTUlOX01BWF9SRVNVTFRTIHx8IG1heFJlc3VsdHMgPiBNQVhfTUFYX1JFU1VMVFMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBgb3B0aW9ucy5tYXhSZXN1bHRzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7TUlOX01BWF9SRVNVTFRTfSBhbmQgJHtNQVhfTUFYX1JFU1VMVFN9LCBnb3QgJHtTdHJpbmcobWF4UmVzdWx0cyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbWF4UmVzdWx0cyxcbiAgICAgIHF1ZXJ5UmVzdWx0VHlwZTogb3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUgPz8gREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSxcbiAgICB9O1xuICAgIHRoaXMucGFyc2VyID0gbmV3IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmUgcGFnZSBvZiBkYXRhIGFzIHJhdyBQYXJzZWRSb3cuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gUXVlcnkgZXhlY3V0aW9uIElELlxuICAgKiBAcGFyYW0gbmV4dFRva2VuIC0gVG9rZW4gZm9yIHRoZSBuZXh0IHBhZ2UgKHVuZGVmaW5lZCBvbiBmaXJzdCBjYWxsKS5cbiAgICogQHJldHVybnMgUGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2UoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIG5leHRUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0KHJlc3BvbnNlLlJlc3VsdFNldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93cyxcbiAgICAgIG5leHRUb2tlbjogcmVzcG9uc2UuTmV4dFRva2VuLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmUgcGFnZSBvZiBkYXRhIGFuZCB0cmFuc2Zvcm1zIGl0IHdpdGggYSBjdXN0b20gcm93IHBhcnNlci5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBRdWVyeSBleGVjdXRpb24gSUQuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBSb3cgcGFyc2VyLlxuICAgKiBAcGFyYW0gbmV4dFRva2VuIC0gVG9rZW4gZm9yIHRoZSBuZXh0IHBhZ2UgKHVuZGVmaW5lZCBvbiBmaXJzdCBjYWxsKS5cbiAgICogQHJldHVybnMgUGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2VXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgICBuZXh0VG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0OiBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICBNYXhSZXN1bHRzOiB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeVJlc3VsdHNDb21tYW5kKGlucHV0KSk7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZXIucGFyc2VSZXN1bHRTZXRXaXRoKHJlc3BvbnNlLlJlc3VsdFNldCwgcm93UGFyc2VyKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBwYWdlIGJ5IHBhZ2UgdmlhIEFzeW5jR2VuZXJhdG9yIChyYXcgUGFyc2VkUm93KS5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBRdWVyeSBleGVjdXRpb24gSUQuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxQYXJzZWRSb3c+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlKHF1ZXJ5RXhlY3V0aW9uSWQsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBwYWdlIGJ5IHBhZ2UgdmlhIEFzeW5jR2VuZXJhdG9yIHdpdGggYSBjdXN0b20gcm93IHBhcnNlci5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBRdWVyeSBleGVjdXRpb24gSUQuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBSb3cgcGFyc2VyLlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVQYWdlc1dpdGg8VD4oXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIHJvd1BhcnNlcjogUm93UGFyc2VyPFQ+LFxuICApOiBBc3luY0dlbmVyYXRvcjxQYWdlUmVzdWx0PFQ+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlV2l0aChxdWVyeUV4ZWN1dGlvbklkLCByb3dQYXJzZXIsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyByb3cgYnkgcm93IHZpYSBBc3luY0dlbmVyYXRvciAobWVtb3J5LWVmZmljaWVudCkuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gUXVlcnkgZXhlY3V0aW9uIElELlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gUm93IHBhcnNlci5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUm93czxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFQ+IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5pdGVyYXRlUGFnZXNXaXRoKHF1ZXJ5RXhlY3V0aW9uSWQsIHJvd1BhcnNlcikpIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2Uucm93cykge1xuICAgICAgICB5aWVsZCByb3c7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFyc2VyIHN0YXRlLiBDYWxsIGJlZm9yZSBwcm9jZXNzaW5nIGEgbmV3IHF1ZXJ5LlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIoKTtcbiAgfVxufVxuXG4vKiogUmUtZXhwb3J0IG9mIHR5cGVzIGZyb20gYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXIuICovXG5leHBvcnQgdHlwZSB7IFBhcnNlZFJvdywgUm93UGFyc2VyIH07Il19
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQUFxRztBQUVyRyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBZ0M1RDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxzQkFBc0I7SUFFakM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUksVUFBeUI7UUFDN0MsT0FBTyxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBUUQ7Ozs7T0FJRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDbEcsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsaURBQWlELGVBQWUsUUFBUSxlQUFlLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVU7WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSx5QkFBeUI7U0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxv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RztJQUNILEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FDaEIsZ0JBQXdCLEVBQ3hCLFNBQXVCO1FBRXZCLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLG9EQUF1QixFQUFFLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBL0tELHdEQStLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0aGVuYUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgUXVlcnlSZXN1bHRUeXBlLCB0eXBlIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIsIHR5cGUgUGFyc2VkUm93LCB0eXBlIFJvd1BhcnNlciB9IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcblxuLyoqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0IHJvd3MgcmVxdWVzdGVkIHBlciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gQVBJIGNhbGwgKGBNYXhSZXN1bHRzYCkuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGBNYXhSZXN1bHRzYCB2YWx1ZSBhbGxvd2VkIGJ5IEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG4vKiogTWF4aW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBgUXVlcnlSZXN1bHRUeXBlYCBmb3J3YXJkZWQgdG8gQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9IFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1M7XG5cbi8qKlxuICogT25lIHBhZ2Ugb2YgQXRoZW5hIHF1ZXJ5IHJvd3MgYWZ0ZXIgYSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gZmV0Y2ggb3IgZ2VuZXJhdG9yIHN0ZXAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gUm93IHJlcHJlc2VudGF0aW9uOyB1c2Uge0BsaW5rIFBhcnNlZFJvd30gb3IgYSB0eXBlIHByb2R1Y2VkIGJ5IHtAbGluayBSb3dQYXJzZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXN1bHQ8VD4ge1xuICAvKiogUGFyc2VkIHJvd3MgZm9yIHRoaXMgcGFnZSBvbmx5LiAqL1xuICByb3dzOiBUW107XG4gIC8qKiBDb250aW51YXRpb24gdG9rZW4gZm9yIHRoZSBmb2xsb3dpbmcgcGFnZSAoYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UpLiAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBTYW1lIGFzIGByb3dzLmxlbmd0aGAgZm9yIGNvbnZlbmllbmNlLiAqL1xuICByb3dDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGFwcGxpZWQgdG8gZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgaW52b2NhdGlvbiBtYWRlIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogYE1heFJlc3VsdHNgIHBlciByZXF1ZXN0IOKAlCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRocm91Z2ggMTAwMCAoQXRoZW5hIGxpbWl0cykuXG4gICAqIEBkZWZhdWx0VmFsdWUgMTAwMFxuICAgKi9cbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIGBRdWVyeVJlc3VsdFR5cGVgIGZvcndhcmRlZCB0byBBdGhlbmEgKGZvciBleGFtcGxlIHJhdyBkYXRhIHJvd3MgdmVyc3VzIG1hbmlmZXN0IHJvd3MgZm9yIENUQVMvVU5MT0FEL0lOU0VSVCBvdXRwdXRzKS5cbiAgICogQGRlZmF1bHRWYWx1ZSBgUXVlcnlSZXN1bHRUeXBlLkRBVEFfUk9XU2BcbiAgICovXG4gIHF1ZXJ5UmVzdWx0VHlwZT86IFF1ZXJ5UmVzdWx0VHlwZTtcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZXMgQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgIChBV1MgU0RLIGZvciBKYXZhU2NyaXB0IHYzKTogd2Fsa3MgYE5leHRUb2tlbmAgYW5kIHBhcnNlcyB0YWJ1bGFyIHJvd3Mgd2l0aFxuICogYGF0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyYCB3aGVuIG5lZWRlZC5cbiAqXG4gKiBgbWF4UmVzdWx0c2AgYW5kIGBxdWVyeVJlc3VsdFR5cGVgIGZyb20gdGhlIGNvbnN0cnVjdG9yIGFyZSBpbmNsdWRlZCBvbiBldmVyeSBgR2V0UXVlcnlSZXN1bHRzYCByZXF1ZXN0LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvYXRoZW5hL2NvbW1hbmQvR2V0UXVlcnlSZXN1bHRzQ29tbWFuZC8gfCBHZXRRdWVyeVJlc3VsdHNDb21tYW5kIChBV1MgU0RLKX1cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIge1xuXG4gIC8qKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBSb3cgdHlwZSBoZWxkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcGFnZVJlc3VsdCAtIFRoZSBtb3N0IHJlY2VudGx5IHJldHJpZXZlZCBwYWdlIGZyb20gYGZldGNoUGFnZWAsIGBmZXRjaFBhZ2VXaXRoYCwgb3IgYSBwYWdlIGl0ZXJhdG9yLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59IGlzIGRlZmluZWQgYW5kIGFub3RoZXIgcGFnZSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICovXG4gIHN0YXRpYyBoYXNOZXh0UGFnZTxUPihwYWdlUmVzdWx0OiBQYWdlUmVzdWx0PFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VSZXN1bHQubmV4dFRva2VuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogQXRoZW5hQ2xpZW50O1xuICAvKiogTm9ybWFsaXplZCBwYWdlciBzZXR0aW5ncyAoZXZlcnkgZmllbGQgc2V0IGFmdGVyIG1lcmdpbmcgZGVmYXVsdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPFBhZ2VyT3B0aW9ucz47XG4gIC8qKiBTdGF0ZWZ1bCBwYXJzZXIgcmV1c2VkIGFjcm9zcyBjYWxsczsgcmVjcmVhdGVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS4gKi9cbiAgcHJpdmF0ZSBwYXJzZXI6IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2xpZW50IC0gU0RLIHYzIGBBdGhlbmFDbGllbnRgIHVzZWQgdG8gY2FsbCBgR2V0UXVlcnlSZXN1bHRzYC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBgTWF4UmVzdWx0c2AgYW5kIGBRdWVyeVJlc3VsdFR5cGVgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBzaW5nbGUgcmVzdWx0cyBwYWdlIHVzaW5nIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gKGRpY3Rpb25hcnktc2hhcGVkIHJvd3MpLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFBhcnNlZCByb3dzIHBsdXMgcGFnaW5hdGlvbiBtZXRhZGF0YSBmcm9tIHRoaXMgcmVzcG9uc2Ugb25seS5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGlzIGVtcHR5IG9yIHdoaXRlc3BhY2Ugb25seS5cbiAgICovXG4gIGFzeW5jIGZldGNoUGFnZShcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8UGFyc2VkUm93Pj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0OiBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICBNYXhSZXN1bHRzOiB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyxcbiAgICAgIFF1ZXJ5UmVzdWx0VHlwZTogdGhpcy5vcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeVJlc3VsdHNDb21tYW5kKGlucHV0KSk7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZXIucGFyc2VSZXN1bHRTZXQocmVzcG9uc2UuUmVzdWx0U2V0KTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgb25lIHBhZ2UgYW5kIG1hcHMgZWFjaCB7QGxpbmsgUGFyc2VkUm93fSB0aHJvdWdoIGByb3dQYXJzZXJgLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBwcm9kdWNlZCBieSBgcm93UGFyc2VyYC5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBDb252ZXJ0cyBlYWNoIGRpY3Rpb25hcnkgcm93IGludG8gYFRgLlxuICAgKiBAcGFyYW0gbmV4dFRva2VuIC0gUGFzcyBgdW5kZWZpbmVkYCBmaXJzdDsgc3Vic2VxdWVudCBjYWxscyB1c2Uge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufS5cbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcm93cyBwbHVzIHBhZ2luYXRpb24gbWV0YWRhdGEgZnJvbSB0aGlzIHJlc3BvbnNlIG9ubHkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBpcyBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2VXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgICBuZXh0VG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0OiBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICBNYXhSZXN1bHRzOiB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyxcbiAgICAgIFF1ZXJ5UmVzdWx0VHlwZTogdGhpcy5vcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeVJlc3VsdHNDb21tYW5kKGlucHV0KSk7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZXIucGFyc2VSZXN1bHRTZXRXaXRoKHJlc3BvbnNlLlJlc3VsdFNldCwgcm93UGFyc2VyKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgd2Fsa3MgYWxsIHBhZ2VzIGZvciBhbiBleGVjdXRpb24sIHlpZWxkaW5nIHtAbGluayBQYWdlUmVzdWx0fSBvZiB7QGxpbmsgUGFyc2VkUm93fSBlYWNoIHN0ZXAuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAeWllbGRzIE9uZSBwYWdlIGF0IGEgdGltZSB1bnRpbCBBV1MgcmV0dXJucyBubyBgTmV4dFRva2VuYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXMoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICApOiBBc3luY0dlbmVyYXRvcjxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2UocXVlcnlFeGVjdXRpb25JZCwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbWUgYXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSBidXQgYXBwbGllcyBgcm93UGFyc2VyYCBwZXIgcm93IG9uIGV2ZXJ5IHBhZ2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIGVtaXR0ZWQgaW4ge0BsaW5rIFBhZ2VSZXN1bHQucm93c30uXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIFN1Y2Nlc3NpdmUge0BsaW5rIFBhZ2VSZXN1bHR9IHZhbHVlcyB3aG9zZSBgcm93c2AgYXJlIHR5cGVkIGFzIGBUYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXNXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmZldGNoUGFnZVdpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyLCBuZXh0VG9rZW4pO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICAgIG5leHRUb2tlbiA9IHBhZ2UubmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbnMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzV2l0aH0gaW50byBpbmRpdmlkdWFsIGBUYCB2YWx1ZXMgKG9uZSByb3cgcGVyIGBuZXh0KClgKS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIEVhY2ggZGF0YSByb3cgaW4gZXhlY3V0aW9uIG9yZGVyIHdpdGhvdXQgYnVmZmVyaW5nIHRoZSBmdWxsIHJlc3VsdCBzZXQgaW4gbWVtb3J5LlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8VD4ge1xuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiB0aGlzLml0ZXJhdGVQYWdlc1dpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyKSkge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZS5yb3dzKSB7XG4gICAgICAgIHlpZWxkIHJvdztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGVzIGEgZnJlc2gge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzbyBoZWFkZXItcm93IGhhbmRsaW5nIGRvZXMgbm90IGxlYWsgYmV0d2VlbiBxdWVyaWVzLlxuICAgKlxuICAgKiBDYWxsIHdoZW4gcmV1c2luZyB0aGlzIHBhZ2VyIGZvciBhIGRpZmZlcmVudCBgcXVlcnlFeGVjdXRpb25JZGAgdGhhbiB0aGUgcHJldmlvdXMgcGFyc2Ugc2VxdWVuY2UuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG59XG5cbi8qKiBSZS1leHBvcnRzIGBQYXJzZWRSb3dgIGFuZCBgUm93UGFyc2VyYCBmcm9tIHRoZSBgYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXJgIHBhY2thZ2UuICovXG5leHBvcnQgdHlwZSB7IFBhcnNlZFJvdywgUm93UGFyc2VyIH07Il19
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "athena-query-result-pager",
|
|
3
|
+
"description": "Paginate AWS Athena GetQueryResults calls with AWS SDK v3. This library walks NextToken, parses tabular rows with athena-query-result-parser, and forwards MaxResults and QueryResultType from PagerOptions on every GetQueryResults request.",
|
|
3
4
|
"repository": {
|
|
4
5
|
"type": "git",
|
|
5
6
|
"url": "https://github.com/gammarers-aws-sdk-extensions/athena-query-result-pager.git"
|
|
@@ -48,18 +49,33 @@
|
|
|
48
49
|
"typescript": "5.9.x"
|
|
49
50
|
},
|
|
50
51
|
"dependencies": {
|
|
51
|
-
"@aws-sdk/client-athena": "^3",
|
|
52
|
-
"athena-query-result-parser": "^0.
|
|
52
|
+
"@aws-sdk/client-athena": "^3.983.0",
|
|
53
|
+
"athena-query-result-parser": "^0.3.1"
|
|
53
54
|
},
|
|
55
|
+
"keywords": [
|
|
56
|
+
"athena",
|
|
57
|
+
"aws",
|
|
58
|
+
"aws-sdk",
|
|
59
|
+
"pager",
|
|
60
|
+
"query",
|
|
61
|
+
"result"
|
|
62
|
+
],
|
|
54
63
|
"engines": {
|
|
55
64
|
"node": ">= 20.0.0"
|
|
56
65
|
},
|
|
66
|
+
"devEngines": {
|
|
67
|
+
"packageManager": {
|
|
68
|
+
"name": "yarn",
|
|
69
|
+
"version": "1.22.22",
|
|
70
|
+
"onFail": "ignore"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
57
73
|
"main": "lib/index.js",
|
|
58
74
|
"license": "Apache-2.0",
|
|
59
75
|
"publishConfig": {
|
|
60
76
|
"access": "public"
|
|
61
77
|
},
|
|
62
|
-
"version": "0.
|
|
78
|
+
"version": "0.3.0",
|
|
63
79
|
"jest": {
|
|
64
80
|
"coverageProvider": "v8",
|
|
65
81
|
"testMatch": [
|