UNPKG

monoreact

Version:
139 lines (121 loc) 37 kB
#!/usr/bin/env node 'use strict';var De=Object.create,se=Object.defineProperty,Oe=Object.getOwnPropertyDescriptor,Ee=Object.getOwnPropertyNames,Je=Object.getPrototypeOf,qe=Object.prototype.hasOwnProperty,Te=(a,b,c,e)=>{if(b&&"object"==typeof b||"function"==typeof b)for(let h of Ee(b))!qe.call(a,h)&&h!==c&&se(a,h,{get:()=>b[h],enumerable:!(e=Oe(b,h))||e.enumerable});return a},ae=(a,b,c)=>(c=null!=a?De(Je(a)):{},Te(!b&&a&&a.__esModule?c:se(c,"default",{value:a,enumerable:!0}),a)),Fe=require("sade"),x=require("shelljs"), q=require("ramda"),k=require("colorette"),oe=require("fs-extra"),Ae=require("path"),Be=require("execa"),Me=require("ora"),B=require("enquirer"),ne=require("rollup"),Ie=require("@ampproject/rollup-plugin-closure-compiler"),Le=require("@rollup/plugin-commonjs"),Re=require("@rollup/plugin-node-resolve"),We=require("@rollup/plugin-url"),ze=require("@rollup/plugin-image"),Ge=require("@rollup/plugin-json"),He=require("@rollup/plugin-beep"),Ye=require("@rollup/plugin-babel"),Ke=require("rollup-plugin-typescript2"), Ue=require("rollup-plugin-postcss"),Ve=require("rollup-plugin-strip-code"),Ze=require("rollup-plugin-filesize"),Qe=require("rollup-plugin-progress"),Xe=require("rollup-plugin-eslint"),et=require("autoprefixer"),tt=require("cssnano"),st=require("postcss-simple-vars"),at=require("postcss-nested"),re=require("eslint"),ot=require("jest");function m(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}} var nt=m(Fe),rt=m(x),d=m(oe),l=m(Ae),$=m(Be),O=m(Me),it=m(Ie),ct=m(Le),lt=m(Re),pt=m(We),ut=m(ze),dt=m(Ge),mt=m(He),ft=m(Ye),gt=m(Ke),ht=m(Ue),wt=m(Ve),yt=m(Ze),vt=m(Qe),bt=m(et),kt=m(tt),xt=m(st),$t=m(at);function K(a){x.exec(`npm config set init-author-name "${a}"`,{silent:!0})} function jt(){var a=x.exec("npm config get init-author-name",{silent:!0}).stdout.trim();return a?a:(a=x.exec("git config user.name",{silent:!0}).stdout.trim())?(K(a),a):x.exec("npm config get init-author-email",{silent:!0}).stdout.trim()||x.exec("git config user.email",{silent:!0}).stdout.trim()||null} let Pt=q.always(void 0),r={info:a=>q.pipe(k.bold,k.cyan)(a),details:a=>q.pipe(k.bold,k.blue)(a),error:a=>q.pipe(k.bold,k.red)(a),success:a=>q.pipe(k.bold,k.green)(a),highlight:a=>q.pipe(k.bold,k.yellow)(a),bold:a=>k.bold(a),inverse:a=>k.inverse(a),underline:a=>k.underline(a)};function T(){process.stdout.write("win32"===process.platform?"\u001b[2J\u001b[0f":"\u001b[2J\u001b[3J\u001b[H")} let f=()=>process.stdout.write("\n"),I=(a="")=>{let b="";for(let c=0;c<a.length;c+=1)" "!==a[c]&&(b+=a[c]);return""===b?new Map:new Map(b.split(",").map(c=>[c,!0]))}; var _t="monoreact",Ct="0.35.0",Nt="React workspaces implementation",St="MIT",Dt="./dist/bundle.cjs",Ot={monoreact:"./dist/bundle.cjs"},Et={email:"tarsis.maksym@gmail.com",name:"Max Tarsis",url:"https://github.com/tarsinzer"},Jt={type:"git",url:"https://github.com/tarsinzer/monoreact.git"},qt=["index.d.ts","templates/**/*"],Tt="https://github.com/tarsinzer/monoreact#readme",Ft="https://github.com/tarsinzer/monoreact/issues",At={start:"yarn build -w",build:"rollup -c rollup.config.js",lint:'eslint "src/**/*.{js,jsx,ts,tsx}"', test:"jest",prepublishOnly:"yarn build && yarn test"},Bt={"@ampproject/rollup-plugin-closure-compiler":"0.27.0","@babel/cli":"7.17.10","@babel/core":"7.18.2","@babel/plugin-proposal-class-properties":"7.17.12","@babel/plugin-transform-runtime":"7.18.2","@babel/preset-env":"7.18.2","@babel/preset-react":"7.17.12","@babel/runtime":"7.18.3","@rollup/plugin-babel":"5.3.1","@rollup/plugin-beep":"0.2.0","@rollup/plugin-commonjs":"21.1.0","@rollup/plugin-image":"2.1.1","@rollup/plugin-json":"4.1.0","@rollup/plugin-node-resolve":"13.3.0", "@rollup/plugin-url":"7.0.0","@typescript-eslint/eslint-plugin":"5.27.0","@typescript-eslint/parser":"5.27.0",autoprefixer:"10.4.7","babel-jest":"27.5.1",colorette:"2.0.17",cssnano:"5.1.11",enquirer:"2.3.6",eslint:"8.17.0","eslint-config-prettier":"8.5.0","eslint-config-react-app":"6.0.0","eslint-import-resolver-typescript":"2.7.1","eslint-plugin-compat":"4.0.2","eslint-plugin-flowtype":"8.0.3","eslint-plugin-import":"2.26.0","eslint-plugin-jsx-a11y":"6.5.1","eslint-plugin-prettier":"4.0.0","eslint-plugin-react":"7.30.0", "eslint-plugin-react-hooks":"4.5.0",execa:"5.1.1","fs-extra":"10.1.0","identity-obj-proxy":"3.0.0",jest:"27.5.1","node-sass":"7.0.1",ora:"5.4.1",postcss:"8.4.14","postcss-nested":"5.0.6","postcss-simple-vars":"6.0.3",ramda:"0.28.0",react:"17.0.2","react-dom":"17.0.2",rollup:"2.75.5","rollup-plugin-analyzer":"4.0.0","rollup-plugin-eslint":"7.0.0","rollup-plugin-filesize":"9.1.2","rollup-plugin-postcss":"4.0.2","rollup-plugin-progress":"1.1.2","rollup-plugin-size-snapshot":"0.12.0","rollup-plugin-strip-code":"0.2.7", "rollup-plugin-typescript2":"0.32.0","rollup-plugin-visualizer":"5.6.0",sade:"1.8.1",shelljs:"0.8.5","ts-jest":"27.1.5",tslib:"2.4.0",typescript:"4.7.3"},Mt={"@types/eslint":"8.4.2","@types/fs-extra":"9.0.13","@types/jest":"27.5.2","@types/node":"16.11.38","@types/ramda":"0.28.12","@types/react":"17.0.45","@types/sade":"1.7.4","@types/shelljs":"0.8.11",esbuild:"0.14.42","rollup-plugin-esbuild":"4.9.1","rollup-plugin-node-builtins":"2.1.2","rollup-plugin-node-globals":"1.4.0","rollup-plugin-preserve-shebangs":"0.2.0", yarn:"1.22.18"},It={access:"public"},Lt=!0,Rt="cli microfrontend workspaces submodules monorepo react typescript rollup".split(" "),w={name:_t,version:Ct,description:Nt,license:St,main:Dt,bin:Ot,author:Et,repository:Jt,files:qt,homepage:Tt,bugs:Ft,scripts:At,dependencies:Bt,devDependencies:Mt,publishConfig:It,workspace:Lt,keywords:Rt}; let P="package.json",L="tsconfig.json",ie={start:"npx monoreact watch",build:"npx monoreact build",test:"npx monoreact test --passWithNoTests",lint:'npx monoreact lint "src/**/*.{js,jsx,ts,tsx}"',prepublishOnly:"yarn build"},Wt={...ie,stylelint:'npx stylelint "src/**/*.{css,sass,scss}"'},ce={peerDependencies:{react:"*"}},le={name:void 0,author:void 0,workspace:!0,private:!1,version:"0.1.0",main:"dist/bundle.cjs.js",module:"dist/bundle.js",types:"dist/publicApi.d.ts",source:"src/publicApi.ts",publishConfig:{access:"public"}}, zt={name:void 0,author:void 0,version:"0.1.0",private:!0,license:"MIT",workspaces:[],scripts:{start:"react-scripts start",build:"react-scripts build",test:"react-scripts test",eject:"react-scripts eject",lint:"monoreact lint",stylelint:'stylelint "src/**/*.{css,sass,scss}"'},dependencies:{react:"^17.0.2","react-dom":"^17.0.2","react-scripts":"5.0.1"},devDependencies:{monoreact:"latest","@testing-library/jest-dom":"^5.16.1","@testing-library/react":"^12.1.2","@testing-library/user-event":"^13.5.0", "web-vitals":"^2.1.2","@types/jest":"^27.0.3","@types/react":"^17.0.45","@types/react-dom":"^17.0.17","@types/node":w.devDependencies["@types/node"],"@typescript-eslint/eslint-plugin":"5.7.0","@typescript-eslint/parser":"5.7.0","eslint-config-prettier":w.dependencies["eslint-config-prettier"],"eslint-config-react-app":w.dependencies["eslint-config-react-app"],"eslint-plugin-compat":w.dependencies["eslint-plugin-compat"],"eslint-plugin-prettier":w.dependencies["eslint-plugin-prettier"],"eslint-plugin-promise":"5.2.0", "eslint-plugin-react":w.dependencies["eslint-plugin-react"],"eslint-plugin-react-hooks":w.dependencies["eslint-plugin-react-hooks"],"eslint-plugin-import":w.dependencies["eslint-plugin-import"],"eslint-plugin-sonarjs":"0.11.0","eslint-plugin-jsx-a11y":w.dependencies["eslint-plugin-jsx-a11y"],husky:"4.3.8","lint-staged":"12.5.0",prettier:"2.6.2",stylelint:"14.1.0","stylelint-config-recommended":"3.0.0",tslib:w.dependencies.tslib,typescript:w.dependencies.typescript,yarn:w.devDependencies.yarn},browserslist:{production:[">0.2%", "not dead","not op_mini all"],development:["last 1 chrome version","last 1 firefox version","last 1 safari version"]}},U=a=>d.default.readJSON(l.default.resolve(a,L)),R=a=>d.default.readJSON(l.default.resolve(a,P)),pe=async()=>{var a=process.cwd();a=l.default.resolve(a,"dist");await d.default.remove(a)},V=(...a)=>l.default.resolve(__dirname,"../templates",...a),Gt=async a=>{a=a.map(b=>R(b.location));return(await Promise.allSettled(a)).map(b=>b.value)},Ht=a=>{const b=[],c=Object.fromEntries(a.map(({name:h, dependencies:n={},devDependencies:p={},peerDependencies:t={}})=>[h,{...n,...p,...t}])),e=new Map;for(const h in c)e.set(h,Object.keys(c[h]).filter(n=>void 0!==c[n]));for(a=Array.from(e.keys()).reduce((h,n)=>0<e.get(n).length?h:[...h,n],[]);0<a.length;){b.push(a);for(const h of a)e.delete(h);a=Array.from(e.keys()).filter(h=>{var n,p;const t=null!=(p=null==(n=e.get(h))?void 0:n.filter(u=>e.has(u)))?p:[];return e.set(h,t),0===t.length})}return{chunks:b,unprocessed:Array.from(e.entries())}},Yt=({dependencies:a= {},peerDependencies:b={},devDependencies:c={}})=>{const e=[...Object.keys(a),...Object.keys(b),...Object.keys(c)],h=new Map(e.map(n=>[n,n]));return n=>h.has(n)||!!e.find(p=>n.startsWith(`${p}/`))},ue=()=>x.exec("yarn install",{silent:!0}),W=console.error.bind(console); function y(a){a=a.error||a;var b=a.name?`${a.name} `:"";let c=a.message||a;b=Kt(a,b?`${b} ${c}`:c);f();a.stack?W(r.error(a.stack)):(W(r.error(b)),a.loc&&W(`at ${a.loc.file}:${a.loc.line}:${a.loc.column}`),f(),a.frame&&W(r.error(a.frame)));f()}function Kt(a,b){return a.plugin?"rpt2"===a.plugin?`(typescript) ${b}`:`(${a.plugin} plugin) ${b}`:b}let Z=async()=>{var a=x.exec("git submodule foreach --quiet 'echo $name'",{silent:!0});({stdout:a}=a);return a.trim().split("\n")};rt.default.config.silent=!0; let Ut=process.cwd();l.default.join(Ut,"test",".staging");class Vt extends Error{constructor(){super("\n \n Can't find workspace\n Make sure you run the script inside the project\n ");this.isNotFoundHostError=!0;this.name="Not Found Workspace Error"}}class Zt extends Error{constructor(){super(` Can't find workspace package Make sure you run the script inside the package The workspace ${P} should have: workspace: true; private: false; `);this.isNotFoundPackageError=!0;this.name="Not Found Workspace Error"}}let de=a=>void 0!==a.workspaces&&a.private,Qt=a=>a.workspace&&!a.private,Xt=a=>{var b;return void 0===a?[]:"packages"in a?null!=(b=a.packages)?b:[]:a},es=a=>{if(0===a.length)return"packages";const b=a.find(c=>"*"===c[c.length-1]);return void 0!==b?b.slice(0,b.length-2):a[0].split("/").filter(Boolean).slice(0,-1).join("/")}; async function ts(){let a=await N(),b=x.exec("yarn workspaces --json info",{cwd:a,silent:!0}).stdout.trim(),c=JSON.parse(JSON.parse(b).data);return Object.keys(c).reduce((e,h)=>[...e,{name:h,location:l.default.resolve(a,c[h].location)}],[])} let ss=({packages:a,packageName:b,setupPath:c})=>{c=c.split("/").filter(e=>"."!==e&&""!==e).join("/");b=""===c?b:`${c}/${b}`;c=""===c?"*":`${c}/*`;for(const e of a)if(e===c||e===b)return a;return a.concat(b)},as=(a,b)=>void 0===a?b:("packages"in a?a.packages=b:a=b,a),N=async(a=!1)=>{async function b(e){if(10>e.length)return null;const h=l.default.resolve(e,P);return d.default.existsSync(h)&&de(await d.default.readJSON(h))?e:b(l.default.resolve(e,".."))}var c=await b(await d.default.realpath(process.cwd())); if(null!==c)return c;c=new Vt;if(a)throw c;y(c);process.exit(1)},E=async(a=!1)=>{async function b(e){var h=l.default.resolve(e,P),n={};d.default.existsSync(h)&&(n=await d.default.readJSON(h));h=10>e.length;const p=de(n);n=Qt(n);switch(!0){case h||p:return null;case n:return e;default:return b(l.default.resolve(e,".."))}}var c=await b(await d.default.realpath(process.cwd()));if(null!==c)return c;c=new Zt;if(a)throw c;y(c);process.exit(1)},os=r.highlight("\n M O N O R E A C T\n "),M={exists:()=> r.error("\n It seems like you already have this feature.\n "),invalidFeatureName:a=>{a=r.inverse(` ${a} `);return r.error(` Invalid feature name Unfortunately, monoreact doesn't provide ${a} feature `)},adding:a=>`Adding ${r.info(a)} feature...`,successful:a=>`Added ${r.success(a)} feature template`,failed:a=>`Failed to add ${r.error(a)} feature template`},me={bundling:({source:a,module:b})=>r.info(`${a} \u2192 ${b}`),successful:([a,b])=>r.success("Compiled in ")+r.highlight(`${a}.${b.toString().slice(0,3)}s.`)},_={copy:a=>`${a}-copy`,successful:a=>`Generated ${r.info(a)} package`,generating:a=>`Generating ${r.info(a)} package...`,failed:a=>`Failed to generate ${r.error(a)} package`, successfulConfigure:()=>"The package successfully configured",failedConfigure:()=>"Failed to fully configure the package",invalidTemplate:a=>`Invalid template ${r.error(a)}`,exists:a=>`A folder named ${r.error(a)} already exists! ${r.bold("Choose a different name")}`,preparingPackage:(a,b)=>{const c=b.map(e=>` ${r.info(e)}`).join("\n");a=`Preparing ${r.info(a)} package`;return 0<b.length?`${a} with the following peer dependencies: ${c} `:a},preparedPackage:a=>` ${r.success("Awesome!")} You're now ready to start coding. There is no need to run ${r.info("monoreact install")}, since all peer dependencies are already in the workspace root So your next steps are: ${r.info(`cd packages/${a}`)} To start developing (rebuilds the bundle on changes): ${r.info("monoreact watch")} To build the bundle: ${r.info("monoreact build")} To test the package: ${r.info("monoreact test")} ${r.highlight("Happy coding :)")} `},Q={generating:()=>"Migrating...",successful:()=>"Migration completed successfully",failed:()=>"Failed migration detach"},X={successful:a=>`Successfully installed [${r.info(a)}] dependencies`,installing:a=>`Installing [${r.info(a)}] dependencies...`,failed:a=>`Failed to install [${r.error(a)}] dependencies`},fe={linting:a=>r.info(`Linting ${a} ...`),linted:([a,b])=>r.info("Linted in ")+r.highlight(`${a}.${b.toString().slice(0,3)}s.`)},j={changeFolder:()=>"Yes, let's choose another project name", leaveCurrentFolder:()=>"No, I want to create a project in this folder (without overwriting)",initial:a=>a,existsPrompt:a=>`The folder at ${r.error(a)} already exists! ${r.bold("Choose a different name")}`,failedPreparation:()=>r.error("A preparation error has occurred"),preparing:()=>`${r.info("Preparation in progress")}: installing dependencies, processing files`,prepared:()=>r.success("Preparation completed successfully"),creating:a=>`Creating React project at ${r.info(a)}`,failed:a=>`Failed to create ${r.error(a)} project`, created:({name:a,dir:b})=>`${r.success("Success!")} Created new ${r.info(a)} project at ${r.info(b)}`,finish:a=>` ${r.success("Awesome!")} You're now ready to start coding You might begin with: ${r.info("cd")} ${r.bold(a)} ${r.info("yarn start")} ${r.info("yarn start")} Starts the development server ${r.info("yarn build")} Bundles the app into static files for production ${r.info("yarn test")} Starts the test runner ${r.info("yarn eject")} Removes this tool and copies build dependencies, configuration files and scripts into the app directory ${r.info("yarn lint")} / ${r.info("yarn stylelint")} Runs lint runners ${r.highlight("Happy coding :)")} `},S={introduce:()=>r.underline(`${w.name} v${w.version}`),watching:()=>"\nWatching for changes...",compiling:()=>` ${r.info("Compiling modules...")}`,failed:()=>r.error("Failed compilation"),compiled:a=>r.success(`${a?"Compiled":"Recompiled"} successfully.`),bundles:({source:a,module:b})=>r.info(`Bundles ${a} \u2192 ${b}`),bundled:({isFirstChange:a,duration:b,module:c})=>{const [e,h]=(b/1E3).toString().split(".");return r.success(`${a?"Created":"Updated"} ${c} in ${e}.${h.slice(0,3)}s.`)}},J={init:()=>r.info("Initializing missing submodules"),entering:a=>r.info(`Entering '${a}'`),finished:({cmd:a,type:b,code:c})=> r.success(`Finished ${a} '${b}' with code ${c}`)},ns={build:"Compiling",lint:"Linting",watch:"Start watching",test:"Testing"},rs={build:"Compiled",lint:"Linted",watch:"Finished watching",test:"Tested"},is={build:"build",watch:"build",lint:"lint",test:"test"},g={introduce:()=>r.underline(`${w.name} v${w.version}`),running:a=>r.details(`Running ${a}`),started:a=>` ${r.info(`${ns[a]} modules...`)}`,finished:(a,b)=>r.success(`${rs[a]} ${b}`),failed:a=>r.error(`Failed to ${is[a]} workspaces`),successful:([a,b])=>r.success("Done in ")+r.highlight(`${a}.${b.toString().slice(0,3)}s.`)},ge=async({rootDir:a,branch:b,repoDir:c=""})=>{try{await $.default("git",["checkout",b],{stdio:"inherit",cwd:l.default.resolve(a,c)})}catch{await $.default("git",["checkout","-b",b],{cwd:l.default.resolve(a,c),stdio:"inherit"})}}; function cs(a){a.command("submodules checkout <branch>").describe("Checkout all submodules on the specific branch.").example("submodules checkout branch-name").alias("sc").option("s, self","Apply checkout for the host workspace").example("submodules checkout branch-name --self").action(async(b,{self:c})=>{let e=await N(),h=await Z();for(let n of h)console.log(J.entering(n)),await ge({rootDir:e,repoDir:n,branch:b}),f();c&&(console.log(J.entering("host")),await ge({rootDir:e,branch:b}),f())})} let he=async({rootDir:a,repoDir:b=""})=>{await $.default("git",["fetch","--all"],{cwd:l.default.resolve(a,b),stdio:"inherit"})}; function ls(a){a.command("submodules fetch").describe("Fetch all submodules.").example("submodules fetch").alias("sf").option("s, self","Apply fetch for the host workspace").example("submodules fetch --self").action(async({self:b})=>{let c=await N(),e=await Z();for(let h of e)console.log(J.entering(h)),await he({rootDir:c,repoDir:h}),f();b&&(console.log(J.entering("host")),await he({rootDir:c}),f())})}let ps=async a=>{await $.default("git",["submodule","update","--remote","--init"],{cwd:a,stdio:"inherit"})}; function us(a){a.command("submodules init").describe("Initialize missed submodules.").example("submodules init").alias("si").action(async()=>{let b=await N();console.log(J.init());f();await ps(b)})}let we=async({rootDir:a,remote:b,branch:c,repoDir:e=""})=>{await $.default("git",["pull",b,c],{cwd:l.default.resolve(a,e),stdio:"inherit"})}; function ds(a){a.command("submodules pull [branch]").describe("Pull all submodules (default: master).").example("submodules pull").example("submodules pull develop").alias("sp").option("r, remote","Define git remote","origin").example("submodules pull master --remote fork").option("s, self","Apply pull for the host workspace").example("submodules pull --self").action(async(b="master",{self:c,remote:e})=>{let h=await N(),n=await Z();for(let p of n)console.log(J.entering(p)),await we({rootDir:h,repoDir:p, remote:e,branch:b}),f();c&&(console.log(J.entering("host")),await we({rootDir:h,remote:e,branch:b}),f())})}let ms=a=>{cs(a);ls(a);us(a);ds(a)},z=(a,b)=>a.filter(c=>!b.has(c)),fs=a=>{console.log(r.error(`Potentially circular dependency Please check the following packages attentively: ${a.map(([b,c])=>{var e;return` ${b} => ${null!=(e=null==c?void 0:c.join(", "))?e:""}`}).join("\n ")} `))},G=async()=>{var a=await ts(),b=a.map(({name:h,location:n})=>[h,n]);a=await Gt(a);const {chunks:c,unprocessed:e}=Ht(a);b={chunks:c,packagesLocationMap:Object.fromEntries(b)};return 0<e.length&&fs(e),b}; function gs(a){a.command("workspaces build").describe("Build all workspaces.").example("workspaces build").alias("wb").option("q, quiet","Do not print logs",!1).example("workspaces build --quiet").option("e, exclude","Exclude specific workspaces").example("workspaces build --exclude workspace1,workspace2,workspace3").action(async({quiet:b,exclude:c})=>{let {chunks:e,packagesLocationMap:h}=await G();c=I(c);c.set(w.name,!0);T();console.log(g.introduce());console.log(g.started("build"));b||f();try{let n= process.hrtime();for(let t of e)await Promise.all(z(t,c).map(async u=>{b||console.log(g.running(u));let {stderr:C,exitCode:v,failed:Y}=await $.default("node",[l.default.resolve(__dirname,"../"),"build"],{cwd:h[u]});if(!b){let D=""!==C&&void 0!==C?C:"Unknown error";if(0!==v||Y)throw Error(D);console.log(g.finished("build",u))}}));b||f();let p=process.hrtime(n);console.log(g.successful(p));f()}catch(n){console.log(g.failed("build")),y(n),process.exit(1)}})} function hs(a){a.command("workspaces test").describe("Test all workspaces.").example("workspaces test").alias("wt").option("exclude","Exclude specific workspaces","").example("workspaces test --exclude workspace1,workspace2,workspace3").action(async({exclude:b})=>{let {chunks:c,packagesLocationMap:e}=await G();b=I(b);b.set(w.name,!0);T();console.log(g.introduce());console.log(g.started("test"));try{f();let h=process.hrtime();for(let p of c)for(let t of z(p,b))f(),console.log(g.running(t)),await $.default("node", [l.default.resolve(__dirname,".."),"test","--passWithNoTests"],{cwd:e[t],stdio:"inherit"}),console.log(g.finished("test",t));f();let n=process.hrtime(h);console.log(g.successful(n));f()}catch(h){console.log(g.failed("test")),y(h),process.exit(1)}})} function ws(a){a.command("workspaces lint").describe("Lint all workspaces.").example("workspaces lint").alias("wl").option("fix","Resolve fixable eslint errors",!1).example("workspaces lint --fix").option("exclude","Exclude specific workspaces","").example("workspaces lint --exclude workspace1,workspace2,workspace3").action(async({exclude:b,fix:c})=>{let {chunks:e,packagesLocationMap:h}=await G();b=I(b);b.set(w.name,!0);let n=[l.default.resolve(__dirname,".."),"lint","src/**/*.{js,jsx,ts,tsx}"];c&& n.push("--fix");T();console.log(g.introduce());console.log(g.started("lint"));try{f();let p=process.hrtime();for(let u of e)for(let C of z(u,b)){f();console.log(g.running(C));try{await $.default("node",n,{cwd:h[C],stdio:"inherit"})}catch(v){y(v)}console.log(g.finished("lint",C))}let t=process.hrtime(p);console.log(g.successful(t));f()}catch(p){console.log(g.failed("lint")),y(p),process.exit(1)}})} function ys(a){a.command("workspaces watch").describe("Watch all workspaces.").example("workspaces watch").alias("workspaces start","ws").option("q, quiet","Do not print logs",!1).example("workspaces watch --quiet").option("exclude","Exclude specific workspaces").example("workspaces watch --exclude workspace1,workspace2,workspace3").action(async({quiet:b,exclude:c})=>{let {chunks:e,packagesLocationMap:h}=await G();c=I(c);c.set(w.name,!0);T();console.log(g.introduce());console.log(g.started("watch")); b||f();try{let n=process.hrtime();for(let t of e)await Promise.all(z(t,c).map(async u=>{var C;b||console.log(g.running(u));let v=$.default("node",[l.default.resolve(__dirname,".."),"watch","--color"],{cwd:h[u],stderr:process.stderr});null==(C=v.stdout)||C.pipe(process.stdout);await new Promise(Y=>{var D;null==(D=v.stdout)||D.on("data",ba=>{ba.toString().includes(S.compiled(!0))&&Y()})})}));b||f();T();let p=process.hrtime(n);console.log(g.successful(p));f()}catch(n){console.log(g.failed("watch")), y(n)}})} let vs=a=>{gs(a);ws(a);ys(a);hs(a)},bs={dependencies:{react:"^17.0.2","react-dom":"^17.0.2"},devDependencies:{monoreact:"latest","@typescript-eslint/parser":"^5.6.0","@types/react":"^17.0.37","@types/react-dom":"^17.0.11","eslint-config-react-app":"^6.0.0",husky:"^4.3.5","lint-staged":"^12.1.2",prettier:"^2.5.1",tslib:"^2.4.0",typescript:"^4.5.3"}},ye={detach:bs},ks=a=>{var b;const c=["node_modules/@types"];void 0!==a&&(a=null!=(b=a.filter(e=>!e.includes("node_modules/@types")))?b:[],c.push(...a));return c}, xs=async a=>{const b={...(await U(a))};a=l.default.resolve(a,L);return void 0!==b.compilerOptions&&(b.compilerOptions.typeRoots=ks(b.compilerOptions.typeRoots)),d.default.outputJSON(a,b,{spaces:2})},$s=async a=>{var b,c;const e=l.default.resolve(a,P);a=await R(a);await d.default.outputJSON(e,{...a,dependencies:{...(null!=(b=null==a?void 0:a.dependencies)?b:{}),...ye.detach.dependencies},devDependencies:{...(null!=(c=null==a?void 0:a.devDependencies)?c:{}),...ye.detach.devDependencies}},{spaces:2})}, js=a=>d.default.copy(V("migration","detach"),a,{overwrite:!0,errorOnExist:!1}),Ps=a=>{a.command("migration detach").describe("Add all necessary settings to separate the package from the workspace.").alias("mi").example("migration detach").action(async()=>{const b=O.default(Q.generating()),c=await E();b.start();try{await xs(c),await $s(c),await js(c),await ue(),b.succeed(Q.successful())}catch(e){b.fail(Q.failed()),y(e),process.exit(1)}})},_s=a=>{Ps(a)},Cs={path:".",scripts:{"start:docz":"docz dev -p 6010"}}, Ns={path:"./playground",scripts:{"start:playground":'yarn build & npx concurrently --kill-others "yarn start" "cd playground & yarn start"'}},H={docz:Cs,playground:Ns},Ss={dependencies:[],packageJson:{...le,scripts:ie}},Ds={dependencies:Object.keys(ce.peerDependencies),packageJson:{...le,...ce,scripts:Wt}},F={basic:Ss,react:Ds},ve=()=>x.exec("npx sort-package-json",{silent:!0}),be=({dir:a,preset:b})=>d.default.outputJSON(l.default.resolve(a,P),b,{spaces:2}),ke=async()=>{const a=jt();return null!== a?a:(new B.Input({name:"author",message:"Who is the package author?"})).run()},xe=({dir:a,bin:b,template:c})=>d.default.copy(V(b,c),a,{overwrite:!1}),ee=async({basePath:a,name:b,onPromptMessage:c,onPromptInitial:e})=>{if(!d.default.existsSync(l.default.resolve(a,b)))return b;b=await (new B.Input({message:c(b),initial:e(b),result:h=>h.trim()})).run();return ee({basePath:a,name:b,onPromptMessage:c,onPromptInitial:e})},Os=a=>a.toLowerCase().replace(/(^@.*\/)|((^[^a-zA-Z]+)|[^\w.-])|([^a-zA-Z0-9]+$)/g, ""),Es=new B.Select({message:"Choose a template",choices:Object.keys(F).map(a=>({name:a,message:r.info(a)}))}),Js=async(a,b)=>(void 0!==a&&void 0===F[a]&&b(),void 0===a||void 0===F[a]?Es.run():a),qs=({author:a,name:b,hostName:c,license:e,template:h})=>{const n=c.indexOf("/");c=-1===n?`@${c}`:c.slice(0,n);b=Os(b);a={...h.packageJson,name:c?`${c}/${b}`:b,author:a};return e&&(a.license=e),a},Ts=()=>x.exec("yarn build",{silent:!0}),Fs=async({packageJson:a,packageJsonPath:b,packages:c,setupPath:e,packageName:h})=> {c=ss({packages:c,setupPath:e,packageName:h});a.workspaces=as(a.workspaces,c);await oe.outputJSON(b,a,{spaces:2})},$e=Object.keys(F),As=a=>{a.command("generate <pkg> [path]").describe("Generate a new package.\n Package name is required.\n Path is optional. The path argument indicates where the folder with the package name should be generated.").alias("g").example("generate packageName").example("generate packageName .").example("generate packageName workspaces").option("t, template",`Specify a template. Available templates: [${$e.join(", ")}] `).example(`generate packageName --template ${$e[0]}`).action(async(b,c,{template:e})=>{let h=b,n=e;const p=await N(),t=l.default.resolve(p,P),u=await d.default.readJSON(t),C=O.default(_.generating(b));try{const v=Xt(u.workspaces),Y=c||es(v);h=await ee({basePath:l.default.resolve(p,Y),name:b,onPromptMessage:ca=>_.failed(ca),onPromptInitial:ca=>_.copy(ca)});const D=l.default.resolve(p,Y,h);n=await Js(e,()=>{C.fail(_.invalidTemplate(e))});const ba=await ke();C.start();K(ba);await xe({dir:D,bin:"generate", template:n});process.chdir(D);const da=qs({author:ba,name:h,license:u.license,hostName:u.name,template:F[n]});await be({dir:D,preset:da});await Fs({packageJsonPath:t,packageJson:u,packageName:h,packages:v,setupPath:Y});C.succeed(_.successful(h))}catch(v){C.fail(_.failed(h)),y(v),process.exit(1)}({dependencies:b}=F[n]);b=O.default(_.preparingPackage(h,b.sort())).start();try{await ve();const v=await Ts();if(0<v.code)throw Error(v.stderr);b.succeed(_.successfulConfigure());console.log(_.preparedPackage(h))}catch(v){b.fail(_.failedConfigure()), y(v),process.exit(1)}})},Bs=(a,b,c=Pt)=>a in H?Promise.resolve(a):(c(),(new B.Select({message:"Choose a feature",choices:b.map(e=>({name:e,message:r.info(e)}))})).run()),Ms=(a,b)=>d.default.copy(V("add",b),l.default.resolve(a,H[b].path),{overwrite:!1,errorOnExist:!0}),Is=({dir:a,packageJson:b,option:c})=>d.default.outputJSON(a,{...b,scripts:{...b.scripts,...H[c].scripts}},{spaces:2}),je=Object.keys(H),Ls=a=>{a.command("add [featureName]").describe(`Embed ready-made feature [${je.join(", ")}].`).example("add").example("add playground").action(async(b= "")=>{const c=await Bs(b,je,()=>console.log(M.invalidFeatureName(c)));b=await E();const e=l.default.resolve(b,P),h=await d.default.readJSON(e),n=O.default(M.adding(c));n.start();try{await Ms(b,c),await Is({dir:e,packageJson:h,option:c}),n.succeed(M.successful(c))}catch(p){n.fail(M.failed(c)),p.toString().includes("already exists")&&console.log(M.exists()),y(p),process.exit(1)}})},Rs={packageJson:zt},Pe={cra:Rs},Ws=a=>{const b={Yes:j.changeFolder(),No:j.leaveCurrentFolder()};return(new B.Select({message:r.error(`Would you like to choose a different path? The specified path ${r.underline(`${a}`)} is already taken. `),choices:["Yes","No"].map(c=>({name:c,message:b[c]}))})).run()},zs=async({name:a,dir:b})=>{var c;if(!d.default.existsSync(b)||"Yes"!==await Ws(b))return{projectDir:b,projectName:null!=(c=b.split(l.default.sep).pop())?c:"project"};a=await Gs(a);b=l.default.resolve(a);return{projectName:a,projectDir:b}},Gs=async a=>ee({basePath:process.cwd(),name:a,onPromptInitial:j.initial,onPromptMessage:b=>j.existsPrompt(l.default.resolve(b))}),_e=Object.keys(Pe),Hs=a=>{a.command("new <name> [dir]").describe("Create a new React project (scaffolding).\n Project name is required.\n Directory is optional. However, if you specify dir, then template files will be installed there, even if this folder already exists, but without overwriting.").example("new projectName").example("new projectName .").example("new projectName projectDirectory").option("t, template", `Specify a template. Available templates: [${_e.join(", ")}] `,"cra").example(`new projectName --template ${_e[0]}`).option("f, force","Skip folder checks",!1).action(async(b,c,{template:e,force:h})=>{const n=O.default();c=l.default.resolve(c||b);const {projectDir:p,projectName:t}=h?{projectDir:c,projectName:b}:await zs({name:b,dir:c});n.start(j.creating(p));try{await xe({dir:p,bin:"new",template:e});n.stop();const u=await ke();K(u);n.start();process.chdir(p);await be({dir:p,preset:{...Pe[e].packageJson,name:t,author:u}});n.succeed(j.created({dir:p,name:t}))}catch(u){n.fail(j.failed(t)), y(u),process.exit(1)}b=O.default(j.preparing()).start();try{ve(),ue(),b.succeed(j.prepared())}catch(u){b.fail(j.failedPreparation()),y(u)}console.log(j.finish(p))})},Ys=a=>{Ls(a);As(a);Hs(a)},Ce=({packageJson:a,runEslint:b,displayFilesize:c,useClosure:e})=>({input:a.source,output:[{file:a.module,format:"es",sourcemap:!0},{file:a.main,format:"cjs",sourcemap:!0}],external:Yt(a),plugins:[mt.default(),vt.default({clearLine:!0}),b&&Xe.eslint(),c&&yt.default(),e&&it.default(),dt.default(),pt.default(), ut.default(),ht.default({extract:!1,modules:!0,writeDefinitions:!0,plugins:[bt.default(),kt.default(),xt.default({variables:{}}),$t.default()],extensions:[".css",".scss",".sass"],use:["sass"]}),gt.default({clean:!0,tsconfigDefaults:{exclude:"**/*.spec.ts **/*.test.ts **/*.spec.tsx **/*.test.tsx node_modules dist".split(" "),compilerOptions:{rootDir:"./src",sourceMap:!0,declaration:!0,jsx:"react",target:"es5",lib:["dom","dom.iterable","esnext"],allowJs:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0, strict:!0,forceConsistentCasingInFileNames:!0,module:"esnext",moduleResolution:"node",resolveJsonModule:!0,isolatedModules:!0,noEmit:!0}}}),ct.default({include:/\/node_modules\//}),lt.default({extensions:[".js",".jsx",".ts",".tsx"],preferBuiltins:!1,browser:!0}),ft.default({babelHelpers:"runtime",skipPreflightCheck:!0,babelrc:!1,extensions:[".js","jsx",".ts",".tsx"],presets:["@babel/preset-env","@babel/preset-react"],plugins:["@babel/plugin-transform-runtime","@babel/proposal-class-properties"],exclude:/\/node_modules\//}), wt.default({start_comment:"placeholder:start",end_comment:"placeholder:end"})]}),Ks=async a=>{var b=await U(a);a=await R(a);await pe();const c=process.hrtime();b=Ce({tsconfigJson:b,packageJson:a,displayFilesize:!0,runEslint:!1,useClosure:!1});console.log(me.bundling(a));try{const e=await ne.rollup(b);await Promise.all(b.output.map(n=>e.write(n)));const h=process.hrtime(c);console.log(me.successful(h))}catch(e){y(e),process.exit(1)}},Us=a=>{a.command("build").describe("Build a package.").alias("b").example("build").action(async()=> {const b=await E();await Ks(b)})},Vs=(a,b)=>({ignorePatterns:["*.*ss"],settings:{"import/resolver":{node:{paths:[l.default.resolve(a,"src")],extensions:[".js",".jsx",".ts",".tsx"]}},"import/parsers":{"@typescript-eslint/parser":[".ts",".tsx"]},react:{version:"detect"}},rules:{"import/no-unresolved":0},extends:"eslint:recommended react-app plugin:prettier/recommended plugin:react/recommended plugin:import/errors plugin:import/warnings plugin:import/typescript plugin:@typescript-eslint/recommended".split(" "), parser:"@typescript-eslint/parser",parserOptions:{tsconfigRootDir:a,project:b}}),Zs=async()=>{const a=[];let b="";try{b=await E(!0),a.push(l.default.resolve(b,L))}catch{}try{const c=""!==b,e=await N(c);c||(b=e);a.push(l.default.resolve(e,L))}catch{}return{dir:b,project:a}},Qs=a=>{a.command("lint").describe("Lint a package (default lint pattern src/**/*.{js,jsx,ts,tsx}.").alias("l").option("fix","Resolve fixable eslint errors").example("lint --fix").option("ignore-path","Ignore a path").example("lint --ignore-path src/foo.ts").action(async b=> {var c=process.hrtime(),e=0<b._.length?b._:["src/**/*.{js,jsx,ts,tsx}"];const {dir:h,project:n}=await Zs();var p=l.default.resolve(h,P);({eslintConfig:p={}}=await d.default.readJSON(p));p=new re.ESLint({baseConfig:{...Vs(h,n),...p},extensions:[".ts",".tsx",".js",".jsx"],fix:b.fix,ignorePath:b["ignore-path"]});console.log(fe.linting(e));e=await p.lintFiles(e);b.fix&&await re.ESLint.outputFixes(e);b=await p.loadFormatter();console.log(b.format(e));c=process.hrtime(c);console.log(fe.linted(c));for(const t of e)t.errorCount&& process.exit(1)})},Xs=async a=>{const b=await R(a);a=await U(a);const c=Ce({tsconfigJson:a,packageJson:b,displayFilesize:!1,runEslint:!1,useClosure:!1});let e=!0;return await pe(),new Promise(h=>{ne.watch(c).on("event",async n=>{"BUNDLE_START"===n.code&&(T(),console.log(S.introduce()),console.log(S.bundles(b)),console.log(S.compiling()));"ERROR"===n.code&&(console.log(S.failed()),y(n.error));"BUNDLE_END"===n.code&&(console.log(S.compiled(e)),console.log(S.bundled({isFirstChange:e,module:b.module, duration:n.duration})));"END"===n.code&&(e=!1,console.log(S.watching()),h())})})},ea=a=>{a.command("watch").describe("Rebuild a package on change.").alias("w","start").example("watch").action(async()=>{const b=await E();await Xs(b)})},ta=({rootDir:a,jestPackageOptions:b,jestConfigOptions:c})=>({rootDir:a,moduleFileExtensions:"ts tsx js jsx json node".split(" "),transform:{".(ts|tsx)$":require.resolve("ts-jest/dist"),".(js|jsx)$":require.resolve("babel-jest")},transformIgnorePatterns:["[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$"], testMatch:["<rootDir>/**/*.(spec|test).{ts,tsx,js,jsx}"],moduleNameMapper:{"\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$":"identity-obj-proxy","\\.(css|less|scss|sass)$":"identity-obj-proxy"},roots:[l.default.resolve(a,"src")],moduleDirectories:["node_modules","src"],testPathIgnorePatterns:[l.default.resolve(a,"node_modules/")],...b,...c}),sa=async(a,b)=>{try{if(b){const h=l.default.resolve(a,b);process.argv.splice(process.argv.indexOf("--config"),2);const n= b.split(".");return"js"===n[n.length-1]?require(h):await d.default.readJSON(h)}const c=l.default.resolve(a,"jest.config.js"),e=l.default.resolve(a,"jest.config.json");if(d.default.existsSync(c))return require(c);if(d.default.existsSync(e))return await d.default.readJSON(e)}catch{}return{}},aa=()=>{process.env.NODE_ENV="test";process.env.BABEL_ENV="test"},oa=a=>{a.command("test").describe("Test a package.").alias("t").option("config","Specify a path to the jest config").action(async b=>{aa();var c= await E(),e=l.default.resolve(c,P);b=await sa(c,b.config);({jest:e}=await d.default.readJSON(e));c=ta({rootDir:c,jestPackageOptions:e,jestConfigOptions:b});ot.run([...process.argv.slice(3),"--config",JSON.stringify({...c})])})},na=a=>{a.command("install").describe("Install one or more dependencies to the workspace (host). \n If you run this command inside some package, then it will be added to the package (as dev or peer dependency)").alias("i").example("install libraryName").option("dev, D", "Install development dependencies").example("install libraryName --dev").action(async({_:b,dev:c})=>{const e=b.join(" "),h=O.default(X.installing(e));h.start();try{var n=await E(!0);const p=["add"];c?p.push("--dev"):p.push("--peer");for(const t of b)p.push(t);await $.default("yarn",p,{cwd:n})}catch{}try{const p=await N(!0);n=["add","--exact","-W"];c&&n.push("--dev");"string"==typeof c&&b.push(c);for(const t of b)n.push(t);await $.default("yarn",n,{cwd:p});h.succeed(X.successful(e))}catch(p){h.fail(X.failed(e)), y(p),process.exit(1)}})},ra=a=>{Us(a);Qs(a);ea(a);oa(a);na(a)},A=nt.default("monoreact");console.log(os);ra(A);_s(A);Ys(A);ms(A);vs(A);A.version(w.version).parse(process.argv)