typescript-transform-path-rewrite
Version:
Transform generated javascript import/require paths using typescript standard config
182 lines • 10.6 kB
JavaScript
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _Resolver_matchers, _Resolver_ts, _Resolver_compilerOptions, _Resolver_cachedPackageJson;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Resolver = void 0;
const posix_1 = __importDefault(require("node:path/posix"));
const debug_1 = __importDefault(require("debug"));
const typescript_1 = require("typescript");
const constants_1 = require("./constants");
const node_fs_1 = require("node:fs");
/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call*/
const log = (0, debug_1.default)(constants_1.PROJECT_NAME);
function isParentDir(dir, parentToTest) {
const diff = posix_1.default.relative(parentToTest, dir);
return diff.length === 0 || (!diff.startsWith('..') && !posix_1.default.isAbsolute(diff));
}
class Resolver {
constructor(ts, compilerOptions, alias) {
_Resolver_matchers.set(this, void 0);
_Resolver_ts.set(this, void 0);
_Resolver_compilerOptions.set(this, void 0);
_Resolver_cachedPackageJson.set(this, void 0);
__classPrivateFieldSet(this, _Resolver_ts, ts, "f");
__classPrivateFieldSet(this, _Resolver_compilerOptions, compilerOptions, "f");
__classPrivateFieldSet(this, _Resolver_cachedPackageJson, {}, "f");
// Build matchers from compiler options
__classPrivateFieldSet(this, _Resolver_matchers, [
(moduleName, sourceFileName) => {
const retVal = this.resolveModule(sourceFileName, moduleName);
if (retVal) {
log(`${sourceFileName}: Rewrite module ${moduleName} to ${retVal}`);
return retVal;
}
return undefined;
},
], "f");
if (alias) {
// Build matchers from alias property of the plugin
__classPrivateFieldGet(this, _Resolver_matchers, "f").push(...Object.entries(alias).map(([from, to]) => {
const fromRegex = new RegExp(from);
return function (moduleName, sourceFileName) {
if (fromRegex.test(moduleName)) {
const retVal = moduleName.replace(fromRegex, to);
log(`${sourceFileName}: Rewrite module ${moduleName} to ${retVal} with regex /${from}/ => ${to}`);
return retVal;
}
return undefined;
};
}));
}
}
resolve(moduleName, sourceFileName) {
let retVal;
__classPrivateFieldGet(this, _Resolver_matchers, "f").forEach(function (matcher) {
const result = matcher(moduleName, sourceFileName);
if (result != null) {
retVal = result;
}
});
return retVal;
}
resolveModule(sourceFilePath, moduleName) {
const { resolvedModule } = __classPrivateFieldGet(this, _Resolver_ts, "f").resolveModuleName(moduleName, sourceFilePath, __classPrivateFieldGet(this, _Resolver_compilerOptions, "f"), __classPrivateFieldGet(this, _Resolver_ts, "f").sys);
if (!resolvedModule || resolvedModule.packageId) {
return undefined;
}
let resolvedFileDir = posix_1.default.dirname(resolvedModule.resolvedFileName);
const resolvedFileExt = resolvedModule.extension;
const resolvedFileBaseWithoutExt = resolvedModule.resolvedFileName.substring(resolvedFileDir.length + 1, resolvedModule.resolvedFileName.length - resolvedFileExt.length);
const originalSourceFileDir = posix_1.default.dirname(sourceFilePath);
let sourceFileDir = originalSourceFileDir;
if (__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").rootDirs) {
let fileRootDir;
let moduleRootDir;
__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").rootDirs.forEach(function (rootDir) {
if (isParentDir(resolvedFileDir, rootDir) && (!moduleRootDir || rootDir.length > moduleRootDir.length)) {
moduleRootDir = rootDir;
}
if (isParentDir(sourceFileDir, rootDir) && (!fileRootDir || rootDir.length > fileRootDir.length)) {
fileRootDir = rootDir;
}
});
if (fileRootDir && moduleRootDir) {
sourceFileDir = posix_1.default.relative(fileRootDir, sourceFileDir);
resolvedFileDir = posix_1.default.relative(moduleRootDir, resolvedFileDir);
}
}
const normalisedResolvedFileDir = posix_1.default.relative(sourceFileDir, resolvedFileDir);
let normalisedResolvedFileBase = resolvedFileBaseWithoutExt;
if (resolvedFileExt === '.mts') {
normalisedResolvedFileBase += '.mjs';
}
else if (resolvedFileExt === '.cts') {
normalisedResolvedFileBase += '.cjs';
}
else if (resolvedFileExt === '.ts' || resolvedFileExt === '.d.ts') {
// Only add .js if is in ESM mode
if (this.isESM(originalSourceFileDir)) {
normalisedResolvedFileBase += '.js';
}
}
else {
normalisedResolvedFileBase += resolvedFileExt;
}
let normalisedResolvedFilePath = posix_1.default.join(normalisedResolvedFileDir, normalisedResolvedFileBase);
if (!normalisedResolvedFilePath.startsWith('.')) {
normalisedResolvedFilePath = `./${normalisedResolvedFilePath}`;
}
return normalisedResolvedFilePath;
}
isESM(sourceFileDir) {
if (__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module === typescript_1.ModuleKind.Node16 || __classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module === typescript_1.ModuleKind.NodeNext) {
const pkg = this.findNearestPackageJson(sourceFileDir);
return pkg.found && pkg.type === 'module';
}
return (__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module !== typescript_1.ModuleKind.None &&
__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module !== typescript_1.ModuleKind.CommonJS &&
__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module !== typescript_1.ModuleKind.AMD &&
__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module !== typescript_1.ModuleKind.UMD &&
__classPrivateFieldGet(this, _Resolver_compilerOptions, "f").module !== typescript_1.ModuleKind.System);
}
findNearestPackageJson(srcDir) {
if (!__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir]) {
let oldSrcDir = srcDir;
let currenSrcDir = srcDir;
while (!__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir]) {
// Try to read the package.json
const pkgJsonPath = posix_1.default.resolve(currenSrcDir, 'package.json');
try {
if ((0, node_fs_1.existsSync)(pkgJsonPath)) {
const data = JSON.parse((0, node_fs_1.readFileSync)(pkgJsonPath, 'utf-8'));
if (typeof data === 'object' &&
(data.type == null || data.type.toLowerCase() === 'commonjs' || data.type.toLowerCase() === 'module')) {
__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir] = __classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[currenSrcDir] = {
found: true,
type: data.type ? data.type.toLowerCase() : 'commonjs',
};
}
}
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
}
catch (err) {
// Ignore error
}
if (!__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir]) {
// Go to parent directory
oldSrcDir = currenSrcDir;
currenSrcDir = posix_1.default.resolve(currenSrcDir, '..');
if (__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[currenSrcDir]) {
// In the cache
__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir] = __classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[currenSrcDir];
break;
}
if (currenSrcDir === oldSrcDir) {
// Cannot go any further
__classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir] = __classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[currenSrcDir] = {
found: false,
};
break;
}
}
}
}
return __classPrivateFieldGet(this, _Resolver_cachedPackageJson, "f")[srcDir];
}
}
exports.Resolver = Resolver;
_Resolver_matchers = new WeakMap(), _Resolver_ts = new WeakMap(), _Resolver_compilerOptions = new WeakMap(), _Resolver_cachedPackageJson = new WeakMap();
//# sourceMappingURL=resolver.js.map