@huberyyang/create-todo-vue 1.6.1 → 1.8.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 (42) hide show
  1. package/README.md +12 -1
  2. package/dist/index.js +2 -2
  3. package/package.json +1 -1
  4. package/template-lit/README.md +1 -0
  5. package/template-lit-ts/README.md +1 -0
  6. package/template-vanilla/README.md +1 -0
  7. package/template-vanilla-ts/README.md +1 -0
  8. package/template-vue/README.md +1 -5
  9. package/template-vue-dev/.husky/commit-msg +1 -0
  10. package/template-vue-dev/.husky/pre-commit +1 -0
  11. package/template-vue-dev/.vscode/extensions.json +3 -0
  12. package/template-vue-dev/.vscode/settings.json +50 -0
  13. package/template-vue-dev/README.md +1 -0
  14. package/template-vue-dev/_gitignore +24 -0
  15. package/template-vue-dev/auto-imports.d.ts +619 -0
  16. package/template-vue-dev/commitlint.config.ts +18 -0
  17. package/template-vue-dev/components.d.ts +24 -0
  18. package/template-vue-dev/eslint.config.ts +48 -0
  19. package/template-vue-dev/index.html +24 -0
  20. package/template-vue-dev/lint-staged.config.mjs +3 -0
  21. package/template-vue-dev/package.json +52 -0
  22. package/template-vue-dev/pnpm-workspace.yaml +5 -0
  23. package/template-vue-dev/public/vite.svg +1 -0
  24. package/template-vue-dev/shims.d.ts +6 -0
  25. package/template-vue-dev/src/App.vue +16 -0
  26. package/template-vue-dev/src/assets/vue.svg +1 -0
  27. package/template-vue-dev/src/components/BaseFooter.vue +8 -0
  28. package/template-vue-dev/src/composables/useDark.ts +2 -0
  29. package/template-vue-dev/src/main.ts +15 -0
  30. package/template-vue-dev/src/pages/[...all].vue +5 -0
  31. package/template-vue-dev/src/pages/article/[id].vue +13 -0
  32. package/template-vue-dev/src/pages/index.vue +85 -0
  33. package/template-vue-dev/src/pages/test.vue +17 -0
  34. package/template-vue-dev/src/styles/main.scss +6 -0
  35. package/template-vue-dev/src/styles/variables.scss +7 -0
  36. package/template-vue-dev/src/types/index.d.ts +1 -0
  37. package/template-vue-dev/src/types/vite-env.d.ts +2 -0
  38. package/template-vue-dev/tsconfig.json +27 -0
  39. package/template-vue-dev/typed-router.d.ts +121 -0
  40. package/template-vue-dev/uno.config.ts +29 -0
  41. package/template-vue-dev/vite.config.ts +85 -0
  42. package/template-vue-ts/README.md +1 -5
package/README.md CHANGED
@@ -11,6 +11,11 @@
11
11
 
12
12
  使用自定义模板快速创建最新的vue项目
13
13
 
14
+ 内置模板生成完成后会自动执行一次 `git init`,直接就是一个干净的 git 工作区(不暂存、不提交,
15
+ 第一个 commit 长什么样由你决定)。如果目标位置已经在某个 git 仓库里,则**跳过**这一步并给出提示——
16
+ 在已有仓库里再建一个嵌套仓库几乎从来不是想要的结果。git 不可用或初始化失败时只会警告,
17
+ 不影响项目本身的创建,退出码仍是 0。
18
+
14
19
  ### 📦 快速开始 (Usage)
15
20
 
16
21
  #### ⏳ 交互式创建
@@ -74,6 +79,7 @@ npm create @huberyyang/todo-vue .foo --overwrite -t vue-ts --no-immediate --pack
74
79
  - **拼错的参数会被指出来。**(`v1.2.0` 起)以前拼错的 flag 会被静默忽略,而且它还会把紧跟其后的目录名当成自己的值吃掉——`--overwirte my-app` 连项目名都会丢,CLI 转而追问项目名称,用户看不出哪里写错了。
75
80
  - **非交互环境下会说清楚卡在哪。** 在 CI、脚本或 `< /dev/null` 之类拿不到输入的环境里走到提示时,会打印当前卡在哪一步、以及该改用哪个参数,然后返回 `1`。此前这里只会留下一个画到一半的选择器,没有任何解释。
76
81
  - **依赖装不上时,项目仍然是好的。** 用 `-i` 而依赖安装失败时,**已经生成的项目不会被回滚**——会告诉你项目在哪、以及手动补装的命令,并把包管理器的退出码原样带出来(所以这时退出码不一定是 `1`)。
82
+ - **`git init` 失败不影响退出码。** 机器上没有 git、或初始化失败时只会警告一句,项目本身照常创建,退出码仍是 `0`——它是附加动作,不该把一次成功的创建判成失败。
77
83
 
78
84
  #### 🟢 当前可用模板
79
85
 
@@ -81,6 +87,7 @@ npm create @huberyyang/todo-vue .foo --overwrite -t vue-ts --no-immediate --pack
81
87
 
82
88
  - `vanilla` / `vanilla-ts`
83
89
  - `vue` / `vue-ts`
90
+ - `vue-dev`:比 vue-ts 重一档,预装 unocss、vueuse、vue-router 自动路由、element-plus 图标、自动导入,以及 eslint + husky + commitlint 一整套工具链
84
91
  - `lit` / `lit-ts`
85
92
 
86
93
  转交上游脚手架的模板(同样 `-t` 可直接指定,交互式在 Vue 下也能选到):
@@ -92,7 +99,11 @@ npm create @huberyyang/todo-vue .foo --overwrite -t vue-ts --no-immediate --pack
92
99
  - `custom-vitesse-lite` → `degit antfu-collective/vitesse-lite`(Vitesse Lite)
93
100
 
94
101
  > 转交上游的模板由对方的脚手架直接生成,因此**不会**像内置模板那样把 `package.json` 的 `name`
95
- > 和 `index.html` 的 `<title>` 改写成包名——需要的话生成后自己改一下。这几个还需要联网。
102
+ > 和 `index.html` 的 `<title>` 改写成包名,**也不会自动 `git init`**——需要的话生成后自己改一下。
103
+ > 这几个还需要联网。
104
+
105
+ > 内置模板都带一份只写着模板名的占位 `README.md`(如 `# vue-ts`),它**不会**被改写成项目名,
106
+ > 就是留给你自己写的一张白纸。
96
107
 
97
108
  ### 📜 许可证 (License)
98
109
 
package/dist/index.js CHANGED
@@ -54,7 +54,7 @@ ${r}`:``}`}default:return`${n}${t?`${s(`cyan`,V)} `:``}${i}
54
54
  ${t?s(`cyan`,H):``}
55
55
  `}}}).prompt();var Je=_(((e,t)=>{t.exports=a,a.sync=o;var n=b(`fs`);function r(e,t){var n=t.pathExt===void 0?process.env.PATHEXT:t.pathExt;if(!n||(n=n.split(`;`),n.indexOf(``)!==-1))return!0;for(var r=0;r<n.length;r++){var i=n[r].toLowerCase();if(i&&e.substr(-i.length).toLowerCase()===i)return!0}return!1}function i(e,t,n){return!e.isSymbolicLink()&&!e.isFile()?!1:r(t,n)}function a(e,t,r){n.stat(e,function(n,a){r(n,!n&&i(a,e,t))})}function o(e,t){return i(n.statSync(e),e,t)}})),Ye=_(((e,t)=>{t.exports=r,r.sync=i;var n=b(`fs`);function r(e,t,r){n.stat(e,function(e,n){r(e,!e&&a(n,t))})}function i(e,t){return a(n.statSync(e),t)}function a(e,t){return e.isFile()&&o(e,t)}function o(e,t){var n=e.mode,r=e.uid,i=e.gid,a=t.uid===void 0?process.getuid&&process.getuid():t.uid,o=t.gid===void 0?process.getgid&&process.getgid():t.gid,s=64,c=8,l=1,u=s|c;return n&l||n&c&&i===o||n&s&&r===a||n&u&&a===0}})),Xe=_(((e,t)=>{b(`fs`);var n=process.platform===`win32`||global.TESTING_WINDOWS?Je():Ye();t.exports=r,r.sync=i;function r(e,t,i){if(typeof t==`function`&&(i=t,t={}),!i){if(typeof Promise!=`function`)throw TypeError(`callback not provided`);return new Promise(function(n,i){r(e,t||{},function(e,t){e?i(e):n(t)})})}n(e,t||{},function(e,n){e&&(e.code===`EACCES`||t&&t.ignoreErrors)&&(e=null,n=!1),i(e,n)})}function i(e,t){try{return n.sync(e,t||{})}catch(e){if(t&&t.ignoreErrors||e.code===`EACCES`)return!1;throw e}}})),Ze=_(((e,t)=>{let n=process.platform===`win32`||process.env.OSTYPE===`cygwin`||process.env.OSTYPE===`msys`,r=b(`path`),i=n?`;`:`:`,a=Xe(),o=e=>Object.assign(Error(`not found: ${e}`),{code:`ENOENT`}),s=(e,t)=>{let r=t.colon||i,a=e.match(/\//)||n&&e.match(/\\/)?[``]:[...n?[process.cwd()]:[],...(t.path||process.env.PATH||``).split(r)],o=n?t.pathExt||process.env.PATHEXT||`.EXE;.CMD;.BAT;.COM`:``,s=n?o.split(r):[``];return n&&e.indexOf(`.`)!==-1&&s[0]!==``&&s.unshift(``),{pathEnv:a,pathExt:s,pathExtExe:o}},c=(e,t,n)=>{typeof t==`function`&&(n=t,t={}),t||={};let{pathEnv:i,pathExt:c,pathExtExe:l}=s(e,t),u=[],d=n=>new Promise((a,s)=>{if(n===i.length)return t.all&&u.length?a(u):s(o(e));let c=i[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=r.join(l,e),p=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;a(f(p,n,0))}),f=(e,n,r)=>new Promise((i,o)=>{if(r===c.length)return i(d(n+1));let s=c[r];a(e+s,{pathExt:l},(a,o)=>{if(!a&&o){if(t.all)u.push(e+s);else return i(e+s)}return i(f(e,n,r+1))})});return n?d(0).then(e=>n(null,e),n):d(0)};t.exports=c,c.sync=(e,t)=>{t||={};let{pathEnv:n,pathExt:i,pathExtExe:c}=s(e,t),l=[];for(let o=0;o<n.length;o++){let s=n[o],u=/^".*"$/.test(s)?s.slice(1,-1):s,d=r.join(u,e),f=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<i.length;e++){let n=f+i[e];try{if(a.sync(n,{pathExt:c})){if(t.all)l.push(n);else return n}}catch{}}}if(t.all&&l.length)return l;if(t.nothrow)return null;throw o(e)}})),Qe=_(((e,t)=>{let n=(e={})=>{let t=e.env||process.env;return(e.platform||process.platform)===`win32`?Object.keys(t).reverse().find(e=>e.toUpperCase()===`PATH`)||`Path`:`PATH`};t.exports=n,t.exports.default=n})),$e=_(((e,t)=>{let n=b(`path`),r=Ze(),i=Qe();function a(e,t){let a=e.options.env||process.env,o=process.cwd(),s=e.options.cwd!=null,c=s&&process.chdir!==void 0&&!process.chdir.disabled;if(c)try{process.chdir(e.options.cwd)}catch{}let l;try{l=r.sync(e.command,{path:a[i({env:a})],pathExt:t?n.delimiter:void 0})}catch{}finally{c&&process.chdir(o)}return l&&=n.resolve(s?e.options.cwd:``,l),l}function o(e){return a(e)||a(e,!0)}t.exports=o})),et=_(((e,t)=>{let n=/([()\][%!^"`<>&|;, *?])/g;function r(e){return e=e.replace(n,`^$1`),e}function i(e,t){return e=`${e}`,e=e.replace(/(?=(\\+?)?)\1"/g,`$1$1\\"`),e=e.replace(/(?=(\\+?)?)\1$/,`$1$1`),e=`"${e}"`,e=e.replace(n,`^$1`),t&&(e=e.replace(n,`^$1`)),e}t.exports.command=r,t.exports.argument=i})),tt=_(((e,t)=>{t.exports=/^#!(.*)/})),nt=_(((e,t)=>{let n=tt();t.exports=(e=``)=>{let t=e.match(n);if(!t)return null;let[r,i]=t[0].replace(/#! ?/,``).split(` `),a=r.split(`/`).pop();return a===`env`?i:i?`${a} ${i}`:a}})),rt=_(((e,t)=>{let n=b(`fs`),r=nt();function i(e){let t=Buffer.alloc(150),i;try{i=n.openSync(e,`r`),n.readSync(i,t,0,150,0),n.closeSync(i)}catch{}return r(t.toString())}t.exports=i})),it=_(((e,t)=>{let n=b(`path`),r=$e(),i=et(),a=rt(),o=process.platform===`win32`,s=/\.(?:com|exe)$/i,c=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function l(e){e.file=r(e);let t=e.file&&a(e.file);return t?(e.args.unshift(e.file),e.command=t,r(e)):e.file}function u(e){if(!o)return e;let t=l(e),r=!s.test(t);if(e.options.forceShell||r){let r=c.test(t);e.command=n.normalize(e.command),e.command=i.command(e.command),e.args=e.args.map(e=>i.argument(e,r)),e.args=[`/d`,`/s`,`/c`,`"${[e.command].concat(e.args).join(` `)}"`],e.command=process.env.comspec||`cmd.exe`,e.options.windowsVerbatimArguments=!0}return e}function d(e,t,n){t&&!Array.isArray(t)&&(n=t,t=null),t=t?t.slice(0):[],n=Object.assign({},n);let r={command:e,args:t,options:n,file:void 0,original:{command:e,args:t}};return n.shell?r:u(r)}t.exports=d})),at=_(((e,t)=>{let n=process.platform===`win32`;function r(e,t){return Object.assign(Error(`${t} ${e.command} ENOENT`),{code:`ENOENT`,errno:`ENOENT`,syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function i(e,t){if(!n)return;let r=e.emit;e.emit=function(n,i){if(n===`exit`){let n=a(i,t);if(n)return r.call(e,`error`,n)}return r.apply(e,arguments)}}function a(e,t){return n&&e===1&&!t.file?r(t.original,`spawn`):null}function o(e,t){return n&&e===1&&!t.file?r(t.original,`spawnSync`):null}t.exports={hookChildProcess:i,verifyENOENT:a,verifyENOENTSync:o,notFoundError:r}})),ot=_(((e,t)=>{let n=b(`child_process`),r=it(),i=at();function a(e,t,a){let o=r(e,t,a),s=n.spawn(o.command,o.args,o.options);return i.hookChildProcess(s,o),s}function o(e,t,a){let o=r(e,t,a),s=n.spawnSync(o.command,o.args,o.options);return s.error=s.error||i.verifyENOENTSync(s.status,o),s}t.exports=a,t.exports.spawn=a,t.exports.sync=o,t.exports._parse=r,t.exports._enoent=i})),st=_(((e,t)=>{function n(e){return e==null?[]:Array.isArray(e)?e:[e]}function r(e,t,n,r){var i,a=e[t],o=~r.string.indexOf(t)?n==null||n===!0?``:String(n):typeof n==`boolean`?n:~r.boolean.indexOf(t)?n===`false`?!1:n===`true`||(e._.push((i=+n,i*0==0?i:n)),!!n):(i=+n,i*0==0?i:n);e[t]=a==null?o:Array.isArray(a)?a.concat(o):[a,o]}t.exports=function(e,t){e||=[],t||={};var i,a,o,s,c,l={_:[]},u=0,d=0,f=0,p=e.length;let m=t.alias!==void 0,h=t.unknown!==void 0,g=t.default!==void 0;if(t.alias=t.alias||{},t.string=n(t.string),t.boolean=n(t.boolean),m)for(i in t.alias)for(a=t.alias[i]=n(t.alias[i]),u=0;u<a.length;u++)(t.alias[a[u]]=a.concat(i)).splice(u,1);for(u=t.boolean.length;u-->0;)for(a=t.alias[t.boolean[u]]||[],d=a.length;d-->0;)t.boolean.push(a[d]);for(u=t.string.length;u-->0;)for(a=t.alias[t.string[u]]||[],d=a.length;d-->0;)t.string.push(a[d]);if(g){for(i in t.default)if(s=typeof t.default[i],a=t.alias[i]=t.alias[i]||[],t[s]!==void 0)for(t[s].push(i),u=0;u<a.length;u++)t[s].push(a[u])}let _=h?Object.keys(t.alias):[];for(u=0;u<p;u++){if(o=e[u],o===`--`){l._=l._.concat(e.slice(++u));break}for(d=0;d<o.length&&o.charCodeAt(d)===45;d++);if(d===0)l._.push(o);else if(o.substring(d,d+3)===`no-`){if(s=o.substring(d+3),h&&!~_.indexOf(s))return t.unknown(o);l[s]=!1}else{for(f=d+1;f<o.length&&o.charCodeAt(f)!==61;f++);for(s=o.substring(d,f),c=o.substring(++f)||u+1===p||(``+e[u+1]).charCodeAt(0)===45||e[++u],a=d===2?[s]:s,f=0;f<a.length;f++){if(s=a[f],h&&!~_.indexOf(s))return t.unknown(`-`.repeat(d)+s);r(l,s,f+1<a.length||c,t)}}}if(g)for(i in t.default)l[i]===void 0&&(l[i]=t.default[i]);if(m)for(i in l)for(a=t.alias[i]||[];a.length>0;)l[a.shift()]=l[i];return l}})),ct=_(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c})),lt=y(ot(),1),ut=y(st(),1),dt=y(ct(),1);function ft(e,t=80){let n=e=>e.variants?.length?e.variants.map(e=>e.name):[e.name],r=Math.max(0,...e.flatMap(n).map(e=>e.length))+2,i=Math.max(1,Math.floor(t/r));return e.map(e=>{let t=n(e),a=[];for(let e=0;e<t.length;e+=i)a.push(t.slice(e,e+i).map(e=>e.padEnd(r)).join(``).trimEnd());return a.map(t=>e.color(t)).join(`
56
56
  `)}).join(`
57
- `)}const{green:pt,yellow:J,blue:mt,redBright:ht,greenBright:Y}=dt.default,gt=`vue-project`,_t={boolean:[`help`,`version`,`overwrite`,`immediate`],alias:{h:`help`,v:`version`,t:`template`,i:`immediate`},string:[`template`,`package-name`]},X=[{name:`vanilla`,display:`Vanilla`,color:J,variants:[{name:`vanilla-ts`,display:`TypeScript`,color:mt},{name:`vanilla`,display:`JavaScript`,color:J}]},{name:`vue`,display:`Vue`,color:pt,variants:[{name:`vue-ts`,display:`TypeScript`,color:mt},{name:`vue`,display:`JavaScript`,color:J},{name:`custom-create-vue`,display:`Official Vue Starter ↗`,color:pt,customCommand:`npm create vue@latest TARGET_DIR`},{name:`custom-nuxt`,display:`Nuxt ↗`,link:`https://nuxt.com`,color:Y,customCommand:`npm exec nuxi init TARGET_DIR`},{name:`custom-vike-vue`,display:`Vike ↗`,link:`https://vike.dev`,color:Y,customCommand:`npm create -- vike@latest --vue TARGET_DIR`},{name:`custom-vitesse`,display:`Vitesse ↗`,link:`https://github.com/antfu-collective/vitesse`,color:Y,customCommand:`npm exec degit antfu-collective/vitesse TARGET_DIR`},{name:`custom-vitesse-lite`,display:`Vitesse Lite ↗`,link:`https://github.com/antfu-collective/vitesse-lite`,color:Y,customCommand:`npm exec degit antfu-collective/vitesse-lite TARGET_DIR`}]},{name:`lit`,display:`Lit`,color:ht,variants:[{name:`lit-ts`,display:`TypeScript`,color:mt},{name:`lit`,display:`JavaScript`,color:J}]}],vt=`\
57
+ `)}const{green:pt,yellow:J,blue:mt,cyan:ht,redBright:gt,greenBright:Y}=dt.default,_t=`vue-project`,vt={boolean:[`help`,`version`,`overwrite`,`immediate`],alias:{h:`help`,v:`version`,t:`template`,i:`immediate`},string:[`template`,`package-name`]},X=[{name:`vanilla`,display:`Vanilla`,color:J,variants:[{name:`vanilla-ts`,display:`TypeScript`,color:mt},{name:`vanilla`,display:`JavaScript`,color:J}]},{name:`vue`,display:`Vue`,color:pt,variants:[{name:`vue-ts`,display:`TypeScript`,color:mt},{name:`vue`,display:`JavaScript`,color:J},{name:`vue-dev`,display:`TypeScript + 工具链`,color:ht},{name:`custom-create-vue`,display:`Official Vue Starter ↗`,color:pt,customCommand:`npm create vue@latest TARGET_DIR`},{name:`custom-nuxt`,display:`Nuxt ↗`,link:`https://nuxt.com`,color:Y,customCommand:`npm exec nuxi init TARGET_DIR`},{name:`custom-vike-vue`,display:`Vike ↗`,link:`https://vike.dev`,color:Y,customCommand:`npm create -- vike@latest --vue TARGET_DIR`},{name:`custom-vitesse`,display:`Vitesse ↗`,link:`https://github.com/antfu-collective/vitesse`,color:Y,customCommand:`npm exec degit antfu-collective/vitesse TARGET_DIR`},{name:`custom-vitesse-lite`,display:`Vitesse Lite ↗`,link:`https://github.com/antfu-collective/vitesse-lite`,color:Y,customCommand:`npm exec degit antfu-collective/vitesse-lite TARGET_DIR`}]},{name:`lit`,display:`Lit`,color:gt,variants:[{name:`lit-ts`,display:`TypeScript`,color:mt},{name:`lit`,display:`JavaScript`,color:J}]}],yt=`\
58
58
  用法: @huberyyang/create-todo-vue [参数]... [目录]
59
59
 
60
60
  快速创建vue模板
@@ -68,4 +68,4 @@ ${t?s(`cyan`,H):``}
68
68
  --package-name 指定 package.json 的 name
69
69
 
70
70
  可用模板:
71
- ${ft(X)}`,yt=X.flatMap(e=>e.variants?.length?e.variants.map(e=>e.name):e.name),bt={_gitignore:`.gitignore`},xt=Symbol(`stdin-eof`);var St=class extends Error{step;hint;constructor(e,t){super(`需要交互才能继续:${e}`),this.step=e,this.hint=t,this.name=`NonInteractiveError`}};async function Z(e,t,n,i=r.stdin){let a=()=>{},o=new Promise(e=>{if(a=()=>e(xt),i.readableEnded){e(xt);return}i.once(`end`,a),i.once(`close`,a)});try{let r=await Promise.race([e,o]);if(r===xt)throw new St(t,n);return r}finally{i.off(`end`,a),i.off(`close`,a)}}function Ct(e){let r=n.resolve(e);for(;;){let e=n.join(r,`package.json`);if(t.existsSync(e))return e;let i=n.dirname(r);if(i===r)return;r=i}}function wt(e){let n=Ct(e);if(!n)return`unknown`;try{return JSON.parse(t.readFileSync(n,`utf-8`)).version??`unknown`}catch{return`unknown`}}function Tt(e){return e.trim().replace(/\/+$/g,``)}function Et(e){if(!e)return;let t=e.split(` `)[0].split(`/`);return{name:t[0],version:t[1]}}function Dt(){return Ve(`操作已取消`)}function Ot(e){return t.existsSync(e)?t.statSync(e).isDirectory()?`dir`:`file`:`missing`}function kt(e){let n=t.readdirSync(e);return n.length===0||n.length===1&&n[0]===`.git`}function At(e){if(!t.existsSync(e))return!1;for(let r of t.readdirSync(e))r!==`.git`&&t.rmSync(n.resolve(e,r),{recursive:!0,force:!0})}function jt(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function Mt(e){return e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+/g,`-`)}function Nt(e,t){let n=t?.name||`npm`,r=n===`yarn`&&t?.version?.startsWith(`1.`);return e.replace(/^npm create (?:-- )?/,()=>n===`bun`?`bun x create-`:n===`deno`?`deno run -A npm:create-`:n===`pnpm`?`pnpm create `:e.startsWith(`npm create -- `)?`${n} create -- `:`${n} create `).replace(`@latest`,r?``:`@latest`).replace(/^npm exec /,()=>n===`pnpm`?`pnpm dlx `:n===`yarn`&&!r?`yarn dlx `:n===`bun`?`bun x `:n===`deno`?`deno run -A npm:`:`npm exec `)}function Pt(e){let{display:t,name:n,color:r,link:i}=e,a=r(t||n);return i&&(a+=` ${(0,dt.underline)(i)}`),a}function Ft(e,r){t.mkdirSync(r,{recursive:!0});for(let i of t.readdirSync(e))It(n.resolve(e,i),n.resolve(r,i))}function It(e,n){t.statSync(e).isDirectory()?Ft(e,n):t.copyFileSync(e,n)}function Lt(e){return e===`yarn`?[e]:[e,`install`]}function Rt(e,t){return e===`yarn`?[e,t]:[e,`run`,t]}function zt([e,...t],n){let{status:r,error:i}=lt.default.sync(e,t,n);return i?(console.error(`\n${e} ${t.join(` `)} 跑不起来:${i.message}`),1):r??1}function Bt(e,t){return G.step(`使用 ${t} 安装依赖...`),zt(Lt(t),{stdio:`inherit`,cwd:e})}function Vt(e,t){return e&&!t.includes(e)?{template:void 0,invalid:!0}:{template:e,invalid:!1}}function Ht(e,t){let r=n.basename(n.resolve(t,e));return{name:r,needsPrompt:!jt(r)}}function Ut(e){return e===void 0||jt(e)}function Wt(e,t,n){return e===void 0?Ht(t,n):{name:e,needsPrompt:!1}}function Gt(e,t){let{customCommand:n}=e.flatMap(e=>e.variants?.length?e.variants:e).find(e=>e.name===t)??{};return n}function Kt(e,t){let[n,...r]=e.split(` `);return{command:n,args:r.map(e=>e.replace(`TARGET_DIR`,t))}}function qt(e,t){let n=e=>t[e]??e,r=e.filter(e=>e!==`package.json`).map(e=>({kind:e===`index.html`?`index-html`:`copy`,from:e,to:n(e)}));return r.push({kind:`package-json`,from:`package.json`,to:n(`package.json`)}),r}function Jt(e,t){return e.replace(/<title>.*?<\/title>/,`<title>${t}</title>`)}function Yt(e,t){let n=JSON.parse(e);return n.name=t,`${JSON.stringify(n,null,2)}\n`}function Xt(e,t,r,i=!1){let a=n.relative(e,t),o=i?`依赖安装完成,请执行:`:`创建完成,请执行:`;e!==t&&(o+=`\n cd ${a.includes(` `)?`"${a}"`:a}`);let s=i?Rt(r,`dev`):Lt(r);return o+=`\n ${s.join(` `)}`,o}function Zt(e){let t=e.alias??{};return[...new Set([...e.boolean??[],...e.string??[],...Object.values(t),...Object.keys(t)])]}function Qt(e,t){let n=new Set(t);return Object.keys(e).filter(e=>e!==`_`&&!n.has(e))}function $t({templateDir:e,root:r,packageName:i,renameFiles:a}){t.mkdirSync(r,{recursive:!0});let o=qt(t.readdirSync(e),a);for(let a of o){let o=n.join(e,a.from),s=n.join(r,a.to);switch(a.kind){case`index-html`:t.writeFileSync(s,Jt(t.readFileSync(o,`utf-8`),i));break;case`package-json`:t.writeFileSync(s,Yt(t.readFileSync(o,`utf-8`),i));break;case`copy`:It(o,s)}}}const en={intro:e=>He(e),outro:e=>Ue(e),write:e=>void r.stdout.write(e)};function tn(e=en){let t=!1,n=!1;return{open(r){e.intro(r),t=!0,n=!0},close(n=``){t&&(t=!1,e.outro(n))},markClosed(){t=!1},isOpen(){return t},restoreCursor(){n&&e.write(`\x1B[?25h`)}}}const nn=o(import.meta.url),rn=n.dirname(nn),an=n.resolve(nn,`../..`),on=Ge(),Q=tn();function $(){return Dt(),Q.markClosed(),1}async function sn(e=r.argv.slice(2)){let i=r.cwd(),a=(0,ut.default)(e,structuredClone(_t)),o=a._[0]?Tt(String(a._[0])):void 0,s=a.overwrite,c=a.template,l=a.immediate,u=a[`package-name`];if(a.help)return console.log(vt),0;if(a.version)return console.log(wt(rn)),0;let d=Qt(a,Zt(_t));if(d.length)return console.error(`未知参数:${d.map(e=>`--${e}`).join(`, `)}`),console.error(`运行 create-todo-vue --help 查看可用参数`),1;if(!Ut(u))return console.error(`无效的 package.json name:${u}`),console.error(`包名规则见 https://docs.npmjs.com/cli/configuring-npm/package-json#name`),1;Q.open(`create-todo-vue`);let f=Et(r.env.npm_config_user_agent),p=o;if(!p){let e=await Z(qe({message:`项目名称:`,defaultValue:gt,placeholder:gt,validate(e){return!e||Tt(e).length>0?void 0:`项目名称无效`}}),`项目名称`,`把项目名作为位置参数传入,如 create-todo-vue my-app`);if(P(e))return $();p=Tt(e)}let m=Wt(u,p,i),h=n.resolve(i,p),g=Ot(h);if(g===`file`){let e=!!s;if(!e){let t=await Z(q({message:`${p} 已存在且是一个文件,请选择如何继续`,options:[{label:`取消操作`,value:`no`},{label:`删除该文件并继续`,value:`yes`}]}),`${p} 已存在且是一个文件`,`--overwrite(会删除该文件)`);if(P(t))return $();e=t===`yes`}if(!e)return $();t.rmSync(h,{force:!0})}else if(g===`dir`&&!kt(h)){let e=s?`yes`:void 0;if(!e){let t=await Z(q({message:`${p===`.`?`当前目录`:`目标目录${p}`} 不为空,请选择如何继续`,options:[{label:`取消操作`,value:`no`},{label:`删除现有文件并继续`,value:`yes`},{label:`忽略文件并继续`,value:`ignore`}]}),`${p===`.`?`当前目录`:`目标目录${p}`} 不为空`,`--overwrite(会清空该目录,.git 保留)`);if(P(t))return $();e=t}switch(e){case`yes`:At(h);break;case`no`:return $()}}let _=m.name;if(m.needsPrompt){let e=await Z(qe({message:`请输入package.json name`,defaultValue:Mt(_),placeholder:Mt(_),validate(e){if(e&&!jt(e))return`无效的package.json name`}}),`package.json name`,`--package-name <name>`);if(P(e))return $();_=e}let{template:v,invalid:y}=Vt(c,yt),b=v;if(!b){let e=await Z(q({message:y?`${c}不是有效的模板名,请从以下选取:`:`选择模板`,options:X.map(e=>{let{color:t,name:n,display:r}=e;return{label:t(r||n),value:e}})}),`选择模板`,`-t <模板名>,可用模板见 --help`);if(P(e))return $();if(b=e.name,e.variants?.length){let t=await Z(q({message:`选择预设`,options:e.variants.map(e=>{let{name:t,customCommand:n}=e,r=n?Nt(n,f).replace(/ TARGET_DIR$/,``):void 0;return{label:Pt(e),value:t,hint:r}})}),`选择预设`,`-t <模板名>,可用模板见 --help`);if(P(t))return $();b=t}}let x=f?.name||`npm`,S=Gt(X,b);if(S){let{command:e,args:t}=Kt(Nt(S,f),p);Q.close(`转交给 ${e}`);let{status:n}=lt.default.sync(e,t,{stdio:`inherit`});return n??0}on.start(`正在${h}中创建模板`),$t({templateDir:n.resolve(an,`template-${b}`),root:h,packageName:_,renameFiles:bt}),on.stop(`模板创建成功`);let C=l;if(C===void 0){let e=await Z(Be({message:`是否立即使用${x}安装依赖?`}),`是否立即安装依赖`,`-i(装)或 --no-immediate(不装)`);if(P(e))return $();C=e}if(C){let e=Bt(h,x);if(e!==0)return G.warn(`项目已创建,但依赖没装上。${x} 退出码 ${e}`),G.info(Xt(i,h,x)),Q.close(`依赖安装失败`),e}return G.info(Xt(i,h,x,C)),Q.close(`程序结束`),0}async function cn(){r.exitCode=1;try{r.exitCode=await sn()}catch(e){if(e instanceof St){G.error(`需要交互才能继续,但输入已结束(非 TTY,或输入已读完)\n这一步在问:${e.step}\n非交互环境请改用:${e.hint}`),Dt(),Q.markClosed();return}on.error(`创建失败`),G.error(e instanceof Error?e.message:String(e)),Q.close(`已中止`),e instanceof Error&&e.stack&&console.error(e.stack),r.exitCode=1}finally{Q.close(),Q.restoreCursor()}}export{sn as main,cn as runCli};
71
+ ${ft(X)}`,bt=X.flatMap(e=>e.variants?.length?e.variants.map(e=>e.name):e.name),xt={_gitignore:`.gitignore`},St=Symbol(`stdin-eof`);var Ct=class extends Error{step;hint;constructor(e,t){super(`需要交互才能继续:${e}`),this.step=e,this.hint=t,this.name=`NonInteractiveError`}};async function Z(e,t,n,i=r.stdin){let a=()=>{},o=new Promise(e=>{if(a=()=>e(St),i.readableEnded){e(St);return}i.once(`end`,a),i.once(`close`,a)});try{let r=await Promise.race([e,o]);if(r===St)throw new Ct(t,n);return r}finally{i.off(`end`,a),i.off(`close`,a)}}function wt(e){let r=n.resolve(e);for(;;){let e=n.join(r,`package.json`);if(t.existsSync(e))return e;let i=n.dirname(r);if(i===r)return;r=i}}function Tt(e){let n=wt(e);if(!n)return`unknown`;try{return JSON.parse(t.readFileSync(n,`utf-8`)).version??`unknown`}catch{return`unknown`}}function Et(e){return e.trim().replace(/\/+$/g,``)}function Dt(e){if(!e)return;let t=e.split(` `)[0].split(`/`);return{name:t[0],version:t[1]}}function Ot(){return Ve(`操作已取消`)}function kt(e){return t.existsSync(e)?t.statSync(e).isDirectory()?`dir`:`file`:`missing`}function At(e){let n=t.readdirSync(e);return n.length===0||n.length===1&&n[0]===`.git`}function jt(e){if(!t.existsSync(e))return!1;for(let r of t.readdirSync(e))r!==`.git`&&t.rmSync(n.resolve(e,r),{recursive:!0,force:!0})}function Mt(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function Nt(e){return e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+/g,`-`)}function Pt(e,t){let n=t?.name||`npm`,r=n===`yarn`&&t?.version?.startsWith(`1.`);return e.replace(/^npm create (?:-- )?/,()=>n===`bun`?`bun x create-`:n===`deno`?`deno run -A npm:create-`:n===`pnpm`?`pnpm create `:e.startsWith(`npm create -- `)?`${n} create -- `:`${n} create `).replace(`@latest`,r?``:`@latest`).replace(/^npm exec /,()=>n===`pnpm`?`pnpm dlx `:n===`yarn`&&!r?`yarn dlx `:n===`bun`?`bun x `:n===`deno`?`deno run -A npm:`:`npm exec `)}function Ft(e){let{display:t,name:n,color:r,link:i}=e,a=r(t||n);return i&&(a+=` ${(0,dt.underline)(i)}`),a}function It(e,r){t.mkdirSync(r,{recursive:!0});for(let i of t.readdirSync(e))Lt(n.resolve(e,i),n.resolve(r,i))}function Lt(e,n){t.statSync(e).isDirectory()?It(e,n):t.copyFileSync(e,n)}function Rt(e){return e===`yarn`?[e]:[e,`install`]}function zt(e,t){return e===`yarn`?[e,t]:[e,`run`,t]}function Bt([e,...t],n){let{status:r,error:i}=lt.default.sync(e,t,n);return i?(console.error(`\n${e} ${t.join(` `)} 跑不起来:${i.message}`),1):r??1}function Vt(e,t){return G.step(`使用 ${t} 安装依赖...`),Bt(Rt(t),{stdio:`inherit`,cwd:e})}function Ht(e){let r=n.resolve(e);for(;;){let e=n.join(r,`.git`);if(t.existsSync(e))return e;let i=n.dirname(r);if(i===r)return;r=i}}function Ut(e){return Bt([`git`,`init`],{stdio:`ignore`,cwd:e})}function Wt(e,t){return e&&!t.includes(e)?{template:void 0,invalid:!0}:{template:e,invalid:!1}}function Gt(e,t){let r=n.basename(n.resolve(t,e));return{name:r,needsPrompt:!Mt(r)}}function Kt(e){return e===void 0||Mt(e)}function qt(e,t,n){return e===void 0?Gt(t,n):{name:e,needsPrompt:!1}}function Jt(e,t){let{customCommand:n}=e.flatMap(e=>e.variants?.length?e.variants:e).find(e=>e.name===t)??{};return n}function Yt(e,t){let[n,...r]=e.split(` `);return{command:n,args:r.map(e=>e.replace(`TARGET_DIR`,t))}}function Xt(e,t){let n=e=>t[e]??e,r=e.filter(e=>e!==`package.json`).map(e=>({kind:e===`index.html`?`index-html`:`copy`,from:e,to:n(e)}));return r.push({kind:`package-json`,from:`package.json`,to:n(`package.json`)}),r}function Zt(e,t){return e.replace(/<title>.*?<\/title>/,`<title>${t}</title>`)}function Qt(e,t){let n=JSON.parse(e);return n.name=t,`${JSON.stringify(n,null,2)}\n`}function $t(e,t,r,i=!1){let a=n.relative(e,t),o=i?`依赖安装完成,请执行:`:`创建完成,请执行:`;e!==t&&(o+=`\n cd ${a.includes(` `)?`"${a}"`:a}`);let s=i?zt(r,`dev`):Rt(r);return o+=`\n ${s.join(` `)}`,o}function en(e){let t=e.alias??{};return[...new Set([...e.boolean??[],...e.string??[],...Object.values(t),...Object.keys(t)])]}function tn(e,t){let n=new Set(t);return Object.keys(e).filter(e=>e!==`_`&&!n.has(e))}function nn({templateDir:e,root:r,packageName:i,renameFiles:a}){t.mkdirSync(r,{recursive:!0});let o=Xt(t.readdirSync(e),a);for(let a of o){let o=n.join(e,a.from),s=n.join(r,a.to);switch(a.kind){case`index-html`:t.writeFileSync(s,Zt(t.readFileSync(o,`utf-8`),i));break;case`package-json`:t.writeFileSync(s,Qt(t.readFileSync(o,`utf-8`),i));break;case`copy`:Lt(o,s)}}}const rn={intro:e=>He(e),outro:e=>Ue(e),write:e=>void r.stdout.write(e)};function an(e=rn){let t=!1,n=!1;return{open(r){e.intro(r),t=!0,n=!0},close(n=``){t&&(t=!1,e.outro(n))},markClosed(){t=!1},isOpen(){return t},restoreCursor(){n&&e.write(`\x1B[?25h`)}}}const on=o(import.meta.url),sn=n.dirname(on),cn=n.resolve(on,`../..`),ln=Ge(),Q=an();function $(){return Ot(),Q.markClosed(),1}async function un(e=r.argv.slice(2)){let i=r.cwd(),a=(0,ut.default)(e,structuredClone(vt)),o=a._[0]?Et(String(a._[0])):void 0,s=a.overwrite,c=a.template,l=a.immediate,u=a[`package-name`];if(a.help)return console.log(yt),0;if(a.version)return console.log(Tt(sn)),0;let d=tn(a,en(vt));if(d.length)return console.error(`未知参数:${d.map(e=>`--${e}`).join(`, `)}`),console.error(`运行 create-todo-vue --help 查看可用参数`),1;if(!Kt(u))return console.error(`无效的 package.json name:${u}`),console.error(`包名规则见 https://docs.npmjs.com/cli/configuring-npm/package-json#name`),1;Q.open(`create-todo-vue`);let f=Dt(r.env.npm_config_user_agent),p=o;if(!p){let e=await Z(qe({message:`项目名称:`,defaultValue:_t,placeholder:_t,validate(e){return!e||Et(e).length>0?void 0:`项目名称无效`}}),`项目名称`,`把项目名作为位置参数传入,如 create-todo-vue my-app`);if(P(e))return $();p=Et(e)}let m=qt(u,p,i),h=n.resolve(i,p),g=kt(h);if(g===`file`){let e=!!s;if(!e){let t=await Z(q({message:`${p} 已存在且是一个文件,请选择如何继续`,options:[{label:`取消操作`,value:`no`},{label:`删除该文件并继续`,value:`yes`}]}),`${p} 已存在且是一个文件`,`--overwrite(会删除该文件)`);if(P(t))return $();e=t===`yes`}if(!e)return $();t.rmSync(h,{force:!0})}else if(g===`dir`&&!At(h)){let e=s?`yes`:void 0;if(!e){let t=await Z(q({message:`${p===`.`?`当前目录`:`目标目录${p}`} 不为空,请选择如何继续`,options:[{label:`取消操作`,value:`no`},{label:`删除现有文件并继续`,value:`yes`},{label:`忽略文件并继续`,value:`ignore`}]}),`${p===`.`?`当前目录`:`目标目录${p}`} 不为空`,`--overwrite(会清空该目录,.git 保留)`);if(P(t))return $();e=t}switch(e){case`yes`:jt(h);break;case`no`:return $()}}let _=m.name;if(m.needsPrompt){let e=await Z(qe({message:`请输入package.json name`,defaultValue:Nt(_),placeholder:Nt(_),validate(e){if(e&&!Mt(e))return`无效的package.json name`}}),`package.json name`,`--package-name <name>`);if(P(e))return $();_=e}let{template:v,invalid:y}=Wt(c,bt),b=v;if(!b){let e=await Z(q({message:y?`${c}不是有效的模板名,请从以下选取:`:`选择模板`,options:X.map(e=>{let{color:t,name:n,display:r}=e;return{label:t(r||n),value:e}})}),`选择模板`,`-t <模板名>,可用模板见 --help`);if(P(e))return $();if(b=e.name,e.variants?.length){let t=await Z(q({message:`选择预设`,options:e.variants.map(e=>{let{name:t,customCommand:n}=e,r=n?Pt(n,f).replace(/ TARGET_DIR$/,``):void 0;return{label:Ft(e),value:t,hint:r}})}),`选择预设`,`-t <模板名>,可用模板见 --help`);if(P(t))return $();b=t}}let x=f?.name||`npm`,S=Jt(X,b);if(S){let{command:e,args:t}=Yt(Pt(S,f),p);Q.close(`转交给 ${e}`);let{status:n}=lt.default.sync(e,t,{stdio:`inherit`});return n??0}if(ln.start(`正在${h}中创建模板`),nn({templateDir:n.resolve(cn,`template-${b}`),root:h,packageName:_,renameFiles:xt}),ln.stop(`模板创建成功`),Ht(h))G.info(`目标目录已在 git 仓库中,跳过 git init`);else{let e=Ut(h);e!==0&&G.warn(`git 仓库初始化失败(git 退出码 ${e}),项目已创建`)}let C=l;if(C===void 0){let e=await Z(Be({message:`是否立即使用${x}安装依赖?`}),`是否立即安装依赖`,`-i(装)或 --no-immediate(不装)`);if(P(e))return $();C=e}if(C){let e=Vt(h,x);if(e!==0)return G.warn(`项目已创建,但依赖没装上。${x} 退出码 ${e}`),G.info($t(i,h,x)),Q.close(`依赖安装失败`),e}return G.info($t(i,h,x,C)),Q.close(`程序结束`),0}async function dn(){r.exitCode=1;try{r.exitCode=await un()}catch(e){if(e instanceof Ct){G.error(`需要交互才能继续,但输入已结束(非 TTY,或输入已读完)\n这一步在问:${e.step}\n非交互环境请改用:${e.hint}`),Ot(),Q.markClosed();return}ln.error(`创建失败`),G.error(e instanceof Error?e.message:String(e)),Q.close(`已中止`),e instanceof Error&&e.stack&&console.error(e.stack),r.exitCode=1}finally{Q.close(),Q.restoreCursor()}}export{un as main,dn as runCli};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@huberyyang/create-todo-vue",
3
3
  "type": "module",
4
- "version": "1.6.1",
4
+ "version": "1.8.0",
5
5
  "packageManager": "pnpm@11.25.0",
6
6
  "description": "💡 create vue projects with awesome templates",
7
7
  "author": "HuberyYang",
@@ -0,0 +1 @@
1
+ # lit
@@ -0,0 +1 @@
1
+ # lit-ts
@@ -0,0 +1 @@
1
+ # vanilla
@@ -0,0 +1 @@
1
+ # vanilla-ts
@@ -1,5 +1 @@
1
- # Vue 3 + Vite
2
-
3
- This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
4
-
5
- Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).
1
+ # vue
@@ -0,0 +1 @@
1
+ pnpm exec commitlint --edit "$1"
@@ -0,0 +1 @@
1
+ pnpm exec lint-staged
@@ -0,0 +1,3 @@
1
+ {
2
+ "recommendations": ["Vue.volar"]
3
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ // Disable the default formatter, use eslint instead
3
+ "prettier.enable": false,
4
+ "editor.formatOnSave": false,
5
+
6
+ // Auto fix
7
+ "editor.codeActionsOnSave": {
8
+ "source.fixAll.eslint": "explicit",
9
+ "source.organizeImports": "never"
10
+ },
11
+
12
+ // Silent the stylistic rules in your IDE, but still auto fix them
13
+ "eslint.rules.customizations": [
14
+ { "rule": "style/*", "severity": "off", "fixable": true },
15
+ { "rule": "format/*", "severity": "off", "fixable": true },
16
+ { "rule": "*-indent", "severity": "off", "fixable": true },
17
+ { "rule": "*-spacing", "severity": "off", "fixable": true },
18
+ { "rule": "*-spaces", "severity": "off", "fixable": true },
19
+ { "rule": "*-order", "severity": "off", "fixable": true },
20
+ { "rule": "*-dangle", "severity": "off", "fixable": true },
21
+ { "rule": "*-newline", "severity": "off", "fixable": true },
22
+ { "rule": "*quotes", "severity": "off", "fixable": true },
23
+ { "rule": "*semi", "severity": "off", "fixable": true }
24
+ ],
25
+
26
+ // Enable eslint for all supported languages
27
+ "eslint.validate": [
28
+ "javascript",
29
+ "javascriptreact",
30
+ "typescript",
31
+ "typescriptreact",
32
+ "vue",
33
+ "html",
34
+ "markdown",
35
+ "json",
36
+ "jsonc",
37
+ "yaml",
38
+ "toml",
39
+ "xml",
40
+ "gql",
41
+ "graphql",
42
+ "astro",
43
+ "svelte",
44
+ "css",
45
+ "less",
46
+ "scss",
47
+ "pcss",
48
+ "postcss"
49
+ ]
50
+ }
@@ -0,0 +1 @@
1
+ # vue-dev
@@ -0,0 +1,24 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ # .vscode/*
17
+ # !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?