ylyx-cli 1.0.16 → 1.1.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 (289) hide show
  1. package/README.md +313 -276
  2. package/bin/ylyx.js +176 -168
  3. package/lib/config.js +325 -283
  4. package/lib/deploy.js +509 -529
  5. package/lib/environments.js +111 -0
  6. package/lib/generator.js +192 -192
  7. package/lib/index.js +113 -113
  8. package/lib/interactive.js +87 -87
  9. package/lib/remote.js +179 -179
  10. package/lib/template.js +174 -174
  11. package/lib/utils.js +148 -148
  12. package/package.json +61 -59
  13. package/templates/react-app/files/.gitignore +22 -0
  14. package/templates/react-app/files/README.md +23 -23
  15. package/templates/react-app/files/package.json +28 -28
  16. package/templates/react-app/files/public/index.html +11 -11
  17. package/templates/react-app/files/src/App.css +15 -15
  18. package/templates/react-app/files/src/App.js +15 -15
  19. package/templates/react-app/files/src/index.css +10 -10
  20. package/templates/react-app/files/src/index.js +11 -11
  21. package/templates/react-app/template.json +11 -11
  22. package/templates/react-component/files/Component.module.css +5 -5
  23. package/templates/react-component/files/Component.tsx +31 -31
  24. package/templates/react-component/files/index.ts +2 -2
  25. package/templates/react-component/template.json +48 -48
  26. package/templates/vue-app/files/.editorconfig +14 -14
  27. package/templates/vue-app/files/.env.development +21 -21
  28. package/templates/vue-app/files/.env.production +18 -18
  29. package/templates/vue-app/files/.eslintignore +5 -5
  30. package/templates/vue-app/files/.eslintrc.js +267 -267
  31. package/templates/vue-app/files/.gitignore +24 -0
  32. package/templates/vue-app/files/.prettierignore +11 -11
  33. package/templates/vue-app/files/.travis.yml +5 -5
  34. package/templates/vue-app/files/.vscode/extensions.json +7 -7
  35. package/templates/vue-app/files/.vscode/settings.json +39 -39
  36. package/templates/vue-app/files/LICENSE +191 -191
  37. package/templates/vue-app/files/README.md +87 -87
  38. package/templates/vue-app/files/babel.config.js +11 -11
  39. package/templates/vue-app/files/jest.config.js +24 -24
  40. package/templates/vue-app/files/package.json +136 -136
  41. package/templates/vue-app/files/plopfile.js +7 -7
  42. package/templates/vue-app/files/postcss.config.js +5 -5
  43. package/templates/vue-app/files/public/default.js +25 -25
  44. package/templates/vue-app/files/public/index.html +26 -26
  45. package/templates/vue-app/files/src/App.vue +54 -54
  46. package/templates/vue-app/files/src/api/bigDataV/index.js +198 -198
  47. package/templates/vue-app/files/src/api/data.js +42 -42
  48. package/templates/vue-app/files/src/api/dataArchive/index.js +186 -186
  49. package/templates/vue-app/files/src/api/generator/genConfig.js +16 -16
  50. package/templates/vue-app/files/src/api/generator/generator.js +32 -32
  51. package/templates/vue-app/files/src/api/indexManagement/index.js +39 -39
  52. package/templates/vue-app/files/src/api/institutionMonitor/index.js +396 -396
  53. package/templates/vue-app/files/src/api/institutionSet/index.js +120 -120
  54. package/templates/vue-app/files/src/api/login.js +44 -44
  55. package/templates/vue-app/files/src/api/selfStatistics/index.js +50 -50
  56. package/templates/vue-app/files/src/api/system/code.js +15 -15
  57. package/templates/vue-app/files/src/api/system/dict.js +34 -34
  58. package/templates/vue-app/files/src/api/system/dictDetail.js +52 -52
  59. package/templates/vue-app/files/src/api/system/equipment.js +35 -35
  60. package/templates/vue-app/files/src/api/system/examManage.js +49 -49
  61. package/templates/vue-app/files/src/api/system/examProject.js +48 -48
  62. package/templates/vue-app/files/src/api/system/hosModel.js +35 -35
  63. package/templates/vue-app/files/src/api/system/hospital.js +88 -88
  64. package/templates/vue-app/files/src/api/system/job.js +40 -40
  65. package/templates/vue-app/files/src/api/system/menu.js +67 -67
  66. package/templates/vue-app/files/src/api/system/model.js +42 -42
  67. package/templates/vue-app/files/src/api/system/risConfig.js +9 -9
  68. package/templates/vue-app/files/src/api/system/role.js +64 -64
  69. package/templates/vue-app/files/src/api/system/sysSet.js +19 -19
  70. package/templates/vue-app/files/src/api/system/timing.js +41 -41
  71. package/templates/vue-app/files/src/api/system/user.js +121 -121
  72. package/templates/vue-app/files/src/api/tools/alipay.js +25 -25
  73. package/templates/vue-app/files/src/api/tools/email.js +24 -24
  74. package/templates/vue-app/files/src/api/tools/localStorage.js +27 -27
  75. package/templates/vue-app/files/src/api/tools/qiniu.js +40 -40
  76. package/templates/vue-app/files/src/assets/css/font-awesome.css +2342 -2342
  77. package/templates/vue-app/files/src/assets/css/font-awesome.min.css +2336 -2336
  78. package/templates/vue-app/files/src/assets/fonts/fontawesome-webfont.svg +2671 -2671
  79. package/templates/vue-app/files/src/assets/icons/index.js +9 -9
  80. package/templates/vue-app/files/src/assets/icons/svg/hospital.svg +1 -1
  81. package/templates/vue-app/files/src/assets/icons/svg/hospital1.svg +1 -1
  82. package/templates/vue-app/files/src/assets/icons/svg/loginOne.svg +35 -35
  83. package/templates/vue-app/files/src/assets/icons/svg/loginOneWhite.svg +19 -19
  84. package/templates/vue-app/files/src/assets/icons/svg/loginOr.svg +93 -93
  85. package/templates/vue-app/files/src/assets/icons/svg/loginUp.svg +96 -96
  86. package/templates/vue-app/files/src/assets/icons/svg/monitor.svg +1 -1
  87. package/templates/vue-app/files/src/assets/icons/svg/offline.svg +1 -1
  88. package/templates/vue-app/files/src/assets/icons/svg/online.svg +1 -1
  89. package/templates/vue-app/files/src/assets/icons/svg/system.svg +1 -1
  90. package/templates/vue-app/files/src/assets/icons/svgo.yml +21 -21
  91. package/templates/vue-app/files/src/assets/styles/btn.scss +103 -103
  92. package/templates/vue-app/files/src/assets/styles/eladmin.scss +124 -124
  93. package/templates/vue-app/files/src/assets/styles/element-ui.scss +217 -217
  94. package/templates/vue-app/files/src/assets/styles/element-variables.scss +31 -31
  95. package/templates/vue-app/files/src/assets/styles/global.scss +73 -73
  96. package/templates/vue-app/files/src/assets/styles/index.scss +220 -220
  97. package/templates/vue-app/files/src/assets/styles/mixin.scss +60 -60
  98. package/templates/vue-app/files/src/assets/styles/publicStyle.scss +224 -224
  99. package/templates/vue-app/files/src/assets/styles/sidebar.scss +239 -239
  100. package/templates/vue-app/files/src/assets/styles/transition.scss +48 -48
  101. package/templates/vue-app/files/src/assets/styles/variables.scss +44 -44
  102. package/templates/vue-app/files/src/common/flexible.js +145 -145
  103. package/templates/vue-app/files/src/components/Breadcrumb/index.vue +87 -87
  104. package/templates/vue-app/files/src/components/Crud/CRUD.operation.vue +248 -248
  105. package/templates/vue-app/files/src/components/Crud/Pagination.vue +20 -20
  106. package/templates/vue-app/files/src/components/Crud/RR.operation.vue +39 -39
  107. package/templates/vue-app/files/src/components/Crud/UD.operation.vue +106 -106
  108. package/templates/vue-app/files/src/components/Crud/crud.js +907 -907
  109. package/templates/vue-app/files/src/components/Crud/user/UR.operation.vue +154 -154
  110. package/templates/vue-app/files/src/components/DateRangePicker/index.vue +42 -42
  111. package/templates/vue-app/files/src/components/DateRangePickerProhibitNext/index.vue +42 -42
  112. package/templates/vue-app/files/src/components/DateRangePickerProhibitTodayNext/index.vue +48 -48
  113. package/templates/vue-app/files/src/components/Dict/Dict.js +31 -31
  114. package/templates/vue-app/files/src/components/Dict/index.js +29 -29
  115. package/templates/vue-app/files/src/components/Doc/index.vue +16 -16
  116. package/templates/vue-app/files/src/components/Echarts/BarChart.vue +115 -115
  117. package/templates/vue-app/files/src/components/Echarts/Category.vue +768 -768
  118. package/templates/vue-app/files/src/components/Echarts/Funnel.vue +120 -120
  119. package/templates/vue-app/files/src/components/Echarts/Gauge.vue +74 -74
  120. package/templates/vue-app/files/src/components/Echarts/Graph.vue +101 -101
  121. package/templates/vue-app/files/src/components/Echarts/HeatMap.vue +301 -301
  122. package/templates/vue-app/files/src/components/Echarts/Line3D.vue +110 -110
  123. package/templates/vue-app/files/src/components/Echarts/PieChart.vue +84 -84
  124. package/templates/vue-app/files/src/components/Echarts/Point.vue +161 -161
  125. package/templates/vue-app/files/src/components/Echarts/RadarChart.vue +123 -123
  126. package/templates/vue-app/files/src/components/Echarts/Rich.vue +160 -160
  127. package/templates/vue-app/files/src/components/Echarts/Sankey.vue +114 -114
  128. package/templates/vue-app/files/src/components/Echarts/Scatter.vue +192 -192
  129. package/templates/vue-app/files/src/components/Echarts/Sunburst.vue +127 -127
  130. package/templates/vue-app/files/src/components/Echarts/ThemeRiver.vue +233 -233
  131. package/templates/vue-app/files/src/components/Echarts/WordCloud.vue +201 -201
  132. package/templates/vue-app/files/src/components/GithubCorner/index.vue +55 -55
  133. package/templates/vue-app/files/src/components/Hamburger/index.vue +44 -44
  134. package/templates/vue-app/files/src/components/HeaderSearch/index.vue +196 -196
  135. package/templates/vue-app/files/src/components/IconSelect/index.vue +74 -74
  136. package/templates/vue-app/files/src/components/IconSelect/requireIcons.js +10 -10
  137. package/templates/vue-app/files/src/components/Iframe/index.vue +30 -30
  138. package/templates/vue-app/files/src/components/JavaEdit/index.vue +78 -78
  139. package/templates/vue-app/files/src/components/Pagination/index.vue +100 -100
  140. package/templates/vue-app/files/src/components/PanThumb/index.vue +149 -149
  141. package/templates/vue-app/files/src/components/ParentView/index.vue +3 -3
  142. package/templates/vue-app/files/src/components/Permission/index.js +13 -13
  143. package/templates/vue-app/files/src/components/Permission/permission.js +21 -21
  144. package/templates/vue-app/files/src/components/RightPanel/index.vue +149 -149
  145. package/templates/vue-app/files/src/components/Screenfull/index.vue +60 -60
  146. package/templates/vue-app/files/src/components/SizeSelect/index.vue +60 -60
  147. package/templates/vue-app/files/src/components/SvgIcon/index.vue +66 -66
  148. package/templates/vue-app/files/src/components/ThemePicker/index.vue +177 -177
  149. package/templates/vue-app/files/src/components/UploadExcel/index.vue +149 -149
  150. package/templates/vue-app/files/src/components/WaterMark/setWaterMark.js +68 -68
  151. package/templates/vue-app/files/src/components/WaterMark/waterMark.vue +69 -69
  152. package/templates/vue-app/files/src/components/Xgplayer/index.vue +49 -49
  153. package/templates/vue-app/files/src/components/YamlEdit/index.vue +81 -81
  154. package/templates/vue-app/files/src/layout/components/AppMain.vue +67 -67
  155. package/templates/vue-app/files/src/layout/components/Navbar.vue +209 -209
  156. package/templates/vue-app/files/src/layout/components/Settings/index.vue +125 -125
  157. package/templates/vue-app/files/src/layout/components/Sidebar/FixiOSBug.js +26 -26
  158. package/templates/vue-app/files/src/layout/components/Sidebar/Item.vue +29 -29
  159. package/templates/vue-app/files/src/layout/components/Sidebar/Link.vue +35 -35
  160. package/templates/vue-app/files/src/layout/components/Sidebar/Logo.vue +93 -93
  161. package/templates/vue-app/files/src/layout/components/Sidebar/SidebarItem.vue +104 -104
  162. package/templates/vue-app/files/src/layout/components/Sidebar/index.vue +79 -79
  163. package/templates/vue-app/files/src/layout/components/TagsView/ScrollPane.vue +90 -90
  164. package/templates/vue-app/files/src/layout/components/TagsView/index.vue +299 -299
  165. package/templates/vue-app/files/src/layout/components/index.js +5 -5
  166. package/templates/vue-app/files/src/layout/index.vue +119 -119
  167. package/templates/vue-app/files/src/layout/mixin/ResizeHandler.js +45 -45
  168. package/templates/vue-app/files/src/main.js +89 -89
  169. package/templates/vue-app/files/src/mixins/crud.js +348 -348
  170. package/templates/vue-app/files/src/router/index.js +156 -156
  171. package/templates/vue-app/files/src/router/routers.js +203 -203
  172. package/templates/vue-app/files/src/settings.js +57 -57
  173. package/templates/vue-app/files/src/store/getters.js +29 -29
  174. package/templates/vue-app/files/src/store/index.js +25 -25
  175. package/templates/vue-app/files/src/store/modules/api.js +33 -33
  176. package/templates/vue-app/files/src/store/modules/app.js +55 -55
  177. package/templates/vue-app/files/src/store/modules/permission.js +79 -79
  178. package/templates/vue-app/files/src/store/modules/register.js +17 -17
  179. package/templates/vue-app/files/src/store/modules/settings.js +46 -46
  180. package/templates/vue-app/files/src/store/modules/tagsView.js +168 -168
  181. package/templates/vue-app/files/src/store/modules/user.js +119 -119
  182. package/templates/vue-app/files/src/utils/auth.js +18 -18
  183. package/templates/vue-app/files/src/utils/base64ToFile.js +27 -27
  184. package/templates/vue-app/files/src/utils/clipboard.js +36 -36
  185. package/templates/vue-app/files/src/utils/datetime.js +289 -289
  186. package/templates/vue-app/files/src/utils/getBlobFile.js +10 -10
  187. package/templates/vue-app/files/src/utils/getTime.js +29 -29
  188. package/templates/vue-app/files/src/utils/index.js +520 -520
  189. package/templates/vue-app/files/src/utils/permission.js +29 -29
  190. package/templates/vue-app/files/src/utils/pinyin.js +450 -450
  191. package/templates/vue-app/files/src/utils/request.js +139 -139
  192. package/templates/vue-app/files/src/utils/rsaEncrypt.js +37 -37
  193. package/templates/vue-app/files/src/utils/shortcuts.js +210 -210
  194. package/templates/vue-app/files/src/utils/upload.js +12 -12
  195. package/templates/vue-app/files/src/utils/validate.js +262 -262
  196. package/templates/vue-app/files/src/views/components/Echarts.vue +124 -124
  197. package/templates/vue-app/files/src/views/components/Editor.vue +75 -75
  198. package/templates/vue-app/files/src/views/components/MarkDown.vue +44 -44
  199. package/templates/vue-app/files/src/views/components/UVideo.vue +37 -37
  200. package/templates/vue-app/files/src/views/components/YamlEdit.vue +206 -206
  201. package/templates/vue-app/files/src/views/components/camera/camera.vue +115 -115
  202. package/templates/vue-app/files/src/views/components/camera/cameraTest.vue +158 -158
  203. package/templates/vue-app/files/src/views/components/excel/upload-excel.vue +41 -41
  204. package/templates/vue-app/files/src/views/components/icons/element-icons.js +74 -74
  205. package/templates/vue-app/files/src/views/components/icons/index.vue +106 -106
  206. package/templates/vue-app/files/src/views/components/icons/svg-icons.js +10 -10
  207. package/templates/vue-app/files/src/views/components/scroll/index.vue +107 -107
  208. package/templates/vue-app/files/src/views/components/scrollFull/index.vue +99 -99
  209. package/templates/vue-app/files/src/views/dashboard/LineChart.vue +138 -138
  210. package/templates/vue-app/files/src/views/dashboard/PanelGroup.vue +173 -173
  211. package/templates/vue-app/files/src/views/dashboard/mixins/resize.js +57 -57
  212. package/templates/vue-app/files/src/views/dataArchive/delTable.vue +354 -354
  213. package/templates/vue-app/files/src/views/dataArchive/exportDetail.vue +121 -121
  214. package/templates/vue-app/files/src/views/dataArchive/exportList.vue +160 -160
  215. package/templates/vue-app/files/src/views/dataArchive/index.vue +2104 -2104
  216. package/templates/vue-app/files/src/views/features/401.vue +83 -83
  217. package/templates/vue-app/files/src/views/features/404.vue +226 -226
  218. package/templates/vue-app/files/src/views/features/redirect.vue +12 -12
  219. package/templates/vue-app/files/src/views/generator/config.vue +348 -348
  220. package/templates/vue-app/files/src/views/generator/index.vue +143 -143
  221. package/templates/vue-app/files/src/views/generator/preview.vue +39 -39
  222. package/templates/vue-app/files/src/views/home.vue +80 -80
  223. package/templates/vue-app/files/src/views/indexManagement/index.vue +422 -422
  224. package/templates/vue-app/files/src/views/indexManagement/other.vue +286 -286
  225. package/templates/vue-app/files/src/views/institutionMonitor/components/LineChart.vue +191 -191
  226. package/templates/vue-app/files/src/views/institutionMonitor/index.scss +339 -339
  227. package/templates/vue-app/files/src/views/institutionMonitor/index.vue +1385 -1385
  228. package/templates/vue-app/files/src/views/institutionMonitor/mixins/resize.js +57 -57
  229. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/checkProjectCode.vue +267 -267
  230. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/imageAbnormalMonitor.vue +361 -361
  231. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/index.vue +686 -686
  232. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/leakageAnomaly.vue +270 -270
  233. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/moveMonitore.vue +114 -114
  234. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/qualityMonitore.vue +338 -338
  235. package/templates/vue-app/files/src/views/institutionSet/cloudSet.vue +534 -534
  236. package/templates/vue-app/files/src/views/institutionSet/index.vue +2550 -2550
  237. package/templates/vue-app/files/src/views/login.vue +243 -243
  238. package/templates/vue-app/files/src/views/qualityLogin.vue +280 -280
  239. package/templates/vue-app/files/src/views/selfStatistics/components/LineChart.vue +296 -296
  240. package/templates/vue-app/files/src/views/selfStatistics/hospitalDetail/index.vue +533 -533
  241. package/templates/vue-app/files/src/views/selfStatistics/index.scss +447 -447
  242. package/templates/vue-app/files/src/views/selfStatistics/index.vue +903 -903
  243. package/templates/vue-app/files/src/views/selfStatistics/mixins/resize.js +57 -57
  244. package/templates/vue-app/files/src/views/selfStatistics/monitorDetail/index.vue +285 -285
  245. package/templates/vue-app/files/src/views/selfStatistics/offlineDetail/index.vue +104 -104
  246. package/templates/vue-app/files/src/views/selfStatistics/selfActiveDetail/index.vue +104 -104
  247. package/templates/vue-app/files/src/views/selfStatistics/selfMonitorDetail/index.vue +420 -420
  248. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/setWaterMark.js +68 -68
  249. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/waterMark.vue +69 -69
  250. package/templates/vue-app/files/src/views/system/dept/index.vue +144 -144
  251. package/templates/vue-app/files/src/views/system/dict/dictDetail.vue +146 -146
  252. package/templates/vue-app/files/src/views/system/dict/index.vue +159 -159
  253. package/templates/vue-app/files/src/views/system/examModality/index.vue +174 -174
  254. package/templates/vue-app/files/src/views/system/examPart/index.vue +184 -184
  255. package/templates/vue-app/files/src/views/system/examProject/index.vue +321 -321
  256. package/templates/vue-app/files/src/views/system/examine/index.vue +66 -66
  257. package/templates/vue-app/files/src/views/system/job/index.vue +119 -119
  258. package/templates/vue-app/files/src/views/system/job/module/form.vue +72 -72
  259. package/templates/vue-app/files/src/views/system/job/module/header.vue +48 -48
  260. package/templates/vue-app/files/src/views/system/menu/index.vue +327 -327
  261. package/templates/vue-app/files/src/views/system/model/index.vue +285 -285
  262. package/templates/vue-app/files/src/views/system/role/index.vue +434 -434
  263. package/templates/vue-app/files/src/views/system/sysSet/index.vue +84 -84
  264. package/templates/vue-app/files/src/views/system/timing/index.vue +289 -289
  265. package/templates/vue-app/files/src/views/system/timing/log.vue +143 -143
  266. package/templates/vue-app/files/src/views/system/user/admin.vue +414 -414
  267. package/templates/vue-app/files/src/views/system/user/center/updateEmail.vue +146 -146
  268. package/templates/vue-app/files/src/views/system/user/center/updatePass.vue +168 -168
  269. package/templates/vue-app/files/src/views/system/user/center.vue +140 -140
  270. package/templates/vue-app/files/src/views/system/user/index.vue +972 -972
  271. package/templates/vue-app/files/src/views/systemSet/role/index.vue +314 -314
  272. package/templates/vue-app/files/src/views/systemSet/user/admin.vue +414 -414
  273. package/templates/vue-app/files/src/views/systemSet/user/center/updateEmail.vue +146 -146
  274. package/templates/vue-app/files/src/views/systemSet/user/center/updatePass.vue +115 -115
  275. package/templates/vue-app/files/src/views/systemSet/user/center.vue +351 -351
  276. package/templates/vue-app/files/src/views/systemSet/user/index.vue +928 -928
  277. package/templates/vue-app/files/src/views/tools/aliPay/config.vue +102 -102
  278. package/templates/vue-app/files/src/views/tools/aliPay/index.vue +48 -48
  279. package/templates/vue-app/files/src/views/tools/aliPay/toPay.vue +91 -91
  280. package/templates/vue-app/files/src/views/tools/email/config.vue +91 -91
  281. package/templates/vue-app/files/src/views/tools/email/index.vue +42 -42
  282. package/templates/vue-app/files/src/views/tools/email/send.vue +159 -159
  283. package/templates/vue-app/files/src/views/tools/storage/index.vue +35 -35
  284. package/templates/vue-app/files/src/views/tools/storage/local/index.vue +207 -207
  285. package/templates/vue-app/files/src/views/tools/storage/qiniu/form.vue +108 -108
  286. package/templates/vue-app/files/src/views/tools/storage/qiniu/index.vue +241 -241
  287. package/templates/vue-app/files/src/views/tools/swagger/index.vue +14 -14
  288. package/templates/vue-app/files/vue.config.js +173 -173
  289. package/templates/vue-app/template.json +29 -29
@@ -0,0 +1,111 @@
1
+ const path = require('path');
2
+ const fs = require('fs-extra');
3
+
4
+ const CONFIG_VERSION = 2;
5
+
6
+ function getConfigPath() {
7
+ return path.join(process.cwd(), '.ylyxrc.json');
8
+ }
9
+
10
+ function readConfigSafe(configPath) {
11
+ if (!fs.existsSync(configPath)) return {};
12
+ try {
13
+ return fs.readJsonSync(configPath);
14
+ } catch (e) {
15
+ throw new Error(`读取 .ylyxrc.json 失败,请确认它是有效 JSON:${e.message}`);
16
+ }
17
+ }
18
+
19
+ function isConfigMigrated(config) {
20
+ return !!config && typeof config.configVersion === 'number' && config.configVersion >= CONFIG_VERSION;
21
+ }
22
+
23
+ function assertConfigMigrated(config, configExists) {
24
+ if (!isConfigMigrated(config)) {
25
+ if (configExists === false) {
26
+ throw new Error(
27
+ '未找到 .ylyxrc.json 配置文件\n' +
28
+ ' 请先运行以下命令初始化配置:\n' +
29
+ ' ylyx init config'
30
+ );
31
+ }
32
+ throw new Error(
33
+ '检测到旧版配置(.ylyxrc.json 缺少 configVersion)\n' +
34
+ ' 请先运行以下命令完成迁移:\n' +
35
+ ' ylyx migrate config'
36
+ );
37
+ }
38
+ }
39
+
40
+ function findEnvironment(config, name) {
41
+ const environments = (config && config.environments) || [];
42
+ const env = environments.find((e) => e.name === name);
43
+ if (!env) {
44
+ const available = environments.map((e) => e.name).join(', ') || '(无)';
45
+ throw new Error(`环境不存在: ${name}\n可用环境: ${available}`);
46
+ }
47
+ return env;
48
+ }
49
+
50
+ /**
51
+ * 将旧版 .ylyxrc.json(mode/deploy/顶层 buildDir/preScripts)转换为新版 environments 结构
52
+ * 纯函数:不读写文件,方便单独验证
53
+ */
54
+ function buildMigratedConfig(oldConfig) {
55
+ oldConfig = oldConfig || {};
56
+ const oldMode = oldConfig.mode === 'prod' ? 'prod' : 'dev';
57
+ const oldDeploy = oldConfig.deploy || {};
58
+ const oldPreScripts = oldConfig.preScripts || {};
59
+ const oldBuildDir = oldConfig.buildDir;
60
+
61
+ const devEnv = {
62
+ name: 'dev',
63
+ isLocal: true,
64
+ npmScript: oldPreScripts.dev || 'dev',
65
+ deployMethod: 'none',
66
+ };
67
+
68
+ const testEnv = {
69
+ name: 'test',
70
+ npmScript: 'build:test',
71
+ deployMethod: 'upload',
72
+ buildDir: oldDeploy.buildDir || oldBuildDir || '',
73
+ host: oldDeploy.host || '',
74
+ port: oldDeploy.port || '22',
75
+ username: oldDeploy.username || '',
76
+ password: oldDeploy.password || '',
77
+ localDir: oldDeploy.localDir || '',
78
+ remoteDir: oldDeploy.remoteDir || '',
79
+ zipAfter: oldDeploy.zipAfter || false,
80
+ };
81
+
82
+ const prodEnv = {
83
+ name: 'prod',
84
+ npmScript: oldPreScripts.prod || 'build:prod',
85
+ deployMethod: 'zip',
86
+ buildDir: oldBuildDir || '',
87
+ zipOutDir: oldDeploy.zipOutDir || './.ylyx-deploy',
88
+ };
89
+
90
+ const next = { ...oldConfig };
91
+ delete next.mode;
92
+ delete next.deploy;
93
+ delete next.buildDir;
94
+ delete next.preScripts;
95
+
96
+ next.configVersion = CONFIG_VERSION;
97
+ next.currentEnv = oldMode;
98
+ next.environments = [devEnv, testEnv, prodEnv];
99
+
100
+ return next;
101
+ }
102
+
103
+ module.exports = {
104
+ CONFIG_VERSION,
105
+ getConfigPath,
106
+ readConfigSafe,
107
+ isConfigMigrated,
108
+ assertConfigMigrated,
109
+ findEnvironment,
110
+ buildMigratedConfig,
111
+ };
package/lib/generator.js CHANGED
@@ -1,192 +1,192 @@
1
- const fs = require('fs-extra');
2
- const path = require('path');
3
- const handlebars = require('handlebars');
4
- const glob = require('glob');
5
- const { minimatch } = require('minimatch');
6
- const { registerHandlebarsHelpers, log } = require('./utils');
7
-
8
- // 注册 Handlebars 辅助函数
9
- registerHandlebarsHelpers(handlebars);
10
-
11
- /**
12
- * 判断文件是否需要 Handlebars 处理
13
- */
14
- function shouldProcessFile(filePath, templateConfig = {}) {
15
- const filePathNormalized = filePath.replace(/\\/g, '/'); // 统一使用正斜杠
16
-
17
- // 如果配置了 skipFiles(黑名单),先检查是否应该跳过
18
- if (templateConfig.skipFiles && Array.isArray(templateConfig.skipFiles)) {
19
- const shouldSkip = templateConfig.skipFiles.some((pattern) => {
20
- if (typeof pattern === 'string') {
21
- return minimatch(filePathNormalized, pattern, { matchBase: true });
22
- }
23
- return false;
24
- });
25
- if (shouldSkip) {
26
- return false; // 在黑名单中,不处理
27
- }
28
- }
29
-
30
- // 如果配置了 processFiles(白名单),只处理列表中的文件
31
- if (templateConfig.processFiles && Array.isArray(templateConfig.processFiles)) {
32
- const inWhitelist = templateConfig.processFiles.some((pattern) => {
33
- if (typeof pattern === 'string') {
34
- // 支持通配符匹配,使用 matchBase 以便匹配文件名
35
- return minimatch(filePathNormalized, pattern, { matchBase: true });
36
- }
37
- return false;
38
- });
39
- return inWhitelist; // 在白名单中返回 true,不在返回 false
40
- }
41
-
42
- // 默认策略:只处理常见的配置文件和文档文件
43
- // 跳过代码文件(可能包含 Vue/React 模板语法)
44
- const processExtensions = ['.json', '.md', '.html', '.txt', '.yml', '.yaml', '.env'];
45
- const processBasenames = ['.gitignore', '.editorconfig', '.prettierignore', '.eslintignore'];
46
- const skipExtensions = ['.vue', '.js', '.ts', '.jsx', '.tsx', '.css', '.scss', '.less', '.sass', '.styl'];
47
-
48
- const ext = path.extname(filePath).toLowerCase();
49
- const basename = path.basename(filePath).toLowerCase();
50
-
51
- // 如果文件扩展名在跳过列表中,不处理
52
- if (skipExtensions.includes(ext)) {
53
- return false;
54
- }
55
-
56
- // 如果文件扩展名或文件名在处理列表中,处理
57
- if (processExtensions.includes(ext) || processBasenames.includes(basename)) {
58
- return true;
59
- }
60
-
61
- // 默认不处理(安全起见,避免破坏代码文件)
62
- return false;
63
- }
64
-
65
- /**
66
- * 处理文件内容,替换模板变量
67
- */
68
- function processFileContent(content, variables) {
69
- try {
70
- const template = handlebars.compile(content, { noEscape: true, strict: false });
71
- return template(variables);
72
- } catch (e) {
73
- // 如果处理失败,返回原内容(避免因为 Vue 模板语法等导致失败)
74
- // 注意:这个函数只应该在 shouldProcessFile 返回 true 时调用
75
- // 如果还是失败了(比如文件中有复杂语法),返回原内容
76
- return content;
77
- }
78
- }
79
-
80
- /**
81
- * 处理文件名,替换模板变量
82
- */
83
- function processFileName(fileName, variables) {
84
- try {
85
- // 使用 Handlebars 处理文件名,支持 helper 函数
86
- const template = handlebars.compile(fileName, { noEscape: true, strict: false });
87
- return template(variables);
88
- } catch (e) {
89
- // 如果 Handlebars 编译失败,尝试简单字符串替换
90
- let result = fileName;
91
- Object.keys(variables).forEach((key) => {
92
- if (typeof variables[key] === 'string') {
93
- const pattern = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
94
- result = result.replace(pattern, variables[key]);
95
- }
96
- });
97
- return result;
98
- }
99
- }
100
-
101
- /**
102
- * 获取模板文件列表
103
- */
104
- function getTemplateFiles(templatePath) {
105
- const filesDir = path.join(templatePath, 'files');
106
-
107
- if (!fs.existsSync(filesDir)) {
108
- throw new Error(`模板文件目录不存在: ${filesDir}`);
109
- }
110
-
111
- // 使用 glob 匹配所有文件(排除 node_modules 等)
112
- // 在 Windows 上,glob 需要正斜杠路径
113
- const pattern = path.join(filesDir, '**', '*').replace(/\\/g, '/');
114
- const files = glob.sync(pattern, {
115
- dot: true,
116
- nodir: true,
117
- ignore: ['**/node_modules/**', '**/.git/**'],
118
- });
119
-
120
- return files.map((file) => {
121
- // glob 返回的是绝对路径
122
- return {
123
- absolutePath: file,
124
- relativePath: path.relative(filesDir, file),
125
- };
126
- });
127
- }
128
-
129
- /**
130
- * 生成代码文件
131
- */
132
- async function generateFiles(templatePath, outputDir, variables, templateConfig = {}) {
133
- const files = getTemplateFiles(templatePath);
134
-
135
- if (files.length === 0) {
136
- log.warn('模板中没有找到文件');
137
- return;
138
- }
139
-
140
- log.info(`开始生成 ${files.length} 个文件...\n`);
141
-
142
- for (const file of files) {
143
- try {
144
- // 读取文件内容
145
- const content = fs.readFileSync(file.absolutePath, 'utf-8');
146
-
147
- // 判断是否需要 Handlebars 处理
148
- // 默认只处理配置文件(如 .json, .md),跳过代码文件(如 .vue, .js)避免冲突
149
- const needProcess = shouldProcessFile(file.relativePath, templateConfig);
150
- const processedContent = needProcess ? processFileContent(content, variables) : content;
151
-
152
- // 处理文件名
153
- let processedFileName = file.relativePath;
154
-
155
- // 如果配置了 fileMappings,优先使用映射
156
- if (templateConfig.fileMappings) {
157
- const fileName = path.basename(file.relativePath);
158
- const dirName = path.dirname(file.relativePath);
159
- if (templateConfig.fileMappings[fileName]) {
160
- const mappedName = processFileName(templateConfig.fileMappings[fileName], variables);
161
- processedFileName = dirName !== '.' ? path.join(dirName, mappedName) : mappedName;
162
- } else {
163
- processedFileName = processFileName(file.relativePath, variables);
164
- }
165
- } else {
166
- processedFileName = processFileName(file.relativePath, variables);
167
- }
168
-
169
- // 生成目标文件路径
170
- const targetPath = path.join(outputDir, processedFileName);
171
- const targetDir = path.dirname(targetPath);
172
-
173
- // 确保目录存在
174
- fs.ensureDirSync(targetDir);
175
-
176
- // 写入文件
177
- fs.writeFileSync(targetPath, processedContent, 'utf-8');
178
-
179
- log.success(`生成: ${processedFileName}`);
180
- } catch (e) {
181
- log.error(`处理文件失败 ${file.relativePath}: ${e.message}`);
182
- throw e;
183
- }
184
- }
185
-
186
- console.log('');
187
- log.success('代码生成完成!');
188
- }
189
-
190
- module.exports = {
191
- generateFiles,
192
- };
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const handlebars = require('handlebars');
4
+ const glob = require('glob');
5
+ const { minimatch } = require('minimatch');
6
+ const { registerHandlebarsHelpers, log } = require('./utils');
7
+
8
+ // 注册 Handlebars 辅助函数
9
+ registerHandlebarsHelpers(handlebars);
10
+
11
+ /**
12
+ * 判断文件是否需要 Handlebars 处理
13
+ */
14
+ function shouldProcessFile(filePath, templateConfig = {}) {
15
+ const filePathNormalized = filePath.replace(/\\/g, '/'); // 统一使用正斜杠
16
+
17
+ // 如果配置了 skipFiles(黑名单),先检查是否应该跳过
18
+ if (templateConfig.skipFiles && Array.isArray(templateConfig.skipFiles)) {
19
+ const shouldSkip = templateConfig.skipFiles.some((pattern) => {
20
+ if (typeof pattern === 'string') {
21
+ return minimatch(filePathNormalized, pattern, { matchBase: true });
22
+ }
23
+ return false;
24
+ });
25
+ if (shouldSkip) {
26
+ return false; // 在黑名单中,不处理
27
+ }
28
+ }
29
+
30
+ // 如果配置了 processFiles(白名单),只处理列表中的文件
31
+ if (templateConfig.processFiles && Array.isArray(templateConfig.processFiles)) {
32
+ const inWhitelist = templateConfig.processFiles.some((pattern) => {
33
+ if (typeof pattern === 'string') {
34
+ // 支持通配符匹配,使用 matchBase 以便匹配文件名
35
+ return minimatch(filePathNormalized, pattern, { matchBase: true });
36
+ }
37
+ return false;
38
+ });
39
+ return inWhitelist; // 在白名单中返回 true,不在返回 false
40
+ }
41
+
42
+ // 默认策略:只处理常见的配置文件和文档文件
43
+ // 跳过代码文件(可能包含 Vue/React 模板语法)
44
+ const processExtensions = ['.json', '.md', '.html', '.txt', '.yml', '.yaml', '.env'];
45
+ const processBasenames = ['.gitignore', '.editorconfig', '.prettierignore', '.eslintignore'];
46
+ const skipExtensions = ['.vue', '.js', '.ts', '.jsx', '.tsx', '.css', '.scss', '.less', '.sass', '.styl'];
47
+
48
+ const ext = path.extname(filePath).toLowerCase();
49
+ const basename = path.basename(filePath).toLowerCase();
50
+
51
+ // 如果文件扩展名在跳过列表中,不处理
52
+ if (skipExtensions.includes(ext)) {
53
+ return false;
54
+ }
55
+
56
+ // 如果文件扩展名或文件名在处理列表中,处理
57
+ if (processExtensions.includes(ext) || processBasenames.includes(basename)) {
58
+ return true;
59
+ }
60
+
61
+ // 默认不处理(安全起见,避免破坏代码文件)
62
+ return false;
63
+ }
64
+
65
+ /**
66
+ * 处理文件内容,替换模板变量
67
+ */
68
+ function processFileContent(content, variables) {
69
+ try {
70
+ const template = handlebars.compile(content, { noEscape: true, strict: false });
71
+ return template(variables);
72
+ } catch (e) {
73
+ // 如果处理失败,返回原内容(避免因为 Vue 模板语法等导致失败)
74
+ // 注意:这个函数只应该在 shouldProcessFile 返回 true 时调用
75
+ // 如果还是失败了(比如文件中有复杂语法),返回原内容
76
+ return content;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * 处理文件名,替换模板变量
82
+ */
83
+ function processFileName(fileName, variables) {
84
+ try {
85
+ // 使用 Handlebars 处理文件名,支持 helper 函数
86
+ const template = handlebars.compile(fileName, { noEscape: true, strict: false });
87
+ return template(variables);
88
+ } catch (e) {
89
+ // 如果 Handlebars 编译失败,尝试简单字符串替换
90
+ let result = fileName;
91
+ Object.keys(variables).forEach((key) => {
92
+ if (typeof variables[key] === 'string') {
93
+ const pattern = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
94
+ result = result.replace(pattern, variables[key]);
95
+ }
96
+ });
97
+ return result;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * 获取模板文件列表
103
+ */
104
+ function getTemplateFiles(templatePath) {
105
+ const filesDir = path.join(templatePath, 'files');
106
+
107
+ if (!fs.existsSync(filesDir)) {
108
+ throw new Error(`模板文件目录不存在: ${filesDir}`);
109
+ }
110
+
111
+ // 使用 glob 匹配所有文件(排除 node_modules 等)
112
+ // 在 Windows 上,glob 需要正斜杠路径
113
+ const pattern = path.join(filesDir, '**', '*').replace(/\\/g, '/');
114
+ const files = glob.sync(pattern, {
115
+ dot: true,
116
+ nodir: true,
117
+ ignore: ['**/node_modules/**', '**/.git/**'],
118
+ });
119
+
120
+ return files.map((file) => {
121
+ // glob 返回的是绝对路径
122
+ return {
123
+ absolutePath: file,
124
+ relativePath: path.relative(filesDir, file),
125
+ };
126
+ });
127
+ }
128
+
129
+ /**
130
+ * 生成代码文件
131
+ */
132
+ async function generateFiles(templatePath, outputDir, variables, templateConfig = {}) {
133
+ const files = getTemplateFiles(templatePath);
134
+
135
+ if (files.length === 0) {
136
+ log.warn('模板中没有找到文件');
137
+ return;
138
+ }
139
+
140
+ log.info(`开始生成 ${files.length} 个文件...\n`);
141
+
142
+ for (const file of files) {
143
+ try {
144
+ // 读取文件内容
145
+ const content = fs.readFileSync(file.absolutePath, 'utf-8');
146
+
147
+ // 判断是否需要 Handlebars 处理
148
+ // 默认只处理配置文件(如 .json, .md),跳过代码文件(如 .vue, .js)避免冲突
149
+ const needProcess = shouldProcessFile(file.relativePath, templateConfig);
150
+ const processedContent = needProcess ? processFileContent(content, variables) : content;
151
+
152
+ // 处理文件名
153
+ let processedFileName = file.relativePath;
154
+
155
+ // 如果配置了 fileMappings,优先使用映射
156
+ if (templateConfig.fileMappings) {
157
+ const fileName = path.basename(file.relativePath);
158
+ const dirName = path.dirname(file.relativePath);
159
+ if (templateConfig.fileMappings[fileName]) {
160
+ const mappedName = processFileName(templateConfig.fileMappings[fileName], variables);
161
+ processedFileName = dirName !== '.' ? path.join(dirName, mappedName) : mappedName;
162
+ } else {
163
+ processedFileName = processFileName(file.relativePath, variables);
164
+ }
165
+ } else {
166
+ processedFileName = processFileName(file.relativePath, variables);
167
+ }
168
+
169
+ // 生成目标文件路径
170
+ const targetPath = path.join(outputDir, processedFileName);
171
+ const targetDir = path.dirname(targetPath);
172
+
173
+ // 确保目录存在
174
+ fs.ensureDirSync(targetDir);
175
+
176
+ // 写入文件
177
+ fs.writeFileSync(targetPath, processedContent, 'utf-8');
178
+
179
+ log.success(`生成: ${processedFileName}`);
180
+ } catch (e) {
181
+ log.error(`处理文件失败 ${file.relativePath}: ${e.message}`);
182
+ throw e;
183
+ }
184
+ }
185
+
186
+ console.log('');
187
+ log.success('代码生成完成!');
188
+ }
189
+
190
+ module.exports = {
191
+ generateFiles,
192
+ };