@powerhousedao/ph-cli 6.2.3-dev.5 → 6.2.3-dev.50

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 (78) hide show
  1. package/dist/{auth-AR3VxAIk.mjs → auth-BFUq7CvE.mjs} +3 -3
  2. package/dist/{auth-AR3VxAIk.mjs.map → auth-BFUq7CvE.mjs.map} +1 -1
  3. package/dist/auth-CNhbN5UM.mjs +4 -0
  4. package/dist/build-Di0SwHGs.mjs +166 -0
  5. package/dist/build-Di0SwHGs.mjs.map +1 -0
  6. package/dist/build-Dk9HoX9_.mjs +4 -0
  7. package/dist/{cli-connect-override-D3hh4aH_.mjs → cli-connect-override-b4kKqgOZ.mjs} +62 -27
  8. package/dist/cli-connect-override-b4kKqgOZ.mjs.map +1 -0
  9. package/dist/cli.d.mts +2 -1
  10. package/dist/cli.mjs +304 -89
  11. package/dist/cli.mjs.map +1 -1
  12. package/dist/connect-build-CJhbzYPL.mjs +218 -0
  13. package/dist/connect-build-CJhbzYPL.mjs.map +1 -0
  14. package/dist/{connect-config-BWGiW3IB.mjs → connect-config-DGfPEeP8.mjs} +19 -12
  15. package/dist/connect-config-DGfPEeP8.mjs.map +1 -0
  16. package/dist/{connect-preview-D7ypzFDc.mjs → connect-preview-CzDqR-JN.mjs} +12 -8
  17. package/dist/{connect-preview-D7ypzFDc.mjs.map → connect-preview-CzDqR-JN.mjs.map} +1 -1
  18. package/dist/{connect-studio-D6rfWCNB.mjs → connect-studio-_-O1-oef.mjs} +15 -10
  19. package/dist/{connect-studio-D6rfWCNB.mjs.map → connect-studio-_-O1-oef.mjs.map} +1 -1
  20. package/dist/connect-studio-f3K1qPWd.mjs +4 -0
  21. package/dist/{generate-all-DrT4ZxHX.mjs → generate-all-CIwP-3aa.mjs} +3 -3
  22. package/dist/{generate-all-DrT4ZxHX.mjs.map → generate-all-CIwP-3aa.mjs.map} +1 -1
  23. package/dist/{generate-app-DNNqA-H3.mjs → generate-app-BTs1u-9l.mjs} +7 -5
  24. package/dist/{generate-app-DNNqA-H3.mjs.map → generate-app-BTs1u-9l.mjs.map} +1 -1
  25. package/dist/{generate-document-model-BJXyODfm.mjs → generate-document-model-DhDQ_06X.mjs} +17 -7
  26. package/dist/{generate-document-model-BJXyODfm.mjs.map → generate-document-model-DhDQ_06X.mjs.map} +1 -1
  27. package/dist/{generate-editor-BejvaVVT.mjs → generate-editor-CW7Do69u.mjs} +7 -5
  28. package/dist/{generate-editor-BejvaVVT.mjs.map → generate-editor-CW7Do69u.mjs.map} +1 -1
  29. package/dist/generate-piece-QTt-ddt2.mjs +65 -0
  30. package/dist/generate-piece-QTt-ddt2.mjs.map +1 -0
  31. package/dist/generate-piece-action-DbxrzfKY.mjs +29 -0
  32. package/dist/generate-piece-action-DbxrzfKY.mjs.map +1 -0
  33. package/dist/generate-piece-trigger-CqVOcL9g.mjs +30 -0
  34. package/dist/generate-piece-trigger-CqVOcL9g.mjs.map +1 -0
  35. package/dist/{generate-processor-_WOx-mMe.mjs → generate-processor-DBtTkgo5.mjs} +15 -8
  36. package/dist/generate-processor-DBtTkgo5.mjs.map +1 -0
  37. package/dist/{generate-subgraph-BsHUstpl.mjs → generate-subgraph-Dm27O59o.mjs} +10 -6
  38. package/dist/generate-subgraph-Dm27O59o.mjs.map +1 -0
  39. package/dist/{init-BZP6gvYd.mjs → init-CIEMyAug.mjs} +4 -4
  40. package/dist/{init-BZP6gvYd.mjs.map → init-CIEMyAug.mjs.map} +1 -1
  41. package/dist/{inspect-DXjbQEV_.mjs → inspect-BpCB0TPo.mjs} +11 -4
  42. package/dist/inspect-BpCB0TPo.mjs.map +1 -0
  43. package/dist/install-added-dependencies-DVSbzler.mjs +33 -0
  44. package/dist/install-added-dependencies-DVSbzler.mjs.map +1 -0
  45. package/dist/{migrate-jGKfE02L.mjs → migrate-DK4HK7Dn.mjs} +4 -4
  46. package/dist/{migrate-jGKfE02L.mjs.map → migrate-DK4HK7Dn.mjs.map} +1 -1
  47. package/dist/{registry-auth-DxEWCJu2.mjs → registry-auth-Bm5AR-fB.mjs} +4 -4
  48. package/dist/{registry-auth-DxEWCJu2.mjs.map → registry-auth-Bm5AR-fB.mjs.map} +1 -1
  49. package/dist/scripts/generate-commands-docs.ts +8 -0
  50. package/dist/switchboard-KQaBlAda.mjs +131 -0
  51. package/dist/switchboard-KQaBlAda.mjs.map +1 -0
  52. package/dist/{switchboard-migrate-NQ7LHWSi.mjs → switchboard-migrate-7JQZM7-5.mjs} +5 -4
  53. package/dist/{switchboard-migrate-NQ7LHWSi.mjs.map → switchboard-migrate-7JQZM7-5.mjs.map} +1 -1
  54. package/dist/{switchboard-reset-BcQXlcVf.mjs → switchboard-reset-CX_Lzw3O.mjs} +4 -4
  55. package/dist/{switchboard-reset-BcQXlcVf.mjs.map → switchboard-reset-CX_Lzw3O.mjs.map} +1 -1
  56. package/dist/switchboard-yDRjakQT.mjs +4 -0
  57. package/dist/{utils-BzwczAW-.mjs → utils-C3c5YG6v.mjs} +3 -3
  58. package/dist/{utils-C4isxXSO.mjs → utils-CvmDmCVd.mjs} +3 -3
  59. package/dist/{utils-C4isxXSO.mjs.map → utils-CvmDmCVd.mjs.map} +1 -1
  60. package/dist/{vetra-DkF6EJMY.mjs → vetra-CPGUTtaF.mjs} +64 -16
  61. package/dist/vetra-CPGUTtaF.mjs.map +1 -0
  62. package/package.json +17 -16
  63. package/dist/auth-BNkN6kS9.mjs +0 -4
  64. package/dist/build-C-A5-ipO.mjs +0 -4
  65. package/dist/build-uQXq6_HU.mjs +0 -71
  66. package/dist/build-uQXq6_HU.mjs.map +0 -1
  67. package/dist/cli-connect-override-D3hh4aH_.mjs.map +0 -1
  68. package/dist/connect-build-WL4axo4z.mjs +0 -43
  69. package/dist/connect-build-WL4axo4z.mjs.map +0 -1
  70. package/dist/connect-config-BWGiW3IB.mjs.map +0 -1
  71. package/dist/connect-studio-BIQzyq5B.mjs +0 -5
  72. package/dist/generate-processor-_WOx-mMe.mjs.map +0 -1
  73. package/dist/generate-subgraph-BsHUstpl.mjs.map +0 -1
  74. package/dist/inspect-DXjbQEV_.mjs.map +0 -1
  75. package/dist/switchboard-CJMoMzWx.mjs +0 -75
  76. package/dist/switchboard-CJMoMzWx.mjs.map +0 -1
  77. package/dist/switchboard-iRFugh8I.mjs +0 -4
  78. package/dist/vetra-DkF6EJMY.mjs.map +0 -1
@@ -0,0 +1,218 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="909a20cf-eee6-5777-a387-38d1f4372b4d")}catch(e){}}();
3
+ import { n as runBuild } from "./build-Di0SwHGs.mjs";
4
+ import { t as buildCliConnectOverride } from "./cli-connect-override-b4kKqgOZ.mjs";
5
+ import { existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
6
+ import { join, resolve } from "node:path";
7
+ import { SHARED_DEP_SPECIFIERS, SHARED_SUBPATHS, normalizeBasePath } from "@powerhousedao/shared/connect";
8
+ import { DEFAULT_VENDOR_INCLUDE, DYNAMIC_BASE_PLACEHOLDER, getConnectBaseViteConfig, missingVendorEntries, ownProjectPackage, prebuildConnectVendor, prebuildReactorWorker, prebuildWorkerPackages, resolveReactorWorkerSource } from "@powerhousedao/builder-tools";
9
+ import { getConfig } from "@powerhousedao/shared/clis";
10
+ import { build, mergeConfig } from "vite";
11
+ //#region src/services/connect-build.ts
12
+ async function runConnectBuild(args) {
13
+ const { outDir, debug, dynamicBase, favicon } = args;
14
+ const mode = "production";
15
+ const dirname = process.cwd();
16
+ if (args.keyPositional !== void 0 && args.valuePositional === void 0) throw new Error("ph connect build: positional override requires both <key> and <value> (e.g. `ph connect build connect.renown.url https://renown.staging`). To read a value, use `ph connect config <key>`.");
17
+ assertLocalPackagesInstalled(dirname);
18
+ const { connectOverride, packageRegistryUrl } = buildCliConnectOverride(args);
19
+ await runBuild({
20
+ outDir: "dist",
21
+ debug,
22
+ noSharedDeps: false,
23
+ ignoreTypeErrors: false
24
+ });
25
+ const outDirAbs = resolve(dirname, outDir);
26
+ let vendor = null;
27
+ let appBase = "/";
28
+ mkdirSync(outDirAbs, { recursive: true });
29
+ if (isVendorEnabled()) {
30
+ const errorRef = {};
31
+ const phConfig = getConfig(join(dirname, "powerhouse.config.json"));
32
+ const connectBasePath = connectOverride?.app?.basePath ?? phConfig.connect?.app?.basePath;
33
+ appBase = dynamicBase ? DYNAMIC_BASE_PLACEHOLDER : connectBasePath ? normalizeBasePath(connectBasePath) : "/";
34
+ vendor = await prebuildConnectVendor({
35
+ dirname,
36
+ include: productionVendorInclude(),
37
+ vendorDir: join(outDirAbs, "__vendor__"),
38
+ base: appBase,
39
+ nodeEnv: "production",
40
+ errorRef
41
+ });
42
+ if (!vendor) {
43
+ console.error(`ph connect build: the shared-dependency vendor failed to build${errorRef.message ? `:\n${errorRef.message}` : ""}`);
44
+ throw new Error("shared-dependency vendor prebuild failed");
45
+ }
46
+ }
47
+ const reactorWorker = await prebuildReactorWorkerBundle(dirname, outDirAbs, vendor, connectOverride);
48
+ if (reactorWorker) await prebuildLocalWorkerPackages(dirname, outDirAbs, vendor, reactorWorker.vendorImports);
49
+ const keepDirs = [...vendor ? ["__vendor__"] : [], ...reactorWorker ? ["__reactor_worker__"] : []];
50
+ if (keepDirs.length > 0) cleanDistExcept(outDirAbs, keepDirs);
51
+ const baseConfig = getConnectBaseViteConfig({
52
+ mode,
53
+ dirname,
54
+ cliConnectOverride: connectOverride,
55
+ cliPackageRegistryUrl: packageRegistryUrl,
56
+ dynamicBase,
57
+ favicon,
58
+ vendor: vendor ? {
59
+ imports: vendorImportMapEntries(vendor.imports, appBase),
60
+ versions: vendor.versions
61
+ } : void 0
62
+ });
63
+ const buildConfig = { build: {
64
+ outDir,
65
+ ...keepDirs.length > 0 ? { emptyOutDir: false } : {}
66
+ } };
67
+ const config = mergeConfig(baseConfig, buildConfig);
68
+ await build(config);
69
+ if (vendor) {
70
+ const unbacked = missingVendorEntries(join(outDirAbs, "__vendor__"), vendor.imports);
71
+ if (unbacked.length > 0) throw new Error(`ph connect build: the shared-dependency vendor is missing ${unbacked.length} of the ${Object.keys(vendor.imports).length} entries its import map publishes:\n` + unbacked.map((e) => ` ${e.spec} -> ${e.url}`).join("\n"));
72
+ }
73
+ }
74
+ /**
75
+ * The specifier set the production vendor bundles: the dev-proven heavy set
76
+ * ∪ the package-shared set — everything the app and loaded packages
77
+ * externalize onto the vendor.
78
+ *
79
+ * Two specifiers are deliberately dropped:
80
+ *
81
+ * - `@powerhousedao/connect`. It is in DEFAULT_VENDOR_INCLUDE because the dev
82
+ * server vendors the app to keep rebuilds cheap, but in a production build
83
+ * the app *is* Connect: `SHARED_DEP_SPECIFIERS` omits it, so the app build
84
+ * never externalizes it and nothing would ever resolve its import-map
85
+ * entry. Vendoring it is not merely dead weight — bundling Connect's dist
86
+ * for the browser pulls in its node-only `@powerhousedao/config/node`
87
+ * import, and so `read-pkg` -> `unicorn-magic`, whose browser entry has no
88
+ * `toPath`. That fails the vendor build, and a failed prebuild fails
89
+ * `ph connect build`.
90
+ * - the bare `@powerhousedao/shared` root, whose barrel likewise reaches
91
+ * node-only modules. Its browser-safe subpaths (SHARED_SUBPATHS) are
92
+ * listed instead; a package importing the bare root bundles its own copy.
93
+ */
94
+ function productionVendorInclude() {
95
+ return [.../* @__PURE__ */ new Set([
96
+ ...DEFAULT_VENDOR_INCLUDE.filter((s) => s !== "@powerhousedao/connect"),
97
+ ...SHARED_DEP_SPECIFIERS.filter((s) => s !== "@powerhousedao/shared"),
98
+ ...SHARED_SUBPATHS.map((s) => `@powerhousedao/shared/${s}`)
99
+ ])];
100
+ }
101
+ /**
102
+ * Turn the vendor's base-less URLs (`/__vendor__/x.js`) into the addresses
103
+ * the page's import map ships, by prefixing the deploy base.
104
+ *
105
+ * An import map *address* must be a URL or begin with `/`, `./` or `../`;
106
+ * anything else is a bare specifier, which the browser rejects — it drops the
107
+ * entry, resolves the specifier to null, and every shared import then fails
108
+ * with "blocked by a null value". So the base is applied rather than the
109
+ * leading slash stripped: a root-relative address is both valid and correct
110
+ * under a subpath deploy, and a dynamic-base build keeps its placeholder for
111
+ * the serving proxy to substitute (the dynamic-base plugin leaves HTML
112
+ * tokens alone by design).
113
+ */
114
+ function vendorImportMapEntries(imports, appBase) {
115
+ return Object.fromEntries(Object.entries(imports).map(([spec, url]) => [spec, `${appBase}/${url}`.replace(/\/{2,}/g, "/")]));
116
+ }
117
+ /**
118
+ * The production vendor prebuild runs on every `ph connect build` unless
119
+ * disabled with PH_CONNECT_VENDOR=0 or false.
120
+ */
121
+ function isVendorEnabled(env = process.env) {
122
+ const raw = env.PH_CONNECT_VENDOR ?? "1";
123
+ return raw !== "0" && raw !== "false";
124
+ }
125
+ /**
126
+ * The reactor worker bundle prebuild runs on every `ph connect build` unless
127
+ * disabled with PH_CONNECT_REACTOR_WORKER=0 or false. It is built even when
128
+ * `connect.instance.reactorWorker` is off, because the `?reactorWorker=true`
129
+ * runtime override can enable the feature on a flag-off deployment.
130
+ */
131
+ function isReactorWorkerBundleEnabled(env = process.env) {
132
+ const raw = env.PH_CONNECT_REACTOR_WORKER ?? "1";
133
+ return raw !== "0" && raw !== "false";
134
+ }
135
+ /**
136
+ * Prebuild the reactor SharedWorker bundle into `<dist>/__reactor_worker__`.
137
+ * Returns null when the prebuild is disabled, the installed Connect ships no
138
+ * worker entry, or the build fails. A failure only fails `ph connect build`
139
+ * when the project explicitly enables `connect.instance.reactorWorker` —
140
+ * otherwise the feature degrades to unavailable and the build goes on.
141
+ */
142
+ async function prebuildReactorWorkerBundle(dirname, outDirAbs, vendor, connectOverride) {
143
+ if (!isReactorWorkerBundleEnabled()) return null;
144
+ if (!resolveReactorWorkerSource(dirname)) return null;
145
+ const errorRef = {};
146
+ const bundle = await prebuildReactorWorker({
147
+ dirname,
148
+ outDir: join(outDirAbs, "__reactor_worker__"),
149
+ vendor: vendor ? {
150
+ imports: vendor.imports,
151
+ dir: join(outDirAbs, "__vendor__")
152
+ } : void 0,
153
+ nodeEnv: "production",
154
+ errorRef
155
+ });
156
+ if (bundle) return bundle;
157
+ const message = `ph connect build: the reactor worker bundle failed to build${errorRef.message ? `:\n${errorRef.message}` : ""}`;
158
+ const phConfig = getConfig(join(dirname, "powerhouse.config.json"));
159
+ if (connectOverride?.instance?.reactorWorker ?? phConfig.connect?.instance?.reactorWorker ?? false) throw new Error(message);
160
+ console.warn(`${message}\nThe reactorWorker feature will be unavailable in this build.`);
161
+ return null;
162
+ }
163
+ /**
164
+ * Build the project's `provider: "local"` packages into worker-loadable model
165
+ * bundles beside the worker. A failure is a warning, not a build failure: the
166
+ * worker still runs, and documents of registry types still work - only the
167
+ * project's own types would be unavailable in worker mode.
168
+ */
169
+ async function prebuildLocalWorkerPackages(dirname, outDirAbs, vendor, safeVendorImports) {
170
+ const configured = (getConfig(join(dirname, "powerhouse.config.json")).packages ?? []).filter((p) => p.provider === "local").map((p) => p.packageName);
171
+ const own = ownProjectPackage(dirname);
172
+ const localPackages = [.../* @__PURE__ */ new Set([...configured, ...own ? [own] : []])];
173
+ const errorRef = {};
174
+ if (!await prebuildWorkerPackages({
175
+ dirname,
176
+ packages: localPackages,
177
+ outDir: join(outDirAbs, "__reactor_worker__", "packages"),
178
+ vendor: vendor ? {
179
+ imports: vendor.imports,
180
+ dir: join(outDirAbs, "__vendor__")
181
+ } : void 0,
182
+ safeVendorImports,
183
+ nodeEnv: "production",
184
+ errorRef
185
+ })) console.warn(`ph connect build: the reactor worker's local package bundles failed to build${errorRef.message ? `:\n${errorRef.message}` : ""}\nDocuments of this project's own types will not load in worker mode.`);
186
+ }
187
+ /**
188
+ * Remove every top-level entry of `dist` except the kept names. Used between
189
+ * the vendor prebuild and the app build so stale app output goes but the
190
+ * just-built vendor stays (the build then runs with emptyOutDir: false).
191
+ * Returns the number of entries removed.
192
+ */
193
+ function cleanDistExcept(dist, keep = []) {
194
+ if (!existsSync(dist)) return 0;
195
+ let removed = 0;
196
+ for (const entry of readdirSync(dist)) {
197
+ if (keep.includes(entry)) continue;
198
+ rmSync(join(dist, entry), {
199
+ recursive: true,
200
+ force: true
201
+ });
202
+ removed += 1;
203
+ }
204
+ return removed;
205
+ }
206
+ function assertLocalPackagesInstalled(projectPath) {
207
+ const localPackages = (getConfig(join(projectPath, "powerhouse.config.json")).packages ?? []).filter((p) => p.provider === "local");
208
+ if (localPackages.length === 0) return;
209
+ const missing = localPackages.filter((p) => !existsSync(join(projectPath, "node_modules", p.packageName, "package.json")));
210
+ if (missing.length === 0) return;
211
+ const names = missing.map((p) => p.packageName);
212
+ throw new Error(`ph connect build requires these packages to be installed in node_modules (they are declared with provider: "local" in powerhouse.config.json):\n` + names.map((n) => ` - ${n}`).join("\n") + `\n\nInstall them with:\n ph install --local ${names.join(" ")}`);
213
+ }
214
+ //#endregion
215
+ export { runConnectBuild };
216
+
217
+ //# sourceMappingURL=connect-build-CJhbzYPL.mjs.map
218
+ //# debugId=909a20cf-eee6-5777-a387-38d1f4372b4d
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-build-CJhbzYPL.mjs","sources":["../src/services/connect-build.ts"],"sourcesContent":["import {\n DEFAULT_VENDOR_INCLUDE,\n DYNAMIC_BASE_PLACEHOLDER,\n getConnectBaseViteConfig,\n missingVendorEntries,\n prebuildConnectVendor,\n ownProjectPackage,\n prebuildReactorWorker,\n prebuildWorkerPackages,\n resolveReactorWorkerSource,\n type PrebuiltReactorWorker,\n type PrebuiltVendor,\n} from \"@powerhousedao/builder-tools\";\nimport { getConfig } from \"@powerhousedao/shared/clis\";\nimport type { PHConnectRuntimeConfig } from \"@powerhousedao/shared/clis\";\nimport {\n normalizeBasePath,\n SHARED_DEP_SPECIFIERS,\n SHARED_SUBPATHS,\n} from \"@powerhousedao/shared/connect\";\nimport { existsSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { InlineConfig } from \"vite\";\nimport { build, mergeConfig } from \"vite\";\nimport type { ConnectBuildArgs } from \"../types.js\";\nimport { buildCliConnectOverride } from \"../utils/cli-connect-override.js\";\nimport { runBuild } from \"./build.js\";\n\nexport async function runConnectBuild(args: ConnectBuildArgs) {\n const { outDir, debug, dynamicBase, favicon } = args;\n\n const mode = \"production\";\n const dirname = process.cwd();\n\n // Build has no read mode; a bare positional `<key>` is a user error. The\n // 2-positional `<key> <value>` form is handled inside buildCliConnectOverride\n // so it layers on top of --json + flags like any other override input.\n if (args.keyPositional !== undefined && args.valuePositional === undefined) {\n throw new Error(\n \"ph connect build: positional override requires both <key> and <value> (e.g. `ph connect build connect.renown.url https://renown.staging`). To read a value, use `ph connect config <key>`.\",\n );\n }\n\n // Fail fast if any package marked as provider: \"local\" is missing from\n // node_modules — the Vite plugin that bundles them needs them on disk.\n assertLocalPackagesInstalled(dirname);\n\n // Build the CLI override layers (--json + individual flags + positional)\n // once here so a bad payload fails before we waste a build.\n // `--packages-registry` lands at the top-level `packageRegistryUrl`\n // (mirrors source-config shape); every other flag feeds the connect-block\n // precedence ladder.\n const { connectOverride, packageRegistryUrl } = buildCliConnectOverride(args);\n\n await runBuild({\n outDir: \"dist\",\n debug,\n // Local packages built for Connect share deps with the app vendor, same\n // as a plain `ph build`.\n noSharedDeps: false,\n ignoreTypeErrors: false,\n });\n\n // Production shared-dependency vendor: prebuilt into <outDir>/__vendor__\n // before the app build. On by default; PH_CONNECT_VENDOR=0|false disables\n // it. A failed prebuild fails the build — production must not ship import\n // map entries pointing at a vendor that was never built (the dev server\n // keeps its own soft fallback in the dev plugin).\n const outDirAbs = resolve(dirname, outDir);\n let vendor: PrebuiltVendor | null = null;\n // The deploy base the vendor's import-map addresses are written against.\n // Only meaningful when the vendor is built; \"/\" is the inert default.\n let appBase = \"/\";\n // The prebuild out dirs' parent must exist before the prebuilds: their\n // build locks are siblings of the out dirs, and the package build\n // (runBuild) writes to a different out dir, so nothing else creates it yet.\n mkdirSync(outDirAbs, { recursive: true });\n if (isVendorEnabled()) {\n const errorRef: { message?: string } = {};\n // The same base string the app build uses below: the dynamic-base\n // placeholder, or the normalized deploy base (CLI override wins over the\n // source config). The vendor worker appends its own segment.\n const phConfig = getConfig(join(dirname, \"powerhouse.config.json\"));\n const connectBasePath =\n connectOverride?.app?.basePath ?? phConfig.connect?.app?.basePath;\n appBase = dynamicBase\n ? DYNAMIC_BASE_PLACEHOLDER\n : connectBasePath\n ? normalizeBasePath(connectBasePath)\n : \"/\";\n vendor = await prebuildConnectVendor({\n dirname,\n include: productionVendorInclude(),\n vendorDir: join(outDirAbs, \"__vendor__\"),\n base: appBase,\n nodeEnv: \"production\",\n errorRef,\n });\n if (!vendor) {\n console.error(\n `ph connect build: the shared-dependency vendor failed to build${\n errorRef.message ? `:\\n${errorRef.message}` : \"\"\n }`,\n );\n throw new Error(\"shared-dependency vendor prebuild failed\");\n }\n }\n\n // Reactor SharedWorker bundle: the dist worker is a library artifact whose\n // bare imports no worker can resolve (import maps do not apply to workers),\n // so the deployable form is prebuilt here. With a vendor, its shared deps\n // are externalized onto ../__vendor__/ so page and worker share one cache\n // entry per dep; without one it is fully self-contained.\n const reactorWorker = await prebuildReactorWorkerBundle(\n dirname,\n outDirAbs,\n vendor,\n connectOverride,\n );\n\n // Local project models the worker cannot get from the registry, built into\n // the worker bundle's own directory so they share its vendor.\n if (reactorWorker) {\n await prebuildLocalWorkerPackages(\n dirname,\n outDirAbs,\n vendor,\n reactorWorker.vendorImports,\n );\n }\n\n const keepDirs = [\n ...(vendor ? [\"__vendor__\"] : []),\n ...(reactorWorker ? [\"__reactor_worker__\"] : []),\n ];\n // Stale top-level output goes, the prebuilt dirs stay: the app build below\n // runs with emptyOutDir: false and must not wipe them.\n if (keepDirs.length > 0) {\n cleanDistExcept(outDirAbs, keepDirs);\n }\n\n const baseConfig = getConnectBaseViteConfig({\n mode,\n dirname,\n cliConnectOverride: connectOverride,\n cliPackageRegistryUrl: packageRegistryUrl,\n dynamicBase,\n favicon,\n // Vendor import-map entries are relative (leading slash stripped) so\n // they resolve against the page URL under any deploy base — root or\n // subpath, dynamic or concrete.\n vendor: vendor\n ? {\n imports: vendorImportMapEntries(vendor.imports, appBase),\n versions: vendor.versions,\n }\n : undefined,\n });\n\n const buildConfig: InlineConfig = {\n build: {\n outDir,\n // The vendor / worker dirs were prebuilt into the out dir above; the\n // build must not empty them.\n ...(keepDirs.length > 0 ? { emptyOutDir: false } : {}),\n },\n };\n\n const config = mergeConfig(baseConfig, buildConfig);\n\n await build(config);\n\n // Last word on the shipped artifact: every specifier the page's import map\n // publishes must have a file next to it. The prebuild verifies its own\n // output, but it can return a cache hit it never rebuilt, and both the\n // stale-output clean and the app build run afterwards. An entry with no\n // file behind it ships as a URL that 404s, and a SPA answers that with\n // index.html — so the browser reports only an opaque MIME-type error with\n // no filename. Fail here instead, naming the entries.\n if (vendor) {\n const unbacked = missingVendorEntries(\n join(outDirAbs, \"__vendor__\"),\n vendor.imports,\n );\n if (unbacked.length > 0) {\n throw new Error(\n `ph connect build: the shared-dependency vendor is missing ` +\n `${unbacked.length} of the ${Object.keys(vendor.imports).length} ` +\n `entries its import map publishes:\\n` +\n unbacked.map((e) => ` ${e.spec} -> ${e.url}`).join(\"\\n\"),\n );\n }\n }\n}\n\n/**\n * The specifier set the production vendor bundles: the dev-proven heavy set\n * ∪ the package-shared set — everything the app and loaded packages\n * externalize onto the vendor.\n *\n * Two specifiers are deliberately dropped:\n *\n * - `@powerhousedao/connect`. It is in DEFAULT_VENDOR_INCLUDE because the dev\n * server vendors the app to keep rebuilds cheap, but in a production build\n * the app *is* Connect: `SHARED_DEP_SPECIFIERS` omits it, so the app build\n * never externalizes it and nothing would ever resolve its import-map\n * entry. Vendoring it is not merely dead weight — bundling Connect's dist\n * for the browser pulls in its node-only `@powerhousedao/config/node`\n * import, and so `read-pkg` -> `unicorn-magic`, whose browser entry has no\n * `toPath`. That fails the vendor build, and a failed prebuild fails\n * `ph connect build`.\n * - the bare `@powerhousedao/shared` root, whose barrel likewise reaches\n * node-only modules. Its browser-safe subpaths (SHARED_SUBPATHS) are\n * listed instead; a package importing the bare root bundles its own copy.\n */\nexport function productionVendorInclude(): string[] {\n return [\n ...new Set([\n ...DEFAULT_VENDOR_INCLUDE.filter((s) => s !== \"@powerhousedao/connect\"),\n ...SHARED_DEP_SPECIFIERS.filter((s) => s !== \"@powerhousedao/shared\"),\n ...SHARED_SUBPATHS.map((s) => `@powerhousedao/shared/${s}`),\n ]),\n ];\n}\n\n/**\n * Turn the vendor's base-less URLs (`/__vendor__/x.js`) into the addresses\n * the page's import map ships, by prefixing the deploy base.\n *\n * An import map *address* must be a URL or begin with `/`, `./` or `../`;\n * anything else is a bare specifier, which the browser rejects — it drops the\n * entry, resolves the specifier to null, and every shared import then fails\n * with \"blocked by a null value\". So the base is applied rather than the\n * leading slash stripped: a root-relative address is both valid and correct\n * under a subpath deploy, and a dynamic-base build keeps its placeholder for\n * the serving proxy to substitute (the dynamic-base plugin leaves HTML\n * tokens alone by design).\n */\nexport function vendorImportMapEntries(\n imports: Record<string, string>,\n appBase: string,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(imports).map(([spec, url]) => [\n spec,\n `${appBase}/${url}`.replace(/\\/{2,}/g, \"/\"),\n ]),\n );\n}\n\n/**\n * The production vendor prebuild runs on every `ph connect build` unless\n * disabled with PH_CONNECT_VENDOR=0 or false.\n */\nexport function isVendorEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const raw = env.PH_CONNECT_VENDOR ?? \"1\";\n return raw !== \"0\" && raw !== \"false\";\n}\n\n/**\n * The reactor worker bundle prebuild runs on every `ph connect build` unless\n * disabled with PH_CONNECT_REACTOR_WORKER=0 or false. It is built even when\n * `connect.instance.reactorWorker` is off, because the `?reactorWorker=true`\n * runtime override can enable the feature on a flag-off deployment.\n */\nexport function isReactorWorkerBundleEnabled(\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n const raw = env.PH_CONNECT_REACTOR_WORKER ?? \"1\";\n return raw !== \"0\" && raw !== \"false\";\n}\n\n/**\n * Prebuild the reactor SharedWorker bundle into `<dist>/__reactor_worker__`.\n * Returns null when the prebuild is disabled, the installed Connect ships no\n * worker entry, or the build fails. A failure only fails `ph connect build`\n * when the project explicitly enables `connect.instance.reactorWorker` —\n * otherwise the feature degrades to unavailable and the build goes on.\n */\nasync function prebuildReactorWorkerBundle(\n dirname: string,\n outDirAbs: string,\n vendor: PrebuiltVendor | null,\n connectOverride: PHConnectRuntimeConfig | undefined,\n): Promise<PrebuiltReactorWorker | null> {\n if (!isReactorWorkerBundleEnabled()) return null;\n if (!resolveReactorWorkerSource(dirname)) return null;\n\n const errorRef: { message?: string } = {};\n const bundle = await prebuildReactorWorker({\n dirname,\n outDir: join(outDirAbs, \"__reactor_worker__\"),\n vendor: vendor\n ? { imports: vendor.imports, dir: join(outDirAbs, \"__vendor__\") }\n : undefined,\n nodeEnv: \"production\",\n errorRef,\n });\n if (bundle) return bundle;\n\n const message = `ph connect build: the reactor worker bundle failed to build${\n errorRef.message ? `:\\n${errorRef.message}` : \"\"\n }`;\n const phConfig = getConfig(join(dirname, \"powerhouse.config.json\"));\n const required =\n connectOverride?.instance?.reactorWorker ??\n phConfig.connect?.instance?.reactorWorker ??\n false;\n if (required) {\n throw new Error(message);\n }\n console.warn(\n `${message}\\nThe reactorWorker feature will be unavailable in this build.`,\n );\n return null;\n}\n\n/**\n * Build the project's `provider: \"local\"` packages into worker-loadable model\n * bundles beside the worker. A failure is a warning, not a build failure: the\n * worker still runs, and documents of registry types still work - only the\n * project's own types would be unavailable in worker mode.\n */\nasync function prebuildLocalWorkerPackages(\n dirname: string,\n outDirAbs: string,\n vendor: PrebuiltVendor | null,\n safeVendorImports: Record<string, string>,\n): Promise<void> {\n const config = getConfig(join(dirname, \"powerhouse.config.json\"));\n const configured = (config.packages ?? [])\n .filter((p) => p.provider === \"local\")\n .map((p) => p.packageName);\n // The project itself is a local package in all but name: a vetra project\n // declares no entry for itself, and its models are the ones the worker\n // cannot otherwise get.\n const own = ownProjectPackage(dirname);\n const localPackages = [...new Set([...configured, ...(own ? [own] : [])])];\n\n const errorRef: { message?: string } = {};\n const built = await prebuildWorkerPackages({\n dirname,\n packages: localPackages,\n outDir: join(outDirAbs, \"__reactor_worker__\", \"packages\"),\n vendor: vendor\n ? { imports: vendor.imports, dir: join(outDirAbs, \"__vendor__\") }\n : undefined,\n safeVendorImports,\n nodeEnv: \"production\",\n errorRef,\n });\n if (!built) {\n console.warn(\n `ph connect build: the reactor worker's local package bundles failed to build${\n errorRef.message ? `:\\n${errorRef.message}` : \"\"\n }\\nDocuments of this project's own types will not load in worker mode.`,\n );\n }\n}\n\n/**\n * Remove every top-level entry of `dist` except the kept names. Used between\n * the vendor prebuild and the app build so stale app output goes but the\n * just-built vendor stays (the build then runs with emptyOutDir: false).\n * Returns the number of entries removed.\n */\nexport function cleanDistExcept(dist: string, keep: string[] = []): number {\n if (!existsSync(dist)) return 0;\n let removed = 0;\n for (const entry of readdirSync(dist)) {\n if (keep.includes(entry)) continue;\n rmSync(join(dist, entry), { recursive: true, force: true });\n removed += 1;\n }\n return removed;\n}\n\nfunction assertLocalPackagesInstalled(projectPath: string) {\n const config = getConfig(join(projectPath, \"powerhouse.config.json\"));\n const localPackages = (config.packages ?? []).filter(\n (p) => p.provider === \"local\",\n );\n if (localPackages.length === 0) return;\n\n const missing = localPackages.filter(\n (p) =>\n !existsSync(\n join(projectPath, \"node_modules\", p.packageName, \"package.json\"),\n ),\n );\n if (missing.length === 0) return;\n\n const names = missing.map((p) => p.packageName);\n throw new Error(\n `ph connect build requires these packages to be installed in node_modules (they are declared with provider: \"local\" in powerhouse.config.json):\\n` +\n names.map((n) => ` - ${n}`).join(\"\\n\") +\n `\\n\\nInstall them with:\\n ph install --local ${names.join(\" \")}`,\n );\n}\n"],"names":[],"mappings":"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","debug_id":"909a20cf-eee6-5777-a387-38d1f4372b4d"}
@@ -1,9 +1,9 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e77ada46-4a0f-50ab-9c1e-62c534069ae5")}catch(e){}}();
3
- import { c as validateConnectKeyValue, i as wasFlagExplicitlyPassed, l as validateConnectPatch, n as buildConnectFlagPatch, o as normalizeKey, s as parseCliValue } from "./cli-connect-override-D3hh4aH_.mjs";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fe7b6dc7-0667-5929-91d2-f6407d90172b")}catch(e){}}();
3
+ import { c as validateConnectKeyValue, i as wasFlagExplicitlyPassed, l as validateConnectPatch, n as buildConnectFlagPatch, o as normalizeKey, s as parseCliValue } from "./cli-connect-override-b4kKqgOZ.mjs";
4
4
  import { existsSync } from "node:fs";
5
5
  import { isAbsolute, join, resolve } from "node:path";
6
- import { ConfigLoader, DEFAULT_CONNECT_CONFIG, JsonConfigAdapter, deepMerge } from "@powerhousedao/shared/connect";
6
+ import { ConfigLoader, JsonConfigAdapter, deepMerge, resolveSourceConnect } from "@powerhousedao/shared/connect";
7
7
  import { stringToPath } from "remeda";
8
8
  //#region src/utils/get-at-path.ts
9
9
  /**
@@ -34,7 +34,8 @@ function resolveDistPath(cwd, distDirArg) {
34
34
  const fromArg = distDirArg;
35
35
  const fromEnv = process.env.PH_CONNECT_OUTDIR;
36
36
  const dir = fromArg ?? fromEnv ?? DEFAULT_DIST_SUBPATH;
37
- return join(isAbsolute(dir) ? dir : resolve(cwd, dir), SOURCE_FILE);
37
+ const abs = isAbsolute(dir) ? dir : resolve(cwd, dir);
38
+ return join(abs, SOURCE_FILE);
38
39
  }
39
40
  /**
40
41
  * Read the source file's raw bytes (no merge with defaults). Returns an empty
@@ -56,12 +57,16 @@ async function writeSourceRaw(path, next) {
56
57
  }
57
58
  /**
58
59
  * Build the merged "effective" connect block for list/get mode: defaults <
59
- * source.connect. Doesn't go through env or dist — list mode shows what the
60
- * source declares + defaults, which is what the next build will produce as a
61
- * baseline (before env seeds + CLI overrides).
60
+ * source.workflows < source.connect. Doesn't go through env or dist — list
61
+ * mode shows what the source declares + defaults, which is what the next
62
+ * build will produce as a baseline (before env seeds + CLI overrides).
62
63
  */
63
64
  function effectiveConnect(source) {
64
- return deepMerge(DEFAULT_CONNECT_CONFIG, source.connect && typeof source.connect === "object" && !Array.isArray(source.connect) ? source.connect : {});
65
+ const sourceConnect = source.connect && typeof source.connect === "object" && !Array.isArray(source.connect) ? source.connect : {};
66
+ return resolveSourceConnect({
67
+ connect: sourceConnect,
68
+ workflows: source.workflows
69
+ });
65
70
  }
66
71
  function printJson(value) {
67
72
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
@@ -82,6 +87,7 @@ function argsToFlagInput(args) {
82
87
  renownSwitchboardUrl: args.renownSwitchboardUrl,
83
88
  allowAddDrive: args.allowAddDrive,
84
89
  externalPackages: args.externalPackages,
90
+ workflows: args.workflows,
85
91
  remoteDrivesEnabled: args.remoteDrivesEnabled,
86
92
  remoteDrivesAllowAdd: args.remoteDrivesAllowAdd,
87
93
  remoteDrivesAllowDelete: args.remoteDrivesAllowDelete,
@@ -99,7 +105,7 @@ function argsToFlagInput(args) {
99
105
  };
100
106
  }
101
107
  /**
102
- * Whether any field flag (any of the 19) was passed. Distinguishes the
108
+ * Whether any field flag (any of the 20) was passed. Distinguishes the
103
109
  * single-field-set mode from list mode when neither `--get` nor `--json` is
104
110
  * present.
105
111
  */
@@ -167,7 +173,8 @@ async function runConnectConfig(args) {
167
173
  patch = connectOnly;
168
174
  } else patch = buildConnectFlagPatch(flagInput);
169
175
  if (Object.keys(patch).length === 0 && topLevelRegistry === void 0) throw new Error("ph connect config: nothing to set. Pass at least one field flag (e.g. --renown-url <url>) or --json with a non-empty payload.");
170
- const nextConnect = deepMerge(source.connect && typeof source.connect === "object" && !Array.isArray(source.connect) ? source.connect : {}, patch);
176
+ const currentConnect = source.connect && typeof source.connect === "object" && !Array.isArray(source.connect) ? source.connect : {};
177
+ const nextConnect = deepMerge(currentConnect, patch);
171
178
  const nextSource = {
172
179
  ...source,
173
180
  connect: nextConnect
@@ -185,5 +192,5 @@ async function runConnectConfig(args) {
185
192
  //#endregion
186
193
  export { runConnectConfig };
187
194
 
188
- //# sourceMappingURL=connect-config-BWGiW3IB.mjs.map
189
- //# debugId=e77ada46-4a0f-50ab-9c1e-62c534069ae5
195
+ //# sourceMappingURL=connect-config-DGfPEeP8.mjs.map
196
+ //# debugId=fe7b6dc7-0667-5929-91d2-f6407d90172b
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-config-DGfPEeP8.mjs","sources":["../src/utils/get-at-path.ts","../src/services/connect-config.ts"],"sourcesContent":["/**\n * Walk a parsed path (e.g. from remeda's `stringToPath`) through a runtime-\n * typed object, returning the value or `undefined` if any segment is\n * missing.\n *\n * Remeda's `prop` is overload-typed for compile-time literal paths and\n * doesn't accept a runtime path array via spread, so we walk inline for\n * the dynamic-path case used by `ph connect config --get`.\n */\nexport function getAtPath(\n obj: unknown,\n parts: ReadonlyArray<string | number>,\n): unknown {\n let cur: unknown = obj;\n for (const key of parts) {\n if (cur === null || typeof cur !== \"object\") return undefined;\n cur = (cur as Record<string, unknown>)[String(key)];\n }\n return cur;\n}\n","// `ph connect config` — read or update Connect's runtime configuration.\n//\n// Mode dispatch (exactly one mode per invocation; mutex enforced below):\n//\n// ph connect config → list mode (print effective merged config)\n// ph connect config <key> → get mode (positional)\n// ph connect config --get <dotted.path> → get mode (flag form, equivalent)\n// ph connect config <key> <value> → set mode (positional, dual-write source + dist)\n// ph connect config --<field> <value> → set mode (flag form)\n// ph connect config --json '{...}' → bulk-set mode (dual-write)\n//\n// Dual-write semantics for set / bulk-set:\n// - Source `powerhouse.config.json` (project root) gets the connect.* patch\n// deep-merged into `connect.*`. `--packages-registry` lands at the\n// top-level `packageRegistryUrl` field (project-wide setting, also read\n// by `ph install` / `ph publish` / Switchboard).\n// - Dist `powerhouse.config.json` (default `.ph/connect-build/dist/`) gets\n// the same connect.* patch deep-merged in, and the same top-level\n// `packageRegistryUrl` if set. The runtime schema mirrors the source\n// schema, so the field lives at the same path in both files.\n//\n// The dist write is skipped silently if the dist file doesn't exist — that's\n// the \"config-only-before-first-build\" workflow, not an error.\n//\n// Field flags + the 4 commonArgs flags (base, log-level, default-drives-url,\n// drive-preserve-strategy) come from the same source as `ph connect build`'s\n// flags, so the two commands share identical CLI surfaces. The 4 commonArgs\n// flags carry cmd-ts defaults; we gate them through `wasFlagExplicitlyPassed`\n// for the same reason `buildCliConnectOverride` does — to avoid leaking\n// default values into a write the user didn't request.\n\nimport type {\n PHConnectRuntimeConfig,\n PowerhouseConfig,\n} from \"@powerhousedao/shared/clis\";\nimport {\n ConfigLoader,\n JsonConfigAdapter,\n deepMerge,\n resolveSourceConnect,\n} from \"@powerhousedao/shared/connect\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { stringToPath } from \"remeda\";\nimport type { ConnectConfigArgs } from \"../types.js\";\nimport {\n buildConnectFlagPatch,\n wasFlagExplicitlyPassed,\n type ConnectFlagInput,\n} from \"../utils/cli-connect-override.js\";\nimport {\n normalizeKey,\n parseCliValue,\n validateConnectKeyValue,\n validateConnectPatch,\n} from \"../utils/connect-config-validation.js\";\nimport { getAtPath } from \"../utils/get-at-path.js\";\n\ntype ConnectPartial = Partial<PHConnectRuntimeConfig>;\n\nconst SOURCE_FILE = \"powerhouse.config.json\";\nconst DEFAULT_DIST_SUBPATH = \".ph/connect-build/dist\";\n\nfunction resolveSourcePath(cwd: string): string {\n return join(cwd, SOURCE_FILE);\n}\n\nfunction resolveDistPath(cwd: string, distDirArg: string | undefined): string {\n const fromArg = distDirArg;\n const fromEnv = process.env.PH_CONNECT_OUTDIR;\n const dir = fromArg ?? fromEnv ?? DEFAULT_DIST_SUBPATH;\n const abs = isAbsolute(dir) ? dir : resolve(cwd, dir);\n return join(abs, SOURCE_FILE);\n}\n\n/**\n * Read the source file's raw bytes (no merge with defaults). Returns an empty\n * object stub when the file doesn't exist — the operator can config their way\n * to a complete file before ever running `ph connect build`.\n */\nasync function readSourceRaw(path: string): Promise<Record<string, unknown>> {\n if (!existsSync(path)) return {};\n const adapter = new JsonConfigAdapter({ path });\n const raw = await adapter.read();\n return raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n}\n\nasync function writeSourceRaw(\n path: string,\n next: Record<string, unknown>,\n): Promise<void> {\n const adapter = new JsonConfigAdapter({ path });\n // ConfigShape requires a `connect` key; ensure it's present.\n const shape = {\n ...next,\n connect: (next.connect as PHConnectRuntimeConfig | undefined) ?? {},\n };\n await adapter.write(shape);\n}\n\n/**\n * Build the merged \"effective\" connect block for list/get mode: defaults <\n * source.workflows < source.connect. Doesn't go through env or dist — list\n * mode shows what the source declares + defaults, which is what the next\n * build will produce as a baseline (before env seeds + CLI overrides).\n */\nfunction effectiveConnect(\n source: Record<string, unknown>,\n): PHConnectRuntimeConfig {\n const sourceConnect =\n source.connect &&\n typeof source.connect === \"object\" &&\n !Array.isArray(source.connect)\n ? (source.connect as ConnectPartial)\n : {};\n return resolveSourceConnect({\n connect: sourceConnect,\n workflows: source.workflows as PowerhouseConfig[\"workflows\"],\n });\n}\n\nfunction printJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * Translate the parsed `ph connect config` args into the structural\n * `ConnectFlagInput` consumed by `buildConnectFlagPatch`. Common-args flags\n * with cmd-ts defaults are gated through `wasFlagExplicitlyPassed` so the\n * defaults don't leak into a write the user didn't request. `--base` is\n * not translated here — it's rejected up front by `runConnectConfig`.\n */\nfunction argsToFlagInput(args: ConnectConfigArgs): ConnectFlagInput {\n return {\n renownUrl: args.renownUrl,\n renownNetworkId: args.renownNetworkId,\n renownChainId: args.renownChainId,\n renownNamespace: args.renownNamespace,\n renownSwitchboardUrl: args.renownSwitchboardUrl,\n allowAddDrive: args.allowAddDrive,\n externalPackages: args.externalPackages,\n workflows: args.workflows,\n remoteDrivesEnabled: args.remoteDrivesEnabled,\n remoteDrivesAllowAdd: args.remoteDrivesAllowAdd,\n remoteDrivesAllowDelete: args.remoteDrivesAllowDelete,\n localDrivesEnabled: args.localDrivesEnabled,\n localDrivesAllowAdd: args.localDrivesAllowAdd,\n localDrivesAllowDelete: args.localDrivesAllowDelete,\n appName: args.appName,\n homeBackground: args.homeBackground,\n sentryDsn: args.sentryDsn,\n sentryEnv: args.sentryEnv,\n sentryTracingEnabled: args.sentryTracingEnabled,\n logLevel: wasFlagExplicitlyPassed(\"log-level\") ? args.logLevel : undefined,\n defaultDrivesUrl: wasFlagExplicitlyPassed(\"default-drives-url\")\n ? args.defaultDrivesUrl\n : undefined,\n drivesPreserveStrategy: wasFlagExplicitlyPassed(\"drive-preserve-strategy\")\n ? args.drivesPreserveStrategy\n : undefined,\n };\n}\n\n/**\n * Whether any field flag (any of the 20) was passed. Distinguishes the\n * single-field-set mode from list mode when neither `--get` nor `--json` is\n * present.\n */\nfunction hasAnyFieldFlag(input: ConnectFlagInput): boolean {\n // Object.values doesn't include json (which isn't in ConnectFlagInput here).\n // Cast to a generic record so the `!== undefined` predicate is type-aware:\n // ConnectFlagInput's optional properties narrow `v` in a way TS thinks\n // excludes `undefined`, even though at runtime any of them can be unset.\n return Object.values(input as Record<string, unknown>).some(\n (v) => v !== undefined,\n );\n}\n\nexport async function runConnectConfig(args: ConnectConfigArgs): Promise<void> {\n // `--base` is a build-time field (baked into the Vite bundle's asset URLs\n // and the nginx config template), so writing it post-build leaves the\n // layers disagreeing and the SPA's assets 404. The flag stays declared so\n // cmd-ts parses it; we reject explicit use here with an actionable error.\n if (wasFlagExplicitlyPassed(\"base\")) {\n throw new Error(\n \"ph connect config: --base is a build-time field; run `ph connect build --base <value>` and redeploy the container (or restart with PH_CONNECT_BASE_PATH=<value> set in the environment).\",\n );\n }\n\n const cwd = process.cwd();\n const sourcePath = resolveSourcePath(cwd);\n const distPath = resolveDistPath(cwd, args.distDir);\n\n const flagInput = argsToFlagInput(args);\n const hasGet = args.get !== undefined;\n const hasJson = args.json !== undefined;\n const hasFieldFlag = hasAnyFieldFlag(flagInput);\n // `--packages-registry` is a top-level field, not part of the connect-flag\n // patch. Track it separately so the set-mode write puts it in the right\n // place and the mutex counts it as a \"field flag\".\n const explicitRegistry = args.packagesRegistry;\n const hasExplicitRegistry = explicitRegistry !== undefined;\n // Positional pair: 1 positional = get, 2 = set. cmd-ts assigns the first\n // positional to `keyPositional` and the second to `valuePositional`, so a\n // standalone <value> isn't representable here.\n const hasPositionalKey = args.keyPositional !== undefined;\n const hasPositionalValue = args.valuePositional !== undefined;\n const hasPositional = hasPositionalKey;\n\n // Mutex: positional / --get / --json / (any field flag OR\n // --packages-registry) are mutually exclusive. Exactly one mode (or none →\n // list) per call. Counting positional as a single mode regardless of arity:\n // a `<key>` alone is a get, `<key> <value>` is a set, both occupy the same\n // \"positional mode\" slot vs. the other forms.\n const modeCount = [\n hasPositional,\n hasGet,\n hasJson,\n hasFieldFlag || hasExplicitRegistry,\n ].filter(Boolean).length;\n if (modeCount > 1) {\n throw new Error(\n \"ph connect config: positional <key>/<value>, --get, --json, and individual field flags are mutually exclusive. Use one mode per invocation.\",\n );\n }\n\n const source = await readSourceRaw(sourcePath);\n\n // List mode.\n if (modeCount === 0) {\n printJson(effectiveConnect(source));\n return;\n }\n\n // Get mode (either positional `<key>` alone or `--get <key>`).\n if (hasGet || (hasPositional && !hasPositionalValue)) {\n const rawKey = hasGet ? args.get! : args.keyPositional!;\n const sourceLabel = hasGet ? \"--get\" : \"<key>\";\n const normalized = normalizeKey(rawKey);\n if (!normalized) {\n throw new Error(\n `ph connect config ${sourceLabel}: key cannot be empty. Pass a dotted path inside connect.* (e.g. connect.renown.url).`,\n );\n }\n // `packageRegistryUrl` is a top-level field — look it up on the raw\n // source object, not inside `effectiveConnect`.\n if (normalized === \"packageRegistryUrl\") {\n const value = source.packageRegistryUrl;\n if (value === undefined) {\n throw new Error(\n `ph connect config ${sourceLabel}: no value at key \"${normalized}\". Run \\`ph connect config\\` (no args) to see the available paths.`,\n );\n }\n printJson(value);\n return;\n }\n const value = getAtPath(effectiveConnect(source), stringToPath(normalized));\n if (value === undefined) {\n throw new Error(\n `ph connect config ${sourceLabel}: no value at key \"${normalized}\". Run \\`ph connect config\\` (no args) to see the available paths.`,\n );\n }\n printJson(value);\n return;\n }\n\n // Set / bulk-set mode. Build the connect-side patch from positional\n // `<key> <value>` (Ajv-validated against the schema at that path), --json\n // (Ajv-validated as a partial connect.* blob), or individual field flags\n // (shape guaranteed by cmd-ts type coercion). `--packages-registry` is a\n // top-level field; if positional `<key>` is `packageRegistryUrl` or --json\n // carries it, route that to the top-level write.\n let topLevelRegistry: string | undefined = explicitRegistry;\n let patch: ConnectPartial;\n if (hasPositional && hasPositionalValue) {\n const normalized = normalizeKey(args.keyPositional!);\n if (!normalized) {\n throw new Error(\n \"ph connect config <key>: key cannot be empty. Pass a dotted path inside connect.* (e.g. connect.renown.url).\",\n );\n }\n // Top-level: positional `packageRegistryUrl <value>` writes the top-level\n // field instead of a connect.* path.\n if (normalized === \"packageRegistryUrl\") {\n const parsed = parseCliValue(args.valuePositional!);\n if (typeof parsed !== \"string\") {\n throw new Error(\n `ph connect config: packageRegistryUrl must be a string (got ${typeof parsed}).`,\n );\n }\n topLevelRegistry = parsed;\n patch = {};\n } else {\n patch = validateConnectKeyValue(\n normalized,\n args.valuePositional!,\n ) as ConnectPartial;\n }\n } else if (hasJson) {\n const validated = validateConnectPatch(args.json!) as Record<\n string,\n unknown\n >;\n if (typeof validated.packageRegistryUrl === \"string\") {\n topLevelRegistry = topLevelRegistry ?? validated.packageRegistryUrl;\n }\n const connectOnly = { ...validated };\n delete connectOnly.packageRegistryUrl;\n patch = connectOnly as ConnectPartial;\n } else {\n patch = buildConnectFlagPatch(flagInput) as ConnectPartial;\n }\n\n if (Object.keys(patch).length === 0 && topLevelRegistry === undefined) {\n throw new Error(\n \"ph connect config: nothing to set. Pass at least one field flag (e.g. --renown-url <url>) or --json with a non-empty payload.\",\n );\n }\n\n // Build the next source: top-level packageRegistryUrl (if set) +\n // connect.* deep-merge.\n const currentConnect =\n source.connect &&\n typeof source.connect === \"object\" &&\n !Array.isArray(source.connect)\n ? (source.connect as PHConnectRuntimeConfig)\n : ({} as PHConnectRuntimeConfig);\n const nextConnect = deepMerge(\n currentConnect,\n patch as PHConnectRuntimeConfig,\n );\n const nextSource: Record<string, unknown> = {\n ...source,\n connect: nextConnect,\n };\n if (topLevelRegistry !== undefined) {\n nextSource.packageRegistryUrl = topLevelRegistry;\n }\n\n await writeSourceRaw(sourcePath, nextSource);\n\n // Dual-write to dist if it exists. Same shape as source: connect.* block\n // is deep-merged; top-level `packageRegistryUrl` is set in place.\n if (existsSync(distPath)) {\n const distLoader = new ConfigLoader(\n new JsonConfigAdapter({ path: distPath }),\n );\n const distPatch: Record<string, unknown> = { connect: patch };\n if (topLevelRegistry !== undefined) {\n distPatch.packageRegistryUrl = topLevelRegistry;\n }\n await distLoader.write(distPatch);\n }\n\n process.stdout.write(\n `ph connect config: wrote ${sourcePath}${existsSync(distPath) ? ` and ${distPath}` : \"\"}\\n`,\n );\n}\n"],"names":[],"mappings":"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","debug_id":"fe7b6dc7-0667-5929-91d2-f6407d90172b"}
@@ -1,14 +1,17 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5877d557-b1df-5b0d-89b6-15f3734283bf")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cce7218b-e89e-588d-a399-69d6e61f607e")}catch(e){}}();
3
3
  import { getConnectBaseViteConfig } from "@powerhousedao/builder-tools";
4
4
  import { mergeConfig, preview } from "vite";
5
5
  //#region src/services/connect-preview.ts
6
6
  async function runConnectPreview(args) {
7
7
  const { outDir, port, host, open, cors, strictPort, printUrls, bindCLIShortcuts } = args;
8
- const server = await preview(mergeConfig(getConnectBaseViteConfig({
9
- mode: "production",
10
- dirname: process.cwd()
11
- }), {
8
+ const mode = "production";
9
+ const dirname = process.cwd();
10
+ const baseConfig = getConnectBaseViteConfig({
11
+ mode,
12
+ dirname
13
+ });
14
+ const config = mergeConfig(baseConfig, {
12
15
  build: { outDir },
13
16
  preview: {
14
17
  cors,
@@ -17,12 +20,13 @@ async function runConnectPreview(args) {
17
20
  host,
18
21
  open
19
22
  }
20
- }));
23
+ });
24
+ const server = await preview(config);
21
25
  if (printUrls) server.printUrls();
22
26
  if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });
23
27
  }
24
28
  //#endregion
25
29
  export { runConnectPreview };
26
30
 
27
- //# sourceMappingURL=connect-preview-D7ypzFDc.mjs.map
28
- //# debugId=5877d557-b1df-5b0d-89b6-15f3734283bf
31
+ //# sourceMappingURL=connect-preview-CzDqR-JN.mjs.map
32
+ //# debugId=cce7218b-e89e-588d-a399-69d6e61f607e
@@ -1 +1 @@
1
- {"version":3,"file":"connect-preview-D7ypzFDc.mjs","sources":["../src/services/connect-preview.ts"],"sourcesContent":["import { getConnectBaseViteConfig } from \"@powerhousedao/builder-tools\";\nimport type { InlineConfig } from \"vite\";\nimport { mergeConfig, preview } from \"vite\";\nimport type { ConnectPreviewArgs } from \"../types.js\";\n\nexport async function runConnectPreview(args: ConnectPreviewArgs) {\n const {\n outDir,\n port,\n host,\n open,\n cors,\n strictPort,\n printUrls,\n bindCLIShortcuts,\n } = args;\n\n const mode = \"production\";\n\n const dirname = process.cwd();\n\n const baseConfig = getConnectBaseViteConfig({\n mode,\n dirname,\n });\n\n const previewConfig: InlineConfig = {\n build: {\n outDir,\n },\n preview: {\n cors,\n port,\n strictPort,\n host,\n open,\n },\n };\n\n const config = mergeConfig(baseConfig, previewConfig);\n\n const server = await preview(config);\n\n if (printUrls) server.printUrls();\n if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });\n}\n"],"names":[],"mappings":";;;;;AAKA,eAAsB,kBAAkB,MAA0B;CAChE,MAAM,EACJ,QACA,MACA,MACA,MACA,MACA,YACA,WACA,qBACE;CA0BJ,MAAM,SAAS,MAAM,QAFN,YAlBI,yBAAyB;EAC1C,MALW;EAMX,SAJc,QAAQ,KAAK;EAK5B,CAAC,EAEkC;EAClC,OAAO,EACL,QACD;EACD,SAAS;GACP;GACA;GACA;GACA;GACA;GACD;EACF,CAEoD,CAEjB;AAEpC,KAAI,UAAW,QAAO,WAAW;AACjC,KAAI,iBAAkB,QAAO,iBAAiB,EAAE,OAAO,MAAM,CAAC","debug_id":"5877d557-b1df-5b0d-89b6-15f3734283bf"}
1
+ {"version":3,"file":"connect-preview-CzDqR-JN.mjs","sources":["../src/services/connect-preview.ts"],"sourcesContent":["import { getConnectBaseViteConfig } from \"@powerhousedao/builder-tools\";\nimport type { InlineConfig } from \"vite\";\nimport { mergeConfig, preview } from \"vite\";\nimport type { ConnectPreviewArgs } from \"../types.js\";\n\nexport async function runConnectPreview(args: ConnectPreviewArgs) {\n const {\n outDir,\n port,\n host,\n open,\n cors,\n strictPort,\n printUrls,\n bindCLIShortcuts,\n } = args;\n\n const mode = \"production\";\n\n const dirname = process.cwd();\n\n const baseConfig = getConnectBaseViteConfig({\n mode,\n dirname,\n });\n\n const previewConfig: InlineConfig = {\n build: {\n outDir,\n },\n preview: {\n cors,\n port,\n strictPort,\n host,\n open,\n },\n };\n\n const config = mergeConfig(baseConfig, previewConfig);\n\n const server = await preview(config);\n\n if (printUrls) server.printUrls();\n if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });\n}\n"],"names":[],"mappings":";;;;;AAKA,eAAsB,kBAAkB,MAA0B;CAChE,MAAM,EACJ,QACA,MACA,MACA,MACA,MACA,YACA,WACA,qBACE;CAEJ,MAAM,OAAO;CAEb,MAAM,UAAU,QAAQ,IAAI;CAE5B,MAAM,aAAa,yBAAyB;EAC1C;EACA;CACF,CAAC;CAeD,MAAM,SAAS,YAAY,YAAY;EAZrC,OAAO,EACL,OACF;EACA,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;CAGiD,CAAC;CAEpD,MAAM,SAAS,MAAM,QAAQ,MAAM;CAEnC,IAAI,WAAW,OAAO,UAAU;CAChC,IAAI,kBAAkB,OAAO,iBAAiB,EAAE,OAAO,KAAK,CAAC;AAC/D","debug_id":"cce7218b-e89e-588d-a399-69d6e61f607e"}
@@ -1,16 +1,20 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1de6dc60-070c-5573-97e3-eb528854853f")}catch(e){}}();
3
- import { r as buildStudioConnectOverride } from "./cli-connect-override-D3hh4aH_.mjs";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8c6c1a6c-3781-513f-afa0-ab9d74da54d0")}catch(e){}}();
3
+ import { r as buildStudioConnectOverride } from "./cli-connect-override-b4kKqgOZ.mjs";
4
4
  import { getConnectBaseViteConfig } from "@powerhousedao/builder-tools";
5
5
  import { createServer, mergeConfig } from "vite";
6
6
  //#region src/services/connect-studio.ts
7
7
  async function runConnectStudio(args, customLogger, callerOverride) {
8
8
  const { port, host, open, cors, strictPort, printUrls, bindCLIShortcuts } = args;
9
- const server = await createServer(mergeConfig(getConnectBaseViteConfig({
10
- mode: "development",
11
- dirname: process.cwd(),
12
- cliConnectOverride: buildStudioConnectOverride(args, callerOverride)
13
- }), {
9
+ const mode = "development";
10
+ const dirname = process.cwd();
11
+ const cliConnectOverride = buildStudioConnectOverride(args, callerOverride);
12
+ const baseConfig = getConnectBaseViteConfig({
13
+ mode,
14
+ dirname,
15
+ cliConnectOverride
16
+ });
17
+ const config = mergeConfig(baseConfig, {
14
18
  server: {
15
19
  port,
16
20
  host,
@@ -19,7 +23,8 @@ async function runConnectStudio(args, customLogger, callerOverride) {
19
23
  strictPort
20
24
  },
21
25
  customLogger
22
- }));
26
+ });
27
+ const server = await createServer(config);
23
28
  await server.listen();
24
29
  if (printUrls) server.printUrls();
25
30
  if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });
@@ -27,5 +32,5 @@ async function runConnectStudio(args, customLogger, callerOverride) {
27
32
  //#endregion
28
33
  export { runConnectStudio as t };
29
34
 
30
- //# sourceMappingURL=connect-studio-D6rfWCNB.mjs.map
31
- //# debugId=1de6dc60-070c-5573-97e3-eb528854853f
35
+ //# sourceMappingURL=connect-studio-_-O1-oef.mjs.map
36
+ //# debugId=8c6c1a6c-3781-513f-afa0-ab9d74da54d0
@@ -1 +1 @@
1
- {"version":3,"file":"connect-studio-D6rfWCNB.mjs","sources":["../src/services/connect-studio.ts"],"sourcesContent":["import { getConnectBaseViteConfig } from \"@powerhousedao/builder-tools\";\nimport type { PHConnectRuntimeConfig } from \"@powerhousedao/shared/clis\";\nimport type { InlineConfig, Logger } from \"vite\";\nimport { createServer, mergeConfig } from \"vite\";\nimport type { ConnectStudioArgs } from \"../types.js\";\nimport { buildStudioConnectOverride } from \"../utils/cli-connect-override.js\";\n\nexport async function runConnectStudio(\n args: ConnectStudioArgs,\n customLogger?: Logger,\n callerOverride?: PHConnectRuntimeConfig,\n) {\n const { port, host, open, cors, strictPort, printUrls, bindCLIShortcuts } =\n args;\n const mode = \"development\";\n\n const dirname = process.cwd();\n\n const cliConnectOverride = buildStudioConnectOverride(args, callerOverride);\n\n const baseConfig = getConnectBaseViteConfig({\n mode,\n dirname,\n cliConnectOverride,\n });\n\n const devServerConfig: InlineConfig = {\n server: { port, host, open, cors, strictPort },\n customLogger,\n };\n\n const config = mergeConfig(baseConfig, devServerConfig);\n\n const server = await createServer(config);\n\n await server.listen();\n\n if (printUrls) server.printUrls();\n if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });\n}\n"],"names":[],"mappings":";;;;;;AAOA,eAAsB,iBACpB,MACA,cACA,gBACA;CACA,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,YAAY,WAAW,qBACrD;CAoBF,MAAM,SAAS,MAAM,aAFN,YAXI,yBAAyB;EAC1C,MAPW;EAQX,SANc,QAAQ,KAAK;EAO3B,oBALyB,2BAA2B,MAAM,eAAe;EAM1E,CAAC,EAEoC;EACpC,QAAQ;GAAE;GAAM;GAAM;GAAM;GAAM;GAAY;EAC9C;EACD,CAEsD,CAEd;AAEzC,OAAM,OAAO,QAAQ;AAErB,KAAI,UAAW,QAAO,WAAW;AACjC,KAAI,iBAAkB,QAAO,iBAAiB,EAAE,OAAO,MAAM,CAAC","debug_id":"1de6dc60-070c-5573-97e3-eb528854853f"}
1
+ {"version":3,"file":"connect-studio-_-O1-oef.mjs","sources":["../src/services/connect-studio.ts"],"sourcesContent":["import { getConnectBaseViteConfig } from \"@powerhousedao/builder-tools\";\nimport type { PHConnectRuntimeConfig } from \"@powerhousedao/shared/clis\";\nimport type { InlineConfig, Logger } from \"vite\";\nimport { createServer, mergeConfig } from \"vite\";\nimport type { ConnectStudioArgs } from \"../types.js\";\nimport { buildStudioConnectOverride } from \"../utils/cli-connect-override.js\";\n\nexport async function runConnectStudio(\n args: ConnectStudioArgs,\n customLogger?: Logger,\n callerOverride?: PHConnectRuntimeConfig,\n) {\n const { port, host, open, cors, strictPort, printUrls, bindCLIShortcuts } =\n args;\n const mode = \"development\";\n\n const dirname = process.cwd();\n\n const cliConnectOverride = buildStudioConnectOverride(args, callerOverride);\n\n const baseConfig = getConnectBaseViteConfig({\n mode,\n dirname,\n cliConnectOverride,\n });\n\n const devServerConfig: InlineConfig = {\n server: { port, host, open, cors, strictPort },\n customLogger,\n };\n\n const config = mergeConfig(baseConfig, devServerConfig);\n\n const server = await createServer(config);\n\n await server.listen();\n\n if (printUrls) server.printUrls();\n if (bindCLIShortcuts) server.bindCLIShortcuts({ print: true });\n}\n"],"names":[],"mappings":";;;;;;AAOA,eAAsB,iBACpB,MACA,cACA,gBACA;CACA,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,YAAY,WAAW,qBACrD;CACF,MAAM,OAAO;CAEb,MAAM,UAAU,QAAQ,IAAI;CAE5B,MAAM,qBAAqB,2BAA2B,MAAM,cAAc;CAE1E,MAAM,aAAa,yBAAyB;EAC1C;EACA;EACA;CACF,CAAC;CAOD,MAAM,SAAS,YAAY,YAAY;EAJrC,QAAQ;GAAE;GAAM;GAAM;GAAM;GAAM;EAAW;EAC7C;CAGmD,CAAC;CAEtD,MAAM,SAAS,MAAM,aAAa,MAAM;CAExC,MAAM,OAAO,OAAO;CAEpB,IAAI,WAAW,OAAO,UAAU;CAChC,IAAI,kBAAkB,OAAO,iBAAiB,EAAE,OAAO,KAAK,CAAC;AAC/D","debug_id":"8c6c1a6c-3781-513f-afa0-ab9d74da54d0"}
@@ -0,0 +1,4 @@
1
+ import { t as runConnectStudio } from "./connect-studio-_-O1-oef.mjs";
2
+ export { runConnectStudio };
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="04e35c3d-c3bc-5333-a236-d6f30a73226b")}catch(e){}}();
4
+ //# debugId=04e35c3d-c3bc-5333-a236-d6f30a73226b
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2eb000ae-11e6-56a4-ab3f-b10dbab4f7dd")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7e4199eb-15f3-561d-9772-143c4781e317")}catch(e){}}();
3
3
  import { generateAll } from "@powerhousedao/codegen";
4
4
  import { buildTsMorphProject } from "@powerhousedao/codegen/utils";
5
5
  import { extractAllDocuments, saveSpec } from "@powerhousedao/vetra/codegen";
@@ -26,5 +26,5 @@ async function startGenerateAll(args, projectDir) {
26
26
  //#endregion
27
27
  export { startGenerateAll };
28
28
 
29
- //# sourceMappingURL=generate-all-DrT4ZxHX.mjs.map
30
- //# debugId=2eb000ae-11e6-56a4-ab3f-b10dbab4f7dd
29
+ //# sourceMappingURL=generate-all-CIwP-3aa.mjs.map
30
+ //# debugId=7e4199eb-15f3-561d-9772-143c4781e317
@@ -1 +1 @@
1
- {"version":3,"file":"generate-all-DrT4ZxHX.mjs","sources":["../src/services/generate-all.ts"],"sourcesContent":["import { generateAll } from \"@powerhousedao/codegen\";\nimport { buildTsMorphProject } from \"@powerhousedao/codegen/utils\";\nimport { extractAllDocuments, saveSpec } from \"@powerhousedao/vetra/codegen\";\n\nexport async function startGenerateAll(\n args: { extract?: boolean },\n projectDir: string,\n) {\n const project = buildTsMorphProject(projectDir);\n if (args.extract) {\n const all = extractAllDocuments(project);\n for (const doc of [\n ...all.documentModels,\n ...all.editors,\n ...all.processors,\n ...all.subgraphs,\n ...all.apps,\n ]) {\n const path = await saveSpec(doc, projectDir);\n console.log(`Wrote ${path}`);\n }\n return;\n }\n await generateAll(project);\n await project.save();\n}\n"],"names":[],"mappings":";;;;;;AAIA,eAAsB,iBACpB,MACA,YACA;CACA,MAAM,UAAU,oBAAoB,WAAW;AAC/C,KAAI,KAAK,SAAS;EAChB,MAAM,MAAM,oBAAoB,QAAQ;AACxC,OAAK,MAAM,OAAO;GAChB,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;GACR,EAAE;GACD,MAAM,OAAO,MAAM,SAAS,KAAK,WAAW;AAC5C,WAAQ,IAAI,SAAS,OAAO;;AAE9B;;AAEF,OAAM,YAAY,QAAQ;AAC1B,OAAM,QAAQ,MAAM","debug_id":"2eb000ae-11e6-56a4-ab3f-b10dbab4f7dd"}
1
+ {"version":3,"file":"generate-all-CIwP-3aa.mjs","sources":["../src/services/generate-all.ts"],"sourcesContent":["import { generateAll } from \"@powerhousedao/codegen\";\nimport { buildTsMorphProject } from \"@powerhousedao/codegen/utils\";\nimport { extractAllDocuments, saveSpec } from \"@powerhousedao/vetra/codegen\";\n\nexport async function startGenerateAll(\n args: { extract?: boolean },\n projectDir: string,\n) {\n const project = buildTsMorphProject(projectDir);\n if (args.extract) {\n const all = extractAllDocuments(project);\n for (const doc of [\n ...all.documentModels,\n ...all.editors,\n ...all.processors,\n ...all.subgraphs,\n ...all.apps,\n ]) {\n const path = await saveSpec(doc, projectDir);\n console.log(`Wrote ${path}`);\n }\n return;\n }\n await generateAll(project);\n await project.save();\n}\n"],"names":[],"mappings":";;;;;;AAIA,eAAsB,iBACpB,MACA,YACA;CACA,MAAM,UAAU,oBAAoB,UAAU;CAC9C,IAAI,KAAK,SAAS;EAChB,MAAM,MAAM,oBAAoB,OAAO;EACvC,KAAK,MAAM,OAAO;GAChB,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI;EACT,GAAG;GACD,MAAM,OAAO,MAAM,SAAS,KAAK,UAAU;GAC3C,QAAQ,IAAI,SAAS,MAAM;EAC7B;EACA;CACF;CACA,MAAM,YAAY,OAAO;CACzB,MAAM,QAAQ,KAAK;AACrB","debug_id":"7e4199eb-15f3-561d-9772-143c4781e317"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8a26ffc1-1c2d-5f4a-91a0-d7a95edc34be")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="613319d0-0df7-5cc6-87c6-4630f1ae1bd6")}catch(e){}}();
3
3
  import { dirname } from "node:path";
4
4
  import { generateAllApps, generateApp } from "@powerhousedao/codegen";
5
5
  import { buildTsMorphProject, getAppMetadata } from "@powerhousedao/codegen/utils";
@@ -18,8 +18,10 @@ async function startGenerateApp(args, projectDir) {
18
18
  return;
19
19
  }
20
20
  if (all) await generateAllApps(project);
21
- else if (document) await generateAppFromDocument(await getDocument(document), project);
22
- else if (name) await generateApp({
21
+ else if (document) {
22
+ const doc = await getDocument(document);
23
+ await generateAppFromDocument(doc, project);
24
+ } else if (name) await generateApp({
23
25
  appName: name,
24
26
  allowedDocumentTypes,
25
27
  isDragAndDropEnabled: !disableDragAndDrop
@@ -44,5 +46,5 @@ async function startGenerateApp(args, projectDir) {
44
46
  //#endregion
45
47
  export { startGenerateApp };
46
48
 
47
- //# sourceMappingURL=generate-app-DNNqA-H3.mjs.map
48
- //# debugId=8a26ffc1-1c2d-5f4a-91a0-d7a95edc34be
49
+ //# sourceMappingURL=generate-app-BTs1u-9l.mjs.map
50
+ //# debugId=613319d0-0df7-5cc6-87c6-4630f1ae1bd6
@@ -1 +1 @@
1
- {"version":3,"file":"generate-app-DNNqA-H3.mjs","sources":["../src/services/generate-app.ts"],"sourcesContent":["import { generateAllApps, generateApp } from \"@powerhousedao/codegen\";\nimport {\n buildTsMorphProject,\n getAppMetadata,\n} from \"@powerhousedao/codegen/utils\";\nimport {\n extractAppDocuments,\n generateAppFromDocument,\n getDocument,\n saveSpec,\n} from \"@powerhousedao/vetra/codegen\";\nimport type { AppModuleDocument } from \"@powerhousedao/vetra/document-models/app-module\";\nimport { dirname } from \"node:path\";\nimport type { GenerateAppArgs } from \"../types.js\";\n\nexport async function startGenerateApp(\n args: GenerateAppArgs,\n projectDir: string,\n) {\n const {\n name,\n allowedDocumentTypes = [],\n disableDragAndDrop,\n document,\n dir,\n all,\n extract,\n debug,\n } = args;\n if (debug) {\n console.log({ args });\n }\n const project = buildTsMorphProject(projectDir);\n if (extract) {\n const docs = extractAppDocuments(project);\n for (const doc of docs) {\n const path = await saveSpec(doc, projectDir);\n console.log(`Wrote ${path}`);\n }\n return;\n }\n if (all) {\n await generateAllApps(project);\n } else if (document) {\n const doc = (await getDocument(document)) as AppModuleDocument;\n await generateAppFromDocument(doc, project);\n } else if (name) {\n await generateApp(\n {\n appName: name,\n allowedDocumentTypes,\n isDragAndDropEnabled: !disableDragAndDrop,\n },\n project,\n );\n } else if (dir) {\n const appMetadata = getAppMetadata(project, dirname(dir));\n if (!appMetadata) {\n throw new Error(`Failed to get data for app in dir \"${dir}\"`);\n }\n const {\n name: appName,\n id: appId,\n dirName: appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n } = appMetadata;\n\n await generateApp(\n {\n appName,\n appId,\n appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n },\n project,\n );\n } else {\n console.log(\n \"Please specify one of `name`, `document`, `dir`, `all`, or `extract`.\",\n );\n return;\n }\n await project.save();\n}\n"],"names":[],"mappings":";;;;;;;AAeA,eAAsB,iBACpB,MACA,YACA;CACA,MAAM,EACJ,MACA,uBAAuB,EAAE,EACzB,oBACA,UACA,KACA,KACA,SACA,UACE;AACJ,KAAI,MACF,SAAQ,IAAI,EAAE,MAAM,CAAC;CAEvB,MAAM,UAAU,oBAAoB,WAAW;AAC/C,KAAI,SAAS;EACX,MAAM,OAAO,oBAAoB,QAAQ;AACzC,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,OAAO,MAAM,SAAS,KAAK,WAAW;AAC5C,WAAQ,IAAI,SAAS,OAAO;;AAE9B;;AAEF,KAAI,IACF,OAAM,gBAAgB,QAAQ;UACrB,SAET,OAAM,wBADO,MAAM,YAAY,SAAS,EACL,QAAQ;UAClC,KACT,OAAM,YACJ;EACE,SAAS;EACT;EACA,sBAAsB,CAAC;EACxB,EACD,QACD;UACQ,KAAK;EACd,MAAM,cAAc,eAAe,SAAS,QAAQ,IAAI,CAAC;AACzD,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,sCAAsC,IAAI,GAAG;EAE/D,MAAM,EACJ,MAAM,SACN,IAAI,OACJ,SAAS,YACT,sBACA,yBACE;AAEJ,QAAM,YACJ;GACE;GACA;GACA;GACA;GACA;GACD,EACD,QACD;QACI;AACL,UAAQ,IACN,wEACD;AACD;;AAEF,OAAM,QAAQ,MAAM","debug_id":"8a26ffc1-1c2d-5f4a-91a0-d7a95edc34be"}
1
+ {"version":3,"file":"generate-app-BTs1u-9l.mjs","sources":["../src/services/generate-app.ts"],"sourcesContent":["import { generateAllApps, generateApp } from \"@powerhousedao/codegen\";\nimport {\n buildTsMorphProject,\n getAppMetadata,\n} from \"@powerhousedao/codegen/utils\";\nimport {\n extractAppDocuments,\n generateAppFromDocument,\n getDocument,\n saveSpec,\n} from \"@powerhousedao/vetra/codegen\";\nimport type { AppModuleDocument } from \"@powerhousedao/vetra/document-models/app-module\";\nimport { dirname } from \"node:path\";\nimport type { GenerateAppArgs } from \"../types.js\";\n\nexport async function startGenerateApp(\n args: GenerateAppArgs,\n projectDir: string,\n) {\n const {\n name,\n allowedDocumentTypes = [],\n disableDragAndDrop,\n document,\n dir,\n all,\n extract,\n debug,\n } = args;\n if (debug) {\n console.log({ args });\n }\n const project = buildTsMorphProject(projectDir);\n if (extract) {\n const docs = extractAppDocuments(project);\n for (const doc of docs) {\n const path = await saveSpec(doc, projectDir);\n console.log(`Wrote ${path}`);\n }\n return;\n }\n if (all) {\n await generateAllApps(project);\n } else if (document) {\n const doc = (await getDocument(document)) as AppModuleDocument;\n await generateAppFromDocument(doc, project);\n } else if (name) {\n await generateApp(\n {\n appName: name,\n allowedDocumentTypes,\n isDragAndDropEnabled: !disableDragAndDrop,\n },\n project,\n );\n } else if (dir) {\n const appMetadata = getAppMetadata(project, dirname(dir));\n if (!appMetadata) {\n throw new Error(`Failed to get data for app in dir \"${dir}\"`);\n }\n const {\n name: appName,\n id: appId,\n dirName: appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n } = appMetadata;\n\n await generateApp(\n {\n appName,\n appId,\n appDirName,\n allowedDocumentTypes,\n isDragAndDropEnabled,\n },\n project,\n );\n } else {\n console.log(\n \"Please specify one of `name`, `document`, `dir`, `all`, or `extract`.\",\n );\n return;\n }\n await project.save();\n}\n"],"names":[],"mappings":";;;;;;;AAeA,eAAsB,iBACpB,MACA,YACA;CACA,MAAM,EACJ,MACA,uBAAuB,CAAC,GACxB,oBACA,UACA,KACA,KACA,SACA,UACE;CACJ,IAAI,OACF,QAAQ,IAAI,EAAE,KAAK,CAAC;CAEtB,MAAM,UAAU,oBAAoB,UAAU;CAC9C,IAAI,SAAS;EACX,MAAM,OAAO,oBAAoB,OAAO;EACxC,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,OAAO,MAAM,SAAS,KAAK,UAAU;GAC3C,QAAQ,IAAI,SAAS,MAAM;EAC7B;EACA;CACF;CACA,IAAI,KACF,MAAM,gBAAgB,OAAO;MACxB,IAAI,UAAU;EACnB,MAAM,MAAO,MAAM,YAAY,QAAQ;EACvC,MAAM,wBAAwB,KAAK,OAAO;CAC5C,OAAO,IAAI,MACT,MAAM,YACJ;EACE,SAAS;EACT;EACA,sBAAsB,CAAC;CACzB,GACA,OACF;MACK,IAAI,KAAK;EACd,MAAM,cAAc,eAAe,SAAS,QAAQ,GAAG,CAAC;EACxD,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,sCAAsC,IAAI,EAAE;EAE9D,MAAM,EACJ,MAAM,SACN,IAAI,OACJ,SAAS,YACT,sBACA,yBACE;EAEJ,MAAM,YACJ;GACE;GACA;GACA;GACA;GACA;EACF,GACA,OACF;CACF,OAAO;EACL,QAAQ,IACN,uEACF;EACA;CACF;CACA,MAAM,QAAQ,KAAK;AACrB","debug_id":"613319d0-0df7-5cc6-87c6-4630f1ae1bd6"}