@intentius/chant-lexicon-pulumi 0.124.55 → 0.124.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/changed-units.d.ts +5 -0
- package/dist/changed-units.d.ts.map +1 -0
- package/dist/changed-units.js +101 -0
- package/dist/check-step.d.ts +61 -0
- package/dist/check-step.d.ts.map +1 -0
- package/dist/check-step.js +270 -0
- package/dist/composites/pulumi-adopt-op.d.ts.map +1 -1
- package/dist/composites/pulumi-adopt-op.js +4 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/integrity.json +2 -2
- package/dist/manifest.json +1 -1
- package/dist/member-outputs.d.ts +10 -3
- package/dist/member-outputs.d.ts.map +1 -1
- package/dist/member-outputs.js +11 -3
- package/dist/op/activities/pulumi-adopt.d.ts +5 -0
- package/dist/op/activities/pulumi-adopt.d.ts.map +1 -1
- package/dist/op/activities/pulumi-adopt.js +7 -2
- package/dist/op/activity-contracts.d.ts +2 -0
- package/dist/op/activity-contracts.d.ts.map +1 -1
- package/dist/op/activity-contracts.js +2 -2
- package/dist/planned-output-changes.d.ts +60 -0
- package/dist/planned-output-changes.d.ts.map +1 -0
- package/dist/planned-output-changes.js +94 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +24 -0
- package/dist/preview-tips.d.ts +71 -0
- package/dist/preview-tips.d.ts.map +1 -0
- package/dist/preview-tips.js +76 -0
- package/dist/pulumi-up.d.ts +24 -1
- package/dist/pulumi-up.d.ts.map +1 -1
- package/dist/pulumi-up.js +64 -16
- package/dist/release-copy.d.ts +42 -2
- package/dist/release-copy.d.ts.map +1 -1
- package/dist/release-copy.js +96 -22
- package/dist/run.d.ts +27 -8
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +55 -14
- package/package.json +2 -2
- package/src/changed-units.test.ts +87 -0
- package/src/changed-units.ts +96 -0
- package/src/check-step.test.ts +191 -0
- package/src/check-step.ts +316 -0
- package/src/composites/pulumi-adopt-op.test.ts +35 -0
- package/src/composites/pulumi-adopt-op.ts +4 -2
- package/src/index.ts +2 -0
- package/src/member-outputs.test.ts +28 -6
- package/src/member-outputs.ts +22 -4
- package/src/op/activities/pulumi-adopt.ts +13 -2
- package/src/op/activity-contracts.ts +2 -2
- package/src/planned-output-changes.test.ts +85 -0
- package/src/planned-output-changes.ts +141 -0
- package/src/plugin.ts +26 -0
- package/src/preview-tips.test.ts +135 -0
- package/src/preview-tips.ts +128 -0
- package/src/pulumi-up.test.ts +100 -0
- package/src/pulumi-up.ts +84 -18
- package/src/release-copy.test.ts +90 -2
- package/src/release-copy.ts +103 -22
- package/src/run-plan-flags.test.ts +53 -0
- package/src/run.test.ts +1 -1
- package/src/run.ts +57 -14
- package/src/stack-export-snapshot.test.ts +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulumi-adopt.d.ts","sourceRoot":"","sources":["../../../src/op/activities/pulumi-adopt.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACpG,OAAO,EAQL,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAGnB,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,mHAAmH;IACnH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mHAAmH;IACnH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,yHAAyH;IACzH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qIAAqI;IACrI,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pulumi-adopt.d.ts","sourceRoot":"","sources":["../../../src/op/activities/pulumi-adopt.ts"],"names":[],"mappings":"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"}
|
|
@@ -179,12 +179,17 @@ function summary(a, view) {
|
|
|
179
179
|
changed: view.status !== "already-adopted",
|
|
180
180
|
};
|
|
181
181
|
}
|
|
182
|
+
/** The backend plunge adopts onto, resolved as the Check step resolves it, as plunge's environment. */
|
|
183
|
+
function adoptEnv(a, dir, deps) {
|
|
184
|
+
const backend = pulumiStackBackend(dir, { ...(a.backend ? { configured: a.backend } : {}), env: deps.env ?? process.env });
|
|
185
|
+
return backend ? { PULUMI_BACKEND_URL: backend.url } : undefined;
|
|
186
|
+
}
|
|
182
187
|
/** `plunge stack adopt --json`: the classification, written nowhere. A refusal fails the step. */
|
|
183
188
|
export async function adoptPreview(a, deps = {}) {
|
|
184
189
|
requireStack(a, "pulumiAdoptPreview");
|
|
185
190
|
const dir = stackDir(a);
|
|
186
191
|
const args = plungeAdoptArgs({ stack: a.stack, ...(a.file ? { file: a.file } : {}) });
|
|
187
|
-
const view = await adoptView(() => runAllowedPlunge(deps.plunge ?? defaultPlungeRunner, args, dir), "pulumiAdoptPreview", `plunge ${args.join(" ")}`);
|
|
192
|
+
const view = await adoptView(() => runAllowedPlunge(deps.plunge ?? defaultPlungeRunner, args, dir, adoptEnv(a, dir, deps)), "pulumiAdoptPreview", `plunge ${args.join(" ")}`);
|
|
188
193
|
if (view.status === "refused") {
|
|
189
194
|
throw new Error(`pulumiAdoptPreview: plunge refuses to adopt "${a.member}/${a.stack}": ${refusalText(view.refusals)}. Nothing was written.`);
|
|
190
195
|
}
|
|
@@ -195,7 +200,7 @@ export async function adoptStack(a, deps = {}) {
|
|
|
195
200
|
requireStack(a, "pulumiAdopt");
|
|
196
201
|
const dir = stackDir(a);
|
|
197
202
|
const args = plungeAdoptArgs({ stack: a.stack, yes: true, ...(a.file ? { file: a.file } : {}) });
|
|
198
|
-
const view = await adoptView(() => runAdoptPlunge(deps.plunge ?? defaultPlungeRunner, args, dir), "pulumiAdopt", `plunge ${args.join(" ")}`);
|
|
203
|
+
const view = await adoptView(() => runAdoptPlunge(deps.plunge ?? defaultPlungeRunner, args, dir, adoptEnv(a, dir, deps)), "pulumiAdopt", `plunge ${args.join(" ")}`);
|
|
199
204
|
if (view.status === "refused") {
|
|
200
205
|
throw new Error(`pulumiAdopt: plunge refused to adopt "${a.member}/${a.stack}": ${refusalText(view.refusals)}. Nothing was written.`);
|
|
201
206
|
}
|
|
@@ -76,6 +76,7 @@ export declare const pulumiAdoptPreviewContract: import("@intentius/chant/op").A
|
|
|
76
76
|
cwd?: string | undefined;
|
|
77
77
|
stack: string;
|
|
78
78
|
file?: string | undefined;
|
|
79
|
+
backend?: string | undefined;
|
|
79
80
|
}, {
|
|
80
81
|
member: string;
|
|
81
82
|
stack: string;
|
|
@@ -92,6 +93,7 @@ export declare const pulumiAdoptContract: import("@intentius/chant/op").Activity
|
|
|
92
93
|
cwd?: string | undefined;
|
|
93
94
|
stack: string;
|
|
94
95
|
file?: string | undefined;
|
|
96
|
+
backend?: string | undefined;
|
|
95
97
|
planDigest?: string | undefined;
|
|
96
98
|
}, {
|
|
97
99
|
member: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-contracts.d.ts","sourceRoot":"","sources":["../../src/op/activity-contracts.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAiBjC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;EAW/B,CAAC;AAqBF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;EAoBpC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;EAkBrC,CAAC;AAEF,eAAO,MAAM,0BAA0B
|
|
1
|
+
{"version":3,"file":"activity-contracts.d.ts","sourceRoot":"","sources":["../../src/op/activity-contracts.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAiBjC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;EAW/B,CAAC;AAqBF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;EAoBpC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;EAkBrC,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;EAKtC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAK/B,CAAC"}
|
|
@@ -85,5 +85,5 @@ export const pulumiAdoptExportContract = activityContract("pulumiAdoptExport", z
|
|
|
85
85
|
source: z.string(),
|
|
86
86
|
adoptFromFile: z.boolean(),
|
|
87
87
|
}), memberEntity);
|
|
88
|
-
export const pulumiAdoptPreviewContract = activityContract("pulumiAdoptPreview", z.strictObject({ ...adoptStackArgs, file: z.string().optional() }), z.object(adoptPreviewReturns), memberEntity);
|
|
89
|
-
export const pulumiAdoptContract = activityContract("pulumiAdopt", z.strictObject({ ...adoptStackArgs, file: z.string().optional(), planDigest: z.string().optional() }), z.object({ ...adoptPreviewReturns, matchesApproved: z.boolean().optional() }), memberEntity);
|
|
88
|
+
export const pulumiAdoptPreviewContract = activityContract("pulumiAdoptPreview", z.strictObject({ ...adoptStackArgs, file: z.string().optional(), backend: z.string().optional() }), z.object(adoptPreviewReturns), memberEntity);
|
|
89
|
+
export const pulumiAdoptContract = activityContract("pulumiAdopt", z.strictObject({ ...adoptStackArgs, file: z.string().optional(), backend: z.string().optional(), planDigest: z.string().optional() }), z.object({ ...adoptPreviewReturns, matchesApproved: z.boolean().optional() }), memberEntity);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which of a stack's outputs its preview changes (#4635). A real `pulumi
|
|
3
|
+
* preview --json` plans no stack outputs (recorded, #4475), so until this
|
|
4
|
+
* module every output of a stack with any change was unknown, and every
|
|
5
|
+
* stack reading any of them waited for the `up`. Here each output the last
|
|
6
|
+
* deployment holds is traced, by value, to the resource properties in the
|
|
7
|
+
* export that hold the same value, and the preview's entry for each such
|
|
8
|
+
* resource says whether the value can move:
|
|
9
|
+
*
|
|
10
|
+
* | the resource's entry | the property | verdict |
|
|
11
|
+
* |---|---|---|
|
|
12
|
+
* | replace, delete, or a `mayAppear` update | any | changes |
|
|
13
|
+
* | update | an input the diff names, or one that is unknown | changes |
|
|
14
|
+
* | update | an input the diff leaves alone; `id`, `arn` or `urn` | stable |
|
|
15
|
+
* | update | any other output (a provider-computed `version`) | may change |
|
|
16
|
+
* | no-op, read, or no entry in a targeted preview | any | stable |
|
|
17
|
+
*
|
|
18
|
+
* An output is changing when one of its matches changes, or when every
|
|
19
|
+
* match only may change; it is unchanged, with the export's value, when no
|
|
20
|
+
* match changes and one is stable. An output no property matches (one the
|
|
21
|
+
* program computed, such as `` `${bucket.arn}/*` ``), or an object, is
|
|
22
|
+
* untraced, and so unknown while the stack has changes. A list traces each
|
|
23
|
+
* string in it. Strings shorter than four characters match nothing, so a
|
|
24
|
+
* `"1"` or a `"true"` traces no output. Secret outputs are left out, as
|
|
25
|
+
* everywhere: chant reads outputs blind.
|
|
26
|
+
*
|
|
27
|
+
* The trace runs only when the preview plans no stack outputs and has
|
|
28
|
+
* changes; core's `member-outputs` and `pulumi-up`'s plan then take its
|
|
29
|
+
* unchanged outputs as known and the rest as unknown, so a stack reading
|
|
30
|
+
* through `StackReference` (#4547) an output the change moves is held until
|
|
31
|
+
* the producer applied and the reader is previewed again, and one reading
|
|
32
|
+
* only unchanged outputs plans now.
|
|
33
|
+
*/
|
|
34
|
+
import type { ChangeSetPart } from "@intentius/chant/change-set";
|
|
35
|
+
/** One output's verdict, and the resource property that decided it. */
|
|
36
|
+
export interface PulumiOutputChange {
|
|
37
|
+
output: string;
|
|
38
|
+
verdict: "changing" | "unchanged" | "untraced";
|
|
39
|
+
/** The deciding match: `<urn tail>.<property>` and the resource's action. Absent when untraced. */
|
|
40
|
+
because?: string;
|
|
41
|
+
}
|
|
42
|
+
/** The trace of every output the export holds that is not secret, by name. */
|
|
43
|
+
export interface PulumiPlannedOutputChanges {
|
|
44
|
+
outputs: PulumiOutputChange[];
|
|
45
|
+
/** Unchanged outputs with the export's value. */
|
|
46
|
+
known: Record<string, unknown>;
|
|
47
|
+
/** Changing and untraced outputs. */
|
|
48
|
+
unknown: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Trace each of the export's stack outputs through the member's part (the
|
|
52
|
+
* change set its preview became). `targeted` says the preview was narrowed
|
|
53
|
+
* with `--target`, so a resource it did not list is not touched by it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function pulumiPlannedOutputChanges(input: {
|
|
56
|
+
part: ChangeSetPart;
|
|
57
|
+
exported: unknown;
|
|
58
|
+
targeted?: boolean;
|
|
59
|
+
}): PulumiPlannedOutputChanges;
|
|
60
|
+
//# sourceMappingURL=planned-output-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planned-output-changes.d.ts","sourceRoot":"","sources":["../src/planned-output-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKjF,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAC/C,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,qCAAqC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiDD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,0BAA0B,CAiC5I"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { isPulumiNodeless } from "@intentius/chant/pulumi-urn";
|
|
2
|
+
import { pulumiExportedStackOutputs } from "./stack-outputs.js";
|
|
3
|
+
import { isObject, isSecret } from "./values.js";
|
|
4
|
+
/** Properties that stay put through an in-place update. */
|
|
5
|
+
const STABLE_OUTPUTS = new Set(["id", "arn", "urn"]);
|
|
6
|
+
const tailOf = (urn) => urn.split("::").slice(2).join("::") || urn;
|
|
7
|
+
/** Every (resource, property) of the export holding a string worth matching, by value. */
|
|
8
|
+
function holdersByValue(exported) {
|
|
9
|
+
const deployment = isObject(exported) && isObject(exported.deployment) ? exported.deployment : {};
|
|
10
|
+
const resources = Array.isArray(deployment.resources) ? deployment.resources : [];
|
|
11
|
+
const by = new Map();
|
|
12
|
+
const add = (value, h) => {
|
|
13
|
+
if (typeof value !== "string" || value.length < 4)
|
|
14
|
+
return;
|
|
15
|
+
const list = by.get(value) ?? [];
|
|
16
|
+
list.push(h);
|
|
17
|
+
by.set(value, list);
|
|
18
|
+
};
|
|
19
|
+
for (const r of resources) {
|
|
20
|
+
if (!isObject(r) || typeof r.urn !== "string" || typeof r.type !== "string")
|
|
21
|
+
continue;
|
|
22
|
+
if (r.custom !== true || isPulumiNodeless(r.type))
|
|
23
|
+
continue;
|
|
24
|
+
const inputs = isObject(r.inputs) ? r.inputs : {};
|
|
25
|
+
add(r.id, { urn: r.urn, prop: "id", input: false });
|
|
26
|
+
for (const [k, v] of Object.entries(isObject(r.outputs) ? r.outputs : {})) {
|
|
27
|
+
if (isSecret(v))
|
|
28
|
+
continue;
|
|
29
|
+
add(v, { urn: r.urn, prop: k, input: k in inputs });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return by;
|
|
33
|
+
}
|
|
34
|
+
function verdictOf(h, entry, targeted) {
|
|
35
|
+
if (!entry)
|
|
36
|
+
return targeted ? "stable" : "changes";
|
|
37
|
+
if (entry.mayAppear === true || entry.action === "replace" || entry.action === "delete" || entry.action === "forget")
|
|
38
|
+
return "changes";
|
|
39
|
+
if (entry.action !== "update")
|
|
40
|
+
return "stable";
|
|
41
|
+
const attr = entry.attributes.find((a) => a.path === h.prop);
|
|
42
|
+
if (attr)
|
|
43
|
+
return "changes";
|
|
44
|
+
if (h.input || STABLE_OUTPUTS.has(h.prop))
|
|
45
|
+
return "stable";
|
|
46
|
+
return "maybe";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Trace each of the export's stack outputs through the member's part (the
|
|
50
|
+
* change set its preview became). `targeted` says the preview was narrowed
|
|
51
|
+
* with `--target`, so a resource it did not list is not touched by it.
|
|
52
|
+
*/
|
|
53
|
+
export function pulumiPlannedOutputChanges(input) {
|
|
54
|
+
const byUrn = new Map();
|
|
55
|
+
for (const e of input.part.entries)
|
|
56
|
+
if (!byUrn.has(e.address))
|
|
57
|
+
byUrn.set(e.address, e);
|
|
58
|
+
const holders = holdersByValue(input.exported);
|
|
59
|
+
const targeted = input.targeted === true;
|
|
60
|
+
const traceString = (value) => {
|
|
61
|
+
const list = holders.get(value) ?? [];
|
|
62
|
+
if (list.length === 0)
|
|
63
|
+
return { verdict: "untraced" };
|
|
64
|
+
const judged = list.map((h) => ({ h, v: verdictOf(h, byUrn.get(h.urn), targeted), action: byUrn.get(h.urn)?.action ?? "unlisted" }));
|
|
65
|
+
const why = (j) => `${tailOf(j.h.urn)}.${j.h.prop} (${j.action})`;
|
|
66
|
+
const changes = judged.find((j) => j.v === "changes");
|
|
67
|
+
if (changes)
|
|
68
|
+
return { verdict: "changing", because: why(changes) };
|
|
69
|
+
const stable = judged.find((j) => j.v === "stable");
|
|
70
|
+
if (stable)
|
|
71
|
+
return { verdict: "unchanged", because: why(stable) };
|
|
72
|
+
return { verdict: "changing", because: why(judged[0]) };
|
|
73
|
+
};
|
|
74
|
+
const outputs = [];
|
|
75
|
+
const known = {};
|
|
76
|
+
for (const o of pulumiExportedStackOutputs(input.exported)) {
|
|
77
|
+
if (o.secret)
|
|
78
|
+
continue;
|
|
79
|
+
let traced;
|
|
80
|
+
if (typeof o.value === "string")
|
|
81
|
+
traced = traceString(o.value);
|
|
82
|
+
else if (Array.isArray(o.value) && o.value.length > 0 && o.value.every((v) => typeof v === "string")) {
|
|
83
|
+
const each = o.value.map(traceString);
|
|
84
|
+
traced = each.find((t) => t.verdict === "changing") ?? each.find((t) => t.verdict === "untraced") ?? each[0];
|
|
85
|
+
}
|
|
86
|
+
else
|
|
87
|
+
traced = { verdict: "untraced" };
|
|
88
|
+
outputs.push({ output: o.name, verdict: traced.verdict, ...(traced.because ? { because: traced.because } : {}) });
|
|
89
|
+
if (traced.verdict === "unchanged")
|
|
90
|
+
known[o.name] = o.value;
|
|
91
|
+
}
|
|
92
|
+
outputs.sort((a, b) => (a.output < b.output ? -1 : a.output > b.output ? 1 : 0));
|
|
93
|
+
return { outputs, known, unknown: outputs.filter((o) => o.verdict !== "unchanged").map((o) => o.output) };
|
|
94
|
+
}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoC/E,eAAO,MAAM,YAAY,EAAE,aAiM1B,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
* takes a `<project>/<stack>` template, and `prEnvTeardown` removes the
|
|
38
38
|
* environment's `pr-<n>` stacks (`./review-stack.ts`).
|
|
39
39
|
*/
|
|
40
|
+
import { pulumiCheckSteps } from "./check-step.js";
|
|
40
41
|
import { pulumiCiSetup } from "./ci-setup.js";
|
|
41
42
|
import { basename, isAbsolute, resolve } from "node:path";
|
|
42
43
|
import { createSkillsLoader } from "@intentius/chant/lexicon-plugin-helpers";
|
|
@@ -84,6 +85,18 @@ export const pulumiPlugin = {
|
|
|
84
85
|
prEnvTeardown(ctx) {
|
|
85
86
|
return reviewStackTeardown({ cwd: ctx.cwd });
|
|
86
87
|
},
|
|
88
|
+
// #4633: pulumi install, each stack's config against the project's schema, and pulumi about --json, per pulumi member in chant's check stage.
|
|
89
|
+
checkSteps() {
|
|
90
|
+
return pulumiCheckSteps();
|
|
91
|
+
},
|
|
92
|
+
// #4634: preview tips (rename without aliases, a replace forced by a name, what may register at up) as a note section per member.
|
|
93
|
+
async prNoteDetail(input) {
|
|
94
|
+
if (input.stage !== "plan")
|
|
95
|
+
return undefined;
|
|
96
|
+
const [{ pulumiTipsDetail }, { activeProductWords }] = await Promise.all([import("./preview-tips.js"), import("@intentius/chant/ci-product-words")]);
|
|
97
|
+
const words = activeProductWords();
|
|
98
|
+
return pulumiTipsDetail({ member: input.member, changeSet: input.changeSet, words: { product: words.product, noun: words.noun } });
|
|
99
|
+
},
|
|
87
100
|
// A pulumi workspace member's reader project (#3179): its stack export from
|
|
88
101
|
// the index store, else the checked-in one, never the program. See ./workspace-member.ts. `chant workspace
|
|
89
102
|
// graph` writes `dir` absolute; a project that writes the namespace itself
|
|
@@ -110,6 +123,17 @@ export const pulumiPlugin = {
|
|
|
110
123
|
});
|
|
111
124
|
return { entities: read.entities, warnings: read.warnings };
|
|
112
125
|
},
|
|
126
|
+
/**
|
|
127
|
+
* The stacks a change touched (#3183, INTENTIUS/plywood#22): a changed
|
|
128
|
+
* `Pulumi.<stack>.yaml` is that stack, any other file of a project is every
|
|
129
|
+
* stack with a config beside its `Pulumi.yaml`. Named as a `pulumi-up`
|
|
130
|
+
* step's deploy unit, so `chant components pr-plan` and `fan-out --base`
|
|
131
|
+
* select the components that update them. See ./changed-units.ts.
|
|
132
|
+
*/
|
|
133
|
+
async changedUnits(ctx) {
|
|
134
|
+
const { pulumiChangedUnits } = await import("./changed-units.js");
|
|
135
|
+
return pulumiChangedUnits(ctx.projectRoot, ctx.changedFiles);
|
|
136
|
+
},
|
|
113
137
|
graphMeta() {
|
|
114
138
|
const report = lastMemberReport();
|
|
115
139
|
return report ? { pulumiMember: report } : undefined;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview tips from a Pulumi member's change set (#4634). A tip names a
|
|
3
|
+
* pattern in a preview that usually wants a fix before the update: the
|
|
4
|
+
* product holds each tip's words and fix (plywood's `src/tips.ts` and
|
|
5
|
+
* `plywood tips <id>`), and this module finds the pattern in the change set
|
|
6
|
+
* the preview became (`./change-set.ts`). The note shows each tip as a row
|
|
7
|
+
* with its id, through the lexicon's `prNoteDetail`.
|
|
8
|
+
*
|
|
9
|
+
* | id | found when |
|
|
10
|
+
* |---|---|
|
|
11
|
+
* | `rename-without-aliases` | the preview deletes a resource and creates one of the same type whose name has the same stem, or the same name under another parent |
|
|
12
|
+
* | `replace-on-name` | a replace that creates before it deletes, forced by a name input (`name`, `<x>Name`, `bucket`) |
|
|
13
|
+
* | `unknown-in-apply` | an entry the preview could not list (`mayAppear`): something registers inside an `apply()` |
|
|
14
|
+
*
|
|
15
|
+
* A rename with `aliases` is not a delete and a create: Pulumi follows the
|
|
16
|
+
* alias and the preview shows the resource under its new URN as `same` or
|
|
17
|
+
* `update`. So a delete and a create of one type and stem in one preview is
|
|
18
|
+
* the rename without them. The stem is the name up to its first `-`, `_`,
|
|
19
|
+
* `.`, `:` or `/`, lowercased, so `assets` and `assets-v2` pair, and so
|
|
20
|
+
* does `worker-2` with a new `worker-3`; each delete pairs with one create
|
|
21
|
+
* at most.
|
|
22
|
+
*
|
|
23
|
+
* Tips plywood lists that a change set cannot show are left out:
|
|
24
|
+
* `secret-in-plain-config` reads stack config, which no preview step holds,
|
|
25
|
+
* and `no-protect-on-data` reads `protect`, which the change set does not
|
|
26
|
+
* carry.
|
|
27
|
+
*/
|
|
28
|
+
import type { ChangeSetDocument, ChangeSetEntry } from "@intentius/chant/change-set";
|
|
29
|
+
/** The tip ids this module finds, as plywood's tips page names them. */
|
|
30
|
+
export declare const PULUMI_PREVIEW_TIP_IDS: readonly ["rename-without-aliases", "replace-on-name", "unknown-in-apply"];
|
|
31
|
+
export type PulumiPreviewTipId = (typeof PULUMI_PREVIEW_TIP_IDS)[number];
|
|
32
|
+
/** One tip found in a member's change set. */
|
|
33
|
+
export interface PulumiPreviewTip {
|
|
34
|
+
id: PulumiPreviewTipId;
|
|
35
|
+
member: string;
|
|
36
|
+
/** The entry's address (a URN, or a may-appear address). */
|
|
37
|
+
address: string;
|
|
38
|
+
type: string;
|
|
39
|
+
name?: string;
|
|
40
|
+
/** For a rename: the created resource's address and name. */
|
|
41
|
+
created?: {
|
|
42
|
+
address: string;
|
|
43
|
+
name?: string;
|
|
44
|
+
};
|
|
45
|
+
/** For a replace: the name inputs that force it. */
|
|
46
|
+
inputs?: string[];
|
|
47
|
+
}
|
|
48
|
+
/** The stem a rename keeps: the name up to its first separator, lowercased. */
|
|
49
|
+
export declare function nameStem(name: string): string;
|
|
50
|
+
/** The tips in `entries`, in order: renames, then replaces, then what may register at up. Only pulumi entries are read. */
|
|
51
|
+
export declare function pulumiPreviewTips(entries: readonly ChangeSetEntry[]): PulumiPreviewTip[];
|
|
52
|
+
/** The words the detail section reads: the product's name and its noun. */
|
|
53
|
+
export interface PulumiTipWords {
|
|
54
|
+
product: string;
|
|
55
|
+
noun: [string, string];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The note's detail section for one member's tips (`prNoteDetail`), or
|
|
59
|
+
* undefined when it has none. One row per tip, with its id first. A product
|
|
60
|
+
* other than chant gets a closing line naming `<product> tips <id>`, the
|
|
61
|
+
* command its words give the fix with.
|
|
62
|
+
*/
|
|
63
|
+
export declare function pulumiTipsDetail(input: {
|
|
64
|
+
member: string;
|
|
65
|
+
changeSet: Pick<ChangeSetDocument, "entries">;
|
|
66
|
+
words?: PulumiTipWords;
|
|
67
|
+
}): {
|
|
68
|
+
title: string;
|
|
69
|
+
lines: string[];
|
|
70
|
+
} | undefined;
|
|
71
|
+
//# sourceMappingURL=preview-tips.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-tips.d.ts","sourceRoot":"","sources":["../src/preview-tips.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAErF,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,YAAI,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,CAAU,CAAC;AAEjH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,kBAAkB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAKD,2HAA2H;AAC3H,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,gBAAgB,EAAE,CA8BxF;AAgBD,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAYjL"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** The tip ids this module finds, as plywood's tips page names them. */
|
|
2
|
+
export const PULUMI_PREVIEW_TIP_IDS = ["rename-without-aliases", "replace-on-name", "unknown-in-apply"];
|
|
3
|
+
/** The stem a rename keeps: the name up to its first separator, lowercased. */
|
|
4
|
+
export function nameStem(name) {
|
|
5
|
+
return name.toLowerCase().split(/[-_.:/]/)[0] ?? "";
|
|
6
|
+
}
|
|
7
|
+
/** A name input: `name`, `<x>Name`, `<x>_name`, or an S3 bucket's `bucket`. */
|
|
8
|
+
const NAME_INPUT = /^(name|bucket|[a-z][A-Za-z0-9]*Name|[a-z0-9_]+_name)$/;
|
|
9
|
+
/** The tips in `entries`, in order: renames, then replaces, then what may register at up. Only pulumi entries are read. */
|
|
10
|
+
export function pulumiPreviewTips(entries) {
|
|
11
|
+
const mine = entries.filter((e) => e.lexicon === "pulumi");
|
|
12
|
+
const tips = [];
|
|
13
|
+
const base = (e) => ({ member: e.member, address: e.address, type: e.type, ...(e.name !== undefined ? { name: e.name } : {}) });
|
|
14
|
+
// rename-without-aliases
|
|
15
|
+
const creates = mine.filter((e) => e.action === "create" && e.mayAppear !== true && e.name !== undefined);
|
|
16
|
+
const taken = new Set();
|
|
17
|
+
for (const del of mine) {
|
|
18
|
+
if (del.action !== "delete" || del.mayAppear === true || del.name === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
const stem = nameStem(del.name);
|
|
21
|
+
if (!stem)
|
|
22
|
+
continue;
|
|
23
|
+
const match = creates.find((c) => !taken.has(c.address) && c.member === del.member && c.type === del.type && c.address !== del.address && nameStem(c.name) === stem);
|
|
24
|
+
if (!match)
|
|
25
|
+
continue;
|
|
26
|
+
taken.add(match.address);
|
|
27
|
+
tips.push({ id: "rename-without-aliases", ...base(del), created: { address: match.address, ...(match.name !== undefined ? { name: match.name } : {}) } });
|
|
28
|
+
}
|
|
29
|
+
// replace-on-name
|
|
30
|
+
for (const e of mine) {
|
|
31
|
+
if (e.action !== "replace" || e.disruption === "destroy")
|
|
32
|
+
continue;
|
|
33
|
+
const inputs = e.attributes.filter((a) => a.forcesReplacement === true && NAME_INPUT.test(a.path)).map((a) => a.path);
|
|
34
|
+
if (inputs.length > 0)
|
|
35
|
+
tips.push({ id: "replace-on-name", ...base(e), inputs });
|
|
36
|
+
}
|
|
37
|
+
// unknown-in-apply
|
|
38
|
+
for (const e of mine) {
|
|
39
|
+
if (e.mayAppear === true)
|
|
40
|
+
tips.push({ id: "unknown-in-apply", ...base(e) });
|
|
41
|
+
}
|
|
42
|
+
return tips;
|
|
43
|
+
}
|
|
44
|
+
const code = (s) => "`" + s.replace(/`/g, "'") + "`";
|
|
45
|
+
/** What the row says the preview showed. */
|
|
46
|
+
function seen(t) {
|
|
47
|
+
switch (t.id) {
|
|
48
|
+
case "rename-without-aliases":
|
|
49
|
+
return `deleted, and ${code(t.created?.name ?? t.created?.address ?? "?")} of the same type created, with no alias between them`;
|
|
50
|
+
case "replace-on-name":
|
|
51
|
+
return `replaced because ${t.inputs.map(code).join(", ")} changed, creating the new one before deleting the old`;
|
|
52
|
+
case "unknown-in-apply":
|
|
53
|
+
return "may register at up: the preview could not list it";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The note's detail section for one member's tips (`prNoteDetail`), or
|
|
58
|
+
* undefined when it has none. One row per tip, with its id first. A product
|
|
59
|
+
* other than chant gets a closing line naming `<product> tips <id>`, the
|
|
60
|
+
* command its words give the fix with.
|
|
61
|
+
*/
|
|
62
|
+
export function pulumiTipsDetail(input) {
|
|
63
|
+
const tips = pulumiPreviewTips(input.changeSet.entries.filter((e) => e.member === input.member));
|
|
64
|
+
if (tips.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
const words = input.words ?? { product: "chant", noun: ["member", "members"] };
|
|
67
|
+
const lines = ["| Tip | Resource | Preview |", "|---|---|---|"];
|
|
68
|
+
for (const t of tips)
|
|
69
|
+
lines.push(`| ${code(t.id)} | ${code(t.type)} ${code(t.name ?? t.address)} | ${seen(t)} |`);
|
|
70
|
+
if (words.product !== "chant") {
|
|
71
|
+
const ids = [...new Set(tips.map((t) => t.id))];
|
|
72
|
+
lines.push("", `${ids.map((id) => code(`${words.product} tips ${id}`)).join(", ")} ${ids.length === 1 ? "prints the fix" : "print the fixes"}.`);
|
|
73
|
+
}
|
|
74
|
+
const noun = words.noun[0];
|
|
75
|
+
return { title: `Tips for ${noun} ${code(input.member)} (${tips.length})`, lines };
|
|
76
|
+
}
|
package/dist/pulumi-up.d.ts
CHANGED
|
@@ -107,11 +107,17 @@
|
|
|
107
107
|
*
|
|
108
108
|
* The cut records tracked files, so a Node program's copy has no
|
|
109
109
|
* `node_modules`. Before the copy's first preview, `plan` and `run` call
|
|
110
|
-
* `
|
|
110
|
+
* `prepareProgram` (`./release-copy.ts`), which runs `pulumi install`
|
|
111
111
|
* (`plunge install`) in the copy when its runtime needs one, and refuses a
|
|
112
112
|
* Node copy with no lockfile by name, since an install would take today's
|
|
113
113
|
* versions rather than the release's.
|
|
114
114
|
*
|
|
115
|
+
* A CI job's checkout has the same gap, so the same call prepares the
|
|
116
|
+
* step's own directory by the same rule (plywood#22): a Node program with
|
|
117
|
+
* no `node_modules` in its directory or above it, and a lockfile beside its
|
|
118
|
+
* package.json, gets one `<engine> install` before the job's first engine
|
|
119
|
+
* run; with no lockfile the step refuses by name.
|
|
120
|
+
*
|
|
115
121
|
* ## review stacks (#4609)
|
|
116
122
|
*
|
|
117
123
|
* When `DeployContext.env` is a pull request's environment `pr-<n>` (`chant
|
|
@@ -133,6 +139,7 @@ import type { GatePolicyFindings } from "@intentius/chant/gate-policy";
|
|
|
133
139
|
import type { SnapshotStore } from "@intentius/chant/lifecycle/snapshot-store";
|
|
134
140
|
import { type PulumiApplySummary } from "./engine-events.js";
|
|
135
141
|
import { type PulumiMemberEngine, type PulumiMemberEngineSource } from "./member-engine.js";
|
|
142
|
+
import type { PulumiOutputChange } from "./planned-output-changes.js";
|
|
136
143
|
import { type PulumiPolicyPack, type PulumiRunner } from "./run.js";
|
|
137
144
|
import { type PulumiExportWrite } from "./stack-export-snapshot.js";
|
|
138
145
|
/** The lock grain values of `ci.lockGrain` (#4552's ruling A). */
|
|
@@ -149,6 +156,15 @@ export interface PulumiUpStepInput {
|
|
|
149
156
|
config?: Record<string, unknown>;
|
|
150
157
|
/** `pulumi` or `plunge`; see `pulumiMemberEngine`. */
|
|
151
158
|
engine?: PulumiMemberEngine;
|
|
159
|
+
/**
|
|
160
|
+
* The stack's backend URL (INTENTIUS/plywood#22), such as
|
|
161
|
+
* `plunge+s3://...` or `s3://...`: every engine command the step runs
|
|
162
|
+
* (preview, up, the stack output and export reads, a review stack's init)
|
|
163
|
+
* gets it as `PULUMI_BACKEND_URL`, over the job's own. It also answers the
|
|
164
|
+
* engine where `pulumiMemberEngine` would read `PULUMI_BACKEND_URL`.
|
|
165
|
+
* Absent: the job's `PULUMI_BACKEND_URL` or `Pulumi.yaml`'s, as before.
|
|
166
|
+
*/
|
|
167
|
+
backend?: string;
|
|
152
168
|
/**
|
|
153
169
|
* The engine release this stack is pinned to (#4592): the step runs
|
|
154
170
|
* `<engineRoot>/<engine>-<engineVersion>/<engine>`, the path the pulumi
|
|
@@ -245,6 +261,13 @@ export interface PulumiUpArtifact {
|
|
|
245
261
|
}[];
|
|
246
262
|
lastUpdate?: string;
|
|
247
263
|
};
|
|
264
|
+
/**
|
|
265
|
+
* Each stack output's verdict from the preview (#4635,
|
|
266
|
+
* `./planned-output-changes.ts`): `changing` and `untraced` ones are
|
|
267
|
+
* unknown to the stacks that read them, `unchanged` ones keep the
|
|
268
|
+
* export's value. Absent when the preview planned nothing to apply.
|
|
269
|
+
*/
|
|
270
|
+
plannedOutputs?: PulumiOutputChange[];
|
|
248
271
|
}
|
|
249
272
|
/** The CrossGuard packs a plan read at base (#4613). */
|
|
250
273
|
export interface PulumiUpPolicyPacks {
|
package/dist/pulumi-up.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulumi-up.d.ts","sourceRoot":"","sources":["../src/pulumi-up.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pulumi-up.d.ts","sourceRoot":"","sources":["../src/pulumi-up.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsIG;AAMH,OAAO,KAAK,EACV,UAAU,EAEV,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EAEpB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EAWL,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,OAAO,EAcL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,OAAO,CAAC;AAEf,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAM5F,kEAAkE;AAClE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7D,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,uGAAuG;IACvG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,sDAAsD;IACtD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4HAA4H;IAC5H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0IAA0I;IAC1I,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;IACtB,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,kEAAkE;IAClE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAED,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gFAAgF;IAChF,YAAY,EAAE,wBAAwB,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,EAAE,kBAAkB,CAAC;IAC3B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpG;;;;;OAKG;IACH,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAgCD,yHAAyH;AACzH,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,MAAM,EAAE,MAAM;IAFhC,QAAQ,CAAC,SAAS,QAAQ;IAC1B,YACkB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,qGAAqG;AACrG,qBAAa,uBAAwB,SAAQ,KAAK;aAK9B,MAAM,EAAE,MAAM;aACd,QAAQ,EAAE,kBAAkB;IAL9C,QAAQ,CAAC,YAAY,QAAQ;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,IAAqB;IACtC,YACkB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,kBAAkB,EAC5C,MAAM,CAAC,EAAE,MAAM,EAKhB;CACF;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;aAE9B,MAAM,EAAE,MAAM;aACd,WAAW,EAAE,MAAM,EAAE;aACrB,OAAO,CAAC,EAAE,kBAAkB;IAH9C,YACkB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,CAAC,EAAE,kBAAkB,YAAA,EAI7C;CACF;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,MAAM,EAAE,MAAM;aAEd,OAAO,CAAC,EAAE,kBAAkB;IAH9C,YACkB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,kBAAkB,YAAA,EAI7C;CACF;AAED,oHAAoH;AACpH,qBAAa,+BAAgC,SAAQ,KAAK;aAC5B,MAAM,EAAE,MAAM;IAA1C,YAA4B,MAAM,EAAE,MAAM,EAGzC;CACF;AAED,qHAAqH;AACrH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAElF;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4FAA4F;IAC5F,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC;IACtC,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uLAAuL;IACvL,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAClC;AA0BD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAI/D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAkBvG;AAED,mGAAmG;AACnG,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAOvL;AA+DD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAWhJ;AA4ND,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIrE;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,SAAS,kBAAkB,EAAE,EACtC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CAAO,GAChD,OAAO,CAAC,YAAY,EAAE,CAAC,CAuBzB;AAyBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAK9E;AAgHD,0GAA0G;AAC1G,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,oBAAoB,GAAG,aAAa,GAAG,oBAAoB,GAAG,IAAI,CAqBpI;AAED,qEAAqE;AACrE,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,eAAoB,GAAG,UAAU,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAwDtH;AAED,eAAO,MAAM,kBAAkB,mDAA6B,CAAC"}
|