eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.87 kB
JavaScript
import{isPathInside,workspacePatternForProject,workspacePatternsClaimProject}from"./workspace-glob.js";import{ensurePnpmWorkspaceIncludesProject,findAncestorPnpmWorkspaceRoot}from"../primitives/pm/pnpm.js";import{getPackageManagerStrategy}from"../primitives/pm/index.js";import{patchPackageJson}from"./update/package-json.js";import{readFile,writeFile}from"node:fs/promises";import{dirname,join,resolve}from"node:path";import{existsSync,readFileSync}from"node:fs";function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function packageJsonWorkspacePatterns(e){let t=e.workspaces;return Array.isArray(t)?t.filter(e=>typeof e==`string`):!isJsonObject(t)||!Array.isArray(t.packages)?[]:t.packages.filter(e=>typeof e==`string`)}function readPackageJsonWorkspacePatterns(e){let t=JSON.parse(readFileSync(e,`utf8`));if(!isJsonObject(t))return;let n=packageJsonWorkspacePatterns(t);return n.length===0?void 0:n}function findAncestorPackageJsonWorkspaceRoot(e){let t=dirname(resolve(e));for(;;){let e=join(t,`package.json`);if(existsSync(e))try{if(readPackageJsonWorkspacePatterns(e)!==void 0)return t}catch{}let n=dirname(t);if(n===t)return;t=n}}function findClaimingPackageJsonWorkspaceRoot(e){let t=findAncestorPackageJsonWorkspaceRoot(e);if(t===void 0)return;let n;try{n=readPackageJsonWorkspacePatterns(join(t,`package.json`))}catch{return}return n!==void 0&&workspacePatternsClaimProject(n,t,e)?t:void 0}function findPackageManagerWorkspaceRoot(e,t){switch(e){case`pnpm`:return findAncestorPnpmWorkspaceRoot(t);case`bun`:case`npm`:case`yarn`:return findAncestorPackageJsonWorkspaceRoot(t)}}function isPackageManagerWorkspaceMember(e,t){let n=findPackageManagerWorkspaceRoot(e,t);return n!==void 0&&resolve(n)!==resolve(t)}function workspaceRootPackageJsonPath(e,t){let n=findPackageManagerWorkspaceRoot(e,t);return n===void 0?void 0:join(n,`package.json`)}async function ensurePackageJsonWorkspaceIncludesProject(e){let t=findAncestorPackageJsonWorkspaceRoot(e);if(t===void 0||resolve(t)===resolve(e)||findClaimingPackageJsonWorkspaceRoot(e)===t)return;let n=join(t,`package.json`),r=JSON.parse(await readFile(n,`utf8`)),i=workspacePatternForProject(t,e);if(Array.isArray(r.workspaces))r.workspaces=[...r.workspaces,i];else if(isJsonObject(r.workspaces)&&Array.isArray(r.workspaces.packages))r.workspaces={...r.workspaces,packages:[...r.workspaces.packages,i]};else return;return await writeFile(n,`${JSON.stringify(r,null,2)}\n`,`utf8`),n}async function ensurePackageManagerWorkspaceIncludesProject(e,t){switch(e){case`pnpm`:{let e=findAncestorPnpmWorkspaceRoot(t);return e===void 0?void 0:await ensurePnpmWorkspaceIncludesProject(t)===`written`?join(e,`pnpm-workspace.yaml`):void 0}case`bun`:case`npm`:case`yarn`:return ensurePackageJsonWorkspaceIncludesProject(t)}}async function patchWorkspaceRootPackageJson(e,t,n){if(!isPackageManagerWorkspaceMember(e,t))return{changed:!1};let r=workspaceRootPackageJsonPath(e,t);if(r===void 0||!existsSync(r))return{changed:!1};let i=await patchPackageJson(r,{nodeEngineRequirement:n.nodeEngineRequirement});return i.changed&&await n.onWorkspaceRootMutation?.({kind:`package-json`,nodeEngineOverride:i.nodeEngineOverride,path:r}),{...i,path:r}}async function applyPackageManagerWorkspaceConfiguration(e){let t=resolve(e.workspaceProbeRoot??e.projectRoot),n=e.packageManager===`pnpm`?void 0:await ensurePackageManagerWorkspaceIncludesProject(e.packageManager,t),r=await getPackageManagerStrategy(e.packageManager).applyProjectConfiguration(e.projectRoot,{workspaceProbeRoot:t}),i=[...n===void 0?[]:[n],...r.filesWritten],a=[...r.filesSkipped];for(let t of i)isPathInside(e.projectRoot,t)||await e.onWorkspaceRootMutation?.({kind:`workspace-config`,path:t});return{filesSkipped:a,filesWritten:i}}export{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson};