UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 3.68 kB
import{dirname,join,resolve,sep}from"node:path";import{readFile,stat}from"node:fs/promises";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(r,i,a){if(i===void 0||!isPackageImport(r))return;let o=resolve(i);if(isPathInsideOrEqual(o,e.appPackageRoot))return;let s=await resolveNearestPackageRoot(o,t);if(s===void 0||isPathInsideOrEqual(s,e.appPackageRoot))return;let c=await loadPackageTsConfigPaths(s);if(c!==void 0)for(let n of createTsConfigPathCandidates(r,c)){let r=await this.resolve(n,i,{kind:a.kind,skipSelf:!0});if(r!==null)return r;let o=await resolveExistingPath(n,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(t){let r=await readPackageConfig(t);if(r===void 0)return;let i=[],a=parse(r.source,i,{allowTrailingComma:!0});if(i.length>0||!isObjectRecord(a))return;let s=a.compilerOptions;if(!isObjectRecord(s)||!isObjectRecord(s.paths))return;let c=dirname(r.path),l=typeof s.baseUrl==`string`?resolve(c,s.baseUrl):c,u=Object.entries(s.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(u.length!==0)return{baseDirectory:l,entries:u}}async function readPackageConfig(e){for(let n of[`tsconfig.json`,`jsconfig.json`]){let r=join(e,n);try{return{path:r,source:await readFile(r,`utf8`)}}catch(e){if(!isPathNotFoundError(e))throw e}}}function createTsConfigPathCandidates(e,t){let r=[];for(let i of t.entries){let a=matchTsConfigPathPattern(e,i.pattern);if(a!==void 0)for(let e of i.targets){let i=e.includes(`*`)?e.replaceAll(`*`,a):e;r.push(resolve(t.baseDirectory,i))}}return r}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,n,r){if(await existsAsFile(e,r))return e;for(let t of n){let n=`${e}${t}`;if(await existsAsFile(n,r))return n}for(let i of n){let n=join(e,`index${i}`);if(await existsAsFile(n,r))return n}}async function existsAsFile(e,t){return(await t(e))?.isFile()??!1}function resolveNearestPackageRoot(t,n){let r=dirname(t),i=nearestPackageRootCache.get(r);if(i!==void 0)return i;let a=findNearestPackageRoot(r,n);return nearestPackageRootCache.set(r,a),a}async function findNearestPackageRoot(n,r){let i=n;for(;;){if(await pathExists(join(i,`package.json`),r))return i;let n=dirname(i);if(n===i)return;i=n}}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 i=resolve(e),a=resolve(t);return i===a||i.startsWith(`${a}${sep}`)}export{createAuthoredPackageTsConfigPathsPlugin};