@tomjs/create-app 1.0.0-alpha.0 → 1.0.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.
Files changed (2) hide show
  1. package/dist/index.js +8 -7
  2. package/package.json +10 -10
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import Ue from"meow";import w from"fs";import we from"os";import f from"path";import{fileURLToPath as he}from"url";import{copySync as xe,mkdirSync as G,readFileSync as ke,readJsonSync as oe,rmSync as M,writeFileSync as L,writeJsonSync as ve}from"@tomjs/node";import b from"chalk";import{camelCase as be,merge as Oe}from"lodash-es";import le from"@tomjs/logger";import{$ as ue}from"execa";import $ from"inquirer";var y=new le({directory:"create-app/logs"});function E(e,t,r){let s={message:e};return Array.isArray(t)||typeof t!="object"?s.default=t:Object.assign(s,t),Object.assign(s,r)}async function v(e,t){let r=`confirm-${Date.now()}`,s=E(e,t);return(await $.prompt([{type:"confirm",name:r,...s}]))[r]}async function I(e,t){let r=`input-${Date.now()}`,{required:s,...o}=E(e,t),i=s??!0,n=o.validate;return(i||n)&&(o.validate=c=>{let d=(c||"").trim();return i&&!d?"It's required!":n?n(c):!0}),(await $.prompt([{type:"input",name:r,...o}]))[r]}async function J(e,t,r){let s=`checkbox-${Date.now()}`,{required:o,min:i,max:n,...p}=E(e,r),c=o??!0,d=p.validate;return(c||i||n)&&(p.validate=a=>c&&a.length===0?"Please select at least one option":i&&a.length<i?`Please select at least ${i} options`:n&&a.length>n?`Please select at most ${n} options`:d?d(a):!0),(await $.prompt([{type:"checkbox",name:s,choices:t,pageSize:Math.min(t.length,10),...p}]))[s]}async function h(e,t,r){let s=`list-${Date.now()}`,o=E(e,r);return(await $.prompt([{type:"list",name:s,choices:t,pageSize:Math.min(t.length,10),...o}]))[s]}var T={cwd:"."};async function P(e,t){let{trim:r,...s}=Object.assign({stdio:"pipe",shell:!0,cwd:T.cwd},t);s.cwd??=T.cwd,Array.isArray(e)&&(e=e.join(" "));let o=i=>{T.verbose?y.debug(i):y.write(i)};o(`$ ${e}`);try{let n=(await ue(s)`${e}`).stdout;return o(n),r?n.trim().replace(/\n|\r/g,""):n.trim()}catch(i){let n=i.stderr||i.message;throw o(n),new Error(n)}}function R(){let e=process.env.npm_config_user_agent;return e?e.split(" ")[0].split("/")[0]:void 0}import Y from"os";import H from"path";import{mkdirSync as me,readJsonSync as ge,writeJsonSync as fe}from"@tomjs/node";import B from"chalk";import de from"inquirer";var K={repo:"https://github.com",owner:Y.userInfo().username};function D(e){let{repo:t,owner:r}=e;return`${t}${t.endsWith("/")?"":"/"}${r}`}async function W(e){let t=await de.prompt([{type:"text",name:"repo",message:`${e?.repo?"Edit":"Add"} git repository url:`,default:e?.repo||K.repo},{type:"text",name:"owner",message:`${e?.owner?"Edit":"Add "} git repository owner:`,default:e?.owner||K.owner}]);return{id:e?.id||Date.now().toString(),repo:t.repo,owner:t.owner}}var X=H.join(Y.homedir(),".tomjs","create-app"),Z=H.join(X,"config.json");function ee(){return me(X),Object.assign({gitRepos:[]},ge(Z))}function ye(e){let t=ee();t.createTime?t.updateTime=Date.now():t.createTime=Date.now(),fe(Z,Object.assign(t,e))}function N(e){ye({gitRepos:e})}async function A(e){let t=e.map(n=>({name:D(n),value:n.id})).concat([{name:"Add",value:"add"},{name:B.red("Exit"),value:"exit"}]),r=await h(e.length===0?"You choose to add or exit:":"You can choose the repository to be operated, or choose to add or exit:",t);if(r==="exit")return;if(r==="add"){let n=await W();return e.push(n),N(e),A(e)}let s=e.findIndex(n=>n.id===r),o=await h("Select an action?",[{name:"Edit",value:"edit"},{name:"Remove",value:"remove"},{name:"Exit",value:"exit"}]);if(o==="exit")return F();if(o==="remove")return await v("Where confirm to remove?",!0)&&(e.splice(s,1),N(e)),A(e);let i=await W(e[s]);return e[s]=i,N(e),A(e)}async function F(){let e=ee(),{gitRepos:t}=e;return t.length===0&&(console.log(`You need to set the ${B.blue("git remote repository")} for the first time.`),await A(t)),e}var x={},je=f.join(he(import.meta.url),"../../"),se=f.join(je,"templates"),$e=oe(f.join(se,"config.json"))||{},S=$e.list||[],Q=S.map(e=>e.variants?e.variants.map(t=>({parent:e,...t})):[e]).flat(),Ee=S.map(e=>e.variants&&e.variants.map(t=>t.name)||[e.name]).reduce((e,t)=>e.concat(t),[]);async function te(e){return P(`git config --get ${e}`,{trim:!0})}var ne=e=>/^(@[a-z0-9]+(-[a-z0-9]+)*\/[a-z0-9._-]+|[a-z0-9._-]+)$/.test(e),Pe=e=>/^[a-z0-9._-]+$/.test(e),Ae=e=>e.includes("/")?e.substring(e.indexOf("/")+1):e;function O(e){return oe(f.join(e,"package.json"))}function V(e,t){ve(f.join(e,"package.json"),t)}function re(e,t,r){let s={},o=Object.keys(e).sort(),i=t||[];i.length>0&&(i=i.filter(p=>o.includes(p)));let n=r||[];return n.length>0&&(n=n.filter(p=>o.includes(p))),i.concat(o.filter(p=>!i.includes(p)&&!n.includes(p))).concat(n).forEach(p=>{s[p]=e[p]}),s}async function ae(e){Object.assign(x,e),x.type==="project"?await Se():await ie(x.type)}async function Se(){let e="project",t=await ce(e,x.cwd),{projectDir:r,variant:s,textVars:o}=t;G(r),_(e,r,s),await q(r,o);let{workspaces:i}=s,n=f.join(r,"packages");i&&await v("Do you want to create an package?")&&await ie("package",n);let{examples:p}=s,c=Array.isArray(p)&&p.length>0;if(c){let g=Q.filter(a=>p.includes(a.name));for(let a of g){let u=f.join(r,"examples",a.name);_("example",u,s),await q(u,o)}}let d=w.existsSync(n)&&w.readdirSync(f.join(r,"packages")).length>0;if(d||c){let g=O(r),a=R()||"npm",u=[];if(d&&u.push("packages"),c&&u.push("examples"),a==="pnpm"){let l=f.join(r,"pnpm-workspace.yaml");w.existsSync(l)||L(l,`packages:
2
- ${u.map(k=>` - "${k}"
3
- `)}`)}else g.workspaces??=u.map(l=>`"${l}/*"`),V(r,g);"vitest"in(g.devDependencies??{})&&L(f.join(r,"vitest.config.ts"),`export default [${u.map(l=>`"${l}/*"`).join(", ")}];`)}await Ce(t)}async function ie(e,t){let r=!0,s=0;for(;r;){s++;let o=await ce(e,t||x.cwd,s===1?x.template:void 0),{pkgName:i,projectDir:n,variant:p,textVars:c}=o;G(n),_(e,n,p),await q(n,c),y.success(`${b.green(i)} created successfully!`),r=await v("Do you want to create another example?")}}function _(e,t,r){let s=f.join(t,".temp");G(s);let o=r.templates||[];(e!=="project"?o:["config",...o]).forEach((n,p)=>{let c=f.join(se,n);if(!w.existsSync(c))return;xe(c,t);let d=O(s)||{},g=Oe(d,O(t));if(p===o.length){let a=O(t);Object.keys(a).forEach(m=>{g[m]&&(a[m]=g[m])}),Object.keys(g).forEach(m=>{a[m]||(a[m]=g[m])}),["scripts","dependencies","devDependencies","peerDependencies"].forEach(m=>{a[m]&&(m==="scripts"?a[m]=re(a[m],["dev","debug","build","preview","test"],["prepare"]):a[m]=re(a[m]))}),e==="example"&&(delete a.types,delete a.exports,delete a.publishConfig,delete a.repository,delete a.module,delete a.license,a.private=!0),V(t,a),M(s)}else V(s,g)})}async function q(e,t){w.readdirSync(e).filter(o=>o.startsWith("_")).forEach(o=>{w.renameSync(f.join(e,o),f.join(e,o.replace("_",".")))});let r=O(e),s=["LICENSE","README.md","README.zh_CN.md"];r.publishConfig||s.forEach(o=>{M(f.join(e,o))}),["package.json",...s].forEach(o=>{let i=f.join(e,o);if(!w.existsSync(i))return;let n=ke(i);Object.keys(t).forEach(p=>{n=n.replace(new RegExp("{{"+p+"}}","g"),t[p])}),L(i,n)})}async function ce(e,t,r){let{gitRepos:s}=await F(),o=(x.name||"").trim(),i=ne(o);(!o||!i)&&(o=await I("Package name:",{validate:a=>ne(a)?!0:"Please input a valid name!"}));let n=Ae(o);n!==o&&(n=await I("Project name:",{default:n,validate:a=>Pe(a)?!0:"Please input a valid name!"})),y.debug("projectName:",n);let p=f.join(t,n);w.existsSync(p)&&await v("Project already exists, overwrite?")&&M(p),y.debug("projectDir:",p);let c;if(r&&Ee.includes(r)&&(c=Q.find(a=>a.name===r)),!c){let a=await h(!c&&r?`${b.red(r)} is invalid, please select a framework again:`:"Select a framework:",S.filter(l=>!l.variants||!l.variants.length?!1:e==="package"?l.variants.filter(k=>!k.packages?.ignore).length>0:!0).map(l=>({name:l.display,value:l.name})));y.debug("framework:",a);let u=S.find(l=>l.name===a)?.variants||[],m=await h("Select a variant:",e==="package"?u.filter(l=>!l.packages?.ignore).map(l=>{let k=l.parent;return k?{name:`${k.display} > ${l.display}`,value:l.name}:{name:l.display,value:l.name}}):u.map(l=>({name:l.display,value:l.name})));y.debug("variant:",m),c=u.find(l=>l.name===m)}if(!c)throw new Error("variant not found");c.templates||(c.templates=[]),c.templates=[...c.templates,c.name],y.debug("variant:",c),e==="project"&&Array.isArray(c.examples)&&(c.examples=await J("Select examples:",c.examples.map(a=>{let u=Q.find(m=>m.name===a);if(!u)throw new Error(`Can't find example ${b.yellow(a)} from ${b.blue(c.name)}`);return{name:u.display,value:u.name,checked:!0}}),{required:!1}));let d="";e!=="example"&&(d=await h("Which git repository to publish to?",s.map(a=>{let u=D(a);return{name:u,value:u}}).concat([{name:b.yellow("None"),value:""}])));let g={pkgName:o,projectDir:p,variant:c,gitUserUrl:d};return g.textVars=await Te(g),g}async function Te(e){let{pkgName:t,gitUserUrl:r,variant:s}=e,o=await te("user.name"),i=await te("user.email"),n={name:o||we.userInfo().username,email:i||""},p=["pnpm","yarn","npm"].map(u=>`# ${u}
4
- ${u} add ${t}${s.devDependencies?" -D":""}`).join(`
1
+ import Ge from"meow";import w from"node:fs";import Oe from"node:os";import g from"node:path";import{fileURLToPath as Pe}from"node:url";import{copySync as Ae,mkdirSync as $e,readFileSync as ie,readJsonSync as ae,rmSync as N,writeFileSync as T,writeJsonSync as Ee}from"@tomjs/node";import x from"chalk";import{camelCase as De,cloneDeep as ce,merge as Se}from"lodash-es";import B from"node:os";import X from"node:path";import{mkdirSync as xe,readJsonSync as ve,writeJsonSync as be}from"@tomjs/node";import j from"chalk";import ke from"inquirer";import we from"@tomjs/logger";import{$ as he}from"execa";import E from"inquirer";var y=new we({directory:"create-app/logs"});function D(e,t,r){let n={message:e};return Array.isArray(t)||typeof t!="object"?n.default=t:Object.assign(n,t),Object.assign(n,r)}async function h(e,t){let r=`confirm-${Date.now()}`,n=D(e,t);return(await E.prompt([{type:"confirm",name:r,...n}]))[r]}async function _(e,t){let r=`input-${Date.now()}`,{required:n,...o}=D(e,t),i=n??!0,c=o.validate;return(i||c)&&(o.validate=s=>{let l=(s||"").trim();return i&&!l?"It's required!":c?c(s):!0}),(await E.prompt([{type:"input",name:r,...o}]))[r]}async function K(e,t,r){let n=`checkbox-${Date.now()}`,{required:o,min:i,max:c,...p}=D(e,r),s=o??!0,l=p.validate;return(s||i||c)&&(p.validate=a=>s&&a.length===0?"Please select at least one option":i&&a.length<i?`Please select at least ${i} options`:c&&a.length>c?`Please select at most ${c} options`:l?l(a):!0),(await E.prompt([{type:"checkbox",name:n,choices:t,pageSize:Math.min(t.length,10),...p}]))[n]}async function b(e,t,r){let n=`list-${Date.now()}`,o=D(e,r);return(await E.prompt([{type:"list",name:n,choices:t,pageSize:Math.min(t.length,10),...o}]))[n]}var U={cwd:"."};async function S(e,t){let{trim:r,...n}=Object.assign({stdio:"pipe",shell:!0,cwd:U.cwd},t);n.cwd??=U.cwd,Array.isArray(e)&&(e=e.join(" "));let o=i=>{U.verbose?y.debug(i):y.write(i)};o(`$ ${e}`);try{let c=(await he(n)`${e}`).stdout;return o(c),r?c.trim().replace(/\n|\r/g,""):c.trim()}catch(i){let c=i.stderr||i.message;throw o(c),new Error(c)}}function Q(e){if(e&&e.packageManager)return e.packageManager.split("@")[0];let t=process.env.npm_config_user_agent;return t?t.split(" ")[0].split("/")[0]:void 0}var Y={repo:"https://github.com",owner:B.userInfo().username};function q(e){let{repo:t,owner:r}=e;return`${t}${t.endsWith("/")?"":"/"}${r}`}async function H(e){let t=await ke.prompt([{type:"text",name:"repo",message:`${e?.repo?"Edit":"Add"} git repository url:`,default:e?.repo||Y.repo},{type:"text",name:"owner",message:`${e?.owner?"Edit":"Add"} git repository owner:`,default:e?.owner||Y.owner}]);return{id:e?.id||Date.now().toString(),repo:t.repo,owner:t.owner}}var Z=X.join(B.homedir(),".tomjs","create-app"),ee=X.join(Z,"config.json");function C(){return xe(Z),Object.assign({gitRepos:[]},ve(ee))}function je(e){let t=C();t.createTime?t.updateTime=Date.now():t.createTime=Date.now(),be(ee,Object.assign(t,e))}function G(e){je({gitRepos:e})}async function k(e,t=!1){e||(e=C().gitRepos||[]);let r=e.map(p=>({name:q(p),value:p.id})).concat([{name:j.green("+ Add"),value:"add"},{name:j.yellow("\u2190 Exit"),value:"exit"}]),n=await b(e.length===0?"You choose to add or exit:":"You can choose the repository to be operated, or choose to add or exit:",r);if(n==="exit")return;if(n==="add"){let p=await H();return e.push(p),G(e),k(e,t)}let o=e.findIndex(p=>p.id===n),i=await b("Select an action?",[{name:j.green("^ Edit"),value:"edit"},{name:j.red("- Remove"),value:"remove"},{name:j.yellow("\u2190 Exit"),value:"exit"}]);if(i==="exit")return t?k(e,t):C();if(i==="remove")return await h("Where confirm to remove?",!0)&&(e.splice(o,1),G(e)),k(e,t);let c=await H(e[o]);return e[o]=c,G(e),k(e,t)}async function te(){let e=C(),{gitRepos:t}=e;return t.length===0&&(console.log(`You need to set the ${j.blue("git remote repository")} for the first time.`),await k(t)),e}var v={},Ce=g.join(Pe(import.meta.url),"../../"),pe=g.join(Ce,"templates"),Te=ae(g.join(pe,"config.json"))||{},O=Te.list||[],I=O.map(e=>e.variants?e.variants.map(t=>({parent:e,...t})):[]).flat(),Ie=O.map(e=>e.variants&&e.variants.map(t=>t.name)||[e.name]).reduce((e,t)=>e.concat(t),[]),Re=["name","version","displayName","description","private","type","engines","packageManager","keywords","categories","author","publisher","contributors","homepage","bugs","license","files","bin","main","module","types","exports","publishConfig","repository","activationEvents","contributes","badges","icon","vsce","scripts","dependencies","devDependencies","peerDependencies","optionalDependencies"],Ne=["dev","dev:*","debug","start","build","build:*","release","clean","preview","test","lint","lint:eslint","lint:stylelint","lint:prettier"];async function ne(e){return S(`git config --get ${e}`,{trim:!0})}var se=e=>/^(?:(@[a-z0-9.+-]+(-[a-z0-9.+-]+)*\/)?([a-z0-9][a-z0-9._-]*[a-z0-9]))$/.test(e),Fe=e=>/^[a-z0-9._-]+$/.test(e),Ue=e=>e.includes("/")?e.substring(e.indexOf("/")+1):e;function R(e){return ae(g.join(e,"package.json"))||{}}function M(e,t){Ee(g.join(e,"package.json"),t)}function re(e,t,r){let n={},o=Object.keys(e).sort(),i=p(t),c=p(r);return i.concat(o.filter(s=>!i.includes(s)&&!c.includes(s))).concat(c).forEach(s=>{n[s]=e[s]}),n;function p(s){let l=Array.isArray(s)?s:[];return l.length>0&&(l=l.reduce((m,a)=>{if(a.endsWith(":*")){let u=a.replace(":*",":");console.log("sk:",u);let d=o.filter(A=>!m.includes(A)&&A.startsWith(u));return m.concat(d)}return o.includes(a)?m.concat(a):m},[])),l}}async function le(e){if(Object.assign(v,e),v.git){await k(void 0,!0);return}v.type==="project"?await Ve():await ue(v.type)}async function Ve(){let e="project",t=await me(e,v.cwd),{projectDir:r}=t.userOptions;W(e,t),await J(t);let{workspaces:n}=t,o=g.join(r,"packages");n&&await h("Do you want to create an package?")&&await ue("package",o);let{examples:i}=t,c=Array.isArray(i)&&i.length>0;if(c){let s=I.filter(m=>i.includes(m.name)),l=g.join(r,"examples");for(let m of s){let a=ce(m);a.templates=fe(a.templates).concat(a.name);let u=g.join(l,a.name);a.userOptions={projectDir:u,pkgName:a.name,gitUserUrl:"",textVars:{}},await ge(a),W("example",a),await J(a)}}let p=w.existsSync(o)&&w.readdirSync(g.join(r,"packages")).length>0;if(p||c){let s=R(r),l=Q(s)||"npm",m=[];if(p&&m.push("packages"),c&&m.push("examples"),l==="pnpm"){let u=g.join(r,"pnpm-workspace.yaml");w.existsSync(u)||T(u,`packages:
2
+ ${m.map(d=>` - '${d}/*'
3
+ `)}`)}else s.workspaces??=m.map(u=>`"${u}/*"`),M(r,s);let a=s.devDependencies??{};p&&"vitest"in a&&T(g.join(r,"vitest.config.ts"),'export default ["packages/*"];')}await Qe(t)}async function ue(e,t){let r=!0,n=0;for(;r;){n++;let o=await me(e,t||v.cwd,n===1?v.template:void 0),{pkgName:i}=o.userOptions;W(e,o),await J(o),y.success(`${x.green(i)} created successfully!`),r=await h(`Do you want to create another ${e}?`)}}function oe(e,...t){!Array.isArray(t)||t.length===0||t.forEach(r=>{let n=g.join(e,r);w.existsSync(n)&&N(n)})}function Le(e,t,r){if(!w.existsSync(e))return;let n=ie(e);n=n.replaceAll(t,r),T(e,n)}function _e(e,t,r){let n=r.userOptions,{textVars:o}=n;if(["scripts","dependencies","devDependencies","peerDependencies"].forEach(i=>{e[i]&&(i==="scripts"?e[i]=re(e[i],Ne,["prepare"]):e[i]=re(e[i]))}),t==="example"?(delete e.types,delete e.exports,delete e.publishConfig,delete e.repository,delete e.module,delete e.license,e.private=!0):t==="package"&&e.repository&&typeof e.repository=="object"&&(e.repository.directory=`packages/${o.pkgShortName}`),!r.test){let i=e.scripts;if(i){delete i.test;{let c=i["lint:eslint"]||"";c&&(i["lint:eslint"]=c.replace(",test",""))}}delete e.devDependencies?.vitest}e.type==="commonjs"&&delete e.type,e.private===!1&&delete e.private}function W(e,t,r){let n=r??t.userOptions.projectDir,o=g.join(n,".temp");$e(o);let i=t.templates||[];if((e!=="project"?i:["base/core",...i]).forEach((p,s)=>{let l=g.join(pe,p);if(!w.existsSync(l))return;Ae(l,n);let m=R(o)||{},a=Se(m,R(n));if(s===i.length){let u={};Re.forEach(d=>{d in a&&(u[d]=a[d],delete a[d])}),a=Object.assign(u,a),_e(a,e,t),M(n,a)}else M(o,a)}),N(o),oe(n,"tests"),Le(g.join(n,"tsconfig.json"),', "test"',""),e==="package"){let p=[".vscode"].concat(t.packages?.exclude??[]);oe(n,...p)}}async function J(e,t){let r=e.userOptions,{textVars:n}=r,o=t??r.projectDir;w.readdirSync(o).filter(p=>p.startsWith("_")).forEach(p=>{w.renameSync(g.join(o,p),g.join(o,p.replace("_",".")))});let i=R(o),c=["LICENSE","README.md","README.zh_CN.md"];i.publishConfig||c.forEach(p=>{N(g.join(o,p))}),["package.json",...c].forEach(p=>{let s=g.join(o,p);if(!w.existsSync(s))return;let l=ie(s);Object.keys(n).forEach(m=>{l=l.replace(new RegExp("{{"+m+"}}","g"),n[m])}),T(s,l)})}async function me(e,t,r){let{gitRepos:n}=await te(),o=(v.name||"").trim(),i=se(o);(!o||!i)&&(o=await _("Package name:",{validate:a=>se(a)?!0:"Please input a valid name!"}));let c=Ue(o);c!==o&&(c=await _("Project name:",{default:c,validate:a=>Fe(a)?!0:"Please input a valid name!"})),y.debug("projectName:",c);let p=g.join(t,c);w.existsSync(p)&&await h("Project already exists, overwrite?")&&N(p),y.debug("projectDir:",p);let s;r&&Ie.includes(r)&&(s=I.find(a=>a.name===r));let l=async a=>{let u=await b(!s&&a?`${x.red(a)} is invalid, please select a framework again:`:"Select a framework:",O.filter(f=>!f.variants||!f.variants.length?!1:e==="package"?f.variants.filter($=>!$.packages?.ignore).length>0:!0).map(f=>({name:f.display,value:f.name})));y.debug("framework:",u);let d=O.find(f=>f.name===u)?.variants||[],A=e==="package"?d.filter(f=>!f.packages?.ignore).map(f=>{let $=f.parent;return $?{name:`${$.display} > ${f.display}`,value:f.name}:{name:f.display,value:f.name}}):d.map(f=>({name:f.display,value:f.name})),ye=O.find(f=>f.name===u)?.display,F=await b(`Select a ${x.blue(ye)} variant:`,A.concat([{name:x.yellow("\u2190 Back"),value:"_"}]));y.debug("variant:",F),F==="_"?await l(a):s=d.find(f=>f.name===F)};if(s||await l(r),!s)throw new Error("variant not found");s=ce(s),s.templates||(s.templates=[]),s.templates=fe(s.templates).concat(s.name),y.debug("variant:",s),e==="project"&&Array.isArray(s.examples)&&(s.examples=await K("Select examples:",s.examples.map(a=>{let u=I.find(d=>d.name===a);if(!u)throw new Error(`Can't find example ${x.yellow(a)} from ${x.blue(s.name)}`);return{name:u.display,value:u.name,checked:!0}}),{required:!1}));let m="";if(e==="example"?(s.devDependencies=0,s.workspaces=!1,s.test=!1):e==="package"?s.workspaces=!1:s.git&&(m=await b("Which git repository do you want to choose?",n.map(a=>{let u=q(a);return{name:u,value:u}}).concat([{name:x.yellow("None"),value:""}]))),s.devDependencies===2){let a=await h("Whether it will be used for devDependencies?");s.devDependencies=a?1:0}return s.test&&(s.test=await h("Whether to use test?")),s.userOptions={pkgName:o,projectDir:p,gitUserUrl:m},await ge(s),s}function fe(e){let t=[],r=async n=>{if(!(!Array.isArray(n)||!n.length))for(let o of n){if(o.startsWith("base/")){t.push(o);continue}let i=I.find(c=>c.name===o);if(!i){y.warning(`Can't find template ${x.yellow(o)}`);continue}r(i.templates)}};return r(e),[...new Set(t)]}async function ge(e){let{pkgName:t,gitUserUrl:r}=e.userOptions,n=await ne("user.name"),o=await ne("user.email"),i={name:n||Oe.userInfo().username,email:o||""},c=["pnpm","yarn","npm"].map(a=>`# ${a}
4
+ ${a} add ${t}${e.devDependencies?" -D":""}`).join(`
5
5
 
6
- `),c={pkgName:t,pkgInstall:p,gitUserName:n.name,gitUserEmail:n.email,gitOrg:g(),gitUrl:d(),gitFullUrl:a(),gitFullSSHUrl:a(),dateYear:new Date().getFullYear()};function d(){return`${r||`https://github.com/${g()}`}/${t.substring(t.indexOf("/")+1)}`}function g(){return r?r.substring(r.lastIndexOf("/")+1):t.startsWith("@")?t.split("/")[0].substring(1):be(n.name)}function a(u=!1){let m=r||`https://github.com/${g()}`;return u&&(m=m.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${m}/${t.substring(t.indexOf("/")+1)}.git`}return c}async function Ce(e){let{gitUserUrl:t,textVars:r,projectDir:s}=e;t&&(await P("git init",{cwd:s}),await P(`git remote add origin ${r.gitFullSSHUrl}`,{cwd:s}));let o=process.cwd(),i=f.relative(o,s);console.log(`
6
+ `),p={pkgName:t,pkgShortName:t.startsWith("@")?t.split("/")[1]:t,pkgInstall:c,gitUserName:i.name,gitUserEmail:i.email,gitOrg:l(),gitUrl:s(),gitFullUrl:m(),gitFullSSHUrl:m(),dateYear:new Date().getFullYear()};function s(){return`${r||`https://github.com/${l()}`}/${t.substring(t.indexOf("/")+1)}`}function l(){return r?r.substring(r.lastIndexOf("/")+1):t.startsWith("@")?t.split("/")[0].substring(1):De(i.name)}function m(a=!1){let u=r||`https://github.com/${l()}`;return a&&(u=u.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${u}/${t.substring(t.indexOf("/")+1)}.git`}return e.userOptions.textVars=p,p}async function Qe(e){let{gitUserUrl:t,textVars:r,projectDir:n}=e.userOptions;t&&(await S("git init",{cwd:n}),await S(`git remote add origin ${r.gitFullSSHUrl}`,{cwd:n}));let o=process.cwd(),i=g.relative(o,n);console.log(`
7
7
  Done. Now run:
8
- `),s!==o&&console.log(` cd ${i.includes(" ")?`"${i}"`:i}`);let n=R()||"npm";switch(n){case"yarn":console.log(" yarn"),console.log(" yarn dev");break;default:console.log(` ${n} install`),console.log(` ${n} run dev`);break}}var z=Ue(`
8
+ `),n!==o&&console.log(` cd ${i.includes(" ")?`"${i}"`:i}`);let c=Q()||"npm";switch(c){case"yarn":console.log(" yarn"),console.log(" yarn dev");break;default:console.log(` ${c} install`),console.log(` ${c} run dev`);break}}var z=Ge(`
9
9
  Usage
10
10
  $ create-app [name] [options]
11
11
 
@@ -15,6 +15,7 @@ Options
15
15
  --cwd The current working directory (default: ".")
16
16
  -e, --example Only create examples
17
17
  -p, --package Only create packages
18
+ --git Only manage git repository
18
19
  --verbose Display verbose output
19
20
  -h, --help Display this message
20
21
  -v, --version Display version number
@@ -22,4 +23,4 @@ Options
22
23
  Examples
23
24
  $ create-app my-project
24
25
  $ create-app my-project --template=vue
25
- `,{importMeta:import.meta,booleanDefault:void 0,helpIndent:0,flags:{cwd:{type:"string"},verbose:{type:"boolean",default:process.env.NODE_ENV==="development"},example:{shortFlag:"e",type:"boolean",default:!1},package:{shortFlag:"p",type:"boolean",default:!1},h:{type:"boolean",default:!1},v:{type:"boolean",default:!1}}}),{input:pe,flags:j}=z;if(j.h)z.showHelp(0);else if(j.v)z.showVersion();else{y.enableDebug(j.verbose),y.debug("cli options:",pe,j);let e=Object.assign({name:pe[0],type:"project"},j);e.cwd||=process.env.CA_CWD||process.cwd(),y.debug("final options:",e),e.type=Ie(e),await ae(e)}function Ie(e){return e.example?"example":e.package?"package":"project"}
26
+ `,{importMeta:import.meta,booleanDefault:void 0,helpIndent:0,flags:{cwd:{type:"string"},verbose:{type:"boolean",default:process.env.NODE_ENV==="development"},example:{shortFlag:"e",type:"boolean",default:!1},package:{shortFlag:"p",type:"boolean",default:!1},h:{type:"boolean",default:!1},v:{type:"boolean",default:!1}}}),{input:de,flags:P}=z;if(P.h)z.showHelp(0);else if(P.v)z.showVersion();else{y.enableDebug(P.verbose),y.debug("cli options:",de,P);let e=Object.assign({name:de[0],type:"project"},P);e.cwd||=process.cwd(),y.debug("final options:",e),e.type=qe(e),await le(e)}function qe(e){return e.example?"example":e.package?"package":"project"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tomjs/create-app",
3
3
  "type": "module",
4
- "version": "1.0.0-alpha.0",
4
+ "version": "1.0.0",
5
5
  "description": "create tomjs web app",
6
6
  "keywords": [
7
7
  "tomjs",
@@ -48,20 +48,20 @@
48
48
  "chalk": "^5.3.0",
49
49
  "dayjs": "^1.11.11",
50
50
  "execa": "^9.1.0",
51
- "inquirer": "^9.2.22",
51
+ "inquirer": "^9.2.23",
52
52
  "lodash-es": "^4.17.21",
53
53
  "meow": "^13.2.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@commitlint/cli": "^19.3.0",
57
- "@tomjs/commitlint": "^3.2.0",
58
- "@tomjs/eslint": "^3.0.1",
57
+ "@tomjs/commitlint": "^3.3.0",
58
+ "@tomjs/eslint": "^3.1.1",
59
59
  "@tomjs/prettier": "^1.4.1",
60
60
  "@tomjs/stylelint": "^2.5.0",
61
61
  "@tomjs/tsconfig": "^1.6.0",
62
62
  "@types/inquirer": "^9.0.7",
63
63
  "@types/lodash-es": "^4.17.12",
64
- "@types/node": "^18.19.33",
64
+ "@types/node": "^18.19.34",
65
65
  "@types/prompts": "^2.4.9",
66
66
  "cross-env": "^7.0.3",
67
67
  "dotenv": "^16.4.5",
@@ -69,11 +69,11 @@
69
69
  "husky": "^9.0.11",
70
70
  "lint-staged": "^15.2.5",
71
71
  "npm-run-all": "^4.1.5",
72
- "prettier": "^3.2.5",
73
- "stylelint": "^16.5.0",
74
- "tsup": "^8.0.2",
75
- "tsx": "^4.10.5",
76
- "type-fest": "^4.18.2",
72
+ "prettier": "^3.3.0",
73
+ "stylelint": "^16.6.1",
74
+ "tsup": "^8.1.0",
75
+ "tsx": "^4.11.2",
76
+ "type-fest": "^4.19.0",
77
77
  "typescript": "~5.4.5"
78
78
  },
79
79
  "scripts": {