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 CHANGED
@@ -3,17 +3,16 @@
3
3
  ![npm](https://img.shields.io/npm/v/athena-query-result-pager)
4
4
  ![license](https://img.shields.io/npm/l/athena-query-result-pager)
5
5
 
6
- Paginate AWS Athena query results with AWS SDK v3. This package fetches results page by page and supports raw rows or custom row parsing via [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser).
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
- - Paginates Athena `GetQueryResults` responses with `nextToken`.
11
- - Supports raw rows (`ParsedRow`) and custom typed row parsing.
12
- - Provides async generators for page-by-page and row-by-row iteration.
13
- - Includes fail-fast input validation:
14
- - `maxResults` must be an integer in `1..1000`.
15
- - `queryExecutionId` must be a non-empty string.
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
- Dependencies: `@aws-sdk/client-athena`, `athena-query-result-parser`.
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: 'DATA_ROWS',
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 { id: string; name: string; }
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 a new query
107
+ ### Reset before another execution
95
108
 
96
- When processing a different query with the same pager instance, reset the parser state:
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
- - `maxResults?: number`
107
- - Default: `1000`
108
- - Valid range: integer `1..1000` (Athena limit)
109
- - Throws `RangeError` when invalid
110
- - `queryResultType?: 'DATA_ROWS'`
111
- - Default: `'DATA_ROWS'`
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
- - `fetchPage(queryExecutionId, nextToken?)`
116
- - `fetchPageWith(queryExecutionId, rowParser, nextToken?)`
130
+ - **`fetchPage(queryExecutionId, nextToken?)`**
131
+ - **`fetchPageWith(queryExecutionId, rowParser, nextToken?)`**
117
132
 
118
- Both methods throw an error if `queryExecutionId` is empty or whitespace only.
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?)`** → `Promise<PageResult<ParsedRow>>`
126
- - **`fetchPageWith<T>(queryExecutionId, rowParser, nextToken?)`** → `Promise<PageResult<T>>`
127
- - **`iteratePages(queryExecutionId)`** → `AsyncGenerator<PageResult<ParsedRow>>`
128
- - **`iteratePagesWith<T>(queryExecutionId, rowParser)`** → `AsyncGenerator<PageResult<T>>`
129
- - **`iterateRows<T>(queryExecutionId, rowParser)`** → `AsyncGenerator<T>`
130
- - **`reset()`** — resets parser state for a new query.
131
- - **`static hasNextPage<T>(pageResult: PageResult<T>)`** → `boolean`
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>`** — `{ rows: T[]; nextToken?: string; rowCount: number }`
136
- - **`PagerOptions`** — `{ maxResults?: number; queryResultType?: 'DATA_ROWS' }`
137
- - **`ParsedRow`**, **`RowParser<T>`** — re-exported from `athena-query-result-parser`.
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 `>= 20.0.0`
142
- - AWS SDK v3 client: `@aws-sdk/client-athena`
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
- * Type for a single page of query results.
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 row data. */
9
+ /** Parsed rows for this page only. */
8
10
  rows: T[];
9
- /** Token for the next page (undefined if no more pages). */
11
+ /** Continuation token for the following page (`undefined` when this is the last page). */
10
12
  nextToken?: string;
11
- /** Number of rows in this page. */
13
+ /** Same as `rows.length` for convenience. */
12
14
  rowCount: number;
13
15
  }
14
16
  /**
15
- * Options for the pager.
17
+ * Settings applied to every `GetQueryResults` invocation made by {@link AthenaQueryResultPager}.
16
18
  */
17
19
  export interface PagerOptions {
18
- /** Maximum number of rows per page (default: 1000). */
20
+ /**
21
+ * `MaxResults` per request — must be an integer from 1 through 1000 (Athena limits).
22
+ * @defaultValue 1000
23
+ */
19
24
  maxResults?: number;
20
- /** Query result type (default: 'DATA_ROWS'). */
21
- queryResultType?: 'DATA_ROWS';
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
- * AthenaQueryResultPager
25
- * Fetches Athena query results page by page.
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
- * Returns whether there is a next page.
30
- * @param pageResult - Previous page result.
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
- * Fetches one page of data as raw ParsedRow.
39
- * @param queryExecutionId - Query execution ID.
40
- * @param nextToken - Token for the next page (undefined on first call).
41
- * @returns Page result.
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
- * Fetches one page of data and transforms it with a custom row parser.
46
- * @param queryExecutionId - Query execution ID.
47
- * @param rowParser - Row parser.
48
- * @param nextToken - Token for the next page (undefined on first call).
49
- * @returns Page result.
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
- * Iterates page by page via AsyncGenerator (raw ParsedRow).
54
- * @param queryExecutionId - Query execution ID.
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
- * Iterates page by page via AsyncGenerator with a custom row parser.
59
- * @param queryExecutionId - Query execution ID.
60
- * @param rowParser - Row parser.
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
- * Iterates row by row via AsyncGenerator (memory-efficient).
65
- * @param queryExecutionId - Query execution ID.
66
- * @param rowParser - Row parser.
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
- * Resets the parser state. Call before processing a new query.
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-export of types from athena-query-result-parser. */
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 page. */
6
+ /** Default maximum number of result rows requested per {@link AthenaQueryResultPager} API call (`MaxResults`). */
7
7
  const DEFAULT_MAX_RESULTS = 1000;
8
- /** Minimum and maximum allowed by Athena GetQueryResults. */
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 query result type for GetQueryResults. */
12
- const DEFAULT_QUERY_RESULT_TYPE = 'DATA_ROWS';
12
+ /** Default `QueryResultType` forwarded to Athena `GetQueryResults`. */
13
+ const DEFAULT_QUERY_RESULT_TYPE = client_athena_1.QueryResultType.DATA_ROWS;
13
14
  /**
14
- * AthenaQueryResultPager
15
- * Fetches Athena query results page by page.
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
- * Returns whether there is a next page.
20
- * @param pageResult - Previous page result.
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
- * Fetches one page of data as raw ParsedRow.
39
- * @param queryExecutionId - Query execution ID.
40
- * @param nextToken - Token for the next page (undefined on first call).
41
- * @returns Page result.
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
- * Fetches one page of data and transforms it with a custom row parser.
62
- * @param queryExecutionId - Query execution ID.
63
- * @param rowParser - Row parser.
64
- * @param nextToken - Token for the next page (undefined on first call).
65
- * @returns Page result.
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
- * Iterates page by page via AsyncGenerator (raw ParsedRow).
86
- * @param queryExecutionId - Query execution ID.
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
- * Iterates page by page via AsyncGenerator with a custom row parser.
98
- * @param queryExecutionId - Query execution ID.
99
- * @param rowParser - Row parser.
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
- * Iterates row by row via AsyncGenerator (memory-efficient).
111
- * @param queryExecutionId - Query execution ID.
112
- * @param rowParser - Row parser.
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
- * Resets the parser state. Call before processing a new query.
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQUFxRztBQUVyRyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBZ0M1RDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxzQkFBc0I7SUFFakM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUksVUFBeUI7UUFDN0MsT0FBTyxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBUUQ7Ozs7T0FJRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDbEcsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsaURBQWlELGVBQWUsUUFBUSxlQUFlLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVU7WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSx5QkFBeUI7U0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxvREFBdUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FDYixnQkFBd0IsRUFDeEIsU0FBa0I7UUFFbEIsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFnQztZQUN6QyxnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNuQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO1NBQzlDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksc0NBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFNUQsT0FBTztZQUNMLElBQUk7WUFDSixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsZ0JBQXdCLEVBQ3hCLFNBQXVCLEVBQ3ZCLFNBQWtCO1FBRWxCLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBZ0M7WUFDekMsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbkMsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZTtTQUM5QyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHNDQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLE9BQU87WUFDTCxJQUFJO1lBQ0osU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUNqQixnQkFBd0I7UUFFeEIsSUFBSSxTQUE2QixDQUFDO1FBRWxDLEdBQUcsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRCxNQUFNLElBQUksQ0FBQztZQUNYLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLENBQUMsUUFBUSxTQUFTLEVBQUU7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FDckIsZ0JBQXdCLEVBQ3hCLFNBQXVCO1FBRXZCLElBQUksU0FBNkIsQ0FBQztRQUVsQyxHQUFHLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sSUFBSSxDQUFDO1lBQ1gsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsQ0FBQyxRQUFRLFNBQVMsRUFBRTtJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FDaEIsZ0JBQXdCLEVBQ3hCLFNBQXVCO1FBRXZCLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLG9EQUF1QixFQUFFLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBL0tELHdEQStLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0aGVuYUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgUXVlcnlSZXN1bHRUeXBlLCB0eXBlIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIsIHR5cGUgUGFyc2VkUm93LCB0eXBlIFJvd1BhcnNlciB9IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcblxuLyoqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0IHJvd3MgcmVxdWVzdGVkIHBlciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gQVBJIGNhbGwgKGBNYXhSZXN1bHRzYCkuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGBNYXhSZXN1bHRzYCB2YWx1ZSBhbGxvd2VkIGJ5IEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG4vKiogTWF4aW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBgUXVlcnlSZXN1bHRUeXBlYCBmb3J3YXJkZWQgdG8gQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9IFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1M7XG5cbi8qKlxuICogT25lIHBhZ2Ugb2YgQXRoZW5hIHF1ZXJ5IHJvd3MgYWZ0ZXIgYSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gZmV0Y2ggb3IgZ2VuZXJhdG9yIHN0ZXAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gUm93IHJlcHJlc2VudGF0aW9uOyB1c2Uge0BsaW5rIFBhcnNlZFJvd30gb3IgYSB0eXBlIHByb2R1Y2VkIGJ5IHtAbGluayBSb3dQYXJzZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXN1bHQ8VD4ge1xuICAvKiogUGFyc2VkIHJvd3MgZm9yIHRoaXMgcGFnZSBvbmx5LiAqL1xuICByb3dzOiBUW107XG4gIC8qKiBDb250aW51YXRpb24gdG9rZW4gZm9yIHRoZSBmb2xsb3dpbmcgcGFnZSAoYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UpLiAqL1xuICBuZXh0VG9rZW4/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.2"
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.2.8",
78
+ "version": "0.3.0",
63
79
  "jest": {
64
80
  "coverageProvider": "v8",
65
81
  "testMatch": [