UNPKG

eve

Version:

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

1 lines 2.68 kB
import{readFile,writeFile}from"node:fs/promises";import{dirname,join,relative,resolve,sep}from"node:path";import{parseExtensionPackageRoots}from"#shared/extension-package-contract.js";async function tryReadExtensionBuildConfig(e){let t=resolve(e),n;try{n=JSON.parse(await readFile(join(t,`package.json`),`utf8`))}catch{return null}let r=parseExtensionPackageRoots(n.eve?.extension);if(r===null)return null;if(r.source===void 0)throw Error("`eve.extension.dist` is declared without `eve.extension.source`. Building an extension requires the authoring root; add `eve.extension.source` to package.json.");let i=resolve(t,r.source),a=resolve(t,r.dist),o=dirname(a);if(assertManagedPackagePath(t,i,`eve.extension.source`),assertManagedPackagePath(t,a,`eve.extension.dist`),assertManagedPackagePath(t,o,`eve.extension.dist output directory`),i===a)throw Error("`eve.extension.source` and `eve.extension.dist` must be different paths.");if(i===o||i.startsWith(`${o}${sep}`)||o.startsWith(`${i}${sep}`))throw Error("`eve.extension.source` and the managed dist output cannot overlap.");let s=typeof n.name==`string`&&n.name.length>0?n.name:`extension`,c=s.slice(s.lastIndexOf(`/`)+1),l=[...new Set([...Object.keys(n.dependencies??{}),...Object.keys(n.optionalDependencies??{}),...Object.keys(n.peerDependencies??{})])].sort(),u=[...r.externalDependencies??[]].sort(),d=u.filter(e=>!l.includes(e));if(d.length>0)throw Error(`\`eve.extension.externalDependencies\` must name packages declared in dependencies, optionalDependencies, or peerDependencies. Missing runtime declarations: ${d.join(`, `)}.`);return{sourceRoot:i,distRoot:a,outDir:o,packageName:s,shortName:safeJsIdentifier(c),runtimeDependencies:l,externalDependencies:u}}async function ensureExtensionExports(e,t){let n=join(e,`package.json`),r=await readFile(n,`utf8`),i=JSON.parse(r),a=relative(e,t).replaceAll(`\\`,`/`),o=a.startsWith(`.`)?a:`./${a}`,s={".":{types:`${o}/index.d.ts`,default:`${o}/index.mjs`},"./tools":{types:`${o}/tools/index.d.ts`,default:`${o}/tools/index.mjs`}},c=typeof i.exports==`object`&&i.exports!==null&&!Array.isArray(i.exports)?i.exports:{},l=!1;for(let[e,t]of Object.entries(s)){let n=c[e];typeof n==`object`&&n&&n.types===t.types&&n.default===t.default||(c[e]=t,l=!0)}l&&(i.exports=c,await writeFile(n,`${JSON.stringify(i,null,2)}\n`,`utf8`))}function assertManagedPackagePath(e,t,n){let r=relative(e,t);if(r===``||r===`..`||r.startsWith(`..${sep}`))throw Error(`\`${n}\` must point to a directory inside the extension package.`)}function safeJsIdentifier(e){let t=e.replace(/[^A-Za-z0-9_$]/g,`_`);return/^[A-Za-z_$]/.test(t)?t:`_${t}`}export{ensureExtensionExports,tryReadExtensionBuildConfig};