/**
 * Phase — npm pack 验证。
 *
 * 运行 `npm pack --dry-run --json` 验证：
 * 1. 包必须包含关键产物文件 (dist/bin/soloforge.js, dist/index.js, templates/)
 * 2. 包不得包含禁止文件 (.env, credentials, .git/, *.secret*)
 */
import { execFileSync } from "node:child_process";
import { safeJsonParse } from "../../core/helpers.js";
// 必须包含的文件/目录
const REQUIRED_ENTRIES = [
    "dist/bin/soloforge.js",
    "dist/index.js",
];
// 至少需要匹配到以下目录之一
const REQUIRED_TEMPLATE_PREFIXES = [
    "templates/",
];
// 禁止包含的文件模式
const FORBIDDEN_PATTERNS = [
    ".env",
    "credentials",
    ".git/",
    ".secret",
];
export async function check(ctx, hardFail, _info) {
    const rootDir = ctx.rootDir;
    let rawOutput;
    // 运行 npm pack --dry-run --json
    try {
        rawOutput = execFileSync("npm", ["pack", "--dry-run", "--json"], { cwd: rootDir, encoding: "utf-8", timeout: 30_000, stdio: ["pipe", "pipe", "pipe"] });
    }
    catch {
        // npm pack 不可用或执行失败 — 跳过（不产生 hard_fail）
        // 发布门禁应在有 dist/ 的环境中运行；没有 npm 则跳过此检查
        return;
    }
    const packData = safeJsonParse(rawOutput);
    if (!packData) {
        hardFail("NPM_PACK_PARSE_ERROR", "npm pack --dry-run --json 输出无法解析为 JSON", ["package.json"], "npm pack 验证", "旧 gate 不验证 npm pack 输出", "检查 npm pack 输出格式");
        return;
    }
    if (!packData || packData.length === 0) {
        hardFail("NPM_PACK_EMPTY", "npm pack --dry-run --json 返回空结果", ["package.json"], "npm pack 验证", "旧 gate 不验证 npm pack 输出", "检查 package.json 的 files 字段");
        return;
    }
    const pack = packData[0];
    const filePaths = pack.files.map((f) => f.path);
    // ── 检查 1: 必须包含的关键文件 ──
    for (const required of REQUIRED_ENTRIES) {
        if (!filePaths.includes(required)) {
            hardFail("NPM_PACK_MISSING_REQUIRED", `npm pack 产物缺少必要文件: ${required}`, ["package.json", required], "npm pack 验证", "旧 gate 不验证 npm pack 内容完整性", `确保 package.json 的 files 字段包含 ${required}`);
        }
    }
    // ── 检查 2: 必须包含 templates/ 目录下的文件 ──
    const hasTemplates = filePaths.some((p) => REQUIRED_TEMPLATE_PREFIXES.some((prefix) => p.startsWith(prefix)));
    if (!hasTemplates) {
        hardFail("NPM_PACK_MISSING_TEMPLATES", "npm pack 产物缺少 templates/ 目录（无任何模板文件）", ["package.json", "templates/"], "npm pack 验证", "旧 gate 不验证 npm pack 模板完整性", "确保 package.json 的 files 字段包含 templates/");
    }
    // ── 检查 3: 禁止文件检查 ──
    for (const filePath of filePaths) {
        for (const forbidden of FORBIDDEN_PATTERNS) {
            if (filePath === forbidden || filePath.startsWith(forbidden) || filePath.includes(forbidden)) {
                hardFail("NPM_PACK_FORBIDDEN_FILE", `npm pack 产物包含禁止文件: ${filePath}（匹配规则: ${forbidden}）`, ["package.json", filePath], "npm pack 验证", "旧 gate 不检测 npm pack 中的敏感文件", `从 package.json 的 files 字段中排除 ${forbidden}，或添加 .npmignore`);
            }
        }
    }
}
//# sourceMappingURL=checkNpmPack.js.map