// src/actions/package/clean-outputs.ts
import path2 from "node:path";
import chalk2 from "chalk";

// src/lib/crossSpawn.ts
import crossSpawn from "cross-spawn";
function spawnSync(command, args, options) {
  return crossSpawn.sync(command, args, options);
}

// src/lib/deleteGlob.ts
import fs from "node:fs";
import { glob } from "glob";
var deleteGlob = (globPath) => {
  const files = glob.sync(globPath);
  for (const file of files) {
    fs.rmSync(file, { recursive: true, force: true });
  }
};

// src/lib/initCwd.ts
function INIT_CWD() {
  return process.env.INIT_CWD ?? process.cwd();
}

// src/lib/loadConfig.ts
import chalk from "chalk";
import { cosmiconfig } from "cosmiconfig";
import { TypeScriptLoader } from "cosmiconfig-typescript-loader";
import deepmerge from "deepmerge";
var config;
var rootConfigPath;
function createExplorer() {
  return cosmiconfig("xy", { cache: true, loaders: { ".ts": TypeScriptLoader() } });
}
var loadConfig = async (params) => {
  if (config === void 0) {
    const cosmicConfigResult = await createExplorer().search();
    config = cosmicConfigResult?.config ?? {};
    rootConfigPath = cosmicConfigResult?.filepath;
    const configFilePath = cosmicConfigResult?.filepath;
    if (configFilePath !== void 0) {
      console.log(chalk.green(`Loaded config from ${configFilePath}`));
      if (config.verbose) {
        console.log(chalk.gray(`${JSON.stringify(config, null, 2)}`));
      }
    }
  }
  return deepmerge(config, params ?? {});
};

// src/lib/packageName.ts
import { readFileSync } from "node:fs";
import path from "node:path";
function packageName() {
  if (process.env.npm_package_name) {
    return process.env.npm_package_name;
  }
  try {
    const pkgPath = path.join(INIT_CWD(), "package.json");
    const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
    return pkg.name;
  } catch {
    return void 0;
  }
}

// src/lib/reporting/xyReporter.ts
var strictMode = false;
function isStrictMode() {
  return strictMode || process.env.XY_STRICT === "1";
}

// src/actions/package/clean-outputs.ts
var packageCleanOutputs = () => {
  const pkg = INIT_CWD();
  const pkgName = packageName();
  const folders = [path2.join(pkg, "dist"), path2.join(pkg, "build"), path2.join(pkg, "docs")];
  console.log(chalk2.green(`Cleaning Outputs [${pkgName}]`));
  for (const folder of folders) {
    deleteGlob(folder);
  }
  return 0;
};

// src/actions/package/clean-typescript.ts
import path3 from "node:path";
import chalk3 from "chalk";
var packageCleanTypescript = () => {
  const pkg = INIT_CWD();
  const pkgName = packageName();
  console.log(chalk3.green(`Cleaning Typescript [${pkgName}]`));
  const files = [path3.join(pkg, "*.tsbuildinfo"), path3.join(pkg, ".tsconfig.*"), path3.join(pkg, ".eslintcache")];
  for (const file of files) {
    deleteGlob(file);
  }
  return 0;
};

// src/actions/package/clean.ts
var packageClean = () => {
  return [packageCleanOutputs(), packageCleanTypescript()].reduce((prev, value) => prev + value, 0);
};

// src/actions/package/compile/compile.ts
import { cwd as cwd3 } from "node:process";
import chalk8 from "chalk";

// src/actions/package/compile/packageCompileEsbuild.ts
import fs3 from "node:fs";
import path5 from "node:path";
import { cwd as cwd2 } from "node:process";
import chalk7 from "chalk";
import { build } from "esbuild";

// src/actions/package/compile/inputs.ts
import chalk4 from "chalk";
import { glob as glob2 } from "glob";
var getAllInputs = (srcDir, verbose = false) => {
  return glob2.sync(`${srcDir}/**/*.{ts,tsx,mts,cts}`, { posix: true }).map((file) => {
    const result = file.slice(Math.max(0, srcDir.length + 1));
    if (verbose) {
      console.log(chalk4.gray(`getAllInputs: ${JSON.stringify(result, null, 2)}`));
    }
    return result;
  });
};

// src/actions/package/compile/buildEntries.ts
var bareSpecOrStoryRe = /(?:^|\/)(?:spec|stories)\.(?:ts|tsx|mts|cts)$/;
var isSpecOrStory = (entry) => {
  return entry.includes(".spec.") || entry.includes(".stories.") || entry.startsWith("spec/") || entry.includes("/spec/") || entry.startsWith("stories/") || entry.includes("/stories/") || bareSpecOrStoryRe.test(entry);
};
var isDeclaration = (entry) => /\.d\.(?:ts|mts|cts)$/.test(entry);
var buildEntries = (srcDir, entryMode = "single", options, excludeSpecAndStories = true, verbose = false) => {
  let entries;
  switch (entryMode) {
    case "platform": {
      entries = ["index-node.ts", "index-browser.ts"];
      break;
    }
    case "all": {
      entries = (excludeSpecAndStories ? getAllInputs(srcDir).filter((entry) => !isSpecOrStory(entry)) : getAllInputs(srcDir)).filter((entry) => !isDeclaration(entry));
      break;
    }
    case "custom": {
      entries = [];
      break;
    }
    default: {
      entries = ["index.ts"];
      break;
    }
  }
  if (typeof options !== "boolean" && Array.isArray(options?.entry)) {
    entries.push(...options.entry);
  }
  if (verbose) console.log(`buildEntries [${entryMode}] ${entries.length}`);
  return entries;
};

// src/actions/package/compile/deepMerge.ts
function deepMerge(target, source) {
  if (!source || typeof source !== "object") return target;
  for (const key of Object.keys(source)) {
    const sourceVal = source[key];
    if (typeof sourceVal === "object" && sourceVal !== null && !Array.isArray(sourceVal)) {
      if (!target[key] || typeof target[key] !== "object") {
        target[key] = {};
      }
      deepMerge(target[key], sourceVal);
    } else {
      target[key] = sourceVal;
    }
  }
  return target;
}
function deepMergeObjects(objects) {
  const result = {};
  for (const obj of objects) {
    deepMerge(result, obj);
  }
  return result;
}

// src/actions/package/compile/runTsc.ts
import { cwd } from "node:process";
import chalk5 from "chalk";
var runTsc = (configPath, verbose = false, extraArgs = []) => {
  const args = ["-p", configPath, ...extraArgs];
  if (verbose) {
    console.log(chalk5.gray(`tsc ${args.join(" ")}`));
  }
  const result = spawnSync("tsc", args, {
    cwd: cwd(),
    stdio: "inherit"
  });
  return result.status ?? (result.error === void 0 ? 0 : 1);
};

// src/actions/package/compile/validateFullPackage.ts
import fs2 from "node:fs";
import path4 from "node:path";
import chalk6 from "chalk";
import ts, { formatDiagnosticsWithColorAndContext, sys } from "typescript";
var toPosixPath = (value) => value.split(path4.sep).join("/");
var relativePath = (from, to) => {
  const result = toPosixPath(path4.relative(from, to));
  return result.startsWith(".") ? result : `./${result}`;
};
var formatTsConfigDiagnostics = (diagnostics, pkg) => {
  return formatDiagnosticsWithColorAndContext(diagnostics, {
    getCanonicalFileName: (fileName) => fileName,
    getCurrentDirectory: () => pkg,
    getNewLine: () => sys.newLine
  });
};
var isInPackageSubdirectory = (pkg, fileName, directoryName) => {
  const relative = toPosixPath(path4.relative(path4.resolve(pkg, directoryName), fileName));
  return relative !== "" && !relative.startsWith("../") && relative !== "..";
};
var createFullValidationConfig = (pkg, tsconfigPath) => {
  const configFile = ts.readConfigFile(tsconfigPath, (fileName) => ts.sys.readFile(fileName));
  if (configFile.error) {
    return { configPath: tsconfigPath, diagnostics: [configFile.error] };
  }
  const parsed = ts.parseJsonConfigFileContent(
    configFile.config,
    ts.sys,
    pkg,
    void 0,
    tsconfigPath
  );
  const buildDir = path4.resolve(pkg, "build");
  fs2.mkdirSync(buildDir, { recursive: true });
  const configPath = path4.resolve(buildDir, "tsconfig.package-validate.json");
  const files = parsed.fileNames.filter((fileName) => !isInPackageSubdirectory(pkg, fileName, "packages")).map((fileName) => relativePath(buildDir, fileName));
  if (files.length === 0) {
    const emptyFile = path4.resolve(buildDir, "tsconfig.package-validate-empty.d.ts");
    fs2.writeFileSync(emptyFile, "");
    files.push(relativePath(buildDir, emptyFile));
  }
  fs2.writeFileSync(
    configPath,
    `${JSON.stringify({
      compilerOptions: {
        noEmit: true,
        rootDir: relativePath(buildDir, pkg)
      },
      extends: relativePath(buildDir, tsconfigPath),
      files,
      include: []
    }, null, 2)}
`
  );
  return { configPath, diagnostics: parsed.errors };
};
var validateFullPackage = (pkg, verbose = false) => {
  const tsconfigPath = path4.resolve(pkg, "tsconfig.json");
  if (!fs2.existsSync(tsconfigPath)) {
    console.warn(chalk6.yellow("Compile:Validate skipped \u2014 tsconfig.json not found"));
    return 0;
  }
  if (verbose) {
    console.log(chalk6.cyan("Compile:Validate [tsconfig.json]"));
  }
  const { configPath, diagnostics } = createFullValidationConfig(pkg, tsconfigPath);
  if (diagnostics.length > 0) {
    console.error(formatTsConfigDiagnostics(diagnostics, pkg));
    return 1;
  }
  const result = runTsc(configPath, verbose);
  if (result !== 0) {
    console.error(chalk6.red(`Compile:Validate failed (tsc exit code ${result})`));
  }
  return result;
};

// src/actions/package/compile/packageCompileEsbuild.ts
var isBuildFormat = (value) => {
  return value === "cjs" || value === "esm" || value === "iife";
};
var legacyIgnoredOptions = /* @__PURE__ */ new Set([
  "clean",
  "cjsInterop",
  "dts",
  "entry",
  "outDir",
  "silent",
  "skipNodeModulesBundle"
]);
var supportedEsbuildOptions = /* @__PURE__ */ new Set([
  "absWorkingDir",
  "alias",
  "allowOverwrite",
  "assetNames",
  "banner",
  "bundle",
  "charset",
  "chunkNames",
  "color",
  "conditions",
  "define",
  "drop",
  "dropLabels",
  "entryNames",
  "entryPoints",
  "external",
  "footer",
  "format",
  "globalName",
  "ignoreAnnotations",
  "inject",
  "jsx",
  "jsxDev",
  "jsxFactory",
  "jsxFragment",
  "jsxImportSource",
  "jsxSideEffects",
  "keepNames",
  "legalComments",
  "lineLimit",
  "loader",
  "logLevel",
  "logLimit",
  "logOverride",
  "mainFields",
  "mangleCache",
  "mangleProps",
  "mangleQuoted",
  "metafile",
  "minify",
  "minifyIdentifiers",
  "minifySyntax",
  "minifyWhitespace",
  "nodePaths",
  "outExtension",
  "outbase",
  "outdir",
  "outfile",
  "packages",
  "platform",
  "plugins",
  "preserveSymlinks",
  "publicPath",
  "pure",
  "reserveProps",
  "resolveExtensions",
  "sourcemap",
  "sourceRoot",
  "sourcesContent",
  "splitting",
  "stdin",
  "supported",
  "target",
  "treeShaking",
  "tsconfig",
  "tsconfigRaw",
  "watch",
  "write"
]);
var toPosixPath2 = (value) => value.split(path5.sep).join("/");
var relativePath2 = (from, to) => {
  const result = toPosixPath2(path5.relative(from, to));
  return result.startsWith(".") ? result : `./${result}`;
};
var safeFilePart = (value) => value.replaceAll(/[^\dA-Za-z-]+/g, "-").replaceAll(/(?:^-|-$)/g, "") || "src";
var platformSourceSegments = /* @__PURE__ */ new Set(["browser", "neutral", "node"]);
var normalizeEntryPath = (entry) => toPosixPath2(entry).replace(/^\.?\//u, "");
var customEntryOutputName = (entry) => {
  const parsed = path5.posix.parse(normalizeEntryPath(entry));
  const withoutExtension = path5.posix.join(parsed.dir, parsed.name);
  const segments = withoutExtension.split("/");
  return segments.length > 1 && platformSourceSegments.has(segments[0]) ? segments.slice(1).join("/") : withoutExtension;
};
var createEsbuildEntryPoints = (srcDir, entries, entryMode = "single") => {
  if (entryMode !== "custom") {
    return entries.map((entry) => `${srcDir}/${normalizeEntryPath(entry)}`);
  }
  const entryPoints = {};
  for (const entry of entries) {
    const outputName = customEntryOutputName(entry);
    if (entryPoints[outputName] !== void 0) {
      throw new Error(`Duplicate custom entry output "${outputName}" from "${entry}"`);
    }
    entryPoints[outputName] = `${srcDir}/${normalizeEntryPath(entry)}`;
  }
  return entryPoints;
};
var createTypescriptConfig = ({
  declaration = false,
  outDir,
  pkg,
  srcDir
}) => {
  const buildDir = path5.resolve(pkg, "build");
  const sourceRoot = path5.resolve(pkg, srcDir);
  return {
    compilerOptions: {
      ...declaration ? {
        declaration: true,
        declarationMap: true,
        emitDeclarationOnly: true,
        noEmit: false,
        outDir: outDir === void 0 ? void 0 : relativePath2(buildDir, path5.resolve(pkg, outDir))
      } : { noEmit: true },
      rootDir: relativePath2(buildDir, sourceRoot)
    },
    exclude: [
      `${relativePath2(buildDir, sourceRoot)}/**/*.spec.*`,
      `${relativePath2(buildDir, sourceRoot)}/**/*.stories.*`,
      `${relativePath2(buildDir, sourceRoot)}/**/*.example.*`,
      `${relativePath2(buildDir, sourceRoot)}/**/spec/**`,
      `${relativePath2(buildDir, sourceRoot)}/**/stories/**`
    ],
    extends: relativePath2(buildDir, path5.resolve(pkg, "tsconfig.json")),
    include: [`${relativePath2(buildDir, sourceRoot)}/**/*`]
  };
};
var writeTypescriptConfig = (pkg, platform, srcDir, declaration, outDir) => {
  const buildDir = path5.resolve(pkg, "build");
  fs3.mkdirSync(buildDir, { recursive: true });
  const configPath = path5.resolve(buildDir, `tsconfig.package-${declaration ? "dts" : "check"}-${platform}-${safeFilePart(srcDir)}.json`);
  fs3.writeFileSync(
    configPath,
    `${JSON.stringify(createTypescriptConfig({
      declaration,
      outDir,
      pkg,
      srcDir
    }), null, 2)}
`
  );
  return configPath;
};
function copyDeclarationFiles(fromDir, toDir) {
  if (path5.resolve(fromDir) === path5.resolve(toDir) || !fs3.existsSync(fromDir)) return;
  const copyFrom = (dir) => {
    for (const entry of fs3.readdirSync(dir, { withFileTypes: true })) {
      const sourcePath = path5.join(dir, entry.name);
      const relative = path5.relative(fromDir, sourcePath);
      const targetPath = path5.join(toDir, relative);
      if (entry.isDirectory()) {
        copyFrom(sourcePath);
      } else if (entry.isFile() && (entry.name.endsWith(".d.ts") || entry.name.endsWith(".d.ts.map"))) {
        fs3.mkdirSync(path5.dirname(targetPath), { recursive: true });
        fs3.copyFileSync(sourcePath, targetPath);
      }
    }
  };
  copyFrom(fromDir);
}
var normalizeOptions = (options = {}, verbose = false) => {
  const normalized = {};
  const ignored = [];
  for (const [key, value] of Object.entries(options)) {
    if (legacyIgnoredOptions.has(key)) {
      ignored.push(key);
      continue;
    }
    if (key === "format" && Array.isArray(value)) {
      if (isBuildFormat(value[0])) {
        normalized.format = value[0];
      }
      continue;
    }
    if (key === "outExtension" && typeof value === "function") {
      ignored.push(key);
      continue;
    }
    if (supportedEsbuildOptions.has(key)) {
      normalized[key] = value;
      continue;
    }
    ignored.push(key);
  }
  if (verbose && ignored.length > 0) {
    console.warn(chalk7.yellow(`[xy] Ignoring unsupported compile options for esbuild: ${[...new Set(ignored)].toSorted().join(", ")}`));
  }
  return normalized;
};
var esbuildOptions = (options = [], verbose = false) => {
  const standardLoaders = {
    ".gif": "copy",
    ".html": "copy",
    ".jpg": "copy",
    ".json": "json",
    ".png": "copy",
    ".svg": "text",
    ".webp": "copy"
  };
  const standardOptions = {
    bundle: true,
    format: "esm",
    loader: standardLoaders,
    outExtension: { ".js": ".mjs" },
    packages: "external",
    sourcemap: true,
    target: "esnext"
  };
  return deepMergeObjects([standardOptions, ...options.map((option) => normalizeOptions(option, verbose))]);
};
var tsupOptions = esbuildOptions;
var resolvePlatformRecord = (value) => {
  if (value === void 0 || value === true) return { src: {} };
  if (value === false) return {};
  const { esbuildOptions: _legacyEsbuildOptions, ...entries } = value;
  return entries;
};
var resolvePlatformEsbuildOptions = (value) => {
  if (typeof value !== "object" || value === null) return {};
  const entry = value.esbuildOptions;
  return entry ?? {};
};
var getRootOutDir = (options) => {
  return options.outDir ?? options.outdir ?? "dist";
};
var compileFolder = async (srcDir, entries, options, platform, outDir, checkTypes, emitDeclarations, entryMode, verbose) => {
  const pkg = cwd2();
  if (verbose) {
    console.log(chalk7.gray(`compileFolder [${srcDir}, ${outDir}]`));
  }
  if (!fs3.existsSync(path5.resolve(pkg, srcDir))) {
    if (verbose) {
      console.warn(chalk7.yellow(`No source directory found in ${srcDir} to compile`));
    }
    return 0;
  }
  if (entries.length === 0) {
    console.warn(chalk7.yellow(`No entries found in ${srcDir} to compile`));
    return 0;
  }
  if (checkTypes) {
    const checkConfig = writeTypescriptConfig(pkg, platform, srcDir, false);
    const checkResult = runTsc(checkConfig, verbose);
    if (checkResult !== 0) {
      console.error(chalk7.red(`Compile:Validation had ${checkResult} errors`));
      return checkResult;
    }
  }
  const declarationResult = await emitDeclarations();
  if (declarationResult !== 0) {
    console.error(chalk7.red(`Compile:Declaration emit had ${declarationResult} errors`));
    return declarationResult;
  }
  const buildOptions = {
    ...options,
    entryPoints: createEsbuildEntryPoints(srcDir, entries, entryMode),
    outbase: srcDir,
    outdir: outDir,
    platform,
    tsconfig: "tsconfig.json"
  };
  if (verbose) {
    console.log(chalk7.cyan(`ESBUILD:build:start [${srcDir}]`));
    console.log(chalk7.gray(`ESBUILD:build:options [${JSON.stringify({
      ...buildOptions,
      plugins: buildOptions.plugins?.map((plugin) => plugin.name)
    }, null, 2)}]`));
  }
  await build(buildOptions);
  if (verbose) {
    console.log(chalk7.cyan(`ESBUILD:build:stop [${srcDir}]`));
  }
  return 0;
};
function createDeclarationEmitter(verbose = false) {
  const declarationPromises = /* @__PURE__ */ new Map();
  return async (srcDir, rootOutDir, platform, outDir) => {
    const key = `${srcDir}\0${rootOutDir}`;
    let promise = declarationPromises.get(key);
    if (!promise) {
      promise = Promise.resolve().then(() => {
        const dtsConfig = writeTypescriptConfig(cwd2(), platform, srcDir, true, outDir);
        return { outDir, result: runTsc(dtsConfig, verbose) };
      });
      declarationPromises.set(key, promise);
    }
    const emitted = await promise;
    if (emitted.result !== 0) return emitted.result;
    copyDeclarationFiles(emitted.outDir, outDir);
    return 0;
  };
}
function resolveCompileMode(config2, mode) {
  const compile = config2?.compile;
  const verbose = config2?.verbose ?? false;
  const shouldEmit = !mode.validateOnly;
  const shouldRunFullValidation = !mode.emitOnly && (compile?.validate ?? true);
  return {
    compile,
    shouldEmit,
    shouldRunFolderChecks: !shouldRunFullValidation && !mode.emitOnly,
    shouldRunFullValidation,
    verbose
  };
}
async function compilePlatformEntries({
  checkTypes,
  compile,
  emitDeclarations,
  entries,
  legacyTsupOptions,
  platform,
  platformEsbuild,
  verbose
}) {
  const results = await Promise.all(
    Object.entries(entries).map(async ([srcDir, options]) => {
      const rootOutDir = getRootOutDir(options);
      const outDir = `${rootOutDir}/${platform}`;
      const entry = buildEntries(srcDir, compile?.entryMode, options, true, verbose);
      return compileFolder(
        srcDir,
        entry,
        esbuildOptions([
          platformEsbuild,
          legacyTsupOptions ?? {},
          compile?.esbuild?.options ?? {},
          options,
          { outdir: outDir }
        ], verbose),
        platform,
        outDir,
        checkTypes,
        () => emitDeclarations(srcDir, rootOutDir, platform, outDir),
        compile?.entryMode,
        verbose
      );
    })
  );
  return results.reduce((prev, value) => prev + value, 0);
}
var packageCompileEsbuild = async (config2, mode = {}) => {
  const {
    compile,
    shouldEmit,
    shouldRunFolderChecks,
    shouldRunFullValidation,
    verbose
  } = resolveCompileMode(config2, mode);
  if (verbose) {
    console.log("Compiling with esbuild and tsc");
  }
  if (shouldRunFullValidation) {
    const validateResult = validateFullPackage(cwd2(), verbose);
    if (validateResult !== 0) {
      return validateResult;
    }
  }
  if (!shouldEmit) return 0;
  const compileForNode = resolvePlatformRecord(compile?.node);
  const compileForBrowser = resolvePlatformRecord(compile?.browser);
  const compileForNeutral = resolvePlatformRecord(compile?.neutral);
  const nodeEsbuild = resolvePlatformEsbuildOptions(compile?.node);
  const browserEsbuild = resolvePlatformEsbuildOptions(compile?.browser);
  const neutralEsbuild = resolvePlatformEsbuildOptions(compile?.neutral);
  const legacyTsupOptions = compile?.tsup?.options;
  const emitDeclarations = createDeclarationEmitter(verbose);
  const [nodeErrors, browserErrors, neutralErrors] = await Promise.all([
    compilePlatformEntries({
      checkTypes: shouldRunFolderChecks,
      compile,
      emitDeclarations,
      entries: compileForNode,
      legacyTsupOptions,
      platform: "node",
      platformEsbuild: nodeEsbuild,
      verbose
    }),
    compilePlatformEntries({
      checkTypes: shouldRunFolderChecks,
      compile,
      emitDeclarations,
      entries: compileForBrowser,
      legacyTsupOptions,
      platform: "browser",
      platformEsbuild: browserEsbuild,
      verbose
    }),
    compilePlatformEntries({
      checkTypes: shouldRunFolderChecks,
      compile,
      emitDeclarations,
      entries: compileForNeutral,
      legacyTsupOptions,
      platform: "neutral",
      platformEsbuild: neutralEsbuild,
      verbose
    })
  ]);
  return nodeErrors + browserErrors + neutralErrors;
};

// src/actions/package/compile/compile.ts
var packageCompile = async (inConfig = {}, mode = {}) => {
  const pkg = cwd3();
  console.log(chalk8.green(`Compiling ${pkg}`));
  const config2 = await loadConfig(inConfig);
  return await packageCompileEsbuild(config2, mode);
};

// src/actions/package/compile/packageCompileTsc.ts
import { cwd as cwd5 } from "node:process";
import chalk9 from "chalk";
import { createProgramFromConfig } from "tsc-prog";
import ts2, {
  DiagnosticCategory,
  formatDiagnosticsWithColorAndContext as formatDiagnosticsWithColorAndContext2,
  getPreEmitDiagnostics,
  sys as sys2
} from "typescript";

// src/actions/package/compile/getCompilerOptions.ts
import { cwd as cwd4 } from "node:process";
import deepmerge2 from "deepmerge";
import { getTsconfig } from "get-tsconfig";
var getCompilerOptions = (options = {}, fileName = "tsconfig.json") => {
  const resolvedTsConfigCompilerOptions = getTsconfig(cwd4(), fileName)?.config?.compilerOptions ?? {};
  return deepmerge2(resolvedTsConfigCompilerOptions, options);
};

// src/actions/package/compile/packageCompileTsc.ts
var packageCompileTsc = (platform, entries, srcDir = "src", outDir = "dist", compilerOptionsParam, verbose = false) => {
  const pkg = cwd5();
  if (verbose) {
    console.log(chalk9.cyan(`Validating code START: ${entries.length} files to ${outDir} from ${srcDir}`));
  }
  const configFilePath = ts2.findConfigFile(
    pkg,
    (fileName) => ts2.sys.fileExists(fileName),
    "tsconfig.json"
  );
  if (configFilePath === void 0) {
    throw new Error("Could not find tsconfig.json");
  }
  const compilerOptions = {
    ...getCompilerOptions({
      removeComments: false,
      skipDefaultLibCheck: true,
      skipLibCheck: true,
      sourceMap: false
    }),
    ...compilerOptionsParam,
    outDir: `${outDir}/${platform}`,
    emitDeclarationOnly: true,
    noEmit: false
  };
  console.log(chalk9.cyan(`Validating Files: ${entries.length}`));
  if (verbose) {
    for (const entry of entries) {
      console.log(chalk9.grey(`Validating: ${entry}`));
    }
  }
  try {
    if (entries.length > 0) {
      const program = createProgramFromConfig({
        configFilePath,
        basePath: pkg,
        compilerOptions,
        files: entries.map((entry) => `${srcDir}/${entry}`),
        include: [`${srcDir}/**/*.*`]
      });
      const diagnostics = getPreEmitDiagnostics(program);
      if (diagnostics.length > 0) {
        const formattedDiagnostics = formatDiagnosticsWithColorAndContext2(
          diagnostics,
          {
            getCanonicalFileName: (fileName) => fileName,
            getCurrentDirectory: () => srcDir,
            getNewLine: () => sys2.newLine
          }
        );
        console.error(formattedDiagnostics);
      }
      const nonEmitPatterns = [".stories.", "/stories/", "/stories.", ".spec.", "/spec/", "/spec.", ".example."];
      program.emit(void 0, (fileName, text, writeByteOrderMark) => {
        if (nonEmitPatterns.some((pattern) => fileName.includes(pattern))) {
          return;
        }
        ts2.sys.writeFile(fileName, text, writeByteOrderMark);
      });
      const strict = isStrictMode();
      let count = 0;
      for (const diag of diagnostics) {
        if (diag.category === DiagnosticCategory.Error) {
          count++;
        } else if (strict && diag.category === DiagnosticCategory.Warning) {
          count++;
        }
      }
      return count;
    }
    return 0;
  } finally {
    if (verbose) {
      console.log(chalk9.cyan(`Validating code FINISH: ${entries.length} files to ${outDir} from ${srcDir}`));
    }
  }
};

// src/actions/package/compile/packageCompileTsup.ts
var packageCompileTsup = async (config2) => packageCompileEsbuild(config2);

// src/actions/package/compile/XyConfig.ts
var ALL_PUBLINT_CHECKS = [
  "files",
  "importToDefault",
  "main",
  "module",
  "peerDeps",
  "publint",
  "resolutions",
  "rootSource",
  "rootTypes",
  "sideEffects",
  "source",
  "types"
];
var PUBLISH_ONLY_CHECKS = [
  "files",
  "importToDefault",
  "main",
  "module",
  "publint",
  "rootSource",
  "rootTypes",
  "sideEffects",
  "source",
  "types"
];

// src/actions/package/copy-assets.ts
import path6 from "node:path/posix";
import chalk10 from "chalk";
import cpy from "cpy";
var copyTargetAssets = async (target, name, location) => {
  try {
    const values = await cpy(
      ["**/*.jpg", "**/*.png", "**/*.gif", "**/*.svg", "**/*.webp", "**/*.sass", "**/*.scss", "**/*.gif", "**/*.css"],
      `../dist/${target}`,
      {
        cwd: path6.join(location, "src"),
        flat: false
      }
    );
    if (values.length > 0) {
      console.log(chalk10.green(`Copying Assets [${target.toUpperCase()}] - ${name} - ${location}`));
    }
    for (const value of values) {
      console.log(`${value.split("/").pop()} => ./dist/${target}`);
    }
    return 0;
  } catch (ex) {
    const error = ex;
    console.log(`Copy Assets Failed: ${name}: ${error.message}`);
    return 1;
  }
};
var packageCopyAssets = async ({ target }) => {
  const pkg = INIT_CWD();
  const pkgName = packageName() ?? "Unknown";
  switch (target) {
    case "esm": {
      return await copyTargetAssets("esm", pkgName, pkg);
    }
    case "cjs": {
      return await copyTargetAssets("cjs", pkgName, pkg);
    }
    default: {
      return await copyTargetAssets("esm", pkgName, pkg) || await copyTargetAssets("cjs", pkgName, pkg);
    }
  }
};

// src/actions/package/lint.ts
import { readdirSync } from "node:fs";
import path7 from "node:path";
import { cwd as cwd6 } from "node:process";
import { pathToFileURL } from "node:url";
import chalk11 from "chalk";
import { ESLint } from "eslint";
import { findUp } from "find-up";
import picomatch from "picomatch";
var dumpMessages = (lintResults) => {
  const colors = ["white", "yellow", "red"];
  const severity = ["none", "warning", "error"];
  for (const lintResult of lintResults) {
    if (lintResult.messages.length > 0) {
      console.log(chalk11.gray(`
${lintResult.filePath}`));
      for (const message of lintResult.messages) {
        console.log(
          chalk11.gray(`	${message.line}:${message.column}`),
          chalk11[colors[message.severity]](`	${severity[message.severity]}`),
          chalk11.white(`	${message.message}`),
          chalk11.gray(`	${message.ruleId}`)
        );
      }
    }
  }
};
async function getRootESLintConfig() {
  const configPath = await findUp(["eslint.config.ts", "eslint.config.mjs"]);
  if (configPath === void 0) {
    throw new Error("eslint.config.ts not found in the monorepo");
  }
  return pathToFileURL(configPath);
}
function getFiles(dir, ignoreFolders) {
  const currentDirectory = cwd6();
  const subDirectory = dir.split(currentDirectory)[1]?.split("/")[1];
  if (ignoreFolders.includes(subDirectory)) return [];
  return readdirSync(dir, { withFileTypes: true }).flatMap((dirent) => {
    const res = path7.resolve(dir, dirent.name);
    const relativePath3 = subDirectory === void 0 ? dirent.name : `${subDirectory}/${dirent.name}`;
    const ignoreMatchers = ignoreFolders.map((pattern) => picomatch(pattern));
    if (ignoreMatchers.some((isMatch) => isMatch(relativePath3))) return [];
    return dirent.isDirectory() ? getFiles(res, ignoreFolders) : [res];
  });
}
var packageLint = async (fix = false, verbose = false, cache = true) => {
  const pkg = INIT_CWD();
  const configPath = await getRootESLintConfig();
  const { default: eslintConfig } = await import(configPath.href);
  const start = Date.now();
  const ignoreFolders = ["node_modules", "dist", "packages", ".git", "build", ".yarn", ".vscode", ".github"];
  const engine = new ESLint({
    baseConfig: [...eslintConfig],
    fix,
    warnIgnored: false,
    cache
  });
  const files = getFiles(cwd6(), ignoreFolders);
  console.log(chalk11.green(`Linting ${pkg} [files = ${files.length}]`));
  if (verbose) {
    for (const file of files) {
      console.log(chalk11.gray(`	${file}`));
    }
  }
  const lintResults = await engine.lintFiles(files);
  dumpMessages(lintResults);
  if (fix) {
    await ESLint.outputFixes(lintResults);
  }
  const filesCountColor = files.length < 100 ? "green" : files.length < 1e3 ? "yellow" : "red";
  const lintTime = Date.now() - start;
  const lintTimeColor = lintTime < 1e3 ? "green" : lintTime < 3e3 ? "yellow" : "red";
  console.log(chalk11.white(`Linted ${chalk11[filesCountColor](files.length)} files in ${chalk11[lintTimeColor](lintTime)}ms`));
  return lintResults.reduce((prev, lintResult) => prev + lintResult.errorCount, 0);
};

// src/actions/package/publint.ts
import { promises as fs4 } from "node:fs";
import path8 from "node:path";
import chalk12 from "chalk";
import { glob as glob3 } from "glob";
import sortPackageJson from "sort-package-json";
var removeSourceFromExports = (exports) => {
  let removed = false;
  for (const [key, value] of Object.entries(exports)) {
    if (key === "source") {
      delete exports[key];
      removed = true;
    } else if (typeof value === "object" && value !== null && removeSourceFromExports(value)) removed = true;
  }
  return removed;
};
var hasSourceInExports = (exports) => {
  for (const [key, value] of Object.entries(exports)) {
    if (key === "source") return true;
    if (typeof value === "object" && value !== null && hasSourceInExports(value)) return true;
  }
  return false;
};
var hasImportKeyInExports = (exports) => {
  for (const [key, value] of Object.entries(exports)) {
    if (key === "import" && typeof value === "string" && value.endsWith(".mjs")) return true;
    if (typeof value === "object" && value !== null && hasImportKeyInExports(value)) return true;
  }
  return false;
};
var replaceImportWithDefault = (exports) => {
  let modified = false;
  for (const [key, value] of Object.entries(exports)) {
    if (key === "import" && typeof value === "string" && value.endsWith(".mjs")) {
      if (exports.default === void 0) {
        exports.default = value;
      }
      delete exports.import;
      if (exports.types === void 0) {
        exports.types = value.replace(/\.mjs$/, ".d.ts");
      }
      modified = true;
    } else if (typeof value === "object" && value !== null && replaceImportWithDefault(value)) modified = true;
  }
  return modified;
};
var hasTypesInExports = (exports) => {
  for (const [key, value] of Object.entries(exports)) {
    if (key === "types") return true;
    if (typeof value === "object" && value !== null && hasTypesInExports(value)) return true;
  }
  return false;
};
function ensureExportsPath(value) {
  if (value.startsWith("./") || value.startsWith("../")) return value;
  return `./${value}`;
}
function emptyCustomResult() {
  return {
    errors: 0,
    modified: false,
    warnings: 0
  };
}
function mergeResults(target, source) {
  target.errors += source.errors;
  target.warnings += source.warnings;
  target.modified = target.modified || source.modified;
}
function checkFiles(pkg, fix) {
  const result = emptyCustomResult();
  const files = pkg.files;
  if (files === void 0) {
    console.warn(chalk12.yellow('Publint [custom]: "files" field is missing'));
    result.warnings++;
  }
  if (Array.isArray(files) && !files.includes("README.md")) {
    files.push("README.md");
    console.warn(chalk12.yellow('Publint [custom]: added "README.md" to "files"'));
    result.modified = true;
    result.warnings++;
  }
  if (Array.isArray(files) && files.includes("src")) {
    if (fix) {
      pkg.files = files.filter((f) => f !== "src");
      console.warn(chalk12.yellow('Publint [custom]: removed "src" from "files"'));
      result.modified = true;
    } else {
      console.warn(chalk12.yellow('Publint [custom]: "src" should not be in "files" (use --fix to remove)'));
    }
    result.warnings++;
  }
  return result;
}
function checkExportsSource(pkg, fix) {
  const result = emptyCustomResult();
  const exports = pkg.exports;
  if (exports && typeof exports === "object" && hasSourceInExports(exports)) {
    if (fix) {
      removeSourceFromExports(exports);
      console.warn(chalk12.yellow('Publint [custom]: removed "source" entries from "exports"'));
      result.modified = true;
    } else {
      console.warn(chalk12.yellow('Publint [custom]: "source" entries should not be in "exports" (use --fix to remove)'));
    }
    result.warnings++;
  }
  return result;
}
function migrateFieldToExports(pkg, field, exportKey, fix) {
  const result = emptyCustomResult();
  if (pkg[field] === void 0) return result;
  const fieldValue = pkg[field];
  if (!fieldValue.endsWith(".js") && !fieldValue.endsWith(".mjs") && !fieldValue.endsWith(".cjs")) return result;
  if (fix) {
    const exportValue = ensureExportsPath(fieldValue);
    const exports = pkg.exports;
    if (exports && typeof exports === "object") {
      const dot = exports["."];
      if (dot && typeof dot === "object" && !dot[exportKey]) {
        dot[exportKey] = exportValue;
        console.warn(chalk12.yellow(`Publint [custom]: migrated "${field}" to "exports['.'].${exportKey}" (${fieldValue})`));
      }
    } else if (!pkg.exports) {
      pkg.exports = { ".": { [exportKey]: exportValue } };
      console.warn(chalk12.yellow(`Publint [custom]: migrated "${field}" to "exports" (.\u2192${fieldValue})`));
    }
    delete pkg[field];
    console.warn(chalk12.yellow(`Publint [custom]: removed deprecated "${field}" field`));
    result.modified = true;
  } else {
    console.warn(chalk12.yellow(`Publint [custom]: "${field}" field is deprecated, use "exports" instead (use --fix to remove)`));
  }
  result.warnings++;
  return result;
}
function checkSideEffects(pkg) {
  const result = emptyCustomResult();
  if (pkg.sideEffects !== false) {
    console.warn(chalk12.yellow('Publint [custom]: "sideEffects" field should be set to false'));
    result.warnings++;
  }
  return result;
}
function checkRootSource(pkg, fix) {
  const result = emptyCustomResult();
  for (const field of ["source", "src"]) {
    if (pkg[field] !== void 0) {
      if (fix) {
        delete pkg[field];
        console.warn(chalk12.yellow(`Publint [custom]: removed root-level "${field}" field`));
        result.modified = true;
      } else {
        console.warn(chalk12.yellow(`Publint [custom]: root-level "${field}" field should not be in package.json (use --fix to remove)`));
      }
      result.warnings++;
    }
  }
  return result;
}
function checkResolutions(pkg) {
  const result = emptyCustomResult();
  if (pkg.resolutions !== void 0) {
    console.warn(chalk12.yellow('Publint [custom]: "resolutions" in use'));
    console.warn(chalk12.gray(JSON.stringify(pkg.resolutions, null, 2)));
    result.warnings++;
  }
  return result;
}
function checkImportToDefault(pkg, fix) {
  const result = emptyCustomResult();
  const exports = pkg.exports;
  if (!exports || typeof exports !== "object") return result;
  if (!hasImportKeyInExports(exports)) return result;
  if (fix) {
    replaceImportWithDefault(exports);
    console.warn(chalk12.yellow('Publint [custom]: renamed "import" to "default" in "exports" and ensured "types" siblings'));
    result.modified = true;
  } else {
    console.warn(chalk12.yellow('Publint [custom]: "import" entries in "exports" should use "default" instead (use --fix to rename)'));
  }
  result.warnings++;
  return result;
}
function checkRootTypes(pkg, fix) {
  const result = emptyCustomResult();
  if (pkg.types === void 0) return result;
  const exports = pkg.exports;
  if (!exports || typeof exports !== "object" || !hasTypesInExports(exports)) return result;
  if (fix) {
    delete pkg.types;
    console.warn(chalk12.yellow('Publint [custom]: removed redundant root "types" field (already defined in "exports")'));
    result.modified = true;
  } else {
    console.warn(chalk12.yellow('Publint [custom]: root "types" field is redundant when "exports" defines types (use --fix to remove)'));
  }
  result.warnings++;
  return result;
}
function customPubLint(pkg, fix = false, exclude = /* @__PURE__ */ new Set()) {
  const result = emptyCustomResult();
  if (!exclude.has("files")) mergeResults(result, checkFiles(pkg, fix));
  if (!exclude.has("source")) mergeResults(result, checkExportsSource(pkg, fix));
  if (!exclude.has("rootSource")) mergeResults(result, checkRootSource(pkg, fix));
  if (!exclude.has("main")) mergeResults(result, migrateFieldToExports(pkg, "main", "default", fix));
  if (!exclude.has("types")) mergeResults(result, migrateFieldToExports(pkg, "types", "types", fix));
  if (!exclude.has("module")) mergeResults(result, migrateFieldToExports(pkg, "module", "default", fix));
  if (!exclude.has("importToDefault")) mergeResults(result, checkImportToDefault(pkg, fix));
  if (!exclude.has("rootTypes")) mergeResults(result, checkRootTypes(pkg, fix));
  if (!exclude.has("sideEffects")) mergeResults(result, checkSideEffects(pkg));
  if (!exclude.has("resolutions")) mergeResults(result, checkResolutions(pkg));
  return [result.errors, result.warnings, result.modified];
}
var ALWAYS_INCLUDED_PATTERNS = [
  "package.json",
  "README",
  "README.*",
  "LICENCE",
  "LICENCE.*",
  "LICENSE",
  "LICENSE.*",
  "CHANGELOG",
  "CHANGELOG.*"
];
async function resolvePackFiles(pkgDir, filesField) {
  const patterns = [...ALWAYS_INCLUDED_PATTERNS];
  if (filesField) {
    for (const pattern of filesField) {
      if (pattern.startsWith("!")) {
        patterns.push(pattern);
      } else {
        patterns.push(pattern, `${pattern}/**`);
      }
    }
  }
  const matched = await glob3(patterns, {
    cwd: pkgDir,
    nodir: true,
    dot: false
  });
  const files = await Promise.all(
    matched.map(async (rel) => {
      const abs = path8.join(pkgDir, rel);
      const data = await fs4.readFile(abs, "utf8").catch(() => "");
      return { name: path8.join(pkgDir, rel), data };
    })
  );
  return files;
}
async function runPublintLibrary(pkgDir, pkg, strict, pack) {
  const { publint } = await import("publint");
  let packOption = false;
  if (pack) {
    const files = await resolvePackFiles(pkgDir, pkg.files);
    packOption = { files };
  }
  const { messages } = await publint({
    level: "suggestion",
    pack: packOption,
    pkgDir,
    strict
  });
  const { formatMessage } = await import("publint/utils");
  for (const message of messages) {
    switch (message.type) {
      case "error": {
        console.error(chalk12.red(`[${message.code}] ${formatMessage(message, pkg)}`));
        break;
      }
      case "warning": {
        console.warn(chalk12.yellow(`[${message.code}] ${formatMessage(message, pkg)}`));
        break;
      }
      default: {
        console.log(chalk12.white(`[${message.code}] ${formatMessage(message, pkg)}`));
        break;
      }
    }
  }
  return {
    errors: messages.filter((message) => message.type === "error").length,
    total: messages.length
  };
}
var packagePublint = async ({
  exclude = /* @__PURE__ */ new Set(),
  fix = false,
  pack = true,
  pkgDir: pkgDirParam,
  strict = isStrictMode(),
  verbose: _verbose = false
} = {}) => {
  const pkgDir = path8.resolve(pkgDirParam ?? INIT_CWD());
  const sortedPkg = sortPackageJson(await fs4.readFile(`${pkgDir}/package.json`, "utf8"));
  await fs4.writeFile(`${pkgDir}/package.json`, sortedPkg);
  const pkg = JSON.parse(await fs4.readFile(`${pkgDir}/package.json`, "utf8"));
  const effectiveExclude = pkg.private ? /* @__PURE__ */ new Set([...exclude, ...PUBLISH_ONLY_CHECKS]) : exclude;
  console.log(chalk12.green(`Publint: ${String(pkg.name)}${pkg.private ? chalk12.gray(" (private)") : ""}`));
  console.log(chalk12.gray(pkgDir));
  let libraryErrors = 0;
  if (!effectiveExclude.has("publint")) {
    const library = await runPublintLibrary(pkgDir, pkg, strict, pack);
    libraryErrors = library.errors;
  }
  const [errorCount, _warningCount, modified] = customPubLint(pkg, fix, effectiveExclude);
  if (modified) {
    const sorted = sortPackageJson(JSON.stringify(pkg, null, 2));
    await fs4.writeFile(`${pkgDir}/package.json`, sorted);
  }
  return libraryErrors + errorCount;
};

// src/actions/package/recompile.ts
var packageRecompile = async (config2 = {}) => {
  return packageClean() || await packageCompile(config2);
};
export {
  ALL_PUBLINT_CHECKS,
  PUBLISH_ONLY_CHECKS,
  createEsbuildEntryPoints,
  createTypescriptConfig,
  esbuildOptions,
  packageClean,
  packageCleanOutputs,
  packageCleanTypescript,
  packageCompile,
  packageCompileEsbuild,
  packageCompileTsc,
  packageCompileTsup,
  packageCopyAssets,
  packageLint,
  packagePublint,
  packageRecompile,
  resolvePlatformEsbuildOptions,
  resolvePlatformRecord,
  tsupOptions,
  validateFullPackage
};
//# sourceMappingURL=index.mjs.map
