@turbo/gen 2.7.2-canary.1 → 2.7.2-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -70,7 +70,7 @@ ${n.message}`:m,R=[D,t,e].filter(Boolean).join(`
|
|
|
70
70
|
Please use either turbo.json or turbo.jsonc, but not both.`;throw Te(_),new Error(_)}let p=f[0];try{let _=Xi.default.readFileSync(p,"utf8"),E=Is.parse(_),m=Cr.default.dirname(p)===r;if(m){if("extends"in E)continue}else if(!("extends"in E))continue;n.push({config:E,turboConfigPath:p,workspacePath:Cr.default.dirname(p),isRootConfig:m})}catch(_){Yn(_)}}}return i&&e&&(wf[e]=n),n}var Mk=Y(require("os")),qk=Y(f_());var h_=Y(require("fs-extra")),jk=[".DS_Store",".git",".gitattributes",".gitignore",".gitlab-ci.yml",".hg",".hgcheck",".hgignore",".idea",".npmignore",".travis.yml","LICENSE","Thumbs.db","docs","mkdocs.yml","npm-debug.log","yarn-debug.log","yarn-error.log","yarnrc.yml",".yarn"];function ts(e){let t=h_.default.readdirSync(e).filter(r=>!jk.includes(r)).filter(r=>!r.endsWith(".iml"));return{isEmpty:t.length===0,conflicts:t}}var Gf=Y(require("path")),Uf=Y(require("fs-extra")),Wf=Y(require("picocolors"));function tu(e){let t=Gf.default.resolve(e),r=Gf.default.basename(t),n=Uf.default.existsSync(t),i=Uf.default.lstatSync(t,{throwIfNoEntry:!1});if(i&&!i.isDirectory())return{valid:!1,root:t,projectName:r,error:`${Wf.default.dim(r)} is not a directory - please try a different location`};if(n){let{isEmpty:s,conflicts:o}=ts(t);if(!s)return{valid:!1,root:t,projectName:r,error:`${Wf.default.dim(r)} (${t}) has ${o.length} conflicting ${o.length===1?"file":"files"} - please try a different location`}}return{valid:!0,root:t,projectName:r}}var lA=require("stream"),fA=require("stream/promises"),hA=require("zlib"),Gt=require("fs"),ca=require("fs/promises"),st=require("path"),pA=require("os"),ua=require("child_process"),la=Y(cA());var AP=1e4,dA=12e4;async function Tp(e,t={},r=AP){let n=new AbortController,i=setTimeout(()=>{n.abort()},r);try{return await fetch(e,{...t,signal:n.signal})}finally{clearTimeout(i)}}async function aa(e){try{return(await Tp(e,{method:"HEAD"})).ok}catch{return!1}}async function kp(e,t){let[,r,n,i,s,...o]=e.pathname.split("/"),u=t?t.replace(/^\//,""):o.join("/");if(i===void 0||i===""&&s===void 0)try{let c=await Tp(`https://api.github.com/repos/${r}/${n}`);if(!c.ok)return;let l=await c.json();return{username:r,name:n,branch:l.default_branch,filePath:u}}catch{return}let a=t?`${s}/${o.join("/")}`.replace(new RegExp(`/${u}|/$`),""):s;if(r&&n&&a&&i==="tree")return{username:r,name:n,branch:a,filePath:u}}function Bp({username:e,name:t,branch:r,filePath:n}){let i=`https://api.github.com/repos/${e}/${t}/contents`,s=`${n?`/${n}`:""}/package.json`;return aa(`${i+s}?ref=${r}`)}function Pp(e){try{let t=new URL(e);return aa(t.href)}catch{return aa(`https://api.github.com/repos/vercel/turborepo/contents/examples/${encodeURIComponent(e)}`)}}function vP(e,t,r){if(t.includes("\0"))return!1;let i=t.replace(/\\/g,"/").normalize("NFC"),s=r!=null?r:(0,st.resolve)(e),o=(0,st.resolve)(s,i);return!(0,st.relative)(s,o).startsWith("..")&&(0,st.resolve)(o)===o}function xP(e){return e==="SymbolicLink"||e==="Link"}async function wP({url:e,root:t,strip:r,filter:n}){let i=new AbortController,s=setTimeout(()=>{i.abort()},dA),o=[],u=(0,st.resolve)(t),a=new Set;try{let c=await fetch(e,{signal:i.signal});if(!c.ok||!c.body)throw new Error(`Failed to download: ${c.status}`);let l=lA.Readable.fromWeb(c.body),f=null,p=[],_=new la.Parse({filter:E=>{if(f===null){let m=E.split("/");f=m.length?m[0]:null}return n(E,f)},onentry:E=>{let A=E.path.split("/").slice(r).join("/");if(!A){E.resume();return}if(!vP(t,A,u)){Te(`Blocked path traversal attempt: ${E.path}`),E.resume();return}if(E.type&&xP(E.type)){Yn(`Blocked symlink: ${E.path}`),E.resume();return}let D=(0,st.resolve)(u,A);if(E.type==="Directory")a.has(D)||((0,Gt.mkdirSync)(D,{recursive:!0}),a.add(D)),E.resume();else if(E.type==="File"){let R=(0,st.dirname)(D);a.has(R)||((0,Gt.mkdirSync)(R,{recursive:!0}),a.add(R));let M=(0,Gt.createWriteStream)(D);o.push(M),p.push(new Promise((W,L)=>{M.on("finish",W),M.on("error",L)})),E.pipe(M)}else E.resume()}});await(0,fA.pipeline)(l,(0,hA.createGunzip)(),_),await Promise.all(p)}finally{clearTimeout(s);for(let c of o)c.destroy()}}async function Ip(e,{username:t,name:r,branch:n,filePath:i}){let s=`https://codeload.github.com/${t}/${r}/tar.gz/${n}`,o=(0,st.join)((0,pA.tmpdir)(),`turbo-download-${Date.now()}.tar.gz`),u=await Tp(s,{},dA);if(!u.ok||!u.body)throw new Error(`Failed to download: ${u.status}`);let a=Buffer.from(await u.arrayBuffer());await(0,ca.writeFile)(o,a);let c=null;try{await(0,la.extract)({file:o,cwd:e,strip:i?i.split("/").length+1:1,filter:l=>{if(c===null){let f=l.split("/");c=f.length?f[0]:null}return l.startsWith(`${c}${i?`/${i}/`:"/"}`)}})}finally{await(0,ca.unlink)(o)}}async function Lp(e,t){let r=(0,st.join)(e,".turbo-clone-temp");try{(0,ua.execFileSync)("git",["clone","--filter=blob:none","--no-checkout","--depth","1","--sparse","https://github.com/vercel/turborepo.git",r],{stdio:"pipe"}),(0,ua.execFileSync)("git",["sparse-checkout","set",`examples/${t}`],{cwd:r,stdio:"pipe"}),(0,ua.execFileSync)("git",["checkout"],{cwd:r,stdio:"pipe"});let n=(0,st.join)(r,"examples",t);(0,Gt.cpSync)(n,e,{recursive:!0})}catch{(0,Gt.rmSync)(r,{recursive:!0,force:!0}),Yn(`Git is not available. Downloading example via tarball (slower).
|
|
71
71
|
For faster downloads, install git: https://git-scm.com/downloads`),await wP({url:"https://codeload.github.com/vercel/turborepo/tar.gz/main",root:e,strip:3,filter:(i,s)=>i.startsWith(`${s}/examples/${t}/`)});return}(0,Gt.rmSync)(r,{recursive:!0,force:!0})}var Np=Y(require("fs-extra"));async function Mp(e){try{return await Np.default.access(e,Np.default.constants.W_OK),!0}catch{return!1}}var Ai=Y(require("path")),qp=Y(DA()),dn=Y(require("picocolors")),fa=Y(require("fs-extra"));function RP(e){return typeof e=="object"&&e!==null&&typeof e.message=="string"}var ha=class extends Error{};function OP(e){return e.hostname==="github.com"}async function jp({appPath:e,example:t,isDefaultExample:r,examplePath:n}){let i,s;et();let o=xf("Downloading files...");o.start();try{if(!r){try{s=new URL(t)}catch(A){A.code!=="ERR_INVALID_URL"&&(o.stop(),Te(A),process.exit(1))}s?(OP(s)||(o.stop(),Te(`Invalid URL: ${dn.default.red(`"${t}"`)}. Only GitHub repositories are supported. Please use a GitHub URL and try again.`),process.exit(1)),i=await kp(s,n),i||(o.stop(),Te(`Unable to fetch repository information from: ${dn.default.red(`"${t}"`)}. Please fix the URL and try again.`),process.exit(1)),await Bp(i)||(o.stop(),Te(`Could not locate the repository for ${dn.default.red(`"${t}"`)}. Please check that the repository exists and try again.`),process.exit(1))):(await Pp(t)||(o.stop(),Te(`Could not locate an example named ${dn.default.red(`"${t}"`)}. It could be due to the following:
|
|
72
72
|
`,`1. Your spelling of example ${dn.default.red(`"${t}"`)} might be incorrect.
|
|
73
|
-
`,"2. You might not be connected to the internet or you are behind a proxy."),process.exit(1)),i={username:"vercel",name:"turborepo",branch:"main",filePath:`examples/${t}`})}let u=Ai.default.resolve(e);await Mp(Ai.default.dirname(u))||(o.stop(),Te("The application path is not writable, please check folder permissions and try again."),Te("It is likely you do not have write permissions for this folder."),process.exit(1));let a=Ai.default.basename(u);try{await fa.default.mkdir(u,{recursive:!0})}catch(A){o.stop(),Te("Unable to create project directory"),Te(A),process.exit(1)}let{isEmpty:c,conflicts:l}=ts(u);c||(o.stop(),Te(`${dn.default.dim(u)} has ${l.length} conflicting ${l.length===1?"file":"files"} - please try a different location`),process.exit(1));let f=process.cwd();process.chdir(u),r||i?await(0,qp.default)(()=>Ip(u,i!=null?i:{username:"vercel",name:"turborepo",branch:"main",filePath:"examples/basic"}),{retries:3}):await(0,qp.default)(()=>Lp(u,t),{retries:3}),o.stop();let p=Ai.default.join(u,"package.json"),_=fa.default.existsSync(p),E=[];if(_){let A;try{A=fa.default.readJsonSync(p)}catch{}A&&E.push(...Object.keys(A.scripts||{}))}let m=e;return Ai.default.join(f,a)===e&&(m=a),{cdPath:m,hasPackageJson:_,availableScripts:E,repoInfo:i}}catch(u){throw o.stop(),new ha(RP(u)?u.message:String(u))}}function $p(e,t={to:"camel"}){switch(t.to){case"camel":return e.replace(/(?:[-_][a-z])/g,r=>r.toUpperCase().replace("-","").replace("_",""));default:throw new Error("Not implemented")}}var pa=Y(require("picocolors")),AA=Y(require("update-check"));function Hp(e){let{packageInfo:t,upgradeCommand:r}=e,n=(0,AA.default)(t).catch(()=>null);return async function(s=0){try{let o=await n;if(o!=null&&o.latest){et(),et(pa.default.yellow(pa.default.bold(`A new version of \`${t.name}\` is available!`)));let u=typeof r=="function"?await r():r;u&&et(`You can update by running: ${pa.default.cyan(u)}`),et()}process.exit(s)}catch(o){process.env.DEBUG&&Te("Update check failed:",o),process.exit(s)}}}var ZA=require("proxy-agent");var Gp={name:"@turbo/gen",version:"2.7.2-canary.1",description:"Extend a Turborepo",type:"commonjs",homepage:"https://turborepo.com",license:"MIT",repository:{type:"git",url:"git+https://github.com/vercel/turborepo.git",directory:"packages/turbo-gen"},bugs:{url:"https://github.com/vercel/turborepo/issues"},bin:"dist/cli.js",types:"dist/types.d.ts",scripts:{build:"tsup",test:"jest",lint:"eslint src/","check-types":"tsc --noEmit","package:types":"attw --profile node16 --pack"},dependencies:{"@turbo/workspaces":"workspace:*",commander:"10.0.0","fs-extra":"10.1.0",inquirer:"8.2.4",minimatch:"9.0.0","node-plop":"0.26.3",picocolors:"1.0.1","proxy-agent":"6.5.0","ts-node":"10.9.2","update-check":"1.5.4","validate-npm-package-name":"5.0.0"},devDependencies:{"@arethetypeswrong/cli":"0.18.2","@jest/globals":"29.7.0","@turbo/eslint-config":"workspace:*","@turbo/test-utils":"workspace:*","@turbo/tsconfig":"workspace:*","@turbo/utils":"workspace:*","@types/fs-extra":"9.0.13","@types/inquirer":"8.2.5","@types/node":"18.17.4","@types/validate-npm-package-name":"4.0.0",jest:"29.7.0","ts-jest":"29.2.5",tsup:"6.7.0",typescript:"5.5.4"},files:["dist"],publishConfig:{access:"public"}};var vA=require("@turbo/workspaces");async function da({root:e}){let t=e||process.cwd(),r=Oi(t);if(!r)B.error("Unable to infer repository root - override with --root");else try{return(0,vA.getWorkspaceDetails)({root:r})}catch{B.error(`Unable to determine workspace details. Make sure "${t}" is the root, or add "packageManager" to "package.json" or ensure a lockfile is present.`)}process.exit(1)}var pr=Y(require("path")),ga=Y(require("fs-extra")),ma=Y(require("node-plop")),xA=require("ts-node"),wA=require("inquirer");var Ie=class extends Error{constructor(r,n){var i;super(r);this.name="GenerateError",this.type=(i=n==null?void 0:n.type)!=null?i:"unknown",Error.captureStackTrace(this,Ie)}};var CA=["ts","js","cjs"],kP=pr.default.join("turbo","generators"),SA=CA.map(e=>pr.default.join(kP,`config.${e}`)),BP=[...SA,...CA.map(e=>pr.default.join(`plopfile.${e}`))];function FA({project:e,configPath:t}){(0,xA.register)({transpileOnly:!0,cwd:e.paths.root,compilerOptions:{module:"nodenext",moduleResolution:"nodenext"}});let r=IP({project:e}),n;if(t){if(!ga.default.existsSync(t))throw new Ie(`No config at "${t}"`,{type:"plop_no_config"});try{n=(0,ma.default)(t,{destBasePath:t,force:!1})}catch(i){B.error(i)}}else{for(let i of BP){let s=pr.default.join(e.paths.root,i);if(ga.default.existsSync(s))try{n=(0,ma.default)(s,{destBasePath:e.paths.root,force:!1});break}catch(o){B.error(o)}}!n&&r.length>0&&(n=(0,ma.default)(r[0].config,{destBasePath:r[0].root,force:!1}),r.shift())}return n&&r.forEach(i=>{try{n.load(i.config,{destBasePath:i.root,force:!1})}catch(s){B.error(s)}}),n}function Up({project:e,configPath:t}){let r=FA({project:e,configPath:t});if(!r)return[];let i=r.getGeneratorList().map(u=>r.getGenerator(u.name)),s={};i.forEach(u=>{let a=u,c=e.workspaceData.workspaces.find(l=>{if(a.basePath===e.paths.root)return!1;let f=a.basePath.split(pr.default.sep);return f.pop(),f.pop(),pr.default.join("/",...f)===l.paths.root});c?(c.name in s||(s[c.name]=[]),s[c.name].push(a)):("root"in s||(s.root=[]),s.root.push(a))});let o=[];return Object.keys(s).forEach(u=>{o.push(new wA.Separator(u)),o.push(...s[u])}),o}function PP({project:e,generator:t}){let r={cwd:process.cwd(),root:e.paths.root,workspace:t.basePath?Ri({cwd:t.basePath,target:"package.json"}):void 0},n={};try{n=Cf(t.basePath)}catch{}return{turbo:{paths:r,configs:n}}}function IP({project:e}){let t=[];return e.workspaceData.workspaces.forEach(r=>{for(let n of SA)ga.default.existsSync(pr.default.join(r.paths.root,n))&&t.push({config:pr.default.join(r.paths.root,n),root:r.paths.root})}),t}async function RA({project:e,generator:t,bypassArgs:r,configPath:n}){let i=FA({project:e,configPath:n});if(!i)throw new Ie("Unable to load generators",{type:"plop_unable_to_load_config"});let s=i.getGenerator(t);if(!s)throw new Ie(`Generator ${t} not found`,{type:"plop_generator_not_found"});let o=await s.runPrompts(r),u=await s.runActions({...o,...PP({project:e,generator:s})},{onComment:a=>{B.dimmed(a)}});if(u.failures.length>0)throw u.failures.forEach(a=>{a instanceof Error?B.error(`Error - ${a.message}`):B.error(`Error - ${a.error}. Unable to ${a.type} to "${a.path}"`)}),new Ie(`Failed to run "${t}" generator`,{type:"plop_error_running_generator"});u.changes.length>0&&(B.info("Changes made:"),u.changes.forEach(a=>{a.path&&B.item(`${a.path} (${a.type})`)}))}var mn=require("inquirer");async function OA({generators:e,generator:t}){if(t){if(e.find(n=>!(n instanceof mn.Separator)&&n.name===t))return{selectedGenerator:t};B.warn(`Generator "${t}" not found`),B.log()}return await(0,mn.prompt)({type:"list",name:"selectedGenerator",message:"Select generator to run",choices:e.map(n=>n instanceof mn.Separator?n:{name:n.description?` ${n.name}: ${n.description}`:` ${n.name}`,value:n.name})})}async function TA(){return(0,mn.prompt)({type:"list",name:"answer",message:"Should the generator config be created with TS or JS?",default:"ts",choices:[{name:"JavaScript",value:"js"},{name:"TypeScript",value:"ts"}]})}async function kA({message:e}){return(0,mn.prompt)({type:"confirm",name:"answer",message:e})}var Wp=Y(require("path")),zp=Y(require("fs-extra"));async function BA({project:e,template:t}){let r=Wp.default.join(e.paths.root,"turbo","generators"),n=`simple-${t}`;if(await zp.default.pathExists(r))throw new Ie(`Generator config directory already exists at ${r}`,{type:"config_directory_already_exists"});await zp.default.copy(Wp.default.join(__dirname,"templates",n),r,{recursive:!0})}async function Yp({generator:e,project:t,opts:r}){let n=!1,i=Up({project:t,configPath:r.config});if(!i.length){B.error("No generators found."),B.log();let{answer:o}=await kA({message:`Would you like to add a config with a sample custom generator to ${t.name}?`});if(o){n=!0;let{answer:u}=await TA();try{await BA({project:t,template:u})}catch(a){throw a instanceof Ie||B.error("Failed to create generator config"),a}if(B.log(),B.info("Generator config successfully created!"),B.info("Loading generator config..."),B.log(),i=Up({project:t,configPath:r.config}),!i.length){B.error("Error loading generator");return}}else{B.log(),B.dimmed("Learn more about custom Turborepo generators - https://turborepo.com/docs/guides/generating-code#custom-generators");return}}let{selectedGenerator:s}=await OA({generators:i,generator:e});try{await RA({project:t,generator:s,bypassArgs:r.args,configPath:r.config})}catch(o){if(o instanceof Ie)throw o;let u="Failed to run generator";throw o instanceof Error&&(u=o.message),new Ie(u,{type:"plop_error_running_generator"})}finally{n&&(B.log(),B.info("Congrats! You just ran your first Turborepo generator"),B.dimmed("Learn more about custom Turborepo generators - https://turborepo.com/docs/guides/generating-code#custom-generators"))}B.log(),B.bold(B.turboGradient(">>> Success!"))}var Zp=Y(require("path")),_a=Y(require("fs-extra")),UA=Y(require("picocolors"));var As=Y(require("path")),NA=Y(require("fs-extra")),vt=require("inquirer"),MA=require("minimatch"),Xp=Y(require("validate-npm-package-name"));var Vp=Y(require("path"));var PA=Y(require("path"));function IA({project:e}){let r=e.workspaceData.workspaces.map(i=>PA.default.relative(e.paths.root,i.paths.root)),n=new Set;return e.workspaceData.globs.forEach(i=>{if(!r.includes(i)){if(!i.startsWith("!")){let o=i.split("/")[0];n.add(o)}}}),Array.from(n)}function Kp({project:e,workspace:t}){return Vp.default.relative(e.paths.root,t.paths.root).split(Vp.default.sep)[0]}function ya({project:e}){let t=IA({project:e}),r=t.includes("apps"),n=t.includes("packages"),i={},s=[];return e.workspaceData.workspaces.forEach(o=>{let u=Kp({project:e,workspace:o});u!=="apps"&&s.push(o),u in i||(i[u]=[]),i[u].push(o)}),{hasRootApps:r,hasRootPackages:n,workspacesByGroup:i,nonAppWorkspaces:s}}var LA=require("inquirer");function Ea({project:e,type:t,showAllDependencies:r}){let n=ya({project:e}),i=[],s=e.workspaceData.workspaces;r||(t==="app"&&n.hasRootApps?s=n.workspacesByGroup.apps:t==="package"&&n.nonAppWorkspaces.length>0&&(s=n.nonAppWorkspaces));let o;return s.forEach(u=>{let a=Kp({project:e,workspace:u});a!==o&&i.push(new LA.Separator(a)),o=a,i.push(u)}),i}async function qA({override:e,suggestion:t,workspaceType:r}){let{validForNewPackages:n}=(0,Xp.default)(e||"");return e&&n?{answer:e}:(0,vt.prompt)({type:"input",name:"answer",default:t,validate:i=>{let{validForNewPackages:s}=(0,Xp.default)(i);return s||`Invalid ${r} name`},message:`What is the name of the ${r}?`})}async function jA({override:e,message:t}){return e?{answer:e}:(0,vt.prompt)({type:"list",name:"answer",message:t!=null?t:"What type of workspace should be added?",choices:[{name:"app",value:"app"},{name:"package",value:"package"}]})}async function $A({workspaceType:e,workspaceName:t,destination:r,project:n}){let i=t.includes("/")?t.split("/")[1]:t;if(r){let{valid:a,root:c}=tu(r);if(a)return{absolute:c,relative:As.default.relative(n.paths.root,c)}}let s,o=ya({project:n});e==="app"&&o.hasRootApps?s=`${n.paths.root}/apps/${i}`:e==="package"&&o.hasRootPackages&&(s=`${n.paths.root}/packages/${i}`);let{answer:u}=await(0,vt.prompt)({type:"input",name:"answer",message:`Where should "${t}" be added?`,default:s?As.default.relative(n.paths.root,s):void 0,validate:a=>{let c=As.default.join(n.paths.root,a),{valid:l,error:f}=tu(c),p=n.workspaceData.globs.some(_=>(0,MA.minimatch)(a,_));return l&&p?!0:p?f:`${a} is not a valid workspace location`}});return{absolute:As.default.join(n.paths.root,u),relative:u}}async function HA({override:e,workspaces:t,workspaceName:r}){if(e){let i=t.find(s=>s instanceof vt.Separator?!1:s.name===e);if(i)return{answer:i};B.warn(`Workspace "${e}" not found`),B.log()}return await(0,vt.prompt)({type:"list",name:"answer",loop:!1,pageSize:25,message:`Which workspace should "${r}" start from?`,choices:t.map(i=>i instanceof vt.Separator?i:{name:` ${i.name}`,value:i})})}async function GA({workspaceName:e,project:t,workspaceSource:r,showAllDependencies:n}){let i={dependencies:{},devDependencies:{},peerDependencies:{},optionalDependencies:{}},{answer:s}=await NP({message:`Add workspace dependencies to "${e}"?`});if(!s)return i;let{answer:o}=await(0,vt.prompt)({type:"checkbox",name:"answer",message:`Select all dependencies types to modify for "${e}"`,loop:!1,choices:[{name:"dependencies",value:"dependencies"},{name:"devDependencies",value:"devDependencies"},{name:"peerDependencies",value:"peerDependencies"},{name:"optionalDependencies",value:"optionalDependencies"}]}),u=Ea({project:t,type:"package",showAllDependencies:n}),a=r?NA.default.readJsonSync(r.paths.packageJson):void 0;for(let c of o){let{answer:l}=await(0,vt.prompt)({type:"checkbox",name:"answer",default:a&&Object.keys(a[c]||{}),pageSize:15,message:`Which packages should be added as ${c} to "${e}?`,loop:!1,choices:u.map(p=>p instanceof vt.Separator?p:{name:` ${p.name}`,value:p.name})}),f=(a==null?void 0:a[c])||{};if(Object.keys(f).length){let p=new Set(Object.keys(f));l.forEach(_=>{p.has(_)||(f[_]=t.packageManager==="pnpm"?"workspace:*":"*")}),i[c]=f}else i[c]=l.reduce((p,_)=>({...p,[_]:t.packageManager==="pnpm"?"workspace:*":"*"}),{})}return i}async function NP({message:e}){return(0,vt.prompt)({type:"confirm",name:"answer",message:e})}async function ba({project:e,opts:t}){var a;let r,n=t.method==="copy"&&t.copy.type==="external"?((a=t.examplePath)==null?void 0:a.split("/").pop())||t.copy.source.split("/").pop():void 0,{answer:i}=await jA({override:t.type,message:t.method==="copy"&&t.copy.source==="external"&&n?`What type of workspace should "${n}" be created as?`:void 0}),{answer:s}=await qA({override:t.name,workspaceType:i,suggestion:n});if(t.method==="copy"&&t.copy.type==="internal"){let{answer:c}=await HA({override:t.copy.source,workspaces:Ea({project:e,type:i}),workspaceName:s});r=c}let o=await $A({workspaceType:i,workspaceName:s,project:e,destination:t.destination}),u=await GA({workspaceName:s,project:e,workspaceSource:r,showAllDependencies:t.showAllDependencies});return{type:i,name:s,location:o,source:r,dependencies:u}}async function Jp({project:e,opts:t}){let{name:r,location:n,dependencies:i}=await ba({project:e,opts:t}),s={name:r,version:"0.0.0",private:!0,scripts:{dev:"echo 'Add dev script here'",build:"echo 'Add build script here'",test:"echo 'Add test script here'",lint:"echo 'Add lint script here'"}};Object.keys(i).forEach(o=>{let u=i[o];u&&Object.keys(u).length>0&&(s[o]=u)}),_a.default.mkdirSync(n.absolute,{recursive:!0}),_a.default.writeFileSync(Zp.default.join(n.absolute,"package.json"),JSON.stringify(s,null,2)),_a.default.writeFileSync(Zp.default.join(n.absolute,"README.md"),`# \`${r}\``),B.log(),B.log(`${UA.default.bold(B.turboGradient(">>> Success!"))} Created ${r} at "${n.relative}"`)}var Qp=Y(require("path")),jr=Y(require("fs-extra")),WA=Y(require("picocolors"));async function e0({project:e,opts:t}){let{name:r,type:n,location:i,source:s,dependencies:o}=await ba({project:e,opts:t}),u=Qp.default.join(i.absolute,"package.json");if(t.copy.type==="external"){B.log(),B.warn("Some manual modifications may be required."),B.dimmed(`This ${n} may require local dependencies or a different package manager than what is available in this repo`),await jp({appPath:i.absolute,example:t.copy.source,examplePath:t.examplePath});try{if(jr.default.existsSync(u)){if((await jr.default.readJSON(u)).workspaces)throw new Error("New workspace root detected - unexpected 'workspaces' field in package.json")}else throw new Error("New workspace is missing a package.json file");if(jr.default.existsSync(Qp.default.join(i.absolute,"pnpm-workspace.yaml")))throw new Error("New workspace root detected - unexpected pnpm-workspace.yaml")}catch(c){let l="UNKNOWN_ERROR";c instanceof Error&&(l=c.message),B.error(l),await jr.default.rm(i.absolute,{recursive:!0,force:!0});return}}else if(s){let c=async f=>Promise.resolve(!f.includes("node_modules")),l=B.turboLoader(`Creating "${r}" from "${s.name}"...`);l.start(),await jr.default.copy(s.paths.root,i.absolute,{filter:c}),l.stop()}let a=await jr.default.readJSON(u);a.name=r,Object.keys(o).forEach(c=>{let l=o[c];l&&Object.keys(l).length>0&&(a[c]=l)}),await jr.default.writeJSON(u,a,{spaces:2}),B.log(),B.log(`${WA.default.bold(B.turboGradient(">>> Success!"))} Created ${r} at "${i.relative}"`)}function qP(e){let{copy:t,...r}=e,n=t===!0||typeof t=="string"?"copy":"empty",i=typeof t=="string"?t:"",s=typeof t=="string"&&t.startsWith("https://")?"external":"internal";return{method:n,copy:{type:s,source:i},...r}}async function vs(e){let t=await da(e),r=qP(e);B.log();let n={project:t,opts:r};r.method==="copy"?(r.copy.type==="external"?B.info(`Copy a remote workspace from ${r.copy.source}`):B.info(`Copy an existing workspace from "${t.name}"`),B.log(),await e0(n)):(B.info(`Add an empty workspace to "${t.name}"`),B.log(),await Jp(n))}async function xs(e,t){let r=await da(t);B.log(),B.info(`Modify "${r.name}" using custom generators`),B.log(),await Yp({generator:e,project:r,opts:t})}function zA(e){try{let t=JSON.parse(e),r={};for(let n in t){let i=$p(n,{to:"camel"});r[i]=t[n]}return r}catch(t){B.error("Error parsing arguments",t),process.exit(1)}}async function t0(e,t){var r;if(e==="workspace"){let n=zA(t.json);n.showAllDependencies=(r=n.showAllDependencies)!=null?r:!1;let i=!1,s=n.empty||!0;n.copy===""||n.copy===!0?(i=!0,s=!1):n.copy&&n.copy.length>0&&(i=n.copy,s=!1),n.copy=i,n.empty=s,await vs(n)}else if(e==="run"){let n=zA(t.json),{generatorName:i,...s}=n;await xs(i,s)}else B.error(`Received unknown command - "${e}" (must be one of "workspace" | "run")`),process.exit(1)}var YA=Hp({packageInfo:Gp}),JA=new ZA.ProxyAgent;VA.default.globalAgent=JA;KA.default.globalAgent=JA;var ws=new Le.Command;ws.name(XA.default.bold(B.turboGradient("@turbo/gen"))).description("Extend your Turborepo").version(Gp.version,"-v, --version","Output the current version").helpOption("-h, --help","Display help for command").showHelpAfterError(!1);ws.command("run",{isDefault:!0}).alias("r").description("Run custom generators").addArgument(new Le.Argument("[generator-name]","The name of the generator to run")).addOption(new Le.Option("-c, --config <config>","Generator configuration file (default: turbo/generators/config.js")).addOption(new Le.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Le.Option("-a, --args <args...>","Arguments passed directly to generator").default([])).action(xs);ws.command("workspace").aliases(["w"]).description("Add a new package or app to your project").addOption(new Le.Option("-n, --name <workspace-name>","Name for the new workspace")).addOption(new Le.Option("-b, --empty","Generate an empty workspace").conflicts("copy").default(!0)).addOption(new Le.Option("-c, --copy [source]",`Generate a workspace using an existing workspace as a template. Can be the name of a local workspace
|
|
73
|
+
`,"2. You might not be connected to the internet or you are behind a proxy."),process.exit(1)),i={username:"vercel",name:"turborepo",branch:"main",filePath:`examples/${t}`})}let u=Ai.default.resolve(e);await Mp(Ai.default.dirname(u))||(o.stop(),Te("The application path is not writable, please check folder permissions and try again."),Te("It is likely you do not have write permissions for this folder."),process.exit(1));let a=Ai.default.basename(u);try{await fa.default.mkdir(u,{recursive:!0})}catch(A){o.stop(),Te("Unable to create project directory"),Te(A),process.exit(1)}let{isEmpty:c,conflicts:l}=ts(u);c||(o.stop(),Te(`${dn.default.dim(u)} has ${l.length} conflicting ${l.length===1?"file":"files"} - please try a different location`),process.exit(1));let f=process.cwd();process.chdir(u),r||i?await(0,qp.default)(()=>Ip(u,i!=null?i:{username:"vercel",name:"turborepo",branch:"main",filePath:"examples/basic"}),{retries:3}):await(0,qp.default)(()=>Lp(u,t),{retries:3}),o.stop();let p=Ai.default.join(u,"package.json"),_=fa.default.existsSync(p),E=[];if(_){let A;try{A=fa.default.readJsonSync(p)}catch{}A&&E.push(...Object.keys(A.scripts||{}))}let m=e;return Ai.default.join(f,a)===e&&(m=a),{cdPath:m,hasPackageJson:_,availableScripts:E,repoInfo:i}}catch(u){throw o.stop(),new ha(RP(u)?u.message:String(u))}}function $p(e,t={to:"camel"}){switch(t.to){case"camel":return e.replace(/(?:[-_][a-z])/g,r=>r.toUpperCase().replace("-","").replace("_",""));default:throw new Error("Not implemented")}}var pa=Y(require("picocolors")),AA=Y(require("update-check"));function Hp(e){let{packageInfo:t,upgradeCommand:r}=e,n=(0,AA.default)(t).catch(()=>null);return async function(s=0){try{let o=await n;if(o!=null&&o.latest){et(),et(pa.default.yellow(pa.default.bold(`A new version of \`${t.name}\` is available!`)));let u=typeof r=="function"?await r():r;u&&et(`You can update by running: ${pa.default.cyan(u)}`),et()}process.exit(s)}catch(o){process.env.DEBUG&&Te("Update check failed:",o),process.exit(s)}}}var ZA=require("proxy-agent");var Gp={name:"@turbo/gen",version:"2.7.2-canary.2",description:"Extend a Turborepo",type:"commonjs",homepage:"https://turborepo.com",license:"MIT",repository:{type:"git",url:"git+https://github.com/vercel/turborepo.git",directory:"packages/turbo-gen"},bugs:{url:"https://github.com/vercel/turborepo/issues"},bin:"dist/cli.js",types:"dist/types.d.ts",scripts:{build:"tsup",test:"jest",lint:"eslint src/","check-types":"tsc --noEmit","package:types":"attw --profile node16 --pack"},dependencies:{"@turbo/workspaces":"workspace:*",commander:"10.0.0","fs-extra":"10.1.0",inquirer:"8.2.4",minimatch:"9.0.0","node-plop":"0.26.3",picocolors:"1.0.1","proxy-agent":"6.5.0","ts-node":"10.9.2","update-check":"1.5.4","validate-npm-package-name":"5.0.0"},devDependencies:{"@arethetypeswrong/cli":"0.18.2","@jest/globals":"29.7.0","@turbo/eslint-config":"workspace:*","@turbo/test-utils":"workspace:*","@turbo/tsconfig":"workspace:*","@turbo/utils":"workspace:*","@types/fs-extra":"9.0.13","@types/inquirer":"8.2.5","@types/node":"18.17.4","@types/validate-npm-package-name":"4.0.0",jest:"29.7.0","ts-jest":"29.2.5",tsup:"6.7.0",typescript:"5.5.4"},files:["dist"],publishConfig:{access:"public"}};var vA=require("@turbo/workspaces");async function da({root:e}){let t=e||process.cwd(),r=Oi(t);if(!r)B.error("Unable to infer repository root - override with --root");else try{return(0,vA.getWorkspaceDetails)({root:r})}catch{B.error(`Unable to determine workspace details. Make sure "${t}" is the root, or add "packageManager" to "package.json" or ensure a lockfile is present.`)}process.exit(1)}var pr=Y(require("path")),ga=Y(require("fs-extra")),ma=Y(require("node-plop")),xA=require("ts-node"),wA=require("inquirer");var Ie=class extends Error{constructor(r,n){var i;super(r);this.name="GenerateError",this.type=(i=n==null?void 0:n.type)!=null?i:"unknown",Error.captureStackTrace(this,Ie)}};var CA=["ts","js","cjs"],kP=pr.default.join("turbo","generators"),SA=CA.map(e=>pr.default.join(kP,`config.${e}`)),BP=[...SA,...CA.map(e=>pr.default.join(`plopfile.${e}`))];function FA({project:e,configPath:t}){(0,xA.register)({transpileOnly:!0,cwd:e.paths.root,compilerOptions:{module:"nodenext",moduleResolution:"nodenext"}});let r=IP({project:e}),n;if(t){if(!ga.default.existsSync(t))throw new Ie(`No config at "${t}"`,{type:"plop_no_config"});try{n=(0,ma.default)(t,{destBasePath:t,force:!1})}catch(i){B.error(i)}}else{for(let i of BP){let s=pr.default.join(e.paths.root,i);if(ga.default.existsSync(s))try{n=(0,ma.default)(s,{destBasePath:e.paths.root,force:!1});break}catch(o){B.error(o)}}!n&&r.length>0&&(n=(0,ma.default)(r[0].config,{destBasePath:r[0].root,force:!1}),r.shift())}return n&&r.forEach(i=>{try{n.load(i.config,{destBasePath:i.root,force:!1})}catch(s){B.error(s)}}),n}function Up({project:e,configPath:t}){let r=FA({project:e,configPath:t});if(!r)return[];let i=r.getGeneratorList().map(u=>r.getGenerator(u.name)),s={};i.forEach(u=>{let a=u,c=e.workspaceData.workspaces.find(l=>{if(a.basePath===e.paths.root)return!1;let f=a.basePath.split(pr.default.sep);return f.pop(),f.pop(),pr.default.join("/",...f)===l.paths.root});c?(c.name in s||(s[c.name]=[]),s[c.name].push(a)):("root"in s||(s.root=[]),s.root.push(a))});let o=[];return Object.keys(s).forEach(u=>{o.push(new wA.Separator(u)),o.push(...s[u])}),o}function PP({project:e,generator:t}){let r={cwd:process.cwd(),root:e.paths.root,workspace:t.basePath?Ri({cwd:t.basePath,target:"package.json"}):void 0},n={};try{n=Cf(t.basePath)}catch{}return{turbo:{paths:r,configs:n}}}function IP({project:e}){let t=[];return e.workspaceData.workspaces.forEach(r=>{for(let n of SA)ga.default.existsSync(pr.default.join(r.paths.root,n))&&t.push({config:pr.default.join(r.paths.root,n),root:r.paths.root})}),t}async function RA({project:e,generator:t,bypassArgs:r,configPath:n}){let i=FA({project:e,configPath:n});if(!i)throw new Ie("Unable to load generators",{type:"plop_unable_to_load_config"});let s=i.getGenerator(t);if(!s)throw new Ie(`Generator ${t} not found`,{type:"plop_generator_not_found"});let o=await s.runPrompts(r),u=await s.runActions({...o,...PP({project:e,generator:s})},{onComment:a=>{B.dimmed(a)}});if(u.failures.length>0)throw u.failures.forEach(a=>{a instanceof Error?B.error(`Error - ${a.message}`):B.error(`Error - ${a.error}. Unable to ${a.type} to "${a.path}"`)}),new Ie(`Failed to run "${t}" generator`,{type:"plop_error_running_generator"});u.changes.length>0&&(B.info("Changes made:"),u.changes.forEach(a=>{a.path&&B.item(`${a.path} (${a.type})`)}))}var mn=require("inquirer");async function OA({generators:e,generator:t}){if(t){if(e.find(n=>!(n instanceof mn.Separator)&&n.name===t))return{selectedGenerator:t};B.warn(`Generator "${t}" not found`),B.log()}return await(0,mn.prompt)({type:"list",name:"selectedGenerator",message:"Select generator to run",choices:e.map(n=>n instanceof mn.Separator?n:{name:n.description?` ${n.name}: ${n.description}`:` ${n.name}`,value:n.name})})}async function TA(){return(0,mn.prompt)({type:"list",name:"answer",message:"Should the generator config be created with TS or JS?",default:"ts",choices:[{name:"JavaScript",value:"js"},{name:"TypeScript",value:"ts"}]})}async function kA({message:e}){return(0,mn.prompt)({type:"confirm",name:"answer",message:e})}var Wp=Y(require("path")),zp=Y(require("fs-extra"));async function BA({project:e,template:t}){let r=Wp.default.join(e.paths.root,"turbo","generators"),n=`simple-${t}`;if(await zp.default.pathExists(r))throw new Ie(`Generator config directory already exists at ${r}`,{type:"config_directory_already_exists"});await zp.default.copy(Wp.default.join(__dirname,"templates",n),r,{recursive:!0})}async function Yp({generator:e,project:t,opts:r}){let n=!1,i=Up({project:t,configPath:r.config});if(!i.length){B.error("No generators found."),B.log();let{answer:o}=await kA({message:`Would you like to add a config with a sample custom generator to ${t.name}?`});if(o){n=!0;let{answer:u}=await TA();try{await BA({project:t,template:u})}catch(a){throw a instanceof Ie||B.error("Failed to create generator config"),a}if(B.log(),B.info("Generator config successfully created!"),B.info("Loading generator config..."),B.log(),i=Up({project:t,configPath:r.config}),!i.length){B.error("Error loading generator");return}}else{B.log(),B.dimmed("Learn more about custom Turborepo generators - https://turborepo.com/docs/guides/generating-code#custom-generators");return}}let{selectedGenerator:s}=await OA({generators:i,generator:e});try{await RA({project:t,generator:s,bypassArgs:r.args,configPath:r.config})}catch(o){if(o instanceof Ie)throw o;let u="Failed to run generator";throw o instanceof Error&&(u=o.message),new Ie(u,{type:"plop_error_running_generator"})}finally{n&&(B.log(),B.info("Congrats! You just ran your first Turborepo generator"),B.dimmed("Learn more about custom Turborepo generators - https://turborepo.com/docs/guides/generating-code#custom-generators"))}B.log(),B.bold(B.turboGradient(">>> Success!"))}var Zp=Y(require("path")),_a=Y(require("fs-extra")),UA=Y(require("picocolors"));var As=Y(require("path")),NA=Y(require("fs-extra")),vt=require("inquirer"),MA=require("minimatch"),Xp=Y(require("validate-npm-package-name"));var Vp=Y(require("path"));var PA=Y(require("path"));function IA({project:e}){let r=e.workspaceData.workspaces.map(i=>PA.default.relative(e.paths.root,i.paths.root)),n=new Set;return e.workspaceData.globs.forEach(i=>{if(!r.includes(i)){if(!i.startsWith("!")){let o=i.split("/")[0];n.add(o)}}}),Array.from(n)}function Kp({project:e,workspace:t}){return Vp.default.relative(e.paths.root,t.paths.root).split(Vp.default.sep)[0]}function ya({project:e}){let t=IA({project:e}),r=t.includes("apps"),n=t.includes("packages"),i={},s=[];return e.workspaceData.workspaces.forEach(o=>{let u=Kp({project:e,workspace:o});u!=="apps"&&s.push(o),u in i||(i[u]=[]),i[u].push(o)}),{hasRootApps:r,hasRootPackages:n,workspacesByGroup:i,nonAppWorkspaces:s}}var LA=require("inquirer");function Ea({project:e,type:t,showAllDependencies:r}){let n=ya({project:e}),i=[],s=e.workspaceData.workspaces;r||(t==="app"&&n.hasRootApps?s=n.workspacesByGroup.apps:t==="package"&&n.nonAppWorkspaces.length>0&&(s=n.nonAppWorkspaces));let o;return s.forEach(u=>{let a=Kp({project:e,workspace:u});a!==o&&i.push(new LA.Separator(a)),o=a,i.push(u)}),i}async function qA({override:e,suggestion:t,workspaceType:r}){let{validForNewPackages:n}=(0,Xp.default)(e||"");return e&&n?{answer:e}:(0,vt.prompt)({type:"input",name:"answer",default:t,validate:i=>{let{validForNewPackages:s}=(0,Xp.default)(i);return s||`Invalid ${r} name`},message:`What is the name of the ${r}?`})}async function jA({override:e,message:t}){return e?{answer:e}:(0,vt.prompt)({type:"list",name:"answer",message:t!=null?t:"What type of workspace should be added?",choices:[{name:"app",value:"app"},{name:"package",value:"package"}]})}async function $A({workspaceType:e,workspaceName:t,destination:r,project:n}){let i=t.includes("/")?t.split("/")[1]:t;if(r){let{valid:a,root:c}=tu(r);if(a)return{absolute:c,relative:As.default.relative(n.paths.root,c)}}let s,o=ya({project:n});e==="app"&&o.hasRootApps?s=`${n.paths.root}/apps/${i}`:e==="package"&&o.hasRootPackages&&(s=`${n.paths.root}/packages/${i}`);let{answer:u}=await(0,vt.prompt)({type:"input",name:"answer",message:`Where should "${t}" be added?`,default:s?As.default.relative(n.paths.root,s):void 0,validate:a=>{let c=As.default.join(n.paths.root,a),{valid:l,error:f}=tu(c),p=n.workspaceData.globs.some(_=>(0,MA.minimatch)(a,_));return l&&p?!0:p?f:`${a} is not a valid workspace location`}});return{absolute:As.default.join(n.paths.root,u),relative:u}}async function HA({override:e,workspaces:t,workspaceName:r}){if(e){let i=t.find(s=>s instanceof vt.Separator?!1:s.name===e);if(i)return{answer:i};B.warn(`Workspace "${e}" not found`),B.log()}return await(0,vt.prompt)({type:"list",name:"answer",loop:!1,pageSize:25,message:`Which workspace should "${r}" start from?`,choices:t.map(i=>i instanceof vt.Separator?i:{name:` ${i.name}`,value:i})})}async function GA({workspaceName:e,project:t,workspaceSource:r,showAllDependencies:n}){let i={dependencies:{},devDependencies:{},peerDependencies:{},optionalDependencies:{}},{answer:s}=await NP({message:`Add workspace dependencies to "${e}"?`});if(!s)return i;let{answer:o}=await(0,vt.prompt)({type:"checkbox",name:"answer",message:`Select all dependencies types to modify for "${e}"`,loop:!1,choices:[{name:"dependencies",value:"dependencies"},{name:"devDependencies",value:"devDependencies"},{name:"peerDependencies",value:"peerDependencies"},{name:"optionalDependencies",value:"optionalDependencies"}]}),u=Ea({project:t,type:"package",showAllDependencies:n}),a=r?NA.default.readJsonSync(r.paths.packageJson):void 0;for(let c of o){let{answer:l}=await(0,vt.prompt)({type:"checkbox",name:"answer",default:a&&Object.keys(a[c]||{}),pageSize:15,message:`Which packages should be added as ${c} to "${e}?`,loop:!1,choices:u.map(p=>p instanceof vt.Separator?p:{name:` ${p.name}`,value:p.name})}),f=(a==null?void 0:a[c])||{};if(Object.keys(f).length){let p=new Set(Object.keys(f));l.forEach(_=>{p.has(_)||(f[_]=t.packageManager==="pnpm"?"workspace:*":"*")}),i[c]=f}else i[c]=l.reduce((p,_)=>({...p,[_]:t.packageManager==="pnpm"?"workspace:*":"*"}),{})}return i}async function NP({message:e}){return(0,vt.prompt)({type:"confirm",name:"answer",message:e})}async function ba({project:e,opts:t}){var a;let r,n=t.method==="copy"&&t.copy.type==="external"?((a=t.examplePath)==null?void 0:a.split("/").pop())||t.copy.source.split("/").pop():void 0,{answer:i}=await jA({override:t.type,message:t.method==="copy"&&t.copy.source==="external"&&n?`What type of workspace should "${n}" be created as?`:void 0}),{answer:s}=await qA({override:t.name,workspaceType:i,suggestion:n});if(t.method==="copy"&&t.copy.type==="internal"){let{answer:c}=await HA({override:t.copy.source,workspaces:Ea({project:e,type:i}),workspaceName:s});r=c}let o=await $A({workspaceType:i,workspaceName:s,project:e,destination:t.destination}),u=await GA({workspaceName:s,project:e,workspaceSource:r,showAllDependencies:t.showAllDependencies});return{type:i,name:s,location:o,source:r,dependencies:u}}async function Jp({project:e,opts:t}){let{name:r,location:n,dependencies:i}=await ba({project:e,opts:t}),s={name:r,version:"0.0.0",private:!0,scripts:{dev:"echo 'Add dev script here'",build:"echo 'Add build script here'",test:"echo 'Add test script here'",lint:"echo 'Add lint script here'"}};Object.keys(i).forEach(o=>{let u=i[o];u&&Object.keys(u).length>0&&(s[o]=u)}),_a.default.mkdirSync(n.absolute,{recursive:!0}),_a.default.writeFileSync(Zp.default.join(n.absolute,"package.json"),JSON.stringify(s,null,2)),_a.default.writeFileSync(Zp.default.join(n.absolute,"README.md"),`# \`${r}\``),B.log(),B.log(`${UA.default.bold(B.turboGradient(">>> Success!"))} Created ${r} at "${n.relative}"`)}var Qp=Y(require("path")),jr=Y(require("fs-extra")),WA=Y(require("picocolors"));async function e0({project:e,opts:t}){let{name:r,type:n,location:i,source:s,dependencies:o}=await ba({project:e,opts:t}),u=Qp.default.join(i.absolute,"package.json");if(t.copy.type==="external"){B.log(),B.warn("Some manual modifications may be required."),B.dimmed(`This ${n} may require local dependencies or a different package manager than what is available in this repo`),await jp({appPath:i.absolute,example:t.copy.source,examplePath:t.examplePath});try{if(jr.default.existsSync(u)){if((await jr.default.readJSON(u)).workspaces)throw new Error("New workspace root detected - unexpected 'workspaces' field in package.json")}else throw new Error("New workspace is missing a package.json file");if(jr.default.existsSync(Qp.default.join(i.absolute,"pnpm-workspace.yaml")))throw new Error("New workspace root detected - unexpected pnpm-workspace.yaml")}catch(c){let l="UNKNOWN_ERROR";c instanceof Error&&(l=c.message),B.error(l),await jr.default.rm(i.absolute,{recursive:!0,force:!0});return}}else if(s){let c=async f=>Promise.resolve(!f.includes("node_modules")),l=B.turboLoader(`Creating "${r}" from "${s.name}"...`);l.start(),await jr.default.copy(s.paths.root,i.absolute,{filter:c}),l.stop()}let a=await jr.default.readJSON(u);a.name=r,Object.keys(o).forEach(c=>{let l=o[c];l&&Object.keys(l).length>0&&(a[c]=l)}),await jr.default.writeJSON(u,a,{spaces:2}),B.log(),B.log(`${WA.default.bold(B.turboGradient(">>> Success!"))} Created ${r} at "${i.relative}"`)}function qP(e){let{copy:t,...r}=e,n=t===!0||typeof t=="string"?"copy":"empty",i=typeof t=="string"?t:"",s=typeof t=="string"&&t.startsWith("https://")?"external":"internal";return{method:n,copy:{type:s,source:i},...r}}async function vs(e){let t=await da(e),r=qP(e);B.log();let n={project:t,opts:r};r.method==="copy"?(r.copy.type==="external"?B.info(`Copy a remote workspace from ${r.copy.source}`):B.info(`Copy an existing workspace from "${t.name}"`),B.log(),await e0(n)):(B.info(`Add an empty workspace to "${t.name}"`),B.log(),await Jp(n))}async function xs(e,t){let r=await da(t);B.log(),B.info(`Modify "${r.name}" using custom generators`),B.log(),await Yp({generator:e,project:r,opts:t})}function zA(e){try{let t=JSON.parse(e),r={};for(let n in t){let i=$p(n,{to:"camel"});r[i]=t[n]}return r}catch(t){B.error("Error parsing arguments",t),process.exit(1)}}async function t0(e,t){var r;if(e==="workspace"){let n=zA(t.json);n.showAllDependencies=(r=n.showAllDependencies)!=null?r:!1;let i=!1,s=n.empty||!0;n.copy===""||n.copy===!0?(i=!0,s=!1):n.copy&&n.copy.length>0&&(i=n.copy,s=!1),n.copy=i,n.empty=s,await vs(n)}else if(e==="run"){let n=zA(t.json),{generatorName:i,...s}=n;await xs(i,s)}else B.error(`Received unknown command - "${e}" (must be one of "workspace" | "run")`),process.exit(1)}var YA=Hp({packageInfo:Gp}),JA=new ZA.ProxyAgent;VA.default.globalAgent=JA;KA.default.globalAgent=JA;var ws=new Le.Command;ws.name(XA.default.bold(B.turboGradient("@turbo/gen"))).description("Extend your Turborepo").version(Gp.version,"-v, --version","Output the current version").helpOption("-h, --help","Display help for command").showHelpAfterError(!1);ws.command("run",{isDefault:!0}).alias("r").description("Run custom generators").addArgument(new Le.Argument("[generator-name]","The name of the generator to run")).addOption(new Le.Option("-c, --config <config>","Generator configuration file (default: turbo/generators/config.js")).addOption(new Le.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Le.Option("-a, --args <args...>","Arguments passed directly to generator").default([])).action(xs);ws.command("workspace").aliases(["w"]).description("Add a new package or app to your project").addOption(new Le.Option("-n, --name <workspace-name>","Name for the new workspace")).addOption(new Le.Option("-b, --empty","Generate an empty workspace").conflicts("copy").default(!0)).addOption(new Le.Option("-c, --copy [source]",`Generate a workspace using an existing workspace as a template. Can be the name of a local workspace
|
|
74
74
|
within your monorepo, or a fully qualified GitHub URL with any branch and/or subdirectory.
|
|
75
75
|
`).conflicts("empty")).addOption(new Le.Option("-d, --destination <dir>","Where the new workspace should be created")).addOption(new Le.Option("-t, --type <type>","The type of workspace to create").choices(["app","package"])).addOption(new Le.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Le.Option("-p, --example-path <path-to-example>",`In a rare case, your GitHub URL might contain a branch name with
|
|
76
76
|
a slash (e.g. bug/fix-1) and the path to the example (e.g. foo/bar).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@turbo/gen",
|
|
3
|
-
"version": "2.7.2-canary.
|
|
3
|
+
"version": "2.7.2-canary.2",
|
|
4
4
|
"description": "Extend a Turborepo",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"homepage": "https://turborepo.com",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"ts-node": "10.9.2",
|
|
27
27
|
"update-check": "1.5.4",
|
|
28
28
|
"validate-npm-package-name": "5.0.0",
|
|
29
|
-
"@turbo/workspaces": "2.7.2-canary.
|
|
29
|
+
"@turbo/workspaces": "2.7.2-canary.2"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@arethetypeswrong/cli": "0.18.2",
|