@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.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/dist/changed-units.d.ts +5 -0
  3. package/dist/changed-units.d.ts.map +1 -0
  4. package/dist/changed-units.js +101 -0
  5. package/dist/check-step.d.ts +61 -0
  6. package/dist/check-step.d.ts.map +1 -0
  7. package/dist/check-step.js +270 -0
  8. package/dist/composites/pulumi-adopt-op.d.ts.map +1 -1
  9. package/dist/composites/pulumi-adopt-op.js +4 -2
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/integrity.json +2 -2
  14. package/dist/manifest.json +1 -1
  15. package/dist/member-outputs.d.ts +10 -3
  16. package/dist/member-outputs.d.ts.map +1 -1
  17. package/dist/member-outputs.js +11 -3
  18. package/dist/op/activities/pulumi-adopt.d.ts +5 -0
  19. package/dist/op/activities/pulumi-adopt.d.ts.map +1 -1
  20. package/dist/op/activities/pulumi-adopt.js +7 -2
  21. package/dist/op/activity-contracts.d.ts +2 -0
  22. package/dist/op/activity-contracts.d.ts.map +1 -1
  23. package/dist/op/activity-contracts.js +2 -2
  24. package/dist/planned-output-changes.d.ts +60 -0
  25. package/dist/planned-output-changes.d.ts.map +1 -0
  26. package/dist/planned-output-changes.js +94 -0
  27. package/dist/plugin.d.ts.map +1 -1
  28. package/dist/plugin.js +24 -0
  29. package/dist/preview-tips.d.ts +71 -0
  30. package/dist/preview-tips.d.ts.map +1 -0
  31. package/dist/preview-tips.js +76 -0
  32. package/dist/pulumi-up.d.ts +24 -1
  33. package/dist/pulumi-up.d.ts.map +1 -1
  34. package/dist/pulumi-up.js +64 -16
  35. package/dist/release-copy.d.ts +42 -2
  36. package/dist/release-copy.d.ts.map +1 -1
  37. package/dist/release-copy.js +96 -22
  38. package/dist/run.d.ts +27 -8
  39. package/dist/run.d.ts.map +1 -1
  40. package/dist/run.js +55 -14
  41. package/package.json +2 -2
  42. package/src/changed-units.test.ts +87 -0
  43. package/src/changed-units.ts +96 -0
  44. package/src/check-step.test.ts +191 -0
  45. package/src/check-step.ts +316 -0
  46. package/src/composites/pulumi-adopt-op.test.ts +35 -0
  47. package/src/composites/pulumi-adopt-op.ts +4 -2
  48. package/src/index.ts +2 -0
  49. package/src/member-outputs.test.ts +28 -6
  50. package/src/member-outputs.ts +22 -4
  51. package/src/op/activities/pulumi-adopt.ts +13 -2
  52. package/src/op/activity-contracts.ts +2 -2
  53. package/src/planned-output-changes.test.ts +85 -0
  54. package/src/planned-output-changes.ts +141 -0
  55. package/src/plugin.ts +26 -0
  56. package/src/preview-tips.test.ts +135 -0
  57. package/src/preview-tips.ts +128 -0
  58. package/src/pulumi-up.test.ts +100 -0
  59. package/src/pulumi-up.ts +84 -18
  60. package/src/release-copy.test.ts +90 -2
  61. package/src/release-copy.ts +103 -22
  62. package/src/run-plan-flags.test.ts +53 -0
  63. package/src/run.test.ts +1 -1
  64. package/src/run.ts +57 -14
  65. 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":"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"}
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;;;;;;;;;;;;;;;EAKtC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;EAK/B,CAAC"}
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
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoC/E,eAAO,MAAM,YAAY,EAAE,aAwK1B,CAAC"}
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
+ }
@@ -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
- * `prepareReleaseCopy` (`./release-copy.ts`), which runs `pulumi install`
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"pulumi-up.d.ts","sourceRoot":"","sources":["../src/pulumi-up.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pulumi-up.d.ts","sourceRoot":"","sources":["../src/pulumi-up.ts"],"names":[],"mappings":"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"}