@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.
Files changed (56) hide show
  1. package/dist/composer-config-CY9fET8H-KpGjlYgO.mjs +432 -0
  2. package/dist/composer-config-CY9fET8H-KpGjlYgO.mjs.map +1 -0
  3. package/dist/{pipeline-C7gNjMzJ-CMqZQxqM.mjs → container-transport-HcvNOGZL-CHqecFc7.mjs} +109 -322
  4. package/dist/container-transport-HcvNOGZL-CHqecFc7.mjs.map +1 -0
  5. package/dist/{execute-deploy-destroy-CvKCwVkD-B3vcxYJF.mjs → execute-deploy-destroy-c0eko3AO-9npuGXd3.mjs} +108 -85
  6. package/dist/execute-deploy-destroy-c0eko3AO-9npuGXd3.mjs.map +1 -0
  7. package/dist/{execute-dev-BLCK5wF7-CuzMSK7T.mjs → execute-dev-BICPaq1g-CSoZJuhB.mjs} +162 -132
  8. package/dist/execute-dev-BICPaq1g-CSoZJuhB.mjs.map +1 -0
  9. package/dist/{family-B1RaH4f8-ChoTnv3A.d.mts → family-CgeZQdNg-gH8LuqqL.d.mts} +136 -172
  10. package/dist/family-CgeZQdNg-gH8LuqqL.d.mts.map +1 -0
  11. package/dist/family.d.mts +4 -39
  12. package/dist/family.d.mts.map +1 -1
  13. package/dist/family.mjs +49 -551
  14. package/dist/family.mjs.map +1 -1
  15. package/dist/generate-dev-stack-BUadNY_w-DF_lHVaP.mjs +87 -0
  16. package/dist/generate-dev-stack-BUadNY_w-DF_lHVaP.mjs.map +1 -0
  17. package/dist/run-alchemy-BEvB2sYQ-BgV2deuO.mjs +154 -0
  18. package/dist/run-alchemy-BEvB2sYQ-BgV2deuO.mjs.map +1 -0
  19. package/dist/testing.d.mts +24 -24
  20. package/dist/testing.d.mts.map +1 -1
  21. package/dist/testing.mjs +17 -45
  22. package/dist/testing.mjs.map +1 -1
  23. package/package.json +7 -11
  24. package/src/exports/testing.ts +5 -3
  25. package/dist/bin.mjs +0 -1040
  26. package/dist/bin.mjs.map +0 -1
  27. package/dist/container-transport-HcvNOGZL-CIoZc7Rs.mjs +0 -34
  28. package/dist/container-transport-HcvNOGZL-CIoZc7Rs.mjs.map +0 -1
  29. package/dist/execute-deploy-destroy-CvKCwVkD-B3vcxYJF.mjs.map +0 -1
  30. package/dist/execute-deploy-destroy-CvKCwVkD-DCufHnkW.mjs +0 -528
  31. package/dist/execute-deploy-destroy-CvKCwVkD-DCufHnkW.mjs.map +0 -1
  32. package/dist/execute-dev-BLCK5wF7-B-fG_E31.mjs +0 -2011
  33. package/dist/execute-dev-BLCK5wF7-B-fG_E31.mjs.map +0 -1
  34. package/dist/execute-dev-BLCK5wF7-CuzMSK7T.mjs.map +0 -1
  35. package/dist/execute-log-B_zCJ17b-BrLUt7vo.mjs +0 -157
  36. package/dist/execute-log-B_zCJ17b-BrLUt7vo.mjs.map +0 -1
  37. package/dist/execute-log-B_zCJ17b-C4a0uxJj.mjs +0 -158
  38. package/dist/execute-log-B_zCJ17b-C4a0uxJj.mjs.map +0 -1
  39. package/dist/family-B1RaH4f8-ChoTnv3A.d.mts.map +0 -1
  40. package/dist/local-target-BOGjATc2.mjs +0 -68
  41. package/dist/local-target-BOGjATc2.mjs.map +0 -1
  42. package/dist/local-target-hoEGqgVA.mjs +0 -68
  43. package/dist/local-target-hoEGqgVA.mjs.map +0 -1
  44. package/dist/pipeline-C7gNjMzJ-CMqZQxqM.mjs.map +0 -1
  45. package/dist/pipeline-C7gNjMzJ-CixaMvnR.mjs +0 -1205
  46. package/dist/pipeline-C7gNjMzJ-CixaMvnR.mjs.map +0 -1
  47. package/dist/result-B874OKwb.mjs +0 -383
  48. package/dist/result-B874OKwb.mjs.map +0 -1
  49. package/dist/result-sR7PBi61.mjs +0 -229
  50. package/dist/result-sR7PBi61.mjs.map +0 -1
  51. package/dist/run-alchemy-pANK8XNX-BH1wC0r6.mjs +0 -99
  52. package/dist/run-alchemy-pANK8XNX-BH1wC0r6.mjs.map +0 -1
  53. package/dist/run-alchemy-pANK8XNX-XcCQncKN.mjs +0 -99
  54. package/dist/run-alchemy-pANK8XNX-XcCQncKN.mjs.map +0 -1
  55. package/dist/shared-BTnATsqm-BH4axbJg.mjs +0 -158
  56. package/dist/shared-BTnATsqm-BH4axbJg.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
- import { i as CliStructuredError, n as ok, t as notOk } from "./result-sR7PBi61.mjs";
2
- import { i as toStructured } from "./shared-BTnATsqm-BH4axbJg.mjs";
3
- import { n as alchemyInvocation, r as spawnAlchemy } from "./run-alchemy-pANK8XNX-XcCQncKN.mjs";
4
- import { n as runPipeline } from "./pipeline-C7gNjMzJ-CixaMvnR.mjs";
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-BLCK5wF7.mjs
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
- runAssembler: deps.runAssembler,
1772
- config: deps.config,
1773
- configPath: deps.configPath
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
- configPath: pipeline.configPath,
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
- runAssembler: deps.runAssembler,
1925
- config: deps.config,
1926
- configPath: deps.configPath
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
- watch = startWatch(targets, () => {
1929
- (async () => {
1930
- try {
1931
- const rePipeline = await runPipeline(input.entry, input.name, cwd, watchDeps);
1932
- const stackPath = writeDevStackFile({
1933
- entryPath: rePipeline.entryModule.path,
1934
- cwd,
1935
- configPath: rePipeline.configPath,
1936
- name: rePipeline.name,
1937
- assembled: rePipeline.assembled
1938
- });
1939
- const outcome = await (deps.alchemy ?? spawnAlchemy)(alchemyInvocation({
1940
- command: "deploy",
1941
- stackFileRelativePath: DEV_STACK_RELATIVE_PATH,
1942
- cwd,
1943
- stage: "dev",
1944
- containerEnv: containerEnv(containers)
1945
- }));
1946
- if (outcome.signal !== null || outcome.exitCode !== 0) {
1947
- emit({
1948
- kind: "converge-failed",
1949
- stackFilePath: stackPath,
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: "rebuild-failed",
1962
- message: failureMessage(error)
1961
+ kind: "converge-failed",
1962
+ stackFilePath: stackPath,
1963
+ reproduceCommand,
1964
+ cwd
1963
1965
  });
1966
+ return;
1964
1967
  }
1965
- })();
1966
- }, (error) => emit({
1967
- kind: "watch-error",
1968
- message: failureMessage(error)
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
- await watch.ready;
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-BLCK5wF7-CuzMSK7T.mjs.map
2042
+ //# sourceMappingURL=execute-dev-BICPaq1g-CSoZJuhB.mjs.map