typescript-transform-paths
Version:
Transforms module resolution paths using TypeScript path mapping and/or custom paths
159 lines • 7.65 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveModuleName = resolveModuleName;
const general_utils_1 = require("./general-utils");
const path = __importStar(require("node:path"));
const typescript_1 = require("typescript");
const ts_helpers_1 = require("./ts-helpers");
const get_relative_path_1 = require("./get-relative-path");
var IndexType;
(function (IndexType) {
IndexType[IndexType["NonIndex"] = 0] = "NonIndex";
IndexType[IndexType["Explicit"] = 1] = "Explicit";
IndexType[IndexType["Implicit"] = 2] = "Implicit";
IndexType[IndexType["ImplicitPackage"] = 3] = "ImplicitPackage";
})(IndexType || (IndexType = {}));
function getPathDetail(moduleName, resolvedModule) {
const resolvedFileName = resolvedModule.originalPath ?? resolvedModule.resolvedFileName;
const implicitPackageIndex = resolvedModule.packageId?.subModuleName;
const resolvedDir = implicitPackageIndex
? (0, typescript_1.removeSuffix)(resolvedFileName, `/${implicitPackageIndex}`)
: path.dirname(resolvedFileName);
const resolvedBaseName = implicitPackageIndex ? void 0 : path.basename(resolvedFileName);
const resolvedBaseNameNoExtension = resolvedBaseName && (0, typescript_1.removeFileExtension)(resolvedBaseName);
const resolvedExtName = resolvedBaseName && path.extname(resolvedFileName);
let baseName = implicitPackageIndex ? void 0 : path.basename(moduleName);
let baseNameNoExtension = baseName && (0, typescript_1.removeFileExtension)(baseName);
let extName = baseName && path.extname(moduleName);
// Account for possible false extensions. Example scenario:
// moduleName = './file.accounting'
// resolvedBaseName = 'file.accounting.ts'
// ('accounting' would be considered the extension)
if (resolvedBaseNameNoExtension && baseName && resolvedBaseNameNoExtension === baseName) {
baseNameNoExtension = baseName;
extName = void 0;
}
// prettier-ignore
const indexType = implicitPackageIndex ? IndexType.ImplicitPackage :
baseNameNoExtension === 'index' && resolvedBaseNameNoExtension === 'index' ? IndexType.Explicit :
baseNameNoExtension !== 'index' && resolvedBaseNameNoExtension === 'index' ? IndexType.Implicit :
IndexType.NonIndex;
if (indexType === IndexType.Implicit) {
baseName = void 0;
baseNameNoExtension = void 0;
extName = void 0;
}
return {
baseName,
baseNameNoExtension,
extName,
resolvedBaseName,
resolvedBaseNameNoExtension,
resolvedExtName,
resolvedDir,
indexType,
implicitPackageIndex,
resolvedFileName,
};
}
function getResolvedSourceFile(context, fileName) {
let res;
const { program, tsInstance } = context;
if (program) {
/* Attempt to directly pull from Program */
res = program.getSourceFile(fileName);
if (res)
return res;
/* Attempt to find without extension */
res = program.getSourceFiles().find((s) => (0, typescript_1.removeFileExtension)(s.fileName) === (0, typescript_1.removeFileExtension)(fileName));
if (res)
return res;
}
/*
* Create basic synthetic SourceFile for use with compiler API - Applies if SourceFile not found in program due to
* import being added by another transformer
*/
return tsInstance.createSourceFile(fileName, ``, tsInstance.ScriptTarget.ESNext, /* setParentNodes */ false);
}
/** Resolve a module name */
function resolveModuleName(context, moduleName) {
const { tsInstance, compilerOptions, sourceFile, config, rootDirs } = context;
// Attempt to resolve with TS Compiler API
const { resolvedModule, failedLookupLocations } = tsInstance.resolveModuleName(moduleName, sourceFile.fileName, compilerOptions, tsInstance.sys);
// Handle non-resolvable module
if (!resolvedModule) {
const maybeURL = failedLookupLocations[0];
if (!(0, general_utils_1.isURL)(maybeURL))
return undefined;
return {
isURL: true,
resolvedPath: undefined,
outputPath: maybeURL,
};
}
const resolvedSourceFile = getResolvedSourceFile(context, resolvedModule.resolvedFileName);
const { indexType, resolvedBaseNameNoExtension, resolvedFileName, implicitPackageIndex, extName, resolvedDir } = getPathDetail(moduleName, resolvedModule);
/* Determine output filename */
let outputBaseName = resolvedBaseNameNoExtension ?? "";
if (indexType === IndexType.Implicit)
outputBaseName = outputBaseName.replace(/(\/index$)|(^index$)/, "");
if (outputBaseName && extName)
outputBaseName = `${outputBaseName}${extName}`;
/* Determine output dir */
let srcFileOutputDir = (0, ts_helpers_1.getOutputDirForSourceFile)(context, sourceFile);
let moduleFileOutputDir = implicitPackageIndex ? resolvedDir : (0, ts_helpers_1.getOutputDirForSourceFile)(context, resolvedSourceFile);
// Handle rootDirs remapping
if (config.useRootDirs && rootDirs) {
let fileRootDir = "";
let moduleRootDir = "";
for (const rootDir of rootDirs) {
if ((0, general_utils_1.isBaseDir)(rootDir, moduleFileOutputDir) && rootDir.length > moduleRootDir.length)
moduleRootDir = rootDir;
if ((0, general_utils_1.isBaseDir)(rootDir, srcFileOutputDir) && rootDir.length > fileRootDir.length)
fileRootDir = rootDir;
}
/* Remove base dirs to make relative to root */
if (fileRootDir && moduleRootDir) {
srcFileOutputDir = (0, get_relative_path_1.getRelativePath)(fileRootDir, srcFileOutputDir);
moduleFileOutputDir = (0, get_relative_path_1.getRelativePath)(moduleRootDir, moduleFileOutputDir);
}
}
const outputDir = (0, get_relative_path_1.getRelativePath)(srcFileOutputDir, moduleFileOutputDir);
/* Compose final output path */
const outputPath = (0, general_utils_1.maybeAddRelativeLocalPrefix)(tsInstance.normalizePath(path.join(outputDir, outputBaseName)));
return { isURL: false, outputPath, resolvedPath: resolvedFileName };
}
//# sourceMappingURL=resolve-module-name.js.map
;