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 });
}