@prisma/composer 0.25.0-dev.2 → 0.25.0-dev.4

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/{app-config-joXc-BKm-CdcXqNMD.mjs → app-config-CGJHcFb--CIEFCG4V.mjs} +3 -3
  2. package/dist/{app-config-joXc-BKm-CdcXqNMD.mjs.map → app-config-CGJHcFb--CIEFCG4V.mjs.map} +1 -1
  3. package/dist/{app-config-jGcCcxK4-DnzGGbDS.d.mts → app-config-Cay7dFv5-CMlgGodQ.d.mts} +3 -3
  4. package/dist/{app-config-jGcCcxK4-DnzGGbDS.d.mts.map → app-config-Cay7dFv5-CMlgGodQ.d.mts.map} +1 -1
  5. package/dist/config-CE3fmcF9.d.mts +1 -0
  6. package/dist/config-CdxvLFzg.mjs.map +1 -1
  7. package/dist/config.d.mts +2 -2
  8. package/dist/config.mjs +1 -1
  9. package/dist/control.d.mts +35 -15
  10. package/dist/control.d.mts.map +1 -1
  11. package/dist/control.mjs +10 -10
  12. package/dist/control.mjs.map +1 -1
  13. package/dist/deploy-CE3fmcF9.d.mts +1 -0
  14. package/dist/deploy.d.mts +2 -2
  15. package/dist/deploy.mjs +1 -1
  16. package/dist/deploy.mjs.map +1 -1
  17. package/dist/deployment-summary-BtvC7Z73-BJr-5tXY.mjs +168 -0
  18. package/dist/deployment-summary-BtvC7Z73-BJr-5tXY.mjs.map +1 -0
  19. package/dist/deployment-summary-CU-eVvJM-Cu9hKMdz.d.mts +26 -0
  20. package/dist/deployment-summary-CU-eVvJM-Cu9hKMdz.d.mts.map +1 -0
  21. package/dist/{execute-deploy-destroy-CvKCwVkD-Di3Ooeip.mjs → execute-deploy-destroy-CF6DR7sA-pf8yhNfp.mjs} +41 -28
  22. package/dist/execute-deploy-destroy-CF6DR7sA-pf8yhNfp.mjs.map +1 -0
  23. package/dist/{execute-dev-BLCK5wF7-CJvkj5wl.mjs → execute-dev-DAIUT0es-B3iBKmAS.mjs} +179 -130
  24. package/dist/execute-dev-DAIUT0es-B3iBKmAS.mjs.map +1 -0
  25. package/dist/{execute-log-B_zCJ17b-CE954g1a.mjs → execute-log-PLs9-Qn3-BvONZ358.mjs} +7 -10
  26. package/dist/execute-log-PLs9-Qn3-BvONZ358.mjs.map +1 -0
  27. package/dist/{local-target-DnA2E8IN.mjs → local-target-B4xoiDAV.mjs} +2 -2
  28. package/dist/{local-target-DnA2E8IN.mjs.map → local-target-B4xoiDAV.mjs.map} +1 -1
  29. package/dist/local-target.d.mts +1 -1
  30. package/dist/local-target.mjs +2 -2
  31. package/dist/nextjs-control.d.mts +4 -4
  32. package/dist/nextjs-control.mjs +2 -2
  33. package/dist/nextjs-control.mjs.map +1 -1
  34. package/dist/node-control.d.mts +4 -4
  35. package/dist/node-control.mjs +2 -2
  36. package/dist/node-control.mjs.map +1 -1
  37. package/dist/{pipeline-C7gNjMzJ-CzM8DNS_.mjs → pipeline-DAYhea3J-B6PQu2QB.mjs} +231 -262
  38. package/dist/pipeline-DAYhea3J-B6PQu2QB.mjs.map +1 -0
  39. package/dist/report.d.mts +4 -3
  40. package/dist/report.d.mts.map +1 -1
  41. package/dist/report.mjs +2 -2
  42. package/dist/report.mjs.map +1 -1
  43. package/dist/result-B1SzJJoE.mjs +122 -0
  44. package/dist/result-B1SzJJoE.mjs.map +1 -0
  45. package/package.json +10 -11
  46. package/skills/prisma-composer-core-concepts/SKILL.md +56 -20
  47. package/dist/config-BGtKERz-.d.mts +0 -1
  48. package/dist/deploy-BGtKERz-.d.mts +0 -1
  49. package/dist/deployment-summary-DswOl_9E-B9MhYYDt.mjs +0 -70
  50. package/dist/deployment-summary-DswOl_9E-B9MhYYDt.mjs.map +0 -1
  51. package/dist/execute-deploy-destroy-CvKCwVkD-Di3Ooeip.mjs.map +0 -1
  52. package/dist/execute-dev-BLCK5wF7-CJvkj5wl.mjs.map +0 -1
  53. package/dist/execute-log-B_zCJ17b-CE954g1a.mjs.map +0 -1
  54. package/dist/pipeline-C7gNjMzJ-CzM8DNS_.mjs.map +0 -1
  55. package/dist/result-CQIOBgdW.mjs +0 -247
  56. package/dist/result-CQIOBgdW.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import { t as CliStructuredError } from "./errors-0e8IVwzi.mjs";
2
2
  import { t as containerEnv } from "./container-transport-HcvNOGZL-twPi2TIv.mjs";
3
- import { t as DEV_DIR } from "./app-config-joXc-BKm-CdcXqNMD.mjs";
4
- import { n as ok, s as toStructured, t as notOk } from "./result-CQIOBgdW.mjs";
5
- import { n as resolveLocalTargets } from "./local-target-DnA2E8IN.mjs";
3
+ import { t as DEV_DIR } from "./app-config-CGJHcFb--CIEFCG4V.mjs";
4
+ import { n as ok, o as toStructured, t as notOk } from "./result-B1SzJJoE.mjs";
5
+ import { n as resolveLocalTargets } from "./local-target-B4xoiDAV.mjs";
6
6
  import { n as spawnAlchemy, t as alchemyInvocation } from "./run-alchemy-pANK8XNX-CgCpXLkG.mjs";
7
- import { n as runPipeline } from "./pipeline-C7gNjMzJ-CzM8DNS_.mjs";
7
+ import { n as runPipeline, r as noComposerExportMessage } from "./pipeline-DAYhea3J-B6PQu2QB.mjs";
8
8
  import { t as withEmulatorRetry } from "./emulator-retry-DGonap4g-S8BNrXFD.mjs";
9
9
  import * as fs$1 from "node:fs";
10
10
  import * as path$1 from "node:path";
@@ -15,7 +15,89 @@ import { Readable } from "node:stream";
15
15
  import { lstat, readdir, realpath, stat as stat$1 } from "node:fs/promises";
16
16
  import { type } from "os";
17
17
  import { EventEmitter } from "events";
18
+ import { createHash } from "node:crypto";
18
19
  import { lstat as lstat$1, open, readdir as readdir$1, realpath as realpath$1, stat as stat$2 } from "fs/promises";
20
+ //#region ../../0-framework/3-tooling/cli/dist/generate-dev-stack-CPpjJdTG.mjs
21
+ /**
22
+ * Local-dev spec § 6 `generate-dev-stack.ts`: like generate-stack.ts but at
23
+ * `.prisma-composer/dev/alchemy.run.ts`, always Alchemy stage `dev`, using
24
+ * Alchemy's own `localState()` and no `report` — dev prints its own front
25
+ * door (run-dev.ts), so core's presentation-free lower() gets nothing to
26
+ * call back into. The generated module IS the one orchestration point where
27
+ * dev provenance is resolved (spec § 3 REVISED): it deserializes the
28
+ * containers, top-level-awaits `resolveLocalTargets(config)` (the lazy
29
+ * `localTarget` thunks, ADR-0041), and passes
30
+ * `providers: localTargetProviders(...)` + `state: localState()` explicitly
31
+ * — `lower()` learns nothing about dev.
32
+ */
33
+ const DEV_GENERATED_DIR = ".prisma-composer/dev";
34
+ const DEV_GENERATED_FILE = "alchemy.run.ts";
35
+ /** A relative import specifier from `.prisma-composer/dev/alchemy.run.ts` to `target` (posix separators). */
36
+ function relativeImportSpecifier(generatedDir, target) {
37
+ const rel = path$1.relative(generatedDir, target).split(path$1.sep).join("/");
38
+ return rel.startsWith(".") ? rel : `./${rel}`;
39
+ }
40
+ function quote(value) {
41
+ return JSON.stringify(value);
42
+ }
43
+ function renderBundle(bundle) {
44
+ return `{ dir: ${quote(bundle.dir)}, entry: ${quote(bundle.entry)} }`;
45
+ }
46
+ function renderOptions(input) {
47
+ const lines = [];
48
+ lines.push(` name: ${quote(input.name)},`);
49
+ lines.push(" bundles: {");
50
+ for (const [id, bundle] of Object.entries(input.assembled.bundles)) lines.push(` ${quote(id)}: ${renderBundle(bundle)},`);
51
+ lines.push(" },");
52
+ lines.push(" providers: localTargetProviders(resolved, containers, devDir),");
53
+ lines.push(" state: localState(),");
54
+ return lines.join("\n");
55
+ }
56
+ /** Renders the dev stack module's source (tests assert on it without touching disk). */
57
+ function renderDevStackFile(input) {
58
+ const generatedDir = path$1.join(input.cwd, DEV_GENERATED_DIR);
59
+ const appImport = relativeImportSpecifier(generatedDir, input.entryPath);
60
+ const imports = [
61
+ "import * as path from 'node:path';",
62
+ "import { deserializeContainers } from '@prisma/composer/config';",
63
+ "import { lower } from '@prisma/composer/deploy';",
64
+ "import { DEV_DIR, localTargetProviders, resolveLocalTargets } from '@prisma/composer/local-target';",
65
+ "import { localState } from 'alchemy/State/LocalState';",
66
+ `import prismaConfig from ${quote(relativeImportSpecifier(generatedDir, input.configFile))};`,
67
+ `import app from ${quote(appImport)};`
68
+ ].join("\n");
69
+ return `// Generated by \`prisma-composer dev\` — overwritten on every run; do not
70
+ // edit by hand. Independently runnable from ${quote(input.cwd)}:
71
+ //
72
+ // alchemy deploy ${DEV_GENERATED_DIR}/${DEV_GENERATED_FILE} --stage dev
73
+ //
74
+ // bisects a CLI bug from an Alchemy bug (deploy-cli.md § Implementation decisions).
75
+ ${imports}
76
+
77
+ const config = prismaConfig.composer;
78
+ if (config === undefined) {
79
+ throw new Error(${quote(noComposerExportMessage(input.configFile))});
80
+ }
81
+
82
+ const containers = deserializeContainers(config.extensions, process.env);
83
+ const resolved = await resolveLocalTargets(config);
84
+ const devDir = path.join(process.cwd(), DEV_DIR);
85
+
86
+ export default lower(app, config, {
87
+ ${renderOptions(input)}
88
+ });
89
+ `;
90
+ }
91
+ /** Writes the dev stack file, returning its absolute path. */
92
+ function writeDevStackFile(input) {
93
+ const generatedDir = path$1.join(input.cwd, DEV_GENERATED_DIR);
94
+ fs$1.mkdirSync(generatedDir, { recursive: true });
95
+ const filePath = path$1.join(generatedDir, DEV_GENERATED_FILE);
96
+ fs$1.writeFileSync(filePath, renderDevStackFile(input));
97
+ return filePath;
98
+ }
99
+ const DEV_STACK_RELATIVE_PATH = path$1.join(DEV_GENERATED_DIR, DEV_GENERATED_FILE);
100
+ //#endregion
19
101
  //#region ../../0-framework/3-tooling/cli/node_modules/readdirp/esm/index.js
20
102
  const EntryTypes = {
21
103
  FILE_TYPE: "files",
@@ -1564,79 +1646,7 @@ var esm_default = {
1564
1646
  FSWatcher
1565
1647
  };
1566
1648
  //#endregion
1567
- //#region ../../0-framework/3-tooling/cli/dist/execute-dev-BLCK5wF7.mjs
1568
- /**
1569
- * Local-dev spec § 6 `generate-dev-stack.ts`: like generate-stack.ts but at
1570
- * `.prisma-composer/dev/alchemy.run.ts`, always Alchemy stage `dev`, using
1571
- * Alchemy's own `localState()` and no `report` — dev prints its own front
1572
- * door (run-dev.ts), so core's presentation-free lower() gets nothing to
1573
- * call back into. The generated module IS the one orchestration point where
1574
- * dev provenance is resolved (spec § 3 REVISED): it deserializes the
1575
- * containers, top-level-awaits `resolveLocalTargets(config)` (the lazy
1576
- * `localTarget` thunks, ADR-0041), and passes
1577
- * `providers: localTargetProviders(...)` + `state: localState()` explicitly
1578
- * — `lower()` learns nothing about dev.
1579
- */
1580
- const DEV_GENERATED_DIR = ".prisma-composer/dev";
1581
- const DEV_GENERATED_FILE = "alchemy.run.ts";
1582
- /** A relative import specifier from `.prisma-composer/dev/alchemy.run.ts` to `target` (posix separators). */
1583
- function relativeImportSpecifier(generatedDir, target) {
1584
- const rel = path$1.relative(generatedDir, target).split(path$1.sep).join("/");
1585
- return rel.startsWith(".") ? rel : `./${rel}`;
1586
- }
1587
- function quote(value) {
1588
- return JSON.stringify(value);
1589
- }
1590
- function renderBundle(bundle) {
1591
- return `{ dir: ${quote(bundle.dir)}, entry: ${quote(bundle.entry)} }`;
1592
- }
1593
- function renderOptions(input) {
1594
- const lines = [];
1595
- lines.push(` name: ${quote(input.name)},`);
1596
- lines.push(" bundles: {");
1597
- for (const [id, bundle] of Object.entries(input.assembled.bundles)) lines.push(` ${quote(id)}: ${renderBundle(bundle)},`);
1598
- lines.push(" },");
1599
- lines.push(" providers: localTargetProviders(resolved, containers, devDir),");
1600
- lines.push(" state: localState(),");
1601
- return lines.join("\n");
1602
- }
1603
- /** Renders the dev stack module's source (tests assert on it without touching disk). */
1604
- function renderDevStackFile(input) {
1605
- const generatedDir = path$1.join(input.cwd, DEV_GENERATED_DIR);
1606
- const appImport = relativeImportSpecifier(generatedDir, input.entryPath);
1607
- const configImport = relativeImportSpecifier(generatedDir, input.configPath);
1608
- return `// Generated by \`prisma-composer dev\` — overwritten on every run; do not
1609
- // edit by hand. Independently runnable from ${quote(input.cwd)}:
1610
- //
1611
- // alchemy deploy ${DEV_GENERATED_DIR}/${DEV_GENERATED_FILE} --stage dev
1612
- //
1613
- // bisects a CLI bug from an Alchemy bug (deploy-cli.md § Implementation decisions).
1614
- import * as path from 'node:path';
1615
- import { deserializeContainers } from '@prisma/composer/config';
1616
- import { lower } from '@prisma/composer/deploy';
1617
- import { DEV_DIR, localTargetProviders, resolveLocalTargets } from '@prisma/composer/local-target';
1618
- import { localState } from 'alchemy/State/LocalState';
1619
- import config from ${quote(configImport)};
1620
- import app from ${quote(appImport)};
1621
-
1622
- const containers = deserializeContainers(config.extensions, process.env);
1623
- const resolved = await resolveLocalTargets(config);
1624
- const devDir = path.join(process.cwd(), DEV_DIR);
1625
-
1626
- export default lower(app, config, {
1627
- ${renderOptions(input)}
1628
- });
1629
- `;
1630
- }
1631
- /** Writes the dev stack file, returning its absolute path. */
1632
- function writeDevStackFile(input) {
1633
- const generatedDir = path$1.join(input.cwd, DEV_GENERATED_DIR);
1634
- fs$1.mkdirSync(generatedDir, { recursive: true });
1635
- const filePath = path$1.join(generatedDir, DEV_GENERATED_FILE);
1636
- fs$1.writeFileSync(filePath, renderDevStackFile(input));
1637
- return filePath;
1638
- }
1639
- const DEV_STACK_RELATIVE_PATH = path$1.join(DEV_GENERATED_DIR, DEV_GENERATED_FILE);
1649
+ //#region ../../0-framework/3-tooling/cli/dist/execute-dev-DAIUT0es.mjs
1640
1650
  /**
1641
1651
  * Local-dev spec § 6 `watch.ts`: watches each assembled bundle's declared
1642
1652
  * `watch` paths (a directory watched recursively, a file watched through
@@ -1761,6 +1771,14 @@ async function mergedEndpoints(attachments) {
1761
1771
  return (await Promise.all(attachments.map((a) => withEmulatorRetry(() => a.endpoints())))).flat();
1762
1772
  }
1763
1773
  /** Runs the full dev pipeline; resolves to a running session or a structured failure. */
1774
+ /** The file's content hash; undefined when it cannot be read, which counts as a change. */
1775
+ function contentHash(file) {
1776
+ try {
1777
+ return createHash("sha256").update(fs$1.readFileSync(file)).digest("hex");
1778
+ } catch {
1779
+ return;
1780
+ }
1781
+ }
1764
1782
  async function executeDev(input, deps, cwd) {
1765
1783
  if (process.platform === "win32") return notOk(new CliStructuredError("DEV.PLATFORM_UNSUPPORTED", "local dev is not supported on Windows yet."));
1766
1784
  const { onEvent } = input;
@@ -1769,13 +1787,10 @@ async function executeDev(input, deps, cwd) {
1769
1787
  let resolved;
1770
1788
  const containers = /* @__PURE__ */ new Map();
1771
1789
  try {
1772
- const pipelineDeps = {
1773
- runAssembler: deps.runAssembler,
1774
- config: deps.config,
1775
- configPath: deps.configPath
1776
- };
1777
- pipeline = await runPipeline(input.entry, input.name, cwd, pipelineDeps);
1778
- const { config, graph, name } = pipeline;
1790
+ const pipelineDeps = { runAssembler: deps.runAssembler };
1791
+ pipeline = await runPipeline(input.entry, input.name, cwd, input.config, pipelineDeps);
1792
+ const { graph, name } = pipeline;
1793
+ const config = pipeline.configSource.value;
1779
1794
  resolved = await resolveLocalTargets(config);
1780
1795
  for (const [id, dev] of resolved) try {
1781
1796
  containers.set(id, await dev.container.ensure({
@@ -1831,7 +1846,7 @@ async function executeDev(input, deps, cwd) {
1831
1846
  stackPath = writeDevStackFile({
1832
1847
  entryPath: pipeline.entryModule.path,
1833
1848
  cwd,
1834
- configPath: pipeline.configPath,
1849
+ configFile: pipeline.configSource.file,
1835
1850
  name: pipeline.name,
1836
1851
  assembled: pipeline.assembled
1837
1852
  });
@@ -1890,6 +1905,7 @@ async function executeDev(input, deps, cwd) {
1890
1905
  const attachments = [];
1891
1906
  const started = [];
1892
1907
  let watch;
1908
+ let configWatch;
1893
1909
  try {
1894
1910
  for (const [id, dev] of resolved) try {
1895
1911
  attachments.push(await dev.attach({
@@ -1922,55 +1938,86 @@ async function executeDev(input, deps, cwd) {
1922
1938
  kind: "unwatchable",
1923
1939
  address
1924
1940
  });
1925
- const watchDeps = {
1926
- runAssembler: deps.runAssembler,
1927
- config: deps.config,
1928
- configPath: deps.configPath
1941
+ const watchDeps = { runAssembler: deps.runAssembler };
1942
+ const watchFiles = deps.watch ?? startWatch;
1943
+ const onWatchError = (error) => emit({
1944
+ kind: "watch-error",
1945
+ message: failureMessage(error)
1946
+ });
1947
+ const configFile = pipeline.configSource.file;
1948
+ const startedConfig = contentHash(configFile);
1949
+ let configChanged = false;
1950
+ const pausedForConfig = () => {
1951
+ if (!configChanged && contentHash(configFile) === startedConfig) return false;
1952
+ configChanged = true;
1953
+ emit({
1954
+ kind: "config-changed",
1955
+ file: configFile
1956
+ });
1957
+ return true;
1929
1958
  };
1930
- watch = startWatch(targets, () => {
1931
- (async () => {
1932
- try {
1933
- const rePipeline = await runPipeline(input.entry, input.name, cwd, watchDeps);
1934
- const stackPath = writeDevStackFile({
1935
- entryPath: rePipeline.entryModule.path,
1936
- cwd,
1937
- configPath: rePipeline.configPath,
1938
- name: rePipeline.name,
1939
- assembled: rePipeline.assembled
1940
- });
1941
- const outcome = await (deps.alchemy ?? spawnAlchemy)(alchemyInvocation({
1942
- command: "deploy",
1943
- stackFileRelativePath: DEV_STACK_RELATIVE_PATH,
1944
- cwd,
1945
- stage: "dev",
1946
- containerEnv: containerEnv(containers)
1947
- }));
1948
- if (outcome.signal !== null || outcome.exitCode !== 0) {
1949
- emit({
1950
- kind: "converge-failed",
1951
- stackFilePath: stackPath,
1952
- reproduceCommand,
1953
- cwd
1954
- });
1955
- return;
1956
- }
1957
- emit({
1958
- kind: "ready",
1959
- endpoints: await mergedEndpoints(attachments)
1960
- });
1961
- } catch (error) {
1959
+ configWatch = watchFiles([{
1960
+ address: configFile,
1961
+ paths: [configFile]
1962
+ }], () => void pausedForConfig(), onWatchError);
1963
+ const rebuild = async () => {
1964
+ try {
1965
+ const rePipeline = await runPipeline(input.entry, input.name, cwd, input.config, watchDeps);
1966
+ const stackPath = writeDevStackFile({
1967
+ entryPath: rePipeline.entryModule.path,
1968
+ cwd,
1969
+ configFile: rePipeline.configSource.file,
1970
+ name: rePipeline.name,
1971
+ assembled: rePipeline.assembled
1972
+ });
1973
+ const outcome = await (deps.alchemy ?? spawnAlchemy)(alchemyInvocation({
1974
+ command: "deploy",
1975
+ stackFileRelativePath: DEV_STACK_RELATIVE_PATH,
1976
+ cwd,
1977
+ stage: "dev",
1978
+ containerEnv: containerEnv(containers)
1979
+ }));
1980
+ if (outcome.signal !== null || outcome.exitCode !== 0) {
1962
1981
  emit({
1963
- kind: "rebuild-failed",
1964
- message: failureMessage(error)
1982
+ kind: "converge-failed",
1983
+ stackFilePath: stackPath,
1984
+ reproduceCommand,
1985
+ cwd
1965
1986
  });
1987
+ return;
1966
1988
  }
1967
- })();
1968
- }, (error) => emit({
1969
- kind: "watch-error",
1970
- message: failureMessage(error)
1971
- }));
1989
+ emit({
1990
+ kind: "ready",
1991
+ endpoints: await mergedEndpoints(attachments)
1992
+ });
1993
+ } catch (error) {
1994
+ emit({
1995
+ kind: "rebuild-failed",
1996
+ message: failureMessage(error)
1997
+ });
1998
+ }
1999
+ };
2000
+ let rebuilding = false;
2001
+ let changedDuringRebuild = false;
2002
+ const rebuildUntilSettled = async () => {
2003
+ rebuilding = true;
2004
+ do {
2005
+ changedDuringRebuild = false;
2006
+ await rebuild();
2007
+ } while (changedDuringRebuild && !pausedForConfig());
2008
+ rebuilding = false;
2009
+ };
2010
+ watch = watchFiles(targets, () => {
2011
+ if (pausedForConfig()) return;
2012
+ if (rebuilding) {
2013
+ changedDuringRebuild = true;
2014
+ return;
2015
+ }
2016
+ rebuildUntilSettled();
2017
+ }, onWatchError);
1972
2018
  const startedWatch = watch;
1973
- await watch.ready;
2019
+ const startedConfigWatch = configWatch;
2020
+ await Promise.all([watch.ready, configWatch.ready]);
1974
2021
  let stopping = false;
1975
2022
  let resolveClosed = () => void 0;
1976
2023
  const closed = new Promise((resolve) => {
@@ -1981,6 +2028,7 @@ async function executeDev(input, deps, cwd) {
1981
2028
  stopping = true;
1982
2029
  emit({ kind: "stopping" });
1983
2030
  startedWatch.stop();
2031
+ startedConfigWatch.stop();
1984
2032
  (async () => {
1985
2033
  for (const attachment of attachments) try {
1986
2034
  await attachment.stopServices();
@@ -2003,6 +2051,7 @@ async function executeDev(input, deps, cwd) {
2003
2051
  });
2004
2052
  } catch (error) {
2005
2053
  watch?.stop();
2054
+ configWatch?.stop();
2006
2055
  await Promise.all(started.map((a) => a.stopServices().catch(() => void 0)));
2007
2056
  if (CliStructuredError.is(error)) return notOk(error);
2008
2057
  throw error;
@@ -2011,4 +2060,4 @@ async function executeDev(input, deps, cwd) {
2011
2060
  //#endregion
2012
2061
  export { executeDev };
2013
2062
 
2014
- //# sourceMappingURL=execute-dev-BLCK5wF7-CJvkj5wl.mjs.map
2063
+ //# sourceMappingURL=execute-dev-DAIUT0es-B3iBKmAS.mjs.map