{"version":3,"file":"vite.mjs","names":["z","VaultConfigSchema","object","VAULT_ADDRESS","url","VAULT_USERNAME","string","min","VAULT_PASSWORD","VAULT_SECRET_PATH","VAULT_MOUNT_POINT","default","VaultConfig","infer","fs","https","path","axios","loadEnv","VaultConfigSchema","Resource","Plugin","fetchVaultSecrets","env","Record","Promise","config","parse","VAULT_ADDRESS","VAULT_USERNAME","VAULT_PASSWORD","VAULT_SECRET_PATH","VAULT_MOUNT_POINT","client","create","baseURL","httpsAgent","Agent","rejectUnauthorized","data","loginData","post","password","secretData","get","headers","auth","client_token","secrets","Error","Object","fromEntries","entries","map","key","value","JSON","stringify","loadVaultSecrets","command","process","cwd","forEach","trim","e","console","warn","message","loadLocaleResources","localesPath","addWatchFile","existsSync","mkdirSync","recursive","enPath","join","writeFileSync","files","readdirSync","resources","file","filter","f","endsWith","lang","basename","filePath","translation","readFileSync","ensurePermissionsFile","permissionsPath","dir","dirname","ensureScopesFile","scopesPath","viteWczLayout","virtualModuleId","resolvedVirtualModuleId","envPath","name","enforce","configResolved","resolvedConfig","resolve","root","_","optimizeDeps","exclude","include","dedupe","ssr","noExternal","conditions","configureServer","server","refresh","includes","module","moduleGraph","getModuleById","invalidateModule","ws","send","type","watcher","add","on","resolveId","id","load","bind","normalizedPermissionsPath","split","sep","posix","normalizedScopesPath","normalizedEnvPath"],"sources":["../src/models/VaultConfig.ts","../src/lib/vite-plugin.ts"],"sourcesContent":["import z from \"zod\";\n\nexport const VaultConfigSchema = z.object({\n  VAULT_ADDRESS: z.url(),\n  VAULT_USERNAME: z.string().min(1),\n  VAULT_PASSWORD: z.string().min(1),\n  VAULT_SECRET_PATH: z.string().min(1),\n  VAULT_MOUNT_POINT: z.string().default(\"release\"),\n});\n\nexport type VaultConfig = z.infer<typeof VaultConfigSchema>;\n","import fs from \"node:fs\";\nimport https from \"node:https\";\nimport path from \"node:path\";\nimport axios from \"axios\";\nimport { loadEnv } from \"vite\";\nimport { VaultConfigSchema } from \"../models/VaultConfig\";\nimport type { Resource } from \"i18next\";\nimport type { Plugin } from \"vite\";\n\nasync function fetchVaultSecrets(env: Record<string, string>): Promise<Record<string, string>> {\n  const config = VaultConfigSchema.parse(env);\n  const { VAULT_ADDRESS, VAULT_USERNAME, VAULT_PASSWORD, VAULT_SECRET_PATH, VAULT_MOUNT_POINT } =\n    config;\n\n  const client = axios.create({\n    baseURL: VAULT_ADDRESS,\n    httpsAgent: new https.Agent({ rejectUnauthorized: false }),\n  });\n\n  const { data: loginData } = await client.post(`/v1/auth/userpass/login/${VAULT_USERNAME}`, {\n    password: VAULT_PASSWORD,\n  });\n\n  const { data: secretData } = await client.get(\n    `/v1/${VAULT_MOUNT_POINT}/data/${VAULT_SECRET_PATH}`,\n    {\n      headers: { \"X-Vault-Token\": loginData.auth.client_token },\n    },\n  );\n\n  const secrets = secretData?.data?.data;\n  if (!secrets) throw new Error(\"No secrets found\");\n\n  return Object.fromEntries(\n    Object.entries(secrets).map(([key, value]) => [\n      key,\n      typeof value === \"string\" ? value : JSON.stringify(value),\n    ]),\n  );\n}\n\nasync function loadVaultSecrets(command: string): Promise<void> {\n  if (command !== \"serve\") return;\n\n  const env = loadEnv(\"development\", process.cwd(), \"\");\n  if (!env.VAULT_ADDRESS) return;\n\n  try {\n    const secrets = await fetchVaultSecrets(env);\n    Object.entries(secrets).forEach(([key, value]) => {\n      process.env[key] = env[key]?.trim() ? env[key] : value;\n    });\n  } catch (e) {\n    console.warn(\"[vite:wcz-layout] Vault failed:\", e instanceof Error ? e.message : e);\n  }\n}\n\nfunction loadLocaleResources(localesPath: string, addWatchFile: (path: string) => void): Resource {\n  if (!fs.existsSync(localesPath)) fs.mkdirSync(localesPath, { recursive: true });\n\n  const enPath = path.join(localesPath, \"en.json\");\n  if (!fs.existsSync(enPath)) fs.writeFileSync(enPath, JSON.stringify({}));\n\n  const files = fs.readdirSync(localesPath);\n  const resources: Resource = {};\n\n  for (const file of files.filter((f) => f.endsWith(\".json\"))) {\n    const lang = path.basename(file, \".json\");\n    const filePath = path.join(localesPath, file);\n    try {\n      resources[lang] = { translation: JSON.parse(fs.readFileSync(filePath, \"utf-8\")) };\n    } catch {\n      resources[lang] = { translation: {} };\n    }\n    addWatchFile(filePath);\n  }\n\n  return resources;\n}\n\nfunction ensurePermissionsFile(\n  permissionsPath: string,\n  addWatchFile: (path: string) => void,\n): void {\n  const dir = path.dirname(permissionsPath);\n  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n  if (!fs.existsSync(permissionsPath)) {\n    fs.writeFileSync(\n      permissionsPath,\n      'export const permissions = {\\n  admin: [\"wcz-developers\"]\\n} as const;',\n    );\n  }\n  addWatchFile(permissionsPath);\n}\n\nfunction ensureScopesFile(scopesPath: string, addWatchFile: (path: string) => void): void {\n  const dir = path.dirname(scopesPath);\n  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n  if (!fs.existsSync(scopesPath)) {\n    fs.writeFileSync(scopesPath, \"export const scopes = {\\n} as const;\");\n  }\n  addWatchFile(scopesPath);\n}\n\nexport function viteWczLayout(): Plugin {\n  const virtualModuleId = \"virtual:wcz-layout\";\n  const resolvedVirtualModuleId = \"\\0\" + virtualModuleId;\n\n  let localesPath: string;\n  let permissionsPath: string;\n  let scopesPath: string;\n  let envPath: string;\n\n  return {\n    name: \"vite:wcz-layout\",\n    enforce: \"pre\",\n    configResolved(resolvedConfig) {\n      localesPath = path.resolve(resolvedConfig.root, \"src/lib/locales\");\n      permissionsPath = path.resolve(resolvedConfig.root, \"src/lib/auth/permissions.ts\");\n      scopesPath = path.resolve(resolvedConfig.root, \"src/lib/auth/scopes.ts\");\n      envPath = path.resolve(resolvedConfig.root, \"src/env.ts\");\n    },\n    async config(_, { command }) {\n      await loadVaultSecrets(command);\n\n      return {\n        optimizeDeps: {\n          exclude: [virtualModuleId],\n          include: [\n            // CJS deps reached through @mui/* and @emotion/* imports in our dist\n            \"prop-types\",\n            \"react-is\",\n            \"hoist-non-react-statics\",\n            // CJS dep of tus-js-client (file upload server fn)\n            \"url-parse\",\n            // CJS dep of react-dropzone\n            \"attr-accept\",\n            \"@mui/x-date-pickers-pro\",\n            \"@mui/x-data-grid-premium\",\n          ],\n        },\n        resolve: {\n          dedupe: [\n            \"react\",\n            \"react-dom\",\n            \"@mui/material\",\n            \"@mui/x-date-pickers\",\n            \"@mui/x-date-pickers-pro\",\n            \"@mui/x-data-grid\",\n            \"@mui/x-data-grid-premium\",\n            \"@emotion/react\",\n            \"@emotion/styled\",\n          ],\n        },\n        ssr: {\n          noExternal: [/@mui\\//, /@emotion\\//],\n          resolve: {\n            conditions: [\"node\", \"module\", \"import\"],\n          },\n        },\n      };\n    },\n    configureServer(server) {\n      const refresh = (filePath: string) => {\n        if (\n          filePath.includes(localesPath) ||\n          filePath === permissionsPath ||\n          filePath === scopesPath ||\n          filePath === envPath\n        ) {\n          const module = server.moduleGraph.getModuleById(resolvedVirtualModuleId);\n          if (module) server.moduleGraph.invalidateModule(module);\n          server.ws.send({ type: \"full-reload\", path: \"*\" });\n        }\n      };\n\n      server.watcher.add([localesPath, permissionsPath, scopesPath, envPath]);\n      server.watcher.on(\"add\", refresh);\n      server.watcher.on(\"change\", refresh);\n      server.watcher.on(\"unlink\", refresh);\n    },\n    resolveId(id) {\n      if (id === virtualModuleId) return resolvedVirtualModuleId;\n      return null;\n    },\n    load(id) {\n      if (id !== resolvedVirtualModuleId) return null;\n\n      const resources = loadLocaleResources(localesPath, this.addWatchFile.bind(this));\n      ensurePermissionsFile(permissionsPath, this.addWatchFile.bind(this));\n      ensureScopesFile(scopesPath, this.addWatchFile.bind(this));\n\n      const normalizedPermissionsPath = permissionsPath.split(path.sep).join(path.posix.sep);\n      const normalizedScopesPath = scopesPath.split(path.sep).join(path.posix.sep);\n      const normalizedEnvPath = envPath.split(path.sep).join(path.posix.sep);\n      return `\n            export const resources = ${JSON.stringify(resources)};\n            export { permissions } from \"${normalizedPermissionsPath}\";\n            export { scopes } from \"${normalizedScopesPath}\";\n            export { serverEnv } from \"${normalizedEnvPath}\";\n            `;\n    },\n  };\n}\n"],"mappings":"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"}