Files

134 lines
3.4 KiB
JavaScript
Raw Permalink Normal View History

2026-03-22 03:21:45 +02:00
"use strict";
// Pulsar/Atom loads packages via CommonJS `require()`. Modern `del` is ESM-only
// and requires Node >= 18. jibo-dev (bundled in this SDK) only needs the basic
// `del(patterns)` promise API for cleaning build outputs.
var fs = require("fs");
var path = require("path");
function normalizePatterns(patterns) {
if (!patterns) return [];
patterns = Array.isArray(patterns) ? patterns : [patterns];
// Support negation patterns by ignoring them (good enough for our usage).
return patterns.filter(function (p) {
return typeof p === "string" && p.length > 0 && p[0] !== "!";
});
}
function isInside(childPath, parentPath) {
var rel = path.relative(parentPath, childPath);
return rel && rel !== ".." && rel.indexOf(".." + path.sep) !== 0 && !path.isAbsolute(rel);
}
function rmRecursiveSync(targetPath) {
try {
var stat = fs.lstatSync(targetPath);
if (stat.isDirectory() && !stat.isSymbolicLink()) {
var entries = fs.readdirSync(targetPath);
for (var i = 0; i < entries.length; i++) {
rmRecursiveSync(path.join(targetPath, entries[i]));
}
fs.rmdirSync(targetPath);
return;
}
fs.unlinkSync(targetPath);
} catch (err) {
if (err && (err.code === "ENOENT" || err.code === "ENOTDIR")) return;
throw err;
}
}
function expandIfGlob(pattern) {
// If glob isn't installed/available, just treat as a literal path.
if (!/[\*\?\[\]\{\}]/.test(pattern)) return [pattern];
try {
var glob = require("glob");
if (glob && typeof glob.sync === "function") {
return glob.sync(pattern, { dot: true, nodir: false });
}
} catch (_) {}
return [pattern];
}
function del(patterns, options) {
options = options || {};
var cwd = options.cwd ? path.resolve(String(options.cwd)) : process.cwd();
var force = Boolean(options.force);
var dryRun = Boolean(options.dryRun);
patterns = normalizePatterns(patterns);
var files = [];
patterns.forEach(function (p) {
expandIfGlob(p).forEach(function (m) {
files.push(m);
});
});
// Dedupe + stable sort (close enough to del's behavior).
var seen = Object.create(null);
files = files.filter(function (f) {
if (!f || typeof f !== "string") return false;
if (seen[f]) return false;
seen[f] = true;
return true;
}).sort();
return Promise.resolve().then(function () {
var removed = [];
for (var i = 0; i < files.length; i++) {
var abs = path.resolve(cwd, files[i]);
if (!force && !isInside(abs, cwd)) {
// Skip unsafe paths rather than throwing; build clean should be best-effort.
continue;
}
if (!dryRun) rmRecursiveSync(abs);
removed.push(abs);
}
return removed;
});
}
del.sync = function (patterns, options) {
options = options || {};
var cwd = options.cwd ? path.resolve(String(options.cwd)) : process.cwd();
var force = Boolean(options.force);
var dryRun = Boolean(options.dryRun);
patterns = normalizePatterns(patterns);
var files = [];
patterns.forEach(function (p) {
expandIfGlob(p).forEach(function (m) {
files.push(m);
});
});
var seen = Object.create(null);
files = files.filter(function (f) {
if (!f || typeof f !== "string") return false;
if (seen[f]) return false;
seen[f] = true;
return true;
}).sort();
var removed = [];
for (var i = 0; i < files.length; i++) {
var abs = path.resolve(cwd, files[i]);
if (!force && !isInside(abs, cwd)) continue;
if (!dryRun) rmRecursiveSync(abs);
removed.push(abs);
}
return removed;
};
module.exports = del;
module.exports.deleteAsync = del;
module.exports.deleteSync = del.sync;