@liflig/load-secrets 1.0.3 → 1.0.4

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.
@@ -0,0 +1,21 @@
1
+ import chalk from "chalk";
2
+ export declare function createReporter(argv: Record<string, unknown>): CLIReporter;
3
+ export declare class CLIReporter {
4
+ constructor(opts?: {
5
+ nonInteractive?: boolean;
6
+ verbose?: boolean;
7
+ });
8
+ stdout: NodeJS.WriteStream & {
9
+ fd: 1;
10
+ };
11
+ stderr: NodeJS.WriteStream & {
12
+ fd: 2;
13
+ };
14
+ nonInteractive: boolean;
15
+ isVerbose: boolean;
16
+ format: typeof chalk;
17
+ error(msg: string): void;
18
+ log(msg: string): void;
19
+ warn(msg: string): void;
20
+ info(msg: string): void;
21
+ }
@@ -0,0 +1,41 @@
1
+ import chalk from "chalk";
2
+ import readline from "readline";
3
+ const CLEAR_WHOLE_LINE = 0;
4
+ export function createReporter(argv) {
5
+ return new CLIReporter({
6
+ verbose: !!argv.verbose,
7
+ nonInteractive: !!argv.nonInteractive,
8
+ });
9
+ }
10
+ function clearLine(stdout) {
11
+ readline.clearLine(stdout, CLEAR_WHOLE_LINE);
12
+ readline.cursorTo(stdout, 0);
13
+ }
14
+ export class CLIReporter {
15
+ constructor(opts = {}) {
16
+ this.nonInteractive = !!opts.nonInteractive;
17
+ this.isVerbose = !!opts.verbose;
18
+ }
19
+ stdout = process.stdout;
20
+ stderr = process.stderr;
21
+ nonInteractive;
22
+ isVerbose;
23
+ format = chalk;
24
+ error(msg) {
25
+ clearLine(this.stderr);
26
+ this.stderr.write(`${this.format.red("error")} ${msg}\n`);
27
+ }
28
+ log(msg) {
29
+ clearLine(this.stdout);
30
+ this.stdout.write(`${msg}\n`);
31
+ }
32
+ warn(msg) {
33
+ clearLine(this.stderr);
34
+ this.stderr.write(`${this.format.yellow("warning")} ${msg}\n`);
35
+ }
36
+ info(msg) {
37
+ clearLine(this.stdout);
38
+ this.stdout.write(`${this.format.blue("info")} ${msg}\n`);
39
+ }
40
+ }
41
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/cli/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,OAAO,IAAI,WAAW,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;QACvB,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;KACtC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,MAA0B;IAC3C,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,OAAO,WAAW;IACtB,YACE,OAGI,EAAE;QAEN,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,CAAC;IAEM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxB,cAAc,CAAU;IACxB,SAAS,CAAU;IACnB,MAAM,GAAiB,KAAK,CAAC;IAE7B,KAAK,CAAC,GAAW;QACtB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEM,GAAG,CAAC,GAAW;QACpB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,IAAI,CAAC,GAAW;QACrB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IAEM,IAAI,CAAC,GAAW;QACrB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;CACF"}
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * as loadSecrets from "./load-secrets";
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * as loadSecrets from "./load-secrets";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadSecretsCli } from "./load-secrets";
2
+ export type { JsonSecret, Secret, SecretGroup } from "./types";
@@ -0,0 +1,2 @@
1
+ export { loadSecretsCli } from "./load-secrets";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/load-secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SecretGroup } from "./types";
2
+ /**
3
+ * Load secrets interactively into Secrets Manager.
4
+ */
5
+ export declare function loadSecretsCli(props: {
6
+ secretGroups: SecretGroup[];
7
+ }): void;
@@ -0,0 +1,323 @@
1
+ import { CreateSecretCommand, DescribeSecretCommand, GetSecretValueCommand, PutSecretValueCommand, RestoreSecretCommand, SecretsManagerClient, TagResourceCommand, UntagResourceCommand, ReplicateSecretToRegionsCommand, RemoveRegionsFromReplicationCommand, } from "@aws-sdk/client-secrets-manager";
2
+ import { GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
3
+ import { ResourceNotFoundException } from "@aws-sdk/client-secrets-manager";
4
+ import read from "read";
5
+ import { createReporter } from "../cli/reporter";
6
+ class LoadSecrets {
7
+ smClientForRegions = {};
8
+ stsClient;
9
+ reporter;
10
+ silent;
11
+ constructor(props) {
12
+ this.stsClient = new STSClient({
13
+ region: "eu-west-1",
14
+ });
15
+ this.reporter = props.reporter;
16
+ this.silent = props.silent;
17
+ }
18
+ getSmClient(region) {
19
+ if (!this.smClientForRegions[region]) {
20
+ this.smClientForRegions[region] = new SecretsManagerClient({
21
+ region,
22
+ });
23
+ }
24
+ return this.smClientForRegions[region];
25
+ }
26
+ async getInput(options) {
27
+ return new Promise((resolve, reject) => {
28
+ read(options, (err, answer) => {
29
+ if (err) {
30
+ reject(err);
31
+ }
32
+ resolve(answer);
33
+ });
34
+ });
35
+ }
36
+ async getSecretDetails(client, secretId) {
37
+ try {
38
+ return await client.send(new DescribeSecretCommand({ SecretId: secretId }));
39
+ }
40
+ catch (e) {
41
+ if (e instanceof ResourceNotFoundException) {
42
+ return null;
43
+ }
44
+ throw e;
45
+ }
46
+ }
47
+ async handleStringUpdate() {
48
+ return await this.getInput({
49
+ prompt: "Enter value (Ctrl+C to abort): ",
50
+ silent: this.silent,
51
+ });
52
+ }
53
+ async handleJsonUpdate(secret) {
54
+ this.reporter.log("The secret is of type JSON with these expected fields:");
55
+ for (const field of secret.fields) {
56
+ const key = typeof field === "string" ? field : field.key;
57
+ const desc = typeof field === "string"
58
+ ? ""
59
+ : field.description
60
+ ? ` (${field.description})`
61
+ : "";
62
+ this.reporter.log(` - ${key}${desc}`);
63
+ }
64
+ this.reporter.log("");
65
+ // TODO: Ability to specify full json value as one line.
66
+ const collectedValues = {};
67
+ for (const field of secret.fields) {
68
+ const key = typeof field === "string" ? field : field.key;
69
+ this.reporter.log(`Field: ${this.reporter.format.greenBright(key)}`);
70
+ if (typeof field !== "string" && field.example != null) {
71
+ this.reporter.log(`Example: ${this.reporter.format.magentaBright(field.example)}`);
72
+ }
73
+ const value = await this.getInput({
74
+ prompt: "Enter value (Ctrl+C to abort): ",
75
+ silent: this.silent,
76
+ });
77
+ collectedValues[key] = value;
78
+ this.reporter.log("");
79
+ }
80
+ return JSON.stringify(collectedValues, undefined, " ");
81
+ }
82
+ getFullName(secretGroup, secret) {
83
+ return `${secretGroup.namePrefix}${secret.name}`;
84
+ }
85
+ async syncTags(client, secret, tags) {
86
+ const keysToRemove = secret
87
+ .Tags.filter((existingTag) => !tags.some((it) => it.Key === existingTag.Key))
88
+ .map((it) => it.Key);
89
+ if (keysToRemove.length > 0) {
90
+ this.reporter.log(`Removing obsolete tags: ${keysToRemove.join(", ")}`);
91
+ await client.send(new UntagResourceCommand({
92
+ SecretId: secret.ARN,
93
+ TagKeys: keysToRemove,
94
+ }));
95
+ }
96
+ const tagsToUpdate = tags.filter((expectedTag) => {
97
+ const existing = secret.Tags.find((it) => it.Key === expectedTag.Key);
98
+ return existing == null || existing.Value != expectedTag.Value;
99
+ });
100
+ if (tagsToUpdate.length > 0) {
101
+ this.reporter.log(`Storing tags: ${tagsToUpdate.map((it) => it.Key).join(", ")}`);
102
+ await client.send(new TagResourceCommand({
103
+ SecretId: secret.ARN,
104
+ Tags: tagsToUpdate,
105
+ }));
106
+ }
107
+ }
108
+ async getSecretValue(client, secretId) {
109
+ const result = await client.send(new GetSecretValueCommand({
110
+ SecretId: secretId,
111
+ }));
112
+ if (result.SecretString == null) {
113
+ throw new Error("Missing SecretString (is it a binary?)");
114
+ }
115
+ return result.SecretString;
116
+ }
117
+ async handleUpdate(secretGroup, secret) {
118
+ const client = this.getSmClient(secretGroup.region);
119
+ const fullName = this.getFullName(secretGroup, secret);
120
+ const describeSecret = await this.getSecretDetails(client, fullName);
121
+ this.reporter.log(`Secret: ${this.reporter.format.greenBright(fullName)}`);
122
+ if (describeSecret == null) {
123
+ this.reporter.log("The secret does not already exist and will be created");
124
+ }
125
+ else {
126
+ this.reporter.log("Current value:");
127
+ this.reporter.log(this.reporter.format.yellowBright((await this.getSecretValue(client, fullName)).replace(/^/gm, " ")));
128
+ }
129
+ this.reporter.log("");
130
+ let secretValue;
131
+ if (secret.type === "json") {
132
+ try {
133
+ secretValue = await this.handleJsonUpdate(secret);
134
+ }
135
+ catch (e) {
136
+ if (e instanceof Error && e.message === "canceled") {
137
+ this.reporter.log("Aborted");
138
+ return;
139
+ }
140
+ throw e;
141
+ }
142
+ }
143
+ else if (secret.type === "string") {
144
+ secretValue = await this.handleStringUpdate();
145
+ }
146
+ else {
147
+ throw new Error(`Unsupported type`);
148
+ }
149
+ this.reporter.log("Storing secret value:");
150
+ this.reporter.log(this.reporter.format.yellowBright(secretValue.replace(/^/gm, " ")));
151
+ const tags = [
152
+ {
153
+ Key: "Source",
154
+ Value: "load-secrets script",
155
+ },
156
+ ];
157
+ let arn;
158
+ let version;
159
+ let newReplicaRegions = [];
160
+ let removedReplicaRegions = [];
161
+ if (describeSecret == null) {
162
+ newReplicaRegions = secret.replicaRegions ?? [];
163
+ const createResult = await client.send(new CreateSecretCommand({
164
+ Name: fullName,
165
+ AddReplicaRegions: secret.replicaRegions
166
+ ? secret.replicaRegions.map((replicaRegion) => ({
167
+ Region: replicaRegion,
168
+ }))
169
+ : undefined,
170
+ Description: "Created by load-secrets",
171
+ SecretString: secretValue,
172
+ Tags: tags,
173
+ }));
174
+ if (createResult.VersionId == null) {
175
+ throw new Error("Expected versionId");
176
+ }
177
+ arn = createResult.ARN;
178
+ version = createResult.VersionId;
179
+ }
180
+ else {
181
+ if (describeSecret.DeletedDate != null) {
182
+ await client.send(new RestoreSecretCommand({
183
+ SecretId: fullName,
184
+ }));
185
+ }
186
+ const updateResult = await client.send(new PutSecretValueCommand({
187
+ SecretId: fullName,
188
+ SecretString: secretValue,
189
+ }));
190
+ const currentReplicaRegions = describeSecret.ReplicationStatus?.map((replicationStatus) => replicationStatus.Region) ?? [];
191
+ newReplicaRegions =
192
+ secret.replicaRegions?.filter((region) => !currentReplicaRegions.includes(region)) ?? [];
193
+ removedReplicaRegions = currentReplicaRegions
194
+ .filter((region) => !!region && typeof region === "string")
195
+ .filter((region) => !(secret.replicaRegions || []).includes(region));
196
+ if (newReplicaRegions.length > 0) {
197
+ await client.send(new ReplicateSecretToRegionsCommand({
198
+ SecretId: fullName,
199
+ AddReplicaRegions: newReplicaRegions.map((region) => ({
200
+ Region: region,
201
+ })),
202
+ }));
203
+ }
204
+ if (removedReplicaRegions.length > 0) {
205
+ await client.send(new RemoveRegionsFromReplicationCommand({
206
+ SecretId: fullName,
207
+ RemoveReplicaRegions: removedReplicaRegions,
208
+ }));
209
+ }
210
+ if (updateResult.VersionId == null) {
211
+ throw new Error("Expected versionId");
212
+ }
213
+ await this.syncTags(client, describeSecret, tags);
214
+ arn = updateResult.ARN;
215
+ version = updateResult.VersionId;
216
+ }
217
+ this.reporter.log("");
218
+ this.reporter.log("Secret stored:");
219
+ this.reporter.log(`ARN: ${this.reporter.format.greenBright(arn)}`);
220
+ this.reporter.log(`Version: ${this.reporter.format.greenBright(version)}`);
221
+ if (newReplicaRegions.length > 0) {
222
+ this.reporter.log(`Read replicas added to regions: ${newReplicaRegions
223
+ .map((r) => this.reporter.format.greenBright(r))
224
+ .join(", ")}`);
225
+ }
226
+ if (removedReplicaRegions.length > 0) {
227
+ this.reporter.log(`Read replicas removed from regions: ${removedReplicaRegions
228
+ .map((r) => this.reporter.format.redBright(r))
229
+ .join(", ")}`);
230
+ }
231
+ }
232
+ checkSecretGroup(secretGroup) {
233
+ if (!secretGroup.namePrefix.startsWith("/") ||
234
+ !secretGroup.namePrefix.endsWith("/")) {
235
+ throw new Error(`namePrefix should start and end with /. Current value: ${secretGroup.namePrefix}`);
236
+ }
237
+ }
238
+ getSecretDescription(details) {
239
+ return details == null
240
+ ? "not yet created"
241
+ : details?.DeletedDate != null
242
+ ? `scheduled for deletion ${details.DeletedDate.toISOString()}`
243
+ : `last changed ${details.LastChangedDate?.toISOString() ?? "unknown"}`;
244
+ }
245
+ /**
246
+ * Returns false if aborted.
247
+ */
248
+ async selectAndUpdate(secretGroups) {
249
+ const secrets = [];
250
+ this.reporter.log("Select secret to write:");
251
+ this.reporter.log("");
252
+ for (const secretGroup of secretGroups) {
253
+ this.reporter.log(`${secretGroup.description} (prefix: ${secretGroup.namePrefix})`);
254
+ for (let i = 0; i < secretGroup.secrets.length; i++) {
255
+ const offset = secrets.length;
256
+ const secret = secretGroup.secrets[i];
257
+ secrets.push({
258
+ secret: secret,
259
+ secretGroup,
260
+ });
261
+ const client = this.getSmClient(secretGroup.region);
262
+ const details = await this.getSecretDetails(client, this.getFullName(secretGroup, secret));
263
+ const desc = this.getSecretDescription(details);
264
+ this.reporter.log(` (${offset}) ${secret.name} (${desc})`);
265
+ }
266
+ this.reporter.log("");
267
+ }
268
+ let index;
269
+ try {
270
+ const answer = await this.getInput({
271
+ prompt: "Enter index (or enter to quit): ",
272
+ });
273
+ if (answer.trim() === "") {
274
+ return false;
275
+ }
276
+ index = parseInt(answer);
277
+ if (!secrets[index]) {
278
+ throw new Error();
279
+ }
280
+ }
281
+ catch (_) {
282
+ this.reporter.warn("Secret not found - aborting");
283
+ return false;
284
+ }
285
+ this.reporter.log("");
286
+ await this.handleUpdate(secrets[index].secretGroup, secrets[index].secret);
287
+ this.reporter.log("");
288
+ return true;
289
+ }
290
+ async process(secretGroups) {
291
+ this.reporter.info("Checking account for current credentials");
292
+ this.reporter.info("If any error is given, make sure you have valid credentials active");
293
+ const currentAccount = await this.stsClient.send(new GetCallerIdentityCommand({}));
294
+ this.reporter.info(`Running for account ${currentAccount.Account}`);
295
+ this.reporter.log("");
296
+ const matchedSecretGroups = secretGroups.filter((it) => it.accountId === currentAccount.Account);
297
+ if (matchedSecretGroups.length === 0) {
298
+ this.reporter.error(`No secrets specified for this account - aborting`);
299
+ return;
300
+ }
301
+ for (const secretGroup of matchedSecretGroups) {
302
+ this.checkSecretGroup(secretGroup);
303
+ }
304
+ // eslint-disable-next-line no-empty
305
+ while (await this.selectAndUpdate(matchedSecretGroups)) { }
306
+ }
307
+ }
308
+ /**
309
+ * Load secrets interactively into Secrets Manager.
310
+ */
311
+ export function loadSecretsCli(props) {
312
+ const loadSecrets = new LoadSecrets({
313
+ reporter: createReporter({}),
314
+ // For now, we show the secrets, so that we get positive feedback that the value
315
+ // is correctly entered.
316
+ silent: false,
317
+ });
318
+ loadSecrets.process(props.secretGroups).catch((error) => {
319
+ console.error(error.stack || error.message || error);
320
+ process.exitCode = 1;
321
+ });
322
+ }
323
+ //# sourceMappingURL=load-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-secrets.js","sourceRoot":"","sources":["../../src/load-secrets/load-secrets.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,mCAAmC,GACpC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW;IACE,kBAAkB,GACjC,EAAE,CAAC;IACY,SAAS,CAAY;IAErB,QAAQ,CAAc;IACtB,MAAM,CAAU;IAEjC,YAAY,KAAiD;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC;YAC7B,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAI,oBAAoB,CAAC;gBACzD,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAqB;QAClC,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC5B,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,MAA4B,EAC5B,QAAgB;QAEhB,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,IAAI,CACtB,IAAI,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAClD,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,yBAAyB,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC;YACzB,MAAM,EAAE,iCAAiC;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,MAAkB;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YAC1D,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,KAAK,CAAC,WAAW;oBACjB,CAAC,CAAC,KAAK,KAAK,CAAC,WAAW,GAAG;oBAC3B,CAAC,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtB,wDAAwD;QAExD,MAAM,eAAe,GAAkC,EAAE,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YAE1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAErE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;gBACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,YAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAChE,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;gBAChC,MAAM,EAAE,iCAAiC;gBACzC,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAE7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,CAAC,WAAwB,EAAE,MAAc;QAClD,OAAO,GAAG,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAA4B,EAC5B,MAA8B,EAC9B,IAAW;QAEX,MAAM,YAAY,GAAG,MAAM;aACxB,IAAK,CAAC,MAAM,CACX,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAI,KAAK,WAAW,CAAC,GAAI,CAAC,CAClE;aACA,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAI,CAAC,CAAC;QAExB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAA2B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,oBAAoB,CAAC;gBACvB,QAAQ,EAAE,MAAM,CAAC,GAAI;gBACrB,OAAO,EAAE,YAAY;aACtB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAI,KAAK,WAAW,CAAC,GAAI,CAAC,CAAC;YACzE,OAAO,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,iBAAiB,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;YACF,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,kBAAkB,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC,GAAI;gBACrB,IAAI,EAAE,YAAY;aACnB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA4B,EAAE,QAAgB;QACjE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,IAAI,qBAAqB,CAAC;YACxB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CACH,CAAC;QAEF,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAwB,EAAE,MAAc;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE3E,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,uDAAuD,CACxD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAC/B,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CACnE,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtB,IAAI,WAAmB,CAAC;QAExB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CACpE,CAAC;QAEF,MAAM,IAAI,GAAU;YAClB;gBACE,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,qBAAqB;aAC7B;SACF,CAAC;QAEF,IAAI,GAAW,CAAC;QAChB,IAAI,OAAe,CAAC;QACpB,IAAI,iBAAiB,GAAa,EAAE,CAAC;QACrC,IAAI,qBAAqB,GAAa,EAAE,CAAC;QAEzC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,iBAAiB,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CACpC,IAAI,mBAAmB,CAAC;gBACtB,IAAI,EAAE,QAAQ;gBACd,iBAAiB,EAAE,MAAM,CAAC,cAAc;oBACtC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;wBAC5C,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACL,CAAC,CAAC,SAAS;gBACb,WAAW,EAAE,yBAAyB;gBACtC,YAAY,EAAE,WAAW;gBACzB,IAAI,EAAE,IAAI;aACX,CAAC,CACH,CAAC;YAEF,IAAI,YAAY,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YAED,GAAG,GAAG,YAAY,CAAC,GAAI,CAAC;YACxB,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,cAAc,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;gBACvC,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,oBAAoB,CAAC;oBACvB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CACpC,IAAI,qBAAqB,CAAC;gBACxB,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,WAAW;aAC1B,CAAC,CACH,CAAC;YACF,MAAM,qBAAqB,GACzB,cAAc,CAAC,iBAAiB,EAAE,GAAG,CACnC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAChD,IAAI,EAAE,CAAC;YACV,iBAAiB;gBACf,MAAM,CAAC,cAAc,EAAE,MAAM,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CACpD,IAAI,EAAE,CAAC;YACV,qBAAqB,GAAG,qBAAqB;iBAC1C,MAAM,CACL,CAAC,MAAM,EAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CACrE;iBACA,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACvE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,+BAA+B,CAAC;oBAClC,QAAQ,EAAE,QAAQ;oBAClB,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACpD,MAAM,EAAE,MAAM;qBACf,CAAC,CAAC;iBACJ,CAAC,CACH,CAAC;YACJ,CAAC;YACD,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,mCAAmC,CAAC;oBACtC,QAAQ,EAAE,QAAQ;oBAClB,oBAAoB,EAAE,qBAAqB;iBAC5C,CAAC,CACH,CAAC;YACJ,CAAC;YAED,IAAI,YAAY,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAElD,GAAG,GAAG,YAAY,CAAC,GAAI,CAAC;YACxB,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,mCAAmC,iBAAiB;iBACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;QACD,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,uCAAuC,qBAAqB;iBACzD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;iBAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,WAAwB;QACvC,IACE,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;YACvC,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EACrC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,0DAA0D,WAAW,CAAC,UAAU,EAAE,CACnF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,OAAsC;QACzD,OAAO,OAAO,IAAI,IAAI;YACpB,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI;gBAC5B,CAAC,CAAC,0BAA0B,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;gBAC/D,CAAC,CAAC,gBAAgB,OAAO,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,YAA2B;QAC/C,MAAM,OAAO,GAAmD,EAAE,CAAC;QAEnE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,GAAG,WAAW,CAAC,WAAW,aAAa,WAAW,CAAC,UAAU,GAAG,CACjE,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEtC,OAAO,CAAC,IAAI,CAAC;oBACX,MAAM,EAAE,MAAM;oBACd,WAAW;iBACZ,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,MAAM,EACN,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CACtC,CAAC;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAEhD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;gBACjC,MAAM,EAAE,kCAAkC;aAC3C,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAA2B;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,oEAAoE,CACrE,CAAC;QACF,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9C,IAAI,wBAAwB,CAAC,EAAE,CAAC,CACjC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,cAAc,CAAC,OAAQ,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtB,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAC7C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,cAAc,CAAC,OAAQ,CACjD,CAAC;QACF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAAE,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;QAED,oCAAoC;QACpC,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA,CAAC;IAC5D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsC;IACnE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;QAC5B,gFAAgF;QAChF,wBAAwB;QACxB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface BaseSecret {
2
+ name: string;
3
+ description?: string;
4
+ /**
5
+ * A list of regions to create read replicas
6
+ * of the secret in.
7
+ */
8
+ replicaRegions?: string[];
9
+ }
10
+ export type JsonSecretSimpleField = string;
11
+ export interface JsonSecretDescribedField {
12
+ key: string;
13
+ description?: string;
14
+ example?: string;
15
+ }
16
+ /**
17
+ * Used for secrets that are a single plaintext string,
18
+ * and do not require JSON formating.
19
+ */
20
+ export interface StringSecret extends BaseSecret {
21
+ type: "string";
22
+ }
23
+ export interface JsonSecret extends BaseSecret {
24
+ type: "json";
25
+ fields: (JsonSecretSimpleField | JsonSecretDescribedField)[];
26
+ }
27
+ export type Secret = JsonSecret | StringSecret;
28
+ export interface SecretGroup {
29
+ accountId: string;
30
+ region: string;
31
+ description: string;
32
+ namePrefix: string;
33
+ secrets: Secret[];
34
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/load-secrets/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/load-secrets",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Library for loading project secrets into AWS Secrets Manager",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/capralifecycle/load-secrets.git"
11
11
  },
12
12
  "scripts": {
13
- "prepare": "husky",
13
+ "prepare": "npm run build && husky",
14
14
  "build": "tsc",
15
15
  "lint": "eslint .",
16
16
  "lint:fix": "eslint --fix .",
package/renovate.json5 ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": [
3
+ "github>capraconsulting/renovate-config:library",
4
+ "github>capraconsulting/renovate-config:aggressive"
5
+ ]
6
+ }