@robhan-cdk-lib/utils 0.0.5

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 ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "author": {
3
+ "email": "robhan-cdk-lib@hanuschke.eu",
4
+ "name": "Robert Hanuschke",
5
+ "roles": [
6
+ "author"
7
+ ]
8
+ },
9
+ "description": "@robhan-cdk-lib/utils",
10
+ "docs": {
11
+ "stability": "stable"
12
+ },
13
+ "homepage": "https://github.com/robert-hanuschke/cdk-utils",
14
+ "jsiiVersion": "5.8.16 (build 1632665)",
15
+ "license": "MIT",
16
+ "metadata": {
17
+ "jsii": {
18
+ "pacmak": {
19
+ "hasDefaultInterfaces": true
20
+ }
21
+ },
22
+ "tscRootDir": "src"
23
+ },
24
+ "name": "@robhan-cdk-lib/utils",
25
+ "readme": {
26
+ "markdown": "# @robhan-cdk-lib/utils\n\nUtility functions for robhan-cdk-lib projects.\n\n## Functionalities\n\n### Validation\n\nDefines commonly used functions for validating user provided attribute values.\n\nExample:\n\n```typescript\nimport { validateArrayLength } from '@robhan-cdk-lib/utils';\n\nconst tags = ['typescript', 'validation'];\n\nconst errors = validateArrayLength({\n value: tags,\n min: 3,\n max: 5,\n messagePrefix: 'Tags: ',\n});\n\nif (errors.length > 0) {\n console.error('Validation failed:', errors);\n} else {\n console.log('Array length is valid.');\n}\n\n```\n\nExpected output:\n\n```\nValidation failed: [ 'Tags: must have at least 3 elements' ]\n```\n\n## License\n\nMIT\n"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/robert-hanuschke/cdk-utils"
31
+ },
32
+ "schema": "jsii/0.10.0",
33
+ "targets": {
34
+ "dotnet": {
35
+ "namespace": "Robhan.CdkLib",
36
+ "packageId": "Robhan.CdkLib.Utils"
37
+ },
38
+ "go": {
39
+ "moduleName": "github.com/robert-hanuschke/robhan-cdk-lib-utils"
40
+ },
41
+ "java": {
42
+ "maven": {
43
+ "artifactId": "cdk-utils",
44
+ "groupId": "io.github.robert-hanuschke"
45
+ },
46
+ "package": "io.github.roberthanuschke.cdk.utils"
47
+ },
48
+ "js": {
49
+ "npm": "@robhan-cdk-lib/utils"
50
+ },
51
+ "python": {
52
+ "distName": "robhan_cdk_lib.utils",
53
+ "module": "robhan_cdk_lib.utils"
54
+ }
55
+ },
56
+ "types": {},
57
+ "version": "0.0.5",
58
+ "fingerprint": "Wun6JIb5FhjehV8GLaEc8kz7vi4holBWCgRXolY/0P0="
59
+ }
package/API.md ADDED
@@ -0,0 +1,6 @@
1
+ # API Reference <a name="API Reference" id="api-reference"></a>
2
+
3
+
4
+
5
+
6
+
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2025 Robert Hanuschke
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @robhan-cdk-lib/utils
2
+
3
+ Utility functions for robhan-cdk-lib projects.
4
+
5
+ ## Functionalities
6
+
7
+ ### Validation
8
+
9
+ Defines commonly used functions for validating user provided attribute values.
10
+
11
+ Example:
12
+
13
+ ```typescript
14
+ import { validateArrayLength } from '@robhan-cdk-lib/utils';
15
+
16
+ const tags = ['typescript', 'validation'];
17
+
18
+ const errors = validateArrayLength({
19
+ value: tags,
20
+ min: 3,
21
+ max: 5,
22
+ messagePrefix: 'Tags: ',
23
+ });
24
+
25
+ if (errors.length > 0) {
26
+ console.error('Validation failed:', errors);
27
+ } else {
28
+ console.log('Array length is valid.');
29
+ }
30
+
31
+ ```
32
+
33
+ Expected output:
34
+
35
+ ```
36
+ Validation failed: [ 'Tags: must have at least 3 elements' ]
37
+ ```
38
+
39
+ ## License
40
+
41
+ MIT
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './validation';
package/lib/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./validation"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdGlvbic7Il19
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Validates that the length of an array falls within optional minimum and/or maximum bounds.
3
+ *
4
+ * @param value - The array to validate.
5
+ * @param min - (Optional) Minimum allowed length of the array.
6
+ * @param max - (Optional) Maximum allowed length of the array.
7
+ * @param message - (Optional) Custom error message to use if the validation fails.
8
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
9
+ * @returns An array of error messages. Returns an empty array if the length is valid or no bounds are specified.
10
+ *
11
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
12
+ */
13
+ export declare function validateArrayLength({ value, min, max, message, messagePrefix, }: {
14
+ value: unknown[];
15
+ min?: number;
16
+ max?: number;
17
+ message?: string;
18
+ messagePrefix?: string;
19
+ }): string[];
20
+ /**
21
+ * Validates that a number falls within optional minimum and/or maximum bounds.
22
+ *
23
+ * @param value - The number to validate.
24
+ * @param min - (Optional) Minimum allowed value of the number.
25
+ * @param max - (Optional) Maximum allowed value of the number.
26
+ * @param message - (Optional) Custom error message to use if the validation fails.
27
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
28
+ * @returns An array of error messages. Returns an empty array if the number is valid or no bounds are specified.
29
+ *
30
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
31
+ *
32
+ */
33
+ export declare function validateNumberRange({ value, min, max, message, messagePrefix, }: {
34
+ value: number;
35
+ min?: number;
36
+ max?: number;
37
+ message?: string;
38
+ messagePrefix?: string;
39
+ }): string[];
40
+ /**
41
+ * Validates that an object contains only the specified mandatory and optional attributes.
42
+ *
43
+ * @param inputObject - The object to validate.
44
+ * @param mandatoryAttributes - An array of mandatory attribute names.
45
+ * @param optionalAttributes - An array of optional attribute names.
46
+ * @param message - (Optional) Custom error message to use if the validation fails.
47
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
48
+ * @returns An array of error messages. Returns an empty array if the object is valid.
49
+ */
50
+ export declare function validateObjectAttributes({ inputObject, mandatoryAttributes, optionalAttributes, message, messagePrefix, }: {
51
+ inputObject: object;
52
+ mandatoryAttributes: string[];
53
+ optionalAttributes: string[];
54
+ message?: string;
55
+ messagePrefix?: string;
56
+ }): string[];
57
+ /**
58
+ * Validates that a string falls within optional minimum and/or maximum length bounds.
59
+ *
60
+ * @param value - The string to validate.
61
+ * @param min - (Optional) Minimum allowed length of the string.
62
+ * @param max - (Optional) Maximum allowed length of the string.
63
+ * @param message - (Optional) Custom error message to use if the validation fails.
64
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
65
+ * @returns An array of error messages. Returns an empty array if the length is valid or no bounds are specified.
66
+ *
67
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
68
+ */
69
+ export declare function validateStringLength({ value, min, max, message, messagePrefix, }: {
70
+ value: string;
71
+ min?: number;
72
+ max?: number;
73
+ message?: string;
74
+ messagePrefix?: string;
75
+ }): string[];
76
+ /**
77
+ * Validates that a string matches a regular expression.
78
+ *
79
+ * @param value - The string to validate.
80
+ * @param regExp - The regular expression to match.
81
+ * @param message - (Optional) Custom error message to use if the validation fails.
82
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
83
+ * @returns An array of error messages. Returns an empty array if the string matches the regular expression.
84
+ */
85
+ export declare function validateRegExp({ value, regExp, message, messagePrefix, }: {
86
+ value: string;
87
+ regExp: RegExp;
88
+ message?: string;
89
+ messagePrefix?: string;
90
+ }): string[];
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateArrayLength = validateArrayLength;
4
+ exports.validateNumberRange = validateNumberRange;
5
+ exports.validateObjectAttributes = validateObjectAttributes;
6
+ exports.validateStringLength = validateStringLength;
7
+ exports.validateRegExp = validateRegExp;
8
+ /**
9
+ * Validates that the length of an array falls within optional minimum and/or maximum bounds.
10
+ *
11
+ * @param value - The array to validate.
12
+ * @param min - (Optional) Minimum allowed length of the array.
13
+ * @param max - (Optional) Maximum allowed length of the array.
14
+ * @param message - (Optional) Custom error message to use if the validation fails.
15
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
16
+ * @returns An array of error messages. Returns an empty array if the length is valid or no bounds are specified.
17
+ *
18
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
19
+ */
20
+ function validateArrayLength({ value, min, max, message, messagePrefix, }) {
21
+ if (min === undefined && max === undefined) {
22
+ return [];
23
+ }
24
+ if (min !== undefined && max !== undefined && min > max) {
25
+ throw new Error('min must be less than max');
26
+ }
27
+ const errors = [];
28
+ if (min !== undefined && value.length < min) {
29
+ errors.push((messagePrefix || '') + (message || `must have at least ${min} element${min === 1 ? '' : 's'}`));
30
+ }
31
+ if (max !== undefined && value.length > max) {
32
+ errors.push((messagePrefix || '') + (message || `must have at most ${max} element${max === 1 ? '' : 's'}`));
33
+ }
34
+ return errors;
35
+ }
36
+ /**
37
+ * Validates that a number falls within optional minimum and/or maximum bounds.
38
+ *
39
+ * @param value - The number to validate.
40
+ * @param min - (Optional) Minimum allowed value of the number.
41
+ * @param max - (Optional) Maximum allowed value of the number.
42
+ * @param message - (Optional) Custom error message to use if the validation fails.
43
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
44
+ * @returns An array of error messages. Returns an empty array if the number is valid or no bounds are specified.
45
+ *
46
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
47
+ *
48
+ */
49
+ function validateNumberRange({ value, min, max, message, messagePrefix, }) {
50
+ if (min === undefined && max === undefined) {
51
+ return [];
52
+ }
53
+ if (min !== undefined && max !== undefined && min > max) {
54
+ throw new Error('min must be less than max');
55
+ }
56
+ const errors = [];
57
+ if (min !== undefined && value < min) {
58
+ errors.push((messagePrefix || '') + (message || `must be at least ${min}`));
59
+ }
60
+ if (max !== undefined && value > max) {
61
+ errors.push((messagePrefix || '') + (message || `must be at most ${max}`));
62
+ }
63
+ return errors;
64
+ }
65
+ /**
66
+ * Validates that an object contains only the specified mandatory and optional attributes.
67
+ *
68
+ * @param inputObject - The object to validate.
69
+ * @param mandatoryAttributes - An array of mandatory attribute names.
70
+ * @param optionalAttributes - An array of optional attribute names.
71
+ * @param message - (Optional) Custom error message to use if the validation fails.
72
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
73
+ * @returns An array of error messages. Returns an empty array if the object is valid.
74
+ */
75
+ function validateObjectAttributes({ inputObject, mandatoryAttributes, optionalAttributes, message, messagePrefix, }) {
76
+ const errors = [];
77
+ const keys = Object.keys(inputObject);
78
+ const allAttributes = mandatoryAttributes.concat(optionalAttributes);
79
+ for (const mandatoryAttribute of mandatoryAttributes) {
80
+ if (!keys.includes(mandatoryAttribute)) {
81
+ errors.push(messagePrefix ||
82
+ '' + (message || `missing mandatory attribute: ${mandatoryAttribute}`));
83
+ }
84
+ }
85
+ for (const key of keys) {
86
+ if (!allAttributes.includes(key)) {
87
+ errors.push((messagePrefix || '') + (message || `contains unknown attribute: ${key}`));
88
+ }
89
+ }
90
+ return errors;
91
+ }
92
+ /**
93
+ * Validates that a string falls within optional minimum and/or maximum length bounds.
94
+ *
95
+ * @param value - The string to validate.
96
+ * @param min - (Optional) Minimum allowed length of the string.
97
+ * @param max - (Optional) Maximum allowed length of the string.
98
+ * @param message - (Optional) Custom error message to use if the validation fails.
99
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
100
+ * @returns An array of error messages. Returns an empty array if the length is valid or no bounds are specified.
101
+ *
102
+ * @throws Error if both `min` and `max` are provided and `min` is greater than `max`.
103
+ */
104
+ function validateStringLength({ value, min, max, message, messagePrefix, }) {
105
+ if (min === undefined && max === undefined) {
106
+ return [];
107
+ }
108
+ if (min !== undefined && max !== undefined && min > max) {
109
+ throw new Error('min must be less than max');
110
+ }
111
+ const errors = [];
112
+ if (min !== undefined && value.length < min) {
113
+ errors.push((messagePrefix ||
114
+ '') + (message || `must be at least ${min} character${min === 1 ? '' : 's'} long`));
115
+ }
116
+ if (max !== undefined && value.length > max) {
117
+ errors.push((messagePrefix ||
118
+ '') + (message || `must be at most ${max} character${max === 1 ? '' : 's'} long`));
119
+ }
120
+ return errors;
121
+ }
122
+ /**
123
+ * Validates that a string matches a regular expression.
124
+ *
125
+ * @param value - The string to validate.
126
+ * @param regExp - The regular expression to match.
127
+ * @param message - (Optional) Custom error message to use if the validation fails.
128
+ * @param messagePrefix - (Optional) String to prepend to the error message(s).
129
+ * @returns An array of error messages. Returns an empty array if the string matches the regular expression.
130
+ */
131
+ function validateRegExp({ value, regExp, message, messagePrefix, }) {
132
+ const errors = [];
133
+ if (!regExp.test(value)) {
134
+ errors.push((messagePrefix || '') + (message || `must match regExp ${regExp}`));
135
+ }
136
+ return errors;
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLGtEQWdDQztBQWVELGtEQTRCQztBQVlELDREQWdDQztBQWNELG9EQWtDQztBQVdELHdDQWtCQztBQWhORDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEVBQ2xDLEtBQUssRUFDTCxHQUFHLEVBQ0gsR0FBRyxFQUNILE9BQU8sRUFDUCxhQUFhLEdBT2Q7SUFDQyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzNDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUNULENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLHNCQUFzQixHQUFHLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUNoRyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUkscUJB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QUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdGhlIGxlbmd0aCBvZiBhbiBhcnJheSBmYWxscyB3aXRoaW4gb3B0aW9uYWwgbWluaW11bSBhbmQvb3IgbWF4aW11bSBib3VuZHMuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGFycmF5IHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIG1pbiAtIChPcHRpb25hbCkgTWluaW11bSBhbGxvd2VkIGxlbmd0aCBvZiB0aGUgYXJyYXkuXG4gKiBAcGFyYW0gbWF4IC0gKE9wdGlvbmFsKSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHRoZSBhcnJheS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gKE9wdGlvbmFsKSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byB1c2UgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBAcGFyYW0gbWVzc2FnZVByZWZpeCAtIChPcHRpb25hbCkgU3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIGVycm9yIG1lc3NhZ2UocykuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgbGVuZ3RoIGlzIHZhbGlkIG9yIG5vIGJvdW5kcyBhcmUgc3BlY2lmaWVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYm90aCBgbWluYCBhbmQgYG1heGAgYXJlIHByb3ZpZGVkIGFuZCBgbWluYCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5TGVuZ3RoKHtcbiAgdmFsdWUsXG4gIG1pbixcbiAgbWF4LFxuICBtZXNzYWdlLFxuICBtZXNzYWdlUHJlZml4LFxufToge1xuICB2YWx1ZTogdW5rbm93bltdO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgbWVzc2FnZVByZWZpeD86IHN0cmluZztcbn0pOiBzdHJpbmdbXSB7XG4gIGlmIChtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgbWF4ICE9PSB1bmRlZmluZWQgJiYgbWluID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW4gbXVzdCBiZSBsZXNzIHRoYW4gbWF4Jyk7XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5sZW5ndGggPCBtaW4pIHtcbiAgICBlcnJvcnMucHVzaChcbiAgICAgIChtZXNzYWdlUHJlZml4IHx8ICcnKSArIChtZXNzYWdlIHx8IGBtdXN0IGhhdmUgYXQgbGVhc3QgJHttaW59IGVsZW1lbnQke21pbiA9PT0gMSA/ICcnIDogJ3MnfWApLFxuICAgICk7XG4gIH1cbiAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmxlbmd0aCA+IG1heCkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgKG1lc3NhZ2VQcmVmaXggfHwgJycpICsgKG1lc3NhZ2UgfHwgYG11c3QgaGF2ZSBhdCBtb3N0ICR7bWF4fSBlbGVtZW50JHttYXggPT09IDEgPyAnJyA6ICdzJ31gKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgYSBudW1iZXIgZmFsbHMgd2l0aGluIG9wdGlvbmFsIG1pbmltdW0gYW5kL29yIG1heGltdW0gYm91bmRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0gbWluIC0gKE9wdGlvbmFsKSBNaW5pbXVtIGFsbG93ZWQgdmFsdWUgb2YgdGhlIG51bWJlci5cbiAqIEBwYXJhbSBtYXggLSAoT3B0aW9uYWwpIE1heGltdW0gYWxsb3dlZCB2YWx1ZSBvZiB0aGUgbnVtYmVyLlxuICogQHBhcmFtIG1lc3NhZ2UgLSAoT3B0aW9uYWwpIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy5cbiAqIEBwYXJhbSBtZXNzYWdlUHJlZml4IC0gKE9wdGlvbmFsKSBTdHJpbmcgdG8gcHJlcGVuZCB0byB0aGUgZXJyb3IgbWVzc2FnZShzKS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBudW1iZXIgaXMgdmFsaWQgb3Igbm8gYm91bmRzIGFyZSBzcGVjaWZpZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBib3RoIGBtaW5gIGFuZCBgbWF4YCBhcmUgcHJvdmlkZWQgYW5kIGBtaW5gIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU51bWJlclJhbmdlKHtcbiAgdmFsdWUsXG4gIG1pbixcbiAgbWF4LFxuICBtZXNzYWdlLFxuICBtZXNzYWdlUHJlZml4LFxufToge1xuICB2YWx1ZTogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgbWVzc2FnZVByZWZpeD86IHN0cmluZztcbn0pOiBzdHJpbmdbXSB7XG4gIGlmIChtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgbWF4ICE9PSB1bmRlZmluZWQgJiYgbWluID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW4gbXVzdCBiZSBsZXNzIHRoYW4gbWF4Jyk7XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IG1pbikge1xuICAgIGVycm9ycy5wdXNoKChtZXNzYWdlUHJlZml4IHx8ICcnKSArIChtZXNzYWdlIHx8IGBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufWApKTtcbiAgfVxuICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHtcbiAgICBlcnJvcnMucHVzaCgobWVzc2FnZVByZWZpeCB8fCAnJykgKyAobWVzc2FnZSB8fCBgbXVzdCBiZSBhdCBtb3N0ICR7bWF4fWApKTtcbiAgfVxuICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGFuIG9iamVjdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBpbnB1dE9iamVjdCAtIFRoZSBvYmplY3QgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0gbWFuZGF0b3J5QXR0cmlidXRlcyAtIEFuIGFycmF5IG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcGFyYW0gb3B0aW9uYWxBdHRyaWJ1dGVzIC0gQW4gYXJyYXkgb2Ygb3B0aW9uYWwgYXR0cmlidXRlIG5hbWVzLlxuICogQHBhcmFtIG1lc3NhZ2UgLSAoT3B0aW9uYWwpIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy5cbiAqIEBwYXJhbSBtZXNzYWdlUHJlZml4IC0gKE9wdGlvbmFsKSBTdHJpbmcgdG8gcHJlcGVuZCB0byB0aGUgZXJyb3IgbWVzc2FnZShzKS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBvYmplY3QgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdEF0dHJpYnV0ZXMoe1xuICBpbnB1dE9iamVjdCxcbiAgbWFuZGF0b3J5QXR0cmlidXRlcyxcbiAgb3B0aW9uYWxBdHRyaWJ1dGVzLFxuICBtZXNzYWdlLFxuICBtZXNzYWdlUHJlZml4LFxufToge1xuICBpbnB1dE9iamVjdDogb2JqZWN0O1xuICBtYW5kYXRvcnlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgb3B0aW9uYWxBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgbWVzc2FnZVByZWZpeD86IHN0cmluZztcbn0pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlucHV0T2JqZWN0KTtcbiAgY29uc3QgYWxsQXR0cmlidXRlcyA9IG1hbmRhdG9yeUF0dHJpYnV0ZXMuY29uY2F0KG9wdGlvbmFsQXR0cmlidXRlcyk7XG4gIGZvciAoY29uc3QgbWFuZGF0b3J5QXR0cmlidXRlIG9mIG1hbmRhdG9yeUF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMobWFuZGF0b3J5QXR0cmlidXRlKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG1lc3NhZ2VQcmVmaXggfHxcbiAgICAgICAgJycgKyAobWVzc2FnZSB8fCBgbWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlOiAke21hbmRhdG9yeUF0dHJpYnV0ZX1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIWFsbEF0dHJpYnV0ZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIChtZXNzYWdlUHJlZml4IHx8ICcnKSArIChtZXNzYWdlIHx8IGBjb250YWlucyB1bmtub3duIGF0dHJpYnV0ZTogJHtrZXl9YCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGEgc3RyaW5nIGZhbGxzIHdpdGhpbiBvcHRpb25hbCBtaW5pbXVtIGFuZC9vciBtYXhpbXVtIGxlbmd0aCBib3VuZHMuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZS5cbiAqIEBwYXJhbSBtaW4gLSAoT3B0aW9uYWwpIE1pbmltdW0gYWxsb3dlZCBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBtYXggLSAoT3B0aW9uYWwpIE1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gKE9wdGlvbmFsKSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byB1c2UgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBAcGFyYW0gbWVzc2FnZVByZWZpeCAtIChPcHRpb25hbCkgU3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIGVycm9yIG1lc3NhZ2UocykuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgbGVuZ3RoIGlzIHZhbGlkIG9yIG5vIGJvdW5kcyBhcmUgc3BlY2lmaWVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYm90aCBgbWluYCBhbmQgYG1heGAgYXJlIHByb3ZpZGVkIGFuZCBgbWluYCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gIHZhbHVlLFxuICBtaW4sXG4gIG1heCxcbiAgbWVzc2FnZSxcbiAgbWVzc2FnZVByZWZpeCxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIG1lc3NhZ2VQcmVmaXg/OiBzdHJpbmc7XG59KTogc3RyaW5nW10ge1xuICBpZiAobWluID09PSB1bmRlZmluZWQgJiYgbWF4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIG1heCAhPT0gdW5kZWZpbmVkICYmIG1pbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluIG11c3QgYmUgbGVzcyB0aGFuIG1heCcpO1xuICB9XG5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoIDwgbWluKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAobWVzc2FnZVByZWZpeCB8fFxuICAgICAgICAnJykgKyAobWVzc2FnZSB8fCBgbXVzdCBiZSBhdCBsZWFzdCAke21pbn0gY2hhcmFjdGVyJHttaW4gPT09IDEgPyAnJyA6ICdzJ30gbG9uZ2ApLFxuICAgICk7XG4gIH1cbiAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmxlbmd0aCA+IG1heCkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgKG1lc3NhZ2VQcmVmaXggfHxcbiAgICAgICAgJycpICsgKG1lc3NhZ2UgfHwgYG11c3QgYmUgYXQgbW9zdCAke21heH0gY2hhcmFjdGVyJHttYXggPT09IDEgPyAnJyA6ICdzJ30gbG9uZ2ApLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaC5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gKE9wdGlvbmFsKSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byB1c2UgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBAcGFyYW0gbWVzc2FnZVByZWZpeCAtIChPcHRpb25hbCkgU3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIGVycm9yIG1lc3NhZ2UocykuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVnRXhwKHtcbiAgdmFsdWUsXG4gIHJlZ0V4cCxcbiAgbWVzc2FnZSxcbiAgbWVzc2FnZVByZWZpeCxcbn06IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgcmVnRXhwOiBSZWdFeHA7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIG1lc3NhZ2VQcmVmaXg/OiBzdHJpbmc7XG59KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGlmICghcmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAobWVzc2FnZVByZWZpeCB8fCAnJykgKyAobWVzc2FnZSB8fCBgbXVzdCBtYXRjaCByZWdFeHAgJHtyZWdFeHB9YCksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZXJyb3JzO1xufVxuIl19
package/package.json ADDED
@@ -0,0 +1,141 @@
1
+ {
2
+ "name": "@robhan-cdk-lib/utils",
3
+ "repository": {
4
+ "type": "git",
5
+ "url": "https://github.com/robert-hanuschke/cdk-utils"
6
+ },
7
+ "scripts": {
8
+ "build": "npx projen build",
9
+ "bump": "npx projen bump",
10
+ "clobber": "npx projen clobber",
11
+ "compat": "npx projen compat",
12
+ "compile": "npx projen compile",
13
+ "default": "npx projen default",
14
+ "docgen": "npx projen docgen",
15
+ "eject": "npx projen eject",
16
+ "eslint": "npx projen eslint",
17
+ "package": "npx projen package",
18
+ "package-all": "npx projen package-all",
19
+ "package:dotnet": "npx projen package:dotnet",
20
+ "package:go": "npx projen package:go",
21
+ "package:java": "npx projen package:java",
22
+ "package:js": "npx projen package:js",
23
+ "package:python": "npx projen package:python",
24
+ "post-compile": "npx projen post-compile",
25
+ "post-upgrade": "npx projen post-upgrade",
26
+ "pre-compile": "npx projen pre-compile",
27
+ "release": "npx projen release",
28
+ "test": "npx projen test",
29
+ "test:watch": "npx projen test:watch",
30
+ "unbump": "npx projen unbump",
31
+ "upgrade": "npx projen upgrade",
32
+ "watch": "npx projen watch",
33
+ "projen": "npx projen"
34
+ },
35
+ "author": {
36
+ "name": "Robert Hanuschke",
37
+ "email": "robhan-cdk-lib@hanuschke.eu",
38
+ "organization": false
39
+ },
40
+ "devDependencies": {
41
+ "@stylistic/eslint-plugin": "^2",
42
+ "@types/jest": "^30.0.0",
43
+ "@types/node": "^24.1.0",
44
+ "@typescript-eslint/eslint-plugin": "^8",
45
+ "@typescript-eslint/parser": "^8",
46
+ "commit-and-tag-version": "^12",
47
+ "constructs": "^10.0.0",
48
+ "eslint": "^9",
49
+ "eslint-import-resolver-typescript": "^4.4.4",
50
+ "eslint-plugin-import": "^2.32.0",
51
+ "jest": "^30.0.5",
52
+ "jest-junit": "^16",
53
+ "jsii": "~5.8.0",
54
+ "jsii-diff": "^1.112.0",
55
+ "jsii-docgen": "^10.5.0",
56
+ "jsii-pacmak": "^1.112.0",
57
+ "jsii-rosetta": "~5.8.0",
58
+ "projen": "^0.93.0",
59
+ "ts-jest": "^29.4.0",
60
+ "ts-node": "^10.9.2",
61
+ "typescript": "^5.8.3"
62
+ },
63
+ "main": "lib/index.js",
64
+ "license": "MIT",
65
+ "version": "0.0.5",
66
+ "jest": {
67
+ "coverageProvider": "v8",
68
+ "testMatch": [
69
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
70
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
71
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
72
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
73
+ ],
74
+ "clearMocks": true,
75
+ "collectCoverage": true,
76
+ "coverageReporters": [
77
+ "json",
78
+ "lcov",
79
+ "clover",
80
+ "cobertura",
81
+ "text"
82
+ ],
83
+ "coverageDirectory": "coverage",
84
+ "coveragePathIgnorePatterns": [
85
+ "/node_modules/"
86
+ ],
87
+ "testPathIgnorePatterns": [
88
+ "/node_modules/"
89
+ ],
90
+ "watchPathIgnorePatterns": [
91
+ "/node_modules/"
92
+ ],
93
+ "reporters": [
94
+ "default",
95
+ [
96
+ "jest-junit",
97
+ {
98
+ "outputDirectory": "test-reports"
99
+ }
100
+ ]
101
+ ],
102
+ "transform": {
103
+ "^.+\\.[t]sx?$": [
104
+ "ts-jest",
105
+ {
106
+ "tsconfig": "tsconfig.dev.json"
107
+ }
108
+ ]
109
+ }
110
+ },
111
+ "types": "lib/index.d.ts",
112
+ "stability": "stable",
113
+ "jsii": {
114
+ "outdir": "dist",
115
+ "targets": {
116
+ "java": {
117
+ "package": "io.github.roberthanuschke.cdk.utils",
118
+ "maven": {
119
+ "groupId": "io.github.robert-hanuschke",
120
+ "artifactId": "cdk-utils"
121
+ }
122
+ },
123
+ "python": {
124
+ "distName": "robhan_cdk_lib.utils",
125
+ "module": "robhan_cdk_lib.utils"
126
+ },
127
+ "dotnet": {
128
+ "namespace": "Robhan.CdkLib",
129
+ "packageId": "Robhan.CdkLib.Utils"
130
+ },
131
+ "go": {
132
+ "moduleName": "github.com/robert-hanuschke/robhan-cdk-lib-utils"
133
+ }
134
+ },
135
+ "tsc": {
136
+ "outDir": "lib",
137
+ "rootDir": "src"
138
+ }
139
+ },
140
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
141
+ }