@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
package/dist/pulumi-up.js
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
|
|
@@ -142,12 +148,13 @@ import { ciEngineDir, ciRelease, CI_ENGINE_ROOT } from "./ci-setup.js";
|
|
|
142
148
|
import { pulumiMemberPlannedOutputs } from "./member-outputs.js";
|
|
143
149
|
import { pulumiPlanShape, pulumiShapeDifferences } from "./plan-shape.js";
|
|
144
150
|
import { pulumiLockRows } from "./lock-rows.js";
|
|
151
|
+
import { stackRowKey } from "@intentius/chant/lifecycle/lock-rows";
|
|
145
152
|
import { pulumiTraceFacts } from "./trace-facts.js";
|
|
146
153
|
import { defaultPlungeRunner, defaultPulumiRunner, engineRunnerAt, plungeUpArgs, pulumiMemberStackOutputs, pulumiRunFailure, pulumiUpArgs, pulumiUpPreviewArgs, memberExportOf, runAllowedPlunge, runAllowedPulumi, runApplyPlunge, runApplyPulumi, } from "./run.js";
|
|
147
154
|
import { writePulumiExportSnapshot } from "./stack-export-snapshot.js";
|
|
148
155
|
import { pointerSegment, pulumiStackReferences, stackReferenceOwner } from "./stack-references.js";
|
|
149
156
|
import { isObject } from "./values.js";
|
|
150
|
-
import {
|
|
157
|
+
import { prepareProgram } from "./release-copy.js";
|
|
151
158
|
import { initReviewStack, reviewConfigSource, reviewStackFor, reviewStackLocation } from "./review-stack.js";
|
|
152
159
|
/**
|
|
153
160
|
* The packs a preview runs (#4613). With `ctx.policyBase` each step pack in
|
|
@@ -328,17 +335,30 @@ function locationOf(r, stack) {
|
|
|
328
335
|
}
|
|
329
336
|
/** A plan file name with nothing a path could read into. */
|
|
330
337
|
const fileSafe = (s) => s.replace(/[^A-Za-z0-9._-]+/g, "_");
|
|
338
|
+
/** The environment the engine is picked from: the job's, with the step's backend as `PULUMI_BACKEND_URL`. */
|
|
339
|
+
function engineEnv(input, opts) {
|
|
340
|
+
if (input.backend === undefined)
|
|
341
|
+
return opts.env ? { env: opts.env } : {};
|
|
342
|
+
return { env: { ...(opts.env ?? process.env), PULUMI_BACKEND_URL: input.backend } };
|
|
343
|
+
}
|
|
344
|
+
/** `run` with `PULUMI_BACKEND_URL` set to the step's backend over whatever env the call passes. */
|
|
345
|
+
function withBackend(run, backend) {
|
|
346
|
+
return (args, o) => run(args, { ...o, env: { ...(o.env ?? {}), PULUMI_BACKEND_URL: backend } });
|
|
347
|
+
}
|
|
331
348
|
function resolveStep(input, opts, declared) {
|
|
332
349
|
requireInput(input);
|
|
350
|
+
if (input.backend !== undefined && (typeof input.backend !== "string" || input.backend.trim() === "")) {
|
|
351
|
+
throw new Error('pulumi-up: "backend" is the stack\'s backend URL, such as plunge+s3://<bucket> or s3://<bucket>');
|
|
352
|
+
}
|
|
333
353
|
const dir = stackDir(input);
|
|
334
354
|
const member = pulumiUpMember(input);
|
|
335
|
-
const picked = pulumiMemberEngine(dir, input.engine,
|
|
355
|
+
const picked = pulumiMemberEngine(dir, input.engine, engineEnv(input, opts));
|
|
336
356
|
// #4552: the step's own grain, else ci.lockGrain as the caller read it at base, else the engine's default.
|
|
337
357
|
const grain = input.lockGrain ?? declared ?? pulumiDefaultLockGrain(picked.engine);
|
|
338
358
|
if (grain === "resource" && picked.engine === "pulumi")
|
|
339
359
|
throw new PulumiResourceGrainRefusedError(member);
|
|
340
360
|
const engineBin = pulumiUpEngineBin(input, picked.engine);
|
|
341
|
-
return { dir, member, engine: picked.engine, ...(engineBin ? { engineBin } : {}), engineSource: picked.source, engineBecause: picked.because, grain };
|
|
361
|
+
return { dir, member, engine: picked.engine, ...(engineBin ? { engineBin } : {}), engineSource: picked.source, engineBecause: picked.because, grain, ...(input.backend ? { backend: input.backend } : {}) };
|
|
342
362
|
}
|
|
343
363
|
/**
|
|
344
364
|
* The binary a step pinned with `engineVersion` runs (#4592): the versioned
|
|
@@ -362,7 +382,7 @@ export function pulumiUpEngineBin(input, engine) {
|
|
|
362
382
|
}
|
|
363
383
|
/** The `run` and `plunge` options for the stack output and export reads: the pinned binary's for both when the step names one (#4592), else the caller's. */
|
|
364
384
|
function runnerOptions(r, opts) {
|
|
365
|
-
if (r.engineBin) {
|
|
385
|
+
if (r.engineBin || r.backend) {
|
|
366
386
|
const { pulumi, plunge } = runnersFor(r, opts);
|
|
367
387
|
return { run: pulumi, plunge };
|
|
368
388
|
}
|
|
@@ -370,11 +390,16 @@ function runnerOptions(r, opts) {
|
|
|
370
390
|
}
|
|
371
391
|
/** The runners a resolved step uses: the pinned binary's when it names one, else the options' or the PATH default. */
|
|
372
392
|
function runnersFor(r, opts) {
|
|
393
|
+
let out;
|
|
373
394
|
if (r.engineBin) {
|
|
374
395
|
const pinned = opts.runAt ? opts.runAt(r.engineBin) : engineRunnerAt(r.engineBin);
|
|
375
|
-
|
|
396
|
+
out = { pulumi: pinned, plunge: pinned };
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
out = { pulumi: opts.run ?? defaultPulumiRunner, plunge: opts.plunge ?? defaultPlungeRunner };
|
|
376
400
|
}
|
|
377
|
-
|
|
401
|
+
// plywood#22: the step's backend reaches every command, whichever call site runs it.
|
|
402
|
+
return r.backend ? { pulumi: withBackend(out.pulumi, r.backend), plunge: withBackend(out.plunge, r.backend) } : out;
|
|
378
403
|
}
|
|
379
404
|
/** The scratch directory, the config copy in it and plunge's plan file path. */
|
|
380
405
|
function scratchFor(r, input, opts) {
|
|
@@ -406,7 +431,10 @@ async function previewStack(ctx, r, input, opts, files) {
|
|
|
406
431
|
stack: input.stack,
|
|
407
432
|
...(files.planFile ? { savePlan: files.planFile } : {}),
|
|
408
433
|
...(files.configFile ? { configFile: files.configFile } : {}),
|
|
434
|
+
// #4627: --refresh and --target-dependents pass to the preview as they came.
|
|
435
|
+
...(ctx.refresh ? { refresh: true } : {}),
|
|
409
436
|
...(targets ? { targets } : {}),
|
|
437
|
+
...(targets && ctx.targetDependents ? { targetDependents: true } : {}),
|
|
410
438
|
...(packs.length ? { policyPacks: packs } : {}),
|
|
411
439
|
});
|
|
412
440
|
let stdout;
|
|
@@ -472,10 +500,10 @@ function isArtifact(value) {
|
|
|
472
500
|
const v = value;
|
|
473
501
|
return v?.kind === "pulumi-up" && typeof v.planDigest === "string" && typeof v.shape === "object" && v.shape !== null;
|
|
474
502
|
}
|
|
475
|
-
/**
|
|
476
|
-
async function
|
|
503
|
+
/** The program's directory, a release's copy (#4542) or the checkout in place (plywood#22), made runnable before its first engine run. */
|
|
504
|
+
async function readyProgram(r, opts) {
|
|
477
505
|
const runners = runnersFor(r, opts);
|
|
478
|
-
await
|
|
506
|
+
await prepareProgram({ dir: r.dir, member: r.member, engine: r.engine, run: r.engine === "plunge" ? runners.plunge : runners.pulumi });
|
|
479
507
|
}
|
|
480
508
|
async function planStack(ctx, original, opts) {
|
|
481
509
|
// #4609: in pr-<n>, the review stack, made from the template before its first preview.
|
|
@@ -485,7 +513,7 @@ async function planStack(ctx, original, opts) {
|
|
|
485
513
|
const unresolved = [...(ctx.unresolvedInputs ?? [])].sort();
|
|
486
514
|
if (unresolved.length > 0)
|
|
487
515
|
return { ...waitingStack(ctx, r, input, unresolved), ...location };
|
|
488
|
-
await
|
|
516
|
+
await readyProgram(r, opts);
|
|
489
517
|
if (review) {
|
|
490
518
|
const runners = runnersFor(r, opts);
|
|
491
519
|
await initReviewStack({
|
|
@@ -509,7 +537,12 @@ async function planStack(ctx, original, opts) {
|
|
|
509
537
|
}
|
|
510
538
|
const planDigest = read.part.member.planDigest;
|
|
511
539
|
const references = stackReferencesOf(read.prior, input);
|
|
512
|
-
const planned = pulumiMemberPlannedOutputs(r.member, {
|
|
540
|
+
const planned = pulumiMemberPlannedOutputs(r.member, {
|
|
541
|
+
part: read.part,
|
|
542
|
+
preview: read.preview,
|
|
543
|
+
...(read.prior !== undefined ? { exported: read.prior } : {}),
|
|
544
|
+
...(ctx.targets?.length ? { targeted: true } : {}),
|
|
545
|
+
});
|
|
513
546
|
const artifact = {
|
|
514
547
|
kind: "pulumi-up",
|
|
515
548
|
member: r.member,
|
|
@@ -525,6 +558,7 @@ async function planStack(ctx, original, opts) {
|
|
|
525
558
|
policy: read.policy,
|
|
526
559
|
...(packs.read ? { policyPacks: packs.read } : {}),
|
|
527
560
|
...(references ? { stackReferences: references } : {}),
|
|
561
|
+
...(planned.outputChanges ? { plannedOutputs: planned.outputChanges } : {}),
|
|
528
562
|
};
|
|
529
563
|
return {
|
|
530
564
|
member: r.member,
|
|
@@ -639,7 +673,7 @@ async function runStack(ctx, original, opts) {
|
|
|
639
673
|
const handed = ctx.plans?.[r.member];
|
|
640
674
|
const fromWave = isArtifact(handed);
|
|
641
675
|
const targets = ctx.targets && ctx.targets.length > 0 ? ctx.targets : undefined;
|
|
642
|
-
await
|
|
676
|
+
await readyProgram(r, opts);
|
|
643
677
|
// Ruling D: no approved plan handed in, so plan here and apply that.
|
|
644
678
|
let approved;
|
|
645
679
|
if (fromWave) {
|
|
@@ -676,6 +710,7 @@ async function runStack(ctx, original, opts) {
|
|
|
676
710
|
const tail = {
|
|
677
711
|
...(configFile ? { configFile } : {}),
|
|
678
712
|
...(targets ? { targets } : {}),
|
|
713
|
+
...(targets && ctx.targetDependents ? { targetDependents: true } : {}),
|
|
679
714
|
...(policyPacks?.length ? { policyPacks } : {}),
|
|
680
715
|
};
|
|
681
716
|
try {
|
|
@@ -700,7 +735,8 @@ async function runStack(ctx, original, opts) {
|
|
|
700
735
|
throw new PlanShapeMovedError(r.member, differences);
|
|
701
736
|
}
|
|
702
737
|
try {
|
|
703
|
-
|
|
738
|
+
// #4627: stock up plans again, so it refreshes as its preview did; plunge applies the saved plan, whose preview refreshed.
|
|
739
|
+
({ stdout } = await runApplyPulumi(runnersFor(r, opts).pulumi, pulumiUpArgs({ stack: input.stack, ...tail, ...(ctx.refresh ? { refresh: true } : {}) }), r.dir));
|
|
704
740
|
}
|
|
705
741
|
catch (err) {
|
|
706
742
|
throw upFailure(r, err, approved.policy);
|
|
@@ -779,6 +815,8 @@ export function createPulumiUpCapability(opts = {}) {
|
|
|
779
815
|
rollbackPolicy: "needs-opt-out",
|
|
780
816
|
// Each target passes as `--target <urn>` to the preview and to `up`.
|
|
781
817
|
targets: "accept",
|
|
818
|
+
// #4627: `--refresh` and `--target-dependents` pass to the preview, and to `pulumi up`; the digest binds them.
|
|
819
|
+
planFlags: { refresh: "accept", targetDependents: "accept" },
|
|
782
820
|
plan: (ctx, input) => planStack(ctx, input, opts),
|
|
783
821
|
run: (ctx, input) => runStack(ctx, input, opts),
|
|
784
822
|
// The outputs standing now, for a dependent planned before this stack applies.
|
|
@@ -796,16 +834,26 @@ export function createPulumiUpCapability(opts = {}) {
|
|
|
796
834
|
// #4552: resource on plunge, the stack (target) on stock Pulumi.
|
|
797
835
|
defaultLockGrain(input) {
|
|
798
836
|
requireInput(input);
|
|
799
|
-
return pulumiDefaultLockGrain(pulumiMemberEngine(stackDir(input), input.engine,
|
|
837
|
+
return pulumiDefaultLockGrain(pulumiMemberEngine(stackDir(input), input.engine, engineEnv(input, opts)).engine);
|
|
800
838
|
},
|
|
801
839
|
// Stock Pulumi keeps the stack grain: its backend's stack lock already orders updates, and nothing in it is per resource.
|
|
802
840
|
lockGrainRefusal(input, grain) {
|
|
803
841
|
if (grain !== "resource")
|
|
804
842
|
return undefined;
|
|
805
843
|
requireInput(input);
|
|
806
|
-
const engine = pulumiMemberEngine(stackDir(input), input.engine,
|
|
844
|
+
const engine = pulumiMemberEngine(stackDir(input), input.engine, engineEnv(input, opts)).engine;
|
|
807
845
|
return engine === "pulumi" ? new PulumiResourceGrainRefusedError(pulumiUpMember(input)).message : undefined;
|
|
808
846
|
},
|
|
847
|
+
// The ruling for ci-products (2026-10-28): a stock stack waits for its stack row on the ledger in place of the backend's lock.
|
|
848
|
+
// plunge keeps the resource grain, and a plunge stack declared on the target grain waits on the same row.
|
|
849
|
+
targetLockRow(input, plan) {
|
|
850
|
+
requireInput(input);
|
|
851
|
+
const project = readProject(stackDir(input))?.name;
|
|
852
|
+
const stack = plan && isArtifact(plan.artifact) ? plan.artifact.stack : input.stack;
|
|
853
|
+
if (typeof project !== "string" || !stack)
|
|
854
|
+
return undefined;
|
|
855
|
+
return { key: stackRowKey(project, stack), target: pulumiUpMember(input), address: `${project}/${stack}` };
|
|
856
|
+
},
|
|
809
857
|
// URN rows, object rows, and the stack row when something may appear only at apply (./lock-rows.ts).
|
|
810
858
|
lockRows(input, plan) {
|
|
811
859
|
if (!plan.changeSet)
|
package/dist/release-copy.d.ts
CHANGED
|
@@ -16,6 +16,12 @@ export declare class PulumiReleaseCopyRefusedError extends Error {
|
|
|
16
16
|
readonly member: string;
|
|
17
17
|
constructor(member: string, reason: string);
|
|
18
18
|
}
|
|
19
|
+
/** An in-place program that cannot be made runnable, with the reason (plywood#22). */
|
|
20
|
+
export declare class PulumiProgramNotReadyError extends Error {
|
|
21
|
+
readonly member: string;
|
|
22
|
+
readonly dir: string;
|
|
23
|
+
constructor(member: string, dir: string, reason: string);
|
|
24
|
+
}
|
|
19
25
|
/** What preparing a copy did. */
|
|
20
26
|
export type ReleaseCopyPrepared = {
|
|
21
27
|
action: "not-a-copy";
|
|
@@ -26,15 +32,49 @@ export type ReleaseCopyPrepared = {
|
|
|
26
32
|
action: "installed";
|
|
27
33
|
command: string;
|
|
28
34
|
};
|
|
35
|
+
/** What preparing a program's directory did: a release copy or an in-place checkout. */
|
|
36
|
+
export type ProgramPrepared = {
|
|
37
|
+
place: "copy" | "checkout";
|
|
38
|
+
} & ({
|
|
39
|
+
action: "none";
|
|
40
|
+
reason: string;
|
|
41
|
+
} | {
|
|
42
|
+
action: "installed";
|
|
43
|
+
command: string;
|
|
44
|
+
});
|
|
29
45
|
/** Why the copy needs an install, or why not; throws when it cannot be prepared. */
|
|
30
46
|
export declare function releaseCopyNeeds(dir: string, member: string): {
|
|
31
47
|
install: boolean;
|
|
32
48
|
reason: string;
|
|
33
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Why a program's directory needs an install, or why not: a release copy
|
|
52
|
+
* (`copy`) or an in-place checkout (`checkout`). Throws when it cannot be
|
|
53
|
+
* prepared: a Node program with no lockfile beside its package.json.
|
|
54
|
+
*/
|
|
55
|
+
export declare function programNeeds(dir: string, member: string, place: "copy" | "checkout"): {
|
|
56
|
+
install: boolean;
|
|
57
|
+
reason: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Make a program's directory runnable before its first engine run, once per
|
|
61
|
+
* directory in this process: `install` there when {@link programNeeds} says
|
|
62
|
+
* so. A release copy follows the copy's rules, any other directory the
|
|
63
|
+
* checkout's. Throws for a directory that cannot be prepared, or an install
|
|
64
|
+
* that fails. The first caller's engine runs the install; a second engine
|
|
65
|
+
* asking for the same directory waits on it.
|
|
66
|
+
*/
|
|
67
|
+
export declare function prepareProgram(opts: {
|
|
68
|
+
dir: string;
|
|
69
|
+
member: string;
|
|
70
|
+
engine: PulumiMemberEngine;
|
|
71
|
+
run: PulumiRunner;
|
|
72
|
+
}): Promise<ProgramPrepared>;
|
|
34
73
|
/**
|
|
35
74
|
* Make a release copy runnable, once per directory in this process: `install`
|
|
36
75
|
* in the copy when {@link releaseCopyNeeds} says so. Throws for a copy that
|
|
37
|
-
* cannot be prepared, or an install that fails.
|
|
76
|
+
* cannot be prepared, or an install that fails. A directory that is not a
|
|
77
|
+
* copy is left alone; {@link prepareProgram} prepares both.
|
|
38
78
|
*/
|
|
39
79
|
export declare function prepareReleaseCopy(opts: {
|
|
40
80
|
dir: string;
|
|
@@ -42,6 +82,6 @@ export declare function prepareReleaseCopy(opts: {
|
|
|
42
82
|
engine: PulumiMemberEngine;
|
|
43
83
|
run: PulumiRunner;
|
|
44
84
|
}): Promise<ReleaseCopyPrepared>;
|
|
45
|
-
/** Forget every prepared
|
|
85
|
+
/** Forget every prepared directory. For tests. */
|
|
46
86
|
export declare function resetPreparedReleaseCopies(): void;
|
|
47
87
|
//# sourceMappingURL=release-copy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-copy.d.ts","sourceRoot":"","sources":["../src/release-copy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"release-copy.d.ts","sourceRoot":"","sources":["../src/release-copy.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAG/E,qIAAqI;AACrI,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D,4DAA4D;AAC5D,eAAO,MAAM,cAAc,UAAuG,CAAC;AAEnI,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAc9F;AAED,yDAAyD;AACzD,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,MAAM,EAAE,MAAM;IADhC,YACkB,MAAM,EAAE,MAAM,EAC9B,MAAM,EAAE,MAAM,EAIf;CACF;AAED,sFAAsF;AACtF,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,MAAM,EAAE,MAAM;aACd,GAAG,EAAE,MAAM;IAF7B,YACkB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAC3B,MAAM,EAAE,MAAM,EAIf;CACF;AAED,iCAAiC;AACjC,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,wFAAwF;AACxF,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAAG,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAa/I,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAElG;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmC1H;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuB7I;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAI3J;AAED,kDAAkD;AAClD,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
package/dist/release-copy.js
CHANGED
|
@@ -24,10 +24,28 @@
|
|
|
24
24
|
* - `go`, `dotnet`, `java`, `yaml`: never; their tools fetch what the
|
|
25
25
|
* program needs on the run.
|
|
26
26
|
*
|
|
27
|
-
*
|
|
27
|
+
* ## In-place checkouts (plywood#22)
|
|
28
|
+
*
|
|
29
|
+
* A CI job's checkout has the same gap: git cloned the tracked files, and
|
|
30
|
+
* nothing installed the program's dependencies before the step's first
|
|
31
|
+
* preview. {@link prepareProgram}, which `pulumi-up`'s plan and run call,
|
|
32
|
+
* prepares a release copy as above and an in-place directory by the same
|
|
33
|
+
* install and the same lockfile rule, with two differences for a directory
|
|
34
|
+
* that sits in a working tree:
|
|
35
|
+
*
|
|
36
|
+
* - `nodejs`: `node_modules` in the directory or any directory above it (a
|
|
37
|
+
* workspace's hoisted install), or a Yarn Plug'n'Play `.pnp.cjs` or
|
|
38
|
+
* `.pnp.js` there, counts as installed, since Node resolves the SDK
|
|
39
|
+
* from either.
|
|
40
|
+
* - The refusal for a Node program with no lockfile names the checkout, and
|
|
41
|
+
* says to commit a lockfile or install before the run.
|
|
42
|
+
*
|
|
43
|
+
* Preparation runs once per directory per process, whichever engine asks
|
|
44
|
+
* first, so two stacks of one project on different engines never install
|
|
45
|
+
* into the same directory at once.
|
|
28
46
|
*/
|
|
29
47
|
import { existsSync, readFileSync } from "node:fs";
|
|
30
|
-
import { join, sep } from "node:path";
|
|
48
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
31
49
|
import { parseYAML } from "@intentius/chant/yaml";
|
|
32
50
|
import { pulumiRunFailure, runReleaseInstall } from "./run.js";
|
|
33
51
|
import { isObject } from "./values.js";
|
|
@@ -68,17 +86,57 @@ export class PulumiReleaseCopyRefusedError extends Error {
|
|
|
68
86
|
this.name = "PulumiReleaseCopyRefusedError";
|
|
69
87
|
}
|
|
70
88
|
}
|
|
89
|
+
/** An in-place program that cannot be made runnable, with the reason (plywood#22). */
|
|
90
|
+
export class PulumiProgramNotReadyError extends Error {
|
|
91
|
+
constructor(member, dir, reason) {
|
|
92
|
+
super(`pulumi-up: "${member}": the program in ${dir} cannot run: ${reason}`);
|
|
93
|
+
this.member = member;
|
|
94
|
+
this.dir = dir;
|
|
95
|
+
this.name = "PulumiProgramNotReadyError";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Whether `dir` or a directory above it holds what Node resolves a package from: `node_modules`, or Yarn Plug'n'Play's loader. */
|
|
99
|
+
function nodeResolvesAbove(dir) {
|
|
100
|
+
let at = resolve(dir);
|
|
101
|
+
for (;;) {
|
|
102
|
+
for (const f of ["node_modules", ".pnp.cjs", ".pnp.js"])
|
|
103
|
+
if (existsSync(join(at, f)))
|
|
104
|
+
return join(at, f);
|
|
105
|
+
const up = dirname(at);
|
|
106
|
+
if (up === at)
|
|
107
|
+
return undefined;
|
|
108
|
+
at = up;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
71
111
|
/** Why the copy needs an install, or why not; throws when it cannot be prepared. */
|
|
72
112
|
export function releaseCopyNeeds(dir, member) {
|
|
113
|
+
return programNeeds(dir, member, "copy");
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Why a program's directory needs an install, or why not: a release copy
|
|
117
|
+
* (`copy`) or an in-place checkout (`checkout`). Throws when it cannot be
|
|
118
|
+
* prepared: a Node program with no lockfile beside its package.json.
|
|
119
|
+
*/
|
|
120
|
+
export function programNeeds(dir, member, place) {
|
|
73
121
|
const { name, options } = pulumiRuntime(dir);
|
|
74
122
|
switch (name) {
|
|
75
123
|
case "nodejs": {
|
|
76
|
-
if (
|
|
77
|
-
|
|
124
|
+
if (place === "copy") {
|
|
125
|
+
if (existsSync(join(dir, "node_modules")))
|
|
126
|
+
return { install: false, reason: "the copy has node_modules" };
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const found = nodeResolvesAbove(dir);
|
|
130
|
+
if (found)
|
|
131
|
+
return { install: false, reason: `Node resolves the program's packages from ${found}` };
|
|
132
|
+
}
|
|
78
133
|
if (!NODE_LOCKFILES.some((f) => existsSync(join(dir, f)))) {
|
|
134
|
+
if (place === "checkout") {
|
|
135
|
+
throw new PulumiProgramNotReadyError(member, dir, `the program is Node, nothing installed its dependencies (no node_modules here or above), and there is no lockfile (${NODE_LOCKFILES.join(", ")}) beside its package.json, so an install would take whatever versions resolve today; commit a lockfile, or install the dependencies before the run`);
|
|
136
|
+
}
|
|
79
137
|
throw new PulumiReleaseCopyRefusedError(member, `the program is Node, and the release recorded no lockfile (${NODE_LOCKFILES.join(", ")}) beside its package.json, so an install would take today's versions, not the release's; commit a lockfile and cut the release again`);
|
|
80
138
|
}
|
|
81
|
-
return { install: true, reason: "a Node program's copy has no node_modules" };
|
|
139
|
+
return { install: true, reason: place === "copy" ? "a Node program's copy has no node_modules" : "a Node program's checkout has no node_modules" };
|
|
82
140
|
}
|
|
83
141
|
case "python": {
|
|
84
142
|
const venv = typeof options.virtualenv === "string" ? options.virtualenv : undefined;
|
|
@@ -86,7 +144,7 @@ export function releaseCopyNeeds(dir, member) {
|
|
|
86
144
|
if (toolchain === "poetry" || toolchain === "uv")
|
|
87
145
|
return { install: true, reason: `a Python program on ${toolchain} installs its environment` };
|
|
88
146
|
if (venv && !existsSync(join(dir, venv)))
|
|
89
|
-
return { install: true, reason: `the virtualenv ${venv} is not in the
|
|
147
|
+
return { install: true, reason: `the virtualenv ${venv} is not in the ${place}` };
|
|
90
148
|
return { install: false, reason: "the Python program names no virtualenv to build" };
|
|
91
149
|
}
|
|
92
150
|
default:
|
|
@@ -95,37 +153,53 @@ export function releaseCopyNeeds(dir, member) {
|
|
|
95
153
|
}
|
|
96
154
|
const prepared = new Map();
|
|
97
155
|
/**
|
|
98
|
-
* Make a
|
|
99
|
-
* in
|
|
100
|
-
*
|
|
156
|
+
* Make a program's directory runnable before its first engine run, once per
|
|
157
|
+
* directory in this process: `install` there when {@link programNeeds} says
|
|
158
|
+
* so. A release copy follows the copy's rules, any other directory the
|
|
159
|
+
* checkout's. Throws for a directory that cannot be prepared, or an install
|
|
160
|
+
* that fails. The first caller's engine runs the install; a second engine
|
|
161
|
+
* asking for the same directory waits on it.
|
|
101
162
|
*/
|
|
102
|
-
export function
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
let done = prepared.get(key);
|
|
163
|
+
export function prepareProgram(opts) {
|
|
164
|
+
const dir = resolve(opts.dir);
|
|
165
|
+
const place = isReleaseCopy(dir) ? "copy" : "checkout";
|
|
166
|
+
let done = prepared.get(dir);
|
|
107
167
|
if (!done) {
|
|
108
168
|
done = (async () => {
|
|
109
|
-
const needs =
|
|
169
|
+
const needs = programNeeds(dir, opts.member, place);
|
|
110
170
|
if (!needs.install)
|
|
111
|
-
return { action: "none", reason: needs.reason };
|
|
171
|
+
return { place, action: "none", reason: needs.reason };
|
|
112
172
|
const command = `${opts.engine} install`;
|
|
113
173
|
try {
|
|
114
|
-
await runReleaseInstall(opts.run, ["install"],
|
|
174
|
+
await runReleaseInstall(opts.run, ["install"], dir);
|
|
115
175
|
}
|
|
116
176
|
catch (err) {
|
|
117
177
|
const f = pulumiRunFailure(err);
|
|
118
178
|
const why = f.missingBinary ? `the ${opts.engine} binary was not found on PATH` : (f.stderr?.trim() || f.message).split("\n").slice(-3).join("\n");
|
|
119
|
-
|
|
179
|
+
if (place === "copy")
|
|
180
|
+
throw new PulumiReleaseCopyRefusedError(opts.member, `${command} in the copy failed: ${why}`);
|
|
181
|
+
throw new PulumiProgramNotReadyError(opts.member, dir, `${command} failed: ${why}`);
|
|
120
182
|
}
|
|
121
|
-
return { action: "installed", command };
|
|
183
|
+
return { place, action: "installed", command };
|
|
122
184
|
})();
|
|
123
|
-
prepared.set(
|
|
124
|
-
done.catch(() => prepared.delete(
|
|
185
|
+
prepared.set(dir, done);
|
|
186
|
+
done.catch(() => prepared.delete(dir));
|
|
125
187
|
}
|
|
126
188
|
return done;
|
|
127
189
|
}
|
|
128
|
-
/**
|
|
190
|
+
/**
|
|
191
|
+
* Make a release copy runnable, once per directory in this process: `install`
|
|
192
|
+
* in the copy when {@link releaseCopyNeeds} says so. Throws for a copy that
|
|
193
|
+
* cannot be prepared, or an install that fails. A directory that is not a
|
|
194
|
+
* copy is left alone; {@link prepareProgram} prepares both.
|
|
195
|
+
*/
|
|
196
|
+
export async function prepareReleaseCopy(opts) {
|
|
197
|
+
if (!isReleaseCopy(opts.dir))
|
|
198
|
+
return { action: "not-a-copy" };
|
|
199
|
+
const done = await prepareProgram(opts);
|
|
200
|
+
return done.action === "none" ? { action: "none", reason: done.reason } : { action: "installed", command: done.command };
|
|
201
|
+
}
|
|
202
|
+
/** Forget every prepared directory. For tests. */
|
|
129
203
|
export function resetPreparedReleaseCopies() {
|
|
130
204
|
prepared.clear();
|
|
131
205
|
}
|
package/dist/run.d.ts
CHANGED
|
@@ -71,10 +71,13 @@ export declare function engineRunnerAt(bin: string): PulumiRunner;
|
|
|
71
71
|
* that is not empty and does not start with `-`; `[…]` is optional; `…`
|
|
72
72
|
* repeats.
|
|
73
73
|
*
|
|
74
|
-
* `up` is refused with `--skip-preview`, `--
|
|
75
|
-
* `--replace`, `--
|
|
76
|
-
* `--
|
|
77
|
-
*
|
|
74
|
+
* `up` is refused with `--skip-preview`, `--show-secrets`, `--replace`,
|
|
75
|
+
* `--target-replace`, `--exclude`, `--remote`, `--continue-on-error`,
|
|
76
|
+
* `--config` and any flag not here, since none of them is in the list.
|
|
77
|
+
* `--refresh` and `--target-dependents` (#4627) come in the tail's order,
|
|
78
|
+
* `--target-dependents` only after a `--target`. plunge's `up --plan`
|
|
79
|
+
* applies a saved plan whose preview did the refresh, so it takes no
|
|
80
|
+
* `--refresh`.
|
|
78
81
|
*/
|
|
79
82
|
export declare const PULUMI_APPLY_COMMANDS: readonly string[];
|
|
80
83
|
/** A CrossGuard pack the preview and `up` run (ruling 7: in the preview job, feeding chant's gate). */
|
|
@@ -89,6 +92,10 @@ export interface PulumiApplyTail {
|
|
|
89
92
|
/** A scratch copy of the stack's config file, passed as `--config-file` (#4541): never `--config`, which writes the working tree's file. */
|
|
90
93
|
configFile?: string;
|
|
91
94
|
targets?: readonly string[];
|
|
95
|
+
/** `--refresh` (#4627): refresh the stack's state before the preview or `pulumi up`. */
|
|
96
|
+
refresh?: boolean;
|
|
97
|
+
/** `--target-dependents` (#4627): with `targets`, their dependents too. */
|
|
98
|
+
targetDependents?: boolean;
|
|
92
99
|
policyPacks?: readonly PulumiPolicyPack[];
|
|
93
100
|
}
|
|
94
101
|
/**
|
|
@@ -247,17 +254,29 @@ export declare function runReviewStackPlunge(run: PulumiRunner, args: string[],
|
|
|
247
254
|
stdout: string;
|
|
248
255
|
}>;
|
|
249
256
|
/**
|
|
250
|
-
* The install chant runs in a
|
|
257
|
+
* The install chant runs in a program's directory before its first engine
|
|
258
|
+
* run, a release's recorded copy (#4542) or a job's checkout (plywood#22),
|
|
251
259
|
* for `./release-copy.ts` alone: exactly `pulumi install` or `plunge
|
|
252
|
-
* install`, no flag.
|
|
253
|
-
*
|
|
254
|
-
* runtime options and the recorded lockfile.
|
|
260
|
+
* install`, no flag. Neither has `node_modules` or a virtualenv; the CLI's
|
|
261
|
+
* install follows `Pulumi.yaml`'s runtime options and the lockfile.
|
|
255
262
|
*/
|
|
256
263
|
export declare const PULUMI_INSTALL_COMMANDS: readonly string[];
|
|
257
264
|
/** Run `install` with no flag in a release copy, refusing any other argv. The runner picks the binary. */
|
|
258
265
|
export declare function runReleaseInstall(run: PulumiRunner, args: string[], cwd: string, env?: Record<string, string>): Promise<{
|
|
259
266
|
stdout: string;
|
|
260
267
|
}>;
|
|
268
|
+
/**
|
|
269
|
+
* The two argv the check stage runs for a member (#4633, `./check-step.ts`):
|
|
270
|
+
* `install` with no flag, and `about --json`, optionally with `--stack
|
|
271
|
+
* <stack>`. Under `pulumi` or `plunge`; the runner picks the binary.
|
|
272
|
+
*/
|
|
273
|
+
export declare const PULUMI_CHECK_COMMANDS: readonly string[];
|
|
274
|
+
/** Whether `args` is one of {@link PULUMI_CHECK_COMMANDS}' argv. */
|
|
275
|
+
export declare function allowedCheck(args: readonly string[]): boolean;
|
|
276
|
+
/** Run a check-stage argv, refusing any other. The runner picks the binary. */
|
|
277
|
+
export declare function runCheckPulumi(run: PulumiRunner, args: string[], cwd: string, env?: Record<string, string>): Promise<{
|
|
278
|
+
stdout: string;
|
|
279
|
+
}>;
|
|
261
280
|
export { pulumiMemberEngine, readPlywoodEngine, type PulumiMemberEngine, type PulumiMemberEngineSource, type PulumiMemberEngineOptions } from "./member-engine.js";
|
|
262
281
|
/** The argv chant runs for a member's applied outputs, after `pulumi` (#4455). Secrets stay blinded. */
|
|
263
282
|
export declare function pulumiStackOutputArgs(opts?: {
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|