73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
import { createRequire } from "node:module";
|
|
import path from "node:path";
|
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
import { prependForwardSlash, slash } from "../core/path.js";
|
|
import { resolveJsToTs, unwrapId, VALID_ID_PREFIX, viteID } from "./util.js";
|
|
const isWindows = typeof process !== "undefined" && process.platform === "win32";
|
|
function normalizePath(id) {
|
|
return path.posix.normalize(isWindows ? slash(id) : id);
|
|
}
|
|
function resolvePath(specifier, importer) {
|
|
if (specifier.startsWith(".")) {
|
|
const absoluteSpecifier = path.resolve(path.dirname(importer), specifier);
|
|
return resolveJsToTs(normalizePath(absoluteSpecifier));
|
|
} else if (specifier.startsWith("#")) {
|
|
try {
|
|
const resolved = createRequire(pathToFileURL(importer)).resolve(specifier);
|
|
return resolveJsToTs(normalizePath(resolved));
|
|
} catch {
|
|
try {
|
|
const importerURL = pathToFileURL(importer).toString();
|
|
const resolved = import.meta.resolve(specifier, importerURL);
|
|
const resolvedUrl = new URL(resolved);
|
|
if (resolvedUrl.protocol === "file:") {
|
|
return resolveJsToTs(normalizePath(fileURLToPath(resolvedUrl)));
|
|
}
|
|
} catch {
|
|
}
|
|
}
|
|
return specifier;
|
|
} else {
|
|
return specifier;
|
|
}
|
|
}
|
|
function rootRelativePath(root, idOrUrl, shouldPrependForwardSlash = true) {
|
|
let id;
|
|
if (typeof idOrUrl !== "string") {
|
|
id = unwrapId(viteID(idOrUrl));
|
|
} else {
|
|
id = idOrUrl;
|
|
}
|
|
const normalizedRoot = normalizePath(fileURLToPath(root));
|
|
if (id.startsWith(normalizedRoot)) {
|
|
id = id.slice(normalizedRoot.length);
|
|
}
|
|
return shouldPrependForwardSlash ? prependForwardSlash(id) : id;
|
|
}
|
|
async function resolveIdToUrl(loader, id, root) {
|
|
let resultId = await loader.resolveId(id, void 0);
|
|
if (!resultId && id.endsWith(".jsx")) {
|
|
resultId = await loader.resolveId(id.slice(0, -4), void 0);
|
|
}
|
|
if (!resultId) {
|
|
return VALID_ID_PREFIX + id;
|
|
}
|
|
if (path.isAbsolute(resultId)) {
|
|
const normalizedRoot = root && normalizePath(fileURLToPath(root));
|
|
if (normalizedRoot && resultId.startsWith(normalizedRoot)) {
|
|
return resultId.slice(normalizedRoot.length - 1);
|
|
} else {
|
|
return "/@fs" + prependForwardSlash(resultId);
|
|
}
|
|
}
|
|
return VALID_ID_PREFIX + resultId;
|
|
}
|
|
const CSS_LANGS_RE = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
|
|
export {
|
|
CSS_LANGS_RE,
|
|
normalizePath,
|
|
resolveIdToUrl,
|
|
resolvePath,
|
|
rootRelativePath
|
|
};
|