{"version":3,"file":"index.mjs","names":[],"sources":["../connect-utils/constants.ts","../connect-utils/helpers.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-packages.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 { setConnectEnv } from \"@powerhousedao/shared/connect\";\nimport type { ConnectCommonOptions } from \"./types.js\";\n\nexport const DEFAULT_CONNECT_OUTDIR = \".ph/connect-build/dist/\" as const;\n\nexport function commonConnectOptionsToEnv(options: ConnectCommonOptions) {\n  const {\n    base,\n    configFile,\n    defaultDrivesUrl,\n    drivesPreserveStrategy,\n    disableLocalPackage,\n  } = options;\n\n  if (base) {\n    setConnectEnv({\n      PH_CONNECT_BASE_PATH: base,\n    });\n  }\n\n  if (configFile) {\n    setConnectEnv({\n      PH_CONFIG_PATH: configFile,\n    });\n  }\n  if (defaultDrivesUrl) {\n    setConnectEnv({\n      PH_CONNECT_DEFAULT_DRIVES_URL: defaultDrivesUrl.join(\",\"),\n    });\n  }\n  if (drivesPreserveStrategy) {\n    setConnectEnv({\n      PH_CONNECT_DRIVES_PRESERVE_STRATEGY: drivesPreserveStrategy,\n    });\n  }\n  if (disableLocalPackage) {\n    setConnectEnv({\n      PH_DISABLE_LOCAL_PACKAGE: true,\n    });\n  }\n}\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","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_PREFIX = \"/__ph/dev-react-shim/\";\nconst VITE_DEPS_PREFIX = \"/node_modules/.vite/deps\";\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\n  return {\n    name: \"ph-dev-react-importmap\",\n    apply: \"serve\",\n    config: () => ({ optimizeDeps: { include: REACT_DEPS } }),\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      server.middlewares.use((req, res, next) => {\n        if (!req.url?.startsWith(SHIM_PREFIX)) return next();\n        const id = req.url\n          .slice(SHIM_PREFIX.length)\n          .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 = `${VITE_DEPS_PREFIX}/${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 imports = Object.fromEntries(\n          REACT_DEPS.map((id) => [\n            id,\n            `${SHIM_PREFIX}${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 { 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      // Serve icon.ico before Vite's static middleware so it acts as a fallback\n      server.middlewares.use(\"/icon.ico\", (_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    },\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\";\n\nexport type PhPackagesPluginOptions = {\n  packages: string[];\n  projectRoot?: string;\n  registryUrl?: string | null;\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 phPackagesPlugin(options: PhPackagesPluginOptions): Plugin {\n  const projectRoot = options.projectRoot ?? process.cwd();\n  const localPackage = readProjectPackageInfo(projectRoot);\n  const content = JSON.stringify(\n    {\n      packages: options.packages,\n      localPackage,\n      registryUrl: options.registryUrl ?? null,\n    },\n    null,\n    2,\n  );\n\n  return {\n    name: \"vite-plugin-ph-packages\",\n    configureServer(server) {\n      server.middlewares.use((req, res, next) => {\n        if (req.url?.endsWith(\"/ph-packages.json\")) {\n          res.setHeader(\"Content-Type\", \"application/json\");\n          res.end(content);\n          return;\n        }\n        next();\n      });\n    },\n    hotUpdate: {\n      order: \"pre\",\n      handler(ctx) {\n        // filter out modules only imported by \"style.css\"\n        // to avoid page reloads triggered by tailwind\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: \"ph-packages.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 { phPackagesPlugin } from \"./vite-plugins/ph-packages.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 getPackageNamesFromPowerhouseConfig({ packages }: PowerhouseConfig) {\n  if (!packages) return [];\n  // Preserve the version/tag from powerhouse.config.json so Connect's runtime\n  // resolver sees it when building the registry CDN URL. Without this the\n  // registry falls back to its `latest` dist-tag, which may point to a\n  // different release stream than what the project asked for (e.g. latest\n  // vs. dev). Local packages resolve from node_modules and don't need a\n  // version here.\n  return packages.map((p) =>\n    p.version && p.provider !== \"local\"\n      ? `${p.packageName}@${p.version}`\n      : p.packageName,\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 > options > 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  // load powerhouse config\n  const phConfigPath =\n    env.PH_CONFIG_PATH ?? join(options.dirname, \"powerhouse.config.json\");\n\n  const phConfig = options.powerhouseConfig ?? getConfig(phConfigPath);\n\n  const packagesFromConfig = getPackageNamesFromPowerhouseConfig(phConfig);\n  const localPackagesFromConfig =\n    getLocalPackageNamesFromPowerhouseConfig(phConfig);\n  const phPackagesStr = env.PH_PACKAGES;\n  const envPhPackages = phPackagesStr?.split(\",\");\n\n  const phPackages = envPhPackages ?? packagesFromConfig;\n\n  const phPackageRegistryUrl =\n    env.PH_CONNECT_PACKAGES_REGISTRY ?? phConfig.packageRegistryUrl ?? null;\n\n  const authToken = env.PH_SENTRY_AUTH_TOKEN;\n  const org = env.PH_SENTRY_ORG;\n  const project = env.PH_SENTRY_PROJECT;\n  const release = env.PH_CONNECT_SENTRY_RELEASE || 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\n  const isDebug =\n    process.env.LOG_LEVEL === \"debug\" || env.PH_CONNECT_LOG_LEVEL === \"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: env.PH_CONNECT_BASE_PATH\n      ? normalizeBasePath(env.PH_CONNECT_BASE_PATH)\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    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      // phPackagesPlugin 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      phPackagesPlugin({\n        packages: phPackages,\n        projectRoot: options.dirname,\n        registryUrl: phPackageRegistryUrl,\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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"}