41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
import path from 'path';
|
|
|
|
export { path };
|
|
|
|
export function basenameAny(value, fallback = '') {
|
|
const normalized = String(value || fallback || '').replace(/\\/g, '/');
|
|
return path.posix.basename(normalized);
|
|
}
|
|
|
|
export function extnameAny(value) {
|
|
return path.extname(basenameAny(value)).toLowerCase();
|
|
}
|
|
|
|
export function nameWithoutExtensionAny(value, fallback = '') {
|
|
return path.parse(basenameAny(value, fallback)).name;
|
|
}
|
|
|
|
export function sanitizeFileName(name, fallback = 'asset.bin') {
|
|
return basenameAny(name, fallback)
|
|
.replace(/[/\\?%*:|"<>]/g, '-')
|
|
.replace(/\s+/g, ' ')
|
|
.trim()
|
|
.slice(0, 180) || fallback;
|
|
}
|
|
|
|
export function normalizePackagePath(value, fallbackName = '') {
|
|
const clean = String(value || fallbackName || '')
|
|
.replace(/\\/g, '/')
|
|
.split('/')
|
|
.filter((part) => part && part !== '.' && part !== '..')
|
|
.join('/');
|
|
return clean.slice(0, 500);
|
|
}
|
|
|
|
export function isPathInside(parentDir, candidatePath) {
|
|
const parent = path.resolve(parentDir);
|
|
const candidate = path.resolve(candidatePath);
|
|
const relative = path.relative(parent, candidate);
|
|
return relative === '' || (relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
}
|