eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.67 kB
JavaScript
import{readFile,stat}from"node:fs/promises";import{dirname,join,resolve,sep}from"node:path";import{parse}from"#compiled/jsonc-parser/index.js";const NON_PACKAGE_IMPORT_FILTER=/^(?:\.|\/|[A-Za-z]:[\\/]|node:|data:|file:)/,packageTsConfigPathsCache=new Map,nearestPackageRootCache=new Map;function createAuthoredPackageTsConfigPathsPlugin(e){let t=createCachedStatProbe();return{name:`eve-package-tsconfig-paths`,resolveId:{filter:{id:{exclude:NON_PACKAGE_IMPORT_FILTER}},async handler(n,r,i){if(r===void 0||!isPackageImport(n))return;let a=resolve(r);if(isPathInsideOrEqual(a,e.appPackageRoot))return;let o=await resolveNearestPackageRoot(a,t);if(o===void 0||isPathInsideOrEqual(o,e.appPackageRoot))return;let s=await loadPackageTsConfigPaths(o);if(s!==void 0)for(let a of createTsConfigPathCandidates(n,s)){let n=await this.resolve(a,r,{kind:i.kind,skipSelf:!0});if(n!==null)return n;let o=await resolveExistingPath(a,e.extensions,t);if(o!==void 0)return{id:o}}}}}}function loadPackageTsConfigPaths(e){let t=packageTsConfigPathsCache.get(e);if(t!==void 0)return t;let n=readPackageTsConfigPaths(e);return packageTsConfigPathsCache.set(e,n),n}async function readPackageTsConfigPaths(e){let t=await readPackageConfig(e);if(t===void 0)return;let n=[],r=parse(t.source,n,{allowTrailingComma:!0});if(n.length>0||!isObjectRecord(r))return;let i=r.compilerOptions;if(!isObjectRecord(i)||!isObjectRecord(i.paths))return;let a=dirname(t.path),o=typeof i.baseUrl==`string`?resolve(a,i.baseUrl):a,s=Object.entries(i.paths).flatMap(([e,t])=>!Array.isArray(t)||!t.every(e=>typeof e==`string`)?[]:[{pattern:e,targets:t}]).sort((e,t)=>t.pattern.length-e.pattern.length);if(s.length!==0)return{baseDirectory:o,entries:s}}async function readPackageConfig(e){for(let t of[`tsconfig.json`,`jsconfig.json`]){let n=join(e,t);try{return{path:n,source:await readFile(n,`utf8`)}}catch(e){if(!isPathNotFoundError(e))throw e}}}function createTsConfigPathCandidates(e,t){let n=[];for(let r of t.entries){let i=matchTsConfigPathPattern(e,r.pattern);if(i!==void 0)for(let e of r.targets){let r=e.includes(`*`)?e.replaceAll(`*`,i):e;n.push(resolve(t.baseDirectory,r))}}return n}function matchTsConfigPathPattern(e,t){let n=t.indexOf(`*`);if(n===-1)return e===t?``:void 0;let r=t.slice(0,n),i=t.slice(n+1);if(e.startsWith(r)&&e.endsWith(i))return e.slice(r.length,e.length-i.length)}async function resolveExistingPath(e,t,n){if(await existsAsFile(e,n))return e;for(let r of t){let t=`${e}${r}`;if(await existsAsFile(t,n))return t}for(let r of t){let t=join(e,`index${r}`);if(await existsAsFile(t,n))return t}}async function existsAsFile(e,t){return(await t(e))?.isFile()??!1}function resolveNearestPackageRoot(e,t){let n=dirname(e),r=nearestPackageRootCache.get(n);if(r!==void 0)return r;let i=findNearestPackageRoot(n,t);return nearestPackageRootCache.set(n,i),i}async function findNearestPackageRoot(e,t){let n=e;for(;;){if(await pathExists(join(n,`package.json`),t))return n;let e=dirname(n);if(e===n)return;n=e}}async function pathExists(e,t){return await t(e)!==void 0}function createCachedStatProbe(){let e=new Map;return t=>{let n=e.get(t);if(n!==void 0)return n;let r=stat(t).catch(()=>void 0);return e.set(t,r),r}}function isPathNotFoundError(e){return typeof e==`object`&&!!e&&`code`in e&&(e.code===`ENOENT`||e.code===`ENOTDIR`)}function isPackageImport(e){return e.startsWith(`.`)||e.startsWith(`/`)||/^[A-Za-z]:[\\/]/.test(e)?!1:!/^(?:node|data|file):/.test(e)}function isObjectRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isPathInsideOrEqual(e,t){let n=resolve(e),r=resolve(t);return n===r||n.startsWith(`${r}${sep}`)}export{createAuthoredPackageTsConfigPathsPlugin};