create-rubyonly 1.0.0 → 1.0.3

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 CHANGED
@@ -1,105 +1,3 @@
1
1
  # create-rubyonly
2
2
 
3
- 基于 Rubyonly 预设模板的快速项目脚手架工具。
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:`ReactA`,desc:`ReactB`,color:y.default.cyan,dir:`react-template`},{name:`Vue`,desc:`Vue`,color:y.default.green,dir:`vue-template`},{name:`Uniapp`,desc:`Uniapp`,color:y.default.blue,dir:`uniapp-template`},{name:`React Native`,desc:`React Native`,color:y.default.red,dir:`react-native-template`},{name:`React Admin`,desc:`React Admin`,color:y.default.yellow,dir:`react-admin-template`},{name:`Vue Admin`,desc:`Vue3 Admin`,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=`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.cyan(`RUBY`))+y.default.bold(y.default.magenta(`ONLY`))+` `+y.default.dim(y.default.white(`v1.0.0`))+` `+y.default.cyan(`║`)),console.log(y.default.cyan(`║`)+` `+y.default.green(`🚀 Quickly build project templates 🎨 !`)+` `+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:`Please enter the project name:`,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.desc),value:e.name,hint:e.name}))});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:`local 本地模板(快速,无需网络)`},{label:y.default.green(`🌐 远程拉取`),value:`remote`,hint:`remote 远程拉取(最新版本,需要网络)`}]});if(A(e))return X();g=e}let _=a.join(Q,d);if(i.mkdirSync(_,{recursive:!0}),G.step(` ✨✨✨ Creating project ${_} Please wait... 🚀 `),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=``,t=a.relative(Q,_);e+=`✅✅✅Done. Now run:
76
- `,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(`
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.desc),value:e.name,hint:e.name}))});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{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-rubyonly",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "create modern frontend projects quickly",
5
5
  "type": "module",
6
6
  "bin": {