@itgorillaz/configify 1.1.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/.prettierrc +4 -0
- package/LICENSE +21 -0
- package/README.md +281 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/src/configify.module.d.ts +12 -0
- package/dist/src/configify.module.js +120 -0
- package/dist/src/configify.module.js.map +1 -0
- package/dist/src/configuration/configuration-options.interface.d.ts +11 -0
- package/dist/src/configuration/configuration-options.interface.js +9 -0
- package/dist/src/configuration/configuration-options.interface.js.map +1 -0
- package/dist/src/configuration/configuration-parser.interface.d.ts +3 -0
- package/dist/src/configuration/configuration-parser.interface.js +3 -0
- package/dist/src/configuration/configuration-parser.interface.js.map +1 -0
- package/dist/src/configuration/configuration-providers.interface.d.ts +5 -0
- package/dist/src/configuration/configuration-providers.interface.js +3 -0
- package/dist/src/configuration/configuration-providers.interface.js.map +1 -0
- package/dist/src/configuration/configuration.registry.d.ts +9 -0
- package/dist/src/configuration/configuration.registry.js +25 -0
- package/dist/src/configuration/configuration.registry.js.map +1 -0
- package/dist/src/configuration/index.d.ts +6 -0
- package/dist/src/configuration/index.js +23 -0
- package/dist/src/configuration/index.js.map +1 -0
- package/dist/src/configuration/parsers/configuration-parser.factory.d.ts +7 -0
- package/dist/src/configuration/parsers/configuration-parser.factory.js +27 -0
- package/dist/src/configuration/parsers/configuration-parser.factory.js.map +1 -0
- package/dist/src/configuration/parsers/dotenv-configuration.parser.d.ts +4 -0
- package/dist/src/configuration/parsers/dotenv-configuration.parser.js +12 -0
- package/dist/src/configuration/parsers/dotenv-configuration.parser.js.map +1 -0
- package/dist/src/configuration/parsers/index.d.ts +4 -0
- package/dist/src/configuration/parsers/index.js +21 -0
- package/dist/src/configuration/parsers/index.js.map +1 -0
- package/dist/src/configuration/parsers/json-configuration.parser.d.ts +4 -0
- package/dist/src/configuration/parsers/json-configuration.parser.js +11 -0
- package/dist/src/configuration/parsers/json-configuration.parser.js.map +1 -0
- package/dist/src/configuration/parsers/yaml-configuration.parser.d.ts +4 -0
- package/dist/src/configuration/parsers/yaml-configuration.parser.js +12 -0
- package/dist/src/configuration/parsers/yaml-configuration.parser.js.map +1 -0
- package/dist/src/configuration/resolvers/aws/index.d.ts +2 -0
- package/dist/src/configuration/resolvers/aws/index.js +19 -0
- package/dist/src/configuration/resolvers/aws/index.js.map +1 -0
- package/dist/src/configuration/resolvers/aws/parameter-store-configuration.resolver.d.ts +12 -0
- package/dist/src/configuration/resolvers/aws/parameter-store-configuration.resolver.js +61 -0
- package/dist/src/configuration/resolvers/aws/parameter-store-configuration.resolver.js.map +1 -0
- package/dist/src/configuration/resolvers/aws/secrets-manager-configuration.resolver.d.ts +12 -0
- package/dist/src/configuration/resolvers/aws/secrets-manager-configuration.resolver.js +59 -0
- package/dist/src/configuration/resolvers/aws/secrets-manager-configuration.resolver.js.map +1 -0
- package/dist/src/configuration/resolvers/configuration-resolver.interface.d.ts +3 -0
- package/dist/src/configuration/resolvers/configuration-resolver.interface.js +3 -0
- package/dist/src/configuration/resolvers/configuration-resolver.interface.js.map +1 -0
- package/dist/src/configuration/resolvers/index.d.ts +3 -0
- package/dist/src/configuration/resolvers/index.js +20 -0
- package/dist/src/configuration/resolvers/index.js.map +1 -0
- package/dist/src/configuration/resolvers/resolved-value.interface.d.ts +7 -0
- package/dist/src/configuration/resolvers/resolved-value.interface.js +3 -0
- package/dist/src/configuration/resolvers/resolved-value.interface.js.map +1 -0
- package/dist/src/decorators/configuration.decorator.d.ts +2 -0
- package/dist/src/decorators/configuration.decorator.js +13 -0
- package/dist/src/decorators/configuration.decorator.js.map +1 -0
- package/dist/src/decorators/index.d.ts +2 -0
- package/dist/src/decorators/index.js +19 -0
- package/dist/src/decorators/index.js.map +1 -0
- package/dist/src/decorators/value.decorator.d.ts +10 -0
- package/dist/src/decorators/value.decorator.js +14 -0
- package/dist/src/decorators/value.decorator.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interpolation/variables.d.ts +9 -0
- package/dist/src/interpolation/variables.js +37 -0
- package/dist/src/interpolation/variables.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/index.d.ts +1 -0
- package/index.js +6 -0
- package/index.ts +1 -0
- package/nest-cli.json +8 -0
- package/package.json +82 -0
- package/src/configify.module.ts +241 -0
- package/src/configuration/configuration-options.interface.ts +51 -0
- package/src/configuration/configuration-parser.interface.ts +15 -0
- package/src/configuration/configuration-providers.interface.ts +9 -0
- package/src/configuration/configuration.registry.ts +70 -0
- package/src/configuration/index.ts +6 -0
- package/src/configuration/parsers/configuration-parser.factory.ts +53 -0
- package/src/configuration/parsers/dotenv-configuration.parser.ts +18 -0
- package/src/configuration/parsers/index.ts +4 -0
- package/src/configuration/parsers/json-configuration.parser.ts +17 -0
- package/src/configuration/parsers/yaml-configuration.parser.ts +18 -0
- package/src/configuration/resolvers/aws/index.ts +2 -0
- package/src/configuration/resolvers/aws/parameter-store-configuration.resolver.ts +115 -0
- package/src/configuration/resolvers/aws/secrets-manager-configuration.resolver.ts +117 -0
- package/src/configuration/resolvers/configuration-resolver.interface.ts +11 -0
- package/src/configuration/resolvers/index.ts +3 -0
- package/src/configuration/resolvers/resolved-value.interface.ts +10 -0
- package/src/decorators/configuration.decorator.ts +26 -0
- package/src/decorators/index.ts +2 -0
- package/src/decorators/value.decorator.ts +47 -0
- package/src/index.ts +2 -0
- package/src/interpolation/variables.ts +101 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DotEnvConfigurationParser = void 0;
|
|
4
|
+
const dotenv = require("dotenv");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
class DotEnvConfigurationParser {
|
|
7
|
+
parse(file) {
|
|
8
|
+
return dotenv.parse(fs.readFileSync(file));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.DotEnvConfigurationParser = DotEnvConfigurationParser;
|
|
12
|
+
//# sourceMappingURL=dotenv-configuration.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotenv-configuration.parser.js","sourceRoot":"","sources":["../../../../src/configuration/parsers/dotenv-configuration.parser.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,yBAAyB;AAMzB,MAAa,yBAAyB;IAO7B,KAAK,CAAC,IAAY;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF;AAVD,8DAUC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./configuration-parser.factory"), exports);
|
|
18
|
+
__exportStar(require("./dotenv-configuration.parser"), exports);
|
|
19
|
+
__exportStar(require("./json-configuration.parser"), exports);
|
|
20
|
+
__exportStar(require("./yaml-configuration.parser"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/configuration/parsers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,gEAA8C;AAC9C,8DAA4C;AAC5C,8DAA4C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonConfigurationParser = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
class JsonConfigurationParser {
|
|
6
|
+
parse(file) {
|
|
7
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.JsonConfigurationParser = JsonConfigurationParser;
|
|
11
|
+
//# sourceMappingURL=json-configuration.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-configuration.parser.js","sourceRoot":"","sources":["../../../../src/configuration/parsers/json-configuration.parser.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AAMzB,MAAa,uBAAuB;IAO3B,KAAK,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;CACF;AAVD,0DAUC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.YamlConfigurationParser = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const yaml = require("js-yaml");
|
|
6
|
+
class YamlConfigurationParser {
|
|
7
|
+
parse(file) {
|
|
8
|
+
return yaml.load(fs.readFileSync(file, 'utf-8'));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.YamlConfigurationParser = YamlConfigurationParser;
|
|
12
|
+
//# sourceMappingURL=yaml-configuration.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-configuration.parser.js","sourceRoot":"","sources":["../../../../src/configuration/parsers/yaml-configuration.parser.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,gCAAgC;AAMhC,MAAa,uBAAuB;IAO3B,KAAK,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;CACF;AAVD,0DAUC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./parameter-store-configuration.resolver"), exports);
|
|
18
|
+
__exportStar(require("./secrets-manager-configuration.resolver"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/configuration/resolvers/aws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2EAAyD;AACzD,2EAAyD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SSMClient } from '@aws-sdk/client-ssm';
|
|
2
|
+
import { ConfigurationResolver } from '../configuration-resolver.interface';
|
|
3
|
+
export declare class AwsParameterStoreConfigurationResolver implements ConfigurationResolver {
|
|
4
|
+
private readonly ssm;
|
|
5
|
+
private readonly AWS_PARAMETER_STORE_YAML_KEY;
|
|
6
|
+
private readonly AWS_PARAMETER_STORE_ENV_PREFIX;
|
|
7
|
+
constructor(ssm: SSMClient);
|
|
8
|
+
resolve(config: Record<string, any>): Promise<Record<string, any>>;
|
|
9
|
+
private filterConfiguration;
|
|
10
|
+
private resolveSecretValue;
|
|
11
|
+
private buildBulkRequest;
|
|
12
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsParameterStoreConfigurationResolver = void 0;
|
|
4
|
+
const client_ssm_1 = require("@aws-sdk/client-ssm");
|
|
5
|
+
class AwsParameterStoreConfigurationResolver {
|
|
6
|
+
constructor(ssm) {
|
|
7
|
+
this.ssm = ssm;
|
|
8
|
+
this.AWS_PARAMETER_STORE_YAML_KEY = 'aws-parameter-store';
|
|
9
|
+
this.AWS_PARAMETER_STORE_ENV_PREFIX = 'AWS_PARAMETER_STORE';
|
|
10
|
+
}
|
|
11
|
+
async resolve(config) {
|
|
12
|
+
const parameters = this.filterConfiguration(config);
|
|
13
|
+
const promises = this.buildBulkRequest(parameters);
|
|
14
|
+
const results = await Promise.all(promises);
|
|
15
|
+
const errors = results.filter((r) => !r.success);
|
|
16
|
+
if (errors && errors.length) {
|
|
17
|
+
throw new Error(`Unable to resolve parameter:\n${errors
|
|
18
|
+
.map((e) => `${e.key}: ${e.id} - ${e.error.message}`)
|
|
19
|
+
.join('\n')}`);
|
|
20
|
+
}
|
|
21
|
+
for (const result of results) {
|
|
22
|
+
config[result.key] = result.value;
|
|
23
|
+
}
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
filterConfiguration(config) {
|
|
27
|
+
return Object.fromEntries(Object.entries(config).filter(([key]) => key.startsWith(this.AWS_PARAMETER_STORE_YAML_KEY) ||
|
|
28
|
+
key.startsWith(this.AWS_PARAMETER_STORE_ENV_PREFIX)));
|
|
29
|
+
}
|
|
30
|
+
async resolveSecretValue(key, id) {
|
|
31
|
+
var _a;
|
|
32
|
+
try {
|
|
33
|
+
const payload = { Name: id, WithDecryption: true };
|
|
34
|
+
const command = new client_ssm_1.GetParameterCommand(payload);
|
|
35
|
+
const response = await this.ssm.send(command);
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
key,
|
|
39
|
+
value: (_a = response.Parameter) === null || _a === void 0 ? void 0 : _a.Value,
|
|
40
|
+
success: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
key,
|
|
47
|
+
error: e,
|
|
48
|
+
success: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
buildBulkRequest(config) {
|
|
53
|
+
const promises = [];
|
|
54
|
+
for (const [key, value] of Object.entries(config)) {
|
|
55
|
+
promises.push(this.resolveSecretValue(key, value));
|
|
56
|
+
}
|
|
57
|
+
return promises;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.AwsParameterStoreConfigurationResolver = AwsParameterStoreConfigurationResolver;
|
|
61
|
+
//# sourceMappingURL=parameter-store-configuration.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-store-configuration.resolver.js","sourceRoot":"","sources":["../../../../../src/configuration/resolvers/aws/parameter-store-configuration.resolver.ts"],"names":[],"mappings":";;;AAAA,oDAAqE;AAOrE,MAAa,sCAAsC;IAWjD,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;QAR1B,iCAA4B,GAAG,qBAAqB,CAAC;QACrD,mCAA8B,GAAG,qBAAqB,CAAC;IAO1B,CAAC;IAU/C,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,iCAAiC,MAAM;iBACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;iBACpD,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAQO,mBAAmB,CACzB,MAA2B;QAE3B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CACR,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC;YACjD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CACtD,CACF,CAAC;IACJ,CAAC;IASO,KAAK,CAAC,kBAAkB,CAC9B,GAAW,EACX,EAAU;;QAEV,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,gCAAmB,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO;gBACL,EAAE;gBACF,GAAG;gBACH,KAAK,EAAE,MAAA,QAAQ,CAAC,SAAS,0CAAE,KAAK;gBAChC,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,EAAE;gBACF,GAAG;gBACH,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAQO,gBAAgB,CACtB,MAA2B;QAE3B,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA3GD,wFA2GC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
|
|
2
|
+
import { ConfigurationResolver } from '../configuration-resolver.interface';
|
|
3
|
+
export declare class AwsSecretsManagerConfigurationResolver implements ConfigurationResolver {
|
|
4
|
+
private readonly secretsManager;
|
|
5
|
+
private readonly AWS_SECRETS_AMANGER_YAML_KEY;
|
|
6
|
+
private readonly AWS_SECRETS_MANAGER_ENV_PREFIX;
|
|
7
|
+
constructor(secretsManager: SecretsManagerClient);
|
|
8
|
+
resolve(config: Record<string, any>): Promise<Record<string, any>>;
|
|
9
|
+
private filterConfiguration;
|
|
10
|
+
private resolveSecretValue;
|
|
11
|
+
private buildBulkRequest;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsSecretsManagerConfigurationResolver = void 0;
|
|
4
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
5
|
+
class AwsSecretsManagerConfigurationResolver {
|
|
6
|
+
constructor(secretsManager) {
|
|
7
|
+
this.secretsManager = secretsManager;
|
|
8
|
+
this.AWS_SECRETS_AMANGER_YAML_KEY = 'aws-secrets-manager';
|
|
9
|
+
this.AWS_SECRETS_MANAGER_ENV_PREFIX = 'AWS_SECRETS_MANAGER';
|
|
10
|
+
}
|
|
11
|
+
async resolve(config) {
|
|
12
|
+
const secrets = this.filterConfiguration(config);
|
|
13
|
+
const promises = this.buildBulkRequest(secrets);
|
|
14
|
+
const results = await Promise.all(promises);
|
|
15
|
+
const errors = results.filter((r) => !r.success);
|
|
16
|
+
if (errors && errors.length) {
|
|
17
|
+
throw new Error(`Unable to resolve secrets:\n${errors
|
|
18
|
+
.map((e) => `${e.key}: ${e.id} - ${e.error.message}`)
|
|
19
|
+
.join('\n')}`);
|
|
20
|
+
}
|
|
21
|
+
for (const result of results) {
|
|
22
|
+
config[result.key] = result.value;
|
|
23
|
+
}
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
filterConfiguration(config) {
|
|
27
|
+
return Object.fromEntries(Object.entries(config).filter(([key]) => key.startsWith(this.AWS_SECRETS_AMANGER_YAML_KEY) ||
|
|
28
|
+
key.startsWith(this.AWS_SECRETS_MANAGER_ENV_PREFIX)));
|
|
29
|
+
}
|
|
30
|
+
async resolveSecretValue(key, id) {
|
|
31
|
+
try {
|
|
32
|
+
const command = new client_secrets_manager_1.GetSecretValueCommand({ SecretId: id });
|
|
33
|
+
const response = await this.secretsManager.send(command);
|
|
34
|
+
return {
|
|
35
|
+
id,
|
|
36
|
+
key,
|
|
37
|
+
value: response.SecretString,
|
|
38
|
+
success: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
return {
|
|
43
|
+
id,
|
|
44
|
+
key,
|
|
45
|
+
error: e,
|
|
46
|
+
success: false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
buildBulkRequest(config) {
|
|
51
|
+
const promises = [];
|
|
52
|
+
for (const [key, value] of Object.entries(config)) {
|
|
53
|
+
promises.push(this.resolveSecretValue(key, value));
|
|
54
|
+
}
|
|
55
|
+
return promises;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.AwsSecretsManagerConfigurationResolver = AwsSecretsManagerConfigurationResolver;
|
|
59
|
+
//# sourceMappingURL=secrets-manager-configuration.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-manager-configuration.resolver.js","sourceRoot":"","sources":["../../../../../src/configuration/resolvers/aws/secrets-manager-configuration.resolver.ts"],"names":[],"mappings":";;;AAAA,4EAGyC;AAOzC,MAAa,sCAAsC;IAWjD,YAA6B,cAAoC;QAApC,mBAAc,GAAd,cAAc,CAAsB;QARhD,iCAA4B,GAAG,qBAAqB,CAAC;QACrD,mCAA8B,GAAG,qBAAqB,CAAC;IAOJ,CAAC;IAUrE,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;iBACpD,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAQO,mBAAmB,CACzB,MAA2B;QAE3B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CACR,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC;YACjD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CACtD,CACF,CAAC;IACJ,CAAC;IASO,KAAK,CAAC,kBAAkB,CAC9B,GAAW,EACX,EAAU;QAEV,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,8CAAqB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO;gBACL,EAAE;gBACF,GAAG;gBACH,KAAK,EAAE,QAAQ,CAAC,YAAY;gBAC5B,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,EAAE;gBACF,GAAG;gBACH,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAQO,gBAAgB,CACtB,MAA2B;QAE3B,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA1GD,wFA0GC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-resolver.interface.js","sourceRoot":"","sources":["../../../../src/configuration/resolvers/configuration-resolver.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
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("./aws"), exports);
|
|
18
|
+
__exportStar(require("./configuration-resolver.interface"), exports);
|
|
19
|
+
__exportStar(require("./resolved-value.interface"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/configuration/resolvers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,qEAAmD;AACnD,6DAA2C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-value.interface.js","sourceRoot":"","sources":["../../../../src/configuration/resolvers/resolved-value.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Configuration = exports.CONFIGURATION_METADATA = void 0;
|
|
4
|
+
const configuration_registry_1 = require("../configuration/configuration.registry");
|
|
5
|
+
exports.CONFIGURATION_METADATA = Symbol.for('__configuration__');
|
|
6
|
+
const Configuration = () => {
|
|
7
|
+
return (target) => {
|
|
8
|
+
configuration_registry_1.ConfigurationRegistry.registerTarget(target);
|
|
9
|
+
Reflect.defineMetadata(exports.CONFIGURATION_METADATA, target.constructor.name, target);
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
exports.Configuration = Configuration;
|
|
13
|
+
//# sourceMappingURL=configuration.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.decorator.js","sourceRoot":"","sources":["../../../src/decorators/configuration.decorator.ts"],"names":[],"mappings":";;;AAAA,oFAAgF;AAKnE,QAAA,sBAAsB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAW/D,MAAM,aAAa,GAAG,GAAmB,EAAE;IAChD,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,8CAAqB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,cAAc,CACpB,8BAAsB,EACtB,MAAM,CAAC,WAAW,CAAC,IAAI,EACvB,MAAM,CACP,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,aAAa,iBASxB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./configuration.decorator"), exports);
|
|
18
|
+
__exportStar(require("./value.decorator"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,oDAAkC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const VALUE_METADATA: unique symbol;
|
|
2
|
+
export declare const VALUE_PROPERTIES_METADATA: unique symbol;
|
|
3
|
+
export interface ValueOptions {
|
|
4
|
+
parse: (value: any) => any;
|
|
5
|
+
}
|
|
6
|
+
export interface ValueDecoratedKey {
|
|
7
|
+
key: string;
|
|
8
|
+
options?: ValueOptions;
|
|
9
|
+
}
|
|
10
|
+
export declare const Value: (key: string, options?: ValueOptions) => PropertyDecorator;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Value = exports.VALUE_PROPERTIES_METADATA = exports.VALUE_METADATA = void 0;
|
|
4
|
+
const configuration_registry_1 = require("../configuration/configuration.registry");
|
|
5
|
+
exports.VALUE_METADATA = Symbol.for('__value__');
|
|
6
|
+
exports.VALUE_PROPERTIES_METADATA = Symbol.for('__properties__');
|
|
7
|
+
const Value = (key, options) => {
|
|
8
|
+
return (target, property) => {
|
|
9
|
+
configuration_registry_1.ConfigurationRegistry.registerAttribute(target, property);
|
|
10
|
+
Reflect.defineMetadata(exports.VALUE_METADATA, { key, options }, target, property);
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.Value = Value;
|
|
14
|
+
//# sourceMappingURL=value.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.decorator.js","sourceRoot":"","sources":["../../../src/decorators/value.decorator.ts"],"names":[],"mappings":";;;AAAA,oFAAgF;AAKnE,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAKzC,QAAA,yBAAyB,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AA4B/D,MAAM,KAAK,GAAG,CACnB,GAAW,EACX,OAAsB,EACH,EAAE;IACrB,OAAO,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE;QAC1C,8CAAqB,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,CAAC,cAAc,CAAC,sBAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,KAAK,SAQhB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./configify.module"), exports);
|
|
18
|
+
__exportStar(require("./decorators"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,+CAA6B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class Variables {
|
|
2
|
+
private static readonly ESCAPE_PATTERN;
|
|
3
|
+
private static readonly UNESCAPED_PATTERN;
|
|
4
|
+
private static readonly EXPANSION_GROUP_PATTERN;
|
|
5
|
+
static expand(record: Record<string, any>): Record<string, any>;
|
|
6
|
+
private static interpolate;
|
|
7
|
+
private static escapeSequences;
|
|
8
|
+
private static lastIndexOf;
|
|
9
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Variables = void 0;
|
|
4
|
+
class Variables {
|
|
5
|
+
static expand(record) {
|
|
6
|
+
const expanded = {};
|
|
7
|
+
for (const key in record) {
|
|
8
|
+
const value = record[key];
|
|
9
|
+
expanded[key] = this.escapeSequences(this.interpolate(value, record));
|
|
10
|
+
}
|
|
11
|
+
return expanded;
|
|
12
|
+
}
|
|
13
|
+
static interpolate(value, record) {
|
|
14
|
+
const lastUnescapedDollarSignIndex = this.lastIndexOf(value, this.UNESCAPED_PATTERN);
|
|
15
|
+
if (lastUnescapedDollarSignIndex === -1)
|
|
16
|
+
return value;
|
|
17
|
+
const rightMostGroup = value.slice(lastUnescapedDollarSignIndex);
|
|
18
|
+
const match = rightMostGroup.match(this.EXPANSION_GROUP_PATTERN);
|
|
19
|
+
if (match != null) {
|
|
20
|
+
const [, group, variableName, defaultValue] = match;
|
|
21
|
+
return this.interpolate(value.replace(group, defaultValue || record[variableName] || ''), record);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
static escapeSequences(value) {
|
|
26
|
+
return value.replace(this.ESCAPE_PATTERN, '$');
|
|
27
|
+
}
|
|
28
|
+
static lastIndexOf(value, regex) {
|
|
29
|
+
const matches = Array.from(value.matchAll(regex));
|
|
30
|
+
return matches.length > 0 ? matches.slice(-1)[0].index : -1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.Variables = Variables;
|
|
34
|
+
Variables.ESCAPE_PATTERN = /\\\$/g;
|
|
35
|
+
Variables.UNESCAPED_PATTERN = /(?!(?<=\\))\$/g;
|
|
36
|
+
Variables.EXPANSION_GROUP_PATTERN = /((?!(?<=\\))\${?([\w-.]+)(?::-([^}\\]*))?}?)/;
|
|
37
|
+
//# sourceMappingURL=variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../src/interpolation/variables.ts"],"names":[],"mappings":";;;AAQA,MAAa,SAAS;IA8BpB,MAAM,CAAC,MAAM,CAAC,MAA2B;QACvC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IASO,MAAM,CAAC,WAAW,CACxB,KAAa,EACb,MAA2B;QAE3B,MAAM,4BAA4B,GAAG,IAAI,CAAC,WAAW,CACnD,KAAK,EACL,IAAI,CAAC,iBAAiB,CACvB,CAAC;QAEF,IAAI,4BAA4B,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEjE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;YACpD,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAChE,MAAM,CACP,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAQO,MAAM,CAAC,eAAe,CAAC,KAAa;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IASO,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,KAAa;QACrD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;;AA3FH,8BA4FC;AAxFyB,wBAAc,GAAW,OAAO,CAAC;AAKjC,2BAAiB,GAAW,gBAAgB,CAAC;AAY7C,iCAAuB,GAC7C,8CAA8C,CAAC"}
|