@tomjs/create-app 1.7.0 → 2.0.1

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 (262) hide show
  1. package/README.md +14 -21
  2. package/README.zh_CN.md +14 -21
  3. package/dist/index.js +9 -22
  4. package/package.json +49 -52
  5. package/templates/{base/core → config/base}/.editorconfig +0 -4
  6. package/templates/config/base/.vscode/settings.json +50 -0
  7. package/templates/{base/core/_gitignore → config/base/_.gitignore} +1 -3
  8. package/templates/config/base/_commitlint.config.mjs +3 -0
  9. package/templates/config/base/_eslint.config.mjs +8 -0
  10. package/templates/config/base/lint-staged.config.mjs +3 -0
  11. package/templates/config/base/package.json +24 -0
  12. package/templates/config/base/pnpm-workspace.yaml +3 -0
  13. package/templates/config/base/simple-git-hooks.mjs +4 -0
  14. package/templates/{vscode → config/public}/LICENSE +1 -1
  15. package/templates/config/public/README.md +20 -0
  16. package/templates/config/public/README.zh_CN.md +20 -0
  17. package/templates/config/public/package.json +10 -0
  18. package/templates/config/style/lint-staged.config.mjs +7 -0
  19. package/templates/config/style/package.json +12 -0
  20. package/templates/config/style/stylelint.config.mjs +3 -0
  21. package/templates/{base/electron → electron-react}/.vscode/launch.json +23 -3
  22. package/templates/electron-react/.vscode/tasks.json +67 -0
  23. package/templates/electron-react/README.md +1 -1
  24. package/templates/electron-react/_eslint.config.mjs +8 -0
  25. package/templates/electron-react/electron/main/index.ts +71 -40
  26. package/templates/electron-react/electron/preload/index.ts +4 -0
  27. package/templates/electron-react/index.html +1 -2
  28. package/templates/electron-react/package.json +35 -1
  29. package/templates/electron-react/pnpm-workspace.yaml +6 -0
  30. package/templates/electron-react/src/App.css +6 -2
  31. package/templates/electron-react/src/App.tsx +12 -5
  32. package/templates/electron-react/src/index.css +14 -9
  33. package/templates/electron-react/tsconfig.json +9 -0
  34. package/templates/{base/electron → electron-react}/tsconfig.node.json +1 -1
  35. package/templates/electron-react/vite.config.ts +9 -22
  36. package/templates/electron-vue/.vscode/launch.json +48 -0
  37. package/templates/electron-vue/.vscode/tasks.json +67 -0
  38. package/templates/electron-vue/README.md +1 -1
  39. package/templates/electron-vue/_eslint.config.mjs +8 -0
  40. package/templates/electron-vue/electron/env.d.ts +1 -0
  41. package/templates/electron-vue/electron/main/index.ts +46 -30
  42. package/templates/electron-vue/electron/preload/index.ts +4 -0
  43. package/templates/electron-vue/index.html +1 -2
  44. package/templates/electron-vue/package.json +31 -2
  45. package/templates/electron-vue/pnpm-workspace.yaml +5 -0
  46. package/templates/electron-vue/src/App.vue +1 -1
  47. package/templates/electron-vue/src/style.css +15 -10
  48. package/templates/electron-vue/tsconfig.json +5 -0
  49. package/templates/electron-vue/tsconfig.node.json +7 -0
  50. package/templates/electron-vue/vite.config.ts +3 -21
  51. package/templates/{node-cli-legacy → node-base}/.vscode/launch.json +3 -6
  52. package/templates/node-base/package.json +15 -0
  53. package/templates/node-base/src/index.ts +5 -0
  54. package/templates/{node-cli-legacy → node-base}/tsconfig.json +1 -1
  55. package/templates/node-cli/.vscode/i18n-ally-custom-framework.yml +35 -0
  56. package/templates/node-cli/.vscode/launch.json +3 -6
  57. package/templates/node-cli/.vscode/settings.json +56 -0
  58. package/templates/node-cli/_.gitignore +59 -0
  59. package/templates/node-cli/locales/en-US.json +12 -0
  60. package/templates/node-cli/locales/zh-CN.json +12 -0
  61. package/templates/node-cli/package.json +20 -20
  62. package/templates/node-cli/src/app.ts +19 -0
  63. package/templates/node-cli/src/config.ts +2 -2
  64. package/templates/node-cli/src/index.ts +78 -1
  65. package/templates/node-cli/src/types.ts +5 -1
  66. package/templates/node-cli/src/utils/exec.ts +68 -0
  67. package/templates/node-cli/src/utils/index.ts +3 -0
  68. package/templates/node-cli/src/utils/lang.ts +104 -0
  69. package/templates/node-cli/src/utils/util.ts +20 -0
  70. package/templates/node-cli/tsconfig.json +2 -2
  71. package/templates/node-cli/{tsup.config.ts → tsdown.config.ts} +3 -4
  72. package/templates/node-vite/examples/react/README.md +1 -0
  73. package/templates/node-vite/examples/react/_eslint.config.mjs +6 -0
  74. package/templates/{react → node-vite/examples/react}/index.html +1 -2
  75. package/templates/node-vite/examples/react/package.json +27 -0
  76. package/templates/{react → node-vite/examples/react}/src/App.css +5 -2
  77. package/templates/{react → node-vite/examples/react}/src/App.tsx +8 -9
  78. package/templates/{react → node-vite/examples/react}/src/index.css +15 -11
  79. package/templates/node-vite/examples/react/src/main.tsx +10 -0
  80. package/templates/node-vite/examples/react/tsconfig.json +5 -0
  81. package/templates/node-vite/examples/react/vite.config.ts +14 -0
  82. package/templates/node-vite/examples/vue/README.md +1 -0
  83. package/templates/node-vite/examples/vue/_eslint.config.mjs +6 -0
  84. package/templates/{vue → node-vite/examples/vue}/index.html +1 -2
  85. package/templates/node-vite/examples/vue/package.json +22 -0
  86. package/templates/{vue → node-vite/examples/vue}/src/App.vue +3 -3
  87. package/templates/node-vite/examples/vue/src/components/HelloWorld.vue +19 -0
  88. package/templates/{vue → node-vite/examples/vue}/src/main.ts +0 -1
  89. package/templates/{vue → node-vite/examples/vue}/src/style.css +16 -12
  90. package/templates/{base → node-vite/examples}/vue/tsconfig.json +2 -2
  91. package/templates/{vue → node-vite/examples/vue}/vite.config.ts +1 -1
  92. package/templates/node-vite/package.json +16 -0
  93. package/templates/node-vite/pnpm-lock.yaml +2293 -0
  94. package/templates/node-vite/pnpm-workspace.yaml +6 -0
  95. package/templates/{node → node-vite}/tsconfig.json +1 -1
  96. package/templates/{node-cli-legacy/tsup.config.ts → node-vite/tsdown.config.ts} +4 -5
  97. package/templates/vscode-base/.vscode/settings.json +59 -0
  98. package/templates/{vscode → vscode-base}/.vscode/tasks.json +2 -2
  99. package/templates/{base/node → vscode-base}/LICENSE +1 -1
  100. package/templates/{vscode/_gitignore → vscode-base/_.gitignore} +1 -0
  101. package/templates/vscode-base/locales/zh-CN.json +6 -0
  102. package/templates/{vscode → vscode-base}/package.json +12 -19
  103. package/templates/vscode-base/resources/logo.png +0 -0
  104. package/templates/vscode-base/resources/logo.svg +1 -0
  105. package/templates/{vscode/tsup.config.ts → vscode-base/tsdown.config.ts} +3 -3
  106. package/templates/{base/vscode → vscode-react}/.vscode/launch.json +14 -1
  107. package/templates/vscode-react/.vscode/settings.json +59 -0
  108. package/templates/{base/vscode → vscode-react}/.vscode/tasks.json +10 -1
  109. package/templates/{base/vscode → vscode-react}/LICENSE +1 -1
  110. package/templates/vscode-react/README.md +2 -2
  111. package/templates/{base/vscode/_gitignore → vscode-react/_.gitignore} +2 -1
  112. package/templates/{base/vscode → vscode-react}/extension/views/helper.ts +5 -4
  113. package/templates/{base/vscode → vscode-react}/extension/views/panel.ts +2 -1
  114. package/templates/vscode-react/package.json +65 -1
  115. package/templates/vscode-react/pnpm-workspace.yaml +5 -0
  116. package/templates/vscode-react/src/App.css +1 -1
  117. package/templates/vscode-react/src/App.tsx +16 -10
  118. package/templates/vscode-react/src/utils/vscode.ts +2 -81
  119. package/templates/vscode-react/src/vite-env.d.ts +1 -0
  120. package/templates/vscode-react/tsconfig.json +5 -0
  121. package/templates/vscode-react/vite.config.ts +4 -5
  122. package/templates/vscode-vue/.vscode/extensions.json +5 -0
  123. package/templates/vscode-vue/.vscode/launch.json +34 -0
  124. package/templates/vscode-vue/.vscode/settings.json +59 -0
  125. package/templates/{base/electron → vscode-vue}/.vscode/tasks.json +14 -6
  126. package/templates/vscode-vue/.vscodeignore +73 -0
  127. package/templates/vscode-vue/LICENSE +21 -0
  128. package/templates/vscode-vue/README.md +2 -2
  129. package/templates/vscode-vue/_.gitignore +65 -0
  130. package/templates/vscode-vue/extension/env.d.ts +1 -0
  131. package/templates/vscode-vue/extension/index.ts +21 -0
  132. package/templates/vscode-vue/extension/views/helper.ts +28 -0
  133. package/templates/vscode-vue/extension/views/panel.ts +49 -0
  134. package/templates/vscode-vue/locales/en.json +6 -0
  135. package/templates/vscode-vue/package.json +56 -2
  136. package/templates/vscode-vue/pnpm-workspace.yaml +4 -0
  137. package/templates/vscode-vue/src/App.vue +17 -11
  138. package/templates/vscode-vue/src/utils/vscode.ts +2 -81
  139. package/templates/vscode-vue/src/vite-env.d.ts +1 -0
  140. package/templates/vscode-vue/tsconfig.json +5 -0
  141. package/templates/vscode-vue/tsconfig.node.json +7 -0
  142. package/templates/vscode-vue/vite.config.ts +0 -4
  143. package/templates/web-react/README.md +1 -0
  144. package/templates/web-react/_eslint.config.mjs +6 -0
  145. package/templates/web-react/index.html +13 -0
  146. package/templates/web-react/package.json +27 -0
  147. package/templates/web-react/public/vite.svg +1 -0
  148. package/templates/web-react/src/App.css +45 -0
  149. package/templates/web-react/src/App.tsx +31 -0
  150. package/templates/web-react/src/assets/react.svg +1 -0
  151. package/templates/web-react/src/index.css +73 -0
  152. package/templates/web-react/src/main.tsx +10 -0
  153. package/templates/web-react/tsconfig.app.json +28 -0
  154. package/templates/web-react/tsconfig.json +7 -0
  155. package/templates/web-react/tsconfig.node.json +26 -0
  156. package/templates/web-react/vite.config.ts +14 -0
  157. package/templates/web-vue/README.md +1 -0
  158. package/templates/web-vue/_eslint.config.mjs +6 -0
  159. package/templates/web-vue/index.html +13 -0
  160. package/templates/web-vue/package.json +22 -0
  161. package/templates/web-vue/public/vite.svg +1 -0
  162. package/templates/web-vue/src/App.vue +32 -0
  163. package/templates/web-vue/src/assets/vue.svg +1 -0
  164. package/templates/web-vue/src/components/HelloWorld.vue +19 -0
  165. package/templates/web-vue/src/main.ts +5 -0
  166. package/templates/web-vue/src/style.css +84 -0
  167. package/templates/web-vue/tsconfig.app.json +4 -0
  168. package/templates/web-vue/tsconfig.json +7 -0
  169. package/templates/web-vue/tsconfig.node.json +7 -0
  170. package/templates/web-vue/vite.config.ts +7 -0
  171. package/templates/base/core/.commitlintrc.cjs +0 -3
  172. package/templates/base/core/.eslintignore +0 -14
  173. package/templates/base/core/.husky/commit-msg +0 -1
  174. package/templates/base/core/.husky/pre-commit +0 -1
  175. package/templates/base/core/.prettierignore +0 -17
  176. package/templates/base/core/.prettierrc.cjs +0 -1
  177. package/templates/base/core/_eslintrc.cjs +0 -7
  178. package/templates/base/core/_lintstagedrc.cjs +0 -4
  179. package/templates/base/core/package.json +0 -31
  180. package/templates/base/electron/electron/main/index.ts +0 -111
  181. package/templates/base/electron/electron/polyfills.ts +0 -4
  182. package/templates/base/electron/electron/preload/index.ts +0 -1
  183. package/templates/base/electron/package.json +0 -25
  184. package/templates/base/node/README.md +0 -13
  185. package/templates/base/node/README.zh_CN.md +0 -13
  186. package/templates/base/node/package.json +0 -48
  187. package/templates/base/node/test/index.test.ts +0 -7
  188. package/templates/base/package/package.json +0 -8
  189. package/templates/base/react/_eslintrc.cjs +0 -7
  190. package/templates/base/react/_lintstagedrc.cjs +0 -6
  191. package/templates/base/react/package.json +0 -19
  192. package/templates/base/react/tsconfig.json +0 -5
  193. package/templates/base/style/.stylelintignore +0 -16
  194. package/templates/base/style/.stylelintrc.cjs +0 -3
  195. package/templates/base/style/_lintstagedrc.cjs +0 -5
  196. package/templates/base/style/package.json +0 -10
  197. package/templates/base/vscode/.vscode/settings.json +0 -10
  198. package/templates/base/vscode/package.json +0 -67
  199. package/templates/base/vue/_eslintrc.cjs +0 -7
  200. package/templates/base/vue/_lintstagedrc.cjs +0 -6
  201. package/templates/base/vue/package.json +0 -17
  202. package/templates/config.json +0 -108
  203. package/templates/electron-react/public/img/icon.png +0 -0
  204. package/templates/electron-vue/public/img/icon.png +0 -0
  205. package/templates/node/package.json +0 -10
  206. package/templates/node/src/index.ts +0 -3
  207. package/templates/node/tsup.config.ts +0 -19
  208. package/templates/node-cli/index.d.ts +0 -5
  209. package/templates/node-cli/src/cli.ts +0 -68
  210. package/templates/node-cli/xxx.config.cjs +0 -0
  211. package/templates/node-cli-legacy/index.d.ts +0 -5
  212. package/templates/node-cli-legacy/package.json +0 -30
  213. package/templates/node-cli-legacy/src/cli.ts +0 -45
  214. package/templates/node-cli-legacy/src/config.ts +0 -28
  215. package/templates/node-cli-legacy/src/index.ts +0 -3
  216. package/templates/node-cli-legacy/src/types.ts +0 -1
  217. package/templates/node-cli-legacy/src/utils.ts +0 -5
  218. package/templates/node-vite-plugin/package.json +0 -18
  219. package/templates/node-vite-plugin/test/index.test.ts +0 -7
  220. package/templates/node-vite-plugin/tsconfig.json +0 -4
  221. package/templates/node-vite-plugin/tsup.config.ts +0 -18
  222. package/templates/node-workspaces/package.json +0 -8
  223. package/templates/react/package.json +0 -12
  224. package/templates/react/src/main.tsx +0 -11
  225. package/templates/react/src/vite-env.d.ts +0 -1
  226. package/templates/react/vite.config.ts +0 -7
  227. package/templates/schema.json +0 -110
  228. package/templates/vscode/.vscode/settings.json +0 -10
  229. package/templates/vscode/README.md +0 -3
  230. package/templates/vue/package.json +0 -12
  231. package/templates/vue/src/components/HelloWorld.vue +0 -37
  232. package/templates/vue/src/vite-env.d.ts +0 -1
  233. package/templates/{base/core → config/base}/.gitattributes +0 -0
  234. package/templates/{node-cli-legacy/xxx.config.cjs → config/base/README.md} +0 -0
  235. package/templates/{base/electron → electron-react}/electron/env.d.ts +0 -0
  236. package/templates/{react → node-vite/examples/react}/public/vite.svg +0 -0
  237. package/templates/{react → node-vite/examples/react}/src/assets/react.svg +0 -0
  238. package/templates/{base → node-vite/examples}/react/tsconfig.node.json +0 -0
  239. package/templates/{vue → node-vite/examples/vue}/public/vite.svg +0 -0
  240. package/templates/{vue → node-vite/examples/vue}/src/assets/vue.svg +0 -0
  241. package/templates/{base → node-vite/examples}/vue/tsconfig.node.json +0 -0
  242. package/templates/{node-vite-plugin → node-vite}/src/index.ts +0 -0
  243. package/templates/{node-vite-plugin → node-vite}/src/types.ts +0 -0
  244. package/templates/{base/vscode → vscode-base}/.vscode/extensions.json +0 -0
  245. package/templates/{vscode → vscode-base}/.vscode/launch.json +0 -0
  246. package/templates/{vscode → vscode-base}/.vscodeignore +0 -0
  247. package/templates/{base/vscode → vscode-base}/README.md +0 -0
  248. package/templates/{vscode → vscode-base}/locales/en.json +0 -0
  249. package/templates/{vscode → vscode-base}/src/index.ts +1 -1
  250. package/templates/{vscode → vscode-base}/tsconfig.json +0 -0
  251. package/templates/{vscode → vscode-react}/.vscode/extensions.json +0 -0
  252. package/templates/{base/vscode → vscode-react}/.vscodeignore +0 -0
  253. package/templates/{base/vscode → vscode-react}/extension/env.d.ts +0 -0
  254. package/templates/{base/vscode → vscode-react}/extension/index.ts +1 -1
  255. /package/templates/{base/vscode → vscode-react}/locales/en.json +0 -0
  256. /package/templates/{base/vscode → vscode-react}/locales/zh-CN.json +0 -0
  257. /package/templates/{base/vscode → vscode-react}/resources/logo.png +0 -0
  258. /package/templates/{base/vscode → vscode-react}/resources/logo.svg +0 -0
  259. /package/templates/{base/vscode → vscode-react}/tsconfig.node.json +0 -0
  260. /package/templates/{vscode → vscode-vue}/locales/zh-CN.json +0 -0
  261. /package/templates/{vscode → vscode-vue}/resources/logo.png +0 -0
  262. /package/templates/{vscode → vscode-vue}/resources/logo.svg +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @tomjs/create-app
2
2
 
3
- ![npm](https://img.shields.io/npm/v/@tomjs/create-app) ![node-current (scoped)](https://img.shields.io/node/v/@tomjs/create-app) ![NPM](https://img.shields.io/npm/l/@tomjs/create-app)
3
+ ![npm](https://img.shields.io/npm/v/@tomjs/create-app) ![node-current (scoped)](https://img.shields.io/node/v/@tomjs/create-app) ![license](https://img.shields.io/npm/l/@tomjs/create-app)
4
4
 
5
5
  **English** | [中文](./README.zh_CN.md)
6
6
 
@@ -26,40 +26,33 @@ Then generate the project based on the prompts.
26
26
  ```bash
27
27
  $ pnpm create @tomjs/app -h
28
28
 
29
- create tomjs web app
29
+ Create a template based on tomjs node/web/electron/vscode
30
30
 
31
31
  Usage
32
- $ create-app [name] [options]
32
+ $ create-app [options] <dir>
33
33
 
34
- name The package name
34
+ dir Project directory
35
35
 
36
36
  Options
37
- --cwd The current working directory (default: ".")
38
- -e, --example Only create examples
39
- -p, --package Only create packages
40
- --git Only manage git repository
41
- --verbose Display verbose output
42
- -h, --help Display this message
43
- -v, --version Display version number
44
-
45
- Examples
46
- $ create-app my-project
37
+ -o, --overwrite Overwrite existing project
38
+ -p, --private Set as private project
39
+ --verbose Show verbose logs
40
+ -h, --help Show help information
41
+ -v, --version Show version information
47
42
  ```
48
43
 
49
44
  Support templates:
50
45
 
51
- - vue
52
- - react
53
46
  - electron-vue
54
47
  - electron-react
55
- - node
48
+ - node-base
56
49
  - node-cli
57
- - node-cli-legacy
58
- - node-vite-plugin
59
- - node-workspaces
60
- - vscode
50
+ - node-vite
51
+ - vscode-base
61
52
  - vscode-vue
62
53
  - vscode-react
54
+ - web-vue
55
+ - web-react
63
56
 
64
57
  ## Reference project
65
58
 
package/README.zh_CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](./README.md) | **中文**
4
4
 
5
- ![npm](https://img.shields.io/npm/v/@tomjs/create-app) ![node-current (scoped)](https://img.shields.io/node/v/@tomjs/create-app) ![NPM](https://img.shields.io/npm/l/@tomjs/create-app)
5
+ ![npm](https://img.shields.io/npm/v/@tomjs/create-app) ![node-current (scoped)](https://img.shields.io/node/v/@tomjs/create-app) ![license](https://img.shields.io/npm/l/@tomjs/create-app)
6
6
 
7
7
  > 创建基于 [vite](https://github.com/vitejs/vite) + [tomjs](https://github.com/tomjs) 的 web 应用。
8
8
 
@@ -26,40 +26,33 @@ npm create @tomjs/app@latest
26
26
  ```bash
27
27
  $ pnpm create @tomjs/app -h
28
28
 
29
- create tomjs web app
29
+ 创建基于 tomjs 的 node/web/electron/vscode 的模板
30
30
 
31
31
  Usage
32
- $ create-app [name] [options]
32
+ $ create-app [options] <dir>
33
33
 
34
- name The package name
34
+ dir 项目目录
35
35
 
36
36
  Options
37
- --cwd The current working directory (default: ".")
38
- -e, --example Only create examples
39
- -p, --package Only create packages
40
- --git Only manage git repository
41
- --verbose Display verbose output
42
- -h, --help Display this message
43
- -v, --version Display version number
44
-
45
- Examples
46
- $ create-app my-project
37
+ -o, --overwrite 覆盖已存在的目录
38
+ -p, --private 设为私有项目
39
+ --verbose 显示详细日志
40
+ -h, --help 显示帮助信息
41
+ -v, --version 显示版本信息
47
42
  ```
48
43
 
49
44
  支持模板:
50
45
 
51
- - vue
52
- - react
53
46
  - electron-vue
54
47
  - electron-react
55
- - node
48
+ - node-base
56
49
  - node-cli
57
- - node-cli-legacy
58
- - node-vite-plugin
59
- - node-workspaces
60
- - vscode
50
+ - node-vite
51
+ - vscode-base
61
52
  - vscode-vue
62
53
  - vscode-react
54
+ - web-vue
55
+ - web-react
63
56
 
64
57
  ## 参考项目
65
58
 
package/dist/index.js CHANGED
@@ -1,26 +1,13 @@
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
-
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
- Done. Now run:
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(`
1
+ import e from"meow";import t from"node:fs";import n from"node:fs/promises";import r from"node:os";import i from"node:path";import{fileURLToPath as a}from"node:url";import*as o from"@clack/prompts";import{copy as s,mkdir as c,mkdirp as l,readFile as u,readJson as d,rm as f,rmSync as p,writeFile as m,writeJson as h}from"@tomjs/node";import{merge as g,omit as ee}from"lodash-es";import{glob as _}from"tinyglobby";import v from"chalk";import{$ as y}from"execa";import b from"@tomjs/logger";const x=a(new URL(`..`,import.meta.url)),S=[{name:`node`,display:`Node`,color:v.green,children:[{name:`node-base`,display:`Base`,color:v.green},{name:`node-cli`,display:`CLI`,color:v.green},{name:`node-vite`,display:`Vite Plugin`,color:v.blue,hasStyle:!0}]},{name:`web`,display:`Web`,color:v.magenta,children:[{name:`web-vue`,display:`Vue`,color:v.green,hasStyle:!0,isPublic:!1},{name:`web-react`,display:`React`,color:v.blue,hasStyle:!0,isPublic:!1}]},{name:`vscode`,display:`VSCode`,color:v.blue,children:[{name:`vscode-base`,display:`Base`,color:v.yellow,isPublic:`public`},{name:`vscode-vue`,display:`Vue`,color:v.green,hasStyle:!0,isPublic:`public`},{name:`vscode-react`,display:`React`,color:v.blue,hasStyle:!0,isPublic:`public`}]},{name:`electron`,display:`Electron`,color:v.cyan,children:[{name:`electron-vue`,display:`Vue`,color:v.green,hasStyle:!0,isPublic:!1},{name:`electron-react`,display:`React`,color:v.blue,hasStyle:!0,isPublic:!1}]}],C=[{id:`github`,name:`Github`,url:`https://github.com`},{id:`gitcode`,name:`GitCode`,url:`https://gitcode.com`},{id:`gitee`,name:`码云`,url:`https://gitee.com`}],w=`publisher.name.displayName.type.version.private.packageManager.description.author.contributors.license.funding.homepage.repository.publishConfig.bugs.keywords.categories.sideEffects.imports.exports.main.module.unpkg.jsdelivr.types.typesVersions.bin.icon.files.engines.activationEvents.contributes.scripts.peerDependencies.peerDependenciesMeta.dependencies.optionalDependencies.devDependencies.pnpm.overrides.resolutions.husky.simple-git-hooks.lint-staged.eslintConfig`.split(`.`),T=[`dev`,`dev:`,`debug`,`debug:`,`start`,`build`,`build:`,`preview`,`release`,`release:`,`clean`,`clean:`,`test`,`lint`,`lint:`],E=new b({directory:`create-app/logs`}),te=process.platform===`win32`;let D={};function O(e){D=e}function k(){return D}async function A(e,t){let{trim:n,...r}=Object.assign({stdio:`pipe`,shell:!0},t);Array.isArray(e)&&(e=e.join(` `));let i=e=>{k().verbose?E.debug(e):E.write(e)};i(`$ ${e}`);try{let t=(await y(r)`${e}`).stdout;return i(t),n?t.trim().replace(/\n|\r/g,``):t.trim()}catch(e){let t=e.stderr||e.message;throw i(t),Error(t)}}function j(e){if(e===`C`)return`en-US`;let t=``;try{t=Intl.getCanonicalLocales(e)[0]}catch(t){console.log(`${t.toString()}, invalid language tag: "${e}"\n`)}switch(t){case`zh-TW`:case`zh-HK`:case`zh-MO`:case`zh-CN`:case`zh-SG`:t=`zh-CN`;break;default:t=e}return t}function M(){return j((process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||Intl.DateTimeFormat().resolvedOptions().locale||`en-US`).split(`.`)[0].replace(`_`,`-`))}async function N(e){return await t.promises.readFile(e,`utf-8`).then(e=>JSON.parse(e)||{})}async function ne(e){let n=M(),r=i.resolve(e,`${n}.json`),a=i.resolve(e,`en-US.json`);return t.existsSync(r)?await N(r):await N(a)}const P=await ne(i.join(x,`locales`));function F(...e){if(e.length===0||!P)return``;let[t,...n]=e,r=P[t]??``;if(n[0]===null||n[0]===void 0||n[0]===``)return r;let i=typeof n[0]==`object`?n[0]:n;return r.replace(/\{([^}]+)\}/g,(e,t)=>i[t]??e)}const re=i.join(a(import.meta.url),`../../`),I=i.join(re,`templates`),L=()=>o.cancel(F(`prompt.cancel`));async function R(e){O(e);let t=await z(e);t&&await B(t)}async function z(e){let n=async function(){let e=await o.select({message:F(`prompt.templateType.message`),options:S.map(e=>({label:e.color(e.display||e.name),value:e.name}))});if(o.isCancel(e))return L();let t=S.find(t=>t.name===e),r=await o.select({message:F(`prompt.template.message`),options:t.children.map(e=>({label:e.color(e.display||e.name),value:e.name})).concat({label:F(`prompt.template.back`),value:`back`})});return o.isCancel(r)?L():r===`back`?await n():{template:r,templateOptions:t.children.find(e=>e.name===r)}},a=await n();if(!a)return;let{template:s,templateOptions:c}=a,l=V(e.dir);if(!l||[`.`,`~`].includes(l)){let e=await o.text({message:F(`prompt.project.message`),defaultValue:s,placeholder:s,validate:e=>e.length===0||V(e).length>0?void 0:F(`prompt.project.invalid`)});if(o.isCancel(e))return L();l=i.resolve(l===`~`&&!te?r.homedir():process.cwd(),V(e))}if(t.existsSync(l)&&!H(l)){let t=e.overwrite;if(!t){let e=await o.select({message:F(`prompt.exist.message`,l),options:[{label:F(`prompt.exist.option.no`),value:`no`},{label:F(`prompt.exist.option.yes`),value:`yes`},{label:F(`prompt.exist.option.ignore`),value:`ignore`}]});if(o.isCancel(e))return L();t=e}switch(t){case`yes`:U(l);break;case`no`:L();return}}let u=i.basename(i.resolve(l)),d=await o.text({message:F(`prompt.package.message`),defaultValue:K(u),placeholder:K(u),validate:e=>e.length===0||W(e)?void 0:F(`prompt.package.invalid`)});if(o.isCancel(d))return L();u=d;let f;if(e.private!==!0&&c.isPublic!==`public`){let e=await o.confirm({message:F(`prompt.public.message`),active:F(`prompt.confirm.yes`),inactive:F(`prompt.confirm.no`),initialValue:c.isPublic??!0});if(o.isCancel(e))return L();f=e}else f=!e.private;let p;if(f){let e=await o.select({message:F(`prompt.gitUrl.message`),options:C.map(e=>({label:`${e.name} (${e.url})`,value:e.id}))});if(o.isCancel(e))return L();p=C.find(t=>t.id===e)?.url}let m;if(f){let e=J(u);e||await q(`user.email`)===`tom@tomgao.cc`&&(e=`tomjs`);let t=await o.text({message:F(`prompt.gitOrg.message`),defaultValue:e,placeholder:e,validate:t=>e&&!t||G(t)?void 0:F(`prompt.gitOrg.invalid`)});if(o.isCancel(t))return L();m=t}return{targetDir:l,packageName:u,template:s,templateOptions:c,isPublic:f,gitUrl:p,gitOrg:m}}async function B(e){E.debug(`projectOptions:`,ee(e,`templateOptions`));let{targetDir:t,packageName:a,template:o,isPublic:p,gitUrl:v,gitOrg:y,templateOptions:b}=e;await c(t);let x=o.includes(`vscode`),S={},C=i.join(t,`.temp`);if(await l(C),await Y(S,`base`,C),b.hasStyle&&await Y(S,`style`,C),p&&!x&&await Y(S,`public`,C),await s(C,t),await f(C),await s(i.join(I,o),t),g(S,await d(i.join(i.join(I,o),`package.json`))),S.name=a,p){delete S.private,S.name=a,S.license=`MIT`;let e=await q(`user.name`)||r.userInfo().username,n=await q(`user.email`);e&&n?S.author={name:e,email:n}:e&&(S.author=e);let o=`${v}/${y}/${i.basename(t)}`;x?(S.publisher=y,S.homepage=`${o}/blob/main/README.md`,S.bugs={url:`${o}/issues`}):delete S.publishConfig,S.repository={type:`git`,url:`git+${o}.git`}}else S.private=!0,delete S.publishConfig,S.devDependencies&&delete S.devDependencies.publint;if(await h(i.join(t,`package.json`),ae(S)),p){let{author:e}=S,r=``;e&&(typeof e==`string`?r=e:typeof e==`object`&&(e.name&&e.email?r=`${e.name}<${e.email}>`:e.name?r=e.name:e.email&&(r=e.email)));let o={pkgName:a,dateYear:new Date().getFullYear(),gitUserName:r},s=(await n.readdir(t)).filter(e=>[`README.md`,`README.zh_CN.md`,`LICENSE`].includes(e));for(let e of s){let n=await u(i.join(t,e));Object.keys(o).forEach(e=>{n=n.replace(RegExp(`{{${e}}}`,`g`),o[e])}),await m(i.join(t,e),n)}}let w=await _(`**/_*`,{ignore:[`**/node_modules/**`,`**/.*`],cwd:t});for(let e of w){let r=e.split(`/`);r[r.length-1]=r[r.length-1].substring(1),await n.rename(i.join(t,e),i.join(t,r.join(`/`)))}await A(`git init`,{cwd:t})}function V(e){return(e||``).trim().replace(/\/+$/g,``)}function H(e){return t.readdirSync(e).length===0}function U(e){t.existsSync(e)&&p(e)}function W(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function G(e){return/^[a-z][a-z\d\-._]*$/.test(e)}function K(e){return e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+/g,`-`)}async function q(e){return A(`git config --get ${e}`,{trim:!0})}function J(e){if(e.startsWith(`@`))return e.split(`/`)[0].substring(1)}async function Y(e,t,r){let a=i.join(I,`config/${t}`),o=await n.readdir(a);for(let t of o)[`node_modules`,`.git`].includes(t)||(t===`package.json`?g(e,await d(i.join(a,`package.json`))):await s(i.join(a,t),i.join(r,t)))}function X(e,t){if(!e)return e;let n={};return Array.isArray(t)&&t.length>0?(t.filter(t=>t in e).forEach(t=>{n[t]=e[t]}),Object.keys(e).filter(e=>!t.includes(e)).sort().forEach(t=>{n[t]=e[t]})):Object.keys(e).sort().forEach(t=>{n[t]=e[t]}),n}function ie(e,t,n){let r={},i=Object.keys(e);{let e=i.filter(e=>e.includes(`:`));i=i.filter(e=>!e.includes(`:`)).sort().concat(e)}let a=s(t),o=s(n);return a.concat(i.filter(e=>!a.includes(e)&&!o.includes(e))).concat(o).forEach(t=>{r[t]=e[t]}),r;function s(e){let t=Array.isArray(e)?e:[];return t.length>0&&(t=t.reduce((e,t)=>{if(t.endsWith(`:`)){let n=i.filter(n=>!e.includes(n)&&n.startsWith(t));return e.concat(n)}return i.includes(t)?e.concat(t):e},[])),t}}function ae(e){return e=X(e,w),e.scripts&&=ie(e.scripts,T,[`prepare`,`prepublishOnly`]),[`dependencies`,`devDependencies`,`peerDependencies`].forEach(t=>{e[t]&&(e[t]=X(e[t]))}),e}const Z=e(`
9
2
  Usage
10
- $ create-app [name] [options]
3
+ $ create-app [options] <dir>
11
4
 
12
- name The package name
5
+ dir ${F(`options.dir`)}
13
6
 
14
7
  Options
15
- --cwd The current working directory (default: ".")
16
- -e, --example Only create examples
17
- -p, --package Only create packages
18
- --git Only manage git repository
19
- --verbose Display verbose output
20
- -h, --help Display this message
21
- -v, --version Display version number
22
-
23
- Examples
24
- $ create-app my-project
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"},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"}
8
+ -o, --overwrite ${F(`options.overwrite`)}
9
+ -p, --private ${F(`options.private`)}
10
+ --verbose ${F(`options.verbose`)}
11
+ -h, --help ${F(`options.help`)}
12
+ -v, --version ${F(`options.version`)}
13
+ `,{importMeta:import.meta,booleanDefault:void 0,helpIndent:0,description:F(`app.description`),flags:{overwrite:{type:`string`},private:{type:`boolean`,shortFlag:`p`},verbose:{type:`boolean`,default:!1},help:{type:`boolean`,shortFlag:`h`},version:{type:`boolean`,shortFlag:`v`}}}),{input:Q,flags:$}=Z;$.help?Z.showHelp(0):$.version?Z.showVersion():(E.enableDebug($.verbose),E.debug(`project dir:`,Q.join()),E.debug(`cli options:`,$),R(Object.assign({dir:Q[0]},$)));export{};
package/package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "name": "@tomjs/create-app",
3
3
  "type": "module",
4
- "version": "1.7.0",
5
- "description": "create tomjs web app",
4
+ "version": "2.0.1",
5
+ "description": "create tomjs web/electron/vscode extension",
6
+ "author": {
7
+ "name": "Tom Gao",
8
+ "email": "tom@tomgao.cc"
9
+ },
10
+ "license": "MIT",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/tomjs/create-app.git"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org"
18
+ },
6
19
  "keywords": [
7
20
  "tomjs",
8
21
  "front-end",
@@ -21,73 +34,57 @@
21
34
  "web",
22
35
  "node"
23
36
  ],
24
- "author": {
25
- "name": "Tom Gao",
26
- "email": "tom@tomgao.cc"
27
- },
28
- "license": "MIT",
29
37
  "bin": {
30
38
  "create-app": "dist/index.js"
31
39
  },
32
40
  "files": [
33
41
  "dist",
34
- "templates/**"
42
+ "templates",
43
+ "!templates/*/node_modules/.bin/*"
35
44
  ],
36
45
  "engines": {
37
46
  "node": ">=18"
38
47
  },
39
- "repository": {
40
- "type": "git",
41
- "url": "git+https://github.com/tomjs/create-app.git"
42
- },
43
- "publishConfig": {
44
- "access": "public",
45
- "registry": "https://registry.npmjs.org"
46
- },
47
48
  "dependencies": {
48
- "@tomjs/logger": "^1.1.4",
49
+ "@clack/prompts": "^0.11.0",
50
+ "@tomjs/logger": "^1.4.0",
49
51
  "@tomjs/node": "^2.2.3",
50
- "chalk": "^5.3.0",
51
- "dayjs": "^1.11.13",
52
- "execa": "^9.3.1",
53
- "inquirer": "^10.1.8",
52
+ "chalk": "^5.6.2",
53
+ "dayjs": "^1.11.19",
54
+ "execa": "^9.6.0",
54
55
  "lodash-es": "^4.17.21",
55
- "meow": "^13.2.0"
56
+ "meow": "^14.0.0",
57
+ "tinyglobby": "^0.2.15"
56
58
  },
57
59
  "devDependencies": {
58
- "@commitlint/cli": "^19.4.1",
59
- "@tomjs/commitlint": "^3.3.0",
60
- "@tomjs/eslint": "^4.4.0",
61
- "@tomjs/prettier": "^1.4.1",
62
- "@tomjs/stylelint": "^2.7.0",
63
- "@tomjs/tsconfig": "^1.7.1",
64
- "@types/inquirer": "^9.0.7",
60
+ "@antfu/eslint-config": "^6.2.0",
61
+ "@commitlint/cli": "^20.1.0",
62
+ "@tomjs/commitlint": "^5.0.0",
63
+ "@tomjs/eslint": "^6.0.0",
64
+ "@tomjs/stylelint": "^7.0.0",
65
+ "@tomjs/tsconfig": "^2.1.0",
66
+ "@tsconfig/node20": "^20.1.8",
65
67
  "@types/lodash-es": "^4.17.12",
66
- "@types/node": "^18.19.47",
67
- "@types/prompts": "^2.4.9",
68
- "cross-env": "^7.0.3",
69
- "dotenv": "^16.4.5",
70
- "eslint": "^9.22.0",
71
- "eslint-plugin-react": "^7.37.4",
72
- "eslint-plugin-react-hooks": "^5.2.0",
73
- "eslint-plugin-react-refresh": "^0.4.19",
74
- "husky": "^9.1.5",
75
- "lint-staged": "^15.2.9",
76
- "npm-run-all": "^4.1.5",
77
- "prettier": "^3.3.3",
78
- "stylelint": "^16.9.0",
79
- "tsup": "^8.2.4",
80
- "tsx": "^4.19.0",
81
- "type-fest": "^4.26.0",
82
- "typescript": "~5.5.4"
68
+ "@types/node": "^20.19.25",
69
+ "dotenv": "^17.2.3",
70
+ "eslint": "^9.39.1",
71
+ "lint-staged": "^16.2.7",
72
+ "npm-run-all2": "^8.0.4",
73
+ "publint": "^0.3.15",
74
+ "rimraf": "^6.1.2",
75
+ "simple-git-hooks": "^2.13.1",
76
+ "stylelint": "^16.26.1",
77
+ "tsdown": "~0.15.12",
78
+ "tsx": "^4.20.6",
79
+ "type-fest": "^5.2.0",
80
+ "typescript": "~5.9.3"
83
81
  },
84
82
  "scripts": {
85
- "dev": "tsup --watch",
83
+ "dev": "tsdown --watch",
86
84
  "debug": "tsx -r dotenv/config src/index.ts",
87
- "build": "tsup --minify",
88
- "lint": "run-s lint:eslint lint:stylelint lint:prettier",
89
- "lint:eslint": "eslint \"{src,templates}/**/*.{cjs,ts,tsx,vue}\" *.{cjs,ts} --fix --cache",
90
- "lint:stylelint": "stylelint \"templates/**/*.{css,scss,less,vue,html}\" --fix --cache",
91
- "lint:prettier": "prettier --write ."
85
+ "build": "tsdown --minify",
86
+ "lint": "run-s lint:stylelint lint:eslint",
87
+ "lint:eslint": "eslint --fix",
88
+ "lint:stylelint": "stylelint \"templates/**/*.{css,scss,vue,html}\" --fix --cache"
92
89
  }
93
90
  }
@@ -9,7 +9,3 @@ indent_style = space
9
9
  indent_size = 2
10
10
  trim_trailing_whitespace = true
11
11
  insert_final_newline = true
12
-
13
- [*.md]
14
- insert_final_newline = false
15
- trim_trailing_whitespace = false
@@ -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
+ }
@@ -32,7 +32,7 @@ web_modules
32
32
  tsconfig.tsbuildinfo
33
33
 
34
34
  # environment
35
- *.local
35
+ .env
36
36
 
37
37
  # macOS
38
38
  .DS_Store
@@ -46,7 +46,6 @@ tsconfig.tsbuildinfo
46
46
  *.tar.*
47
47
  *.tgz
48
48
  *.zip
49
- *.vsix
50
49
 
51
50
  # IDEA
52
51
  .idea
@@ -57,4 +56,3 @@ tsconfig.tsbuildinfo
57
56
  # build output
58
57
  build
59
58
  dist
60
- release
@@ -0,0 +1,3 @@
1
+ export default {
2
+ extends: ['@tomjs/commitlint'],
3
+ };
@@ -0,0 +1,8 @@
1
+ import defineConfig from '@tomjs/eslint';
2
+
3
+ export default defineConfig({
4
+ rules: {
5
+ 'antfu/no-top-level-await': 'off',
6
+ 'jsonc/sort-array-values': 'off',
7
+ },
8
+ });
@@ -0,0 +1,3 @@
1
+ export default {
2
+ '*': 'eslint --fix',
3
+ };
@@ -0,0 +1,24 @@
1
+ {
2
+
3
+ "type": "module",
4
+ "version": "0.0.0",
5
+ "packageManager": "pnpm@10.24.0",
6
+ "scripts": {
7
+ "lint": "eslint --fix",
8
+ "prepare": "simple-git-hooks"
9
+ },
10
+ "devDependencies": {
11
+ "@antfu/eslint-config": "^6.2.0",
12
+ "@commitlint/cli": "^20.1.0",
13
+ "@tomjs/commitlint": "^5.0.0",
14
+ "@tomjs/eslint": "^6.0.0",
15
+ "@tomjs/tsconfig": "^2.1.0",
16
+ "@types/node": "^20.19.25",
17
+ "eslint": "^9.39.1",
18
+ "lint-staged": "^16.2.7",
19
+ "npm-run-all2": "^8.0.4",
20
+ "simple-git-hooks": "^2.13.1",
21
+ "tsx": "^4.20.6",
22
+ "typescript": "~5.9.3"
23
+ }
24
+ }
@@ -0,0 +1,3 @@
1
+ onlyBuiltDependencies:
2
+ - esbuild
3
+ - simple-git-hooks
@@ -0,0 +1,4 @@
1
+ export default {
2
+ 'pre-commit': 'pnpm lint-staged',
3
+ 'commit-msg': 'pnpm commitlint --edit "$1"',
4
+ };
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) {{dateYear}}-PRESENT {{gitUserName}}<{{gitUserEmail}}>
3
+ Copyright (c) {{dateYear}}-PRESENT {{gitUserName}}
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,20 @@
1
+ # {{pkgName}}
2
+
3
+ [![npm](https://img.shields.io/npm/v/{{pkgName}})](https://www.npmjs.com/package/{{pkgName}}) ![node-current (scoped)](https://img.shields.io/node/v/{{pkgName}}) ![license](https://img.shields.io/npm/l/{{pkgName}}) [![jsDocs.io](https://img.shields.io/badge/jsDocs.io-reference-blue)](https://www.jsdocs.io/package/{{pkgName}})
4
+
5
+ **English** | [中文](./README.zh_CN.md)
6
+
7
+ > Basic template
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ # pnpm
13
+ pnpm add -D {{pkgName}}
14
+
15
+ # yarn
16
+ yarn add -D {{pkgName}}
17
+
18
+ # npm
19
+ npm add -D {{pkgName}}
20
+ ```
@@ -0,0 +1,20 @@
1
+ # {{pkgName}}
2
+
3
+ [![npm](https://img.shields.io/npm/v/{{pkgName}})](https://www.npmjs.com/package/{{pkgName}}) ![node-current (scoped)](https://img.shields.io/node/v/{{pkgName}}) ![license](https://img.shields.io/npm/l/{{pkgName}}) [![jsDocs.io](https://img.shields.io/badge/jsDocs.io-reference-blue)](https://www.jsdocs.io/package/{{pkgName}})
4
+
5
+ [English](./README.md) | **中文**
6
+
7
+ > 基础模板
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ # pnpm
13
+ pnpm add -D {{pkgName}}
14
+
15
+ # yarn
16
+ yarn add -D {{pkgName}}
17
+
18
+ # npm
19
+ npm add -D {{pkgName}}
20
+ ```
@@ -0,0 +1,10 @@
1
+ {
2
+ "license": "MIT",
3
+ "publishConfig": {
4
+ "access": "public",
5
+ "registry": "https://registry.npmjs.org"
6
+ },
7
+ "scripts": {
8
+ "prepublishOnly": "pnpm build"
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ export default {
2
+ '*.{vue,css,scss,html}': [
3
+ 'stylelint --fix',
4
+ 'eslint --fix',
5
+ ],
6
+ '*.{js,jsx,cjs,mjs,json,ts,tsx,md}': 'eslint --fix',
7
+ };
@@ -0,0 +1,12 @@
1
+ {
2
+ "scripts": {
3
+ "lint": "run-s lint:stylelint lint:eslint",
4
+ "lint:stylelint": "stylelint \"src/**/*.{css,scss,vue}\" --fix",
5
+ "lint:eslint": "eslint --fix"
6
+ },
7
+ "devDependencies": {
8
+ "@tomjs/stylelint": "^7.0.0",
9
+ "sass": "1.94.2",
10
+ "stylelint": "^16.26.1"
11
+ }
12
+ }
@@ -0,0 +1,3 @@
1
+ export default {
2
+ extends: ['@tomjs/stylelint'],
3
+ };