@tomjs/create-app 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
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 oe,readJsonSync as ie,rmSync as R,writeFileSync as C,writeJsonSync as Ee}from"@tomjs/node";import x from"chalk";import{camelCase as Se,cloneDeep as ae,merge as De}from"lodash-es";import H from"node:os";import B 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 $ from"inquirer";var y=new we({directory:"create-app/logs"});function E(e,t,o){let n={message:e};return Array.isArray(t)||typeof t!="object"?n.default=t:Object.assign(n,t),Object.assign(n,o)}async function h(e,t){let o=`confirm-${Date.now()}`,n=E(e,t);return(await $.prompt([{type:"confirm",name:o,...n}]))[o]}async function L(e,t){let o=`input-${Date.now()}`,{required:n,...r}=E(e,t),i=n??!0,c=r.validate;return(i||c)&&(r.validate=s=>{let u=(s||"").trim();return i&&!u?"It's required!":c?c(s):!0}),(await $.prompt([{type:"input",name:o,...r}]))[o]}async function z(e,t,o){let n=`checkbox-${Date.now()}`,{required:r,min:i,max:c,...p}=E(e,o),s=r??!0,u=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`:u?u(a):!0),(await $.prompt([{type:"checkbox",name:n,choices:t,pageSize:Math.min(t.length,10),...p}]))[n]}async function b(e,t,o){let n=`list-${Date.now()}`,r=E(e,o);return(await $.prompt([{type:"list",name:n,choices:t,pageSize:Math.min(t.length,10),...r}]))[n]}var U={cwd:"."};async function S(e,t){let{trim:o,...n}=Object.assign({stdio:"pipe",shell:!0,cwd:U.cwd},t);n.cwd??=U.cwd,Array.isArray(e)&&(e=e.join(" "));let r=i=>{U.verbose?y.debug(i):y.write(i)};r(`$ ${e}`);try{let c=(await he(n)`${e}`).stdout;return r(c),o?c.trim().replace(/\n|\r/g,""):c.trim()}catch(i){let c=i.stderr||i.message;throw r(c),new Error(c)}}function _(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 K={repo:"https://github.com",owner:H.userInfo().username};function G(e){let{repo:t,owner:o}=e;return`${t}${t.endsWith("/")?"":"/"}${o}`}async function Y(e){let t=await ke.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=B.join(H.homedir(),".tomjs","create-app"),Z=B.join(X,"config.json");function D(){return xe(X),Object.assign({gitRepos:[]},ve(Z))}function je(e){let t=D();t.createTime?t.updateTime=Date.now():t.createTime=Date.now(),be(Z,Object.assign(t,e))}function Q(e){je({gitRepos:e})}async function k(e,t=!1){e||(e=D().gitRepos||[]);let o=e.map(p=>({name:G(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:",o);if(n==="exit")return;if(n==="add"){let p=await Y();return e.push(p),Q(e),k(e,t)}let r=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):D();if(i==="remove")return await h("Where confirm to remove?",!0)&&(e.splice(r,1),Q(e)),k(e,t);let c=await Y(e[r]);return e[r]=c,Q(e),k(e,t)}async function ee(){let e=D(),{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),"../../"),ce=g.join(Ce,"templates"),Te=ie(g.join(ce,"config.json"))||{},O=Te.list||[],T=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 te(e){return S(`git config --get ${e}`,{trim:!0})}var ne=e=>/^(?:(@[a-z0-9.+-]+(-[a-z0-9.+-]+)*\/)?([a-z0-9][a-z0-9._-]*[a-z0-9]))$/.test(e),Ue=e=>/^[a-z0-9._-]+$/.test(e),Fe=e=>e.includes("/")?e.substring(e.indexOf("/")+1):e;function I(e){return ie(g.join(e,"package.json"))||{}}function q(e,t){Ee(g.join(e,"package.json"),t)}function se(e,t,o){let n={},r=Object.keys(e);{let s=r.filter(l=>l.includes(":"));r=r.filter(l=>!l.includes(":")).sort().concat(s)}let i=p(t),c=p(o);return i.concat(r.filter(s=>!i.includes(s)&&!c.includes(s))).concat(c).forEach(s=>{n[s]=e[s]}),n;function p(s){let u=Array.isArray(s)?s:[];return u.length>0&&(u=u.reduce((l,a)=>{if(a.endsWith(":")){let m=r.filter(d=>!l.includes(d)&&d.startsWith(a));return l.concat(m)}return r.includes(a)?l.concat(a):l},[])),u}}async function pe(e){if(Object.assign(v,e),v.git){await k(void 0,!0);return}v.type==="project"?await Ve():await le(v.type)}async function Ve(){let e="project",t=await ue(e,v.cwd),{projectDir:o}=t.userOptions;M(e,t),await W(t);let{workspaces:n}=t,r=g.join(o,"packages");n&&await h("Do you want to create an package?")&&await le("package",r);let{examples:i}=t,c=Array.isArray(i)&&i.length>0;if(c){let s=T.filter(l=>i.includes(l.name)),u=g.join(o,"examples");for(let l of s){let a=ae(l);a.templates=me(a.templates).concat(a.name);let m=g.join(u,a.name);a.userOptions={projectDir:m,pkgName:a.name,gitUserUrl:"",textVars:{}},await fe(a),M("example",a),await W(a)}}let p=w.existsSync(r)&&w.readdirSync(g.join(o,"packages")).length>0;if(p||c){let s=I(o),u=_(s)||"npm",l=[];if(p&&l.push("packages"),c&&l.push("examples"),u==="pnpm"){let m=g.join(o,"pnpm-workspace.yaml");w.existsSync(m)||C(m,`packages:
2
- ${l.map(d=>` - '${d}/*'
3
- `)}`)}else s.workspaces??=l.map(m=>`"${m}/*"`),q(o,s);let a=s.devDependencies??{};p&&"vitest"in a&&C(g.join(o,"vitest.config.ts"),'export default ["packages/*"];')}await Qe(t)}async function le(e,t){let o=!0,n=0;for(;o;){n++;let r=await ue(e,t||v.cwd,n===1?v.template:void 0),{pkgName:i}=r.userOptions;M(e,r),await W(r),y.success(`${x.green(i)} created successfully!`),o=await h(`Do you want to create another ${e}?`)}}function re(e,...t){!Array.isArray(t)||t.length===0||t.forEach(o=>{let n=g.join(e,o);w.existsSync(n)&&R(n)})}function Le(e,t,o){if(!w.existsSync(e))return;let n=oe(e);n=n.replaceAll(t,o),C(e,n)}function _e(e,t,o){let n=o.userOptions,{textVars:r}=n;if(["scripts","dependencies","devDependencies","peerDependencies"].forEach(i=>{e[i]&&(i==="scripts"?e[i]=se(e[i],Ne,["prepare"]):e[i]=se(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/${r.pkgShortName}`),!o.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,o.userOptions.gitUserUrl||delete e.repository}function M(e,t,o){let n=o??t.userOptions.projectDir,r=g.join(n,".temp");$e(r);let i=t.templates||[];if((e!=="project"?i:["base/core",...i]).forEach((p,s)=>{let u=g.join(ce,p);if(!w.existsSync(u))return;Ae(u,n);let l=I(r)||{},a=De(l,I(n));if(s===i.length){let m={};Re.forEach(d=>{d in a&&(m[d]=a[d],delete a[d])}),a=Object.assign(m,a),_e(a,e,t),q(n,a)}else q(r,a)}),R(r),re(n,"tests"),Le(g.join(n,"tsconfig.json"),', "test"',""),e==="package"){let p=[".vscode"].concat(t.packages?.exclude??[]);re(n,...p)}}async function W(e,t){let o=e.userOptions,{textVars:n}=o,r=t??o.projectDir;w.readdirSync(r).filter(p=>p.startsWith("_")).forEach(p=>{w.renameSync(g.join(r,p),g.join(r,p.replace("_",".")))});let i=I(r),c=["LICENSE","README.md","README.zh_CN.md"];!i.publishConfig&&!i.publisher&&c.forEach(p=>{R(g.join(r,p))}),["package.json",...c].forEach(p=>{let s=g.join(r,p);if(!w.existsSync(s))return;let u=oe(s);Object.keys(n).forEach(l=>{u=u.replace(new RegExp("{{"+l+"}}","g"),n[l])}),C(s,u)})}async function ue(e,t,o){let{gitRepos:n}=await ee(),r=(v.name||"").trim(),i=ne(r);(!r||!i)&&(r=await L("Package name:",{validate:a=>ne(a)?!0:"Please input a valid name!"}));let c=Fe(r);c!==r&&(c=await L("Project name:",{default:c,validate:a=>Ue(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?")&&R(p),y.debug("projectDir:",p);let s;o&&Ie.includes(o)&&(s=T.find(a=>a.name===o));let u=async a=>{let m=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(A=>!A.packages?.ignore).length>0:!0).map(f=>({name:f.display,value:f.name})));y.debug("framework:",m);let d=O.find(f=>f.name===m)?.variants||[],de=e==="package"?d.filter(f=>!f.packages?.ignore).map(f=>{let A=f.parent;return A?{name:`${A.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===m)?.display,N=await b(`Select a ${x.blue(ye)} variant:`,de.concat([{name:x.yellow("\u2190 Back"),value:"_"}]));y.debug("variant:",N),N==="_"?await u(a):s=d.find(f=>f.name===N)};if(s||await u(o),!s)throw new Error("variant not found");s=ae(s),s.templates||(s.templates=[]),s.templates=me(s.templates).concat(s.name),y.debug("variant:",s),e==="project"&&Array.isArray(s.examples)&&(s.examples=await z("Select examples:",s.examples.map(a=>{let m=T.find(d=>d.name===a);if(!m)throw new Error(`Can't find example ${x.yellow(a)} from ${x.blue(s.name)}`);return{name:m.display,value:m.name,checked:!0}}),{required:!1}));let l="";if(e==="example"?(s.devDependencies=0,s.workspaces=!1,s.test=!1):e==="package"?s.workspaces=!1:s.git&&(l=await b("Which git repository do you want to choose?",n.map(a=>{let m=G(a);return{name:m,value:m}}).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:r,projectDir:p,gitUserUrl:l},await fe(s),s}function me(e){let t=[],o=async n=>{if(!(!Array.isArray(n)||!n.length))for(let r of n){if(r.startsWith("base/")){t.push(r);continue}let i=T.find(c=>c.name===r);if(!i){y.warning(`Can't find template ${x.yellow(r)}`);continue}o(i.templates)}};return o(e),[...new Set(t)]}async function fe(e){let{pkgName:t,gitUserUrl:o}=e.userOptions,n=await te("user.name"),r=await te("user.email"),i={name:n||Oe.userInfo().username,email:r||""},c=["pnpm","yarn","npm"].map(a=>`# ${a}
4
- ${a} add ${t}${e.devDependencies?" -D":""}`).join(`
1
+ import qe from"meow";import w from"node:fs";import Ae from"node:os";import g from"node:path";import{fileURLToPath as Pe}from"node:url";import{copySync as Ee,mkdirSync as $e,readFileSync as ie,readJsonSync as ae,rmSync as N,writeFileSync as T,writeJsonSync as Se}from"@tomjs/node";import x from"chalk";import{camelCase as De,cloneDeep as ce,merge as Ce}from"lodash-es";import B from"node:os";import X from"node:path";import{mkdirSync as be,readJsonSync as ve,writeJsonSync as ke}from"@tomjs/node";import O from"chalk";import je from"inquirer";import he from"@tomjs/logger";import{$ as xe}from"execa";import $ from"inquirer";var d=new he({directory:"create-app/logs"});function S(e,t,o){let s={message:e};return Array.isArray(t)||typeof t!="object"?s.default=t:Object.assign(s,t),Object.assign(s,o)}async function h(e,t){let o=`confirm-${Date.now()}`,s=S(e,t);return(await $.prompt([{type:"confirm",name:o,...s}]))[o]}async function V(e,t){let o=`input-${Date.now()}`,{required:s,...r}=S(e,t),i=s??!0,a=r.validate;return(i||a)&&(r.validate=n=>{let m=(n||"").trim();return i&&!m?"It's required!":a?a(n):!0}),(await $.prompt([{type:"input",name:o,...r}]))[o]}async function K(e,t,o){let s=`checkbox-${Date.now()}`,{required:r,min:i,max:a,...p}=S(e,o),n=r??!0,m=p.validate;return(n||i||a)&&(p.validate=c=>n&&c.length===0?"Please select at least one option":i&&c.length<i?`Please select at least ${i} options`:a&&c.length>a?`Please select at most ${a} options`:m?m(c):!0),(await $.prompt([{type:"checkbox",name:s,choices:t,pageSize:Math.min(t.length,10),...p}]))[s]}async function v(e,t,o){let s=`list-${Date.now()}`,r=S(e,o);return(await $.prompt([{type:"list",name:s,choices:t,pageSize:Math.min(t.length,10),...r}]))[s]}var F={cwd:"."};async function D(e,t){let{trim:o,...s}=Object.assign({stdio:"pipe",shell:!0,cwd:F.cwd},t);s.cwd??=F.cwd,Array.isArray(e)&&(e=e.join(" "));let r=i=>{F.verbose?d.debug(i):d.write(i)};r(`$ ${e}`);try{let a=(await xe(s)`${e}`).stdout;return r(a),o?a.trim().replace(/\n|\r/g,""):a.trim()}catch(i){let a=i.stderr||i.message;throw r(a),new Error(a)}}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:o}=e;return`${t}${t.endsWith("/")?"":"/"}${o}`}async function H(e){let t=await je.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 be(Z),Object.assign({gitRepos:[]},ve(ee))}function Oe(e){let t=C();t.createTime?t.updateTime=Date.now():t.createTime=Date.now(),ke(ee,Object.assign(t,e))}function G(e){Oe({gitRepos:e})}async function k(e,t=!1){e||(e=C().gitRepos||[]);let o=e.map(p=>({name:q(p),value:p.id})).concat([{name:O.green("+ Add"),value:"add"},{name:O.yellow("\u2190 Exit"),value:"exit"}]),s=await v(e.length===0?"You choose to add or exit:":"You can choose the repository to be operated, or choose to add or exit:",o);if(s==="exit")return;if(s==="add"){let p=await H();return e.push(p),G(e),k(e,t)}let r=e.findIndex(p=>p.id===s),i=await v("Select an action?",[{name:O.green("^ Edit"),value:"edit"},{name:O.red("- Remove"),value:"remove"},{name:O.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(r,1),G(e)),k(e,t);let a=await H(e[r]);return e[r]=a,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 ${O.blue("git remote repository")} for the first time.`),await k(t)),e}var b={},Te=g.join(Pe(import.meta.url),"../../"),pe=g.join(Te,"templates"),Ie=ae(g.join(pe,"config.json"))||{},A=Ie.list||[],I=A.map(e=>e.variants?e.variants.map(t=>({parent:e,...t})):[]).flat(),Re=A.map(e=>e.variants&&e.variants.map(t=>t.name)||[e.name]).reduce((e,t)=>e.concat(t),[]),Ne=["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"],Ue=["dev","dev:","debug","start","build","build:","release","clean","preview","test","lint","lint:eslint","lint:stylelint","lint:prettier"];async function ne(e){return D(`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),_e=e=>e.includes("/")?e.substring(e.indexOf("/")+1):e;function R(e){return ae(g.join(e,"package.json"))||{}}function M(e,t){Se(g.join(e,"package.json"),t)}function re(e,t,o){let s={},r=Object.keys(e);{let n=r.filter(u=>u.includes(":"));r=r.filter(u=>!u.includes(":")).sort().concat(n)}let i=p(t),a=p(o);return i.concat(r.filter(n=>!i.includes(n)&&!a.includes(n))).concat(a).forEach(n=>{s[n]=e[n]}),s;function p(n){let m=Array.isArray(n)?n:[];return m.length>0&&(m=m.reduce((u,c)=>{if(c.endsWith(":")){let l=r.filter(y=>!u.includes(y)&&y.startsWith(c));return u.concat(l)}return r.includes(c)?u.concat(c):u},[])),m}}async function le(e){if(Object.assign(b,e),b.git){await k(void 0,!0);return}b.type==="project"?await Le():await ue(b.type)}async function Le(){let e="project",t=await me(e,b.cwd),{projectDir:o}=t.userOptions;W(e,t),await J(t);let{workspaces:s}=t,r=g.join(o,"packages");s&&await h("Do you want to create an package?")&&await ue("package",r);let{examples:i}=t,a=Array.isArray(i)&&i.length>0;if(a){let n=I.filter(u=>i.includes(u.name)),m=g.join(o,"examples");for(let u of n){let c=ce(u);c.templates=fe(c.templates).concat(c.name);let l=g.join(m,c.name);c.userOptions={projectDir:l,pkgName:c.name,gitUserUrl:"",textVars:{}},await ge(c),W("example",c),await J(c)}}let p=w.existsSync(r)&&w.readdirSync(g.join(o,"packages")).length>0;if(p||a){let n=R(o),m=Q(n)||"npm",u=[];if(p&&u.push("packages"),a&&u.push("examples"),m==="pnpm"){let l=g.join(o,"pnpm-workspace.yaml");w.existsSync(l)||T(l,`packages:
2
+ ${u.map(y=>` - '${y}/*'
3
+ `)}`)}else n.workspaces??=u.map(l=>`"${l}/*"`),M(o,n);let c=n.devDependencies??{};p&&"vitest"in c&&T(g.join(o,"vitest.config.ts"),'export default ["packages/*"];')}await Ge(t)}async function ue(e,t){let o=!0,s=0;for(;o;){s++;let r=await me(e,t||b.cwd,s===1?b.template:void 0),{pkgName:i}=r.userOptions;W(e,r),await J(r),d.success(`${x.green(i)} created successfully!`),o=await h(`Do you want to create another ${e}?`)}}function oe(e,...t){!Array.isArray(t)||t.length===0||t.forEach(o=>{let s=g.join(e,o);w.existsSync(s)&&N(s)})}function Ve(e,t,o){if(!w.existsSync(e))return;let s=ie(e);s=s.replaceAll(t,o),T(e,s)}function Qe(e,t,o){let s=o.userOptions,{textVars:r}=s;if(["scripts","dependencies","devDependencies","peerDependencies"].forEach(i=>{e[i]&&(i==="scripts"?e[i]=re(e[i],Ue,["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/${r.pkgShortName}`),e.scripts&&Object.keys(e.scripts).forEach(i=>{i.startsWith("lint")&&delete e.scripts[i]})),!o.test){let i=e.scripts;if(i){delete i.test;{let a=i["lint:eslint"]||"";a&&(i["lint:eslint"]=a.replace(",test",""))}}delete e.devDependencies?.vitest}e.type==="commonjs"&&delete e.type,e.private===!1&&delete e.private,o.userOptions.gitUserUrl||delete e.repository}function W(e,t,o){let s=o??t.userOptions.projectDir,r=g.join(s,".temp");$e(r);let i=t.templates||[],a=[];e==="package"?a=["base/package"]:e==="project"&&(a=["base/core"]);let p=a.concat(i);if(p.forEach((n,m)=>{let u=g.join(pe,n);if(!w.existsSync(u))return;Ee(u,s);let c=R(r)||{},l=Ce(c,R(s));if(m===p.length-1){let y={};Ne.forEach(j=>{j in l&&(y[j]=l[j],delete l[j])}),l=Object.assign(y,l),Qe(l,e,t),M(s,l)}else M(r,l)}),N(r),t.test||(oe(s,"test"),Ve(g.join(s,"tsconfig.json"),', "test"',"")),e==="package"){let n=[".vscode"].concat(t.packages?.exclude??[]);oe(s,...n)}}async function J(e,t){let o=e.userOptions,{textVars:s}=o,r=t??o.projectDir;w.readdirSync(r).filter(p=>p.startsWith("_")).forEach(p=>{w.renameSync(g.join(r,p),g.join(r,p.replace("_",".")))});let i=R(r),a=["LICENSE","README.md","README.zh_CN.md"];!i.publishConfig&&!i.publisher&&a.forEach(p=>{N(g.join(r,p))}),["package.json",...a].forEach(p=>{let n=g.join(r,p);if(!w.existsSync(n))return;let m=ie(n);Object.keys(s).forEach(u=>{m=m.replace(new RegExp("{{"+u+"}}","g"),s[u])}),T(n,m)})}async function me(e,t,o){let{gitRepos:s}=await te(),r=(b.name||"").trim(),i=se(r);(!r||!i)&&(r=await V("Package name:",{validate:c=>se(c)?!0:"Please input a valid name!"}));let a=_e(r);a!==r&&(a=await V("Project name:",{default:a,validate:c=>Fe(c)?!0:"Please input a valid name!"})),d.debug("projectName:",a);let p=g.join(t,a);w.existsSync(p)&&await h("Project already exists, overwrite?")&&N(p),d.debug("projectDir:",p);let n;o&&Re.includes(o)&&(n=I.find(c=>c.name===o));let m=async c=>{let l=await v(!n&&c?`${x.red(c)} is invalid, please select a framework again:`:"Select a framework:",A.filter(f=>!f.variants||!f.variants.length?!1:e==="package"?f.variants.filter(E=>!E.packages?.ignore).length>0:!0).map(f=>({name:f.display,value:f.name})));d.debug("framework:",l);let y=A.find(f=>f.name===l)?.variants||[],j=e==="package"?y.filter(f=>!f.packages?.ignore).map(f=>{let E=f.parent;return E?{name:`${E.display} > ${f.display}`,value:f.name}:{name:f.display,value:f.name}}):y.map(f=>({name:f.display,value:f.name})),we=A.find(f=>f.name===l)?.display,U=await v(`Select a ${x.blue(we)} variant:`,j.concat([{name:x.yellow("\u2190 Back"),value:"_"}]));d.debug("variant:",U),U==="_"?await m(c):n=y.find(f=>f.name===U)};if(n||await m(o),!n)throw new Error("variant not found");n=ce(n),n.templates||(n.templates=[]),n.templates=fe(n.templates).concat(n.name),d.debug("variant:",n),e==="project"&&Array.isArray(n.examples)&&(n.examples=await K("Select examples:",n.examples.map(c=>{let l=I.find(y=>y.name===c);if(!l)throw new Error(`Can't find example ${x.yellow(c)} from ${x.blue(n.name)}`);return{name:l.display,value:l.name,checked:!0}}),{required:!1}));let u="";if(e==="example"?(n.devDependencies=0,n.workspaces=!1,n.test=!1):e==="package"?n.workspaces=!1:n.git&&(u=await v("Which git repository do you want to choose?",s.map(c=>{let l=q(c);return{name:l,value:l}}).concat([{name:x.yellow("None"),value:""}]))),n.devDependencies===2){let c=await h("Whether it will be used for devDependencies?");n.devDependencies=c?1:0}return n.test&&(n.test=await h("Whether to use test?")),n.userOptions={pkgName:r,projectDir:p,gitUserUrl:u},await ge(n),n}function fe(e){let t=[],o=async s=>{if(!(!Array.isArray(s)||!s.length))for(let r of s){if(r.startsWith("base/")){t.push(r);continue}let i=I.find(a=>a.name===r);if(!i){d.warning(`Can't find template ${x.yellow(r)}`);continue}o(i.templates)}};return o(e),[...new Set(t)]}async function ge(e){let{pkgName:t,gitUserUrl:o}=e.userOptions,s=await ne("user.name"),r=await ne("user.email"),i={name:s||Ae.userInfo().username,email:r||""},a=["pnpm","yarn","npm"].map(c=>`# ${c}
4
+ ${c} add ${t}${e.devDependencies?" -D":""}`).join(`
5
5
 
6
- `),p={pkgName:t,pkgShortName:t.startsWith("@")?t.split("/")[1]:t,pkgInstall:c,gitUserName:i.name,gitUserEmail:i.email,gitOrg:u(),gitUrl:s(),gitFullUrl:l(),gitFullSSHUrl:l(),dateYear:new Date().getFullYear()};function s(){return`${o||`https://github.com/${u()}`}/${t.substring(t.indexOf("/")+1)}`}function u(){return o?o.substring(o.lastIndexOf("/")+1):t.startsWith("@")?t.split("/")[0].substring(1):Se(i.name)}function l(a=!1){let m=o||`https://github.com/${u()}`;return a&&(m=m.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${m}/${t.substring(t.indexOf("/")+1)}.git`}return e.userOptions.textVars=p,p}async function Qe(e){let{gitUserUrl:t,textVars:o,projectDir:n}=e.userOptions;t&&(await S("git init",{cwd:n}),await S(`git remote add origin ${o.gitFullSSHUrl}`,{cwd:n}));let r=process.cwd(),i=g.relative(r,n);console.log(`
6
+ `),p={pkgName:t,pkgShortName:t.startsWith("@")?t.split("/")[1]:t,pkgInstall:a,gitUserName:i.name,gitUserEmail:i.email,gitOrg:m(),gitUrl:n(),gitFullUrl:u(),gitFullSSHUrl:u(),dateYear:new Date().getFullYear()};function n(){return`${o||`https://github.com/${m()}`}/${t.substring(t.indexOf("/")+1)}`}function m(){return o?o.substring(o.lastIndexOf("/")+1):t.startsWith("@")?t.split("/")[0].substring(1):De(i.name)}function u(c=!1){let l=o||`https://github.com/${m()}`;return c&&(l=l.replace(/http(s):\/\//g,"git@").replace(/\//,":")),`${l}/${t.substring(t.indexOf("/")+1)}.git`}return e.userOptions.textVars=p,p}async function Ge(e){let{gitUserUrl:t,textVars:o,projectDir:s}=e.userOptions;t&&(await D("git init",{cwd:s}),await D(`git remote add origin ${o.gitFullSSHUrl}`,{cwd:s}));let r=process.cwd(),i=g.relative(r,s);console.log(`
7
7
  Done. Now run:
8
- `),n!==r&&console.log(` cd ${i.includes(" ")?`"${i}"`:i}`);let c=_()||"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 J=Ge(`
8
+ `),s!==r&&console.log(` cd ${i.includes(" ")?`"${i}"`:i}`);let a=Q()||"npm";switch(a){case"yarn":console.log(" yarn"),console.log(" yarn dev");break;default:console.log(` ${a} install`),console.log(` ${a} run dev`);break}}var z=qe(`
9
9
  Usage
10
10
  $ create-app [name] [options]
11
11
 
@@ -23,4 +23,4 @@ Options
23
23
  Examples
24
24
  $ create-app my-project
25
25
  $ create-app my-project --template=vue
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:ge,flags:P}=J;if(P.h)J.showHelp(0);else if(P.v)J.showVersion();else{y.enableDebug(P.verbose),y.debug("cli options:",ge,P);let e=Object.assign({name:ge[0],type:"project"},P);e.cwd||=process.cwd(),y.debug("final options:",e),e.type=qe(e),await pe(e)}function qe(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"},package:{shortFlag:"p",type:"boolean"},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{d.enableDebug(P.verbose),d.debug("cli options:",de,P);let e=Object.assign({name:de[0],type:"project"},P);e.cwd||=process.cwd(),e.example??=ye(process.env.CA_EXAMPLE),e.package??=ye(process.env.CA_PACKAGE),d.debug("final options:",e),e.type=Me(e),await le(e)}function Me(e){return e.example?"example":e.package?"package":"project"}function ye(e){return e==="1"||e==="true"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tomjs/create-app",
3
3
  "type": "module",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "description": "create tomjs web app",
6
6
  "keywords": [
7
7
  "tomjs",
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "{{pkgName}}",
3
+ "version": "0.0.0",
4
+ "type": "commonjs",
5
+ "engines": {
6
+ "node": ">=16"
7
+ }
8
+ }