UNPKG

deno-npm-sync

Version:

A CLI tool to synchronize dependencies between Deno and NPM projects.

2 lines (1 loc) 2.03 kB
import n from"node:fs";import e from"node:path";import{findWorkspaceRoot as o,resolveVersion as r}from"./catalog-resolver.js";function s(n,e){return n.split(".").slice(0,e).join(".")}async function t(n,e,o,t,i){const l="npm"===e?/^npm:(?<name>[^@]+)@(?<version>\d+(?:\.\d+)*)(?<subpath>\/.*)?$/u:/^jsr:(?<name>@[^/@]+\/[^@/]+)@(?<version>\d+(?:\.\d+)*)(?<subpath>\/.*)?$/u,a=n.match(l);if(!a?.groups)return null;const{name:u,version:c,subpath:p}=a.groups;if(null==u||null==c)return null;const f=o.devDependencies?.[u]??o.dependencies?.[u];if(null==f)return null;const d=await r(f,u,i);if(null==d)return null;const m=d.replace(/^\D*/u,"");if(m===c)return null;let w;if("major"===t)w=m.split(".")[0]??m;else if("minor"===t)w=s(m,2);else if("full"===t)w=m;else{const n=function(n){return n.split(".").length}(c);w=s(m,n)}if(w===c)return null;return{newImport:`${e}:${u}@${w}${p??""}`,name:u,oldVersion:c,newVersion:w}}async function i(r){const{denoJsonPath:s,packageJsonPath:i,silent:l=!1,versionPrecision:a="auto"}=r,u=e.resolve(i),c=e.resolve(s);if(!n.existsSync(u))throw new Error(`package.json not found at: ${u}`);if(!n.existsSync(c))throw new Error(`deno.json not found at: ${c}`);const p=o(e.dirname(u))??e.dirname(u),f=JSON.parse(n.readFileSync(u,"utf8")),d=JSON.parse(n.readFileSync(c,"utf8")),m=[];let w=!1;for(const[n,e]of Object.entries(d.imports)){if("string"!=typeof e)continue;const o=await t(e,"npm",f,a,p);if(o){d.imports[n]=o.newImport,m.push({name:o.name,oldVersion:o.oldVersion,newVersion:o.newVersion}),w=!0;continue}const r=await t(e,"jsr",f,a,p);r&&(d.imports[n]=r.newImport,m.push({name:r.name,oldVersion:r.oldVersion,newVersion:r.newVersion}),w=!0)}if(w){const e=`${JSON.stringify(d,null,2)}\n`;if(n.writeFileSync(c,e,"utf8"),!l){console.log("✅ Updated Deno dependencies:");for(const n of m)console.log(` - ${n.name}: ${n.oldVersion}${n.newVersion}`)}}else l||console.log("✅ Deno imports are already in sync with package.json");return{hasUpdates:w,updates:m}}export{i as syncDenoNpmDependencies};