UNPKG

create-defuss

Version:

Checks out git projects from sub-directories. Originally for jump-starting defuss projects from templates.

8 lines (6 loc) 4.05 kB
var E=Object.defineProperty;var f=(t,e)=>E(t,"name",{value:e,configurable:!0});import{spawnSync as u}from"node:child_process";import{normalize as C,isAbsolute as N,sep as y,basename as j,resolve as S,join as w}from"node:path";import{existsSync as m,mkdirSync as v,mkdtempSync as D,rmSync as x,readdirSync as z,lstatSync as G,readlinkSync as I,symlinkSync as P,copyFileSync as F,readFileSync as J,writeFileSync as L}from"node:fs";import{tmpdir as U}from"node:os";const $=/^(https:\/\/(?:github|gitlab|bitbucket)\.com)\/([^\/]+)\/([^\/]+)\/(?:tree|src)\/([^\/]+)\/(.+)$/,W=f((t,e,d=$)=>{try{const o=t.match(d);if(!o)throw new Error("Invalid URL format. Use a subdirectory URL (https) from GitHub, GitLab, or Bitbucket.");const[,r,n,a,s,l]=o;[n,a,s].forEach(b=>{if(!/^[\w\-]+$/.test(b))throw new Error(`Invalid characters in input: ${b}`)});const p=C(l);if(N(p)||p.startsWith("..")||p.includes(`${y}..${y}`))throw new Error("Invalid subdirectory path.");const i=p,k=e||j(i),h=S(process.cwd(),k);if(m(h))throw new Error(`Destination folder "${k}" already exists.`);v(h,{recursive:!0});const c=D(w(U(),"sparse-checkout-"));if(console.log("Cloning repository with sparse checkout into temporary directory..."),u("git",["clone","--no-checkout",`${r}/${n}/${a}.git`,c],{stdio:"inherit"}).status!==0)throw new Error("Git clone failed.");const g=S(c,i);if(!g.startsWith(c+y)&&g!==c)throw new Error("Subdirectory path traversal detected.");if(console.log("Initializing sparse-checkout..."),u("git",["-C",c,"sparse-checkout","init"],{stdio:"inherit"}).status!==0)throw new Error("Git sparse-checkout init failed.");if(console.log(`Setting sparse-checkout to subdirectory: ${i}`),u("git",["-C",c,"sparse-checkout","set",i],{stdio:"inherit"}).status!==0)throw new Error("Git sparse-checkout set failed.");if(console.log(`Checking out branch: ${s}...`),u("git",["-C",c,"checkout",s],{stdio:"inherit"}).status!==0)throw new Error("Git checkout failed.");if(!m(g))throw new Error(`Subdirectory "${i}" does not exist in the repository.`);if(console.log("Copying files to the destination directory..."),R(g,h),console.log("Replacing workspace:* versions with latest npm versions..."),T(h),console.log("Cleaning up temporary directory..."),x(c,{recursive:!0,force:!0}),console.log("Initializing a new git repository..."),u("git",["init"],{cwd:h,stdio:"inherit"}).status!==0)throw new Error("Initializing new git repository failed.");console.log("\u{1F389} All done! Your new project has been set up!"),console.log(` To get started, run the following commands: cd ${k} `)}catch(o){console.error("Error during sparse checkout:",o.message),process.exit(1)}},"performSparseCheckout");function O(t){const e=u("npm",["view",t,"version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return e.status===0&&e.stdout?e.stdout.trim():null}f(O,"getNpmLatestVersion");function T(t){const e=w(t,"package.json");if(!m(e)){console.log("No package.json found in the root, skipping workspace version replacement.");return}const d=J(e,"utf-8"),o=JSON.parse(d);let r=!1;const n=["dependencies","devDependencies","peerDependencies","optionalDependencies"];for(const a of n){const s=o[a];if(!(!s||typeof s!="object")){for(const[l,p]of Object.entries(s))if(typeof p=="string"&&p.startsWith("workspace:")){console.log(`Resolving latest npm version for ${l}...`);const i=O(l);i?(console.log(` ${l}: workspace:* -> ^${i}`),s[l]=`^${i}`,r=!0):console.warn(` Warning: Could not fetch latest version for ${l}, keeping workspace:* reference.`)}}}r?(L(e,JSON.stringify(o,null,2)+` `,"utf-8"),console.log("Updated package.json with resolved npm versions.")):console.log("No workspace:* versions found in package.json.")}f(T,"replaceWorkspaceVersions");function R(t,e){if(!m(t))throw new Error(`Source directory "${t}" does not exist.`);const d=z(t);for(const o of d){const r=w(t,o),n=w(e,o),a=G(r);if(a.isDirectory())v(n,{recursive:!0}),R(r,n);else if(a.isSymbolicLink()){const s=I(r);P(s,n)}else F(r,n)}}f(R,"copyDirectoryContents");export{$ as d,W as p}; //# sourceMappingURL=git-B92u1z1f.mjs.map