import { promises } from 'fs';
import { r as resolve, a as relative } from './index2.mjs';
import { d as defineNuxtCommand, a as success, c as cyan } from './index.mjs';
import { r as requireModule, g as getModulePaths, a as getNearestPackage } from './cjs.mjs';
import 'path';
import 'tty';

const prepare = defineNuxtCommand({
  meta: {
    name: "prepare",
    usage: "npx nuxi prepare",
    description: "Prepare nuxt for development/build"
  },
  async invoke(args) {
    process.env.NODE_ENV = process.env.NODE_ENV || "production";
    const rootDir = resolve(args._[0] || ".");
    const { loadNuxt } = requireModule("@nuxt/kit", rootDir);
    const nuxt = await loadNuxt({ rootDir });
    const adHocModules = nuxt.options._majorVersion === 3 ? ["@nuxt/kit", "@nuxt/nitro"] : ["@nuxt/kit"];
    const modulePaths = getModulePaths(nuxt.options.modulesDir);
    const references = [
      "nuxt3",
      ...adHocModules,
      ...nuxt.options.buildModules,
      ...nuxt.options.modules,
      ...nuxt.options._modules
    ].filter((f) => typeof f === "string").map((id) => ({ types: getNearestPackage(id, modulePaths)?.name || id }));
    const declarations = [];
    await nuxt.callHook("builder:generateApp");
    await nuxt.callHook("prepare:types", { references, declarations });
    const declarationPath = resolve(`${rootDir}/nuxt.d.ts`);
    const declaration = [
      "// This file is auto generated by `nuxt prepare`",
      "// Please do not manually modify this file.",
      "",
      ...references.map((ref) => {
        if ("path" in ref) {
          ref.path = relative(rootDir, ref.path);
        }
        return `/// <reference ${renderAttrs(ref)} />`;
      }),
      ...declarations,
      "export {}",
      ""
    ].join("\n");
    await promises.writeFile(declarationPath, declaration);
    success("Generated", cyan(relative(process.cwd(), declarationPath)));
  }
});
function renderAttrs(obj) {
  return Object.entries(obj).map((e) => renderAttr(e[0], e[1])).join(" ");
}
function renderAttr(key, value) {
  return value ? `${key}="${value}"` : "";
}

export { prepare as default };
