parcel-resolver-tspaths
Version:
Supports tsconfig paths in Parcelv2.
1 lines • 3.27 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.trim=exports.trimStar=exports.checkWebpackSpecificImportSyntax=exports.findFileInDirectoryUnknownExt=exports.findFileInDirectory=exports.path=exports.fs=void 0;const plugin_1=require("@parcel/plugin"),utils_1=require("@parcel/utils");function attemptResolve(e,t,r){if(e in t)return resolveByType(e,e,t[e]);for(let r of Object.keys(t)){const n=new RegExp(`^${r.replace("*",".*")}$`,"g");if(e.match(n)){return resolveByType(e,r,t[r])}}return null}function resolveByType(e,t,r){if(!r)return null;switch(r.constructor){case String:return r;case Array:return attemptResolveArray(e,t,r)}}function attemptResolveArray(e,t,r){for(let n of r){let r=e.replace(trimStar(t),trimStar(n)),o=exports.path.resolve(r),i=exports.fs.existsSync(o);if(!i){const e=exports.path.basename(o),t=exports.path.dirname(o);o=findFileInDirectory(t,e),o||(o=findFileInDirectoryUnknownExt(t,e))}if(i=exports.fs.existsSync(o),i){if(exports.fs.statSync(o).isDirectory()&&(o=findFileInDirectory(o),!o))continue;return o}}return null}async function load(e,t,r){let n=await loadTsPaths(e,t,r);return r.verbose({message:`paths loaded: ${JSON.stringify(n)}`}),n}async function loadConfig(e,t){let r=await utils_1.loadConfig(e.inputFS,t,["tsconfig.json","tsconfig.js"],e.projectRoot);if(!r?.config)throw new Error(`Missing or invalid tsconfig.json in project root (${e.projectRoot})`);return r.config}async function loadTsPaths(e,t,r){let n=(await loadConfig(t,e))?.compilerOptions;if(!n)throw new Error("Couldn't find compilerOptions in tsconfig");let o=n?.baseUrl??"src",i=n?.paths??{},s=new Map;for(let[e,t]of Object.entries(i))switch(t.constructor){case String:s[e]=`${o}${exports.path.sep}${t}`;break;case Array:let r=t.map((e=>`${o}${exports.path.sep}${e}`));s[e]=r;break;default:throw new Error(`Bad path type ${t.constructor}, expected string or string[]`)}return s}function findFileInDirectory(e,t="index",r=["ts","js","tsx","jsx"]){for(let n of r){let r=exports.path.resolve(e,`${t}.${n}`);if(exports.fs.existsSync(r))return r}}function findFileInDirectoryUnknownExt(e,t){if(exports.fs.existsSync(e)){const r=exports.fs.readdirSync(e);for(let n of r)if(exports.path.basename(n,exports.path.extname(n))===t)return exports.path.resolve(e,n)}}function checkWebpackSpecificImportSyntax(e){if(/\S+-loader\S*!\S+/g.test(e.moduleSpecifier))throw new Error(`The import path: ${e.moduleSpecifier} is using webpack specific loader import syntax, which isn't supported by Parcel.`)}function trimStar(e){return trim(e,"*")}function trim(e,t){return e.endsWith(t)&&(e=e.substring(0,e.length-t.length)),e}exports.fs=require("fs"),exports.path=require("path"),exports.default=new plugin_1.Resolver({async resolve({specifier:e,dependency:t,options:r,logger:n}){checkWebpackSpecificImportSyntax(t);let o=t.resolveFrom;if(!o?.match(/\.tsx?$/g))return null;n.verbose({message:`Resolving ${o}`});const i=attemptResolve(e,await load(o,r,n),n);return n.verbose({message:`Result: ${i}`}),i?{filePath:i}:null}}),exports.findFileInDirectory=findFileInDirectory,exports.findFileInDirectoryUnknownExt=findFileInDirectoryUnknownExt,exports.checkWebpackSpecificImportSyntax=checkWebpackSpecificImportSyntax,exports.trimStar=trimStar,exports.trim=trim;