@turbo/gen 2.2.2 → 2.2.3

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.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +5 -5
package/dist/cli.js CHANGED
@@ -73,7 +73,7 @@ Please report this to https://github.com/szmarczak/http2-wrapper/`);b(_)}return}
73
73
  `+e.slice(o+1):u+=e.slice(i),u.slice(1)}function E5(e){for(var t="",r=0,n,i=0;i<e.length;r>=65536?i+=2:i++)r=fs(e,i),n=Ge[r],!n&&ms(r)?(t+=e[i],r>=65536&&(t+=e[i+1])):t+=n||f5(r);return t}function w5(e,t,r){var n="",i=e.tag,s,o,a;for(s=0,o=r.length;s<o;s+=1)a=r[s],e.replacer&&(a=e.replacer.call(r,String(s),a)),(lr(e,t,a,!1,!1)||typeof a=="undefined"&&lr(e,t,null,!1,!1))&&(n!==""&&(n+=","+(e.condenseFlow?"":" ")),n+=e.dump);e.tag=i,e.dump="["+n+"]"}function fg(e,t,r,n){var i="",s=e.tag,o,a,u;for(o=0,a=r.length;o<a;o+=1)u=r[o],e.replacer&&(u=e.replacer.call(r,String(o),u)),(lr(e,t+1,u,!0,!0,!1,!0)||typeof u=="undefined"&&lr(e,t+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=hl(e,t)),e.dump&&ds===e.dump.charCodeAt(0)?i+="-":i+="- ",i+=e.dump);e.tag=s,e.dump=i||"[]"}function v5(e,t,r){var n="",i=e.tag,s=Object.keys(r),o,a,u,c,l;for(o=0,a=s.length;o<a;o+=1)l="",n!==""&&(l+=", "),e.condenseFlow&&(l+='"'),u=s[o],c=r[u],e.replacer&&(c=e.replacer.call(r,u,c)),lr(e,t,u,!1,!1)&&(e.dump.length>1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),lr(e,t,c,!1,!1)&&(l+=e.dump,n+=l));e.tag=i,e.dump="{"+n+"}"}function A5(e,t,r,n){var i="",s=e.tag,o=Object.keys(r),a,u,c,l,f,h;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new rt("sortKeys must be a boolean or a function");for(a=0,u=o.length;a<u;a+=1)h="",(!n||i!=="")&&(h+=hl(e,t)),c=o[a],l=r[c],e.replacer&&(l=e.replacer.call(r,c,l)),lr(e,t+1,c,!0,!0,!0)&&(f=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,f&&(e.dump&&ds===e.dump.charCodeAt(0)?h+="?":h+="? "),h+=e.dump,f&&(h+=hl(e,t)),lr(e,t+1,l,!0,f)&&(e.dump&&ds===e.dump.charCodeAt(0)?h+=":":h+=": ",h+=e.dump,i+=h));e.tag=s,e.dump=i||"{}"}function hg(e,t,r){var n,i,s,o,a,u;for(i=r?e.explicitTypes:e.implicitTypes,s=0,o=i.length;s<o;s+=1)if(a=i[s],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof t=="object"&&t instanceof a.instanceOf)&&(!a.predicate||a.predicate(t))){if(r?a.multi&&a.representName?e.tag=a.representName(t):e.tag=a.tag:e.tag="?",a.represent){if(u=e.styleMap[a.tag]||a.defaultStyle,Ug.call(a.represent)==="[object Function]")n=a.represent(t,u);else if(Gg.call(a.represent,u))n=a.represent[u](t,u);else throw new rt("!<"+a.tag+'> tag resolver accepts not "'+u+'" style');e.dump=n}return!0}return!1}function lr(e,t,r,n,i,s,o){e.tag=null,e.dump=r,hg(e,r,!1)||hg(e,r,!0);var a=Ug.call(e.dump),u=n,c;n&&(n=e.flowLevel<0||e.flowLevel>t);var l=a==="[object Object]"||a==="[object Array]",f,h;if(l&&(f=e.duplicates.indexOf(r),h=f!==-1),(e.tag!==null&&e.tag!=="?"||h||e.indent!==2&&t>0)&&(i=!1),h&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(l&&h&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),a==="[object Object]")n&&Object.keys(e.dump).length!==0?(A5(e,t,e.dump,i),h&&(e.dump="&ref_"+f+e.dump)):(v5(e,t,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(a==="[object Array]")n&&e.dump.length!==0?(e.noArrayIndent&&!o&&t>0?fg(e,t-1,e.dump,i):fg(e,t,e.dump,i),h&&(e.dump="&ref_"+f+e.dump)):(w5(e,t,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(a==="[object String]")e.tag!=="?"&&_5(e,e.dump,t,s,u);else{if(a==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new rt("unacceptable kind of an object to dump "+a)}e.tag!==null&&e.tag!=="?"&&(c=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?c="!"+c:c.slice(0,18)==="tag:yaml.org,2002:"?c="!!"+c.slice(18):c="!<"+c+">",e.dump=c+" "+e.dump)}return!0}function D5(e,t){var r=[],n=[],i,s;for(pl(e,r,n),i=0,s=n.length;i<s;i+=1)t.duplicates.push(r[n[i]]);t.usedDuplicates=new Array(s)}function pl(e,t,r){var n,i,s;if(e!==null&&typeof e=="object")if(i=t.indexOf(e),i!==-1)r.indexOf(i)===-1&&r.push(i);else if(t.push(e),Array.isArray(e))for(i=0,s=e.length;i<s;i+=1)pl(e[i],t,r);else for(n=Object.keys(e),i=0,s=n.length;i<s;i+=1)pl(e[n[i]],t,r)}function x5(e,t){t=t||{};var r=new d5(t);r.noRefs||D5(e,r);var n=e;return r.replacer&&(n=r.replacer.call({"":n},"",n)),lr(r,0,n,!0,!0)?r.dump+`
74
74
  `:""}var C5=x5,S5={dump:C5};function El(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var R5=je,F5=mg,T5=bg,O5=Dg,k5=xg,P5=gl,B5=$g.load,I5=$g.loadAll,L5=S5.dump,N5=rt,M5={binary:Tg,float:Ag,map:_g,null:Eg,pairs:kg,set:Pg,timestamp:Rg,bool:wg,int:vg,merge:Fg,omap:Og,seq:yg,str:gg},q5=El("safeLoad","load"),j5=El("safeLoadAll","loadAll"),H5=El("safeDump","dump"),$5={Type:R5,Schema:F5,FAILSAFE_SCHEMA:T5,JSON_SCHEMA:O5,CORE_SCHEMA:k5,DEFAULT_SCHEMA:P5,load:B5,loadAll:I5,dump:L5,YAMLException:N5,types:M5,safeLoad:q5,safeLoadAll:j5,safeDump:H5},ey=$5;var ow=re(H_());var L={};KS(L,{bold:()=>FB,dimmed:()=>OB,error:()=>Dt,grey:()=>kB,info:()=>RB,item:()=>PB,log:()=>pr,turboBlue:()=>mi,turboGradient:()=>SB,turboLoader:()=>Hh,turboRed:()=>iw,underline:()=>TB,warn:()=>$h,yellow:()=>sw});var ut=require("picocolors"),ew=re(CE()),tw=re(QE()),rw="#0099F7",nw="#F11712",CB="#FFFF00",jh=e=>{let t=BB(e);return r=>`\x1B[38;5;${t}m${r}${(0,ut.reset)("")}`},SB=(0,tw.default)(rw,nw),mi=jh(rw),iw=jh(nw),sw=jh(CB),Hh=e=>(0,ew.default)({text:e,spinner:{frames:[" ",mi("> "),mi(">> "),mi(">>>")]}}),RB=(...e)=>{pr(mi((0,ut.bold)(">>>")),e.join(" "))},FB=(...e)=>{pr((0,ut.bold)(e.join(" ")))},TB=(...e)=>{pr((0,ut.underline)(e.join(" ")))},OB=(...e)=>{pr((0,ut.dim)(e.join(" ")))},kB=(...e)=>{pr((0,ut.gray)(e.join(" ")))},PB=(...e)=>{pr(mi((0,ut.bold)(" \u2022")),e.join(" "))},pr=(...e)=>{console.log(...e)},$h=(...e)=>{console.error(sw((0,ut.bold)(">>>")),e.join(" "))},Dt=(...e)=>{console.error(iw((0,ut.bold)(">>>")),e.join(" "))};function BB(e){let t=parseInt(e.slice(1),16),r=Math.floor(t/(256*256))%256,n=Math.floor(t/256)%256,i=t%256;return 16+36*Math.round(r/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)}var IB="turbo.json";var Uh={};function LB(e){try{if(Ts.default.existsSync(vn.default.join(e,"pnpm-workspace.yaml")))return ey.load(Ts.default.readFileSync(vn.default.join(e,"pnpm-workspace.yaml"),"utf8")).packages||[];let t=JSON.parse(Ts.default.readFileSync(vn.default.join(e,"package.json"),"utf8"));if(t.workspaces){if("packages"in t.workspaces)return t.workspaces.packages||[];if(Array.isArray(t.workspaces))return t.workspaces}return[]}catch{return[]}}function Gh(e,t){var s;let r=ls(e,t),n=[],i=(s=t==null?void 0:t.cache)!=null?s:!0;if(i&&e&&e in Uh)return Uh[e];if(r){let a=LB(r).map(c=>`${c}/turbo.json`);(0,ow.sync)([IB,...a],{cwd:r,onlyFiles:!0,followSymbolicLinks:!1,suppressErrors:!0}).map(c=>vn.default.join(r,c)).forEach(c=>{try{let l=Ts.default.readFileSync(c,"utf8"),f=Fo.parse(l),h=vn.default.dirname(c)===r;if(h){if("extends"in f)return}else if(!("extends"in f))return;n.push({config:f,turboConfigPath:c,workspacePath:vn.default.dirname(c),isRootConfig:h})}catch(l){$h(l)}})}return i&&e&&(Uh[e]=n),n}var FL=re(require("os")),TL=re(Pv());var Bv=re(require("fs-extra")),OL=[".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 Is(e){let t=Bv.default.readdirSync(e).filter(r=>!OL.includes(r)).filter(r=>!r.endsWith(".iml"));return{isEmpty:t.length===0,conflicts:t}}var ad=re(require("path")),ud=re(require("fs-extra")),cd=require("picocolors");function Va(e){let t=ad.default.resolve(e),r=ad.default.basename(t),n=ud.default.existsSync(t),i=ud.default.lstatSync(t,{throwIfNoEntry:!1});if(i&&!i.isDirectory())return{valid:!1,root:t,projectName:r,error:`${(0,cd.dim)(r)} is not a directory - please try a different location`};if(n){let{isEmpty:s,conflicts:o}=Is(t);if(!s)return{valid:!1,root:t,projectName:r,error:`${(0,cd.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 rS=require("stream"),nS=require("util"),iS=require("path"),sS=require("os"),ho=require("fs"),nm=re(Ox()),Sc=re(tS()),m9=(0,nS.promisify)(rS.Stream.pipeline);async function Cc(e){try{return(await Sc.default.head(e)).statusCode===200}catch{return!1}}async function im(e,t){let[,r,n,i,s,...o]=e.pathname.split("/"),a=t?t.replace(/^\//,""):o.join("/");if(i===void 0||i===""&&s===void 0)try{let c=await(0,Sc.default)(`https://api.github.com/repos/${r}/${n}`),l=JSON.parse(c.body);return{username:r,name:n,branch:l.default_branch,filePath:a}}catch{return}let u=t?`${s}/${o.join("/")}`.replace(new RegExp(`/${a}|/$`),""):s;if(r&&n&&u&&i==="tree")return{username:r,name:n,branch:u,filePath:a}}function sm({username:e,name:t,branch:r,filePath:n}){let i=`https://api.github.com/repos/${e}/${t}/contents`,s=`${n?`/${n}`:""}/package.json`;return Cc(`${i+s}?ref=${r}`)}function om(e){try{let t=new URL(e);return Cc(t.href)}catch{return Cc(`https://api.github.com/repos/vercel/turbo/contents/examples/${encodeURIComponent(e)}`)}}async function oS(e,t){let r=(0,iS.join)((0,sS.tmpdir)(),`${t}.temp-${Date.now()}`);return await m9(Sc.default.stream(e),(0,ho.createWriteStream)(r)),r}async function am(e,{username:t,name:r,branch:n,filePath:i}){let s=await oS(`https://codeload.github.com/${t}/${r}/tar.gz/${n}`,"turbo-ct-example"),o=null;await(0,nm.x)({file:s,cwd:e,strip:i?i.split("/").length+1:1,filter:a=>{if(o===null){let u=a.split("/");o=u.length?u[0]:null}return a.startsWith(`${o}${i?`/${i}/`:"/"}`)}}),await ho.promises.unlink(s)}async function um(e,t){let r=await oS("https://codeload.github.com/vercel/turborepo/tar.gz/main","turbo-ct-example"),n=null;await(0,nm.x)({file:r,cwd:e,strip:2+t.split("/").length,filter:i=>{if(n===null){let s=i.split("/");n=s.length?s[0]:null}return i.includes(`${n}/examples/${t}/`)}}),await ho.promises.unlink(r)}var Rc=require("fs-extra");async function cm(e){try{return await(0,Rc.access)(e,Rc.constants.W_OK),!0}catch{return!1}}var ts=re(require("path")),lm=re(dS()),un=require("picocolors"),rs=require("fs-extra");function b9(e){return typeof e=="object"&&e!==null&&typeof e.message=="string"}var Fc=class extends Error{};async function fm({appPath:e,example:t,isDefaultExample:r,examplePath:n}){let i,s;if(r)i={username:"vercel",name:"turbo",branch:"main",filePath:"examples/basic"};else{try{s=new URL(t)}catch(p){p.code!=="ERR_INVALID_URL"&&(Dt(p),process.exit(1))}s?(s.origin!=="https://github.com"&&(Dt(`Invalid URL: ${(0,un.red)(`"${t}"`)}. Only GitHub repositories are supported. Please use a GitHub URL and try again.`),process.exit(1)),i=await im(s,n),i||(Dt(`Unable to fetch repository information from: ${(0,un.red)(`"${t}"`)}. Please fix the URL and try again.`),process.exit(1)),await sm(i)||(Dt(`Could not locate the repository for ${(0,un.red)(`"${t}"`)}. Please check that the repository exists and try again.`),process.exit(1))):await om(t)||(Dt(`Could not locate an example named ${(0,un.red)(`"${t}"`)}. It could be due to the following:
75
75
  `,`1. Your spelling of example ${(0,un.red)(`"${t}"`)} might be incorrect.
76
- `,"2. You might not be connected to the internet or you are behind a proxy."),process.exit(1))}let o=ts.default.resolve(e);await cm(ts.default.dirname(o))||(Dt("The application path is not writable, please check folder permissions and try again."),Dt("It is likely you do not have write permissions for this folder."),process.exit(1));let a=ts.default.basename(o);try{await(0,rs.mkdir)(o,{recursive:!0})}catch(p){Dt("Unable to create project directory"),Dt(p),process.exit(1)}let{isEmpty:u,conflicts:c}=Is(o);u||(Dt(`${(0,un.dim)(o)} has ${c.length} conflicting ${c.length===1?"file":"files"} - please try a different location`),process.exit(1));let l=process.cwd();process.chdir(o),pr();let f=Hh("Downloading files... (This might take a moment)");try{!r&&i?(f.start(),await(0,lm.default)(()=>am(o,i),{retries:3})):(f.start(),await(0,lm.default)(()=>um(o,t),{retries:3}))}catch(p){throw new Fc(b9(p)?p.message:String(p))}finally{f.stop()}let h=ts.default.join(o,"package.json"),g=(0,rs.existsSync)(h),b=[];if(g){let p;try{p=(0,rs.readJsonSync)(h)}catch{}p&&b.push(...Object.keys(p.scripts||{}))}let _=e;return ts.default.join(l,a)===e&&(_=a),{cdPath:_,hasPackageJson:g,availableScripts:b,repoInfo:i}}function hm(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 $S=require("proxy-agent");var po={name:"@turbo/gen",version:"2.2.2",description:"Extend a Turborepo",homepage:"https://turbo.build/repo",license:"MIT",repository:{type:"git",url:"https://github.com/vercel/turborepo",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"},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.2.2","ts-node":"^10.9.1","update-check":"^1.5.4","validate-npm-package-name":"^5.0.0"},devDependencies:{"@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/jest":"^27.4.0","@types/node":"^18.17.2","@types/validate-npm-package-name":"^4.0.0",jest:"^27.4.3","ts-jest":"^27.1.1",tsup:"^6.7.0",typescript:"5.3.3"},files:["dist"],publishConfig:{access:"public"}};var Tc=require("picocolors"),pS=re(require("update-check"));var w9=(0,pS.default)(po).catch(()=>null);async function dm(){try{let e=await w9;e!=null&&e.latest&&(L.log(),L.log((0,Tc.yellow)((0,Tc.bold)(`A new version of \`${po.name}\` is available!`))),L.log()),process.exit()}catch{}}var mS=require("@turbo/workspaces");async function Oc({root:e}){let t=e||process.cwd(),r=ls(t);if(!r)L.error("Unable to infer repository root - override with --root");else try{return(0,mS.getWorkspaceDetails)({root:r})}catch{L.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 Or=re(require("path")),Pc=re(require("fs-extra")),kc=re(require("node-plop")),gS=require("ts-node"),yS=require("inquirer");var $e=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,$e)}};var _S=["ts","js","cjs"],v9=Or.default.join("turbo","generators"),bS=_S.map(e=>Or.default.join(v9,`config.${e}`)),A9=[...bS,..._S.map(e=>Or.default.join(`plopfile.${e}`))];function ES({project:e,configPath:t}){(0,gS.register)({transpileOnly:!0,cwd:e.paths.root,compilerOptions:{module:"nodenext",moduleResolution:"nodenext"}});let r=x9({project:e}),n;if(t){if(!Pc.default.existsSync(t))throw new $e(`No config at "${t}"`,{type:"plop_no_config"});try{n=(0,kc.default)(t,{destBasePath:t,force:!1})}catch(i){L.error(i)}}else{for(let i of A9){let s=Or.default.join(e.paths.root,i);if(Pc.default.existsSync(s))try{n=(0,kc.default)(s,{destBasePath:e.paths.root,force:!1});break}catch(o){L.error(o)}}!n&&r.length>0&&(n=(0,kc.default)(r[0].config,{destBasePath:r[0].root,force:!1}),r.shift())}return n&&r.forEach(i=>{try{n==null||n.load(i.config,{destBasePath:i.root,force:!1})}catch(s){L.error(s)}}),n}function pm({project:e,configPath:t}){let r=ES({project:e,configPath:t});if(!r)return[];let i=r.getGeneratorList().map(a=>r.getGenerator(a.name)),s={};i.forEach(a=>{let u=a,c=e.workspaceData.workspaces.find(l=>{if(u.basePath===e.paths.root)return!1;let f=u.basePath.split(Or.default.sep);return f.pop(),f.pop(),Or.default.join("/",...f)===l.paths.root});c?(c.name in s||(s[c.name]=[]),s[c.name].push(u)):("root"in s||(s.root=[]),s.root.push(u))});let o=[];return Object.keys(s).forEach(a=>{o.push(new yS.Separator(a)),o.push(...s[a])}),o}function D9({project:e,generator:t}){let r={cwd:process.cwd(),root:e.paths.root,workspace:t.basePath?cs({cwd:t.basePath,target:"package.json"}):void 0},n={};try{n=Gh(t.basePath)}catch{}return{turbo:{paths:r,configs:n}}}function x9({project:e}){let t=[];return e.workspaceData.workspaces.forEach(r=>{for(let n of bS)Pc.default.existsSync(Or.default.join(r.paths.root,n))&&t.push({config:Or.default.join(r.paths.root,n),root:r.paths.root})}),t}async function wS({project:e,generator:t,bypassArgs:r,configPath:n}){let i=ES({project:e,configPath:n});if(!i)throw new $e("Unable to load generators",{type:"plop_unable_to_load_config"});let s=i.getGenerator(t);if(!s)throw new $e(`Generator ${t} not found`,{type:"plop_generator_not_found"});let o=await s.runPrompts(r),a=await s.runActions({...o,...D9({project:e,generator:s})},{onComment:u=>{L.dimmed(u)}});if(a.failures.length>0)throw a.failures.forEach(u=>{u instanceof Error?L.error(`Error - ${u.message}`):L.error(`Error - ${u.error}. Unable to ${u.type} to "${u.path}"`)}),new $e(`Failed to run "${t}" generator`,{type:"plop_error_running_generator"});a.changes.length>0&&(L.info("Changes made:"),a.changes.forEach(u=>{u.path&&L.item(`${u.path} (${u.type})`)}))}var Mn=require("inquirer");async function vS({generators:e,generator:t}){if(t){if(e.find(n=>!(n instanceof Mn.Separator)&&n.name===t))return{selectedGenerator:t};L.warn(`Generator "${t}" not found`),L.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 AS(){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 DS({message:e}){return(0,Mn.prompt)({type:"confirm",name:"answer",message:e})}var mm=re(require("path")),Bc=require("fs-extra");async function xS({project:e,template:t}){let r=mm.default.join(e.paths.root,"turbo","generators"),n=`simple-${t}`;if(await(0,Bc.pathExists)(r))throw new $e(`Generator config directory already exists at ${r}`,{type:"config_directory_already_exists"});await(0,Bc.copy)(mm.default.join(__dirname,"templates",n),r,{recursive:!0})}async function gm({generator:e,project:t,opts:r}){let n=!1,i=pm({project:t,configPath:r.config});if(!i.length){L.error("No generators found."),L.log();let{answer:o}=await DS({message:`Would you like to add a config with a sample custom generator to ${t.name}?`});if(o){n=!0;let{answer:a}=await AS();try{await xS({project:t,template:a})}catch(u){throw u instanceof $e||L.error("Failed to create generator config"),u}if(L.log(),L.info("Generator config successfully created!"),L.info("Loading generator config..."),L.log(),i=pm({project:t,configPath:r.config}),!i.length){L.error("Error loading generator");return}}else{L.log(),L.dimmed("Learn more about custom Turborepo generators - https://turbo.build/repo/docs/core-concepts/monorepos/code-generation#custom-generators");return}}let{selectedGenerator:s}=await vS({generators:i,generator:e});try{await wS({project:t,generator:s,bypassArgs:r.args,configPath:r.config})}catch(o){if(o instanceof $e)throw o;let a="Failed to run generator";throw o instanceof Error&&(a=o.message),new $e(a,{type:"plop_error_running_generator"})}finally{n&&(L.log(),L.info("Congrats! You just ran your first Turborepo generator"),L.dimmed("Learn more about custom Turborepo generators - https://turbo.build/repo/docs/core-concepts/monorepos/code-generation#custom-generators"))}L.log(),L.bold(L.turboGradient(">>> Success!"))}var Em=re(require("path")),go=require("fs-extra"),LS=require("picocolors");var mo=re(require("path")),FS=require("fs-extra"),Bt=require("inquirer"),TS=require("minimatch"),bm=re(require("validate-npm-package-name"));var ym=re(require("path"));var CS=re(require("path"));function SS({project:e}){let r=e.workspaceData.workspaces.map(i=>CS.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 _m({project:e,workspace:t}){return ym.default.relative(e.paths.root,t.paths.root).split(ym.default.sep)[0]}function Ic({project:e}){let t=SS({project:e}),r=t.includes("apps"),n=t.includes("packages"),i={},s=[];return e.workspaceData.workspaces.forEach(o=>{let a=_m({project:e,workspace:o});a!=="apps"&&s.push(o),a in i||(i[a]=[]),i[a].push(o)}),{hasRootApps:r,hasRootPackages:n,workspacesByGroup:i,nonAppWorkspaces:s}}var RS=require("inquirer");function Lc({project:e,type:t,showAllDependencies:r}){let n=Ic({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(a=>{let u=_m({project:e,workspace:a});u!==o&&i.push(new RS.Separator(u)),o=u,i.push(a)}),i}async function OS({override:e,suggestion:t,workspaceType:r}){let{validForNewPackages:n}=(0,bm.default)(e||"");return e&&n?{answer:e}:(0,Bt.prompt)({type:"input",name:"answer",default:t,validate:i=>{let{validForNewPackages:s}=(0,bm.default)(i);return s||`Invalid ${r} name`},message:`What is the name of the ${r}?`})}async function kS({override:e,message:t}){return e?{answer:e}:(0,Bt.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 PS({workspaceType:e,workspaceName:t,destination:r,project:n}){let i=t.includes("/")?t.split("/")[1]:t;if(r){let{valid:u,root:c}=Va(r);if(u)return{absolute:c,relative:mo.default.relative(n.paths.root,c)}}let s,o=Ic({project:n});e==="app"&&o.hasRootApps?s=`${n.paths.root}/apps/${i}`:e==="package"&&o.hasRootPackages&&(s=`${n.paths.root}/packages/${i}`);let{answer:a}=await(0,Bt.prompt)({type:"input",name:"answer",message:`Where should "${t}" be added?`,default:s?mo.default.relative(n.paths.root,s):void 0,validate:u=>{let c=mo.default.join(n.paths.root,u),{valid:l,error:f}=Va(c),h=n.workspaceData.globs.some(g=>(0,TS.minimatch)(u,g));return l&&h?!0:h?f:`${u} is not a valid workspace location`}});return{absolute:mo.default.join(n.paths.root,a),relative:a}}async function BS({override:e,workspaces:t,workspaceName:r}){if(e){let i=t.find(s=>s instanceof Bt.Separator?!1:s.name===e);if(i)return{answer:i};L.warn(`Workspace "${e}" not found`),L.log()}return await(0,Bt.prompt)({type:"list",name:"answer",loop:!1,pageSize:25,message:`Which workspace should "${r}" start from?`,choices:t.map(i=>i instanceof Bt.Separator?i:{name:` ${i.name}`,value:i})})}async function IS({workspaceName:e,project:t,workspaceSource:r,showAllDependencies:n}){let i={dependencies:{},devDependencies:{},peerDependencies:{},optionalDependencies:{}},{answer:s}=await S9({message:`Add workspace dependencies to "${e}"?`});if(!s)return i;let{answer:o}=await(0,Bt.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"}]}),a=Lc({project:t,type:"package",showAllDependencies:n}),u=r?(0,FS.readJsonSync)(r.paths.packageJson):void 0;for(let c of o){let{answer:l}=await(0,Bt.prompt)({type:"checkbox",name:"answer",default:u&&Object.keys(u[c]||{}),pageSize:15,message:`Which packages should be added as ${c} to "${e}?`,loop:!1,choices:a.map(h=>h instanceof Bt.Separator?h:{name:` ${h.name}`,value:h.name})}),f=(u==null?void 0:u[c])||{};if(Object.keys(f).length){let h=new Set(Object.keys(f));l.forEach(g=>{h.has(g)||(f[g]=t.packageManager==="pnpm"?"workspace:*":"*")}),i[c]=f}else i[c]=l.reduce((h,g)=>({...h,[g]:t.packageManager==="pnpm"?"workspace:*":"*"}),{})}return i}async function S9({message:e}){return(0,Bt.prompt)({type:"confirm",name:"answer",message:e})}async function Nc({project:e,opts:t}){var u;let r,n=t.method==="copy"&&t.copy.type==="external"?((u=t.examplePath)==null?void 0:u.split("/").pop())||t.copy.source.split("/").pop():void 0,{answer:i}=await kS({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 OS({override:t.name,workspaceType:i,suggestion:n});if(t.method==="copy"&&t.copy.type==="internal"){let{answer:c}=await BS({override:t.copy.source,workspaces:Lc({project:e,type:i}),workspaceName:s});r=c}let o=await PS({workspaceType:i,workspaceName:s,project:e,destination:t.destination}),a=await IS({workspaceName:s,project:e,workspaceSource:r,showAllDependencies:t.showAllDependencies});return{type:i,name:s,location:o,source:r,dependencies:a}}async function wm({project:e,opts:t}){let{name:r,location:n,dependencies:i}=await Nc({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 a=i[o];a&&Object.keys(a).length>0&&(s[o]=a)}),(0,go.mkdirSync)(n.absolute,{recursive:!0}),(0,go.writeFileSync)(Em.default.join(n.absolute,"package.json"),JSON.stringify(s,null,2)),(0,go.writeFileSync)(Em.default.join(n.absolute,"README.md"),`# \`${r}\``),L.log(),L.log(`${(0,LS.bold)(L.turboGradient(">>> Success!"))} Created ${r} at "${n.relative}"`)}var vm=re(require("path")),It=require("fs-extra"),NS=require("picocolors");async function Am({project:e,opts:t}){let{name:r,type:n,location:i,source:s,dependencies:o}=await Nc({project:e,opts:t}),a=vm.default.join(i.absolute,"package.json");if(t.copy.type==="external"){L.log(),L.warn("Some manual modifications may be required."),L.dimmed(`This ${n} may require local dependencies or a different package manager than what is available in this repo`),await fm({appPath:i.absolute,example:t.copy.source,examplePath:t.examplePath});try{if((0,It.existsSync)(a)){if((await(0,It.readJSON)(a)).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((0,It.existsSync)(vm.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),L.error(l),await(0,It.rm)(i.absolute,{recursive:!0,force:!0});return}}else if(s){let c=async f=>Promise.resolve(!f.includes("node_modules")),l=L.turboLoader(`Creating "${r}" from "${s.name}"...`);l.start(),await(0,It.copy)(s.paths.root,i.absolute,{filter:c}),l.stop()}let u=await(0,It.readJSON)(a);u.name=r,Object.keys(o).forEach(c=>{let l=o[c];l&&Object.keys(l).length>0&&(u[c]=l)}),await(0,It.writeJSON)(a,u,{spaces:2}),L.log(),L.log(`${(0,NS.bold)(L.turboGradient(">>> Success!"))} Created ${r} at "${i.relative}"`)}function F9(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 yo(e){let t=await Oc(e),r=F9(e);L.log();let n={project:t,opts:r};r.method==="copy"?(r.copy.type==="external"?L.info(`Copy a remote workspace from ${r.copy.source}`):L.info(`Copy an existing workspace from "${t.name}"`),L.log(),await Am(n)):(L.info(`Add an empty workspace to "${t.name}"`),L.log(),await wm(n))}async function _o(e,t){let r=await Oc(t);L.log(),L.info(`Modify "${r.name}" using custom generators`),L.log(),await gm({generator:e,project:r,opts:t})}function MS(e){try{let t=JSON.parse(e),r={};for(let n in t){let i=hm(n,{to:"camel"});r[i]=t[n]}return r}catch(t){L.error("Error parsing arguments",t),process.exit(1)}}async function Dm(e,t){var r;if(e==="workspace"){let n=MS(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 yo(n)}else if(e==="run"){let n=MS(t.json),{generatorName:i,...s}=n;await _o(i,s)}else L.error(`Received unknown command - "${e}" (must be one of "workspace" | "run")`),process.exit(1)}var US=new $S.ProxyAgent;qS.default.globalAgent=US;jS.default.globalAgent=US;var bo=new Ue.Command;bo.name((0,HS.bold)(L.turboGradient("@turbo/gen"))).description("Extend your Turborepo").version(po.version,"-v, --version","Output the current version").helpOption("-h, --help","Display help for command").showHelpAfterError(!1);bo.command("run",{isDefault:!0}).alias("r").description("Run custom generators").addArgument(new Ue.Argument("[generator-name]","The name of the generator to run")).addOption(new Ue.Option("-c, --config <config>","Generator configuration file (default: turbo/generators/config.js")).addOption(new Ue.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Ue.Option("-a, --args <args...>","Arguments passed directly to generator").default([])).action(_o);bo.command("workspace").aliases(["w"]).description("Add a new package or app to your project").addOption(new Ue.Option("-n, --name <workspace-name>","Name for the new workspace")).addOption(new Ue.Option("-b, --empty","Generate an empty workspace").conflicts("copy").default(!0)).addOption(new Ue.Option("-c, --copy [source]",`Generate a workspace using an existing workspace as a template. Can be the name of a local workspace
76
+ `,"2. You might not be connected to the internet or you are behind a proxy."),process.exit(1))}let o=ts.default.resolve(e);await cm(ts.default.dirname(o))||(Dt("The application path is not writable, please check folder permissions and try again."),Dt("It is likely you do not have write permissions for this folder."),process.exit(1));let a=ts.default.basename(o);try{await(0,rs.mkdir)(o,{recursive:!0})}catch(p){Dt("Unable to create project directory"),Dt(p),process.exit(1)}let{isEmpty:u,conflicts:c}=Is(o);u||(Dt(`${(0,un.dim)(o)} has ${c.length} conflicting ${c.length===1?"file":"files"} - please try a different location`),process.exit(1));let l=process.cwd();process.chdir(o),pr();let f=Hh("Downloading files... (This might take a moment)");try{!r&&i?(f.start(),await(0,lm.default)(()=>am(o,i),{retries:3})):(f.start(),await(0,lm.default)(()=>um(o,t),{retries:3}))}catch(p){throw new Fc(b9(p)?p.message:String(p))}finally{f.stop()}let h=ts.default.join(o,"package.json"),g=(0,rs.existsSync)(h),b=[];if(g){let p;try{p=(0,rs.readJsonSync)(h)}catch{}p&&b.push(...Object.keys(p.scripts||{}))}let _=e;return ts.default.join(l,a)===e&&(_=a),{cdPath:_,hasPackageJson:g,availableScripts:b,repoInfo:i}}function hm(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 $S=require("proxy-agent");var po={name:"@turbo/gen",version:"2.2.3",description:"Extend a Turborepo",homepage:"https://turbo.build/repo",license:"MIT",repository:{type:"git",url:"https://github.com/vercel/turborepo",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"},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.2.2","ts-node":"^10.9.1","update-check":"^1.5.4","validate-npm-package-name":"^5.0.0"},devDependencies:{"@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/jest":"^27.4.0","@types/node":"^18.17.2","@types/validate-npm-package-name":"^4.0.0",jest:"^27.4.3","ts-jest":"^27.1.1",tsup:"^6.7.0",typescript:"5.3.3"},files:["dist"],publishConfig:{access:"public"}};var Tc=require("picocolors"),pS=re(require("update-check"));var w9=(0,pS.default)(po).catch(()=>null);async function dm(){try{let e=await w9;e!=null&&e.latest&&(L.log(),L.log((0,Tc.yellow)((0,Tc.bold)(`A new version of \`${po.name}\` is available!`))),L.log()),process.exit()}catch{}}var mS=require("@turbo/workspaces");async function Oc({root:e}){let t=e||process.cwd(),r=ls(t);if(!r)L.error("Unable to infer repository root - override with --root");else try{return(0,mS.getWorkspaceDetails)({root:r})}catch{L.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 Or=re(require("path")),Pc=re(require("fs-extra")),kc=re(require("node-plop")),gS=require("ts-node"),yS=require("inquirer");var $e=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,$e)}};var _S=["ts","js","cjs"],v9=Or.default.join("turbo","generators"),bS=_S.map(e=>Or.default.join(v9,`config.${e}`)),A9=[...bS,..._S.map(e=>Or.default.join(`plopfile.${e}`))];function ES({project:e,configPath:t}){(0,gS.register)({transpileOnly:!0,cwd:e.paths.root,compilerOptions:{module:"nodenext",moduleResolution:"nodenext"}});let r=x9({project:e}),n;if(t){if(!Pc.default.existsSync(t))throw new $e(`No config at "${t}"`,{type:"plop_no_config"});try{n=(0,kc.default)(t,{destBasePath:t,force:!1})}catch(i){L.error(i)}}else{for(let i of A9){let s=Or.default.join(e.paths.root,i);if(Pc.default.existsSync(s))try{n=(0,kc.default)(s,{destBasePath:e.paths.root,force:!1});break}catch(o){L.error(o)}}!n&&r.length>0&&(n=(0,kc.default)(r[0].config,{destBasePath:r[0].root,force:!1}),r.shift())}return n&&r.forEach(i=>{try{n==null||n.load(i.config,{destBasePath:i.root,force:!1})}catch(s){L.error(s)}}),n}function pm({project:e,configPath:t}){let r=ES({project:e,configPath:t});if(!r)return[];let i=r.getGeneratorList().map(a=>r.getGenerator(a.name)),s={};i.forEach(a=>{let u=a,c=e.workspaceData.workspaces.find(l=>{if(u.basePath===e.paths.root)return!1;let f=u.basePath.split(Or.default.sep);return f.pop(),f.pop(),Or.default.join("/",...f)===l.paths.root});c?(c.name in s||(s[c.name]=[]),s[c.name].push(u)):("root"in s||(s.root=[]),s.root.push(u))});let o=[];return Object.keys(s).forEach(a=>{o.push(new yS.Separator(a)),o.push(...s[a])}),o}function D9({project:e,generator:t}){let r={cwd:process.cwd(),root:e.paths.root,workspace:t.basePath?cs({cwd:t.basePath,target:"package.json"}):void 0},n={};try{n=Gh(t.basePath)}catch{}return{turbo:{paths:r,configs:n}}}function x9({project:e}){let t=[];return e.workspaceData.workspaces.forEach(r=>{for(let n of bS)Pc.default.existsSync(Or.default.join(r.paths.root,n))&&t.push({config:Or.default.join(r.paths.root,n),root:r.paths.root})}),t}async function wS({project:e,generator:t,bypassArgs:r,configPath:n}){let i=ES({project:e,configPath:n});if(!i)throw new $e("Unable to load generators",{type:"plop_unable_to_load_config"});let s=i.getGenerator(t);if(!s)throw new $e(`Generator ${t} not found`,{type:"plop_generator_not_found"});let o=await s.runPrompts(r),a=await s.runActions({...o,...D9({project:e,generator:s})},{onComment:u=>{L.dimmed(u)}});if(a.failures.length>0)throw a.failures.forEach(u=>{u instanceof Error?L.error(`Error - ${u.message}`):L.error(`Error - ${u.error}. Unable to ${u.type} to "${u.path}"`)}),new $e(`Failed to run "${t}" generator`,{type:"plop_error_running_generator"});a.changes.length>0&&(L.info("Changes made:"),a.changes.forEach(u=>{u.path&&L.item(`${u.path} (${u.type})`)}))}var Mn=require("inquirer");async function vS({generators:e,generator:t}){if(t){if(e.find(n=>!(n instanceof Mn.Separator)&&n.name===t))return{selectedGenerator:t};L.warn(`Generator "${t}" not found`),L.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 AS(){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 DS({message:e}){return(0,Mn.prompt)({type:"confirm",name:"answer",message:e})}var mm=re(require("path")),Bc=require("fs-extra");async function xS({project:e,template:t}){let r=mm.default.join(e.paths.root,"turbo","generators"),n=`simple-${t}`;if(await(0,Bc.pathExists)(r))throw new $e(`Generator config directory already exists at ${r}`,{type:"config_directory_already_exists"});await(0,Bc.copy)(mm.default.join(__dirname,"templates",n),r,{recursive:!0})}async function gm({generator:e,project:t,opts:r}){let n=!1,i=pm({project:t,configPath:r.config});if(!i.length){L.error("No generators found."),L.log();let{answer:o}=await DS({message:`Would you like to add a config with a sample custom generator to ${t.name}?`});if(o){n=!0;let{answer:a}=await AS();try{await xS({project:t,template:a})}catch(u){throw u instanceof $e||L.error("Failed to create generator config"),u}if(L.log(),L.info("Generator config successfully created!"),L.info("Loading generator config..."),L.log(),i=pm({project:t,configPath:r.config}),!i.length){L.error("Error loading generator");return}}else{L.log(),L.dimmed("Learn more about custom Turborepo generators - https://turbo.build/repo/docs/core-concepts/monorepos/code-generation#custom-generators");return}}let{selectedGenerator:s}=await vS({generators:i,generator:e});try{await wS({project:t,generator:s,bypassArgs:r.args,configPath:r.config})}catch(o){if(o instanceof $e)throw o;let a="Failed to run generator";throw o instanceof Error&&(a=o.message),new $e(a,{type:"plop_error_running_generator"})}finally{n&&(L.log(),L.info("Congrats! You just ran your first Turborepo generator"),L.dimmed("Learn more about custom Turborepo generators - https://turbo.build/repo/docs/core-concepts/monorepos/code-generation#custom-generators"))}L.log(),L.bold(L.turboGradient(">>> Success!"))}var Em=re(require("path")),go=require("fs-extra"),LS=require("picocolors");var mo=re(require("path")),FS=require("fs-extra"),Bt=require("inquirer"),TS=require("minimatch"),bm=re(require("validate-npm-package-name"));var ym=re(require("path"));var CS=re(require("path"));function SS({project:e}){let r=e.workspaceData.workspaces.map(i=>CS.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 _m({project:e,workspace:t}){return ym.default.relative(e.paths.root,t.paths.root).split(ym.default.sep)[0]}function Ic({project:e}){let t=SS({project:e}),r=t.includes("apps"),n=t.includes("packages"),i={},s=[];return e.workspaceData.workspaces.forEach(o=>{let a=_m({project:e,workspace:o});a!=="apps"&&s.push(o),a in i||(i[a]=[]),i[a].push(o)}),{hasRootApps:r,hasRootPackages:n,workspacesByGroup:i,nonAppWorkspaces:s}}var RS=require("inquirer");function Lc({project:e,type:t,showAllDependencies:r}){let n=Ic({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(a=>{let u=_m({project:e,workspace:a});u!==o&&i.push(new RS.Separator(u)),o=u,i.push(a)}),i}async function OS({override:e,suggestion:t,workspaceType:r}){let{validForNewPackages:n}=(0,bm.default)(e||"");return e&&n?{answer:e}:(0,Bt.prompt)({type:"input",name:"answer",default:t,validate:i=>{let{validForNewPackages:s}=(0,bm.default)(i);return s||`Invalid ${r} name`},message:`What is the name of the ${r}?`})}async function kS({override:e,message:t}){return e?{answer:e}:(0,Bt.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 PS({workspaceType:e,workspaceName:t,destination:r,project:n}){let i=t.includes("/")?t.split("/")[1]:t;if(r){let{valid:u,root:c}=Va(r);if(u)return{absolute:c,relative:mo.default.relative(n.paths.root,c)}}let s,o=Ic({project:n});e==="app"&&o.hasRootApps?s=`${n.paths.root}/apps/${i}`:e==="package"&&o.hasRootPackages&&(s=`${n.paths.root}/packages/${i}`);let{answer:a}=await(0,Bt.prompt)({type:"input",name:"answer",message:`Where should "${t}" be added?`,default:s?mo.default.relative(n.paths.root,s):void 0,validate:u=>{let c=mo.default.join(n.paths.root,u),{valid:l,error:f}=Va(c),h=n.workspaceData.globs.some(g=>(0,TS.minimatch)(u,g));return l&&h?!0:h?f:`${u} is not a valid workspace location`}});return{absolute:mo.default.join(n.paths.root,a),relative:a}}async function BS({override:e,workspaces:t,workspaceName:r}){if(e){let i=t.find(s=>s instanceof Bt.Separator?!1:s.name===e);if(i)return{answer:i};L.warn(`Workspace "${e}" not found`),L.log()}return await(0,Bt.prompt)({type:"list",name:"answer",loop:!1,pageSize:25,message:`Which workspace should "${r}" start from?`,choices:t.map(i=>i instanceof Bt.Separator?i:{name:` ${i.name}`,value:i})})}async function IS({workspaceName:e,project:t,workspaceSource:r,showAllDependencies:n}){let i={dependencies:{},devDependencies:{},peerDependencies:{},optionalDependencies:{}},{answer:s}=await S9({message:`Add workspace dependencies to "${e}"?`});if(!s)return i;let{answer:o}=await(0,Bt.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"}]}),a=Lc({project:t,type:"package",showAllDependencies:n}),u=r?(0,FS.readJsonSync)(r.paths.packageJson):void 0;for(let c of o){let{answer:l}=await(0,Bt.prompt)({type:"checkbox",name:"answer",default:u&&Object.keys(u[c]||{}),pageSize:15,message:`Which packages should be added as ${c} to "${e}?`,loop:!1,choices:a.map(h=>h instanceof Bt.Separator?h:{name:` ${h.name}`,value:h.name})}),f=(u==null?void 0:u[c])||{};if(Object.keys(f).length){let h=new Set(Object.keys(f));l.forEach(g=>{h.has(g)||(f[g]=t.packageManager==="pnpm"?"workspace:*":"*")}),i[c]=f}else i[c]=l.reduce((h,g)=>({...h,[g]:t.packageManager==="pnpm"?"workspace:*":"*"}),{})}return i}async function S9({message:e}){return(0,Bt.prompt)({type:"confirm",name:"answer",message:e})}async function Nc({project:e,opts:t}){var u;let r,n=t.method==="copy"&&t.copy.type==="external"?((u=t.examplePath)==null?void 0:u.split("/").pop())||t.copy.source.split("/").pop():void 0,{answer:i}=await kS({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 OS({override:t.name,workspaceType:i,suggestion:n});if(t.method==="copy"&&t.copy.type==="internal"){let{answer:c}=await BS({override:t.copy.source,workspaces:Lc({project:e,type:i}),workspaceName:s});r=c}let o=await PS({workspaceType:i,workspaceName:s,project:e,destination:t.destination}),a=await IS({workspaceName:s,project:e,workspaceSource:r,showAllDependencies:t.showAllDependencies});return{type:i,name:s,location:o,source:r,dependencies:a}}async function wm({project:e,opts:t}){let{name:r,location:n,dependencies:i}=await Nc({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 a=i[o];a&&Object.keys(a).length>0&&(s[o]=a)}),(0,go.mkdirSync)(n.absolute,{recursive:!0}),(0,go.writeFileSync)(Em.default.join(n.absolute,"package.json"),JSON.stringify(s,null,2)),(0,go.writeFileSync)(Em.default.join(n.absolute,"README.md"),`# \`${r}\``),L.log(),L.log(`${(0,LS.bold)(L.turboGradient(">>> Success!"))} Created ${r} at "${n.relative}"`)}var vm=re(require("path")),It=require("fs-extra"),NS=require("picocolors");async function Am({project:e,opts:t}){let{name:r,type:n,location:i,source:s,dependencies:o}=await Nc({project:e,opts:t}),a=vm.default.join(i.absolute,"package.json");if(t.copy.type==="external"){L.log(),L.warn("Some manual modifications may be required."),L.dimmed(`This ${n} may require local dependencies or a different package manager than what is available in this repo`),await fm({appPath:i.absolute,example:t.copy.source,examplePath:t.examplePath});try{if((0,It.existsSync)(a)){if((await(0,It.readJSON)(a)).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((0,It.existsSync)(vm.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),L.error(l),await(0,It.rm)(i.absolute,{recursive:!0,force:!0});return}}else if(s){let c=async f=>Promise.resolve(!f.includes("node_modules")),l=L.turboLoader(`Creating "${r}" from "${s.name}"...`);l.start(),await(0,It.copy)(s.paths.root,i.absolute,{filter:c}),l.stop()}let u=await(0,It.readJSON)(a);u.name=r,Object.keys(o).forEach(c=>{let l=o[c];l&&Object.keys(l).length>0&&(u[c]=l)}),await(0,It.writeJSON)(a,u,{spaces:2}),L.log(),L.log(`${(0,NS.bold)(L.turboGradient(">>> Success!"))} Created ${r} at "${i.relative}"`)}function F9(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 yo(e){let t=await Oc(e),r=F9(e);L.log();let n={project:t,opts:r};r.method==="copy"?(r.copy.type==="external"?L.info(`Copy a remote workspace from ${r.copy.source}`):L.info(`Copy an existing workspace from "${t.name}"`),L.log(),await Am(n)):(L.info(`Add an empty workspace to "${t.name}"`),L.log(),await wm(n))}async function _o(e,t){let r=await Oc(t);L.log(),L.info(`Modify "${r.name}" using custom generators`),L.log(),await gm({generator:e,project:r,opts:t})}function MS(e){try{let t=JSON.parse(e),r={};for(let n in t){let i=hm(n,{to:"camel"});r[i]=t[n]}return r}catch(t){L.error("Error parsing arguments",t),process.exit(1)}}async function Dm(e,t){var r;if(e==="workspace"){let n=MS(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 yo(n)}else if(e==="run"){let n=MS(t.json),{generatorName:i,...s}=n;await _o(i,s)}else L.error(`Received unknown command - "${e}" (must be one of "workspace" | "run")`),process.exit(1)}var US=new $S.ProxyAgent;qS.default.globalAgent=US;jS.default.globalAgent=US;var bo=new Ue.Command;bo.name((0,HS.bold)(L.turboGradient("@turbo/gen"))).description("Extend your Turborepo").version(po.version,"-v, --version","Output the current version").helpOption("-h, --help","Display help for command").showHelpAfterError(!1);bo.command("run",{isDefault:!0}).alias("r").description("Run custom generators").addArgument(new Ue.Argument("[generator-name]","The name of the generator to run")).addOption(new Ue.Option("-c, --config <config>","Generator configuration file (default: turbo/generators/config.js")).addOption(new Ue.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Ue.Option("-a, --args <args...>","Arguments passed directly to generator").default([])).action(_o);bo.command("workspace").aliases(["w"]).description("Add a new package or app to your project").addOption(new Ue.Option("-n, --name <workspace-name>","Name for the new workspace")).addOption(new Ue.Option("-b, --empty","Generate an empty workspace").conflicts("copy").default(!0)).addOption(new Ue.Option("-c, --copy [source]",`Generate a workspace using an existing workspace as a template. Can be the name of a local workspace
77
77
  within your monorepo, or a fully qualified GitHub URL with any branch and/or subdirectory.
78
78
  `).conflicts("empty")).addOption(new Ue.Option("-d, --destination <dir>","Where the new workspace should be created")).addOption(new Ue.Option("-t, --type <type>","The type of workspace to create").choices(["app","package"])).addOption(new Ue.Option("-r, --root <dir>","The root of your repository (default: directory with root turbo.json)")).addOption(new Ue.Option("-p, --example-path <path-to-example>",`In a rare case, your GitHub URL might contain a branch name with
79
79
  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.2.2",
3
+ "version": "2.2.3",
4
4
  "description": "Extend a Turborepo",
5
5
  "homepage": "https://turbo.build/repo",
6
6
  "license": "MIT",
@@ -25,7 +25,7 @@
25
25
  "ts-node": "^10.9.1",
26
26
  "update-check": "^1.5.4",
27
27
  "validate-npm-package-name": "^5.0.0",
28
- "@turbo/workspaces": "2.2.2"
28
+ "@turbo/workspaces": "2.2.3"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/fs-extra": "^9.0.13",
@@ -37,10 +37,10 @@
37
37
  "ts-jest": "^27.1.1",
38
38
  "tsup": "^6.7.0",
39
39
  "typescript": "5.3.3",
40
- "@turbo/eslint-config": "0.0.0",
41
- "@turbo/tsconfig": "0.0.0",
42
40
  "@turbo/test-utils": "0.0.0",
43
- "@turbo/utils": "0.0.0"
41
+ "@turbo/tsconfig": "0.0.0",
42
+ "@turbo/utils": "0.0.0",
43
+ "@turbo/eslint-config": "0.0.0"
44
44
  },
45
45
  "files": [
46
46
  "dist"