@tomjs/create-app 0.13.0 → 0.14.0

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/index.mjs CHANGED
@@ -1,8 +1,11 @@
1
- import l,{renameSync as Ie}from"fs";import Ve from"os";import s from"path";import{fileURLToPath as Je}from"url";import{lightBlue as D,lightCyan as Me,lightGreen as G,lightYellow as we,red as Se,reset as j,yellow as We}from"kolorist";import{camelCase as ze}from"lodash-es";import Le from"minimist";import Ye from"prompts";import T from"shelljs";import ye from"os";import he from"path";import{blue as Te,red as O,reset as F}from"kolorist";import Ne from"minimist";import Q from"prompts";import p from"fs";import Y from"path";function A(e){return[["t","template"],["g","git"]].forEach(([i,c])=>{e[c]=e[c]??e[i]}),e}function ae(e){return p.readdirSync(e).length===0}function B(e){return e?.trim().replace(/\/+$/g,"")}function Ge(e,i){p.mkdirSync(i,{recursive:!0});for(let c of p.readdirSync(e)){let w=Y.resolve(e,c),u=Y.resolve(i,c);H(w,u)}}function H(e,i){p.statSync(e).isDirectory()?Ge(e,i):p.copyFileSync(e,i)}function le(e){if(p.existsSync(e))for(let i of p.readdirSync(e))p.rmSync(Y.resolve(e,i),{recursive:!0,force:!0})}function K(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function pe(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-")}function me(e){if(!e)return;let c=e.split(" ")[0].split("/");return{name:c[0],version:c[1]}}function S(e){if(p.existsSync(e))try{return JSON.parse(p.readFileSync(e,"utf8"))}catch(i){console.error(i)}}function h(e,i){p.writeFileSync(e,JSON.stringify(i,null,2)+`
2
- `)}function ue(e){return p.existsSync(e)?p.readFileSync(e,"utf8"):""}function $(e){p.existsSync(e)&&p.rmSync(e,{recursive:!0,force:!0})}function ge(e){p.existsSync(e)||p.mkdirSync(e,{recursive:!0})}var Ue=A(Ne(process.argv.slice(2),{string:["_"]})),fe={repo:"https://github.com",owner:ye.userInfo().username};function X(e){let{repo:i,owner:c}=e;return`${i}${i.endsWith("/")?"":"/"}${c}`}async function de(e){let i=await Q([{type:"text",name:"repo",message:F("Git repository url:"),initial:e?.repo||fe.repo},{type:"text",name:"owner",message:F("Git repository owner:"),initial:e?.owner||fe.owner}],{onCancel:()=>{throw console.log(O("\u2716")+" Operation cancelled"),new Error}});return{id:e?.id||Date.now().toString(),repo:i.repo,owner:i.owner}}var ve=he.join(ye.homedir(),".tomjs","create-app"),xe=he.join(ve,"config.json");function C(){return ge(ve),Object.assign({gitRepos:[]},S(xe))}function _e(e){let i=C();i.createTime?i.updateTime=Date.now():i.createTime=Date.now(),h(xe,Object.assign(i,e))}function q(e){_e({gitRepos:e})}async function Z(){let{gitRepos:e}=C();(e.length===0||Ue.git)&&(e.length===0&&console.log(`You need to set the ${Te("git remote repository")} for the first time.`),await i());async function i(){let c=e.map(y=>({title:X(y),value:y.id})).concat([{title:"Add",value:"add"},{title:O("Exit"),value:"exit"}]),w=await Q({type:"select",name:"repoId",message:e.length===0?"You choose to add or exit:":"You can choose the repository to be operated, or choose to add or exit:",choices:c},{onCancel:()=>{throw console.log(O("\u2716")+" Operation cancelled"),new Error}}),{repoId:u}=w;if(u==="exit")return;if(u==="add"){let y=await de();return e.push(y),q(e),i()}let k=e.findIndex(y=>y.id===u),P=await Q([{type:"select",name:"action",message:F("Select an action?"),choices:[{title:"Edit",value:"edit"},{title:"Remove",value:"remove"},{title:"Exit",value:"exit"}]},{type:y=>y==="remove"&&"toggle",name:"confirmRemove",message:F("Where confirm to remove?"),initial:!0,active:"Yes",inactive:"No"}],{onCancel:()=>{throw console.log(O("\u2716")+" Operation cancelled"),new Error}}),{action:R,confirmRemove:N}=P;if(R==="exit")return Z();if(R==="remove")return N&&(e.splice(k,1),q(e)),i();let U=await de(e[k]);return e[k]=U,q(e),i()}}var ee=A(Le(process.argv.slice(2),{string:["_"]})),te=process.cwd(),Be=["test","vite","electron","examples"],Ee=[{name:"web",display:"Web App",color:G,variants:[{name:"vue",display:"Vue",color:G},{name:"react",display:"React",color:D}]},{name:"electron",display:"Electron App",color:D,variants:[{name:"electron-vue",display:"Vue",color:G},{name:"electron-react",display:"React",color:D}]},{name:"vscode",display:"VSCode Extension",color:Me,options:[{id:"publish",name:"Git Repository"},{id:"ssh",name:"Git init by SSH"}],variants:[{name:"vscode",display:"Base",color:we},{name:"vscode-vue",display:"Vue",color:G},{name:"vscode-react",display:"React",color:D}]},{name:"node",display:"Node",color:we,options:[{id:"test",name:"Test"},{id:"publish",name:"Git Repository + NPM Publish"},{id:"ssh",name:"Git init by SSH"},{id:"vite",name:"Vite Plugin"},{id:"tsup",name:"Use tsup build"},{id:"electron",name:"Electron"},{id:"examples",name:"Examples"}]}],je=Ee.map(e=>e.variants&&e.variants.map(i=>i.name)||[e.name]).reduce((e,i)=>e.concat(i),[]),ne="my-app";function ke(e){let i=T.exec(`git config --get ${e}`,{silent:!0});if(i.code===0)return i.stdout.trim()}function be(e){return e.length>1?e.substring(e.indexOf("/")+1):e}async function He(){let e=B(ee._[0]),i=ee.template||ee.t,c=e||ne,w=()=>c==="."?s.basename(s.resolve()):c,u=be(c),{gitRepos:k}=C(),P=await Ye([{type:e?null:"text",name:"projectName",message:j("Project name:"),initial:ne,onState:n=>{c=B(n.value)||ne,u=be(c)}},{type:()=>!l.existsSync(u)||ae(u)?null:"toggle",name:"overwrite",message:()=>(u==="."?"Current directory":`Target directory "${u}"`)+" is not empty. Remove existing files and continue?",initial:!1,active:"Yes",inactive:"No"},{type:(n,{overwrite:t})=>{if(t===!1)throw console.log(Se("\u2716")+" Operation cancelled"),new Error;return null},name:"overwriteChecker"},{type:()=>K(w())?null:"text",name:"packageName",message:j("Package name:"),initial:()=>pe(w()),validate:n=>K(n)||"Invalid package.json name"},{type:i&&je.includes(i)?null:"select",name:"framework",message:typeof i=="string"&&!je.includes(i)?j(`"${i}" isn't a valid template. Please choose from below: `):j("Select a framework:"),initial:0,choices:Ee.map(n=>{let t=n.color;return{title:t(n.display||n.name),value:n}})},{type:n=>n&&n.variants?"select":null,name:"variant",message:j("Select a variant:"),choices:n=>n?.variants?.map(t=>{let r=t.color;return{title:r(t.display||t.name),value:t.name}})},{type:(n,t)=>{let{framework:r}=t;return r&&Array.isArray(r.options)&&r.options.length?"multiselect":null},name:"options",message:j("Select optional options:"),instructions:!1,choices:(n,t)=>{let{framework:r}=t;return r?.options?.map(o=>({title:o.name,value:o.id}))}},{type:(n,t)=>k.length&&Array.isArray(t.options)&&t.options.includes("publish")?"select":null,name:"gitUserUrl",message:j("Which git repository to publish to?"),choices:k.map(n=>{let t=X(n);return{title:t,value:t}})}],{onCancel:()=>{throw console.log(Se("\u2716")+" Operation cancelled"),new Error}}),{framework:R,overwrite:N,packageName:U,variant:y,gitUserUrl:E}=P,m=P.options||[],a=s.join(te,u);N?le(a):l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),console.log(`
3
- Scaffolding project in ${a}...`);let _=y||R?.name||i||"",I=n=>s.join(Je(import.meta.url),"../..",`template-${n}`),Pe=I(_),V=_.includes("node");[I("config"),Pe].forEach(n=>{let t=l.readdirSync(n);for(let r of t){let o=r.startsWith("_")?r.replace("_","."):r;(V&&!m.includes("examples")||_==="vscode")&&r.includes("stylelint")||H(s.join(n,r),s.join(a,o))}});let g=U||w(),J={name:ke("user.name")||Ve.userInfo().username,email:ke("user.email")||""},M={"pkg.name":g,"user.name":J.name,"user.email":J.email,"git.org":W(),"git.url":Re(),"git.fullUrl":ie()};function Re(){return`${E||`https://github.com/${W()}`}/${g.substring(g.indexOf("/")+1)}`}function W(){return E?E.substring(E.lastIndexOf("/")+1):g.startsWith("@")?g.split("/")[0].substring(1):ze(J.name)}function ie(n=!1){let t=E||`https://github.com/${W()}`;return n&&(t=t.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${t}/${g.substring(g.indexOf("/")+1)}.git`}$e(),V&&(Ae(),Ce(),De());let re=me(process.env.npm_config_user_agent),z=re?re.name:"npm";T.which("git")&&(T.exec(`cd ${a} && git init`),m.includes("publish")&&T.exec(`cd ${a} && git remote add origin ${ie(m.includes("ssh"))}`));let L=s.relative(te,a);switch(console.log(`
1
+ import u,{renameSync as Ye}from"fs";import Be from"os";import l from"path";import{fileURLToPath as He}from"url";import{lightBlue as T,lightCyan as Ke,lightGreen as U,lightYellow as Se,red as be,reset as x,yellow as qe}from"kolorist";import{camelCase as Qe}from"lodash-es";import Xe from"minimist";import Ze from"prompts";import _ from"shelljs";import ve from"os";import xe from"path";import{blue as We,red as D,reset as N}from"kolorist";import Me from"minimist";import te from"prompts";import p from"fs";import K from"path";function $(e){return[["t","template"],["g","git"]].forEach(([i,o])=>{e[o]=e[o]??e[i]}),e}function ue(e){return p.readdirSync(e).length===0}function q(e){return e?.trim().replace(/\/+$/g,"")}function Je(e,i){p.mkdirSync(i,{recursive:!0});for(let o of p.readdirSync(e)){let h=K.resolve(e,o),s=K.resolve(i,o);Q(h,s)}}function Q(e,i){p.statSync(e).isDirectory()?Je(e,i):p.copyFileSync(e,i)}function me(e){if(p.existsSync(e))for(let i of p.readdirSync(e))p.rmSync(K.resolve(e,i),{recursive:!0,force:!0})}function X(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function ge(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-")}function de(e){if(!e)return;let o=e.split(" ")[0].split("/");return{name:o[0],version:o[1]}}function A(e){if(p.existsSync(e))try{return JSON.parse(p.readFileSync(e,"utf8"))}catch(i){console.error(i)}}function O(e,i){p.writeFileSync(e,JSON.stringify(i,null,2)+`
2
+ `)}function Z(e){return p.existsSync(e)?p.readFileSync(e,"utf8"):""}function F(e,i){p.writeFileSync(e,i)}function C(e){p.existsSync(e)&&p.rmSync(e,{recursive:!0,force:!0})}function fe(e){p.existsSync(e)||p.mkdirSync(e,{recursive:!0})}var ze=$(Me(process.argv.slice(2),{string:["_"]})),ye={repo:"https://github.com",owner:ve.userInfo().username};function ne(e){let{repo:i,owner:o}=e;return`${i}${i.endsWith("/")?"":"/"}${o}`}async function he(e){let i=await te([{type:"text",name:"repo",message:N("Git repository url:"),initial:e?.repo||ye.repo},{type:"text",name:"owner",message:N("Git repository owner:"),initial:e?.owner||ye.owner}],{onCancel:()=>{throw console.log(D("\u2716")+" Operation cancelled"),new Error}});return{id:e?.id||Date.now().toString(),repo:i.repo,owner:i.owner}}var we=xe.join(ve.homedir(),".tomjs","create-app"),ke=xe.join(we,"config.json");function G(){return fe(we),Object.assign({gitRepos:[]},A(ke))}function Le(e){let i=G();i.createTime?i.updateTime=Date.now():i.createTime=Date.now(),O(ke,Object.assign(i,e))}function ee(e){Le({gitRepos:e})}async function ie(){let{gitRepos:e}=G();(e.length===0||ze.git)&&(e.length===0&&console.log(`You need to set the ${We("git remote repository")} for the first time.`),await i());async function i(){let o=e.map(v=>({title:ne(v),value:v.id})).concat([{title:"Add",value:"add"},{title:D("Exit"),value:"exit"}]),h=await te({type:"select",name:"repoId",message:e.length===0?"You choose to add or exit:":"You can choose the repository to be operated, or choose to add or exit:",choices:o},{onCancel:()=>{throw console.log(D("\u2716")+" Operation cancelled"),new Error}}),{repoId:s}=h;if(s==="exit")return;if(s==="add"){let v=await he();return e.push(v),ee(e),i()}let d=e.findIndex(v=>v.id===s),w=await te([{type:"select",name:"action",message:N("Select an action?"),choices:[{title:"Edit",value:"edit"},{title:"Remove",value:"remove"},{title:"Exit",value:"exit"}]},{type:v=>v==="remove"&&"toggle",name:"confirmRemove",message:N("Where confirm to remove?"),initial:!0,active:"Yes",inactive:"No"}],{onCancel:()=>{throw console.log(D("\u2716")+" Operation cancelled"),new Error}}),{action:E,confirmRemove:I}=w;if(E==="exit")return ie();if(E==="remove")return I&&(e.splice(d,1),ee(e)),i();let V=await he(e[d]);return e[d]=V,ee(e),i()}}var re=$(Xe(process.argv.slice(2),{string:["_"]})),oe=process.cwd(),et=["test","vite","examples"],Re=[{name:"node",display:"Node",color:Se,options:[{id:"test",name:"Test"},{id:"publish",name:"Git Repository + NPM Publish",selected:!0},{id:"ssh",name:"Git init by SSH",selected:!0},{id:"tsup",name:"Use tsup build",selected:!0},{id:"vite",name:"Use vite build"},{id:"vite-plugin",name:"Vite Plugin"},{id:"examples",name:"Examples"},{id:"workspace",name:"Workspaces/Monorepo"}]},{name:"web",display:"Web App",color:U,variants:[{name:"vue",display:"Vue",color:U},{name:"react",display:"React",color:T}]},{name:"electron",display:"Electron App",color:T,variants:[{name:"electron-vue",display:"Vue",color:U},{name:"electron-react",display:"React",color:T}]},{name:"vscode",display:"VSCode Extension",color:Ke,options:[{id:"publish",name:"Git Repository"},{id:"ssh",name:"Git init by SSH"}],variants:[{name:"vscode",display:"Base",color:Se},{name:"vscode-vue",display:"Vue",color:U},{name:"vscode-react",display:"React",color:T}]}],je=Re.map(e=>e.variants&&e.variants.map(i=>i.name)||[e.name]).reduce((e,i)=>e.concat(i),[]),se="my-app";function Pe(e){let i=_.exec(`git config --get ${e}`,{silent:!0});if(i.code===0)return i.stdout.trim()}function Ee(e){return e.length>1?e.substring(e.indexOf("/")+1):e}function P(e,...i){$e(e.devDependencies,...i)}function tt(e,...i){$e(e.peerDependencies,...i)}function $e(e,...i){function o(s,d){return s.includes("@")?s.replace("@","").split("/").find(w=>o(w,d)):d===s||s.includes(`-${d}`)||s.includes(`${d}-`)}let h=e||{};Object.keys(h||{}).forEach(s=>{i.find(d=>o(s,d))&&delete h[s]})}async function nt(){let e=q(re._[0]),i=re.template||re.t,o=e||se,h=()=>o==="."?l.basename(l.resolve()):o,s=Ee(o),{gitRepos:d}=G(),w=await Ze([{type:e?null:"text",name:"projectName",message:x("Project name:"),initial:se,onState:t=>{o=q(t.value)||se,s=Ee(o)}},{type:()=>!u.existsSync(s)||ue(s)?null:"toggle",name:"overwrite",message:()=>(s==="."?"Current directory":`Target directory "${s}"`)+" is not empty. Remove existing files and continue?",initial:!1,active:"Yes",inactive:"No"},{type:(t,{overwrite:n})=>{if(n===!1)throw console.log(be("\u2716")+" Operation cancelled"),new Error;return null},name:"overwriteChecker"},{type:()=>X(h())?null:"text",name:"packageName",message:x("Package name:"),initial:()=>ge(h()),validate:t=>X(t)||"Invalid package.json name"},{type:i&&je.includes(i)?null:"select",name:"framework",message:typeof i=="string"&&!je.includes(i)?x(`"${i}" isn't a valid template. Please choose from below: `):x("Select a framework:"),initial:0,choices:Re.map(t=>{let n=t.color;return{title:n(t.display||t.name),value:t}})},{type:t=>t&&t.variants?"select":null,name:"variant",message:x("Select a variant:"),choices:t=>t?.variants?.map(n=>{let r=n.color;return{title:r(n.display||n.name),value:n.name}})},{type:(t,n)=>{let{framework:r}=n;return r&&Array.isArray(r.options)&&r.options.length?"multiselect":null},name:"options",message:x("Select optional options:"),instructions:!1,choices:(t,n)=>{let{framework:r}=n;return r?.options?.map(a=>({title:a.name,value:a.id,selected:a.selected||!1}))}},{type:(t,n)=>d.length&&Array.isArray(n.options)&&n.options.includes("publish")?"select":null,name:"gitUserUrl",message:x("Which git repository to publish to?"),choices:d.map(t=>{let n=ne(t);return{title:n,value:n}})}],{onCancel:()=>{throw console.log(be("\u2716")+" Operation cancelled"),new Error}}),{framework:E,overwrite:I,packageName:V,variant:v,gitUserUrl:k}=w,m=w.options||[],c=l.join(oe,s);I?me(c):u.existsSync(c)||u.mkdirSync(c,{recursive:!0}),console.log(`
3
+ Scaffolding project in ${c}...`);let J=v||E?.name||i||"",W=t=>l.join(He(import.meta.url),"../..",`template-${t}`),Ae=W(J),M=J.includes("node");[W("config"),Ae].forEach(t=>{let n=u.readdirSync(t);for(let r of n){let a=r.startsWith("_")?r.replace("_","."):r;(M&&!m.includes("examples")||J==="vscode")&&r.includes("stylelint")||Q(l.join(t,r),l.join(c,a))}});let y=V||h(),z={name:Pe("user.name")||Be.userInfo().username,email:Pe("user.email")||""},L={"pkg.name":y,"user.name":z.name,"user.email":z.email,"git.org":Y(),"git.url":Oe(),"git.fullUrl":ce()};function Oe(){return`${k||`https://github.com/${Y()}`}/${y.substring(y.indexOf("/")+1)}`}function Y(){return k?k.substring(k.lastIndexOf("/")+1):y.startsWith("@")?y.split("/")[0].substring(1):Qe(z.name)}function ce(t=!1){let n=k||`https://github.com/${Y()}`;return t&&(n=n.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${n}/${y.substring(y.indexOf("/")+1)}.git`}Te(),M&&(Ue(),_e(),Ie(),Ve());let ae=de(process.env.npm_config_user_agent),B=ae?ae.name:"npm";_.which("git")&&(_.exec(`cd ${c} && git init`),m.includes("publish")&&_.exec(`cd ${c} && git remote add origin ${ce(m.includes("ssh"))}`));let H=l.relative(oe,c);switch(console.log(`
4
4
  Done. Now run:
5
- `),a!==te&&console.log(` cd ${L.includes(" ")?`"${L}"`:L}`),z){case"yarn":console.log(" yarn"),console.log(" yarn dev");break;default:console.log(` ${z} install`),console.log(` ${z} run dev`);break}function Ae(){Fe(".lintstagedrc.cjs","jest.config.cjs","tsconfig.json");let n=m.find(r=>["vite"].includes(r)),t=["#pnpm",`pnpm add ${g}${n?" -D":""}`,"","#yarn",`yarn add ${g}${n?" -D":""}`,"","#npm",`npm i ${g}${n?" --save-dev":""}`].join(`
6
- `);["LICENSE","README.md","README.zh_CN.md"].forEach(r=>{let o=s.join(a,r);if(!m.includes("publish")&&l.existsSync(o)){l.rmSync(o),r==="README.md"&&l.writeFileSync(o,`# ${g}
7
- `,{encoding:"utf-8"});return}if(!l.existsSync(o))return;let f=Object.assign({},M,{"pkg.install":t}),d=l.readFileSync(o,"utf-8");Object.keys(f).forEach(x=>{d=d.replace(new RegExp("{{"+x+"}}","g"),f[x])}),l.writeFileSync(o,d,"utf8")})}function v(n,...t){["dependencies","devDependencies"].forEach(r=>{Object.keys(n[r]||{}).forEach(o=>{t.find(f=>o.includes(f))&&delete n[r][o]})})}function b(...n){!Array.isArray(n)||n.length===0||n.forEach(t=>{let r=s.join(a,t);l.existsSync(r)&&$(r)})}function $e(){let n=s.join(a,"package.json"),t=S(n);t.name=g,m.includes("publish")||(delete t.author,delete t.publishConfig,delete t.repository,delete t.scripts.prepublishOnly,delete t.devDependencies.np),V&&(m.includes("electron")||(v(t,"electron"),t.scripts["lint:eslint"]=t.scripts["lint:eslint"].replace(",electron","")),m.includes("vite")||m.includes("tsup")&&v(t,"vite"),m.includes("tsup")?(t.scripts.dev="tsup --watch",t.scripts.build="tsup",b("vite.config.ts")):(t.scripts.dev="vite",t.scripts.build="vite build",v(t,"tsup"),b("tsup.config.ts"))),h(n,t);let r=ue(n);Object.keys(M).forEach(o=>{r=r.replace(new RegExp("{{"+o+"}}","g"),M[o])}),l.writeFileSync(n,r)}function Oe(n,t){let r=n.lastIndexOf("."),o=n.substring(0,r)+"."+t+n.substring(r),f=s.join(a,n),d=s.join(a,o);l.existsSync(d)&&(m.includes(t)?($(f),Ie(d,f)):$(d))}function Fe(...n){n.forEach(t=>{Be.forEach(r=>{Oe(t,r)})})}function Ce(){let n=s.join(a,"package.json"),t=S(n);if(m.includes("test")){m.includes("electron")?(t.scripts.test="jest",v(t,"vitest"),h(n,t),b("test/simple.test.ts")):(t.scripts.test="vitest",v(t,"jest"),h(n,t),b("test/electron.test.ts"),b("jest.config.cjs"));return}delete t.scripts.test,t.scripts["lint:eslint"]=t.scripts["lint:eslint"].replace(",test",""),v(t,"jest","vitest"),h(n,t),b("jest.config.cjs","test")}function De(){if(!m.includes("examples")){let r=S(s.join(a,"package.json"));r.scripts.lint=r.scripts.lint.replace(" lint:stylelint",""),r.scripts["lint:eslint"]=r.scripts["lint:eslint"].replace(",examples",""),delete r.scripts["lint:stylelint"],v(r,"stylelint"),h(s.join(a,"package.json"),r);return}let n=s.join(a,"examples");l.mkdirSync(n);let t=m.includes("electron");["vue","react"].forEach(r=>{let o=I(t?`electron-${r}`:r),f=s.join(n,r);if(!l.existsSync(o)){console.log(`${We(o)} template is not exist`);return}l.cpSync(o,f,{recursive:!0});let d=S(s.join(f,"package.json"));Object.keys(d.scripts).forEach(x=>{(x.startsWith("lint")||["prepare"].includes(x))&&delete d.scripts[x]}),v(d,"eslint","prettier","stylelint","commitlint","husky","lint-staged","tsconfig","lint-staged","npm-run-all"),h(s.join(f,"package.json"),d),["_lintstagedrc.cjs"].forEach(x=>{let oe=s.join(f,x);l.existsSync(oe)&&l.rmSync(oe,{recursive:!0})})}),l.writeFileSync(s.join(a,"pnpm-workspace.yaml"),`packages:
8
- - 'examples/*'`,{encoding:"utf-8"})}}Z().then(async()=>He().catch(e=>{e.message&&console.error(e)})).catch(e=>{e.message&&console.error(e)});
5
+ `),c!==oe&&console.log(` cd ${H.includes(" ")?`"${H}"`:H}`),B){case"yarn":console.log(" yarn"),console.log(" yarn dev");break;default:console.log(` ${B} install`),console.log(` ${B} run dev`);break}function S(){return A(l.join(c,"package.json"))}function b(t){O(l.join(c,"package.json"),t)}function Fe(){return Z(l.join(c,"package.json"))}function Ce(t){F(l.join(c,"package.json"),t)}function R(...t){!Array.isArray(t)||t.length===0||t.forEach(n=>{let r=l.join(c,n);u.existsSync(r)&&C(r)})}function De(t,n,r){let a=l.join(c,t),g=Z(a);g=g.replaceAll(n,r),F(a,g)}function Ne(t,n){let r=t.lastIndexOf("."),a=t.substring(0,r)+"."+n+t.substring(r),g=l.join(c,t),f=l.join(c,a);u.existsSync(f)&&(m.includes(n)?(C(g),Ye(f,g)):C(f))}function Ge(...t){t.forEach(n=>{et.forEach(r=>{Ne(n,r)})})}function Te(){let t=S();t.name=y,m.includes("publish")||(delete t.author,delete t.publishConfig,delete t.repository,delete t.scripts.prepublishOnly,delete t.devDependencies.np),y.endsWith("-cli")?(delete t.main,delete t.module,delete t.types,delete t.exports):delete t.bin,M&&(m.includes("vite")?(t.scripts.dev="vite",t.scripts.build="vite build",P(t,"tsup"),R("tsup.config.ts")):(t.scripts.dev="tsup --watch",t.scripts.build="tsup",R("vite.config.ts"),m.includes("vite-plugin")||(P(t,"vite"),De("tsup.config.ts","'vite'",""))),m.includes("vite-plugin")||tt(t,"vite")),b(t);let n=Fe();Object.keys(L).forEach(r=>{n=n.replace(new RegExp("{{"+r+"}}","g"),L[r])}),Ce(n)}function Ue(){Ge(".lintstagedrc.cjs","tsconfig.json");let t=m.find(r=>["vite-plugin"].includes(r))||["cli","plugin"].find(r=>y.includes(`-${r}`)),n=["pnpm","yarn","npm"].map(r=>`# ${r}
6
+ ${r} add ${y}${t?" -D":""}`).join(`
7
+
8
+ `);["LICENSE","README.md","README.zh_CN.md"].forEach(r=>{let a=l.join(c,r);if(!m.includes("publish")&&u.existsSync(a)){u.rmSync(a),r==="README.md"&&u.writeFileSync(a,`# ${y}
9
+ `,{encoding:"utf-8"});return}if(!u.existsSync(a))return;let g=Object.assign({},L,{"pkg.install":n}),f=u.readFileSync(a,"utf-8");Object.keys(g).forEach(j=>{f=f.replace(new RegExp("{{"+j+"}}","g"),g[j])}),u.writeFileSync(a,f,"utf8")})}function _e(){let t=S();if(m.includes("test")){m.includes("workspace")||R("vitest.workspace.ts");return}delete t.scripts.test,t.scripts["lint:eslint"]=t.scripts["lint:eslint"].replace(",test",""),P(t,"vitest"),b(t),R("test","vitest.workspace.ts")}function Ie(){if(!m.includes("examples")){let n=S();n.scripts.lint=n.scripts.lint.replace(" lint:stylelint",""),n.scripts["lint:eslint"]=n.scripts["lint:eslint"].replace(",examples",""),delete n.scripts["lint:stylelint"],P(n,"stylelint"),b(n);return}let t=l.join(c,"examples");u.mkdirSync(t),["vue","react"].forEach(n=>{let r=W(n),a=l.join(t,n);if(!u.existsSync(r)){console.log(`${qe(r)} template is not exist`);return}u.cpSync(r,a,{recursive:!0});let g=S();Object.keys(g.scripts).forEach(f=>{(f.startsWith("lint")||["prepare"].includes(f))&&delete g.scripts[f]}),P(g,"eslint","prettier","stylelint","commitlint","husky","lint-staged","tsconfig","lint-staged","npm-run-all"),b(g),["_lintstagedrc.cjs"].forEach(f=>{let j=l.join(a,f);u.existsSync(j)&&u.rmSync(j,{recursive:!0})})})}function Ve(){let t=[];m.includes("examples")&&t.push("examples");let n=S();m.includes("workspace")?(t.push("packages"),delete n.private,delete n.version,delete n.description,delete n.keywords,delete n.license,delete n.main,delete n.module,delete n.types,delete n.exports,delete n.files,delete n.publishConfig,delete n.repository):delete n.private,b(n),t.length&&F(l.join(c,"pnpm-workspace.yaml"),`packages:
10
+ ${t.map(r=>` - '${r}/*'`).join(`
11
+ `)}`)}}ie().then(async()=>nt().catch(e=>{e.message&&console.error(e)})).catch(e=>{e.message&&console.error(e)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomjs/create-app",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "create tomjs web app",
5
5
  "keywords": [
6
6
  "tomjs",
@@ -50,22 +50,22 @@
50
50
  "shelljs": "^0.8.5"
51
51
  },
52
52
  "devDependencies": {
53
- "@commitlint/cli": "^19.2.0",
53
+ "@commitlint/cli": "^19.2.1",
54
54
  "@tomjs/commitlint": "^3.0.0",
55
- "@tomjs/eslint": "^2.0.1",
55
+ "@tomjs/eslint": "^2.3.0",
56
56
  "@tomjs/prettier": "^1.3.0",
57
57
  "@tomjs/stylelint": "^2.3.0",
58
- "@tomjs/tsconfig": "^1.4.0",
58
+ "@tomjs/tsconfig": "^1.5.0",
59
59
  "@types/lodash-es": "^4.17.12",
60
60
  "@types/minimist": "^1.2.5",
61
- "@types/node": "^18.19.24",
61
+ "@types/node": "^18.19.26",
62
62
  "@types/prompts": "^2.4.9",
63
63
  "@types/shelljs": "^0.8.15",
64
64
  "cross-env": "^7.0.3",
65
65
  "eslint": "^8.57.0",
66
66
  "husky": "^9.0.11",
67
67
  "lint-staged": "^15.2.2",
68
- "np": "^10.0.1",
68
+ "np": "^9.2.0",
69
69
  "npm-run-all": "^4.1.5",
70
70
  "prettier": "^3.2.5",
71
71
  "stylelint": "^16.2.1",
@@ -20,24 +20,24 @@
20
20
  "prepare": "husky"
21
21
  },
22
22
  "dependencies": {
23
- "@tomjs/electron-devtools-installer": "^2.1.1",
23
+ "@tomjs/electron-devtools-installer": "^2.2.1",
24
24
  "react": "^18.2.0",
25
25
  "react-dom": "^18.2.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@commitlint/cli": "^19.2.0",
28
+ "@commitlint/cli": "^19.2.1",
29
29
  "@tomjs/commitlint": "^3.0.0",
30
- "@tomjs/eslint": "^2.0.1",
30
+ "@tomjs/eslint": "^2.3.0",
31
31
  "@tomjs/prettier": "^1.3.0",
32
32
  "@tomjs/stylelint": "^2.3.0",
33
- "@tomjs/tsconfig": "^1.4.0",
33
+ "@tomjs/tsconfig": "^1.5.0",
34
34
  "@tomjs/vite-plugin-electron": "^1.9.0",
35
- "@types/node": "^18.19.24",
36
- "@types/react": "^18.2.66",
35
+ "@types/node": "^18.19.26",
36
+ "@types/react": "^18.2.67",
37
37
  "@types/react-dom": "^18.2.22",
38
38
  "@vitejs/plugin-react-swc": "^3.6.0",
39
39
  "cross-env": "^7.0.3",
40
- "electron": "^28.2.7",
40
+ "electron": "^28.2.8",
41
41
  "electron-builder": "^24.13.3",
42
42
  "eslint": "^8.57.0",
43
43
  "husky": "^9.0.11",
@@ -48,7 +48,7 @@
48
48
  "stylelint": "^16.2.1",
49
49
  "tsx": "^4.7.1",
50
50
  "typescript": "~5.3.3",
51
- "vite": "^5.1.6",
51
+ "vite": "^5.2.2",
52
52
  "vite-plugin-electron-renderer": "^0.14.5"
53
53
  }
54
54
  }
@@ -20,21 +20,21 @@
20
20
  "prepare": "husky"
21
21
  },
22
22
  "dependencies": {
23
- "@tomjs/electron-devtools-installer": "^2.1.1",
23
+ "@tomjs/electron-devtools-installer": "^2.2.1",
24
24
  "vue": "^3.4.21"
25
25
  },
26
26
  "devDependencies": {
27
- "@commitlint/cli": "^19.2.0",
27
+ "@commitlint/cli": "^19.2.1",
28
28
  "@tomjs/commitlint": "^3.0.0",
29
- "@tomjs/eslint": "^2.0.1",
29
+ "@tomjs/eslint": "^2.3.0",
30
30
  "@tomjs/prettier": "^1.3.0",
31
31
  "@tomjs/stylelint": "^2.3.0",
32
- "@tomjs/tsconfig": "^1.4.0",
32
+ "@tomjs/tsconfig": "^1.5.0",
33
33
  "@tomjs/vite-plugin-electron": "^1.9.0",
34
- "@types/node": "^18.19.24",
34
+ "@types/node": "^18.19.26",
35
35
  "@vitejs/plugin-vue": "^5.0.4",
36
36
  "cross-env": "^7.0.3",
37
- "electron": "^28.2.7",
37
+ "electron": "^28.2.8",
38
38
  "electron-builder": "^24.13.3",
39
39
  "eslint": "^8.57.0",
40
40
  "husky": "^9.0.11",
@@ -45,8 +45,8 @@
45
45
  "stylelint": "^16.2.1",
46
46
  "tsx": "^4.7.1",
47
47
  "typescript": "~5.3.3",
48
- "vite": "^5.1.6",
48
+ "vite": "^5.2.2",
49
49
  "vite-plugin-electron-renderer": "^0.14.5",
50
- "vue-tsc": "^2.0.6"
50
+ "vue-tsc": "^2.0.7"
51
51
  }
52
52
  }
@@ -0,0 +1,19 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "name": "Debug Node",
9
+ "type": "node",
10
+ "request": "launch",
11
+ "skipFiles": [
12
+ "<node_internals>/**"
13
+ ],
14
+ "program": "${workspaceFolder}\\dist\\index.js",
15
+ "console": "integratedTerminal",
16
+ "preLaunchTask": "${defaultBuildTask}",
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
3
+ // for the documentation about the tasks.json format
4
+ "version": "2.0.0",
5
+ "tasks": [
6
+ {
7
+ "type": "npm",
8
+ "script": "dev",
9
+ "problemMatcher": {
10
+ "owner": "typescript",
11
+ "fileLocation": "relative",
12
+ "pattern": {
13
+ "regexp": "^([a-zA-Z]\\:\/?([\\w\\-]\/?)+\\.\\w+):(\\d+):(\\d+): (ERROR|WARNING)\\: (.*)$",
14
+ "file": 1,
15
+ "line": 3,
16
+ "column": 4,
17
+ "code": 5,
18
+ "message": 6
19
+ },
20
+ "background": {
21
+ "activeOnStart": true,
22
+ "beginsPattern": "^.*Build start.*$",
23
+ "endsPattern": "^.*Build success.*$"
24
+ }
25
+ },
26
+ "isBackground": true,
27
+ "presentation": {
28
+ "reveal": "never"
29
+ },
30
+ "group": {
31
+ "kind": "build",
32
+ "isDefault": true
33
+ }
34
+ }
35
+ ]
36
+ }
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023-PRESENT {{user.name}}<{{user.email}}>
3
+ Copyright (c) 2024-PRESENT {{user.name}}<{{user.email}}>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "name": "{{pkg.name}}",
3
+ "private": true,
3
4
  "version": "0.0.0",
4
5
  "description": "basic node.js template",
5
6
  "keywords": [
@@ -10,6 +11,9 @@
10
11
  "email": "{{user.email}}"
11
12
  },
12
13
  "license": "MIT",
14
+ "bin": {
15
+ "xxx": "./dist/index.js"
16
+ },
13
17
  "main": "./dist/index.js",
14
18
  "module": "./dist/index.mjs",
15
19
  "types": "./dist/index.d.ts",
@@ -46,38 +50,30 @@
46
50
  "prepare": "husky",
47
51
  "prepublishOnly": "npm run build && np --any-branch --yolo --no-publish --message \"chore: release v%s\""
48
52
  },
49
- "dependencies": {
50
- "kolorist": "^1.8.0"
51
- },
53
+ "dependencies": {},
52
54
  "devDependencies": {
53
- "@commitlint/cli": "^19.2.0",
54
- "@jest/globals": "^29.7.0",
55
- "@kayahr/jest-electron-runner": "^29.11.0",
55
+ "@commitlint/cli": "^19.2.1",
56
56
  "@tomjs/commitlint": "^3.0.0",
57
- "@tomjs/eslint": "^2.0.1",
57
+ "@tomjs/eslint": "^2.3.0",
58
58
  "@tomjs/prettier": "^1.3.0",
59
59
  "@tomjs/stylelint": "^2.3.0",
60
- "@tomjs/tsconfig": "^1.4.0",
61
- "@types/jest": "^29.5.12",
62
- "@types/node": "^18.19.24",
60
+ "@tomjs/tsconfig": "^1.5.0",
61
+ "@types/node": "^18.19.26",
63
62
  "cross-env": "^7.0.3",
64
- "electron": "^28.2.7",
65
63
  "eslint": "^8.57.0",
66
64
  "husky": "^9.0.11",
67
- "jest": "^29.7.0",
68
65
  "lint-staged": "^15.2.2",
69
66
  "np": "^10.0.1",
70
67
  "npm-run-all": "^4.1.5",
71
68
  "prettier": "^3.2.5",
72
69
  "rimraf": "^5.0.5",
73
70
  "stylelint": "^16.2.1",
74
- "ts-jest": "^29.1.2",
75
71
  "tsup": "^8.0.2",
76
72
  "tsx": "^4.7.1",
77
73
  "typescript": "~5.3.3",
78
- "vite": "^5.1.6",
74
+ "vite": "^5.2.2",
79
75
  "vite-plugin-dts": "^3.7.3",
80
- "vitest": "^1.3.1"
76
+ "vitest": "^1.4.0"
81
77
  },
82
78
  "peerDependencies": {
83
79
  "vite": ">=2.0.0"
@@ -1,8 +1,6 @@
1
1
  import os from 'node:os';
2
- import { blue } from 'kolorist';
3
2
 
4
3
  function run() {
5
- console.log(blue('Hello World!'));
6
4
  console.log(
7
5
  `system: ${os.platform()} ${os.arch()} v${os.release()} ${os.cpus().length} cores ${Math.ceil(
8
6
  os.totalmem() / 1024 / 1024 / 1024,
@@ -0,0 +1,3 @@
1
+ import { defineWorkspace } from 'vitest/config';
2
+
3
+ export default defineWorkspace(['packages/*']);
@@ -21,14 +21,14 @@
21
21
  "react-dom": "^18.2.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@commitlint/cli": "^19.2.0",
24
+ "@commitlint/cli": "^19.2.1",
25
25
  "@tomjs/commitlint": "^3.0.0",
26
- "@tomjs/eslint": "^2.0.1",
26
+ "@tomjs/eslint": "^2.3.0",
27
27
  "@tomjs/prettier": "^1.3.0",
28
28
  "@tomjs/stylelint": "^2.3.0",
29
- "@tomjs/tsconfig": "^1.4.0",
30
- "@types/node": "^18.19.24",
31
- "@types/react": "^18.2.66",
29
+ "@tomjs/tsconfig": "^1.5.0",
30
+ "@types/node": "^18.19.26",
31
+ "@types/react": "^18.2.67",
32
32
  "@types/react-dom": "^18.2.22",
33
33
  "@vitejs/plugin-react-swc": "^3.6.0",
34
34
  "cross-env": "^7.0.3",
@@ -39,6 +39,6 @@
39
39
  "prettier": "^3.2.5",
40
40
  "stylelint": "^16.2.1",
41
41
  "typescript": "~5.3.3",
42
- "vite": "^5.1.6"
42
+ "vite": "^5.2.2"
43
43
  }
44
44
  }
@@ -47,12 +47,12 @@
47
47
  "prepare": "husky"
48
48
  },
49
49
  "devDependencies": {
50
- "@commitlint/cli": "^19.2.0",
50
+ "@commitlint/cli": "^19.2.1",
51
51
  "@tomjs/commitlint": "^3.0.0",
52
- "@tomjs/eslint": "^2.0.1",
52
+ "@tomjs/eslint": "^2.3.0",
53
53
  "@tomjs/prettier": "^1.3.0",
54
- "@tomjs/tsconfig": "^1.4.0",
55
- "@types/node": "^18.19.24",
54
+ "@tomjs/tsconfig": "^1.5.0",
55
+ "@types/node": "^18.19.26",
56
56
  "@types/vscode": "^1.75.0",
57
57
  "eslint": "^8.57.0",
58
58
  "husky": "^9.0.11",
@@ -54,15 +54,15 @@
54
54
  "react-dom": "^18.2.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@commitlint/cli": "^19.2.0",
57
+ "@commitlint/cli": "^19.2.1",
58
58
  "@tomjs/commitlint": "^3.0.0",
59
- "@tomjs/eslint": "^2.0.1",
59
+ "@tomjs/eslint": "^2.3.0",
60
60
  "@tomjs/prettier": "^1.3.0",
61
61
  "@tomjs/stylelint": "^2.3.0",
62
- "@tomjs/tsconfig": "^1.4.0",
62
+ "@tomjs/tsconfig": "^1.5.0",
63
63
  "@tomjs/vite-plugin-vscode": "^2.2.0",
64
- "@types/node": "^18.19.24",
65
- "@types/react": "^18.2.66",
64
+ "@types/node": "^18.19.26",
65
+ "@types/react": "^18.2.67",
66
66
  "@types/react-dom": "^18.2.22",
67
67
  "@types/vscode": "^1.75.0",
68
68
  "@types/vscode-webview": "^1.57.5",
@@ -77,6 +77,6 @@
77
77
  "stylelint": "^16.2.1",
78
78
  "tsx": "^4.7.1",
79
79
  "typescript": "~5.3.3",
80
- "vite": "^5.1.6"
80
+ "vite": "^5.2.2"
81
81
  }
82
82
  }
@@ -53,14 +53,14 @@
53
53
  "vue": "^3.4.21"
54
54
  },
55
55
  "devDependencies": {
56
- "@commitlint/cli": "^19.2.0",
56
+ "@commitlint/cli": "^19.2.1",
57
57
  "@tomjs/commitlint": "^3.0.0",
58
- "@tomjs/eslint": "^2.0.1",
58
+ "@tomjs/eslint": "^2.3.0",
59
59
  "@tomjs/prettier": "^1.3.0",
60
60
  "@tomjs/stylelint": "^2.3.0",
61
- "@tomjs/tsconfig": "^1.4.0",
61
+ "@tomjs/tsconfig": "^1.5.0",
62
62
  "@tomjs/vite-plugin-vscode": "^2.2.0",
63
- "@types/node": "^18.19.24",
63
+ "@types/node": "^18.19.26",
64
64
  "@types/vscode": "^1.75.0",
65
65
  "@types/vscode-webview": "^1.57.5",
66
66
  "@vitejs/plugin-vue": "^5.0.4",
@@ -74,7 +74,7 @@
74
74
  "stylelint": "^16.2.1",
75
75
  "tsx": "^4.7.1",
76
76
  "typescript": "~5.3.3",
77
- "vite": "^5.1.6",
78
- "vue-tsc": "^2.0.6"
77
+ "vite": "^5.2.2",
78
+ "vue-tsc": "^2.0.7"
79
79
  }
80
80
  }
@@ -20,13 +20,13 @@
20
20
  "vue": "^3.4.21"
21
21
  },
22
22
  "devDependencies": {
23
- "@commitlint/cli": "^19.2.0",
23
+ "@commitlint/cli": "^19.2.1",
24
24
  "@tomjs/commitlint": "^3.0.0",
25
- "@tomjs/eslint": "^2.0.1",
25
+ "@tomjs/eslint": "^2.3.0",
26
26
  "@tomjs/prettier": "^1.3.0",
27
27
  "@tomjs/stylelint": "^2.3.0",
28
- "@tomjs/tsconfig": "^1.4.0",
29
- "@types/node": "^18.19.24",
28
+ "@tomjs/tsconfig": "^1.5.0",
29
+ "@types/node": "^18.19.26",
30
30
  "@vitejs/plugin-vue": "^5.0.4",
31
31
  "cross-env": "^7.0.3",
32
32
  "eslint": "^8.57.0",
@@ -36,7 +36,7 @@
36
36
  "prettier": "^3.2.5",
37
37
  "stylelint": "^16.2.1",
38
38
  "typescript": "~5.3.3",
39
- "vite": "^5.1.6",
40
- "vue-tsc": "^2.0.6"
39
+ "vite": "^5.2.2",
40
+ "vue-tsc": "^2.0.7"
41
41
  }
42
42
  }
@@ -1,7 +0,0 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- testEnvironment: 'node',
5
- testTimeout: 10000,
6
- testMatch: ['<rootDir>/src/**/*.test.ts', '<rootDir>/test/**/*.test.ts'],
7
- };
@@ -1,8 +0,0 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- runner: '@kayahr/jest-electron-runner/main',
5
- testEnvironment: 'node',
6
- testTimeout: 10000,
7
- testMatch: ['<rootDir>/test/**/*.test.ts'],
8
- };
@@ -1,7 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- describe('some test', () => {
4
- it('1 + 1 = 2', () => {
5
- expect(1 + 1).toBe(2);
6
- });
7
- });