@aws-cdk/aws-glue-alpha 2.237.1-alpha.0 → 2.239.0-alpha.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/.jsii +1011 -338
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +39 -1
- package/README.md +180 -0
- package/lib/code.d.ts +3 -3
- package/lib/code.js +4 -4
- package/lib/connection.d.ts +2 -2
- package/lib/connection.js +3 -3
- package/lib/data-format.js +5 -5
- package/lib/data-quality-ruleset.d.ts +3 -2
- package/lib/data-quality-ruleset.js +3 -3
- package/lib/database.d.ts +3 -2
- package/lib/database.js +2 -2
- package/lib/external-table.d.ts +5 -4
- package/lib/external-table.js +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/jobs/job.d.ts +7 -6
- package/lib/jobs/job.js +3 -3
- package/lib/jobs/pyspark-etl-job.d.ts +4 -3
- package/lib/jobs/pyspark-etl-job.js +2 -2
- package/lib/jobs/pyspark-flex-etl-job.d.ts +5 -4
- package/lib/jobs/pyspark-flex-etl-job.js +2 -2
- package/lib/jobs/pyspark-streaming-job.d.ts +4 -3
- package/lib/jobs/pyspark-streaming-job.js +2 -2
- package/lib/jobs/python-shell-job.d.ts +4 -3
- package/lib/jobs/python-shell-job.js +2 -2
- package/lib/jobs/ray-job.d.ts +4 -3
- package/lib/jobs/ray-job.js +2 -2
- package/lib/jobs/scala-spark-etl-job.d.ts +4 -3
- package/lib/jobs/scala-spark-etl-job.js +2 -2
- package/lib/jobs/scala-spark-flex-etl-job.d.ts +5 -4
- package/lib/jobs/scala-spark-flex-etl-job.js +2 -2
- package/lib/jobs/scala-spark-streaming-job.d.ts +4 -3
- package/lib/jobs/scala-spark-streaming-job.js +2 -2
- package/lib/jobs/spark-job.d.ts +5 -4
- package/lib/jobs/spark-job.js +2 -2
- package/lib/partition-projection.d.ts +243 -0
- package/lib/partition-projection.js +339 -0
- package/lib/s3-table.d.ts +4 -3
- package/lib/s3-table.js +2 -2
- package/lib/schema.js +1 -1
- package/lib/security-configuration.d.ts +1 -1
- package/lib/security-configuration.js +2 -2
- package/lib/storage-parameter.js +1 -1
- package/lib/table-base.d.ts +28 -7
- package/lib/table-base.js +47 -2
- package/lib/table-deprecated.d.ts +2 -1
- package/lib/table-deprecated.js +2 -2
- package/lib/triggers/trigger-options.d.ts +5 -5
- package/lib/triggers/trigger-options.js +2 -2
- package/lib/triggers/workflow.d.ts +2 -2
- package/lib/triggers/workflow.js +3 -3
- package/package.json +9 -9
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Partition projection type.
|
|
3
|
+
*
|
|
4
|
+
* Determines how Athena projects partition values.
|
|
5
|
+
*
|
|
6
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html
|
|
7
|
+
*/
|
|
8
|
+
export declare enum PartitionProjectionType {
|
|
9
|
+
/**
|
|
10
|
+
* Project partition values as integers within a range.
|
|
11
|
+
*/
|
|
12
|
+
INTEGER = "integer",
|
|
13
|
+
/**
|
|
14
|
+
* Project partition values as dates within a range.
|
|
15
|
+
*/
|
|
16
|
+
DATE = "date",
|
|
17
|
+
/**
|
|
18
|
+
* Project partition values from an explicit list of values.
|
|
19
|
+
*/
|
|
20
|
+
ENUM = "enum",
|
|
21
|
+
/**
|
|
22
|
+
* Project partition values that are injected at query time.
|
|
23
|
+
*/
|
|
24
|
+
INJECTED = "injected"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Date interval unit for partition projection.
|
|
28
|
+
*
|
|
29
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-date-type
|
|
30
|
+
*/
|
|
31
|
+
export declare enum DateIntervalUnit {
|
|
32
|
+
/**
|
|
33
|
+
* Year interval.
|
|
34
|
+
*/
|
|
35
|
+
YEARS = "YEARS",
|
|
36
|
+
/**
|
|
37
|
+
* Month interval.
|
|
38
|
+
*/
|
|
39
|
+
MONTHS = "MONTHS",
|
|
40
|
+
/**
|
|
41
|
+
* Week interval.
|
|
42
|
+
*/
|
|
43
|
+
WEEKS = "WEEKS",
|
|
44
|
+
/**
|
|
45
|
+
* Day interval (default).
|
|
46
|
+
*/
|
|
47
|
+
DAYS = "DAYS",
|
|
48
|
+
/**
|
|
49
|
+
* Hour interval.
|
|
50
|
+
*/
|
|
51
|
+
HOURS = "HOURS",
|
|
52
|
+
/**
|
|
53
|
+
* Minute interval.
|
|
54
|
+
*/
|
|
55
|
+
MINUTES = "MINUTES",
|
|
56
|
+
/**
|
|
57
|
+
* Second interval.
|
|
58
|
+
*/
|
|
59
|
+
SECONDS = "SECONDS"
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Properties for INTEGER partition projection configuration.
|
|
63
|
+
*/
|
|
64
|
+
export interface IntegerPartitionProjectionConfigurationProps {
|
|
65
|
+
/**
|
|
66
|
+
* Minimum value for the integer partition range (inclusive).
|
|
67
|
+
*/
|
|
68
|
+
readonly min: number;
|
|
69
|
+
/**
|
|
70
|
+
* Maximum value for the integer partition range (inclusive).
|
|
71
|
+
*/
|
|
72
|
+
readonly max: number;
|
|
73
|
+
/**
|
|
74
|
+
* Interval between partition values.
|
|
75
|
+
*
|
|
76
|
+
* @default 1
|
|
77
|
+
*/
|
|
78
|
+
readonly interval?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Number of digits to pad the partition value with leading zeros.
|
|
81
|
+
*
|
|
82
|
+
* With digits: 4, partition values: 0001, 0002, ..., 0100
|
|
83
|
+
*
|
|
84
|
+
* @default - no static number of digits and no leading zeroes
|
|
85
|
+
*/
|
|
86
|
+
readonly digits?: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Properties for DATE partition projection configuration.
|
|
90
|
+
*/
|
|
91
|
+
export interface DatePartitionProjectionConfigurationProps {
|
|
92
|
+
/**
|
|
93
|
+
* Start date for the partition range (inclusive).
|
|
94
|
+
*
|
|
95
|
+
* Can be either:
|
|
96
|
+
* - Fixed date in the format specified by `format` property
|
|
97
|
+
* (e.g., '2020-01-01' for format 'yyyy-MM-dd')
|
|
98
|
+
* - Relative date using NOW syntax
|
|
99
|
+
* (e.g., 'NOW', 'NOW-3YEARS', 'NOW+1MONTH')
|
|
100
|
+
*
|
|
101
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-date-type
|
|
102
|
+
*/
|
|
103
|
+
readonly min: string;
|
|
104
|
+
/**
|
|
105
|
+
* End date for the partition range (inclusive).
|
|
106
|
+
*
|
|
107
|
+
* Can be either:
|
|
108
|
+
* - Fixed date in the format specified by `format` property
|
|
109
|
+
* - Relative date using NOW syntax
|
|
110
|
+
*
|
|
111
|
+
* Same format constraints as `min`.
|
|
112
|
+
*/
|
|
113
|
+
readonly max: string;
|
|
114
|
+
/**
|
|
115
|
+
* Date format for partition values.
|
|
116
|
+
*
|
|
117
|
+
* Uses Java SimpleDateFormat patterns.
|
|
118
|
+
*
|
|
119
|
+
* @see https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
|
|
120
|
+
*/
|
|
121
|
+
readonly format: string;
|
|
122
|
+
/**
|
|
123
|
+
* Interval between partition values.
|
|
124
|
+
*
|
|
125
|
+
* When the provided dates are at single-day or single-month precision,
|
|
126
|
+
* the interval is optional and defaults to 1 day or 1 month, respectively.
|
|
127
|
+
* Otherwise, interval is required.
|
|
128
|
+
*
|
|
129
|
+
* @default - 1 for single-day or single-month precision, otherwise required
|
|
130
|
+
*/
|
|
131
|
+
readonly interval?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Unit for the interval.
|
|
134
|
+
*
|
|
135
|
+
* When the provided dates are at single-day or single-month precision,
|
|
136
|
+
* the intervalUnit is optional and defaults to 1 day or 1 month, respectively.
|
|
137
|
+
* Otherwise, the intervalUnit is required.
|
|
138
|
+
*
|
|
139
|
+
* @default - DAYS for single-day precision, MONTHS for single-month precision, otherwise required
|
|
140
|
+
*/
|
|
141
|
+
readonly intervalUnit?: DateIntervalUnit;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Properties for ENUM partition projection configuration.
|
|
145
|
+
*/
|
|
146
|
+
export interface EnumPartitionProjectionConfigurationProps {
|
|
147
|
+
/**
|
|
148
|
+
* Explicit list of partition values.
|
|
149
|
+
*
|
|
150
|
+
* @example ['us-east-1', 'us-west-2', 'eu-west-1']
|
|
151
|
+
*/
|
|
152
|
+
readonly values: string[];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Factory class for creating partition projection configurations.
|
|
156
|
+
*/
|
|
157
|
+
export declare class PartitionProjectionConfiguration {
|
|
158
|
+
/**
|
|
159
|
+
* Create an INTEGER partition projection configuration.
|
|
160
|
+
*/
|
|
161
|
+
static integer(props: IntegerPartitionProjectionConfigurationProps): PartitionProjectionConfiguration;
|
|
162
|
+
/**
|
|
163
|
+
* Create a DATE partition projection configuration.
|
|
164
|
+
*/
|
|
165
|
+
static date(props: DatePartitionProjectionConfigurationProps): PartitionProjectionConfiguration;
|
|
166
|
+
/**
|
|
167
|
+
* Create an ENUM partition projection configuration.
|
|
168
|
+
*/
|
|
169
|
+
static enum(props: EnumPartitionProjectionConfigurationProps): PartitionProjectionConfiguration;
|
|
170
|
+
/**
|
|
171
|
+
* Create an INJECTED partition projection configuration.
|
|
172
|
+
*
|
|
173
|
+
* Partition values are injected at query time through the query statement.
|
|
174
|
+
*
|
|
175
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-injected-type
|
|
176
|
+
*/
|
|
177
|
+
static injected(): PartitionProjectionConfiguration;
|
|
178
|
+
/**
|
|
179
|
+
* The type of partition projection.
|
|
180
|
+
*/
|
|
181
|
+
readonly type: PartitionProjectionType;
|
|
182
|
+
/**
|
|
183
|
+
* Range of partition values for INTEGER type.
|
|
184
|
+
*
|
|
185
|
+
* Array of [min, max] as numbers.
|
|
186
|
+
*/
|
|
187
|
+
readonly integerRange?: number[];
|
|
188
|
+
/**
|
|
189
|
+
* Range of partition values for DATE type.
|
|
190
|
+
*
|
|
191
|
+
* Array of [start, end] as date strings.
|
|
192
|
+
*/
|
|
193
|
+
readonly dateRange?: string[];
|
|
194
|
+
/**
|
|
195
|
+
* Interval between partition values.
|
|
196
|
+
*/
|
|
197
|
+
readonly interval?: number;
|
|
198
|
+
/**
|
|
199
|
+
* Number of digits to pad INTEGER partition values.
|
|
200
|
+
*/
|
|
201
|
+
readonly digits?: number;
|
|
202
|
+
/**
|
|
203
|
+
* Date format for DATE partition values (Java SimpleDateFormat).
|
|
204
|
+
*/
|
|
205
|
+
readonly format?: string;
|
|
206
|
+
/**
|
|
207
|
+
* Unit for DATE partition interval.
|
|
208
|
+
*/
|
|
209
|
+
readonly intervalUnit?: DateIntervalUnit;
|
|
210
|
+
/**
|
|
211
|
+
* Explicit list of values for ENUM partitions.
|
|
212
|
+
*/
|
|
213
|
+
readonly values?: string[];
|
|
214
|
+
private constructor();
|
|
215
|
+
/**
|
|
216
|
+
* Renders CloudFormation parameters for this partition projection configuration.
|
|
217
|
+
*
|
|
218
|
+
* @param columnName - The partition column name
|
|
219
|
+
* @internal
|
|
220
|
+
*/
|
|
221
|
+
_renderParameters(columnName: string): {
|
|
222
|
+
[key: string]: string;
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Partition projection configuration for a table.
|
|
227
|
+
*
|
|
228
|
+
* Maps partition column names to their projection configurations.
|
|
229
|
+
* The key is the partition column name, the value is the partition configuration.
|
|
230
|
+
*/
|
|
231
|
+
export type PartitionProjection = {
|
|
232
|
+
[columnName: string]: PartitionProjectionConfiguration;
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Generates CloudFormation parameters for partition projection configuration.
|
|
236
|
+
*
|
|
237
|
+
* @param columnName - The partition column name
|
|
238
|
+
* @param config - The partition configuration
|
|
239
|
+
* @returns CloudFormation parameters
|
|
240
|
+
*/
|
|
241
|
+
export declare function generatePartitionProjectionParameters(columnName: string, config: PartitionProjectionConfiguration): {
|
|
242
|
+
[key: string]: string;
|
|
243
|
+
};
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PartitionProjectionConfiguration = exports.DateIntervalUnit = exports.PartitionProjectionType = void 0;
|
|
4
|
+
exports.generatePartitionProjectionParameters = generatePartitionProjectionParameters;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
/**
|
|
9
|
+
* Partition projection type.
|
|
10
|
+
*
|
|
11
|
+
* Determines how Athena projects partition values.
|
|
12
|
+
*
|
|
13
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html
|
|
14
|
+
*/
|
|
15
|
+
var PartitionProjectionType;
|
|
16
|
+
(function (PartitionProjectionType) {
|
|
17
|
+
/**
|
|
18
|
+
* Project partition values as integers within a range.
|
|
19
|
+
*/
|
|
20
|
+
PartitionProjectionType["INTEGER"] = "integer";
|
|
21
|
+
/**
|
|
22
|
+
* Project partition values as dates within a range.
|
|
23
|
+
*/
|
|
24
|
+
PartitionProjectionType["DATE"] = "date";
|
|
25
|
+
/**
|
|
26
|
+
* Project partition values from an explicit list of values.
|
|
27
|
+
*/
|
|
28
|
+
PartitionProjectionType["ENUM"] = "enum";
|
|
29
|
+
/**
|
|
30
|
+
* Project partition values that are injected at query time.
|
|
31
|
+
*/
|
|
32
|
+
PartitionProjectionType["INJECTED"] = "injected";
|
|
33
|
+
})(PartitionProjectionType || (exports.PartitionProjectionType = PartitionProjectionType = {}));
|
|
34
|
+
/**
|
|
35
|
+
* Date interval unit for partition projection.
|
|
36
|
+
*
|
|
37
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-date-type
|
|
38
|
+
*/
|
|
39
|
+
var DateIntervalUnit;
|
|
40
|
+
(function (DateIntervalUnit) {
|
|
41
|
+
/**
|
|
42
|
+
* Year interval.
|
|
43
|
+
*/
|
|
44
|
+
DateIntervalUnit["YEARS"] = "YEARS";
|
|
45
|
+
/**
|
|
46
|
+
* Month interval.
|
|
47
|
+
*/
|
|
48
|
+
DateIntervalUnit["MONTHS"] = "MONTHS";
|
|
49
|
+
/**
|
|
50
|
+
* Week interval.
|
|
51
|
+
*/
|
|
52
|
+
DateIntervalUnit["WEEKS"] = "WEEKS";
|
|
53
|
+
/**
|
|
54
|
+
* Day interval (default).
|
|
55
|
+
*/
|
|
56
|
+
DateIntervalUnit["DAYS"] = "DAYS";
|
|
57
|
+
/**
|
|
58
|
+
* Hour interval.
|
|
59
|
+
*/
|
|
60
|
+
DateIntervalUnit["HOURS"] = "HOURS";
|
|
61
|
+
/**
|
|
62
|
+
* Minute interval.
|
|
63
|
+
*/
|
|
64
|
+
DateIntervalUnit["MINUTES"] = "MINUTES";
|
|
65
|
+
/**
|
|
66
|
+
* Second interval.
|
|
67
|
+
*/
|
|
68
|
+
DateIntervalUnit["SECONDS"] = "SECONDS";
|
|
69
|
+
})(DateIntervalUnit || (exports.DateIntervalUnit = DateIntervalUnit = {}));
|
|
70
|
+
/**
|
|
71
|
+
* Factory class for creating partition projection configurations.
|
|
72
|
+
*/
|
|
73
|
+
class PartitionProjectionConfiguration {
|
|
74
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.239.0-alpha.0" };
|
|
75
|
+
/**
|
|
76
|
+
* Create an INTEGER partition projection configuration.
|
|
77
|
+
*/
|
|
78
|
+
static integer(props) {
|
|
79
|
+
try {
|
|
80
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_IntegerPartitionProjectionConfigurationProps(props);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
84
|
+
Error.captureStackTrace(error, this.integer);
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
// Validate min/max are integers
|
|
89
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.min) && !aws_cdk_lib_1.Token.isUnresolved(props.max)) {
|
|
90
|
+
if (!Number.isInteger(props.min) || !Number.isInteger(props.max)) {
|
|
91
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`INTEGER partition projection range must contain integers, but got [${props.min}, ${props.max}]`);
|
|
92
|
+
}
|
|
93
|
+
// Validate min <= max
|
|
94
|
+
if (props.min > props.max) {
|
|
95
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`INTEGER partition projection range must be [min, max] where min <= max, but got [${props.min}, ${props.max}]`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Validate interval
|
|
99
|
+
if (props.interval !== undefined &&
|
|
100
|
+
!aws_cdk_lib_1.Token.isUnresolved(props.interval) &&
|
|
101
|
+
(!Number.isInteger(props.interval) || props.interval <= 0)) {
|
|
102
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`INTEGER partition projection interval must be a positive integer, but got ${props.interval}`);
|
|
103
|
+
}
|
|
104
|
+
// Validate digits
|
|
105
|
+
if (props.digits !== undefined &&
|
|
106
|
+
!aws_cdk_lib_1.Token.isUnresolved(props.digits) &&
|
|
107
|
+
(!Number.isInteger(props.digits) || props.digits < 1)) {
|
|
108
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`INTEGER partition projection digits must be an integer >= 1, but got ${props.digits}`);
|
|
109
|
+
}
|
|
110
|
+
return new PartitionProjectionConfiguration({
|
|
111
|
+
type: PartitionProjectionType.INTEGER,
|
|
112
|
+
integerRange: [props.min, props.max],
|
|
113
|
+
interval: props.interval,
|
|
114
|
+
digits: props.digits,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a DATE partition projection configuration.
|
|
119
|
+
*/
|
|
120
|
+
static date(props) {
|
|
121
|
+
try {
|
|
122
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_DatePartitionProjectionConfigurationProps(props);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
126
|
+
Error.captureStackTrace(error, this.date);
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
// Validate min/max are not empty
|
|
131
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.min) &&
|
|
132
|
+
!aws_cdk_lib_1.Token.isUnresolved(props.max) &&
|
|
133
|
+
(props.min.trim() === '' || props.max.trim() === '')) {
|
|
134
|
+
throw new aws_cdk_lib_1.UnscopedValidationError('DATE partition projection range must not contain empty strings');
|
|
135
|
+
}
|
|
136
|
+
// Validate format
|
|
137
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.format)) {
|
|
138
|
+
// Validate format is not empty
|
|
139
|
+
if (props.format.trim() === '') {
|
|
140
|
+
throw new aws_cdk_lib_1.UnscopedValidationError('DATE partition projection format must be a non-empty string');
|
|
141
|
+
}
|
|
142
|
+
// Validate format pattern characters (Java 8 DateTimeFormatter)
|
|
143
|
+
const validPatternLetters = 'GyuYDMLdQqwWEecFahKkHmsSAnNVzOXxZp';
|
|
144
|
+
const format = props.format;
|
|
145
|
+
let inQuote = false;
|
|
146
|
+
const invalidChars = [];
|
|
147
|
+
for (let i = 0; i < format.length; i++) {
|
|
148
|
+
const ch = format[i];
|
|
149
|
+
if (ch === "'") {
|
|
150
|
+
if (i + 1 < format.length && format[i + 1] === "'") {
|
|
151
|
+
// '' is an escaped single quote literal, skip both
|
|
152
|
+
i++;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
inQuote = !inQuote;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (!inQuote && /[a-zA-Z]/.test(ch)) {
|
|
159
|
+
if (!validPatternLetters.includes(ch)) {
|
|
160
|
+
invalidChars.push(ch);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (inQuote) {
|
|
165
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`DATE partition projection format has an unclosed single quote: '${format}'`);
|
|
166
|
+
}
|
|
167
|
+
if (invalidChars.length > 0) {
|
|
168
|
+
const unique = [...new Set(invalidChars)];
|
|
169
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`DATE partition projection format contains invalid pattern characters: ${unique.join(', ')}. Must use Java DateTimeFormatter valid pattern letters.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Validate interval
|
|
173
|
+
if (props.interval !== undefined &&
|
|
174
|
+
!aws_cdk_lib_1.Token.isUnresolved(props.interval) &&
|
|
175
|
+
(!Number.isInteger(props.interval) || props.interval <= 0)) {
|
|
176
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`DATE partition projection interval must be a positive integer, but got ${props.interval}`);
|
|
177
|
+
}
|
|
178
|
+
return new PartitionProjectionConfiguration({
|
|
179
|
+
type: PartitionProjectionType.DATE,
|
|
180
|
+
dateRange: [props.min, props.max],
|
|
181
|
+
interval: props.interval,
|
|
182
|
+
format: props.format,
|
|
183
|
+
intervalUnit: props.intervalUnit,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create an ENUM partition projection configuration.
|
|
188
|
+
*/
|
|
189
|
+
static enum(props) {
|
|
190
|
+
try {
|
|
191
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_EnumPartitionProjectionConfigurationProps(props);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
195
|
+
Error.captureStackTrace(error, this.enum);
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
// Validate values is not empty
|
|
200
|
+
if (props.values.length === 0) {
|
|
201
|
+
throw new aws_cdk_lib_1.UnscopedValidationError('ENUM partition projection values must be a non-empty array');
|
|
202
|
+
}
|
|
203
|
+
for (let i = 0; i < props.values.length; i++) {
|
|
204
|
+
const value = props.values[i];
|
|
205
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(value)) {
|
|
206
|
+
if (value.trim() === '') {
|
|
207
|
+
throw new aws_cdk_lib_1.UnscopedValidationError('ENUM partition projection values must not contain empty strings');
|
|
208
|
+
}
|
|
209
|
+
if (value.includes(',')) {
|
|
210
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`ENUM partition projection values must not contain commas because the values are serialized as a comma-separated list, got: '${value}'`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return new PartitionProjectionConfiguration({
|
|
215
|
+
type: PartitionProjectionType.ENUM,
|
|
216
|
+
values: props.values,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Create an INJECTED partition projection configuration.
|
|
221
|
+
*
|
|
222
|
+
* Partition values are injected at query time through the query statement.
|
|
223
|
+
*
|
|
224
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-injected-type
|
|
225
|
+
*/
|
|
226
|
+
static injected() {
|
|
227
|
+
return new PartitionProjectionConfiguration({
|
|
228
|
+
type: PartitionProjectionType.INJECTED,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The type of partition projection.
|
|
233
|
+
*/
|
|
234
|
+
type;
|
|
235
|
+
/**
|
|
236
|
+
* Range of partition values for INTEGER type.
|
|
237
|
+
*
|
|
238
|
+
* Array of [min, max] as numbers.
|
|
239
|
+
*/
|
|
240
|
+
integerRange;
|
|
241
|
+
/**
|
|
242
|
+
* Range of partition values for DATE type.
|
|
243
|
+
*
|
|
244
|
+
* Array of [start, end] as date strings.
|
|
245
|
+
*/
|
|
246
|
+
dateRange;
|
|
247
|
+
/**
|
|
248
|
+
* Interval between partition values.
|
|
249
|
+
*/
|
|
250
|
+
interval;
|
|
251
|
+
/**
|
|
252
|
+
* Number of digits to pad INTEGER partition values.
|
|
253
|
+
*/
|
|
254
|
+
digits;
|
|
255
|
+
/**
|
|
256
|
+
* Date format for DATE partition values (Java SimpleDateFormat).
|
|
257
|
+
*/
|
|
258
|
+
format;
|
|
259
|
+
/**
|
|
260
|
+
* Unit for DATE partition interval.
|
|
261
|
+
*/
|
|
262
|
+
intervalUnit;
|
|
263
|
+
/**
|
|
264
|
+
* Explicit list of values for ENUM partitions.
|
|
265
|
+
*/
|
|
266
|
+
values;
|
|
267
|
+
constructor(props) {
|
|
268
|
+
this.type = props.type;
|
|
269
|
+
this.integerRange = props.integerRange;
|
|
270
|
+
this.dateRange = props.dateRange;
|
|
271
|
+
this.interval = props.interval;
|
|
272
|
+
this.digits = props.digits;
|
|
273
|
+
this.format = props.format;
|
|
274
|
+
this.intervalUnit = props.intervalUnit;
|
|
275
|
+
this.values = props.values;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Renders CloudFormation parameters for this partition projection configuration.
|
|
279
|
+
*
|
|
280
|
+
* @param columnName - The partition column name
|
|
281
|
+
* @internal
|
|
282
|
+
*/
|
|
283
|
+
_renderParameters(columnName) {
|
|
284
|
+
const params = {
|
|
285
|
+
[`projection.${columnName}.type`]: this.type,
|
|
286
|
+
};
|
|
287
|
+
switch (this.type) {
|
|
288
|
+
case PartitionProjectionType.INTEGER: {
|
|
289
|
+
const [min, max] = this.integerRange;
|
|
290
|
+
params[`projection.${columnName}.range`] = `${min},${max}`;
|
|
291
|
+
if (this.interval !== undefined) {
|
|
292
|
+
params[`projection.${columnName}.interval`] = this.interval.toString();
|
|
293
|
+
}
|
|
294
|
+
if (this.digits !== undefined) {
|
|
295
|
+
params[`projection.${columnName}.digits`] = this.digits.toString();
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case PartitionProjectionType.DATE: {
|
|
300
|
+
const [start, end] = this.dateRange;
|
|
301
|
+
params[`projection.${columnName}.range`] = `${start},${end}`;
|
|
302
|
+
params[`projection.${columnName}.format`] = this.format;
|
|
303
|
+
if (this.interval !== undefined) {
|
|
304
|
+
params[`projection.${columnName}.interval`] = this.interval.toString();
|
|
305
|
+
}
|
|
306
|
+
if (this.intervalUnit !== undefined) {
|
|
307
|
+
params[`projection.${columnName}.interval.unit`] = this.intervalUnit;
|
|
308
|
+
}
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
case PartitionProjectionType.ENUM: {
|
|
312
|
+
params[`projection.${columnName}.values`] = this.values.join(',');
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
case PartitionProjectionType.INJECTED: {
|
|
316
|
+
// INJECTED has no additional parameters
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
default: {
|
|
320
|
+
// TypeScript exhaustiveness check
|
|
321
|
+
const exhaustiveCheck = this.type;
|
|
322
|
+
throw new aws_cdk_lib_1.UnscopedValidationError(`Unknown partition projection type for "${columnName}": ${exhaustiveCheck}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return params;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
exports.PartitionProjectionConfiguration = PartitionProjectionConfiguration;
|
|
329
|
+
/**
|
|
330
|
+
* Generates CloudFormation parameters for partition projection configuration.
|
|
331
|
+
*
|
|
332
|
+
* @param columnName - The partition column name
|
|
333
|
+
* @param config - The partition configuration
|
|
334
|
+
* @returns CloudFormation parameters
|
|
335
|
+
*/
|
|
336
|
+
function generatePartitionProjectionParameters(columnName, config) {
|
|
337
|
+
return config._renderParameters(columnName);
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxaEJBLHNGQUtDOzs7QUExaEJELDZDQUE2RDtBQUU3RDs7Ozs7O0dBTUc7QUFDSCxJQUFZLHVCQW9CWDtBQXBCRCxXQUFZLHVCQUF1QjtJQUNqQzs7T0FFRztJQUNILDhDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsd0NBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsd0NBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsZ0RBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQXBCVyx1QkFBdUIsdUNBQXZCLHVCQUF1QixRQW9CbEM7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxnQkFtQ1g7QUFuQ0QsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxxQ0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILG1DQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILGlDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILG1DQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsdUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQW5DVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQW1DM0I7QUEwSkQ7O0dBRUc7QUFDSCxNQUFhLGdDQUFnQzs7SUFDM0M7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQW1EOzs7Ozs7Ozs7O1FBQ3ZFLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMs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Z0IscUNBQXFDLENBQ25ELFVBQWtCLEVBQ2xCLE1BQXdDO0lBRXhDLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbi8qKlxuICogUGFydGl0aW9uIHByb2plY3Rpb24gdHlwZS5cbiAqXG4gKiBEZXRlcm1pbmVzIGhvdyBBdGhlbmEgcHJvamVjdHMgcGFydGl0aW9uIHZhbHVlcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRpdGlvblByb2plY3Rpb25UeXBlIHtcbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyBhcyBpbnRlZ2VycyB3aXRoaW4gYSByYW5nZS5cbiAgICovXG4gIElOVEVHRVIgPSAnaW50ZWdlcicsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyBhcyBkYXRlcyB3aXRoaW4gYSByYW5nZS5cbiAgICovXG4gIERBVEUgPSAnZGF0ZScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyBmcm9tIGFuIGV4cGxpY2l0IGxpc3Qgb2YgdmFsdWVzLlxuICAgKi9cbiAgRU5VTSA9ICdlbnVtJyxcblxuICAvKipcbiAgICogUHJvamVjdCBwYXJ0aXRpb24gdmFsdWVzIHRoYXQgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUuXG4gICAqL1xuICBJTkpFQ1RFRCA9ICdpbmplY3RlZCcsXG59XG5cbi8qKlxuICogRGF0ZSBpbnRlcnZhbCB1bml0IGZvciBwYXJ0aXRpb24gcHJvamVjdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWRhdGUtdHlwZVxuICovXG5leHBvcnQgZW51bSBEYXRlSW50ZXJ2YWxVbml0IHtcbiAgLyoqXG4gICAqIFllYXIgaW50ZXJ2YWwuXG4gICAqL1xuICBZRUFSUyA9ICdZRUFSUycsXG5cbiAgLyoqXG4gICAqIE1vbnRoIGludGVydmFsLlxuICAgKi9cbiAgTU9OVEhTID0gJ01PTlRIUycsXG5cbiAgLyoqXG4gICAqIFdlZWsgaW50ZXJ2YWwuXG4gICAqL1xuICBXRUVLUyA9ICdXRUVLUycsXG5cbiAgLyoqXG4gICAqIERheSBpbnRlcnZhbCAoZGVmYXVsdCkuXG4gICAqL1xuICBEQVlTID0gJ0RBWVMnLFxuXG4gIC8qKlxuICAgKiBIb3VyIGludGVydmFsLlxuICAgKi9cbiAgSE9VUlMgPSAnSE9VUlMnLFxuXG4gIC8qKlxuICAgKiBNaW51dGUgaW50ZXJ2YWwuXG4gICAqL1xuICBNSU5VVEVTID0gJ01JTlVURVMnLFxuXG4gIC8qKlxuICAgKiBTZWNvbmQgaW50ZXJ2YWwuXG4gICAqL1xuICBTRUNPTkRTID0gJ1NFQ09ORFMnLFxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlZ2VyUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBNaW5pbXVtIHZhbHVlIGZvciB0aGUgaW50ZWdlciBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqL1xuICByZWFkb25seSBtaW46IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkaWdpdHMgdG8gcGFkIHRoZSBwYXJ0aXRpb24gdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zLlxuICAgKlxuICAgKiBXaXRoIGRpZ2l0czogNCwgcGFydGl0aW9uIHZhbHVlczogMDAwMSwgMDAwMiwgLi4uLCAwMTAwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3RhdGljIG51bWJlciBvZiBkaWdpdHMgYW5kIG5vIGxlYWRpbmcgemVyb2VzXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAgIChlLmcuLCAnMjAyMC0wMS0wMScgZm9yIGZvcm1hdCAneXl5eS1NTS1kZCcpXG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqICAgKGUuZy4sICdOT1cnLCAnTk9XLTNZRUFSUycsICdOT1crMU1PTlRIJylcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAgICovXG4gIHJlYWRvbmx5IG1pbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICpcbiAgICogQ2FuIGJlIGVpdGhlcjpcbiAgICogLSBGaXhlZCBkYXRlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGBmb3JtYXRgIHByb3BlcnR5XG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqXG4gICAqIFNhbWUgZm9ybWF0IGNvbnN0cmFpbnRzIGFzIGBtaW5gLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBwYXR0ZXJucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZXJ2YWwgYmV0d2VlbiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBXaGVuIHRoZSBwcm92aWRlZCBkYXRlcyBhcmUgYXQgc2luZ2xlLWRheSBvciBzaW5nbGUtbW9udGggcHJlY2lzaW9uLFxuICAgKiB0aGUgaW50ZXJ2YWwgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDEgZGF5IG9yIDEgbW9udGgsIHJlc3BlY3RpdmVseS5cbiAgICogT3RoZXJ3aXNlLCBpbnRlcnZhbCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAxIGZvciBzaW5nbGUtZGF5IG9yIHNpbmdsZS1tb250aCBwcmVjaXNpb24sIG90aGVyd2lzZSByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIHRoZSBpbnRlcnZhbC5cbiAgICpcbiAgICogV2hlbiB0aGUgcHJvdmlkZWQgZGF0ZXMgYXJlIGF0IHNpbmdsZS1kYXkgb3Igc2luZ2xlLW1vbnRoIHByZWNpc2lvbixcbiAgICogdGhlIGludGVydmFsVW5pdCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMSBkYXkgb3IgMSBtb250aCwgcmVzcGVjdGl2ZWx5LlxuICAgKiBPdGhlcndpc2UsIHRoZSBpbnRlcnZhbFVuaXQgaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gREFZUyBmb3Igc2luZ2xlLWRheSBwcmVjaXNpb24sIE1PTlRIUyBmb3Igc2luZ2xlLW1vbnRoIHByZWNpc2lvbiwgb3RoZXJ3aXNlIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBjb250YWluIGludGVnZXJzLCBidXQgZ290IFske3Byb3BzLm1pbn0sICR7cHJvcHMubWF4fV1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBtaW4gPD0gbWF4XG4gICAgICBpZiAocHJvcHMubWluID4gcHJvcHMubWF4KSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGJlIFttaW4sIG1heF0gd2hlcmUgbWluIDw9IG1heCwgYnV0IGdvdCBbJHtwcm9wcy5taW59LCAke3Byb3BzLm1heH1dYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbnRlcnZhbFxuICAgIGlmIChcbiAgICAgIHByb3BzLmludGVydmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuaW50ZXJ2YWwpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuaW50ZXJ2YWwpIHx8IHByb3BzLmludGVydmFsIDw9IDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gZm9ybWF0IGhhcyBhbiB1bmNsb3NlZCBzaW5nbGUgcXVvdGU6ICcke2Zvcm1hdH0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGludmFsaWRDaGFycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KGludmFsaWRDaGFycyldO1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gZm9ybWF0IGNvbnRhaW5zIGludmFsaWQgcGF0dGVybiBjaGFyYWN0ZXJzOiAke3VuaXF1ZS5qb2luKCcsICcpfS4gTXVzdCB1c2UgSmF2YSBEYXRlVGltZUZvcm1hdHRlciB2YWxpZCBwYXR0ZXJuIGxldHRlcnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbnRlcnZhbFxuICAgIGlmIChcbiAgICAgIHByb3BzLmludGVydmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuaW50ZXJ2YWwpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuaW50ZXJ2YWwpIHx8IHByb3BzLmludGVydmFsIDw9IDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5EQVRFLFxuICAgICAgZGF0ZVJhbmdlOiBbcHJvcHMubWluLCBwcm9wcy5tYXhdLFxuICAgICAgaW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgZm9ybWF0OiBwcm9wcy5mb3JtYXQsXG4gICAgICBpbnRlcnZhbFVuaXQ6IHByb3BzLmludGVydmFsVW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRU5VTSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBlbnVtKHByb3BzOiBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyk6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgICAvLyBWYWxpZGF0ZSB2YWx1ZXMgaXMgbm90IGVtcHR5XG4gICAgaWYgKHByb3BzLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnRU5VTSBwYXJ0aXRpb24gcHJvamVjdGlvbiB2YWx1ZXMgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gY29tbWFzIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgc2VyaWFsaXplZCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCBnb3Q6ICcke3ZhbHVlfSdgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkVOVU0sXG4gICAgICB2YWx1ZXM6IHByb3BzLnZhbHVlcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSU5KRUNURUQgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogUGFydGl0aW9uIHZhbHVlcyBhcmUgaW5qZWN0ZWQgYXQgcXVlcnkgdGltZSB0aHJvdWdoIHRoZSBxdWVyeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24taW5qZWN0ZWQtdHlwZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbmplY3RlZCgpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTkpFQ1RFRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwYXJ0aXRpb24gcHJvamVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZWdlclJhbmdlPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFJhbmdlIG9mIHBhcnRpdGlvbiB2YWx1ZXMgZm9yIERBVEUgdHlwZS5cbiAgICpcbiAgICogQXJyYXkgb2YgW3N0YXJ0LCBlbmRdIGFzIGRhdGUgc3RyaW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRlUmFuZ2U/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgYmV0d2VlbiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgREFURSBwYXJ0aXRpb24gdmFsdWVzIChKYXZhIFNpbXBsZURhdGVGb3JtYXQpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogVW5pdCBmb3IgREFURSBwYXJ0aXRpb24gaW50ZXJ2YWwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKSB7XG4gICAgdGhpcy50eXBlID0gcHJvcHMudHlwZTtcbiAgICB0aGlzLmludGVnZXJSYW5nZSA9IHByb3BzLmludGVnZXJSYW5nZTtcbiAgICB0aGlzLmRhdGVSYW5nZSA9IHByb3BzLmRhdGVSYW5nZTtcbiAgICB0aGlzLmludGVydmFsID0gcHJvcHMuaW50ZXJ2YWw7XG4gICAgdGhpcy5kaWdpdHMgPSBwcm9wcy5kaWdpdHM7XG4gICAgdGhpcy5mb3JtYXQgPSBwcm9wcy5mb3JtYXQ7XG4gICAgdGhpcy5pbnRlcnZhbFVuaXQgPSBwcm9wcy5pbnRlcnZhbFVuaXQ7XG4gICAgdGhpcy52YWx1ZXMgPSBwcm9wcy52YWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0gVGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmVuZGVyUGFyYW1ldGVycyhjb2x1bW5OYW1lOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS50eXBlYF06IHRoaXMudHlwZSxcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUjoge1xuICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gdGhpcy5pbnRlZ2VyUmFuZ2UhO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5yYW5nZWBdID0gYCR7bWlufSwke21heH1gO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uaW50ZXJ2YWxgXSA9IHRoaXMuaW50ZXJ2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaWdpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmRpZ2l0c2BdID0gdGhpcy5kaWdpdHMudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuREFURToge1xuICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLmRhdGVSYW5nZSE7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnJhbmdlYF0gPSBgJHtzdGFydH0sJHtlbmR9YDtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uZm9ybWF0YF0gPSB0aGlzLmZvcm1hdCE7XG4gICAgICAgIGlmICh0aGlzLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbGBdID0gdGhpcy5pbnRlcnZhbC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmludGVydmFsVW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uaW50ZXJ2YWwudW5pdGBdID0gdGhpcy5pbnRlcnZhbFVuaXQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkVOVU06IHtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0udmFsdWVzYF0gPSB0aGlzLnZhbHVlcyEuam9pbignLCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQ6IHtcbiAgICAgICAgLy8gSU5KRUNURUQgaGFzIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gVHlwZVNjcmlwdCBleGhhdXN0aXZlbmVzcyBjaGVja1xuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gdGhpcy50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVua25vd24gcGFydGl0aW9uIHByb2plY3Rpb24gdHlwZSBmb3IgXCIke2NvbHVtbk5hbWV9XCI6ICR7ZXhoYXVzdGl2ZUNoZWNrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGEgdGFibGUuXG4gKlxuICogTWFwcyBwYXJ0aXRpb24gY29sdW1uIG5hbWVzIHRvIHRoZWlyIHByb2plY3Rpb24gY29uZmlndXJhdGlvbnMuXG4gKiBUaGUga2V5IGlzIHRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWUsIHRoZSB2YWx1ZSBpcyB0aGUgcGFydGl0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRpdGlvblByb2plY3Rpb24gPSB7XG4gIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbjtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgZm9yIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIGNvbHVtbk5hbWUgLSBUaGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhcnRpdGlvblByb2plY3Rpb25QYXJhbWV0ZXJzKFxuICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gIGNvbmZpZzogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24sXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgcmV0dXJuIGNvbmZpZy5fcmVuZGVyUGFyYW1ldGVycyhjb2x1bW5OYW1lKTtcbn1cbiJdfQ==
|
package/lib/s3-table.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { CfnTable } from 'aws-cdk-lib/aws-glue';
|
|
2
|
-
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import type * as iam from 'aws-cdk-lib/aws-iam';
|
|
3
3
|
import * as kms from 'aws-cdk-lib/aws-kms';
|
|
4
4
|
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
5
|
-
import { Construct } from 'constructs';
|
|
6
|
-
import { PartitionIndex,
|
|
5
|
+
import type { Construct } from 'constructs';
|
|
6
|
+
import type { PartitionIndex, TableBaseProps } from './table-base';
|
|
7
|
+
import { TableBase } from './table-base';
|
|
7
8
|
/**
|
|
8
9
|
* Encryption options for a Table.
|
|
9
10
|
*
|