import { existsSync } from "node:fs"; import { readFile } from "node:fs/promises"; import { defu } from "defu"; import { writeFile } from "nitropack/kit"; import { resolve } from "pathe"; export async function writeIISFiles(nitro) { await writeFile( resolve(nitro.options.output.dir, "web.config"), await iisXmlTemplate(nitro) ); } export async function writeIISNodeFiles(nitro) { await writeFile( resolve(nitro.options.output.dir, "web.config"), await iisnodeXmlTemplate(nitro) ); await writeFile( resolve(nitro.options.output.dir, "index.js"), /*js */ ` if (process.env.PORT.startsWith('\\\\')) { process.env.NITRO_UNIX_SOCKET = process.env.PORT delete process.env.PORT } import('./server/index.mjs'); ` ); } async function iisnodeXmlTemplate(nitro) { const path = resolve(nitro.options.rootDir, "web.config"); const originalString = ( /* xml */ ` ` ); if (existsSync(path)) { const fileString = await readFile(path, "utf8"); const originalWebConfig = await parseXmlDoc(originalString); const fileWebConfig = await parseXmlDoc(fileString); if (nitro.options.iis?.mergeConfig && !nitro.options.iis.overrideConfig) { return buildNewXmlDoc(defu(fileWebConfig, originalWebConfig)); } if (nitro.options.iis?.overrideConfig) { return buildNewXmlDoc({ ...fileWebConfig }); } } return originalString; } async function iisXmlTemplate(nitro) { const path = resolve(nitro.options.rootDir, "web.config"); const originalString = ( /* xml */ ` ` ); if (existsSync(path)) { const fileString = await readFile(path, "utf8"); const originalWebConfig = await parseXmlDoc(originalString); const fileWebConfig = await parseXmlDoc(fileString); if (nitro.options.iis?.mergeConfig && !nitro.options.iis.overrideConfig) { return buildNewXmlDoc(defu(fileWebConfig, originalWebConfig)); } if (nitro.options.iis?.overrideConfig) { return buildNewXmlDoc({ ...fileWebConfig }); } } return originalString; } async function parseXmlDoc(xml) { const { Parser } = await import("xml2js"); if (xml === void 0 || !xml) { return {}; } const parser = new Parser({ explicitArray: false }); let parsedRecord = {}; parser.parseString(xml, (_, r) => { parsedRecord = r; }); return parsedRecord; } async function buildNewXmlDoc(xmlObj) { const { Builder } = await import("xml2js"); const builder = new Builder(); return builder.buildObject({ ...xmlObj }); }