@prisma/composer-cli 0.25.0 → 0.26.0-dev.1
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/dist/composer-config-CY9fET8H-KpGjlYgO.mjs +432 -0
- package/dist/composer-config-CY9fET8H-KpGjlYgO.mjs.map +1 -0
- package/dist/{pipeline-C7gNjMzJ-CMqZQxqM.mjs → container-transport-HcvNOGZL-CHqecFc7.mjs} +109 -322
- package/dist/container-transport-HcvNOGZL-CHqecFc7.mjs.map +1 -0
- package/dist/{execute-deploy-destroy-CvKCwVkD-B3vcxYJF.mjs → execute-deploy-destroy-c0eko3AO-9npuGXd3.mjs} +108 -85
- package/dist/execute-deploy-destroy-c0eko3AO-9npuGXd3.mjs.map +1 -0
- package/dist/{execute-dev-BLCK5wF7-CuzMSK7T.mjs → execute-dev-BICPaq1g-CSoZJuhB.mjs} +162 -132
- package/dist/execute-dev-BICPaq1g-CSoZJuhB.mjs.map +1 -0
- package/dist/{family-B1RaH4f8-ChoTnv3A.d.mts → family-CgeZQdNg-gH8LuqqL.d.mts} +136 -172
- package/dist/family-CgeZQdNg-gH8LuqqL.d.mts.map +1 -0
- package/dist/family.d.mts +4 -39
- package/dist/family.d.mts.map +1 -1
- package/dist/family.mjs +49 -551
- package/dist/family.mjs.map +1 -1
- package/dist/generate-dev-stack-BUadNY_w-DF_lHVaP.mjs +87 -0
- package/dist/generate-dev-stack-BUadNY_w-DF_lHVaP.mjs.map +1 -0
- package/dist/run-alchemy-BEvB2sYQ-BgV2deuO.mjs +154 -0
- package/dist/run-alchemy-BEvB2sYQ-BgV2deuO.mjs.map +1 -0
- package/dist/testing.d.mts +24 -24
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +17 -45
- package/dist/testing.mjs.map +1 -1
- package/package.json +7 -11
- package/src/exports/testing.ts +5 -3
- package/dist/bin.mjs +0 -1040
- package/dist/bin.mjs.map +0 -1
- package/dist/container-transport-HcvNOGZL-CIoZc7Rs.mjs +0 -34
- package/dist/container-transport-HcvNOGZL-CIoZc7Rs.mjs.map +0 -1
- package/dist/execute-deploy-destroy-CvKCwVkD-B3vcxYJF.mjs.map +0 -1
- package/dist/execute-deploy-destroy-CvKCwVkD-DCufHnkW.mjs +0 -528
- package/dist/execute-deploy-destroy-CvKCwVkD-DCufHnkW.mjs.map +0 -1
- package/dist/execute-dev-BLCK5wF7-B-fG_E31.mjs +0 -2011
- package/dist/execute-dev-BLCK5wF7-B-fG_E31.mjs.map +0 -1
- package/dist/execute-dev-BLCK5wF7-CuzMSK7T.mjs.map +0 -1
- package/dist/execute-log-B_zCJ17b-BrLUt7vo.mjs +0 -157
- package/dist/execute-log-B_zCJ17b-BrLUt7vo.mjs.map +0 -1
- package/dist/execute-log-B_zCJ17b-C4a0uxJj.mjs +0 -158
- package/dist/execute-log-B_zCJ17b-C4a0uxJj.mjs.map +0 -1
- package/dist/family-B1RaH4f8-ChoTnv3A.d.mts.map +0 -1
- package/dist/local-target-BOGjATc2.mjs +0 -68
- package/dist/local-target-BOGjATc2.mjs.map +0 -1
- package/dist/local-target-hoEGqgVA.mjs +0 -68
- package/dist/local-target-hoEGqgVA.mjs.map +0 -1
- package/dist/pipeline-C7gNjMzJ-CMqZQxqM.mjs.map +0 -1
- package/dist/pipeline-C7gNjMzJ-CixaMvnR.mjs +0 -1205
- package/dist/pipeline-C7gNjMzJ-CixaMvnR.mjs.map +0 -1
- package/dist/result-B874OKwb.mjs +0 -383
- package/dist/result-B874OKwb.mjs.map +0 -1
- package/dist/result-sR7PBi61.mjs +0 -229
- package/dist/result-sR7PBi61.mjs.map +0 -1
- package/dist/run-alchemy-pANK8XNX-BH1wC0r6.mjs +0 -99
- package/dist/run-alchemy-pANK8XNX-BH1wC0r6.mjs.map +0 -1
- package/dist/run-alchemy-pANK8XNX-XcCQncKN.mjs +0 -99
- package/dist/run-alchemy-pANK8XNX-XcCQncKN.mjs.map +0 -1
- package/dist/shared-BTnATsqm-BH4axbJg.mjs +0 -158
- package/dist/shared-BTnATsqm-BH4axbJg.mjs.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as containerEnv } from "./container-transport-HcvNOGZL-CIoZc7Rs.mjs";
|
|
6
|
-
import { n as withEmulatorRetry, r as DEV_DIR, t as resolveLocalTargets } from "./local-target-BOGjATc2.mjs";
|
|
1
|
+
import { a as CliStructuredError, o as notOk, s as ok } from "./composer-config-CY9fET8H-KpGjlYgO.mjs";
|
|
2
|
+
import { n as alchemyInvocation, r as spawnAlchemy, s as toStructured } from "./run-alchemy-BEvB2sYQ-BgV2deuO.mjs";
|
|
3
|
+
import { r as writeDevStackFile, t as DEV_STACK_RELATIVE_PATH } from "./generate-dev-stack-BUadNY_w-DF_lHVaP.mjs";
|
|
4
|
+
import { r as runPipeline, t as containerEnv } from "./container-transport-HcvNOGZL-CHqecFc7.mjs";
|
|
7
5
|
import * as fs from "node:fs";
|
|
8
6
|
import * as path from "node:path";
|
|
9
7
|
import { join, relative, resolve, sep } from "node:path";
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import "effect/Layer";
|
|
10
10
|
import { stat, unwatchFile, watch, watchFile } from "fs";
|
|
11
11
|
import { lstat, open, readdir, realpath, stat as stat$1 } from "fs/promises";
|
|
12
12
|
import { EventEmitter } from "events";
|
|
@@ -14,6 +14,69 @@ import * as sysPath from "path";
|
|
|
14
14
|
import { lstat as lstat$1, readdir as readdir$1, realpath as realpath$1, stat as stat$2 } from "node:fs/promises";
|
|
15
15
|
import { Readable } from "node:stream";
|
|
16
16
|
import { type } from "os";
|
|
17
|
+
//#region ../../0-framework/1-core/core/dist/app-config-CGJHcFb-.mjs
|
|
18
|
+
/** `<cwd>/.prisma-composer/dev` — the dev instance's app-scoped state directory (ADR-0041, ADR-0004's tool-state rule). "dev" names the user-facing feature/dir (naming, operator 2026-07-23) — this constant's name and value are unchanged by the localTarget rename. */
|
|
19
|
+
const DEV_DIR = ".prisma-composer/dev";
|
|
20
|
+
/**
|
|
21
|
+
* True when an extension only participates in assembly (every `nodes` entry
|
|
22
|
+
* is `kind: 'build'`, and it declares none of `providers`/`application`/
|
|
23
|
+
* `provisions`/`container`) — it owns no resources or services, so it has
|
|
24
|
+
* nothing to emulate and is exempt from local-target-capability requirements
|
|
25
|
+
* (ADR-0041). Shared by `localTargetProviders` and every local-target hook
|
|
26
|
+
* iteration.
|
|
27
|
+
*/
|
|
28
|
+
function isBuildOnlyExtension(extension) {
|
|
29
|
+
return Object.values(extension.nodes).every((node) => node.kind === "build") && extension.providers === void 0 && extension.application === void 0 && extension.provisions === void 0 && extension.container === void 0;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region ../../0-framework/3-tooling/cli/dist/emulator-retry-DGonap4g.mjs
|
|
33
|
+
/**
|
|
34
|
+
* An emulator admin call right after a converge that just PUT dozens of
|
|
35
|
+
* resources through the same daemon can hit a transient refused/reset
|
|
36
|
+
* connection — a brief loopback hiccup under load, not a real failure.
|
|
37
|
+
* Retried before giving up. Shared by the dev and log executors, which talk
|
|
38
|
+
* to the same daemons (`startServices`, `endpoints`, `attach`).
|
|
39
|
+
*/
|
|
40
|
+
const EMULATOR_RETRY_ATTEMPTS = 5;
|
|
41
|
+
const EMULATOR_RETRY_DELAY_MS = 500;
|
|
42
|
+
async function withEmulatorRetry(call) {
|
|
43
|
+
let lastError;
|
|
44
|
+
for (let attempt = 1; attempt <= EMULATOR_RETRY_ATTEMPTS; attempt += 1) try {
|
|
45
|
+
return await call();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
lastError = error;
|
|
48
|
+
if (attempt < EMULATOR_RETRY_ATTEMPTS) await new Promise((resolve) => setTimeout(resolve, EMULATOR_RETRY_DELAY_MS));
|
|
49
|
+
}
|
|
50
|
+
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region ../../0-framework/1-core/core/dist/local-target.mjs
|
|
54
|
+
/** The local-target stack's own provider aggregation (ADR-0041; naming, operator 2026-07-23 — the seam is `localTarget`, "dev" names the user-facing feature only) — the local-target counterpart of `deploy.ts`'s `mergedProviders`, kept in its own module so `lower()` learns nothing about it (deploy.ts's REVISED — operator review of #162). */
|
|
55
|
+
function noLocalTargetSupportError(id) {
|
|
56
|
+
return new CliStructuredError("DEV.TARGET_UNSUPPORTED", `extension "${id}" has no dev support — it declares no \`localTarget\` descriptor (ADR-0041).`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolves every non-build-only configured extension's lazy `localTarget`
|
|
60
|
+
* thunk, once (ADR-0041's lazy local-target reference — operator directive:
|
|
61
|
+
* the production control entry carries only the thunk, never the
|
|
62
|
+
* descriptor, so resolving it is this module's job, not something a deploy
|
|
63
|
+
* path ever does). A build-only extension (`isBuildOnlyExtension`) owns no
|
|
64
|
+
* resources or services and is skipped entirely — never even checked for a
|
|
65
|
+
* `localTarget` thunk. Every other configured extension must be
|
|
66
|
+
* local-target-capable, or the dev command cannot bring the app up at all,
|
|
67
|
+
* so a missing thunk throws naming the extension. The generated dev stack
|
|
68
|
+
* module calls this once and threads the resolved map through every
|
|
69
|
+
* subsequent hook, including `localTargetProviders`.
|
|
70
|
+
*/
|
|
71
|
+
async function resolveLocalTargets(config) {
|
|
72
|
+
const entries = await Promise.all(config.extensions.flatMap((extension) => {
|
|
73
|
+
if (isBuildOnlyExtension(extension)) return [];
|
|
74
|
+
if (extension.localTarget === void 0) throw noLocalTargetSupportError(extension.id);
|
|
75
|
+
return [extension.localTarget().then((descriptor) => [extension.id, descriptor])];
|
|
76
|
+
}));
|
|
77
|
+
return new Map(entries);
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
17
80
|
//#region ../../0-framework/3-tooling/cli/node_modules/readdirp/esm/index.js
|
|
18
81
|
const EntryTypes = {
|
|
19
82
|
FILE_TYPE: "files",
|
|
@@ -1562,79 +1625,7 @@ var esm_default = {
|
|
|
1562
1625
|
FSWatcher
|
|
1563
1626
|
};
|
|
1564
1627
|
//#endregion
|
|
1565
|
-
//#region ../../0-framework/3-tooling/cli/dist/execute-dev-
|
|
1566
|
-
/**
|
|
1567
|
-
* Local-dev spec § 6 `generate-dev-stack.ts`: like generate-stack.ts but at
|
|
1568
|
-
* `.prisma-composer/dev/alchemy.run.ts`, always Alchemy stage `dev`, using
|
|
1569
|
-
* Alchemy's own `localState()` and no `report` — dev prints its own front
|
|
1570
|
-
* door (run-dev.ts), so core's presentation-free lower() gets nothing to
|
|
1571
|
-
* call back into. The generated module IS the one orchestration point where
|
|
1572
|
-
* dev provenance is resolved (spec § 3 REVISED): it deserializes the
|
|
1573
|
-
* containers, top-level-awaits `resolveLocalTargets(config)` (the lazy
|
|
1574
|
-
* `localTarget` thunks, ADR-0041), and passes
|
|
1575
|
-
* `providers: localTargetProviders(...)` + `state: localState()` explicitly
|
|
1576
|
-
* — `lower()` learns nothing about dev.
|
|
1577
|
-
*/
|
|
1578
|
-
const DEV_GENERATED_DIR = ".prisma-composer/dev";
|
|
1579
|
-
const DEV_GENERATED_FILE = "alchemy.run.ts";
|
|
1580
|
-
/** A relative import specifier from `.prisma-composer/dev/alchemy.run.ts` to `target` (posix separators). */
|
|
1581
|
-
function relativeImportSpecifier(generatedDir, target) {
|
|
1582
|
-
const rel = path.relative(generatedDir, target).split(path.sep).join("/");
|
|
1583
|
-
return rel.startsWith(".") ? rel : `./${rel}`;
|
|
1584
|
-
}
|
|
1585
|
-
function quote(value) {
|
|
1586
|
-
return JSON.stringify(value);
|
|
1587
|
-
}
|
|
1588
|
-
function renderBundle(bundle) {
|
|
1589
|
-
return `{ dir: ${quote(bundle.dir)}, entry: ${quote(bundle.entry)} }`;
|
|
1590
|
-
}
|
|
1591
|
-
function renderOptions(input) {
|
|
1592
|
-
const lines = [];
|
|
1593
|
-
lines.push(` name: ${quote(input.name)},`);
|
|
1594
|
-
lines.push(" bundles: {");
|
|
1595
|
-
for (const [id, bundle] of Object.entries(input.assembled.bundles)) lines.push(` ${quote(id)}: ${renderBundle(bundle)},`);
|
|
1596
|
-
lines.push(" },");
|
|
1597
|
-
lines.push(" providers: localTargetProviders(resolved, containers, devDir),");
|
|
1598
|
-
lines.push(" state: localState(),");
|
|
1599
|
-
return lines.join("\n");
|
|
1600
|
-
}
|
|
1601
|
-
/** Renders the dev stack module's source (tests assert on it without touching disk). */
|
|
1602
|
-
function renderDevStackFile(input) {
|
|
1603
|
-
const generatedDir = path.join(input.cwd, DEV_GENERATED_DIR);
|
|
1604
|
-
const appImport = relativeImportSpecifier(generatedDir, input.entryPath);
|
|
1605
|
-
const configImport = relativeImportSpecifier(generatedDir, input.configPath);
|
|
1606
|
-
return `// Generated by \`prisma-composer dev\` — overwritten on every run; do not
|
|
1607
|
-
// edit by hand. Independently runnable from ${quote(input.cwd)}:
|
|
1608
|
-
//
|
|
1609
|
-
// alchemy deploy ${DEV_GENERATED_DIR}/${DEV_GENERATED_FILE} --stage dev
|
|
1610
|
-
//
|
|
1611
|
-
// bisects a CLI bug from an Alchemy bug (deploy-cli.md § Implementation decisions).
|
|
1612
|
-
import * as path from 'node:path';
|
|
1613
|
-
import { deserializeContainers } from '@prisma/composer/config';
|
|
1614
|
-
import { lower } from '@prisma/composer/deploy';
|
|
1615
|
-
import { DEV_DIR, localTargetProviders, resolveLocalTargets } from '@prisma/composer/local-target';
|
|
1616
|
-
import { localState } from 'alchemy/State/LocalState';
|
|
1617
|
-
import config from ${quote(configImport)};
|
|
1618
|
-
import app from ${quote(appImport)};
|
|
1619
|
-
|
|
1620
|
-
const containers = deserializeContainers(config.extensions, process.env);
|
|
1621
|
-
const resolved = await resolveLocalTargets(config);
|
|
1622
|
-
const devDir = path.join(process.cwd(), DEV_DIR);
|
|
1623
|
-
|
|
1624
|
-
export default lower(app, config, {
|
|
1625
|
-
${renderOptions(input)}
|
|
1626
|
-
});
|
|
1627
|
-
`;
|
|
1628
|
-
}
|
|
1629
|
-
/** Writes the dev stack file, returning its absolute path. */
|
|
1630
|
-
function writeDevStackFile(input) {
|
|
1631
|
-
const generatedDir = path.join(input.cwd, DEV_GENERATED_DIR);
|
|
1632
|
-
fs.mkdirSync(generatedDir, { recursive: true });
|
|
1633
|
-
const filePath = path.join(generatedDir, DEV_GENERATED_FILE);
|
|
1634
|
-
fs.writeFileSync(filePath, renderDevStackFile(input));
|
|
1635
|
-
return filePath;
|
|
1636
|
-
}
|
|
1637
|
-
const DEV_STACK_RELATIVE_PATH = path.join(DEV_GENERATED_DIR, DEV_GENERATED_FILE);
|
|
1628
|
+
//#region ../../0-framework/3-tooling/cli/dist/execute-dev-BICPaq1g.mjs
|
|
1638
1629
|
/**
|
|
1639
1630
|
* Local-dev spec § 6 `watch.ts`: watches each assembled bundle's declared
|
|
1640
1631
|
* `watch` paths (a directory watched recursively, a file watched through
|
|
@@ -1759,6 +1750,14 @@ async function mergedEndpoints(attachments) {
|
|
|
1759
1750
|
return (await Promise.all(attachments.map((a) => withEmulatorRetry(() => a.endpoints())))).flat();
|
|
1760
1751
|
}
|
|
1761
1752
|
/** Runs the full dev pipeline; resolves to a running session or a structured failure. */
|
|
1753
|
+
/** The file's content hash; undefined when it cannot be read, which counts as a change. */
|
|
1754
|
+
function contentHash(file) {
|
|
1755
|
+
try {
|
|
1756
|
+
return createHash("sha256").update(fs.readFileSync(file)).digest("hex");
|
|
1757
|
+
} catch {
|
|
1758
|
+
return;
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1762
1761
|
async function executeDev(input, deps, cwd) {
|
|
1763
1762
|
if (process.platform === "win32") return notOk(new CliStructuredError("DEV.PLATFORM_UNSUPPORTED", "local dev is not supported on Windows yet."));
|
|
1764
1763
|
const { onEvent } = input;
|
|
@@ -1767,13 +1766,10 @@ async function executeDev(input, deps, cwd) {
|
|
|
1767
1766
|
let resolved;
|
|
1768
1767
|
const containers = /* @__PURE__ */ new Map();
|
|
1769
1768
|
try {
|
|
1770
|
-
const pipelineDeps = {
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
};
|
|
1775
|
-
pipeline = await runPipeline(input.entry, input.name, cwd, pipelineDeps);
|
|
1776
|
-
const { config, graph, name } = pipeline;
|
|
1769
|
+
const pipelineDeps = { runAssembler: deps.runAssembler };
|
|
1770
|
+
pipeline = await runPipeline(input.entry, input.name, cwd, input.config, pipelineDeps);
|
|
1771
|
+
const { graph, name } = pipeline;
|
|
1772
|
+
const config = pipeline.configSource.value;
|
|
1777
1773
|
resolved = await resolveLocalTargets(config);
|
|
1778
1774
|
for (const [id, dev] of resolved) try {
|
|
1779
1775
|
containers.set(id, await dev.container.ensure({
|
|
@@ -1829,7 +1825,7 @@ async function executeDev(input, deps, cwd) {
|
|
|
1829
1825
|
stackPath = writeDevStackFile({
|
|
1830
1826
|
entryPath: pipeline.entryModule.path,
|
|
1831
1827
|
cwd,
|
|
1832
|
-
|
|
1828
|
+
configFile: pipeline.configSource.file,
|
|
1833
1829
|
name: pipeline.name,
|
|
1834
1830
|
assembled: pipeline.assembled
|
|
1835
1831
|
});
|
|
@@ -1888,6 +1884,7 @@ async function executeDev(input, deps, cwd) {
|
|
|
1888
1884
|
const attachments = [];
|
|
1889
1885
|
const started = [];
|
|
1890
1886
|
let watch;
|
|
1887
|
+
let configWatch;
|
|
1891
1888
|
try {
|
|
1892
1889
|
for (const [id, dev] of resolved) try {
|
|
1893
1890
|
attachments.push(await dev.attach({
|
|
@@ -1920,55 +1917,86 @@ async function executeDev(input, deps, cwd) {
|
|
|
1920
1917
|
kind: "unwatchable",
|
|
1921
1918
|
address
|
|
1922
1919
|
});
|
|
1923
|
-
const watchDeps = {
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1920
|
+
const watchDeps = { runAssembler: deps.runAssembler };
|
|
1921
|
+
const watchFiles = deps.watch ?? startWatch;
|
|
1922
|
+
const onWatchError = (error) => emit({
|
|
1923
|
+
kind: "watch-error",
|
|
1924
|
+
message: failureMessage(error)
|
|
1925
|
+
});
|
|
1926
|
+
const configFile = pipeline.configSource.file;
|
|
1927
|
+
const startedConfig = contentHash(configFile);
|
|
1928
|
+
let configChanged = false;
|
|
1929
|
+
const pausedForConfig = () => {
|
|
1930
|
+
if (!configChanged && contentHash(configFile) === startedConfig) return false;
|
|
1931
|
+
configChanged = true;
|
|
1932
|
+
emit({
|
|
1933
|
+
kind: "config-changed",
|
|
1934
|
+
file: configFile
|
|
1935
|
+
});
|
|
1936
|
+
return true;
|
|
1927
1937
|
};
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
reproduceCommand,
|
|
1951
|
-
cwd
|
|
1952
|
-
});
|
|
1953
|
-
return;
|
|
1954
|
-
}
|
|
1955
|
-
emit({
|
|
1956
|
-
kind: "ready",
|
|
1957
|
-
endpoints: await mergedEndpoints(attachments)
|
|
1958
|
-
});
|
|
1959
|
-
} catch (error) {
|
|
1938
|
+
configWatch = watchFiles([{
|
|
1939
|
+
address: configFile,
|
|
1940
|
+
paths: [configFile]
|
|
1941
|
+
}], () => void pausedForConfig(), onWatchError);
|
|
1942
|
+
const rebuild = async () => {
|
|
1943
|
+
try {
|
|
1944
|
+
const rePipeline = await runPipeline(input.entry, input.name, cwd, input.config, watchDeps);
|
|
1945
|
+
const stackPath = writeDevStackFile({
|
|
1946
|
+
entryPath: rePipeline.entryModule.path,
|
|
1947
|
+
cwd,
|
|
1948
|
+
configFile: rePipeline.configSource.file,
|
|
1949
|
+
name: rePipeline.name,
|
|
1950
|
+
assembled: rePipeline.assembled
|
|
1951
|
+
});
|
|
1952
|
+
const outcome = await (deps.alchemy ?? spawnAlchemy)(alchemyInvocation({
|
|
1953
|
+
command: "deploy",
|
|
1954
|
+
stackFileRelativePath: DEV_STACK_RELATIVE_PATH,
|
|
1955
|
+
cwd,
|
|
1956
|
+
stage: "dev",
|
|
1957
|
+
containerEnv: containerEnv(containers)
|
|
1958
|
+
}));
|
|
1959
|
+
if (outcome.signal !== null || outcome.exitCode !== 0) {
|
|
1960
1960
|
emit({
|
|
1961
|
-
kind: "
|
|
1962
|
-
|
|
1961
|
+
kind: "converge-failed",
|
|
1962
|
+
stackFilePath: stackPath,
|
|
1963
|
+
reproduceCommand,
|
|
1964
|
+
cwd
|
|
1963
1965
|
});
|
|
1966
|
+
return;
|
|
1964
1967
|
}
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1968
|
+
emit({
|
|
1969
|
+
kind: "ready",
|
|
1970
|
+
endpoints: await mergedEndpoints(attachments)
|
|
1971
|
+
});
|
|
1972
|
+
} catch (error) {
|
|
1973
|
+
emit({
|
|
1974
|
+
kind: "rebuild-failed",
|
|
1975
|
+
message: failureMessage(error)
|
|
1976
|
+
});
|
|
1977
|
+
}
|
|
1978
|
+
};
|
|
1979
|
+
let rebuilding = false;
|
|
1980
|
+
let changedDuringRebuild = false;
|
|
1981
|
+
const rebuildUntilSettled = async () => {
|
|
1982
|
+
rebuilding = true;
|
|
1983
|
+
do {
|
|
1984
|
+
changedDuringRebuild = false;
|
|
1985
|
+
await rebuild();
|
|
1986
|
+
} while (changedDuringRebuild && !pausedForConfig());
|
|
1987
|
+
rebuilding = false;
|
|
1988
|
+
};
|
|
1989
|
+
watch = watchFiles(targets, () => {
|
|
1990
|
+
if (pausedForConfig()) return;
|
|
1991
|
+
if (rebuilding) {
|
|
1992
|
+
changedDuringRebuild = true;
|
|
1993
|
+
return;
|
|
1994
|
+
}
|
|
1995
|
+
rebuildUntilSettled();
|
|
1996
|
+
}, onWatchError);
|
|
1970
1997
|
const startedWatch = watch;
|
|
1971
|
-
|
|
1998
|
+
const startedConfigWatch = configWatch;
|
|
1999
|
+
await Promise.all([watch.ready, configWatch.ready]);
|
|
1972
2000
|
let stopping = false;
|
|
1973
2001
|
let resolveClosed = () => void 0;
|
|
1974
2002
|
const closed = new Promise((resolve) => {
|
|
@@ -1979,6 +2007,7 @@ async function executeDev(input, deps, cwd) {
|
|
|
1979
2007
|
stopping = true;
|
|
1980
2008
|
emit({ kind: "stopping" });
|
|
1981
2009
|
startedWatch.stop();
|
|
2010
|
+
startedConfigWatch.stop();
|
|
1982
2011
|
(async () => {
|
|
1983
2012
|
for (const attachment of attachments) try {
|
|
1984
2013
|
await attachment.stopServices();
|
|
@@ -2001,6 +2030,7 @@ async function executeDev(input, deps, cwd) {
|
|
|
2001
2030
|
});
|
|
2002
2031
|
} catch (error) {
|
|
2003
2032
|
watch?.stop();
|
|
2033
|
+
configWatch?.stop();
|
|
2004
2034
|
await Promise.all(started.map((a) => a.stopServices().catch(() => void 0)));
|
|
2005
2035
|
if (CliStructuredError.is(error)) return notOk(error);
|
|
2006
2036
|
throw error;
|
|
@@ -2009,4 +2039,4 @@ async function executeDev(input, deps, cwd) {
|
|
|
2009
2039
|
//#endregion
|
|
2010
2040
|
export { executeDev };
|
|
2011
2041
|
|
|
2012
|
-
//# sourceMappingURL=execute-dev-
|
|
2042
|
+
//# sourceMappingURL=execute-dev-BICPaq1g-CSoZJuhB.mjs.map
|