create-rubyonly 1.0.0 → 1.0.4
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/README.md +1 -103
- package/dist/index.mjs +6 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,105 +1,3 @@
|
|
|
1
1
|
# create-rubyonly
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## 使用方法
|
|
6
|
-
|
|
7
|
-
### 交互式创建
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm create rubyonly@latest
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
然后按照提示操作:
|
|
14
|
-
|
|
15
|
-
1. 输入项目名称
|
|
16
|
-
2. 选择项目模板类型
|
|
17
|
-
3. 等待项目创建
|
|
18
|
-
4. 创建完成
|
|
19
|
-
5. cd到目标项目目录
|
|
20
|
-
6. 执行npm install && npm run dev
|
|
21
|
-
|
|
22
|
-
### 指定项目名称
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm create rubyonly@latest my-app
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 使用指定模板
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# 使用 React 模板
|
|
32
|
-
npm create rubyonly@latest my-app --template react
|
|
33
|
-
|
|
34
|
-
# 使用 Vue3 模板
|
|
35
|
-
npm create rubyonly@latest my-app --template vue
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## 可用模板
|
|
39
|
-
|
|
40
|
-
- **react**: React + TypeScript + Vite
|
|
41
|
-
- **vue**: Vue3 + TypeScript + Vite
|
|
42
|
-
|
|
43
|
-
## 命令行参数
|
|
44
|
-
|
|
45
|
-
- `-t, --template <name>` - 使用指定模板
|
|
46
|
-
- `-h, --help` - 显示帮助信息
|
|
47
|
-
- `--overwrite` - 强制覆盖已存在的目录
|
|
48
|
-
|
|
49
|
-
## 开发
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
# 构建(打包成单文件)
|
|
53
|
-
pnpm build
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## 发布
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
cd packages/create-app
|
|
60
|
-
|
|
61
|
-
# 构建并准备发布(会自动复制模板)
|
|
62
|
-
npm run prepublishOnly
|
|
63
|
-
|
|
64
|
-
# 或者直接发布(prepublishOnly 会自动执行)
|
|
65
|
-
npm publish
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**注意**: `prepublishOnly` 钩子会自动:
|
|
69
|
-
|
|
70
|
-
1. 使用 tsdown 打包代码到 `index.js`
|
|
71
|
-
2. 运行 `scripts/copy-templates.js` 从根目录复制 `templates/` 到当前目录
|
|
72
|
-
|
|
73
|
-
**手动复制模板** (用于测试):
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
npm run copy-templates
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 技术架构
|
|
80
|
-
|
|
81
|
-
- **构建工具**: tsdown(和 create-vite 一致)
|
|
82
|
-
- **打包方式**: 将所有依赖打包成单个 `index.js` 文件
|
|
83
|
-
- **优势**:
|
|
84
|
-
- 启动速度快(单文件加载)
|
|
85
|
-
- 包体积小(无需 node_modules)
|
|
86
|
-
- 所有依赖在 devDependencies
|
|
87
|
-
|
|
88
|
-
## 注意事项
|
|
89
|
-
|
|
90
|
-
1. 模板文件存放在 `templates/` 目录下
|
|
91
|
-
2. 发布时会将 `templates/` 目录和打包后的 `index.js` 一起发布
|
|
92
|
-
3. 需要 Node.js >= 18.0.0
|
|
93
|
-
4. 使用 tsdown 将所有运行时依赖打包进单个文件
|
|
94
|
-
|
|
95
|
-
## 扩展安装功能(可选)
|
|
96
|
-
|
|
97
|
-
如果需要启用"安装依赖"功能,请:
|
|
98
|
-
|
|
99
|
-
1. 打开 `src/index.ts` 文件
|
|
100
|
-
2. 找到第 151-180 行左右的注释代码块(搜索 "步骤 5")
|
|
101
|
-
3. 取消注释该代码块
|
|
102
|
-
4. 取消文件顶部 `spawn` 导入的注释(第 8 行)
|
|
103
|
-
5. 重新构建项目
|
|
104
|
-
|
|
105
|
-
启用后会询问用户是否立即安装依赖,选择 yes 会使用 npm 自动安装。
|
|
3
|
+
Quickly create front-end project templates based on Rubyonly!
|
package/dist/index.mjs
CHANGED
|
@@ -45,8 +45,8 @@ ${ze}`),t.includes(`
|
|
|
45
45
|
`)&&(n=3+s(t.slice(t.lastIndexOf(`
|
|
46
46
|
`))).length);let e=s(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
47
47
|
${ze}${t.trimStart()}`),n=3+s(t.trimStart()).length)}process.stdout.write(`
|
|
48
|
-
`)},info:e=>K.message(e,{symbol:y.default.blue(Me)}),success:e=>K.message(e,{symbol:y.default.green(Ne)}),step:e=>K.message(e,{symbol:y.default.green(I)}),warn:e=>K.message(e,{symbol:y.default.yellow(Pe)}),warning:e=>K.warn(e),error:e=>K.message(e,{symbol:y.default.red(V)})},q=[{name:`
|
|
49
|
-
`)}function lt(e,t){switch(e){case`yarn`:case`pnpm`:case`bun`:return[e,t];case`deno`:return[e,`task`,t];default:return[e,`run`,t]}}function ut(e){return e===`yarn`?[e]:[e,`install`]}function dt([e,...t],n){let{status:r,error:i}=$e.spawn.sync(e,t,n);r!=null&&r>0&&process.exit(r),i&&(console.error(`\n${e} ${t.join(` `)} error!`),console.error(i),process.exit(1))}function ft(e,t){if(process.env._VITE_TEST_CLI){G.step(`使用 ${t} 安装依赖... (跳过测试)`);return}G.step(`使用 ${t} 安装依赖...`),dt(ut(t),{stdio:`inherit`,cwd:e})}function pt(e,t){if(process.env._VITE_TEST_CLI){G.step(`启动开发服务器... (跳过测试)`);return}G.step(`启动开发服务器...`),dt(lt(t,`dev`),{stdio:`inherit`,cwd:e})}async function mt(e,t,n){let r=`rubyonly-x/rubyonly-monorepo/templates/${e}#main`,o=t;try{G.info(`🔄 正在从远程拉取模板: ${r} 🚀🚀🚀`);let e=et(r,{cache:!1,force:!0,verbose:!1});e.on(`info`,e=>{G.step(e.message)}),await e.clone(t);let s=a.join(o,`package.json`);if(i.existsSync(s)){let e=JSON.parse(i.readFileSync(s,`utf-8`));e.name=n,i.writeFileSync(s,JSON.stringify(e,null,2)+`
|
|
48
|
+
`)},info:e=>K.message(e,{symbol:y.default.blue(Me)}),success:e=>K.message(e,{symbol:y.default.green(Ne)}),step:e=>K.message(e,{symbol:y.default.green(I)}),warn:e=>K.message(e,{symbol:y.default.yellow(Pe)}),warning:e=>K.warn(e),error:e=>K.message(e,{symbol:y.default.red(V)})},q=[{name:`React`,desc:` Vite + React + TypeScript (H5) `,color:y.default.cyan,dir:`react-template`},{name:`Vue`,desc:` Vite + Vue3 + TypeScript (H5) `,color:y.default.green,dir:`vue-template`},{name:`Uniapp`,desc:` Vite + Uniapp + TypeScript `,color:y.default.blue,dir:`uniapp-template`},{name:`React Native`,desc:` Expo + React Native + TypeScript `,color:y.default.red,dir:`react-native-template`},{name:`React Web`,desc:` Vite + React + TypeScript (PC) `,color:y.default.yellow,dir:`react-web-template`},{name:`Vue Web`,desc:` Vite + Vue3 + TypeScript (PC) `,color:y.default.magenta,dir:`vue-web-template`},{name:`React Admin`,desc:` Vite + React + TypeScript (中台版) `,color:y.default.yellow,dir:`react-admin-template`},{name:`Vue Admin`,desc:` Vite + Vue3 + TypeScript (中台版) `,color:y.default.magenta,dir:`vue-admin-template`}],Be=q.map(e=>e.name);var Ve=r(((e,n)=>{n.exports=o,o.sync=s;var r=t(`fs`);function i(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 a(e,t,n){return!e.isSymbolicLink()&&!e.isFile()?!1:i(t,n)}function o(e,t,n){r.stat(e,function(r,i){n(r,r?!1:a(i,e,t))})}function s(e,t){return a(r.statSync(e),e,t)}})),He=r(((e,n)=>{n.exports=i,i.sync=a;var r=t(`fs`);function i(e,t,n){r.stat(e,function(e,r){n(e,e?!1:o(r,t))})}function a(e,t){return o(r.statSync(e),t)}function o(e,t){return e.isFile()&&s(e,t)}function s(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}})),Ue=r(((e,n)=>{t(`fs`);var r=process.platform===`win32`||global.TESTING_WINDOWS?Ve():He();n.exports=i,i.sync=a;function i(e,t,n){if(typeof t==`function`&&(n=t,t={}),!n){if(typeof Promise!=`function`)throw TypeError(`callback not provided`);return new Promise(function(n,r){i(e,t||{},function(e,t){e?r(e):n(t)})})}r(e,t||{},function(e,r){e&&(e.code===`EACCES`||t&&t.ignoreErrors)&&(e=null,r=!1),n(e,r)})}function a(e,t){try{return r.sync(e,t||{})}catch(e){if(t&&t.ignoreErrors||e.code===`EACCES`)return!1;throw e}}})),We=r(((e,n)=>{let r=process.platform===`win32`||process.env.OSTYPE===`cygwin`||process.env.OSTYPE===`msys`,i=t(`path`),a=r?`;`:`:`,o=Ue(),s=e=>Object.assign(Error(`not found: ${e}`),{code:`ENOENT`}),c=(e,t)=>{let n=t.colon||a,i=e.match(/\//)||r&&e.match(/\\/)?[``]:[...r?[process.cwd()]:[],...(t.path||process.env.PATH||``).split(n)],o=r?t.pathExt||process.env.PATHEXT||`.EXE;.CMD;.BAT;.COM`:``,s=r?o.split(n):[``];return r&&e.indexOf(`.`)!==-1&&s[0]!==``&&s.unshift(``),{pathEnv:i,pathExt:s,pathExtExe:o}},l=(e,t,n)=>{typeof t==`function`&&(n=t,t={}),t||={};let{pathEnv:r,pathExt:a,pathExtExe:l}=c(e,t),u=[],d=n=>new Promise((a,o)=>{if(n===r.length)return t.all&&u.length?a(u):o(s(e));let c=r[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=i.join(l,e);a(f(!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d,n,0))}),f=(e,n,r)=>new Promise((i,s)=>{if(r===a.length)return i(d(n+1));let c=a[r];o(e+c,{pathExt:l},(a,o)=>{if(!a&&o)if(t.all)u.push(e+c);else return i(e+c);return i(f(e,n,r+1))})});return n?d(0).then(e=>n(null,e),n):d(0)};n.exports=l,l.sync=(e,t)=>{t||={};let{pathEnv:n,pathExt:r,pathExtExe:a}=c(e,t),l=[];for(let s=0;s<n.length;s++){let c=n[s],u=/^".*"$/.test(c)?c.slice(1,-1):c,d=i.join(u,e),f=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<r.length;e++){let n=f+r[e];try{if(o.sync(n,{pathExt:a}))if(t.all)l.push(n);else return n}catch{}}}if(t.all&&l.length)return l;if(t.nothrow)return null;throw s(e)}})),Ge=r(((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})),Ke=r(((e,n)=>{let r=t(`path`),i=We(),a=Ge();function o(e,t){let n=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=i.sync(e.command,{path:n[a({env:n})],pathExt:t?r.delimiter:void 0})}catch{}finally{c&&process.chdir(o)}return l&&=r.resolve(s?e.options.cwd:``,l),l}function s(e){return o(e)||o(e,!0)}n.exports=s})),qe=r(((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})),Je=r(((e,t)=>{t.exports=/^#!(.*)/})),Ye=r(((e,t)=>{let n=Je();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}})),Xe=r(((e,n)=>{let r=t(`fs`),i=Ye();function a(e){let t=Buffer.alloc(150),n;try{n=r.openSync(e,`r`),r.readSync(n,t,0,150,0),r.closeSync(n)}catch{}return i(t.toString())}n.exports=a})),Ze=r(((e,n)=>{let r=t(`path`),i=Ke(),a=qe(),o=Xe(),s=process.platform===`win32`,c=/\.(?:com|exe)$/i,l=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function u(e){e.file=i(e);let t=e.file&&o(e.file);return t?(e.args.unshift(e.file),e.command=t,i(e)):e.file}function d(e){if(!s)return e;let t=u(e),n=!c.test(t);if(e.options.forceShell||n){let n=l.test(t);e.command=r.normalize(e.command),e.command=a.command(e.command),e.args=e.args.map(e=>a.argument(e,n)),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 f(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:d(r)}n.exports=f})),Qe=r(((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}})),$e=r(((e,n)=>{let r=t(`child_process`),i=Ze(),a=Qe();function o(e,t,n){let o=i(e,t,n),s=r.spawn(o.command,o.args,o.options);return a.hookChildProcess(s,o),s}function s(e,t,n){let o=i(e,t,n),s=r.spawnSync(o.command,o.args,o.options);return s.error=s.error||a.verifyENOENTSync(s.status,o),s}n.exports=o,n.exports.spawn=o,n.exports.sync=s,n.exports._parse=i,n.exports._enoent=a}))();const et=await import(`./dist-CXwjh78A.mjs`).then(n(1));function tt(e){if(!e)return;let t=e.split(` `)[0].split(`/`);return{name:t[0],version:t[1]}}function J(e){return e.trim().replace(/\/+$/g,``)}function nt(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function Y(e){return e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+/g,`-`)}function rt(e){let t=i.readdirSync(e);return t.length===0||t.length===1&&t[0]===`.git`}function it(e){if(i.existsSync(e))for(let t of i.readdirSync(e))t!==`.git`&&i.rmSync(a.resolve(e,t),{recursive:!0,force:!0})}const at={_gitignore:`.gitignore`};function ot(e,t){i.statSync(e).isDirectory()?st(e,t):i.copyFileSync(e,t)}function st(e,t){i.mkdirSync(t,{recursive:!0});for(let n of i.readdirSync(e))ot(a.resolve(e,n),a.resolve(t,n))}function ct(e,t,n){let r=(r,o)=>{let s=a.join(e,at[r]??r);if(o)i.writeFileSync(s,o);else if(r===`index.html`){let e=a.join(t,r),o=i.readFileSync(e,`utf-8`).replace(/<title>.*?<\/title>/,`<title>${n}</title>`);i.writeFileSync(s,o)}else ot(a.join(t,r),s)},o=i.readdirSync(t);for(let e of o.filter(e=>e!==`package.json`))r(e);let s=JSON.parse(i.readFileSync(a.join(t,`package.json`),`utf-8`));s.name=n,r(`package.json`,JSON.stringify(s,null,2)+`
|
|
49
|
+
`)}function lt(e,t){switch(e){case`yarn`:case`pnpm`:case`bun`:return[e,t];case`deno`:return[e,`task`,t];default:return[e,`run`,t]}}function ut(e){return e===`yarn`?[e]:[e,`install`]}function dt([e,...t],n){let{status:r,error:i}=$e.spawn.sync(e,t,n);r!=null&&r>0&&process.exit(r),i&&(console.error(`\n${e} ${t.join(` `)} error!`),console.error(i),process.exit(1))}function ft(e,t){if(process.env._VITE_TEST_CLI){G.step(`使用 ${t} 安装依赖... (跳过测试)`);return}G.step(`使用 ${t} 安装依赖...`),dt(ut(t),{stdio:`inherit`,cwd:e})}function pt(e,t){if(process.env._VITE_TEST_CLI){G.step(`启动开发服务器... (跳过测试)`);return}G.step(`启动开发服务器...`),dt(lt(t,`dev`),{stdio:`inherit`,cwd:e})}async function mt(e,t,n){let r=`github:rubyonly-x/rubyonly-monorepo/templates/${e}#main`,o=t;try{G.info(`🔄 正在从远程拉取模板: ${r} 🚀🚀🚀`);let e=et(r,{cache:!1,force:!0,verbose:!1});e.on(`info`,e=>{G.step(e.message)}),await e.clone(t);let s=a.join(o,`package.json`);if(i.existsSync(s)){let e=JSON.parse(i.readFileSync(s,`utf-8`));e.name=n,i.writeFileSync(s,JSON.stringify(e,null,2)+`
|
|
50
50
|
`)}let c=a.join(o,`index.html`);if(i.existsSync(c)){let e=i.readFileSync(c,`utf-8`).replace(/<title>.*?<\/title>/,`<title>${n}</title>`);i.writeFileSync(c,e)}G.success(`✅模板拉取成功 🎉✨🎉`)}catch(e){let t=`从 ${r} 拉取模板失败`;throw e instanceof Error&&(e.message.includes(`could not find commit hash`)?t+=`: 未找到指定的分支、标签或提交`:e.message.includes(`not found`)||e.message.includes(`404`)?t+=`: 仓库或路径不存在`:e.message.includes(`timeout`)||e.message.includes(`ETIMEDOUT`)?t+=`: 网络超时,请检查网络连接`:t+=`: ${e.message}`),Error(t)}}const X=()=>Le(`operation cancelled by user`);function ht(){console.log(`
|
|
51
51
|
${y.default.bold(`使用方法:`)} npm create rubyonly@latest [项目名称] [选项]
|
|
52
52
|
|
|
@@ -71,8 +71,8 @@ ${ze}${t.trimStart()}`),n=3+s(t.trimStart()).length)}process.stdout.write(`
|
|
|
71
71
|
${y.default.dim(`# 指定项目名称和模板`)}
|
|
72
72
|
npm create rubyonly@latest my-app --template React
|
|
73
73
|
`)}const Z=(0,_.default)(process.argv.slice(2),{boolean:[`help`,`overwrite`],alias:{t:`template`,h:`help`,i:`overwrite`},string:[`template`]}),Q=process.cwd(),$=`my-app`;async function gt(){let e=Z._[0]?J(String(Z._[0])):void 0,t=Z.template,n=Z.overwrite,r=Z.immediate,s=Z.interactive;if(Z.help){ht();return}let c=s??process.stdin.isTTY;console.log(`
|
|
74
|
-
`),console.log(y.default.cyan(`╔════════════════════════════════════════╗`)),console.log(y.default.cyan(`║`)+` `+y.default.bold(y.default.
|
|
75
|
-
`);let l=tt(process.env.npm_config_user_agent),u=l?l.name:`npm`,d=e;if(!d)if(c){let e=await U({message
|
|
76
|
-
`,console.log(`
|
|
77
|
-
`),console.log(y.default.green(
|
|
74
|
+
`),console.log(y.default.cyan(`╔════════════════════════════════════════╗`)),console.log(y.default.cyan(`║`)+` `+y.default.bold(y.default.blue(`WELCOME TO RUBYONLY`))+` `+y.default.dim(y.default.white(`v1.0.0`))+` `+y.default.cyan(`║`)),console.log(y.default.cyan(`║`)+` `+y.default.green(`欢迎使用rubyonly cli快速创建前端项目`)+` `+y.default.cyan(`║`)),console.log(y.default.cyan(`╚════════════════════════════════════════╝`)),console.log(`
|
|
75
|
+
`);let l=tt(process.env.npm_config_user_agent),u=l?l.name:`npm`,d=e;if(!d)if(c){let e=await U({message:`请输入您的项目名称:`,defaultValue:$,placeholder:$,validate:e=>e.length===0||J(e).length>0?void 0:`Invalid project name`});if(A(e))return X();d=J(e)}else d=$;if(i.existsSync(d)&&!rt(d)){let e=n?`yes`:void 0;if(!e)if(c){let t=await W({message:(d===`.`?`当前目录`:`目录 "${d}"`)+`已存在且不为空,请选择如何继续:`,options:[{label:`取消操作`,value:`no`},{label:`删除现有文件并继续`,value:`yes`},{label:`忽略文件并继续`,value:`ignore`}]});if(A(t))return X();e=t}else e=`no`;switch(e){case`yes`:it(d);break;case`no`:X();return}}let f=a.basename(a.resolve(d));if(!nt(f))if(c){let e=await U({message:`Please enter the package name:`,defaultValue:Y(f),placeholder:Y(f),validate(e){if(!nt(e))return`Invalid package name !`}});if(A(e))return X();f=e}else f=Y(f);let p=t,m=!1;if(t&&!Be.includes(t)&&(p=void 0,m=!0),!p)if(c){let e=await W({message:m?`"${t}" 不在提供的有效模板中,请选择以下模板: `:`请选择模板类型:`,options:q.map(e=>({label:e.color(e.name),value:e.name,hint:e.desc}))});if(A(e))return X();p=e}else p=q[0].name;let h=q.find(e=>e.name===p);if(!h)throw Error(`Template "${p}" not found`);let g=`local`;if(c){let e=await W({message:`请选择模板创建方式:`,options:[{label:y.default.cyan(`📦 本地模板 推荐使用`),value:`local`,hint:`本地拉取NPM包内置模板`},{label:y.default.green(`🌐 远程拉取 暂时不可用`),value:`remote`,hint:`远程拉取GitHub最新版本 请勿选择 暂时不可用`}]});if(A(e))return X();g=e}let _=a.join(Q,d);if(i.mkdirSync(_,{recursive:!0}),G.step(` ✨ 请稍等 ${_} 正在创建中 🚀 `),g===`remote`)try{await mt(h.dir,_,f)}catch(e){G.error(`创建项目失败: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}else ct(_,a.resolve(o(import.meta.url),`../..`,`templates`,h.dir),f);let v=r;if(v===void 0)if(c){let e=await Ie({message:`Install with ${u} and start now?`});if(A(e))return X();v=e}else v=!1;if(v)ft(_,u),pt(_,u);else{let e=`✅Done. Now run:
|
|
76
|
+
`,t=a.relative(Q,_);console.log(`
|
|
77
|
+
`),console.log(y.default.green(`┌──────────────────────────────────────────────┐`)),console.log(y.default.green(`│`)+` `+y.default.bold(y.default.green(`🎉 🎉 🎉 project created successfully! `))+y.default.yellow(``)+` `+y.default.green(`│`)),console.log(y.default.green(`└──────────────────────────────────────────────┘`)),console.log(`
|
|
78
78
|
`),_!==Q&&(e+=`\n cd ${t.includes(` `)?`"${t}"`:t}`),e+=`\n ${ut(u).join(` `)}`,e+=`\n ${lt(u,`dev`).join(` `)}`,Re(e)}}gt().catch(e=>{G.error(e instanceof Error?e.message:String(e)),process.exit(1)});export{};
|