@powerhousedao/builder-tools 6.2.0-dev.5 → 6.2.0-dev.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +45 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +97 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
package/dist/index.d.mts
CHANGED
|
@@ -31,6 +31,7 @@ type IConnectOptions = {
|
|
|
31
31
|
* value in the emitted runtime config.
|
|
32
32
|
*/
|
|
33
33
|
cliPackageRegistryUrl?: string;
|
|
34
|
+
dynamicBase?: boolean;
|
|
34
35
|
};
|
|
35
36
|
type ConnectCommonOptions = {
|
|
36
37
|
base?: string;
|
|
@@ -443,6 +444,49 @@ declare function getConnectHtmlTags(options?: {
|
|
|
443
444
|
}];
|
|
444
445
|
declare function getConnectBaseViteConfig(options: IConnectOptions): InlineConfig;
|
|
445
446
|
//#endregion
|
|
447
|
+
//#region connect-utils/vite-plugins/dynamic-base.d.ts
|
|
448
|
+
/**
|
|
449
|
+
* Placeholder base used when Connect is built in dynamic-base mode. The Vite
|
|
450
|
+
* `base` option is set to this token; this plugin rewrites it in the emitted
|
|
451
|
+
* output so the effective base is resolved at serve time from a global instead
|
|
452
|
+
* of being baked at build time.
|
|
453
|
+
*
|
|
454
|
+
* Trailing slash matches `normalizeBasePath` output, so the token sits in the
|
|
455
|
+
* same syntactic position as a concrete base would.
|
|
456
|
+
*/
|
|
457
|
+
declare const DYNAMIC_BASE_PLACEHOLDER = "/__PH_DYNAMIC_BASE__/";
|
|
458
|
+
/**
|
|
459
|
+
* Rewrites the placeholder base in emitted JS chunks to a runtime expression so
|
|
460
|
+
* one built `dist/connect` serves under any subpath. Rolldown-native: per-match
|
|
461
|
+
* MagicString edits in `renderChunk`, no AST splicing (the SWC byte-offset
|
|
462
|
+
* splicing in vite-plugin-dynamic-base corrupts Rolldown chunks). Each edited
|
|
463
|
+
* chunk returns a hires sourcemap that the bundler composes into the chunk's
|
|
464
|
+
* map chain, so the emitted `.map` files track the rewrite (and the worker
|
|
465
|
+
* prelude's line shift).
|
|
466
|
+
*
|
|
467
|
+
* What gets rewritten in JS, all of which emit the base as a quoted string
|
|
468
|
+
* literal beginning with the placeholder:
|
|
469
|
+
* - asset URLs (`new URL("/__PH_DYNAMIC_BASE__/assets/x.png", ...)`)
|
|
470
|
+
* - dynamic-import / lazy-chunk preload URLs
|
|
471
|
+
* - the inlined `import.meta.env.BASE_URL` (drives Connect's router basename
|
|
472
|
+
* and BASE_URL-relative fetches such as `${BASE_URL}ph-packages.json`)
|
|
473
|
+
*
|
|
474
|
+
* A literal `"/__PH_DYNAMIC_BASE__/foo"` becomes `((globalThis.__PH_DYNAMIC_BASE__||"/")+"foo")`;
|
|
475
|
+
* a bare `"/__PH_DYNAMIC_BASE__/"` (the BASE_URL value) becomes `(globalThis.__PH_DYNAMIC_BASE__||"/")`.
|
|
476
|
+
*
|
|
477
|
+
* HTML is left untouched: the entry `<script>`/`<link>` tags keep the literal
|
|
478
|
+
* placeholder so the proxy substitutes it with the concrete base at serve time
|
|
479
|
+
* (the same proxy also sets the runtime global for the JS rewrite). See the
|
|
480
|
+
* plugin's module doc / report for the exact serve-time contract.
|
|
481
|
+
*
|
|
482
|
+
* CSS `url(...)` references resolve relative to the stylesheet's own URL, so
|
|
483
|
+
* they need no rewrite once the stylesheet itself is loaded from the right
|
|
484
|
+
* prefix (which the HTML substitution handles).
|
|
485
|
+
*/
|
|
486
|
+
declare function connectDynamicBasePlugin(options?: {
|
|
487
|
+
forWorker?: boolean;
|
|
488
|
+
}): Plugin;
|
|
489
|
+
//#endregion
|
|
446
490
|
//#region connect-utils/vite-plugins/ph-config.d.ts
|
|
447
491
|
type PhConfigPluginOptions = {
|
|
448
492
|
packages: PowerhousePackage[];
|
|
@@ -464,5 +508,5 @@ type PhConfigPluginOptions = {
|
|
|
464
508
|
};
|
|
465
509
|
declare function phConfigPlugin(options: PhConfigPluginOptions): Plugin;
|
|
466
510
|
//#endregion
|
|
467
|
-
export { ConnectBuildOptions, ConnectCommonOptions, ConnectPreviewOptions, ConnectStudioOptions, DEFAULT_CONNECT_OUTDIR, EXTERNAL_PACKAGES_IMPORT, IConnectOptions, IMPORT_SCRIPT_FILE, LOCAL_PACKAGE_ID, PH_DIR_NAME, PhConfigPluginOptions, RUNTIME_CONFIG_SCHEMA_ID, RUNTIME_CONFIG_SCHEMA_URL, ViteDevOptions, appendToHtmlHead, backupIndexHtml, copyConnect, ensureNodeVersion, getConnectBaseViteConfig, getConnectHtmlTags, makeImportScriptFromPackages, phConfigPlugin, prependToHtmlHead, readJsonFile, removeBase64EnvValues, resolveConnectBundle, resolveConnectPackageJson, resolveConnectPublicDir, resolvePackage, resolveViteConfigPath, runShellScriptPlugin, runTsc, runtimeConfigSchema, stripVersionFromPackage };
|
|
511
|
+
export { ConnectBuildOptions, ConnectCommonOptions, ConnectPreviewOptions, ConnectStudioOptions, DEFAULT_CONNECT_OUTDIR, DYNAMIC_BASE_PLACEHOLDER, EXTERNAL_PACKAGES_IMPORT, IConnectOptions, IMPORT_SCRIPT_FILE, LOCAL_PACKAGE_ID, PH_DIR_NAME, PhConfigPluginOptions, RUNTIME_CONFIG_SCHEMA_ID, RUNTIME_CONFIG_SCHEMA_URL, ViteDevOptions, appendToHtmlHead, backupIndexHtml, connectDynamicBasePlugin, copyConnect, ensureNodeVersion, getConnectBaseViteConfig, getConnectHtmlTags, makeImportScriptFromPackages, phConfigPlugin, prependToHtmlHead, readJsonFile, removeBase64EnvValues, resolveConnectBundle, resolveConnectPackageJson, resolveConnectPublicDir, resolvePackage, resolveViteConfigPath, runShellScriptPlugin, runTsc, runtimeConfigSchema, stripVersionFromPackage };
|
|
468
512
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../connect-utils/constants.ts","../connect-utils/types.ts","../connect-utils/helpers.ts","../connect-utils/runtime-config-schema.ts","../connect-utils/vite-config.ts","../connect-utils/vite-plugins/ph-config.ts"],"mappings":";;;;;cAAa,wBAAA;AAAA,cACA,kBAAA;AAAA,cACA,gBAAA;AAAA,cACA,WAAA;;;KCCD,eAAA;EACV,IAAA;EACA,OAAA;EACA,MAAA;EACA,gBAAA,GAAmB,gBAAA;EACnB,YAAA;EDTmC;AACrC;;;;;AACA;;;ECiBE,kBAAA,GAAqB,sBAAA;EDjBM;AAC7B;;;;ECsBE,qBAAA;AAAA;AAAA,KAGU,oBAAA;EAEV,IAAA;EAEA,IAAA;EAEA,UAAA;EAEA,WAAA;EAEA,cAAA;EAEA,mBAAA;EAEA,gBAAA;EAEA,sBAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,IAAA,CAC3B,mBAAA;EAEI,KAAA;AAAA;AAAA,KAEM,oBAAA,GAAuB,oBAAA;EACjC,gBAAA,GAAmB,cAAA;EACnB,SAAA;EACA,gBAAA;AAAA;AAAA,KAGU,mBAAA,GAAsB,oBAAA;EAEhC,MAAA;AAAA;AAAA,KAGU,qBAAA,GAAwB,oBAAA,GAClC,IAAA,CAAK,cAAA;EAEH,MAAA;EACA,SAAA;EACA,gBAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../connect-utils/constants.ts","../connect-utils/types.ts","../connect-utils/helpers.ts","../connect-utils/runtime-config-schema.ts","../connect-utils/vite-config.ts","../connect-utils/vite-plugins/dynamic-base.ts","../connect-utils/vite-plugins/ph-config.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import tailwind from "@tailwindcss/vite";
|
|
|
10
10
|
import react from "@vitejs/plugin-react";
|
|
11
11
|
import { createLogger, esmExternalRequirePlugin, loadEnv, searchForWorkspaceRoot } from "vite";
|
|
12
12
|
import { createHtmlPlugin } from "vite-plugin-html";
|
|
13
|
+
import MagicString from "magic-string";
|
|
13
14
|
//#region connect-utils/constants.ts
|
|
14
15
|
const EXTERNAL_PACKAGES_IMPORT = "PH:EXTERNAL_PACKAGES";
|
|
15
16
|
const IMPORT_SCRIPT_FILE = "external-packages.js";
|
|
@@ -330,6 +331,94 @@ function devReactImportmapPlugin() {
|
|
|
330
331
|
};
|
|
331
332
|
}
|
|
332
333
|
//#endregion
|
|
334
|
+
//#region connect-utils/vite-plugins/dynamic-base.ts
|
|
335
|
+
/**
|
|
336
|
+
* Placeholder base used when Connect is built in dynamic-base mode. The Vite
|
|
337
|
+
* `base` option is set to this token; this plugin rewrites it in the emitted
|
|
338
|
+
* output so the effective base is resolved at serve time from a global instead
|
|
339
|
+
* of being baked at build time.
|
|
340
|
+
*
|
|
341
|
+
* Trailing slash matches `normalizeBasePath` output, so the token sits in the
|
|
342
|
+
* same syntactic position as a concrete base would.
|
|
343
|
+
*/
|
|
344
|
+
const DYNAMIC_BASE_PLACEHOLDER = "/__PH_DYNAMIC_BASE__/";
|
|
345
|
+
/**
|
|
346
|
+
* Global the runtime (ph-clint proxy) must set before the entry bundle loads.
|
|
347
|
+
* Value is the normalized deploy base, e.g. "/myagent/" or "/". The JS rewrite
|
|
348
|
+
* below resolves all asset / lazy-chunk / BASE_URL references against it.
|
|
349
|
+
*/
|
|
350
|
+
const RUNTIME_GLOBAL = "globalThis.__PH_DYNAMIC_BASE__";
|
|
351
|
+
const BASE_EXPR = `(${RUNTIME_GLOBAL}||"/")`;
|
|
352
|
+
/**
|
|
353
|
+
* Worker scope has its own global object; the proxy injects the runtime global
|
|
354
|
+
* into the main-thread `<head>` only, so a worker chunk's rewritten references
|
|
355
|
+
* would fall back to "/" and fetch siblings (pglite .data/.wasm) without the
|
|
356
|
+
* deploy prefix. Prepended to worker chunks, this defines the global in worker
|
|
357
|
+
* scope from the worker's own script URL: the worker loads from
|
|
358
|
+
* `<base>assets/<name>-<hash>.js`, so stripping `assets/<file>` off
|
|
359
|
+
* `self.location.pathname` yields the same trailing-slash base the main thread
|
|
360
|
+
* holds ("/myagent/" or "/").
|
|
361
|
+
*/
|
|
362
|
+
const WORKER_PRELUDE = `${RUNTIME_GLOBAL}=self.location.pathname.replace(/assets\\/[^/]*$/,"");\n`;
|
|
363
|
+
const PLACEHOLDER_LITERAL = new RegExp(`(["'\`])${escapeForRegExp(DYNAMIC_BASE_PLACEHOLDER)}((?:(?!\\1)[^$])*)\\1`, "g");
|
|
364
|
+
/**
|
|
365
|
+
* Rewrites the placeholder base in emitted JS chunks to a runtime expression so
|
|
366
|
+
* one built `dist/connect` serves under any subpath. Rolldown-native: per-match
|
|
367
|
+
* MagicString edits in `renderChunk`, no AST splicing (the SWC byte-offset
|
|
368
|
+
* splicing in vite-plugin-dynamic-base corrupts Rolldown chunks). Each edited
|
|
369
|
+
* chunk returns a hires sourcemap that the bundler composes into the chunk's
|
|
370
|
+
* map chain, so the emitted `.map` files track the rewrite (and the worker
|
|
371
|
+
* prelude's line shift).
|
|
372
|
+
*
|
|
373
|
+
* What gets rewritten in JS, all of which emit the base as a quoted string
|
|
374
|
+
* literal beginning with the placeholder:
|
|
375
|
+
* - asset URLs (`new URL("/__PH_DYNAMIC_BASE__/assets/x.png", ...)`)
|
|
376
|
+
* - dynamic-import / lazy-chunk preload URLs
|
|
377
|
+
* - the inlined `import.meta.env.BASE_URL` (drives Connect's router basename
|
|
378
|
+
* and BASE_URL-relative fetches such as `${BASE_URL}ph-packages.json`)
|
|
379
|
+
*
|
|
380
|
+
* A literal `"/__PH_DYNAMIC_BASE__/foo"` becomes `((globalThis.__PH_DYNAMIC_BASE__||"/")+"foo")`;
|
|
381
|
+
* a bare `"/__PH_DYNAMIC_BASE__/"` (the BASE_URL value) becomes `(globalThis.__PH_DYNAMIC_BASE__||"/")`.
|
|
382
|
+
*
|
|
383
|
+
* HTML is left untouched: the entry `<script>`/`<link>` tags keep the literal
|
|
384
|
+
* placeholder so the proxy substitutes it with the concrete base at serve time
|
|
385
|
+
* (the same proxy also sets the runtime global for the JS rewrite). See the
|
|
386
|
+
* plugin's module doc / report for the exact serve-time contract.
|
|
387
|
+
*
|
|
388
|
+
* CSS `url(...)` references resolve relative to the stylesheet's own URL, so
|
|
389
|
+
* they need no rewrite once the stylesheet itself is loaded from the right
|
|
390
|
+
* prefix (which the HTML substitution handles).
|
|
391
|
+
*/
|
|
392
|
+
function connectDynamicBasePlugin(options = {}) {
|
|
393
|
+
return {
|
|
394
|
+
name: "ph-connect-dynamic-base",
|
|
395
|
+
enforce: "post",
|
|
396
|
+
renderChunk(code, chunk) {
|
|
397
|
+
if (!code.includes("/__PH_DYNAMIC_BASE__/")) return null;
|
|
398
|
+
const s = new MagicString(code);
|
|
399
|
+
for (const match of code.matchAll(PLACEHOLDER_LITERAL)) {
|
|
400
|
+
const rest = match[2];
|
|
401
|
+
s.overwrite(match.index, match.index + match[0].length, rest.length === 0 ? BASE_EXPR : `(${BASE_EXPR}+${JSON.stringify(rest)})`);
|
|
402
|
+
}
|
|
403
|
+
if (options.forWorker) {
|
|
404
|
+
s.prepend(WORKER_PRELUDE);
|
|
405
|
+
this.info(`dynamic-base: worker prelude prepended to ${chunk.fileName}`);
|
|
406
|
+
}
|
|
407
|
+
if (!s.hasChanged()) return null;
|
|
408
|
+
return {
|
|
409
|
+
code: s.toString(),
|
|
410
|
+
map: s.generateMap({ hires: true })
|
|
411
|
+
};
|
|
412
|
+
},
|
|
413
|
+
generateBundle(_options, bundle) {
|
|
414
|
+
for (const file of Object.values(bundle)) if ((file.type === "chunk" ? file.code : file.fileName.endsWith(".css") && typeof file.source === "string" ? file.source : void 0)?.includes("/__PH_DYNAMIC_BASE__/")) this.error(`dynamic-base: unrewritten placeholder ${DYNAMIC_BASE_PLACEHOLDER} remains in ${file.fileName}`);
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
function escapeForRegExp(s) {
|
|
419
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
420
|
+
}
|
|
421
|
+
//#endregion
|
|
333
422
|
//#region connect-utils/vite-plugins/favicon.ts
|
|
334
423
|
/**
|
|
335
424
|
* Vite plugin to serve the Connect favicon (icon.ico) from the connect package.
|
|
@@ -670,7 +759,7 @@ function getConnectBaseViteConfig(options) {
|
|
|
670
759
|
return {
|
|
671
760
|
configFile: false,
|
|
672
761
|
mode,
|
|
673
|
-
base: connectBasePath ? normalizeBasePath(connectBasePath) : void 0,
|
|
762
|
+
base: options.dynamicBase ? DYNAMIC_BASE_PLACEHOLDER : connectBasePath ? normalizeBasePath(connectBasePath) : void 0,
|
|
674
763
|
server: {
|
|
675
764
|
watch: { ignored: ["**/backup-documents/**", "**/.ph/**"] },
|
|
676
765
|
fs: { allow: [searchForWorkspaceRoot(options.dirname), ...linkedRoots] }
|
|
@@ -707,13 +796,17 @@ function getConnectBaseViteConfig(options) {
|
|
|
707
796
|
devReactImportmapPlugin(),
|
|
708
797
|
...plugins,
|
|
709
798
|
esmExternalRequirePlugin({ external: reactExternal }),
|
|
710
|
-
connectFaviconPlugin()
|
|
799
|
+
connectFaviconPlugin(),
|
|
800
|
+
...options.dynamicBase ? [connectDynamicBasePlugin()] : []
|
|
711
801
|
],
|
|
712
|
-
worker: {
|
|
802
|
+
worker: {
|
|
803
|
+
format: "es",
|
|
804
|
+
...options.dynamicBase ? { plugins: () => [connectDynamicBasePlugin({ forWorker: true })] } : {}
|
|
805
|
+
},
|
|
713
806
|
build: { sourcemap: true }
|
|
714
807
|
};
|
|
715
808
|
}
|
|
716
809
|
//#endregion
|
|
717
|
-
export { DEFAULT_CONNECT_OUTDIR, EXTERNAL_PACKAGES_IMPORT, IMPORT_SCRIPT_FILE, LOCAL_PACKAGE_ID, PH_DIR_NAME, RUNTIME_CONFIG_SCHEMA_ID, RUNTIME_CONFIG_SCHEMA_URL, appendToHtmlHead, backupIndexHtml, copyConnect, ensureNodeVersion, getConnectBaseViteConfig, getConnectHtmlTags, makeImportScriptFromPackages, phConfigPlugin, prependToHtmlHead, readJsonFile, removeBase64EnvValues, resolveConnectBundle, resolveConnectPackageJson, resolveConnectPublicDir, resolvePackage, resolveViteConfigPath, runShellScriptPlugin, runTsc, runtimeConfigSchema, stripVersionFromPackage };
|
|
810
|
+
export { DEFAULT_CONNECT_OUTDIR, DYNAMIC_BASE_PLACEHOLDER, EXTERNAL_PACKAGES_IMPORT, IMPORT_SCRIPT_FILE, LOCAL_PACKAGE_ID, PH_DIR_NAME, RUNTIME_CONFIG_SCHEMA_ID, RUNTIME_CONFIG_SCHEMA_URL, appendToHtmlHead, backupIndexHtml, connectDynamicBasePlugin, copyConnect, ensureNodeVersion, getConnectBaseViteConfig, getConnectHtmlTags, makeImportScriptFromPackages, phConfigPlugin, prependToHtmlHead, readJsonFile, removeBase64EnvValues, resolveConnectBundle, resolveConnectPackageJson, resolveConnectPublicDir, resolvePackage, resolveViteConfigPath, runShellScriptPlugin, runTsc, runtimeConfigSchema, stripVersionFromPackage };
|
|
718
811
|
|
|
719
812
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../connect-utils/constants.ts","../connect-utils/helpers.ts","../connect-utils/runtime-config-schema.ts","../connect-utils/vite-plugins/dev-external-react.ts","../connect-utils/vite-plugins/favicon.ts","../connect-utils/vite-plugins/ph-bundled-packages.ts","../connect-utils/vite-plugins/ph-config.ts","../connect-utils/vite-config.ts"],"sourcesContent":["export const EXTERNAL_PACKAGES_IMPORT = \"PH:EXTERNAL_PACKAGES\";\nexport const IMPORT_SCRIPT_FILE = \"external-packages.js\";\nexport const LOCAL_PACKAGE_ID = \"ph:local-package\";\nexport const PH_DIR_NAME = \".ph\";\n","import type { PowerhouseConfig } from \"@powerhousedao/config\";\nimport { exec, execSync } from \"node:child_process\";\nimport fs, { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path, { join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport type { Plugin } from \"vite\";\nimport { LOCAL_PACKAGE_ID } from \"./constants.js\";\nimport type { ConnectCommonOptions } from \"./types.js\";\n\nexport const DEFAULT_CONNECT_OUTDIR = \".ph/connect-build/dist/\" as const;\n\nexport function resolveViteConfigPath(\n options: Pick<ConnectCommonOptions, \"projectRoot\" | \"viteConfigFile\">,\n) {\n const { projectRoot = cwd(), viteConfigFile } = options;\n return viteConfigFile || join(projectRoot, \"vite.config.ts\");\n}\n\nexport function resolvePackage(packageName: string, root = process.cwd()) {\n // find connect installation\n const require = createRequire(root);\n return require.resolve(packageName, { paths: [root] });\n}\n\nexport function resolveConnectPackageJson(root = process.cwd()) {\n try {\n const connectPackageJsonPath = resolvePackage(\n \"@powerhousedao/connect/package.json\",\n root,\n );\n const fileContents = fs.readFileSync(connectPackageJsonPath, \"utf-8\");\n return JSON.parse(fileContents) as JSON;\n } catch (error) {\n console.error(`Error reading Connect package.json:`, error);\n return null;\n }\n}\n\n/**\n * Finds the dist dir of Connect on the local machine\n */\nexport function resolveConnectBundle(root = process.cwd()) {\n const connectIndexPath = resolvePackage(\"@powerhousedao/connect\", root);\n const connectRootPath = connectIndexPath.substring(\n 0,\n connectIndexPath.indexOf(\"connect\") + \"connect\".length,\n );\n return join(connectRootPath, \"dist/\");\n}\n\nexport function resolveConnectPublicDir(root = process.cwd()) {\n const connectIconPath = resolvePackage(\n \"@powerhousedao/connect/public/icon.ico\",\n root,\n );\n return path.join(connectIconPath, \"../\");\n}\n\n/**\n * Copies the Connect dist dir to the target path\n */\nexport function copyConnect(sourcePath: string, targetPath: string) {\n try {\n // Ensure targetPath is removed before copying\n fs.rmSync(targetPath, { recursive: true, force: true });\n\n // Copy everything from sourcePath to targetPath\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n } catch (error) {\n console.error(`❌ Error copying ${sourcePath} to ${targetPath}:`, error);\n }\n}\n\n/**\n * Backs up the index.html file\n *\n * Needed when running the Connect Studio dev server on Windows\n */\nexport function backupIndexHtml(appPath: string, restore = false) {\n const filePath = join(appPath, \"index.html\");\n const backupPath = join(appPath, \"index.html.bak\");\n\n const paths = restore ? [backupPath, filePath] : [filePath, backupPath];\n\n if (fs.existsSync(paths[0])) {\n fs.copyFileSync(paths[0], paths[1]);\n }\n}\n\nexport function removeBase64EnvValues(appPath: string) {\n backupIndexHtml(appPath);\n\n const filePath = join(appPath, \"index.html\");\n\n // Read the HTML file\n fs.readFile(filePath, \"utf-8\", (err, data) => {\n if (err) {\n console.error(\"Error reading file:\", err);\n return;\n }\n\n // Use regex to replace the dynamic Base64 values with empty strings\n // TODO is this needed?\n const modifiedData = data\n .replace(\n /\"LOCAL_DOCUMENT_MODELS\":\\s*\".*?\",/,\n `\"LOCAL_DOCUMENT_MODELS\": \"\",`,\n )\n .replace(\n /\"LOCAL_DOCUMENT_EDITORS\":\\s*\".*?\"/,\n `\"LOCAL_DOCUMENT_EDITORS\": \"\"`,\n );\n\n console.log(\"Modified data:\", modifiedData);\n // Write the modified content back to the file\n fs.writeFile(filePath, modifiedData, \"utf-8\", (err) => {\n if (err) {\n console.error(\"Error writing file:\", err);\n return;\n }\n });\n });\n}\n\nexport function readJsonFile(filePath: string): PowerhouseConfig | null {\n try {\n const absolutePath = resolve(filePath);\n const fileContents = fs.readFileSync(absolutePath, \"utf-8\");\n return JSON.parse(fileContents) as PowerhouseConfig;\n } catch (_error) {\n console.error(`Error reading file: ${filePath}`);\n return null;\n }\n}\n\n/**\n * Takes a list of Powerhouse project packages and optionally local Powerhouse packages and outputs a js file which exports those packages for use in Connect Studio.\n */\nexport function makeImportScriptFromPackages(args: {\n packages: string[];\n importStyles?: boolean;\n localJsPath?: string;\n localCssPath?: string;\n}) {\n const { packages, localJsPath, localCssPath, importStyles = true } = args;\n const imports: string[] = [];\n const moduleNames: string[] = [];\n let counter = 0;\n\n for (const packageName of packages) {\n const moduleName = `module${counter}`;\n moduleNames.push(moduleName);\n imports.push(`import * as ${moduleName} from '${packageName}';`);\n if (importStyles) {\n imports.push(`import '${packageName}/style.css';`);\n }\n counter++;\n }\n\n const exports = moduleNames.map(\n (name, index) => `{\n id: \"${packages[index]}\",\n ...${name},\n }`,\n );\n\n const hasModule = localJsPath !== undefined;\n const hasStyles = importStyles && localCssPath !== undefined;\n const hasLocalPackage = hasModule || hasStyles;\n\n if (hasLocalPackage) {\n if (hasStyles) {\n imports.push(`import '${localCssPath}';`);\n }\n if (hasModule) {\n const moduleName = `module${counter}`;\n imports.push(`import * as ${moduleName} from '${localJsPath}';`);\n exports.push(`{\n id: \"${LOCAL_PACKAGE_ID}\",\n ...${moduleName},\n }`);\n }\n }\n const exportsString = exports.length\n ? `\n ${exports.join(\",\\n\")}\n `\n : \"\";\n\n const exportStatement = `export default [${exportsString}];`;\n\n const fileContent = `${imports.join(\"\\n\")}\\n\\n${exportStatement}`;\n\n return fileContent;\n}\n\nexport function ensureNodeVersion(minVersion = \"24\") {\n const version = process.versions.node;\n if (!version) {\n return;\n }\n\n if (version < minVersion) {\n console.error(\n `Node version ${minVersion} or higher is required. Current version: ${version}`,\n );\n process.exit(1);\n }\n}\n\nexport function runShellScriptPlugin(\n scriptName: string,\n connectPath: string,\n): Plugin {\n return {\n name: \"vite-plugin-run-shell-script\",\n buildStart() {\n const scriptPath = join(connectPath, scriptName);\n if (fs.existsSync(scriptPath)) {\n exec(`sh ${scriptPath}`, (error, stdout, stderr) => {\n if (error) {\n console.error(`Error executing the script: ${error.message}`);\n removeBase64EnvValues(connectPath);\n return;\n }\n if (stderr) {\n console.error(stderr);\n }\n });\n }\n },\n };\n}\n\n/**\n * Shared helper to modify the <head> tag of an HTML file by transforming its contents.\n */\nasync function modifyHtmlHead(\n pathToHtml: string,\n contents: string,\n transform: (html: string, contents: string) => string,\n) {\n if (!existsSync(pathToHtml)) {\n throw new Error(`File ${pathToHtml} does not exist.`);\n }\n let html = await readFile(pathToHtml, \"utf8\");\n html = transform(html, contents);\n await writeFile(pathToHtml, html, \"utf8\");\n}\n\n/**\n * Appends the contents to the <head> tag of the index.html file\n */\nexport async function appendToHtmlHead(pathToHtml: string, contents: string) {\n return modifyHtmlHead(pathToHtml, contents, (html, contents) => {\n if (!html.includes(\"</head>\")) {\n throw new Error(\"No </head> tag found in the HTML file.\");\n }\n return html.replace(\"</head>\", `\\n${contents}\\n</head>`);\n });\n}\n\n/**\n * Prepends the contents to the <head> tag of the index.html file\n */\nexport async function prependToHtmlHead(pathToHtml: string, contents: string) {\n return modifyHtmlHead(pathToHtml, contents, (html, contents) => {\n if (!html.includes(\"</head>\")) {\n throw new Error(\"No </head> tag found in the HTML file.\");\n }\n return html.replace(\"<head>\", `<head>\\n${contents}\\n`);\n });\n}\n\nexport function runTsc(outDir: string) {\n execSync(`npx tsc --outDir ${outDir}`, { stdio: \"inherit\" });\n}\n\n// Helper function to remove version suffix from package name\n// Handles formats like: @scope/package@version -> @scope/package\nexport function stripVersionFromPackage(packageName: string): string {\n const trimmed = packageName.trim();\n if (!trimmed) return \"\";\n const lastAtIndex = trimmed.lastIndexOf(\"@\");\n if (lastAtIndex > 0) {\n return trimmed.substring(0, lastAtIndex);\n }\n\n return trimmed;\n}\n","// JSON Schema (draft-07) for dist/powerhouse.config.json — the runtime\n// artifact emitted into the build output and fetched by the Connect SPA at\n// boot.\n//\n// A strict SUBSET of the source PowerhouseConfig schema plus two runtime-only\n// fields (schemaVersion, localPackage). Field shapes shared with the source\n// schema (PowerhousePackage, PHConnectRuntimeConfig) are imported from the\n// shared fragments module so the two schemas stay in sync by construction.\n\nimport {\n phConnectRuntimeConfigSchema,\n powerhousePackageSchema,\n} from \"@powerhousedao/shared/connect\";\n\nexport const RUNTIME_CONFIG_SCHEMA_ID =\n \"https://powerhouse.inc/schemas/powerhouse.config.json\";\n\n// GitHub-hosted schema URL. Points at the JSON artifact committed alongside\n// this TS module. Currently tracks the `main` branch — schema edits go live\n// for editors as soon as they merge. Migrate to a `schema-v<N>` tag pinned\n// to schemaVersion if/when stability across edits becomes a concern.\nexport const RUNTIME_CONFIG_SCHEMA_URL =\n \"https://raw.githubusercontent.com/powerhouse-inc/powerhouse/main/packages/builder-tools/connect-utils/runtime-config.schema.json\";\n\nexport const runtimeConfigSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n $id: RUNTIME_CONFIG_SCHEMA_ID,\n title: \"Powerhouse Connect runtime configuration\",\n description:\n \"Runtime configuration loaded by Connect at boot from /powerhouse.config.json.\",\n type: \"object\",\n additionalProperties: false,\n required: [\"schemaVersion\", \"packages\", \"localPackage\"],\n properties: {\n $schema: {\n type: \"string\",\n description:\n \"Optional JSON Schema reference for editor autocomplete. Set to the GitHub-hosted schema URL.\",\n },\n schemaVersion: {\n const: 2,\n description:\n \"Schema version. Must match the SPA bundle that ships with this dist. The SPA throws on mismatch to prevent SPA/config skew.\",\n },\n packages: {\n type: \"array\",\n description:\n \"Powerhouse packages this Connect instance loads at runtime.\",\n items: powerhousePackageSchema,\n },\n packageRegistryUrl: {\n type: \"string\",\n description:\n \"Project-wide package registry endpoint. Copied verbatim from the source `powerhouse.config.json` top-level field — the SPA's Package Manager UI reads this directly.\",\n },\n localPackage: {\n description:\n \"Identity of the consumer project itself, captured at build time. null for Docker images and other generic deploys with no host project.\",\n oneOf: [\n { type: \"null\" },\n {\n type: \"object\",\n additionalProperties: false,\n required: [\"name\", \"version\"],\n properties: {\n name: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n ],\n },\n connect: phConnectRuntimeConfigSchema,\n },\n} as const;\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nconst REACT_DEPS = [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react/jsx-dev-runtime\",\n \"react-dom/client\",\n];\n\nconst SHIM_PATH = \"__ph/dev-react-shim/\";\nconst VITE_DEPS_PATH = \"node_modules/.vite/deps\";\n\n// Vite serves dev module URLs under the resolved `base`. Join base + path\n// while collapsing the double slash so `base: \"/\"` stays byte-identical.\nfunction withBase(base: string, p: string): string {\n return `${base}${p}`.replace(/\\/{2,}/g, \"/\");\n}\n\n/**\n * Dev-only sibling of `esmExternalRequirePlugin`. The build path externalizes\n * React via Rolldown so an importmap hands the same React instance to both\n * Connect and CDN-served editor packages. Rolldown plugins don't run in\n * `vite createServer`, and Vite's pre-bundled CJS deps only expose a `default`\n * export — so a CDN editor that does `import { lazy } from \"react\"` would\n * fail with \"no named export 'lazy'\".\n *\n * This plugin:\n * 1. Forces React into `optimizeDeps.include` so the optimizer always knows\n * about it.\n * 2. Serves a shim per React module at a stable URL. Each shim imports\n * from Vite's live pre-bundled URL (sharing Connect's React instance)\n * and re-exports React's named members so editors importing\n * `{ lazy }`, `{ jsx }`, etc. work.\n * 3. Rewrites the page importmap to point at those shim URLs.\n */\nexport function devReactImportmapPlugin(): Plugin {\n let namedExports = new Map<string, string[]>();\n let base = \"/\";\n\n return {\n name: \"ph-dev-react-importmap\",\n apply: \"serve\",\n config: () => ({ optimizeDeps: { include: REACT_DEPS } }),\n configResolved(config) {\n base = config.base;\n },\n configureServer(server) {\n // Resolve React's named exports from the consumer project so we don't\n // hardcode lists that drift across React versions.\n const requireFromRoot = createRequire(\n path.join(server.config.root, \"package.json\"),\n );\n namedExports = new Map(\n REACT_DEPS.map((id) => {\n try {\n const mod = requireFromRoot(id) as Record<string, unknown>;\n return [id, Object.keys(mod).filter((k) => k !== \"default\")];\n } catch {\n return [id, []];\n }\n }),\n );\n\n // Match the base-prefixed shim URL, and the bare path for robustness.\n const shimPrefixes = [withBase(base, SHIM_PATH), `/${SHIM_PATH}`];\n server.middlewares.use((req, res, next) => {\n const prefix = shimPrefixes.find((p) => req.url?.startsWith(p));\n if (!prefix) return next();\n const id = req.url!.slice(prefix.length).replace(/\\.js(\\?.*)?$/, \"\");\n if (!REACT_DEPS.includes(id)) return next();\n\n const optimizer = server.environments.client.depsOptimizer;\n const info =\n optimizer?.metadata.optimized[id] ??\n optimizer?.metadata.discovered[id];\n if (!optimizer || !info) {\n res.statusCode = 404;\n res.end();\n return;\n }\n\n const browserHash = info.browserHash ?? optimizer.metadata.browserHash;\n const depUrl = `${withBase(base, VITE_DEPS_PATH)}/${path.basename(info.file)}?v=${browserHash}`;\n const names = namedExports.get(id) ?? [];\n\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(\n `import * as M from ${JSON.stringify(depUrl)};\\n` +\n `const ns = M.default ?? M;\\n` +\n `export default ns;\\n` +\n (names.length\n ? `export const { ${names.join(\", \")} } = ns;\\n`\n : \"\"),\n );\n });\n },\n transformIndexHtml: {\n order: \"post\",\n handler(html, ctx) {\n const browserHash =\n ctx.server?.environments.client.depsOptimizer?.metadata.browserHash;\n if (!browserHash) return;\n const shimPrefix = withBase(base, SHIM_PATH);\n const imports = Object.fromEntries(\n REACT_DEPS.map((id) => [\n id,\n `${shimPrefix}${id}.js?v=${browserHash}`,\n ]),\n );\n return html.replace(\n /<script type=\"importmap\">[\\s\\S]*?<\\/script>/,\n `<script type=\"importmap\">${JSON.stringify({ imports }, null, 2)}</script>`,\n );\n },\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport type { Connect, Plugin } from \"vite\";\n\n/**\n * Vite plugin to serve the Connect favicon (icon.ico) from the connect package.\n * This ensures the favicon is available in development and included in the production build.\n */\nexport function connectFaviconPlugin(): Plugin {\n return {\n name: \"copy-connect-favicon\",\n configureServer(server) {\n // Vite rewrites the favicon link against `base`, so serve the\n // base-prefixed path. Keep the bare path for robustness.\n const base = server.config.base;\n const faviconPath = `${base}icon.ico`.replace(/\\/{2,}/g, \"/\");\n const handler: Connect.NextHandleFunction = (_req, res, next) => {\n server.pluginContainer\n .resolveId(\"@powerhousedao/connect/assets/icon.ico\")\n .then((resolved) => {\n if (!resolved) return next();\n res.setHeader(\"Content-Type\", \"image/x-icon\");\n res.end(readFileSync(resolved.id));\n })\n .catch(() => next());\n };\n // Mount on the exact route(s) so the handler only runs for icon.ico.\n // Connect strips the mount prefix before matching, so mounting on\n // \"/icon.ico\" matches that path exactly.\n const paths = new Set([faviconPath, \"/icon.ico\"]);\n for (const path of paths) {\n server.middlewares.use(path, handler);\n }\n },\n async generateBundle(_options, bundle) {\n try {\n if (\"icon.ico\" in bundle) return;\n const resolved = await this.resolve(\n \"@powerhousedao/connect/assets/icon.ico\",\n );\n if (!resolved) return;\n this.emitFile({\n type: \"asset\",\n fileName: \"icon.ico\",\n source: readFileSync(resolved.id),\n });\n } catch {\n // connect package not found, skip favicon\n }\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nexport type PhBundledPackagesPluginOptions = {\n /**\n * Package names (with `provider: \"local\"` in powerhouse.config.json)\n * that should be bundled into Connect at build time. Each must be\n * resolvable from node_modules.\n */\n packages: string[];\n /** Project root used to read each bundled package's package.json version. */\n projectRoot?: string;\n};\n\nconst VIRTUAL_ID = \"ph-bundled-packages-virtual\";\nconst RESOLVED_VIRTUAL_ID = \"\\0virtual:\" + VIRTUAL_ID;\n\nfunction readBundledPackageVersion(\n projectRoot: string,\n name: string,\n): string | undefined {\n try {\n const raw = fs.readFileSync(\n path.join(projectRoot, \"node_modules\", name, \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(raw) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction makeRegisterModule(packages: string[], projectRoot: string): string {\n if (packages.length === 0) {\n return \"export default () => {};\\n\";\n }\n const imports: string[] = [];\n const calls: string[] = [];\n\n packages.forEach((name, i) => {\n const moduleName = `pkg${i}`;\n const version = readBundledPackageVersion(projectRoot, name);\n imports.push(`import * as ${moduleName} from ${JSON.stringify(name)};`);\n imports.push(`import ${JSON.stringify(`${name}/style.css`)};`);\n calls.push(\n ` pm.addLocalPackage(${JSON.stringify(name)}, ${moduleName}, ${JSON.stringify(version)});`,\n );\n });\n\n return `${imports.join(\"\\n\")}\\n\\nexport default function register(pm) {\\n${calls.join(\"\\n\")}\\n};\\n`;\n}\n\n/**\n * Emits a virtual module `ph-bundled-packages-virtual` whose default export\n * is a `register(packageManager)` function. When called at runtime (from\n * Connect's bootstrap), it registers each bundled package with the package\n * manager the same way Common/Vetra are registered — meaning they work\n * offline without the registry being reachable.\n *\n * When the list is empty, the module exports a no-op function so Connect's\n * bootstrap code can always import it unconditionally.\n */\nexport function phBundledPackagesPlugin(\n options: PhBundledPackagesPluginOptions,\n): Plugin {\n const projectRoot = options.projectRoot ?? process.cwd();\n const moduleSource = makeRegisterModule(options.packages, projectRoot);\n\n return {\n name: \"vite-plugin-ph-bundled-packages\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_VIRTUAL_ID;\n },\n load(id) {\n if (id === RESOLVED_VIRTUAL_ID) return moduleSource;\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport type { PowerhousePackage } from \"@powerhousedao/config\";\nimport type { PHConnectRuntimeConfig } from \"@powerhousedao/shared/clis\";\nimport {\n buildRuntimeConfig,\n DEFAULT_CONNECT_CONFIG,\n deepMerge,\n} from \"@powerhousedao/shared/connect\";\nimport { RUNTIME_CONFIG_SCHEMA_URL } from \"../runtime-config-schema.js\";\n\nexport type PhConfigPluginOptions = {\n packages: PowerhousePackage[];\n projectRoot?: string;\n connect?: PHConnectRuntimeConfig;\n /**\n * Project-wide package registry URL — the effective value (CLI override\n * `??` source) the caller has already resolved. Copied verbatim into the\n * emitted runtime config (no namespace change); the SPA reads\n * `runtimeConfig.packageRegistryUrl` directly.\n */\n packageRegistryUrl?: string;\n /**\n * CLI-supplied connect override (final merge layer, beats source).\n * Forwarded from `ph connect build`'s `--json` + individual `--flag` parsing.\n * See clis/ph-cli/src/utils/cli-connect-override.ts.\n */\n cliConnectOverride?: PHConnectRuntimeConfig;\n};\n\nfunction readProjectPackageInfo(\n projectRoot: string | undefined,\n): { name: string; version: string } | null {\n if (!projectRoot) return null;\n try {\n const raw = fs.readFileSync(\n path.join(projectRoot, \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(raw) as { name?: unknown; version?: unknown };\n if (typeof pkg.name !== \"string\" || typeof pkg.version !== \"string\") {\n return null;\n }\n return { name: pkg.name, version: pkg.version };\n } catch {\n return null;\n }\n}\n\nexport function phConfigPlugin(options: PhConfigPluginOptions): Plugin {\n const projectRoot = options.projectRoot ?? process.cwd();\n const localPackage = readProjectPackageInfo(projectRoot);\n\n // Precedence ladder (lowest → highest) for the emitted connect.* block:\n // DEFAULT_CONNECT_CONFIG (base — fills in any field nothing else supplied)\n // < source.connect (user's hand-edited powerhouse.config.json)\n // < cliConnectOverride (`ph connect build --json` + individual flags)\n //\n // Env vars are NOT a layer in this ladder. The Connect SPA's runtime\n // configuration is exclusively set via `powerhouse.config.json` or CLI\n // overrides (`ph connect build --<field>` / `ph connect config --<field>`).\n const sourceConnect = options.connect ?? {};\n const withDefaults = deepMerge(DEFAULT_CONNECT_CONFIG, sourceConnect);\n const mergedConnect = options.cliConnectOverride\n ? deepMerge(withDefaults, options.cliConnectOverride)\n : withDefaults;\n const source = {\n packages: options.packages,\n packageRegistryUrl: options.packageRegistryUrl,\n connect: mergedConnect,\n };\n\n const runtimeConfig = buildRuntimeConfig(source, localPackage);\n const content = JSON.stringify(\n { $schema: RUNTIME_CONFIG_SCHEMA_URL, ...runtimeConfig },\n null,\n 2,\n );\n\n return {\n name: \"vite-plugin-ph-config\",\n configureServer(server) {\n server.middlewares.use((req, res, next) => {\n if (req.url?.endsWith(\"/powerhouse.config.json\")) {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(content);\n return;\n }\n next();\n });\n },\n hotUpdate: {\n order: \"pre\",\n handler(ctx) {\n return ctx.modules.filter((mod) => {\n if (mod.importers.size > 1) {\n return true;\n }\n const importer = mod.importers.values().next();\n return !importer.value?.file?.endsWith(\".css\");\n });\n },\n },\n generateBundle() {\n this.emitFile({\n type: \"asset\",\n fileName: \"powerhouse.config.json\",\n source: content,\n });\n },\n };\n}\n","import type { PowerhouseConfig } from \"@powerhousedao/config\";\nimport { getConfig } from \"@powerhousedao/config/node\";\nimport {\n loadConnectEnv,\n normalizeBasePath,\n setConnectEnv,\n} from \"@powerhousedao/shared/connect\";\nimport tailwind from \"@tailwindcss/vite\";\nimport react from \"@vitejs/plugin-react\";\nimport { realpathSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n createLogger,\n esmExternalRequirePlugin,\n loadEnv,\n searchForWorkspaceRoot,\n type HtmlTagDescriptor,\n type InlineConfig,\n type PluginOption,\n} from \"vite\";\nimport { createHtmlPlugin } from \"vite-plugin-html\";\nimport type { IConnectOptions } from \"./types.js\";\nimport { devReactImportmapPlugin } from \"./vite-plugins/dev-external-react.js\";\nimport { connectFaviconPlugin } from \"./vite-plugins/favicon.js\";\nimport { phBundledPackagesPlugin } from \"./vite-plugins/ph-bundled-packages.js\";\nimport { phConfigPlugin } from \"./vite-plugins/ph-config.js\";\n\nconst REACT_VERSION = \"19.2.0\";\n\n// Importmap injected into Connect's HTML in production builds. The build\n// pipeline externalizes react/react-dom via Rolldown's\n// `esmExternalRequirePlugin` (see below), so the browser resolves bare\n// `react` imports through this map → CDN editor packages and Connect share\n// the same React instance via esm.sh. In dev, `devReactImportmapPlugin`\n// rewrites this map to point at Vite's pre-bundled React instead.\nconst REACT_IMPORTMAP_IMPORTS: Record<string, string> = {\n react: `https://esm.sh/react@${REACT_VERSION}`,\n \"react/\": `https://esm.sh/react@${REACT_VERSION}/`,\n \"react-dom\": `https://esm.sh/react-dom@${REACT_VERSION}`,\n \"react-dom/\": `https://esm.sh/react-dom@${REACT_VERSION}/`,\n};\n\nexport function getConnectHtmlTags(\n options: {\n registryUrl?: string | null;\n injectTo?: HtmlTagDescriptor[\"injectTo\"];\n } = {},\n) {\n const { registryUrl, injectTo = \"head\" } = options;\n return [\n {\n tag: \"meta\",\n attrs: {\n \"http-equiv\": \"Content-Security-Policy\",\n content: `script-src 'self' 'unsafe-inline' 'unsafe-eval' https://esm.sh${registryUrl ? \" \" + registryUrl : \"\"}; worker-src 'self' blob:; object-src 'none'; base-uri 'self';`,\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:title\",\n content: \"Connect\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:type\",\n content: \"website\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:url\",\n content: \"https://apps.powerhouse.io/powerhouse/connect/\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:description\",\n content:\n \"Navigate your organisation’s toughest operational challenges and steer your contributors to success with Connect. A navigation, collaboration and reporting tool for decentralised and open organisation.\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:image\",\n content:\n \"https://cf-ipfs.com/ipfs/bafkreigrmclndf2jpbolaq22535q2sw5t44uad3az3dpvkzrnt4lpjt63e\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:card\",\n content: \"summary_large_image\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:image\",\n content:\n \"https://cf-ipfs.com/ipfs/bafkreigrmclndf2jpbolaq22535q2sw5t44uad3az3dpvkzrnt4lpjt63e\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:title\",\n content: \"Connect\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:description\",\n content:\n \"Navigate your organisation’s toughest operational challenges and steer your contributors to success with Connect. A navigation, collaboration and reporting tool for decentralised and open organisation.\",\n },\n injectTo,\n },\n ] as const satisfies HtmlTagDescriptor[];\n}\n\nfunction viteLogger({\n silence,\n}: {\n silence?: { warnings?: string[]; errors?: string[] };\n}) {\n const logger = createLogger();\n const loggerWarn = logger.warn.bind(logger);\n const loggerError = logger.error.bind(logger);\n\n logger.warn = (msg, options) => {\n if (silence?.warnings?.some((warning) => msg.includes(warning))) {\n return;\n }\n loggerWarn(msg, options);\n };\n\n logger.error = (msg, options) => {\n if (silence?.errors?.some((error) => msg.includes(error))) {\n return;\n }\n loggerError(msg, options);\n };\n\n return logger;\n}\n\nfunction parsePackagesEnvOverride(phPackagesStr: string) {\n return phPackagesStr\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n .map((entry) => {\n const lastAt = entry.lastIndexOf(\"@\");\n if (lastAt > 0) {\n return {\n packageName: entry.slice(0, lastAt),\n version: entry.slice(lastAt + 1),\n provider: \"registry\" as const,\n };\n }\n return { packageName: entry, provider: \"registry\" as const };\n });\n}\n\nfunction getLocalPackageNamesFromPowerhouseConfig({\n packages,\n}: PowerhouseConfig) {\n if (!packages) return [];\n return packages\n .filter((p) => p.provider === \"local\")\n .map((p) => p.packageName);\n}\n\nexport function getConnectBaseViteConfig(options: IConnectOptions) {\n const mode = options.mode;\n const envDir = options.envDir ?? options.dirname;\n const fileEnv = loadEnv(mode, envDir, \"PH_\");\n\n // Load and validate environment with priority: process.env > fileEnv > defaults\n const env = loadConnectEnv({\n processEnv: process.env,\n fileEnv,\n });\n\n // set the resolved env to process.env so it's loaded by vite\n setConnectEnv(env);\n\n // Source config is always the project-root powerhouse.config.json.\n const phConfigPath = join(options.dirname, \"powerhouse.config.json\");\n\n const phConfig = options.powerhouseConfig ?? getConfig(phConfigPath);\n\n const packagesFromConfig = phConfig.packages ?? [];\n const localPackagesFromConfig =\n getLocalPackageNamesFromPowerhouseConfig(phConfig);\n const phPackagesStr = env.PH_PACKAGES;\n const envPhPackages = phPackagesStr\n ? parsePackagesEnvOverride(phPackagesStr)\n : undefined;\n\n const phPackages = envPhPackages ?? packagesFromConfig;\n\n // Precedence (highest → lowest): `ph connect build --packages-registry`\n // CLI override > source-config `packageRegistryUrl`. The resolved value\n // flows both into the CSP header (script-src allowance for the registry\n // CDN) and into the emitted runtime config so the SPA reads the same\n // value.\n const phPackageRegistryUrl =\n options.cliPackageRegistryUrl ?? phConfig.packageRegistryUrl ?? null;\n\n // Base path is a runtime-config field (connect.app.basePath), not an env\n // var. Resolve it with the same precedence as the rest of the connect\n // config: CLI override > source powerhouse.config.json.\n const connectBasePath =\n options.cliConnectOverride?.app?.basePath ??\n phConfig.connect?.app?.basePath;\n\n const authToken = env.PH_SENTRY_AUTH_TOKEN;\n const org = env.PH_SENTRY_ORG;\n const project = env.PH_SENTRY_PROJECT;\n // Release tag derived from the workspace version so it matches the\n // sourcemap upload tag CI uses.\n const release =\n process.env.WORKSPACE_VERSION ??\n process.env.npm_package_version ??\n env.PH_CONNECT_VERSION;\n const uploadSentrySourcemaps = authToken && org && project;\n\n const connectHtmlTags = getConnectHtmlTags({\n registryUrl: phPackageRegistryUrl,\n });\n\n const plugins: PluginOption[] = [\n tailwind(),\n react(),\n createHtmlPlugin({\n minify: false,\n inject: {\n tags: [\n ...connectHtmlTags,\n {\n tag: \"script\",\n attrs: { type: \"importmap\" },\n children: JSON.stringify(\n { imports: REACT_IMPORTMAP_IMPORTS },\n null,\n 2,\n ),\n injectTo: \"head-prepend\",\n },\n ],\n },\n }),\n ] as const;\n\n if (uploadSentrySourcemaps) {\n plugins.push(\n import(\"@sentry/vite-plugin\").then(({ sentryVitePlugin }) =>\n sentryVitePlugin({\n release: {\n name: release ?? \"unknown\",\n inject: false, // prevent it from injecting the release id in the service worker code, this is done in 'src/app/sentry.ts' instead\n },\n authToken,\n org,\n project,\n bundleSizeOptimizations: {\n excludeDebugStatements: true,\n },\n reactComponentAnnotation: {\n enabled: true,\n },\n }),\n ) as PluginOption,\n );\n }\n\n // hide warnings unless LOG_LEVEL is set to debug, or the source config\n // declares connect.app.logLevel = \"debug\"\n const isDebug =\n process.env.LOG_LEVEL === \"debug\" ||\n phConfig.connect?.app?.logLevel === \"debug\";\n const customLogger = isDebug\n ? undefined\n : viteLogger({\n silence: {\n warnings: [\n \"@import must precede all other statements (besides @charset or empty @layer)\", // tailwindcss error when importing font file\n ],\n errors: [\"Unterminated string literal\"],\n },\n });\n\n const reactExternal = [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react-dom/client\",\n ];\n\n // pnpm `link:` deps (e.g. a downstream project linking @powerhousedao/*\n // packages from a sibling monorepo checkout) live outside Vite's\n // auto-detected workspace root. Their `node_modules/.pnpm/...` assets\n // then 403 through `/@fs/`, returning a 760-byte HTML body where the\n // binary should be — which breaks PGlite at startup with \"Invalid FS\n // bundle size: 760 !== 4939170\". Resolve key linked packages back to\n // their real workspace roots and allow Vite to serve from there.\n const linkedRoots = [\n \"@powerhousedao/reactor-browser\",\n \"@powerhousedao/connect\",\n \"@electric-sql/pglite\",\n ]\n .map((pkg) => {\n try {\n return searchForWorkspaceRoot(\n realpathSync(join(options.dirname, \"node_modules\", pkg)),\n );\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p !== null);\n\n const config: InlineConfig = {\n configFile: false,\n mode,\n // Prefix served/built asset URLs so Connect can run under a path prefix\n // (reverse proxy). Mirrors the client router basename; normalize so a bare\n // `app` or `/app` becomes `/app/` and matches the router.\n base: connectBasePath ? normalizeBasePath(connectBasePath) : undefined,\n server: {\n watch: {\n ignored: [\"**/backup-documents/**\", \"**/.ph/**\"],\n },\n fs: {\n allow: [searchForWorkspaceRoot(options.dirname), ...linkedRoots],\n },\n },\n resolve: {\n dedupe: [\"react\", \"react-dom\"],\n tsconfigPaths: true,\n },\n define: {\n PH_CONNECT_SENTRY_RELEASE: JSON.stringify(release || \"unknown\"),\n },\n customLogger,\n envPrefix: [\"PH_CONNECT_\"],\n optimizeDeps: {\n include: [\n \"document-model\",\n \"zod\",\n \"@powerhousedao/design-system/connect\",\n \"@powerhousedao/reactor-browser\",\n \"@powerhousedao/document-engineering\",\n ],\n exclude: [\"@electric-sql/pglite\", \"@electric-sql/pglite-tools\"],\n },\n plugins: [\n // phConfigPlugin must be registered before tailwind so its hotUpdate\n // hook runs first and can suppress HMR updates for codegen-generated\n // files, preventing tailwind from triggering full page reloads.\n phConfigPlugin({\n packages: phPackages,\n projectRoot: options.dirname,\n connect: phConfig.connect,\n packageRegistryUrl: phPackageRegistryUrl ?? undefined,\n cliConnectOverride: options.cliConnectOverride,\n }),\n phBundledPackagesPlugin({\n packages: localPackagesFromConfig,\n projectRoot: options.dirname,\n }),\n // Dev-only: rewrite the importmap so it points at Vite's pre-bundled\n // React (the same URL Connect's own modules resolve to). Without this,\n // CDN editors load React from esm.sh while Connect uses Vite's local\n // copy → two React instances → useSyncExternalStore crash. The build\n // path stays untouched; `esmExternalRequirePlugin` below still owns it.\n devReactImportmapPlugin(),\n ...plugins,\n // Externalize React so both Connect and dynamically loaded registry\n // packages share the same React instance via the import map in index.html.\n // Without this, Vite bundles React into Connect's chunks while registry\n // packages resolve React from the import map (esm.sh), creating two\n // separate React instances that don't share context/state.\n //\n // In Vite 8 (Rolldown), require() calls for external modules are preserved\n // as-is, which fails in browsers. esmExternalRequirePlugin handles both\n // externalization AND converting require() to import statements.\n // NOTE: Do NOT also list these in build.rolldownOptions.external — overlapping\n // entries prevent the plugin from transforming require() calls.\n esmExternalRequirePlugin({ external: reactExternal }),\n connectFaviconPlugin(),\n ],\n worker: {\n format: \"es\",\n },\n build: {\n sourcemap: true,\n },\n };\n return config;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../connect-utils/constants.ts","../connect-utils/helpers.ts","../connect-utils/runtime-config-schema.ts","../connect-utils/vite-plugins/dev-external-react.ts","../connect-utils/vite-plugins/dynamic-base.ts","../connect-utils/vite-plugins/favicon.ts","../connect-utils/vite-plugins/ph-bundled-packages.ts","../connect-utils/vite-plugins/ph-config.ts","../connect-utils/vite-config.ts"],"sourcesContent":["export const EXTERNAL_PACKAGES_IMPORT = \"PH:EXTERNAL_PACKAGES\";\nexport const IMPORT_SCRIPT_FILE = \"external-packages.js\";\nexport const LOCAL_PACKAGE_ID = \"ph:local-package\";\nexport const PH_DIR_NAME = \".ph\";\n","import type { PowerhouseConfig } from \"@powerhousedao/config\";\nimport { exec, execSync } from \"node:child_process\";\nimport fs, { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path, { join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport type { Plugin } from \"vite\";\nimport { LOCAL_PACKAGE_ID } from \"./constants.js\";\nimport type { ConnectCommonOptions } from \"./types.js\";\n\nexport const DEFAULT_CONNECT_OUTDIR = \".ph/connect-build/dist/\" as const;\n\nexport function resolveViteConfigPath(\n options: Pick<ConnectCommonOptions, \"projectRoot\" | \"viteConfigFile\">,\n) {\n const { projectRoot = cwd(), viteConfigFile } = options;\n return viteConfigFile || join(projectRoot, \"vite.config.ts\");\n}\n\nexport function resolvePackage(packageName: string, root = process.cwd()) {\n // find connect installation\n const require = createRequire(root);\n return require.resolve(packageName, { paths: [root] });\n}\n\nexport function resolveConnectPackageJson(root = process.cwd()) {\n try {\n const connectPackageJsonPath = resolvePackage(\n \"@powerhousedao/connect/package.json\",\n root,\n );\n const fileContents = fs.readFileSync(connectPackageJsonPath, \"utf-8\");\n return JSON.parse(fileContents) as JSON;\n } catch (error) {\n console.error(`Error reading Connect package.json:`, error);\n return null;\n }\n}\n\n/**\n * Finds the dist dir of Connect on the local machine\n */\nexport function resolveConnectBundle(root = process.cwd()) {\n const connectIndexPath = resolvePackage(\"@powerhousedao/connect\", root);\n const connectRootPath = connectIndexPath.substring(\n 0,\n connectIndexPath.indexOf(\"connect\") + \"connect\".length,\n );\n return join(connectRootPath, \"dist/\");\n}\n\nexport function resolveConnectPublicDir(root = process.cwd()) {\n const connectIconPath = resolvePackage(\n \"@powerhousedao/connect/public/icon.ico\",\n root,\n );\n return path.join(connectIconPath, \"../\");\n}\n\n/**\n * Copies the Connect dist dir to the target path\n */\nexport function copyConnect(sourcePath: string, targetPath: string) {\n try {\n // Ensure targetPath is removed before copying\n fs.rmSync(targetPath, { recursive: true, force: true });\n\n // Copy everything from sourcePath to targetPath\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n } catch (error) {\n console.error(`❌ Error copying ${sourcePath} to ${targetPath}:`, error);\n }\n}\n\n/**\n * Backs up the index.html file\n *\n * Needed when running the Connect Studio dev server on Windows\n */\nexport function backupIndexHtml(appPath: string, restore = false) {\n const filePath = join(appPath, \"index.html\");\n const backupPath = join(appPath, \"index.html.bak\");\n\n const paths = restore ? [backupPath, filePath] : [filePath, backupPath];\n\n if (fs.existsSync(paths[0])) {\n fs.copyFileSync(paths[0], paths[1]);\n }\n}\n\nexport function removeBase64EnvValues(appPath: string) {\n backupIndexHtml(appPath);\n\n const filePath = join(appPath, \"index.html\");\n\n // Read the HTML file\n fs.readFile(filePath, \"utf-8\", (err, data) => {\n if (err) {\n console.error(\"Error reading file:\", err);\n return;\n }\n\n // Use regex to replace the dynamic Base64 values with empty strings\n // TODO is this needed?\n const modifiedData = data\n .replace(\n /\"LOCAL_DOCUMENT_MODELS\":\\s*\".*?\",/,\n `\"LOCAL_DOCUMENT_MODELS\": \"\",`,\n )\n .replace(\n /\"LOCAL_DOCUMENT_EDITORS\":\\s*\".*?\"/,\n `\"LOCAL_DOCUMENT_EDITORS\": \"\"`,\n );\n\n console.log(\"Modified data:\", modifiedData);\n // Write the modified content back to the file\n fs.writeFile(filePath, modifiedData, \"utf-8\", (err) => {\n if (err) {\n console.error(\"Error writing file:\", err);\n return;\n }\n });\n });\n}\n\nexport function readJsonFile(filePath: string): PowerhouseConfig | null {\n try {\n const absolutePath = resolve(filePath);\n const fileContents = fs.readFileSync(absolutePath, \"utf-8\");\n return JSON.parse(fileContents) as PowerhouseConfig;\n } catch (_error) {\n console.error(`Error reading file: ${filePath}`);\n return null;\n }\n}\n\n/**\n * Takes a list of Powerhouse project packages and optionally local Powerhouse packages and outputs a js file which exports those packages for use in Connect Studio.\n */\nexport function makeImportScriptFromPackages(args: {\n packages: string[];\n importStyles?: boolean;\n localJsPath?: string;\n localCssPath?: string;\n}) {\n const { packages, localJsPath, localCssPath, importStyles = true } = args;\n const imports: string[] = [];\n const moduleNames: string[] = [];\n let counter = 0;\n\n for (const packageName of packages) {\n const moduleName = `module${counter}`;\n moduleNames.push(moduleName);\n imports.push(`import * as ${moduleName} from '${packageName}';`);\n if (importStyles) {\n imports.push(`import '${packageName}/style.css';`);\n }\n counter++;\n }\n\n const exports = moduleNames.map(\n (name, index) => `{\n id: \"${packages[index]}\",\n ...${name},\n }`,\n );\n\n const hasModule = localJsPath !== undefined;\n const hasStyles = importStyles && localCssPath !== undefined;\n const hasLocalPackage = hasModule || hasStyles;\n\n if (hasLocalPackage) {\n if (hasStyles) {\n imports.push(`import '${localCssPath}';`);\n }\n if (hasModule) {\n const moduleName = `module${counter}`;\n imports.push(`import * as ${moduleName} from '${localJsPath}';`);\n exports.push(`{\n id: \"${LOCAL_PACKAGE_ID}\",\n ...${moduleName},\n }`);\n }\n }\n const exportsString = exports.length\n ? `\n ${exports.join(\",\\n\")}\n `\n : \"\";\n\n const exportStatement = `export default [${exportsString}];`;\n\n const fileContent = `${imports.join(\"\\n\")}\\n\\n${exportStatement}`;\n\n return fileContent;\n}\n\nexport function ensureNodeVersion(minVersion = \"24\") {\n const version = process.versions.node;\n if (!version) {\n return;\n }\n\n if (version < minVersion) {\n console.error(\n `Node version ${minVersion} or higher is required. Current version: ${version}`,\n );\n process.exit(1);\n }\n}\n\nexport function runShellScriptPlugin(\n scriptName: string,\n connectPath: string,\n): Plugin {\n return {\n name: \"vite-plugin-run-shell-script\",\n buildStart() {\n const scriptPath = join(connectPath, scriptName);\n if (fs.existsSync(scriptPath)) {\n exec(`sh ${scriptPath}`, (error, stdout, stderr) => {\n if (error) {\n console.error(`Error executing the script: ${error.message}`);\n removeBase64EnvValues(connectPath);\n return;\n }\n if (stderr) {\n console.error(stderr);\n }\n });\n }\n },\n };\n}\n\n/**\n * Shared helper to modify the <head> tag of an HTML file by transforming its contents.\n */\nasync function modifyHtmlHead(\n pathToHtml: string,\n contents: string,\n transform: (html: string, contents: string) => string,\n) {\n if (!existsSync(pathToHtml)) {\n throw new Error(`File ${pathToHtml} does not exist.`);\n }\n let html = await readFile(pathToHtml, \"utf8\");\n html = transform(html, contents);\n await writeFile(pathToHtml, html, \"utf8\");\n}\n\n/**\n * Appends the contents to the <head> tag of the index.html file\n */\nexport async function appendToHtmlHead(pathToHtml: string, contents: string) {\n return modifyHtmlHead(pathToHtml, contents, (html, contents) => {\n if (!html.includes(\"</head>\")) {\n throw new Error(\"No </head> tag found in the HTML file.\");\n }\n return html.replace(\"</head>\", `\\n${contents}\\n</head>`);\n });\n}\n\n/**\n * Prepends the contents to the <head> tag of the index.html file\n */\nexport async function prependToHtmlHead(pathToHtml: string, contents: string) {\n return modifyHtmlHead(pathToHtml, contents, (html, contents) => {\n if (!html.includes(\"</head>\")) {\n throw new Error(\"No </head> tag found in the HTML file.\");\n }\n return html.replace(\"<head>\", `<head>\\n${contents}\\n`);\n });\n}\n\nexport function runTsc(outDir: string) {\n execSync(`npx tsc --outDir ${outDir}`, { stdio: \"inherit\" });\n}\n\n// Helper function to remove version suffix from package name\n// Handles formats like: @scope/package@version -> @scope/package\nexport function stripVersionFromPackage(packageName: string): string {\n const trimmed = packageName.trim();\n if (!trimmed) return \"\";\n const lastAtIndex = trimmed.lastIndexOf(\"@\");\n if (lastAtIndex > 0) {\n return trimmed.substring(0, lastAtIndex);\n }\n\n return trimmed;\n}\n","// JSON Schema (draft-07) for dist/powerhouse.config.json — the runtime\n// artifact emitted into the build output and fetched by the Connect SPA at\n// boot.\n//\n// A strict SUBSET of the source PowerhouseConfig schema plus two runtime-only\n// fields (schemaVersion, localPackage). Field shapes shared with the source\n// schema (PowerhousePackage, PHConnectRuntimeConfig) are imported from the\n// shared fragments module so the two schemas stay in sync by construction.\n\nimport {\n phConnectRuntimeConfigSchema,\n powerhousePackageSchema,\n} from \"@powerhousedao/shared/connect\";\n\nexport const RUNTIME_CONFIG_SCHEMA_ID =\n \"https://powerhouse.inc/schemas/powerhouse.config.json\";\n\n// GitHub-hosted schema URL. Points at the JSON artifact committed alongside\n// this TS module. Currently tracks the `main` branch — schema edits go live\n// for editors as soon as they merge. Migrate to a `schema-v<N>` tag pinned\n// to schemaVersion if/when stability across edits becomes a concern.\nexport const RUNTIME_CONFIG_SCHEMA_URL =\n \"https://raw.githubusercontent.com/powerhouse-inc/powerhouse/main/packages/builder-tools/connect-utils/runtime-config.schema.json\";\n\nexport const runtimeConfigSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n $id: RUNTIME_CONFIG_SCHEMA_ID,\n title: \"Powerhouse Connect runtime configuration\",\n description:\n \"Runtime configuration loaded by Connect at boot from /powerhouse.config.json.\",\n type: \"object\",\n additionalProperties: false,\n required: [\"schemaVersion\", \"packages\", \"localPackage\"],\n properties: {\n $schema: {\n type: \"string\",\n description:\n \"Optional JSON Schema reference for editor autocomplete. Set to the GitHub-hosted schema URL.\",\n },\n schemaVersion: {\n const: 2,\n description:\n \"Schema version. Must match the SPA bundle that ships with this dist. The SPA throws on mismatch to prevent SPA/config skew.\",\n },\n packages: {\n type: \"array\",\n description:\n \"Powerhouse packages this Connect instance loads at runtime.\",\n items: powerhousePackageSchema,\n },\n packageRegistryUrl: {\n type: \"string\",\n description:\n \"Project-wide package registry endpoint. Copied verbatim from the source `powerhouse.config.json` top-level field — the SPA's Package Manager UI reads this directly.\",\n },\n localPackage: {\n description:\n \"Identity of the consumer project itself, captured at build time. null for Docker images and other generic deploys with no host project.\",\n oneOf: [\n { type: \"null\" },\n {\n type: \"object\",\n additionalProperties: false,\n required: [\"name\", \"version\"],\n properties: {\n name: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n ],\n },\n connect: phConnectRuntimeConfigSchema,\n },\n} as const;\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nconst REACT_DEPS = [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react/jsx-dev-runtime\",\n \"react-dom/client\",\n];\n\nconst SHIM_PATH = \"__ph/dev-react-shim/\";\nconst VITE_DEPS_PATH = \"node_modules/.vite/deps\";\n\n// Vite serves dev module URLs under the resolved `base`. Join base + path\n// while collapsing the double slash so `base: \"/\"` stays byte-identical.\nfunction withBase(base: string, p: string): string {\n return `${base}${p}`.replace(/\\/{2,}/g, \"/\");\n}\n\n/**\n * Dev-only sibling of `esmExternalRequirePlugin`. The build path externalizes\n * React via Rolldown so an importmap hands the same React instance to both\n * Connect and CDN-served editor packages. Rolldown plugins don't run in\n * `vite createServer`, and Vite's pre-bundled CJS deps only expose a `default`\n * export — so a CDN editor that does `import { lazy } from \"react\"` would\n * fail with \"no named export 'lazy'\".\n *\n * This plugin:\n * 1. Forces React into `optimizeDeps.include` so the optimizer always knows\n * about it.\n * 2. Serves a shim per React module at a stable URL. Each shim imports\n * from Vite's live pre-bundled URL (sharing Connect's React instance)\n * and re-exports React's named members so editors importing\n * `{ lazy }`, `{ jsx }`, etc. work.\n * 3. Rewrites the page importmap to point at those shim URLs.\n */\nexport function devReactImportmapPlugin(): Plugin {\n let namedExports = new Map<string, string[]>();\n let base = \"/\";\n\n return {\n name: \"ph-dev-react-importmap\",\n apply: \"serve\",\n config: () => ({ optimizeDeps: { include: REACT_DEPS } }),\n configResolved(config) {\n base = config.base;\n },\n configureServer(server) {\n // Resolve React's named exports from the consumer project so we don't\n // hardcode lists that drift across React versions.\n const requireFromRoot = createRequire(\n path.join(server.config.root, \"package.json\"),\n );\n namedExports = new Map(\n REACT_DEPS.map((id) => {\n try {\n const mod = requireFromRoot(id) as Record<string, unknown>;\n return [id, Object.keys(mod).filter((k) => k !== \"default\")];\n } catch {\n return [id, []];\n }\n }),\n );\n\n // Match the base-prefixed shim URL, and the bare path for robustness.\n const shimPrefixes = [withBase(base, SHIM_PATH), `/${SHIM_PATH}`];\n server.middlewares.use((req, res, next) => {\n const prefix = shimPrefixes.find((p) => req.url?.startsWith(p));\n if (!prefix) return next();\n const id = req.url!.slice(prefix.length).replace(/\\.js(\\?.*)?$/, \"\");\n if (!REACT_DEPS.includes(id)) return next();\n\n const optimizer = server.environments.client.depsOptimizer;\n const info =\n optimizer?.metadata.optimized[id] ??\n optimizer?.metadata.discovered[id];\n if (!optimizer || !info) {\n res.statusCode = 404;\n res.end();\n return;\n }\n\n const browserHash = info.browserHash ?? optimizer.metadata.browserHash;\n const depUrl = `${withBase(base, VITE_DEPS_PATH)}/${path.basename(info.file)}?v=${browserHash}`;\n const names = namedExports.get(id) ?? [];\n\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(\n `import * as M from ${JSON.stringify(depUrl)};\\n` +\n `const ns = M.default ?? M;\\n` +\n `export default ns;\\n` +\n (names.length\n ? `export const { ${names.join(\", \")} } = ns;\\n`\n : \"\"),\n );\n });\n },\n transformIndexHtml: {\n order: \"post\",\n handler(html, ctx) {\n const browserHash =\n ctx.server?.environments.client.depsOptimizer?.metadata.browserHash;\n if (!browserHash) return;\n const shimPrefix = withBase(base, SHIM_PATH);\n const imports = Object.fromEntries(\n REACT_DEPS.map((id) => [\n id,\n `${shimPrefix}${id}.js?v=${browserHash}`,\n ]),\n );\n return html.replace(\n /<script type=\"importmap\">[\\s\\S]*?<\\/script>/,\n `<script type=\"importmap\">${JSON.stringify({ imports }, null, 2)}</script>`,\n );\n },\n },\n };\n}\n","import MagicString from \"magic-string\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Placeholder base used when Connect is built in dynamic-base mode. The Vite\n * `base` option is set to this token; this plugin rewrites it in the emitted\n * output so the effective base is resolved at serve time from a global instead\n * of being baked at build time.\n *\n * Trailing slash matches `normalizeBasePath` output, so the token sits in the\n * same syntactic position as a concrete base would.\n */\nexport const DYNAMIC_BASE_PLACEHOLDER = \"/__PH_DYNAMIC_BASE__/\";\n\n/**\n * Global the runtime (ph-clint proxy) must set before the entry bundle loads.\n * Value is the normalized deploy base, e.g. \"/myagent/\" or \"/\". The JS rewrite\n * below resolves all asset / lazy-chunk / BASE_URL references against it.\n */\nconst RUNTIME_GLOBAL = \"globalThis.__PH_DYNAMIC_BASE__\";\n\n// `(globalThis.__PH_DYNAMIC_BASE__||\"/\")` — used everywhere the placeholder\n// base prefix appears in emitted JS.\nconst BASE_EXPR = `(${RUNTIME_GLOBAL}||\"/\")`;\n\n/**\n * Worker scope has its own global object; the proxy injects the runtime global\n * into the main-thread `<head>` only, so a worker chunk's rewritten references\n * would fall back to \"/\" and fetch siblings (pglite .data/.wasm) without the\n * deploy prefix. Prepended to worker chunks, this defines the global in worker\n * scope from the worker's own script URL: the worker loads from\n * `<base>assets/<name>-<hash>.js`, so stripping `assets/<file>` off\n * `self.location.pathname` yields the same trailing-slash base the main thread\n * holds (\"/myagent/\" or \"/\").\n */\nconst WORKER_PRELUDE = `${RUNTIME_GLOBAL}=self.location.pathname.replace(/assets\\\\/[^/]*$/,\"\");\\n`;\n\n// Match a string literal whose content STARTS with the placeholder, in any of\n// the three JS quote styles Rolldown emits (double, single, backtick). Group 1\n// captures the opening quote; the closing quote must be the same character\n// (backreference), so a double-quoted literal may contain ' or ` and vice\n// versa. Group 2 captures the literal text after the placeholder up to the\n// closing quote. Rolldown emits the base both as a bare literal (the inlined\n// BASE_URL) and as a `<base>`+suffix (preload/asset URL prefix); both start at\n// the placeholder. The content stops at `$`, so a template literal that\n// interpolates after the token (`` `<token>...${expr}` ``) is NOT rewritten —\n// the residual-token assertion in `generateBundle` fails the build instead of\n// shipping the raw placeholder.\nconst PLACEHOLDER_LITERAL = new RegExp(\n `([\"'\\`])${escapeForRegExp(DYNAMIC_BASE_PLACEHOLDER)}((?:(?!\\\\1)[^$])*)\\\\1`,\n \"g\",\n);\n\n/**\n * Rewrites the placeholder base in emitted JS chunks to a runtime expression so\n * one built `dist/connect` serves under any subpath. Rolldown-native: per-match\n * MagicString edits in `renderChunk`, no AST splicing (the SWC byte-offset\n * splicing in vite-plugin-dynamic-base corrupts Rolldown chunks). Each edited\n * chunk returns a hires sourcemap that the bundler composes into the chunk's\n * map chain, so the emitted `.map` files track the rewrite (and the worker\n * prelude's line shift).\n *\n * What gets rewritten in JS, all of which emit the base as a quoted string\n * literal beginning with the placeholder:\n * - asset URLs (`new URL(\"/__PH_DYNAMIC_BASE__/assets/x.png\", ...)`)\n * - dynamic-import / lazy-chunk preload URLs\n * - the inlined `import.meta.env.BASE_URL` (drives Connect's router basename\n * and BASE_URL-relative fetches such as `${BASE_URL}ph-packages.json`)\n *\n * A literal `\"/__PH_DYNAMIC_BASE__/foo\"` becomes `((globalThis.__PH_DYNAMIC_BASE__||\"/\")+\"foo\")`;\n * a bare `\"/__PH_DYNAMIC_BASE__/\"` (the BASE_URL value) becomes `(globalThis.__PH_DYNAMIC_BASE__||\"/\")`.\n *\n * HTML is left untouched: the entry `<script>`/`<link>` tags keep the literal\n * placeholder so the proxy substitutes it with the concrete base at serve time\n * (the same proxy also sets the runtime global for the JS rewrite). See the\n * plugin's module doc / report for the exact serve-time contract.\n *\n * CSS `url(...)` references resolve relative to the stylesheet's own URL, so\n * they need no rewrite once the stylesheet itself is loaded from the right\n * prefix (which the HTML substitution handles).\n */\nexport function connectDynamicBasePlugin(\n options: { forWorker?: boolean } = {},\n): Plugin {\n return {\n name: \"ph-connect-dynamic-base\",\n enforce: \"post\",\n renderChunk(code, chunk) {\n if (!code.includes(DYNAMIC_BASE_PLACEHOLDER)) return null;\n\n const s = new MagicString(code);\n for (const match of code.matchAll(PLACEHOLDER_LITERAL)) {\n const rest = match[2];\n s.overwrite(\n match.index,\n match.index + match[0].length,\n rest.length === 0\n ? BASE_EXPR\n : `(${BASE_EXPR}+${JSON.stringify(rest)})`,\n );\n }\n\n // Worker chunks run in their own global scope where the proxy never\n // sets the runtime global; derive it from the worker's script URL so\n // the rewritten references above resolve against the deploy base.\n if (options.forWorker) {\n s.prepend(WORKER_PRELUDE);\n this.info(\n `dynamic-base: worker prelude prepended to ${chunk.fileName}`,\n );\n }\n\n if (!s.hasChanged()) return null;\n return { code: s.toString(), map: s.generateMap({ hires: true }) };\n },\n generateBundle(_options, bundle) {\n // A residual token in JS (a literal the regex couldn't rewrite, e.g. a\n // template interpolating after the token) or CSS (url() must stay\n // stylesheet-relative; the placeholder would ship verbatim and 404)\n // would fail silently at runtime — fail the build instead. HTML keeps\n // the token by design: the proxy substitutes it at serve time.\n for (const file of Object.values(bundle)) {\n const content =\n file.type === \"chunk\"\n ? file.code\n : file.fileName.endsWith(\".css\") && typeof file.source === \"string\"\n ? file.source\n : undefined;\n if (content?.includes(DYNAMIC_BASE_PLACEHOLDER)) {\n this.error(\n `dynamic-base: unrewritten placeholder ${DYNAMIC_BASE_PLACEHOLDER} remains in ${file.fileName}`,\n );\n }\n }\n },\n };\n}\n\nfunction escapeForRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { readFileSync } from \"node:fs\";\nimport type { Connect, Plugin } from \"vite\";\n\n/**\n * Vite plugin to serve the Connect favicon (icon.ico) from the connect package.\n * This ensures the favicon is available in development and included in the production build.\n */\nexport function connectFaviconPlugin(): Plugin {\n return {\n name: \"copy-connect-favicon\",\n configureServer(server) {\n // Vite rewrites the favicon link against `base`, so serve the\n // base-prefixed path. Keep the bare path for robustness.\n const base = server.config.base;\n const faviconPath = `${base}icon.ico`.replace(/\\/{2,}/g, \"/\");\n const handler: Connect.NextHandleFunction = (_req, res, next) => {\n server.pluginContainer\n .resolveId(\"@powerhousedao/connect/assets/icon.ico\")\n .then((resolved) => {\n if (!resolved) return next();\n res.setHeader(\"Content-Type\", \"image/x-icon\");\n res.end(readFileSync(resolved.id));\n })\n .catch(() => next());\n };\n // Mount on the exact route(s) so the handler only runs for icon.ico.\n // Connect strips the mount prefix before matching, so mounting on\n // \"/icon.ico\" matches that path exactly.\n const paths = new Set([faviconPath, \"/icon.ico\"]);\n for (const path of paths) {\n server.middlewares.use(path, handler);\n }\n },\n async generateBundle(_options, bundle) {\n try {\n if (\"icon.ico\" in bundle) return;\n const resolved = await this.resolve(\n \"@powerhousedao/connect/assets/icon.ico\",\n );\n if (!resolved) return;\n this.emitFile({\n type: \"asset\",\n fileName: \"icon.ico\",\n source: readFileSync(resolved.id),\n });\n } catch {\n // connect package not found, skip favicon\n }\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nexport type PhBundledPackagesPluginOptions = {\n /**\n * Package names (with `provider: \"local\"` in powerhouse.config.json)\n * that should be bundled into Connect at build time. Each must be\n * resolvable from node_modules.\n */\n packages: string[];\n /** Project root used to read each bundled package's package.json version. */\n projectRoot?: string;\n};\n\nconst VIRTUAL_ID = \"ph-bundled-packages-virtual\";\nconst RESOLVED_VIRTUAL_ID = \"\\0virtual:\" + VIRTUAL_ID;\n\nfunction readBundledPackageVersion(\n projectRoot: string,\n name: string,\n): string | undefined {\n try {\n const raw = fs.readFileSync(\n path.join(projectRoot, \"node_modules\", name, \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(raw) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction makeRegisterModule(packages: string[], projectRoot: string): string {\n if (packages.length === 0) {\n return \"export default () => {};\\n\";\n }\n const imports: string[] = [];\n const calls: string[] = [];\n\n packages.forEach((name, i) => {\n const moduleName = `pkg${i}`;\n const version = readBundledPackageVersion(projectRoot, name);\n imports.push(`import * as ${moduleName} from ${JSON.stringify(name)};`);\n imports.push(`import ${JSON.stringify(`${name}/style.css`)};`);\n calls.push(\n ` pm.addLocalPackage(${JSON.stringify(name)}, ${moduleName}, ${JSON.stringify(version)});`,\n );\n });\n\n return `${imports.join(\"\\n\")}\\n\\nexport default function register(pm) {\\n${calls.join(\"\\n\")}\\n};\\n`;\n}\n\n/**\n * Emits a virtual module `ph-bundled-packages-virtual` whose default export\n * is a `register(packageManager)` function. When called at runtime (from\n * Connect's bootstrap), it registers each bundled package with the package\n * manager the same way Common/Vetra are registered — meaning they work\n * offline without the registry being reachable.\n *\n * When the list is empty, the module exports a no-op function so Connect's\n * bootstrap code can always import it unconditionally.\n */\nexport function phBundledPackagesPlugin(\n options: PhBundledPackagesPluginOptions,\n): Plugin {\n const projectRoot = options.projectRoot ?? process.cwd();\n const moduleSource = makeRegisterModule(options.packages, projectRoot);\n\n return {\n name: \"vite-plugin-ph-bundled-packages\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_VIRTUAL_ID;\n },\n load(id) {\n if (id === RESOLVED_VIRTUAL_ID) return moduleSource;\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport type { PowerhousePackage } from \"@powerhousedao/config\";\nimport type { PHConnectRuntimeConfig } from \"@powerhousedao/shared/clis\";\nimport {\n buildRuntimeConfig,\n DEFAULT_CONNECT_CONFIG,\n deepMerge,\n} from \"@powerhousedao/shared/connect\";\nimport { RUNTIME_CONFIG_SCHEMA_URL } from \"../runtime-config-schema.js\";\n\nexport type PhConfigPluginOptions = {\n packages: PowerhousePackage[];\n projectRoot?: string;\n connect?: PHConnectRuntimeConfig;\n /**\n * Project-wide package registry URL — the effective value (CLI override\n * `??` source) the caller has already resolved. Copied verbatim into the\n * emitted runtime config (no namespace change); the SPA reads\n * `runtimeConfig.packageRegistryUrl` directly.\n */\n packageRegistryUrl?: string;\n /**\n * CLI-supplied connect override (final merge layer, beats source).\n * Forwarded from `ph connect build`'s `--json` + individual `--flag` parsing.\n * See clis/ph-cli/src/utils/cli-connect-override.ts.\n */\n cliConnectOverride?: PHConnectRuntimeConfig;\n};\n\nfunction readProjectPackageInfo(\n projectRoot: string | undefined,\n): { name: string; version: string } | null {\n if (!projectRoot) return null;\n try {\n const raw = fs.readFileSync(\n path.join(projectRoot, \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(raw) as { name?: unknown; version?: unknown };\n if (typeof pkg.name !== \"string\" || typeof pkg.version !== \"string\") {\n return null;\n }\n return { name: pkg.name, version: pkg.version };\n } catch {\n return null;\n }\n}\n\nexport function phConfigPlugin(options: PhConfigPluginOptions): Plugin {\n const projectRoot = options.projectRoot ?? process.cwd();\n const localPackage = readProjectPackageInfo(projectRoot);\n\n // Precedence ladder (lowest → highest) for the emitted connect.* block:\n // DEFAULT_CONNECT_CONFIG (base — fills in any field nothing else supplied)\n // < source.connect (user's hand-edited powerhouse.config.json)\n // < cliConnectOverride (`ph connect build --json` + individual flags)\n //\n // Env vars are NOT a layer in this ladder. The Connect SPA's runtime\n // configuration is exclusively set via `powerhouse.config.json` or CLI\n // overrides (`ph connect build --<field>` / `ph connect config --<field>`).\n const sourceConnect = options.connect ?? {};\n const withDefaults = deepMerge(DEFAULT_CONNECT_CONFIG, sourceConnect);\n const mergedConnect = options.cliConnectOverride\n ? deepMerge(withDefaults, options.cliConnectOverride)\n : withDefaults;\n const source = {\n packages: options.packages,\n packageRegistryUrl: options.packageRegistryUrl,\n connect: mergedConnect,\n };\n\n const runtimeConfig = buildRuntimeConfig(source, localPackage);\n const content = JSON.stringify(\n { $schema: RUNTIME_CONFIG_SCHEMA_URL, ...runtimeConfig },\n null,\n 2,\n );\n\n return {\n name: \"vite-plugin-ph-config\",\n configureServer(server) {\n server.middlewares.use((req, res, next) => {\n if (req.url?.endsWith(\"/powerhouse.config.json\")) {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(content);\n return;\n }\n next();\n });\n },\n hotUpdate: {\n order: \"pre\",\n handler(ctx) {\n return ctx.modules.filter((mod) => {\n if (mod.importers.size > 1) {\n return true;\n }\n const importer = mod.importers.values().next();\n return !importer.value?.file?.endsWith(\".css\");\n });\n },\n },\n generateBundle() {\n this.emitFile({\n type: \"asset\",\n fileName: \"powerhouse.config.json\",\n source: content,\n });\n },\n };\n}\n","import type { PowerhouseConfig } from \"@powerhousedao/config\";\nimport { getConfig } from \"@powerhousedao/config/node\";\nimport {\n loadConnectEnv,\n normalizeBasePath,\n setConnectEnv,\n} from \"@powerhousedao/shared/connect\";\nimport tailwind from \"@tailwindcss/vite\";\nimport react from \"@vitejs/plugin-react\";\nimport { realpathSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n createLogger,\n esmExternalRequirePlugin,\n loadEnv,\n searchForWorkspaceRoot,\n type HtmlTagDescriptor,\n type InlineConfig,\n type PluginOption,\n} from \"vite\";\nimport { createHtmlPlugin } from \"vite-plugin-html\";\nimport type { IConnectOptions } from \"./types.js\";\nimport { devReactImportmapPlugin } from \"./vite-plugins/dev-external-react.js\";\nimport {\n connectDynamicBasePlugin,\n DYNAMIC_BASE_PLACEHOLDER,\n} from \"./vite-plugins/dynamic-base.js\";\nimport { connectFaviconPlugin } from \"./vite-plugins/favicon.js\";\nimport { phBundledPackagesPlugin } from \"./vite-plugins/ph-bundled-packages.js\";\nimport { phConfigPlugin } from \"./vite-plugins/ph-config.js\";\n\nconst REACT_VERSION = \"19.2.0\";\n\n// Importmap injected into Connect's HTML in production builds. The build\n// pipeline externalizes react/react-dom via Rolldown's\n// `esmExternalRequirePlugin` (see below), so the browser resolves bare\n// `react` imports through this map → CDN editor packages and Connect share\n// the same React instance via esm.sh. In dev, `devReactImportmapPlugin`\n// rewrites this map to point at Vite's pre-bundled React instead.\nconst REACT_IMPORTMAP_IMPORTS: Record<string, string> = {\n react: `https://esm.sh/react@${REACT_VERSION}`,\n \"react/\": `https://esm.sh/react@${REACT_VERSION}/`,\n \"react-dom\": `https://esm.sh/react-dom@${REACT_VERSION}`,\n \"react-dom/\": `https://esm.sh/react-dom@${REACT_VERSION}/`,\n};\n\nexport function getConnectHtmlTags(\n options: {\n registryUrl?: string | null;\n injectTo?: HtmlTagDescriptor[\"injectTo\"];\n } = {},\n) {\n const { registryUrl, injectTo = \"head\" } = options;\n return [\n {\n tag: \"meta\",\n attrs: {\n \"http-equiv\": \"Content-Security-Policy\",\n content: `script-src 'self' 'unsafe-inline' 'unsafe-eval' https://esm.sh${registryUrl ? \" \" + registryUrl : \"\"}; worker-src 'self' blob:; object-src 'none'; base-uri 'self';`,\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:title\",\n content: \"Connect\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:type\",\n content: \"website\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:url\",\n content: \"https://apps.powerhouse.io/powerhouse/connect/\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:description\",\n content:\n \"Navigate your organisation’s toughest operational challenges and steer your contributors to success with Connect. A navigation, collaboration and reporting tool for decentralised and open organisation.\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n property: \"og:image\",\n content:\n \"https://cf-ipfs.com/ipfs/bafkreigrmclndf2jpbolaq22535q2sw5t44uad3az3dpvkzrnt4lpjt63e\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:card\",\n content: \"summary_large_image\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:image\",\n content:\n \"https://cf-ipfs.com/ipfs/bafkreigrmclndf2jpbolaq22535q2sw5t44uad3az3dpvkzrnt4lpjt63e\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:title\",\n content: \"Connect\",\n },\n injectTo,\n },\n {\n tag: \"meta\",\n attrs: {\n name: \"twitter:description\",\n content:\n \"Navigate your organisation’s toughest operational challenges and steer your contributors to success with Connect. A navigation, collaboration and reporting tool for decentralised and open organisation.\",\n },\n injectTo,\n },\n ] as const satisfies HtmlTagDescriptor[];\n}\n\nfunction viteLogger({\n silence,\n}: {\n silence?: { warnings?: string[]; errors?: string[] };\n}) {\n const logger = createLogger();\n const loggerWarn = logger.warn.bind(logger);\n const loggerError = logger.error.bind(logger);\n\n logger.warn = (msg, options) => {\n if (silence?.warnings?.some((warning) => msg.includes(warning))) {\n return;\n }\n loggerWarn(msg, options);\n };\n\n logger.error = (msg, options) => {\n if (silence?.errors?.some((error) => msg.includes(error))) {\n return;\n }\n loggerError(msg, options);\n };\n\n return logger;\n}\n\nfunction parsePackagesEnvOverride(phPackagesStr: string) {\n return phPackagesStr\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n .map((entry) => {\n const lastAt = entry.lastIndexOf(\"@\");\n if (lastAt > 0) {\n return {\n packageName: entry.slice(0, lastAt),\n version: entry.slice(lastAt + 1),\n provider: \"registry\" as const,\n };\n }\n return { packageName: entry, provider: \"registry\" as const };\n });\n}\n\nfunction getLocalPackageNamesFromPowerhouseConfig({\n packages,\n}: PowerhouseConfig) {\n if (!packages) return [];\n return packages\n .filter((p) => p.provider === \"local\")\n .map((p) => p.packageName);\n}\n\nexport function getConnectBaseViteConfig(options: IConnectOptions) {\n const mode = options.mode;\n const envDir = options.envDir ?? options.dirname;\n const fileEnv = loadEnv(mode, envDir, \"PH_\");\n\n // Load and validate environment with priority: process.env > fileEnv > defaults\n const env = loadConnectEnv({\n processEnv: process.env,\n fileEnv,\n });\n\n // set the resolved env to process.env so it's loaded by vite\n setConnectEnv(env);\n\n // Source config is always the project-root powerhouse.config.json.\n const phConfigPath = join(options.dirname, \"powerhouse.config.json\");\n\n const phConfig = options.powerhouseConfig ?? getConfig(phConfigPath);\n\n const packagesFromConfig = phConfig.packages ?? [];\n const localPackagesFromConfig =\n getLocalPackageNamesFromPowerhouseConfig(phConfig);\n const phPackagesStr = env.PH_PACKAGES;\n const envPhPackages = phPackagesStr\n ? parsePackagesEnvOverride(phPackagesStr)\n : undefined;\n\n const phPackages = envPhPackages ?? packagesFromConfig;\n\n // Precedence (highest → lowest): `ph connect build --packages-registry`\n // CLI override > source-config `packageRegistryUrl`. The resolved value\n // flows both into the CSP header (script-src allowance for the registry\n // CDN) and into the emitted runtime config so the SPA reads the same\n // value.\n const phPackageRegistryUrl =\n options.cliPackageRegistryUrl ?? phConfig.packageRegistryUrl ?? null;\n\n // Base path is a runtime-config field (connect.app.basePath), not an env\n // var. Resolve it with the same precedence as the rest of the connect\n // config: CLI override > source powerhouse.config.json.\n const connectBasePath =\n options.cliConnectOverride?.app?.basePath ??\n phConfig.connect?.app?.basePath;\n\n const authToken = env.PH_SENTRY_AUTH_TOKEN;\n const org = env.PH_SENTRY_ORG;\n const project = env.PH_SENTRY_PROJECT;\n // Release tag derived from the workspace version so it matches the\n // sourcemap upload tag CI uses.\n const release =\n process.env.WORKSPACE_VERSION ??\n process.env.npm_package_version ??\n env.PH_CONNECT_VERSION;\n const uploadSentrySourcemaps = authToken && org && project;\n\n const connectHtmlTags = getConnectHtmlTags({\n registryUrl: phPackageRegistryUrl,\n });\n\n const plugins: PluginOption[] = [\n tailwind(),\n react(),\n createHtmlPlugin({\n minify: false,\n inject: {\n tags: [\n ...connectHtmlTags,\n {\n tag: \"script\",\n attrs: { type: \"importmap\" },\n children: JSON.stringify(\n { imports: REACT_IMPORTMAP_IMPORTS },\n null,\n 2,\n ),\n injectTo: \"head-prepend\",\n },\n ],\n },\n }),\n ] as const;\n\n if (uploadSentrySourcemaps) {\n plugins.push(\n import(\"@sentry/vite-plugin\").then(({ sentryVitePlugin }) =>\n sentryVitePlugin({\n release: {\n name: release ?? \"unknown\",\n inject: false, // prevent it from injecting the release id in the service worker code, this is done in 'src/app/sentry.ts' instead\n },\n authToken,\n org,\n project,\n bundleSizeOptimizations: {\n excludeDebugStatements: true,\n },\n reactComponentAnnotation: {\n enabled: true,\n },\n }),\n ) as PluginOption,\n );\n }\n\n // hide warnings unless LOG_LEVEL is set to debug, or the source config\n // declares connect.app.logLevel = \"debug\"\n const isDebug =\n process.env.LOG_LEVEL === \"debug\" ||\n phConfig.connect?.app?.logLevel === \"debug\";\n const customLogger = isDebug\n ? undefined\n : viteLogger({\n silence: {\n warnings: [\n \"@import must precede all other statements (besides @charset or empty @layer)\", // tailwindcss error when importing font file\n ],\n errors: [\"Unterminated string literal\"],\n },\n });\n\n const reactExternal = [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react-dom/client\",\n ];\n\n // pnpm `link:` deps (e.g. a downstream project linking @powerhousedao/*\n // packages from a sibling monorepo checkout) live outside Vite's\n // auto-detected workspace root. Their `node_modules/.pnpm/...` assets\n // then 403 through `/@fs/`, returning a 760-byte HTML body where the\n // binary should be — which breaks PGlite at startup with \"Invalid FS\n // bundle size: 760 !== 4939170\". Resolve key linked packages back to\n // their real workspace roots and allow Vite to serve from there.\n const linkedRoots = [\n \"@powerhousedao/reactor-browser\",\n \"@powerhousedao/connect\",\n \"@electric-sql/pglite\",\n ]\n .map((pkg) => {\n try {\n return searchForWorkspaceRoot(\n realpathSync(join(options.dirname, \"node_modules\", pkg)),\n );\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p !== null);\n\n const config: InlineConfig = {\n configFile: false,\n mode,\n // Prefix served/built asset URLs so Connect can run under a path prefix\n // (reverse proxy). Mirrors the client router basename; normalize so a bare\n // `app` or `/app` becomes `/app/` and matches the router.\n //\n // Dynamic-base mode: set a placeholder token instead of a concrete base.\n // connectDynamicBasePlugin (below) rewrites it in the emitted JS to a\n // runtime expression so one bundle serves under any subpath; the proxy\n // substitutes it in the HTML and sets the runtime global at serve time.\n base: options.dynamicBase\n ? DYNAMIC_BASE_PLACEHOLDER\n : connectBasePath\n ? normalizeBasePath(connectBasePath)\n : undefined,\n server: {\n watch: {\n ignored: [\"**/backup-documents/**\", \"**/.ph/**\"],\n },\n fs: {\n allow: [searchForWorkspaceRoot(options.dirname), ...linkedRoots],\n },\n },\n resolve: {\n dedupe: [\"react\", \"react-dom\"],\n tsconfigPaths: true,\n },\n define: {\n PH_CONNECT_SENTRY_RELEASE: JSON.stringify(release || \"unknown\"),\n },\n customLogger,\n envPrefix: [\"PH_CONNECT_\"],\n optimizeDeps: {\n include: [\n \"document-model\",\n \"zod\",\n \"@powerhousedao/design-system/connect\",\n \"@powerhousedao/reactor-browser\",\n \"@powerhousedao/document-engineering\",\n ],\n exclude: [\"@electric-sql/pglite\", \"@electric-sql/pglite-tools\"],\n },\n plugins: [\n // phConfigPlugin must be registered before tailwind so its hotUpdate\n // hook runs first and can suppress HMR updates for codegen-generated\n // files, preventing tailwind from triggering full page reloads.\n phConfigPlugin({\n packages: phPackages,\n projectRoot: options.dirname,\n connect: phConfig.connect,\n packageRegistryUrl: phPackageRegistryUrl ?? undefined,\n cliConnectOverride: options.cliConnectOverride,\n }),\n phBundledPackagesPlugin({\n packages: localPackagesFromConfig,\n projectRoot: options.dirname,\n }),\n // Dev-only: rewrite the importmap so it points at Vite's pre-bundled\n // React (the same URL Connect's own modules resolve to). Without this,\n // CDN editors load React from esm.sh while Connect uses Vite's local\n // copy → two React instances → useSyncExternalStore crash. The build\n // path stays untouched; `esmExternalRequirePlugin` below still owns it.\n devReactImportmapPlugin(),\n ...plugins,\n // Externalize React so both Connect and dynamically loaded registry\n // packages share the same React instance via the import map in index.html.\n // Without this, Vite bundles React into Connect's chunks while registry\n // packages resolve React from the import map (esm.sh), creating two\n // separate React instances that don't share context/state.\n //\n // In Vite 8 (Rolldown), require() calls for external modules are preserved\n // as-is, which fails in browsers. esmExternalRequirePlugin handles both\n // externalization AND converting require() to import statements.\n // NOTE: Do NOT also list these in build.rolldownOptions.external — overlapping\n // entries prevent the plugin from transforming require() calls.\n esmExternalRequirePlugin({ external: reactExternal }),\n connectFaviconPlugin(),\n // enforce: \"post\" — rewrites the placeholder base after all other\n // transforms have emitted their asset/chunk URLs.\n ...(options.dynamicBase ? [connectDynamicBasePlugin()] : []),\n ],\n worker: {\n format: \"es\",\n // Worker chunks are emitted by a separate Rolldown build, so the main\n // bundle's generateBundle never sees them. The worker instance both\n // rewrites the placeholder and prepends a prelude that resolves the base\n // in worker scope (forWorker) — the proxy only sets the global on the\n // main thread.\n ...(options.dynamicBase\n ? { plugins: () => [connectDynamicBasePlugin({ forWorker: true })] }\n : {}),\n },\n build: {\n sourcemap: true,\n },\n };\n return config;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/builder-tools",
|
|
3
|
-
"version": "6.2.0-dev.
|
|
3
|
+
"version": "6.2.0-dev.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"publishConfig": {
|
|
@@ -24,11 +24,12 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@tailwindcss/vite": "4.2.2",
|
|
26
26
|
"@vitejs/plugin-react": "6.0.1",
|
|
27
|
+
"magic-string": "^0.30.21",
|
|
27
28
|
"vite": "8.0.8",
|
|
28
29
|
"vite-plugin-html": "3.2.2",
|
|
29
|
-
"@powerhousedao/config": "6.2.0-dev.
|
|
30
|
-
"@powerhousedao/shared": "6.2.0-dev.
|
|
31
|
-
"document-model": "6.2.0-dev.
|
|
30
|
+
"@powerhousedao/config": "6.2.0-dev.6",
|
|
31
|
+
"@powerhousedao/shared": "6.2.0-dev.6",
|
|
32
|
+
"document-model": "6.2.0-dev.6"
|
|
32
33
|
},
|
|
33
34
|
"devDependencies": {
|
|
34
35
|
"@sentry/vite-plugin": "^4.3.0",
|