ylyx-cli 1.0.15 → 1.0.16

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 (285) hide show
  1. package/bin/ylyx.js +168 -168
  2. package/lib/config.js +283 -299
  3. package/lib/deploy.js +529 -495
  4. package/lib/generator.js +192 -192
  5. package/lib/index.js +113 -113
  6. package/lib/interactive.js +87 -87
  7. package/lib/remote.js +179 -179
  8. package/lib/template.js +174 -174
  9. package/lib/utils.js +148 -148
  10. package/package.json +5 -5
  11. package/templates/react-app/files/README.md +23 -23
  12. package/templates/react-app/files/package.json +28 -28
  13. package/templates/react-app/files/public/index.html +11 -11
  14. package/templates/react-app/files/src/App.css +15 -15
  15. package/templates/react-app/files/src/App.js +15 -15
  16. package/templates/react-app/files/src/index.css +10 -10
  17. package/templates/react-app/files/src/index.js +11 -11
  18. package/templates/react-app/template.json +11 -11
  19. package/templates/react-component/files/Component.module.css +5 -5
  20. package/templates/react-component/files/Component.tsx +31 -31
  21. package/templates/react-component/files/index.ts +2 -2
  22. package/templates/react-component/template.json +48 -48
  23. package/templates/vue-app/files/.editorconfig +14 -14
  24. package/templates/vue-app/files/.env.development +21 -21
  25. package/templates/vue-app/files/.env.production +18 -18
  26. package/templates/vue-app/files/.eslintignore +5 -5
  27. package/templates/vue-app/files/.eslintrc.js +267 -267
  28. package/templates/vue-app/files/.prettierignore +11 -11
  29. package/templates/vue-app/files/.travis.yml +5 -5
  30. package/templates/vue-app/files/.vscode/extensions.json +7 -7
  31. package/templates/vue-app/files/.vscode/settings.json +39 -39
  32. package/templates/vue-app/files/LICENSE +191 -191
  33. package/templates/vue-app/files/README.md +87 -87
  34. package/templates/vue-app/files/babel.config.js +11 -11
  35. package/templates/vue-app/files/jest.config.js +24 -24
  36. package/templates/vue-app/files/package.json +136 -136
  37. package/templates/vue-app/files/plopfile.js +7 -7
  38. package/templates/vue-app/files/postcss.config.js +5 -5
  39. package/templates/vue-app/files/public/default.js +25 -25
  40. package/templates/vue-app/files/public/index.html +26 -26
  41. package/templates/vue-app/files/src/App.vue +54 -54
  42. package/templates/vue-app/files/src/api/bigDataV/index.js +198 -198
  43. package/templates/vue-app/files/src/api/data.js +42 -42
  44. package/templates/vue-app/files/src/api/dataArchive/index.js +186 -186
  45. package/templates/vue-app/files/src/api/generator/genConfig.js +16 -16
  46. package/templates/vue-app/files/src/api/generator/generator.js +32 -32
  47. package/templates/vue-app/files/src/api/indexManagement/index.js +39 -39
  48. package/templates/vue-app/files/src/api/institutionMonitor/index.js +396 -396
  49. package/templates/vue-app/files/src/api/institutionSet/index.js +120 -120
  50. package/templates/vue-app/files/src/api/login.js +44 -44
  51. package/templates/vue-app/files/src/api/selfStatistics/index.js +50 -50
  52. package/templates/vue-app/files/src/api/system/code.js +15 -15
  53. package/templates/vue-app/files/src/api/system/dict.js +34 -34
  54. package/templates/vue-app/files/src/api/system/dictDetail.js +52 -52
  55. package/templates/vue-app/files/src/api/system/equipment.js +35 -35
  56. package/templates/vue-app/files/src/api/system/examManage.js +49 -49
  57. package/templates/vue-app/files/src/api/system/examProject.js +48 -48
  58. package/templates/vue-app/files/src/api/system/hosModel.js +35 -35
  59. package/templates/vue-app/files/src/api/system/hospital.js +88 -88
  60. package/templates/vue-app/files/src/api/system/job.js +40 -40
  61. package/templates/vue-app/files/src/api/system/menu.js +67 -67
  62. package/templates/vue-app/files/src/api/system/model.js +42 -42
  63. package/templates/vue-app/files/src/api/system/risConfig.js +9 -9
  64. package/templates/vue-app/files/src/api/system/role.js +64 -64
  65. package/templates/vue-app/files/src/api/system/sysSet.js +19 -19
  66. package/templates/vue-app/files/src/api/system/timing.js +41 -41
  67. package/templates/vue-app/files/src/api/system/user.js +121 -121
  68. package/templates/vue-app/files/src/api/tools/alipay.js +25 -25
  69. package/templates/vue-app/files/src/api/tools/email.js +24 -24
  70. package/templates/vue-app/files/src/api/tools/localStorage.js +27 -27
  71. package/templates/vue-app/files/src/api/tools/qiniu.js +40 -40
  72. package/templates/vue-app/files/src/assets/css/font-awesome.css +2342 -2342
  73. package/templates/vue-app/files/src/assets/css/font-awesome.min.css +2336 -2336
  74. package/templates/vue-app/files/src/assets/fonts/fontawesome-webfont.svg +2671 -2671
  75. package/templates/vue-app/files/src/assets/icons/index.js +9 -9
  76. package/templates/vue-app/files/src/assets/icons/svg/hospital.svg +1 -1
  77. package/templates/vue-app/files/src/assets/icons/svg/hospital1.svg +1 -1
  78. package/templates/vue-app/files/src/assets/icons/svg/loginOne.svg +35 -35
  79. package/templates/vue-app/files/src/assets/icons/svg/loginOneWhite.svg +19 -19
  80. package/templates/vue-app/files/src/assets/icons/svg/loginOr.svg +93 -93
  81. package/templates/vue-app/files/src/assets/icons/svg/loginUp.svg +96 -96
  82. package/templates/vue-app/files/src/assets/icons/svg/monitor.svg +1 -1
  83. package/templates/vue-app/files/src/assets/icons/svg/offline.svg +1 -1
  84. package/templates/vue-app/files/src/assets/icons/svg/online.svg +1 -1
  85. package/templates/vue-app/files/src/assets/icons/svg/system.svg +1 -1
  86. package/templates/vue-app/files/src/assets/icons/svgo.yml +21 -21
  87. package/templates/vue-app/files/src/assets/styles/btn.scss +103 -103
  88. package/templates/vue-app/files/src/assets/styles/eladmin.scss +124 -124
  89. package/templates/vue-app/files/src/assets/styles/element-ui.scss +217 -217
  90. package/templates/vue-app/files/src/assets/styles/element-variables.scss +31 -31
  91. package/templates/vue-app/files/src/assets/styles/global.scss +73 -73
  92. package/templates/vue-app/files/src/assets/styles/index.scss +220 -220
  93. package/templates/vue-app/files/src/assets/styles/mixin.scss +60 -60
  94. package/templates/vue-app/files/src/assets/styles/publicStyle.scss +224 -224
  95. package/templates/vue-app/files/src/assets/styles/sidebar.scss +239 -239
  96. package/templates/vue-app/files/src/assets/styles/transition.scss +48 -48
  97. package/templates/vue-app/files/src/assets/styles/variables.scss +44 -44
  98. package/templates/vue-app/files/src/common/flexible.js +145 -145
  99. package/templates/vue-app/files/src/components/Breadcrumb/index.vue +87 -87
  100. package/templates/vue-app/files/src/components/Crud/CRUD.operation.vue +248 -248
  101. package/templates/vue-app/files/src/components/Crud/Pagination.vue +20 -20
  102. package/templates/vue-app/files/src/components/Crud/RR.operation.vue +39 -39
  103. package/templates/vue-app/files/src/components/Crud/UD.operation.vue +106 -106
  104. package/templates/vue-app/files/src/components/Crud/crud.js +907 -907
  105. package/templates/vue-app/files/src/components/Crud/user/UR.operation.vue +154 -154
  106. package/templates/vue-app/files/src/components/DateRangePicker/index.vue +42 -42
  107. package/templates/vue-app/files/src/components/DateRangePickerProhibitNext/index.vue +42 -42
  108. package/templates/vue-app/files/src/components/DateRangePickerProhibitTodayNext/index.vue +48 -48
  109. package/templates/vue-app/files/src/components/Dict/Dict.js +31 -31
  110. package/templates/vue-app/files/src/components/Dict/index.js +29 -29
  111. package/templates/vue-app/files/src/components/Doc/index.vue +16 -16
  112. package/templates/vue-app/files/src/components/Echarts/BarChart.vue +115 -115
  113. package/templates/vue-app/files/src/components/Echarts/Category.vue +768 -768
  114. package/templates/vue-app/files/src/components/Echarts/Funnel.vue +120 -120
  115. package/templates/vue-app/files/src/components/Echarts/Gauge.vue +74 -74
  116. package/templates/vue-app/files/src/components/Echarts/Graph.vue +101 -101
  117. package/templates/vue-app/files/src/components/Echarts/HeatMap.vue +301 -301
  118. package/templates/vue-app/files/src/components/Echarts/Line3D.vue +110 -110
  119. package/templates/vue-app/files/src/components/Echarts/PieChart.vue +84 -84
  120. package/templates/vue-app/files/src/components/Echarts/Point.vue +161 -161
  121. package/templates/vue-app/files/src/components/Echarts/RadarChart.vue +123 -123
  122. package/templates/vue-app/files/src/components/Echarts/Rich.vue +160 -160
  123. package/templates/vue-app/files/src/components/Echarts/Sankey.vue +114 -114
  124. package/templates/vue-app/files/src/components/Echarts/Scatter.vue +192 -192
  125. package/templates/vue-app/files/src/components/Echarts/Sunburst.vue +127 -127
  126. package/templates/vue-app/files/src/components/Echarts/ThemeRiver.vue +233 -233
  127. package/templates/vue-app/files/src/components/Echarts/WordCloud.vue +201 -201
  128. package/templates/vue-app/files/src/components/GithubCorner/index.vue +55 -55
  129. package/templates/vue-app/files/src/components/Hamburger/index.vue +44 -44
  130. package/templates/vue-app/files/src/components/HeaderSearch/index.vue +196 -196
  131. package/templates/vue-app/files/src/components/IconSelect/index.vue +74 -74
  132. package/templates/vue-app/files/src/components/IconSelect/requireIcons.js +10 -10
  133. package/templates/vue-app/files/src/components/Iframe/index.vue +30 -30
  134. package/templates/vue-app/files/src/components/JavaEdit/index.vue +78 -78
  135. package/templates/vue-app/files/src/components/Pagination/index.vue +100 -100
  136. package/templates/vue-app/files/src/components/PanThumb/index.vue +149 -149
  137. package/templates/vue-app/files/src/components/ParentView/index.vue +3 -3
  138. package/templates/vue-app/files/src/components/Permission/index.js +13 -13
  139. package/templates/vue-app/files/src/components/Permission/permission.js +21 -21
  140. package/templates/vue-app/files/src/components/RightPanel/index.vue +149 -149
  141. package/templates/vue-app/files/src/components/Screenfull/index.vue +60 -60
  142. package/templates/vue-app/files/src/components/SizeSelect/index.vue +60 -60
  143. package/templates/vue-app/files/src/components/SvgIcon/index.vue +66 -66
  144. package/templates/vue-app/files/src/components/ThemePicker/index.vue +177 -177
  145. package/templates/vue-app/files/src/components/UploadExcel/index.vue +149 -149
  146. package/templates/vue-app/files/src/components/WaterMark/setWaterMark.js +68 -68
  147. package/templates/vue-app/files/src/components/WaterMark/waterMark.vue +69 -69
  148. package/templates/vue-app/files/src/components/Xgplayer/index.vue +49 -49
  149. package/templates/vue-app/files/src/components/YamlEdit/index.vue +81 -81
  150. package/templates/vue-app/files/src/layout/components/AppMain.vue +67 -67
  151. package/templates/vue-app/files/src/layout/components/Navbar.vue +209 -209
  152. package/templates/vue-app/files/src/layout/components/Settings/index.vue +125 -125
  153. package/templates/vue-app/files/src/layout/components/Sidebar/FixiOSBug.js +26 -26
  154. package/templates/vue-app/files/src/layout/components/Sidebar/Item.vue +29 -29
  155. package/templates/vue-app/files/src/layout/components/Sidebar/Link.vue +35 -35
  156. package/templates/vue-app/files/src/layout/components/Sidebar/Logo.vue +93 -93
  157. package/templates/vue-app/files/src/layout/components/Sidebar/SidebarItem.vue +104 -104
  158. package/templates/vue-app/files/src/layout/components/Sidebar/index.vue +79 -79
  159. package/templates/vue-app/files/src/layout/components/TagsView/ScrollPane.vue +90 -90
  160. package/templates/vue-app/files/src/layout/components/TagsView/index.vue +299 -299
  161. package/templates/vue-app/files/src/layout/components/index.js +5 -5
  162. package/templates/vue-app/files/src/layout/index.vue +119 -119
  163. package/templates/vue-app/files/src/layout/mixin/ResizeHandler.js +45 -45
  164. package/templates/vue-app/files/src/main.js +89 -89
  165. package/templates/vue-app/files/src/mixins/crud.js +348 -348
  166. package/templates/vue-app/files/src/router/index.js +156 -156
  167. package/templates/vue-app/files/src/router/routers.js +203 -203
  168. package/templates/vue-app/files/src/settings.js +57 -57
  169. package/templates/vue-app/files/src/store/getters.js +29 -29
  170. package/templates/vue-app/files/src/store/index.js +25 -25
  171. package/templates/vue-app/files/src/store/modules/api.js +33 -33
  172. package/templates/vue-app/files/src/store/modules/app.js +55 -55
  173. package/templates/vue-app/files/src/store/modules/permission.js +79 -79
  174. package/templates/vue-app/files/src/store/modules/register.js +17 -17
  175. package/templates/vue-app/files/src/store/modules/settings.js +46 -46
  176. package/templates/vue-app/files/src/store/modules/tagsView.js +168 -168
  177. package/templates/vue-app/files/src/store/modules/user.js +119 -119
  178. package/templates/vue-app/files/src/utils/auth.js +18 -18
  179. package/templates/vue-app/files/src/utils/base64ToFile.js +27 -27
  180. package/templates/vue-app/files/src/utils/clipboard.js +36 -36
  181. package/templates/vue-app/files/src/utils/datetime.js +289 -289
  182. package/templates/vue-app/files/src/utils/getBlobFile.js +10 -10
  183. package/templates/vue-app/files/src/utils/getTime.js +29 -29
  184. package/templates/vue-app/files/src/utils/index.js +520 -520
  185. package/templates/vue-app/files/src/utils/permission.js +29 -29
  186. package/templates/vue-app/files/src/utils/pinyin.js +450 -450
  187. package/templates/vue-app/files/src/utils/request.js +139 -139
  188. package/templates/vue-app/files/src/utils/rsaEncrypt.js +37 -37
  189. package/templates/vue-app/files/src/utils/shortcuts.js +210 -210
  190. package/templates/vue-app/files/src/utils/upload.js +12 -12
  191. package/templates/vue-app/files/src/utils/validate.js +262 -262
  192. package/templates/vue-app/files/src/views/components/Echarts.vue +124 -124
  193. package/templates/vue-app/files/src/views/components/Editor.vue +75 -75
  194. package/templates/vue-app/files/src/views/components/MarkDown.vue +44 -44
  195. package/templates/vue-app/files/src/views/components/UVideo.vue +37 -37
  196. package/templates/vue-app/files/src/views/components/YamlEdit.vue +206 -206
  197. package/templates/vue-app/files/src/views/components/camera/camera.vue +115 -115
  198. package/templates/vue-app/files/src/views/components/camera/cameraTest.vue +158 -158
  199. package/templates/vue-app/files/src/views/components/excel/upload-excel.vue +41 -41
  200. package/templates/vue-app/files/src/views/components/icons/element-icons.js +74 -74
  201. package/templates/vue-app/files/src/views/components/icons/index.vue +106 -106
  202. package/templates/vue-app/files/src/views/components/icons/svg-icons.js +10 -10
  203. package/templates/vue-app/files/src/views/components/scroll/index.vue +107 -107
  204. package/templates/vue-app/files/src/views/components/scrollFull/index.vue +99 -99
  205. package/templates/vue-app/files/src/views/dashboard/LineChart.vue +138 -138
  206. package/templates/vue-app/files/src/views/dashboard/PanelGroup.vue +173 -173
  207. package/templates/vue-app/files/src/views/dashboard/mixins/resize.js +57 -57
  208. package/templates/vue-app/files/src/views/dataArchive/delTable.vue +354 -354
  209. package/templates/vue-app/files/src/views/dataArchive/exportDetail.vue +121 -121
  210. package/templates/vue-app/files/src/views/dataArchive/exportList.vue +160 -160
  211. package/templates/vue-app/files/src/views/dataArchive/index.vue +2104 -2104
  212. package/templates/vue-app/files/src/views/features/401.vue +83 -83
  213. package/templates/vue-app/files/src/views/features/404.vue +226 -226
  214. package/templates/vue-app/files/src/views/features/redirect.vue +12 -12
  215. package/templates/vue-app/files/src/views/generator/config.vue +348 -348
  216. package/templates/vue-app/files/src/views/generator/index.vue +143 -143
  217. package/templates/vue-app/files/src/views/generator/preview.vue +39 -39
  218. package/templates/vue-app/files/src/views/home.vue +80 -80
  219. package/templates/vue-app/files/src/views/indexManagement/index.vue +422 -422
  220. package/templates/vue-app/files/src/views/indexManagement/other.vue +286 -286
  221. package/templates/vue-app/files/src/views/institutionMonitor/components/LineChart.vue +191 -191
  222. package/templates/vue-app/files/src/views/institutionMonitor/index.scss +339 -339
  223. package/templates/vue-app/files/src/views/institutionMonitor/index.vue +1385 -1385
  224. package/templates/vue-app/files/src/views/institutionMonitor/mixins/resize.js +57 -57
  225. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/checkProjectCode.vue +267 -267
  226. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/imageAbnormalMonitor.vue +361 -361
  227. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/index.vue +686 -686
  228. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/leakageAnomaly.vue +270 -270
  229. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/moveMonitore.vue +114 -114
  230. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/qualityMonitore.vue +338 -338
  231. package/templates/vue-app/files/src/views/institutionSet/cloudSet.vue +534 -534
  232. package/templates/vue-app/files/src/views/institutionSet/index.vue +2550 -2550
  233. package/templates/vue-app/files/src/views/login.vue +243 -243
  234. package/templates/vue-app/files/src/views/qualityLogin.vue +280 -280
  235. package/templates/vue-app/files/src/views/selfStatistics/components/LineChart.vue +296 -296
  236. package/templates/vue-app/files/src/views/selfStatistics/hospitalDetail/index.vue +533 -533
  237. package/templates/vue-app/files/src/views/selfStatistics/index.scss +447 -447
  238. package/templates/vue-app/files/src/views/selfStatistics/index.vue +903 -903
  239. package/templates/vue-app/files/src/views/selfStatistics/mixins/resize.js +57 -57
  240. package/templates/vue-app/files/src/views/selfStatistics/monitorDetail/index.vue +285 -285
  241. package/templates/vue-app/files/src/views/selfStatistics/offlineDetail/index.vue +104 -104
  242. package/templates/vue-app/files/src/views/selfStatistics/selfActiveDetail/index.vue +104 -104
  243. package/templates/vue-app/files/src/views/selfStatistics/selfMonitorDetail/index.vue +420 -420
  244. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/setWaterMark.js +68 -68
  245. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/waterMark.vue +69 -69
  246. package/templates/vue-app/files/src/views/system/dept/index.vue +144 -144
  247. package/templates/vue-app/files/src/views/system/dict/dictDetail.vue +146 -146
  248. package/templates/vue-app/files/src/views/system/dict/index.vue +159 -159
  249. package/templates/vue-app/files/src/views/system/examModality/index.vue +174 -174
  250. package/templates/vue-app/files/src/views/system/examPart/index.vue +184 -184
  251. package/templates/vue-app/files/src/views/system/examProject/index.vue +321 -321
  252. package/templates/vue-app/files/src/views/system/examine/index.vue +66 -66
  253. package/templates/vue-app/files/src/views/system/job/index.vue +119 -119
  254. package/templates/vue-app/files/src/views/system/job/module/form.vue +72 -72
  255. package/templates/vue-app/files/src/views/system/job/module/header.vue +48 -48
  256. package/templates/vue-app/files/src/views/system/menu/index.vue +327 -327
  257. package/templates/vue-app/files/src/views/system/model/index.vue +285 -285
  258. package/templates/vue-app/files/src/views/system/role/index.vue +434 -434
  259. package/templates/vue-app/files/src/views/system/sysSet/index.vue +84 -84
  260. package/templates/vue-app/files/src/views/system/timing/index.vue +289 -289
  261. package/templates/vue-app/files/src/views/system/timing/log.vue +143 -143
  262. package/templates/vue-app/files/src/views/system/user/admin.vue +414 -414
  263. package/templates/vue-app/files/src/views/system/user/center/updateEmail.vue +146 -146
  264. package/templates/vue-app/files/src/views/system/user/center/updatePass.vue +168 -168
  265. package/templates/vue-app/files/src/views/system/user/center.vue +140 -140
  266. package/templates/vue-app/files/src/views/system/user/index.vue +972 -972
  267. package/templates/vue-app/files/src/views/systemSet/role/index.vue +314 -314
  268. package/templates/vue-app/files/src/views/systemSet/user/admin.vue +414 -414
  269. package/templates/vue-app/files/src/views/systemSet/user/center/updateEmail.vue +146 -146
  270. package/templates/vue-app/files/src/views/systemSet/user/center/updatePass.vue +115 -115
  271. package/templates/vue-app/files/src/views/systemSet/user/center.vue +351 -351
  272. package/templates/vue-app/files/src/views/systemSet/user/index.vue +928 -928
  273. package/templates/vue-app/files/src/views/tools/aliPay/config.vue +102 -102
  274. package/templates/vue-app/files/src/views/tools/aliPay/index.vue +48 -48
  275. package/templates/vue-app/files/src/views/tools/aliPay/toPay.vue +91 -91
  276. package/templates/vue-app/files/src/views/tools/email/config.vue +91 -91
  277. package/templates/vue-app/files/src/views/tools/email/index.vue +42 -42
  278. package/templates/vue-app/files/src/views/tools/email/send.vue +159 -159
  279. package/templates/vue-app/files/src/views/tools/storage/index.vue +35 -35
  280. package/templates/vue-app/files/src/views/tools/storage/local/index.vue +207 -207
  281. package/templates/vue-app/files/src/views/tools/storage/qiniu/form.vue +108 -108
  282. package/templates/vue-app/files/src/views/tools/storage/qiniu/index.vue +241 -241
  283. package/templates/vue-app/files/src/views/tools/swagger/index.vue +14 -14
  284. package/templates/vue-app/files/vue.config.js +173 -173
  285. package/templates/vue-app/template.json +29 -29
package/lib/config.js CHANGED
@@ -1,299 +1,283 @@
1
- const path = require('path');
2
- const fs = require('fs-extra');
3
- const { log } = require('./utils');
4
-
5
- function getConfigPath() {
6
- return path.join(process.cwd(), '.ylyxrc.json');
7
- }
8
-
9
- function normalizeMode(mode) {
10
- if (typeof mode !== 'string') return null;
11
- const m = mode.trim().toLowerCase();
12
- if (m === 'dev' || m === 'prod') return m;
13
- return null;
14
- }
15
-
16
- function parseDotEnvFile(envPath) {
17
- if (!fs.existsSync(envPath)) return {};
18
- const content = fs.readFileSync(envPath, 'utf-8');
19
- const lines = content.split(/\r?\n/);
20
- const out = {};
21
- for (const raw of lines) {
22
- const line = raw.trim();
23
- if (!line || line.startsWith('#')) continue;
24
- const idx = line.indexOf('=');
25
- if (idx < 0) continue;
26
- const key = line.slice(0, idx).trim();
27
- let value = line.slice(idx + 1).trim();
28
- if (
29
- (value.startsWith('"') && value.endsWith('"')) ||
30
- (value.startsWith("'") && value.endsWith("'"))
31
- ) {
32
- value = value.slice(1, -1);
33
- }
34
- out[key] = value;
35
- }
36
- return out;
37
- }
38
-
39
- function normalizePublicUrlToDir(publicUrl) {
40
- if (!publicUrl || typeof publicUrl !== 'string') return '';
41
- let v = publicUrl.trim();
42
- v = v.replace(/\\/g, '/');
43
- // ignore full urls
44
- if (/^https?:\/\//i.test(v)) return '';
45
- v = v.replace(/^\/+/, '').replace(/\/+$/, '');
46
- return v;
47
- }
48
-
49
- function resolveProdBuildDir(config) {
50
- // 1) 优先使用 .ylyxrc.json 的 buildDir(可为相对/绝对路径)
51
- if (config.buildDir) {
52
- return path.resolve(process.cwd(), config.buildDir);
53
- }
54
-
55
- // 2) 默认:读取 .env.production 的 VUE_APP_PUBLIC_URL,拼成 <publicUrlDir>
56
- const envProdPath = path.join(process.cwd(), '.env.production');
57
- const env = parseDotEnvFile(envProdPath);
58
- const publicUrlDir = normalizePublicUrlToDir(env.VUE_APP_PUBLIC_URL);
59
- if (publicUrlDir) {
60
- return path.resolve(process.cwd(), publicUrlDir);
61
- }
62
- throw new Error(
63
- '无法确定 prod 打包输出目录:请在 .ylyxrc.json 中配置 buildDir,或在 .env.production 中配置 VUE_APP_PUBLIC_URL'
64
- );
65
- }
66
-
67
- function readConfigSafe(configPath) {
68
- if (!fs.existsSync(configPath)) return {};
69
- try {
70
- return fs.readJsonSync(configPath);
71
- } catch (e) {
72
- throw new Error(`读取 .ylyxrc.json 失败,请确认它是有效 JSON:${e.message}`);
73
- }
74
- }
75
-
76
- function writeIfAllowed(filePath, content, force) {
77
- if (fs.existsSync(filePath) && !force) {
78
- log.warn(`已存在,跳过:${path.relative(process.cwd(), filePath)}`);
79
- return false;
80
- }
81
- fs.ensureDirSync(path.dirname(filePath));
82
- fs.writeFileSync(filePath, content, 'utf-8');
83
- log.success(`已写入:${path.relative(process.cwd(), filePath)}`);
84
- return true;
85
- }
86
-
87
- function deriveDefaultVariantContent(baseContent, mode) {
88
- const isDev = mode === 'dev';
89
-
90
- let content = baseContent || '';
91
- const devRe = /let\s+isDev\s*=\s*[^;]*;/;
92
-
93
- if (devRe.test(content)) {
94
- content = content.replace(devRe, `let isDev = ${isDev};`);
95
- } else {
96
- content = `let isDev = ${isDev};\n` + content;
97
- }
98
-
99
- // isProd 已废弃:prod 使用 isDev=false 表示
100
- // 删除历史遗留的 isProd 变量与输出字段(若存在)
101
- content = content.replace(/let\s+isProd\s*=\s*[^;]*;\s*\r?\n?/g, '');
102
- content = content.replace(/window\.config\.IS_PROD\s*=\s*[^;]*;\s*\r?\n?/g, '');
103
- // 删除对象形式的 IS_PROD 字段(例如 IS_PROD: isProd,)
104
- content = content.replace(/^\s*IS_PROD\s*:\s*[^,}]*,?\s*\r?\n?/gm, '');
105
-
106
- return content;
107
- }
108
-
109
- function ensureSymlinkOrCopy({ src, dest, preferSymlink }) {
110
- fs.ensureDirSync(path.dirname(dest));
111
- if (!fs.existsSync(src)) {
112
- log.warn(`未找到源文件:${path.relative(process.cwd(), src)}`);
113
- return { ok: false, method: 'missing' };
114
- }
115
-
116
- // 如果目标已存在,先删除(不管是文件还是链接)
117
- if (fs.existsSync(dest)) {
118
- fs.removeSync(dest);
119
- }
120
-
121
- if (preferSymlink) {
122
- try {
123
- // Windows/macOS/Linux 都支持;Windows 可能因为权限失败,失败后回退 copy
124
- fs.ensureSymlinkSync(src, dest, 'file');
125
- return { ok: true, method: 'symlink' };
126
- } catch (e) {
127
- log.warn(`创建 symlink 失败,将降级为 copy:${e.message}`);
128
- }
129
- }
130
-
131
- try {
132
- fs.copyFileSync(src, dest);
133
- return { ok: true, method: 'copy' };
134
- } catch (e) {
135
- log.error(`写入失败:${e.message}`);
136
- return { ok: false, method: 'copy_failed' };
137
- }
138
- }
139
-
140
- /**
141
- * 写入/更新 .ylyxrc.json 的 mode 字段(dev|prod),并与已有配置合并
142
- */
143
- function setMode(mode, options = {}) {
144
- const normalized = normalizeMode(mode);
145
- if (!normalized) {
146
- throw new Error(`mode 取值只能是 dev 或 prod(当前: ${mode})`);
147
- }
148
-
149
- const configPath = getConfigPath();
150
- const config = readConfigSafe(configPath);
151
-
152
- // 可选:如果当前项目目录存在 public/default-{mode}.js,则复制到 public/default.js
153
- // 注意:切换应发生在“项目目录”(process.cwd()),而不是 CLI 自身的 lib 目录(__dirname)
154
- // 优先从 .ylyxrc.json 中读取 publicDir,其次使用默认 ./public
155
- const configDir = path.resolve(process.cwd(), config.configDir || 'config');
156
- const publicDir = path.resolve(process.cwd(), config.publicDir || 'public');
157
- const defaultVariant = path.join(configDir, `default-${normalized}.js`);
158
- const defaultFile =
159
- normalized === 'prod'
160
- ? path.join(resolveProdBuildDir(config), 'default.js')
161
- : path.join(publicDir, 'default.js');
162
-
163
- // 默认策略:dev 使用 symlink(实时同步),prod 使用 copy(稳定)
164
- const method = options.method || (normalized === 'dev' ? 'symlink' : 'copy');
165
- const result = ensureSymlinkOrCopy({
166
- src: defaultVariant,
167
- dest: defaultFile,
168
- preferSymlink: method === 'symlink',
169
- });
170
-
171
- if (result.ok) {
172
- const label = result.method === 'symlink' ? 'symlink' : 'copy';
173
- log.success(
174
- `已(${label})切换 ${path.relative(process.cwd(), defaultFile)} <- ${path.relative(
175
- process.cwd(),
176
- defaultVariant
177
- )}`
178
- );
179
- if (normalized === 'dev' && result.method === 'symlink') {
180
- log.info('dev 模式实时同步已启用:修改 default-dev.js 会立即反映到 default.js');
181
- }
182
- } else if (result.method === 'missing') {
183
- log.warn(`未找到 ${path.relative(process.cwd(), defaultVariant)},请先运行 ylyx init config`);
184
- }
185
-
186
- config.mode = normalized;
187
- fs.writeJsonSync(configPath, config, { spaces: 2 });
188
- log.success(`已写入配置:mode=${normalized}`);
189
- log.info(`配置文件:${configPath}`);
190
- }
191
-
192
- /**
193
- * init config:初始化配置目录与示例文件
194
- * - 写入/补齐 .ylyxrc.json(mode/publicDir/configDir)
195
- * - 生成 config/default-dev.js 与 config/default-prod.js(基于现有 public/default.js 派生)
196
- * - 若 public/default.js 不存在,则按当前 mode 生成一份
197
- */
198
- function initConfig(options = {}) {
199
- const force = !!options.force;
200
- const configPath = getConfigPath();
201
- const existing = readConfigSafe(configPath);
202
-
203
- const next = {
204
- ...existing,
205
- mode: existing.mode || 'dev',
206
- publicDir: existing.publicDir || './public',
207
- configDir: existing.configDir || './config',
208
- // npm scripts:默认对 dev 与 build:prod 增加前置脚本 pre<name>
209
- // 可在 .ylyxrc.json 中改成你的项目脚本名(例如 dev=serve,prod=build)
210
- preScripts: existing.preScripts || { dev: 'dev', prod: 'build:prod' },
211
- };
212
-
213
- if (options.mode) {
214
- const normalized = normalizeMode(options.mode);
215
- if (!normalized) throw new Error(`mode 取值只能是 dev 或 prod(当前: ${options.mode})`);
216
- next.mode = normalized;
217
- }
218
-
219
- fs.writeJsonSync(configPath, next, { spaces: 2 });
220
- log.success(`已初始化配置文件:${path.relative(process.cwd(), configPath)}`);
221
-
222
- const publicDirAbs = path.resolve(process.cwd(), next.publicDir || 'public');
223
- const configDirAbs = path.resolve(process.cwd(), next.configDir || 'config');
224
- fs.ensureDirSync(publicDirAbs);
225
- fs.ensureDirSync(configDirAbs);
226
-
227
- const publicDefault = path.join(publicDirAbs, 'default.js');
228
- let baseContent = '';
229
- if (fs.existsSync(publicDefault)) {
230
- baseContent = fs.readFileSync(publicDefault, 'utf-8');
231
- } else {
232
- baseContent =
233
- "// 自动生成的默认配置(请按项目需要补全)\n" +
234
- "let isDev = true;\n"
235
- }
236
-
237
- const devVariantPath = path.join(configDirAbs, 'default-dev.js');
238
- const prodVariantPath = path.join(configDirAbs, 'default-prod.js');
239
-
240
- writeIfAllowed(devVariantPath, deriveDefaultVariantContent(baseContent, 'dev'), force);
241
- writeIfAllowed(prodVariantPath, deriveDefaultVariantContent(baseContent, 'prod'), force);
242
-
243
- // 如果 public/default.js 不存在,则按当前 mode 生成一份
244
- if (!fs.existsSync(publicDefault)) {
245
- const src =
246
- next.mode === 'prod'
247
- ? path.join(configDirAbs, 'default-prod.js')
248
- : path.join(configDirAbs, 'default-dev.js');
249
- if (fs.existsSync(src)) {
250
- fs.copyFileSync(src, publicDefault);
251
- log.success(
252
- `已生成 ${path.relative(process.cwd(), publicDefault)} <- ${path.relative(process.cwd(), src)}`
253
- );
254
- }
255
- } else {
256
- log.info(`已存在:${path.relative(process.cwd(), publicDefault)}(未覆盖)`);
257
- }
258
-
259
- // 初始化 package.json npm 前置脚本:pre<devScript> / pre<prodScript>
260
- const packageJsonPath = path.join(process.cwd(), 'package.json');
261
- if (!fs.existsSync(packageJsonPath)) {
262
- log.warn('未找到 package.json,已跳过 npm 前置脚本初始化');
263
- return;
264
- }
265
-
266
- let pkg = {};
267
- try {
268
- pkg = fs.readJsonSync(packageJsonPath);
269
- } catch (e) {
270
- throw new Error(`读取 package.json 失败,请确认它是有效 JSON:${e.message}`);
271
- }
272
-
273
- pkg.scripts = pkg.scripts || {};
274
- const devTarget = (next.preScripts && next.preScripts.dev) || 'dev';
275
- const prodTarget = (next.preScripts && next.preScripts.prod) || 'build:prod';
276
-
277
- const desired = [
278
- { name: `pre${devTarget}`, value: 'ylyx config dev' },
279
- { name: `post${prodTarget}`, value: 'ylyx config prod && ylyx deploy' },
280
- ];
281
-
282
- for (const item of desired) {
283
- if (pkg.scripts[item.name] && !force) {
284
- log.warn(`package.json scripts 已存在,跳过:${item.name}`);
285
- continue;
286
- }
287
- pkg.scripts[item.name] = item.value;
288
- log.success(`已写入 package.json scripts:${item.name}`);
289
- }
290
-
291
- fs.writeJsonSync(packageJsonPath, pkg, { spaces: 2 });
292
- log.info(`package.json:${path.relative(process.cwd(), packageJsonPath)}`);
293
- }
294
-
295
- module.exports = {
296
- setMode,
297
- normalizeMode,
298
- initConfig,
299
- };
1
+ const path = require('path');
2
+ const fs = require('fs-extra');
3
+ const { log } = require('./utils');
4
+
5
+ function getConfigPath() {
6
+ return path.join(process.cwd(), '.ylyxrc.json');
7
+ }
8
+
9
+ function normalizeMode(mode) {
10
+ if (typeof mode !== 'string') return null;
11
+ const m = mode.trim().toLowerCase();
12
+ if (m === 'dev' || m === 'prod') return m;
13
+ return null;
14
+ }
15
+
16
+ function parseDotEnvFile(envPath) {
17
+ if (!fs.existsSync(envPath)) return {};
18
+ const content = fs.readFileSync(envPath, 'utf-8');
19
+ const lines = content.split(/\r?\n/);
20
+ const out = {};
21
+ for (const raw of lines) {
22
+ const line = raw.trim();
23
+ if (!line || line.startsWith('#')) continue;
24
+ const idx = line.indexOf('=');
25
+ if (idx < 0) continue;
26
+ const key = line.slice(0, idx).trim();
27
+ let value = line.slice(idx + 1).trim();
28
+ if (
29
+ (value.startsWith('"') && value.endsWith('"')) ||
30
+ (value.startsWith("'") && value.endsWith("'"))
31
+ ) {
32
+ value = value.slice(1, -1);
33
+ }
34
+ out[key] = value;
35
+ }
36
+ return out;
37
+ }
38
+
39
+ function normalizePublicUrlToDir(publicUrl) {
40
+ if (!publicUrl || typeof publicUrl !== 'string') return '';
41
+ let v = publicUrl.trim();
42
+ v = v.replace(/\\/g, '/');
43
+ // ignore full urls
44
+ if (/^https?:\/\//i.test(v)) return '';
45
+ v = v.replace(/^\/+/, '').replace(/\/+$/, '');
46
+ return v;
47
+ }
48
+
49
+ function resolveProdBuildDir(config) {
50
+ // 1) 优先使用 .ylyxrc.json 的 buildDir(可为相对/绝对路径)
51
+ if (config.buildDir) {
52
+ return path.resolve(process.cwd(), config.buildDir);
53
+ }
54
+
55
+ // 2) 默认:读取 .env.production 的 VUE_APP_PUBLIC_URL,拼成 <publicUrlDir>
56
+ const envProdPath = path.join(process.cwd(), '.env.production');
57
+ const env = parseDotEnvFile(envProdPath);
58
+ const publicUrlDir = normalizePublicUrlToDir(env.VUE_APP_PUBLIC_URL);
59
+ if (publicUrlDir) {
60
+ return path.resolve(process.cwd(), publicUrlDir);
61
+ }
62
+ throw new Error(
63
+ '无法确定 prod 打包输出目录:请在 .ylyxrc.json 中配置 buildDir,或在 .env.production 中配置 VUE_APP_PUBLIC_URL'
64
+ );
65
+ }
66
+
67
+ function readConfigSafe(configPath) {
68
+ if (!fs.existsSync(configPath)) return {};
69
+ try {
70
+ return fs.readJsonSync(configPath);
71
+ } catch (e) {
72
+ throw new Error(`读取 .ylyxrc.json 失败,请确认它是有效 JSON:${e.message}`);
73
+ }
74
+ }
75
+
76
+ function writeIfAllowed(filePath, content, force) {
77
+ if (fs.existsSync(filePath) && !force) {
78
+ log.warn(`已存在,跳过:${path.relative(process.cwd(), filePath)}`);
79
+ return false;
80
+ }
81
+ fs.ensureDirSync(path.dirname(filePath));
82
+ fs.writeFileSync(filePath, content, 'utf-8');
83
+ log.success(`已写入:${path.relative(process.cwd(), filePath)}`);
84
+ return true;
85
+ }
86
+
87
+ function deriveDefaultVariantContent(baseContent, mode) {
88
+ const isDev = mode === 'dev';
89
+
90
+ let content = baseContent || '';
91
+ const devRe = /let\s+isDev\s*=\s*[^;]*;/;
92
+
93
+ if (devRe.test(content)) {
94
+ content = content.replace(devRe, `let isDev = ${isDev};`);
95
+ } else {
96
+ content = `let isDev = ${isDev};\n` + content;
97
+ }
98
+
99
+ // isProd 已废弃:prod 使用 isDev=false 表示
100
+ // 删除历史遗留的 isProd 变量与输出字段(若存在)
101
+ content = content.replace(/let\s+isProd\s*=\s*[^;]*;\s*\r?\n?/g, '');
102
+ content = content.replace(/window\.config\.IS_PROD\s*=\s*[^;]*;\s*\r?\n?/g, '');
103
+ // 删除对象形式的 IS_PROD 字段(例如 IS_PROD: isProd,)
104
+ content = content.replace(/^\s*IS_PROD\s*:\s*[^,}]*,?\s*\r?\n?/gm, '');
105
+
106
+ return content;
107
+ }
108
+
109
+ function copyFile({ src, dest }) {
110
+ fs.ensureDirSync(path.dirname(dest));
111
+ if (!fs.existsSync(src)) {
112
+ log.warn(`未找到源文件:${path.relative(process.cwd(), src)}`);
113
+ return { ok: false, method: 'missing' };
114
+ }
115
+
116
+ // 如果目标已存在,先删除
117
+ if (fs.existsSync(dest)) {
118
+ fs.removeSync(dest);
119
+ }
120
+
121
+ try {
122
+ fs.copyFileSync(src, dest);
123
+ return { ok: true };
124
+ } catch (e) {
125
+ log.error(`写入失败:${e.message}`);
126
+ return { ok: false };
127
+ }
128
+ }
129
+
130
+ /**
131
+ * 写入/更新 .ylyxrc.json 的 mode 字段(dev|prod),并与已有配置合并
132
+ */
133
+ function setMode(mode) {
134
+ const normalized = normalizeMode(mode);
135
+ if (!normalized) {
136
+ throw new Error(`mode 取值只能是 dev prod(当前: ${mode})`);
137
+ }
138
+
139
+ const configPath = getConfigPath();
140
+ const config = readConfigSafe(configPath);
141
+
142
+ // 可选:如果当前项目目录存在 public/default-{mode}.js,则复制到 public/default.js
143
+ // 注意:切换应发生在“项目目录”(process.cwd()),而不是 CLI 自身的 lib 目录(__dirname)
144
+ // 优先从 .ylyxrc.json 中读取 publicDir,其次使用默认 ./public
145
+ const configDir = path.resolve(process.cwd(), config.configDir || 'config');
146
+ const publicDir = path.resolve(process.cwd(), config.publicDir || 'public');
147
+ const defaultVariant = path.join(configDir, `default-${normalized}.js`);
148
+ const defaultFile =
149
+ normalized === 'prod'
150
+ ? path.join(resolveProdBuildDir(config), 'default.js')
151
+ : path.join(publicDir, 'default.js');
152
+
153
+ // 将对应 variant 文件 copy 到目标路径
154
+ const result = copyFile({
155
+ src: defaultVariant,
156
+ dest: defaultFile,
157
+ });
158
+
159
+ if (result.ok) {
160
+ log.success(
161
+ `已切换 ${path.relative(process.cwd(), defaultFile)} <- ${path.relative(
162
+ process.cwd(),
163
+ defaultVariant
164
+ )}`
165
+ );
166
+ } else if (!result.ok && !fs.existsSync(defaultVariant)) {
167
+ log.warn(`未找到 ${path.relative(process.cwd(), defaultVariant)},请先运行 ylyx init config`);
168
+ }
169
+
170
+ config.mode = normalized;
171
+ fs.writeJsonSync(configPath, config, { spaces: 2 });
172
+ log.success(`已写入配置:mode=${normalized}`);
173
+ log.info(`配置文件:${configPath}`);
174
+ }
175
+
176
+ /**
177
+ * init config:初始化配置目录与示例文件
178
+ * - 写入/补齐 .ylyxrc.json(mode/publicDir/configDir)
179
+ * - 生成 config/default-dev.js config/default-prod.js(基于现有 public/default.js 派生)
180
+ * - public/default.js 不存在,则按当前 mode 生成一份
181
+ */
182
+ function initConfig(options = {}) {
183
+ const force = !!options.force;
184
+ const configPath = getConfigPath();
185
+ const existing = readConfigSafe(configPath);
186
+
187
+ const next = {
188
+ ...existing,
189
+ mode: existing.mode || 'dev',
190
+ publicDir: existing.publicDir || './public',
191
+ configDir: existing.configDir || './config',
192
+ // npm scripts:默认对 dev 与 build:prod 增加前置脚本 pre<name>
193
+ // 可在 .ylyxrc.json 中改成你的项目脚本名(例如 dev=serve,prod=build)
194
+ preScripts: existing.preScripts || { dev: 'dev', prod: 'build:prod' },
195
+ };
196
+
197
+ if (options.mode) {
198
+ const normalized = normalizeMode(options.mode);
199
+ if (!normalized) throw new Error(`mode 取值只能是 dev 或 prod(当前: ${options.mode})`);
200
+ next.mode = normalized;
201
+ }
202
+
203
+ fs.writeJsonSync(configPath, next, { spaces: 2 });
204
+ log.success(`已初始化配置文件:${path.relative(process.cwd(), configPath)}`);
205
+
206
+ const publicDirAbs = path.resolve(process.cwd(), next.publicDir || 'public');
207
+ const configDirAbs = path.resolve(process.cwd(), next.configDir || 'config');
208
+ fs.ensureDirSync(publicDirAbs);
209
+ fs.ensureDirSync(configDirAbs);
210
+
211
+ const publicDefault = path.join(publicDirAbs, 'default.js');
212
+ let baseContent = '';
213
+ if (fs.existsSync(publicDefault)) {
214
+ baseContent = fs.readFileSync(publicDefault, 'utf-8');
215
+ } else {
216
+ baseContent =
217
+ "// 自动生成的默认配置(请按项目需要补全)\n" +
218
+ "let isDev = true;\n"
219
+ }
220
+
221
+ const devVariantPath = path.join(configDirAbs, 'default-dev.js');
222
+ const prodVariantPath = path.join(configDirAbs, 'default-prod.js');
223
+
224
+ writeIfAllowed(devVariantPath, deriveDefaultVariantContent(baseContent, 'dev'), force);
225
+ writeIfAllowed(prodVariantPath, deriveDefaultVariantContent(baseContent, 'prod'), force);
226
+
227
+ // 如果 public/default.js 不存在,则按当前 mode 生成一份
228
+ if (!fs.existsSync(publicDefault)) {
229
+ const src =
230
+ next.mode === 'prod'
231
+ ? path.join(configDirAbs, 'default-prod.js')
232
+ : path.join(configDirAbs, 'default-dev.js');
233
+ if (fs.existsSync(src)) {
234
+ fs.copyFileSync(src, publicDefault);
235
+ log.success(
236
+ `已生成 ${path.relative(process.cwd(), publicDefault)} <- ${path.relative(process.cwd(), src)}`
237
+ );
238
+ }
239
+ } else {
240
+ log.info(`已存在:${path.relative(process.cwd(), publicDefault)}(未覆盖)`);
241
+ }
242
+
243
+ // 初始化 package.json npm 前置脚本:pre<devScript> / pre<prodScript>
244
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
245
+ if (!fs.existsSync(packageJsonPath)) {
246
+ log.warn('未找到 package.json,已跳过 npm 前置脚本初始化');
247
+ return;
248
+ }
249
+
250
+ let pkg = {};
251
+ try {
252
+ pkg = fs.readJsonSync(packageJsonPath);
253
+ } catch (e) {
254
+ throw new Error(`读取 package.json 失败,请确认它是有效 JSON:${e.message}`);
255
+ }
256
+
257
+ pkg.scripts = pkg.scripts || {};
258
+ const devTarget = (next.preScripts && next.preScripts.dev) || 'dev';
259
+ const prodTarget = (next.preScripts && next.preScripts.prod) || 'build:prod';
260
+
261
+ const desired = [
262
+ { name: `pre${devTarget}`, value: 'ylyx config dev' },
263
+ { name: `post${prodTarget}`, value: 'ylyx config prod && ylyx deploy' },
264
+ ];
265
+
266
+ for (const item of desired) {
267
+ if (pkg.scripts[item.name] && !force) {
268
+ log.warn(`package.json scripts 已存在,跳过:${item.name}`);
269
+ continue;
270
+ }
271
+ pkg.scripts[item.name] = item.value;
272
+ log.success(`已写入 package.json scripts:${item.name}`);
273
+ }
274
+
275
+ fs.writeJsonSync(packageJsonPath, pkg, { spaces: 2 });
276
+ log.info(`package.json:${path.relative(process.cwd(), packageJsonPath)}`);
277
+ }
278
+
279
+ module.exports = {
280
+ setMode,
281
+ normalizeMode,
282
+ initConfig,
283
+ };