UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

103 lines (102 loc) 6.27 kB
"use strict"; 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?`); } } }