vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
103 lines (102 loc) • 6.27 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolvePointerImport = resolvePointerImport;
exports.resolvePointerImportData = resolvePointerImportData;
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
const utils_js_1 = require("../../utils.js");
const pointerImports_js_1 = require("./pointerImports.js");
const getFilePath_js_1 = require("../getFilePath.js");
function resolvePointerImport(configValue, importerFilePath, userRootDir, configName) {
if (typeof configValue !== 'string')
return null;
const pointerImportData = (0, pointerImports_js_1.parsePointerImportData)(configValue);
if (!pointerImportData)
return null;
const { exportName } = pointerImportData;
const filePath = resolvePointerImportData(pointerImportData, importerFilePath, userRootDir);
const fileExportPathToShowToUser = exportName === 'default' || exportName === configName ? [] : [exportName];
const fileExportPath = {
...filePath,
fileExportName: exportName,
fileExportPathToShowToUser,
};
return { fileExportPath };
}
function resolvePointerImportData(pointerImportData, importerFilePath, userRootDir) {
const { importPath } = pointerImportData;
(0, pointerImports_js_1.assertPointerImportPath)(importPath);
const filePathAbsoluteFilesystem = resolveImportPathWithNode(pointerImportData, importerFilePath, userRootDir);
let filePath;
(0, utils_js_1.assertPosixPath)(importPath);
if ((0, utils_js_1.isImportPathRelative)(importPath) || (0, utils_js_1.isFilePathAbsolute)(importPath)) {
// Pointer imports are included in virtual files, thus relative imports need to be resolved. (Virtual modules cannot contain relative imports.)
assertUsageResolutionSuccess(filePathAbsoluteFilesystem, pointerImportData, importerFilePath);
// Pointer imports are included in virtual files, and we need filePathAbsoluteUserRootDir because we didn't find a way to have filesystem absolute import paths in virtual files: https://gist.github.com/brillout/2315231c9a8164f950c64b4b4a7bbd39
const errSuffix = `outside of the ${userRootDir} directory which is forbidden: make sure your import paths resolve inside the ${userRootDir} directory, or import from an npm package.`;
const filePathAbsoluteUserRootDir = (0, getFilePath_js_1.getFilePathAbsoluteUserRootDir)({ filePathAbsoluteFilesystem, userRootDir });
if ((0, utils_js_1.isImportPathRelative)(importPath)) {
(0, utils_js_1.assertUsage)(filePathAbsoluteUserRootDir, `The relative import ${picocolors_1.default.cyan(importPath)} defined by ${importerFilePath.filePathToShowToUser} resolves to ${filePathAbsoluteFilesystem} ${errSuffix}`);
}
else {
(0, utils_js_1.assert)((0, utils_js_1.isFilePathAbsolute)(importPath));
(0, utils_js_1.assertUsage)(filePathAbsoluteUserRootDir, `The import path ${importPath} defined by ${importerFilePath.filePathToShowToUser} is ${errSuffix}`);
}
// Forbid node_modules/ because it's brittle: if node_modules/ lives outside of userRootDir then it crashes.
(0, utils_js_1.assertUsage)(!filePathAbsoluteUserRootDir.includes('/node_modules/'), `The import path ${importPath} defined by ${importerFilePath.filePathToShowToUser} resolves to ${filePathAbsoluteFilesystem} inside of node_modules/ which is forbidden: use an npm package import instead.`);
filePath = (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir });
}
else {
(0, utils_js_1.assert)((0, utils_js_1.isImportPathNpmPackageOrPathAlias)(importPath));
const importPathAbsolute = importPath;
if (filePathAbsoluteFilesystem) {
filePath = (0, getFilePath_js_1.getFilePathResolved)({
userRootDir,
filePathAbsoluteFilesystem,
importPathAbsolute,
});
}
else {
// We cannot resolve path aliases defined only in Vite
filePath = (0, getFilePath_js_1.getFilePathUnresolved)({
importPathAbsolute,
});
}
}
return filePath;
}
function resolveImportPathWithNode(pointerImportData, importerFilePath, userRootDir) {
const importerFilePathAbsolute = importerFilePath.filePathAbsoluteFilesystem;
(0, utils_js_1.assertPosixPath)(importerFilePathAbsolute);
// filePathAbsoluteFilesystem is null when pointerImportData.importPath is a path alias that Node.js doesn't know about
const filePathAbsoluteFilesystem = (0, utils_js_1.requireResolveOptional)({
importPath: pointerImportData.importPath,
importerFilePath: importerFilePathAbsolute,
userRootDir,
});
if (!filePathAbsoluteFilesystem) {
(0, utils_js_1.assert)(!(0, utils_js_1.isImportPathRelative)(pointerImportData.importPath));
// Libraries don't use path aliases => filePathAbsoluteFilesystem should be defined
(0, utils_js_1.assert)(!importerFilePathAbsolute.includes('node_modules'));
}
return filePathAbsoluteFilesystem;
}
function assertUsageResolutionSuccess(filePathAbsoluteFilesystem, pointerImportData, importerFilePath) {
const { importPath: importPath, importStringWasGenerated, importString } = pointerImportData;
const { filePathToShowToUser } = importerFilePath;
if (!filePathAbsoluteFilesystem) {
const importPathString = picocolors_1.default.code(`${importPath}`);
const errIntro = importStringWasGenerated
? `The import path ${importPathString} in ${filePathToShowToUser}`
: `The import ${picocolors_1.default.code(importString)} defined by ${filePathToShowToUser}`;
const errIntro2 = `${errIntro} couldn't be resolved: does ${importPathString}`;
if ((0, utils_js_1.isImportPathRelative)(importPath)) {
(0, utils_js_1.assertUsage)(false, `${errIntro2} point to an existing file?`);
}
else {
(0, utils_js_1.assertUsage)(false, `${errIntro2} exist?`);
}
}
}