import path from 'node:path';
export function sanitizarRelPath(rel) {
    if (!rel)
        return '';
    rel = rel.replace(/^[A-Za-z]:\\?/u, '').replace(/^\/+/, '');
    const norm = rel.replace(/\\+/g, '/');
    const collapsed = path.posix.normalize(norm);
    if (collapsed.startsWith('..')) {
        const semDots = collapsed.replace(new RegExp('^(\\.\\.\\/?|\\.\\/)+'), '');
        return semDots.replace(/^\/+/, '');
    }
    return collapsed.replace(/^\/+/, '');
}
export function estaDentro(baseDir, alvo) {
    const rel = path.relative(baseDir, alvo);
    return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);
}
export function resolverPluginSeguro(baseDir, pluginRel) {
    try {
        if (typeof pluginRel !== 'string' || !pluginRel.trim()) {
            return {
                erro: 'entrada de plugin inválida (string vazia)'
            };
        }
        const resolvido = path.resolve(baseDir, pluginRel);
        if (!estaDentro(baseDir, resolvido)) {
            return {
                erro: 'plugin fora da raiz do projeto (bloqueado)'
            };
        }
        const permitido = [/\.(c|m)?js$/i, /\.ts$/i];
        if (!permitido.some(raiz => raiz.test(resolvido))) {
            return {
                erro: 'extensão de plugin não permitida'
            };
        }
        return {
            caminho: resolvido
        };
    }
    catch (erro) {
        return {
            erro: erro.message || String(erro)
        };
    }
}
export function validarGlobBasico(padrao) {
    if (padrao.length > 300)
        return false;
    const ocorrencias = (padrao.match(/\*\*/g) || []).length;
    if (ocorrencias >= 5)
        return false;
    return true;
}
export function filtrarGlobSeguros(padroes) {
    return padroes.filter(caminho => validarGlobBasico(caminho));
}
//# sourceMappingURL=security.js.map