ylyx-cli 1.0.14 → 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 (286) hide show
  1. package/README.md +4 -0
  2. package/bin/ylyx.js +168 -168
  3. package/lib/config.js +283 -299
  4. package/lib/deploy.js +529 -415
  5. package/lib/generator.js +192 -192
  6. package/lib/index.js +113 -113
  7. package/lib/interactive.js +87 -87
  8. package/lib/remote.js +179 -179
  9. package/lib/template.js +174 -174
  10. package/lib/utils.js +148 -148
  11. package/package.json +5 -5
  12. package/templates/react-app/files/README.md +23 -23
  13. package/templates/react-app/files/package.json +28 -28
  14. package/templates/react-app/files/public/index.html +11 -11
  15. package/templates/react-app/files/src/App.css +15 -15
  16. package/templates/react-app/files/src/App.js +15 -15
  17. package/templates/react-app/files/src/index.css +10 -10
  18. package/templates/react-app/files/src/index.js +11 -11
  19. package/templates/react-app/template.json +11 -11
  20. package/templates/react-component/files/Component.module.css +5 -5
  21. package/templates/react-component/files/Component.tsx +31 -31
  22. package/templates/react-component/files/index.ts +2 -2
  23. package/templates/react-component/template.json +48 -48
  24. package/templates/vue-app/files/.editorconfig +14 -14
  25. package/templates/vue-app/files/.env.development +21 -21
  26. package/templates/vue-app/files/.env.production +18 -18
  27. package/templates/vue-app/files/.eslintignore +5 -5
  28. package/templates/vue-app/files/.eslintrc.js +267 -267
  29. package/templates/vue-app/files/.prettierignore +11 -11
  30. package/templates/vue-app/files/.travis.yml +5 -5
  31. package/templates/vue-app/files/.vscode/extensions.json +7 -7
  32. package/templates/vue-app/files/.vscode/settings.json +39 -39
  33. package/templates/vue-app/files/LICENSE +191 -191
  34. package/templates/vue-app/files/README.md +87 -87
  35. package/templates/vue-app/files/babel.config.js +11 -11
  36. package/templates/vue-app/files/jest.config.js +24 -24
  37. package/templates/vue-app/files/package.json +136 -136
  38. package/templates/vue-app/files/plopfile.js +7 -7
  39. package/templates/vue-app/files/postcss.config.js +5 -5
  40. package/templates/vue-app/files/public/default.js +25 -25
  41. package/templates/vue-app/files/public/index.html +26 -26
  42. package/templates/vue-app/files/src/App.vue +54 -54
  43. package/templates/vue-app/files/src/api/bigDataV/index.js +198 -198
  44. package/templates/vue-app/files/src/api/data.js +42 -42
  45. package/templates/vue-app/files/src/api/dataArchive/index.js +186 -186
  46. package/templates/vue-app/files/src/api/generator/genConfig.js +16 -16
  47. package/templates/vue-app/files/src/api/generator/generator.js +32 -32
  48. package/templates/vue-app/files/src/api/indexManagement/index.js +39 -39
  49. package/templates/vue-app/files/src/api/institutionMonitor/index.js +396 -396
  50. package/templates/vue-app/files/src/api/institutionSet/index.js +120 -120
  51. package/templates/vue-app/files/src/api/login.js +44 -44
  52. package/templates/vue-app/files/src/api/selfStatistics/index.js +50 -50
  53. package/templates/vue-app/files/src/api/system/code.js +15 -15
  54. package/templates/vue-app/files/src/api/system/dict.js +34 -34
  55. package/templates/vue-app/files/src/api/system/dictDetail.js +52 -52
  56. package/templates/vue-app/files/src/api/system/equipment.js +35 -35
  57. package/templates/vue-app/files/src/api/system/examManage.js +49 -49
  58. package/templates/vue-app/files/src/api/system/examProject.js +48 -48
  59. package/templates/vue-app/files/src/api/system/hosModel.js +35 -35
  60. package/templates/vue-app/files/src/api/system/hospital.js +88 -88
  61. package/templates/vue-app/files/src/api/system/job.js +40 -40
  62. package/templates/vue-app/files/src/api/system/menu.js +67 -67
  63. package/templates/vue-app/files/src/api/system/model.js +42 -42
  64. package/templates/vue-app/files/src/api/system/risConfig.js +9 -9
  65. package/templates/vue-app/files/src/api/system/role.js +64 -64
  66. package/templates/vue-app/files/src/api/system/sysSet.js +19 -19
  67. package/templates/vue-app/files/src/api/system/timing.js +41 -41
  68. package/templates/vue-app/files/src/api/system/user.js +121 -121
  69. package/templates/vue-app/files/src/api/tools/alipay.js +25 -25
  70. package/templates/vue-app/files/src/api/tools/email.js +24 -24
  71. package/templates/vue-app/files/src/api/tools/localStorage.js +27 -27
  72. package/templates/vue-app/files/src/api/tools/qiniu.js +40 -40
  73. package/templates/vue-app/files/src/assets/css/font-awesome.css +2342 -2342
  74. package/templates/vue-app/files/src/assets/css/font-awesome.min.css +2336 -2336
  75. package/templates/vue-app/files/src/assets/fonts/fontawesome-webfont.svg +2671 -2671
  76. package/templates/vue-app/files/src/assets/icons/index.js +9 -9
  77. package/templates/vue-app/files/src/assets/icons/svg/hospital.svg +1 -1
  78. package/templates/vue-app/files/src/assets/icons/svg/hospital1.svg +1 -1
  79. package/templates/vue-app/files/src/assets/icons/svg/loginOne.svg +35 -35
  80. package/templates/vue-app/files/src/assets/icons/svg/loginOneWhite.svg +19 -19
  81. package/templates/vue-app/files/src/assets/icons/svg/loginOr.svg +93 -93
  82. package/templates/vue-app/files/src/assets/icons/svg/loginUp.svg +96 -96
  83. package/templates/vue-app/files/src/assets/icons/svg/monitor.svg +1 -1
  84. package/templates/vue-app/files/src/assets/icons/svg/offline.svg +1 -1
  85. package/templates/vue-app/files/src/assets/icons/svg/online.svg +1 -1
  86. package/templates/vue-app/files/src/assets/icons/svg/system.svg +1 -1
  87. package/templates/vue-app/files/src/assets/icons/svgo.yml +21 -21
  88. package/templates/vue-app/files/src/assets/styles/btn.scss +103 -103
  89. package/templates/vue-app/files/src/assets/styles/eladmin.scss +124 -124
  90. package/templates/vue-app/files/src/assets/styles/element-ui.scss +217 -217
  91. package/templates/vue-app/files/src/assets/styles/element-variables.scss +31 -31
  92. package/templates/vue-app/files/src/assets/styles/global.scss +73 -73
  93. package/templates/vue-app/files/src/assets/styles/index.scss +220 -220
  94. package/templates/vue-app/files/src/assets/styles/mixin.scss +60 -60
  95. package/templates/vue-app/files/src/assets/styles/publicStyle.scss +224 -224
  96. package/templates/vue-app/files/src/assets/styles/sidebar.scss +239 -239
  97. package/templates/vue-app/files/src/assets/styles/transition.scss +48 -48
  98. package/templates/vue-app/files/src/assets/styles/variables.scss +44 -44
  99. package/templates/vue-app/files/src/common/flexible.js +145 -145
  100. package/templates/vue-app/files/src/components/Breadcrumb/index.vue +87 -87
  101. package/templates/vue-app/files/src/components/Crud/CRUD.operation.vue +248 -248
  102. package/templates/vue-app/files/src/components/Crud/Pagination.vue +20 -20
  103. package/templates/vue-app/files/src/components/Crud/RR.operation.vue +39 -39
  104. package/templates/vue-app/files/src/components/Crud/UD.operation.vue +106 -106
  105. package/templates/vue-app/files/src/components/Crud/crud.js +907 -907
  106. package/templates/vue-app/files/src/components/Crud/user/UR.operation.vue +154 -154
  107. package/templates/vue-app/files/src/components/DateRangePicker/index.vue +42 -42
  108. package/templates/vue-app/files/src/components/DateRangePickerProhibitNext/index.vue +42 -42
  109. package/templates/vue-app/files/src/components/DateRangePickerProhibitTodayNext/index.vue +48 -48
  110. package/templates/vue-app/files/src/components/Dict/Dict.js +31 -31
  111. package/templates/vue-app/files/src/components/Dict/index.js +29 -29
  112. package/templates/vue-app/files/src/components/Doc/index.vue +16 -16
  113. package/templates/vue-app/files/src/components/Echarts/BarChart.vue +115 -115
  114. package/templates/vue-app/files/src/components/Echarts/Category.vue +768 -768
  115. package/templates/vue-app/files/src/components/Echarts/Funnel.vue +120 -120
  116. package/templates/vue-app/files/src/components/Echarts/Gauge.vue +74 -74
  117. package/templates/vue-app/files/src/components/Echarts/Graph.vue +101 -101
  118. package/templates/vue-app/files/src/components/Echarts/HeatMap.vue +301 -301
  119. package/templates/vue-app/files/src/components/Echarts/Line3D.vue +110 -110
  120. package/templates/vue-app/files/src/components/Echarts/PieChart.vue +84 -84
  121. package/templates/vue-app/files/src/components/Echarts/Point.vue +161 -161
  122. package/templates/vue-app/files/src/components/Echarts/RadarChart.vue +123 -123
  123. package/templates/vue-app/files/src/components/Echarts/Rich.vue +160 -160
  124. package/templates/vue-app/files/src/components/Echarts/Sankey.vue +114 -114
  125. package/templates/vue-app/files/src/components/Echarts/Scatter.vue +192 -192
  126. package/templates/vue-app/files/src/components/Echarts/Sunburst.vue +127 -127
  127. package/templates/vue-app/files/src/components/Echarts/ThemeRiver.vue +233 -233
  128. package/templates/vue-app/files/src/components/Echarts/WordCloud.vue +201 -201
  129. package/templates/vue-app/files/src/components/GithubCorner/index.vue +55 -55
  130. package/templates/vue-app/files/src/components/Hamburger/index.vue +44 -44
  131. package/templates/vue-app/files/src/components/HeaderSearch/index.vue +196 -196
  132. package/templates/vue-app/files/src/components/IconSelect/index.vue +74 -74
  133. package/templates/vue-app/files/src/components/IconSelect/requireIcons.js +10 -10
  134. package/templates/vue-app/files/src/components/Iframe/index.vue +30 -30
  135. package/templates/vue-app/files/src/components/JavaEdit/index.vue +78 -78
  136. package/templates/vue-app/files/src/components/Pagination/index.vue +100 -100
  137. package/templates/vue-app/files/src/components/PanThumb/index.vue +149 -149
  138. package/templates/vue-app/files/src/components/ParentView/index.vue +3 -3
  139. package/templates/vue-app/files/src/components/Permission/index.js +13 -13
  140. package/templates/vue-app/files/src/components/Permission/permission.js +21 -21
  141. package/templates/vue-app/files/src/components/RightPanel/index.vue +149 -149
  142. package/templates/vue-app/files/src/components/Screenfull/index.vue +60 -60
  143. package/templates/vue-app/files/src/components/SizeSelect/index.vue +60 -60
  144. package/templates/vue-app/files/src/components/SvgIcon/index.vue +66 -66
  145. package/templates/vue-app/files/src/components/ThemePicker/index.vue +177 -177
  146. package/templates/vue-app/files/src/components/UploadExcel/index.vue +149 -149
  147. package/templates/vue-app/files/src/components/WaterMark/setWaterMark.js +68 -68
  148. package/templates/vue-app/files/src/components/WaterMark/waterMark.vue +69 -69
  149. package/templates/vue-app/files/src/components/Xgplayer/index.vue +49 -49
  150. package/templates/vue-app/files/src/components/YamlEdit/index.vue +81 -81
  151. package/templates/vue-app/files/src/layout/components/AppMain.vue +67 -67
  152. package/templates/vue-app/files/src/layout/components/Navbar.vue +209 -209
  153. package/templates/vue-app/files/src/layout/components/Settings/index.vue +125 -125
  154. package/templates/vue-app/files/src/layout/components/Sidebar/FixiOSBug.js +26 -26
  155. package/templates/vue-app/files/src/layout/components/Sidebar/Item.vue +29 -29
  156. package/templates/vue-app/files/src/layout/components/Sidebar/Link.vue +35 -35
  157. package/templates/vue-app/files/src/layout/components/Sidebar/Logo.vue +93 -93
  158. package/templates/vue-app/files/src/layout/components/Sidebar/SidebarItem.vue +104 -104
  159. package/templates/vue-app/files/src/layout/components/Sidebar/index.vue +79 -79
  160. package/templates/vue-app/files/src/layout/components/TagsView/ScrollPane.vue +90 -90
  161. package/templates/vue-app/files/src/layout/components/TagsView/index.vue +299 -299
  162. package/templates/vue-app/files/src/layout/components/index.js +5 -5
  163. package/templates/vue-app/files/src/layout/index.vue +119 -119
  164. package/templates/vue-app/files/src/layout/mixin/ResizeHandler.js +45 -45
  165. package/templates/vue-app/files/src/main.js +89 -89
  166. package/templates/vue-app/files/src/mixins/crud.js +348 -348
  167. package/templates/vue-app/files/src/router/index.js +156 -156
  168. package/templates/vue-app/files/src/router/routers.js +203 -203
  169. package/templates/vue-app/files/src/settings.js +57 -57
  170. package/templates/vue-app/files/src/store/getters.js +29 -29
  171. package/templates/vue-app/files/src/store/index.js +25 -25
  172. package/templates/vue-app/files/src/store/modules/api.js +33 -33
  173. package/templates/vue-app/files/src/store/modules/app.js +55 -55
  174. package/templates/vue-app/files/src/store/modules/permission.js +79 -79
  175. package/templates/vue-app/files/src/store/modules/register.js +17 -17
  176. package/templates/vue-app/files/src/store/modules/settings.js +46 -46
  177. package/templates/vue-app/files/src/store/modules/tagsView.js +168 -168
  178. package/templates/vue-app/files/src/store/modules/user.js +119 -119
  179. package/templates/vue-app/files/src/utils/auth.js +18 -18
  180. package/templates/vue-app/files/src/utils/base64ToFile.js +27 -27
  181. package/templates/vue-app/files/src/utils/clipboard.js +36 -36
  182. package/templates/vue-app/files/src/utils/datetime.js +289 -289
  183. package/templates/vue-app/files/src/utils/getBlobFile.js +10 -10
  184. package/templates/vue-app/files/src/utils/getTime.js +29 -29
  185. package/templates/vue-app/files/src/utils/index.js +520 -520
  186. package/templates/vue-app/files/src/utils/permission.js +29 -29
  187. package/templates/vue-app/files/src/utils/pinyin.js +450 -450
  188. package/templates/vue-app/files/src/utils/request.js +139 -139
  189. package/templates/vue-app/files/src/utils/rsaEncrypt.js +37 -37
  190. package/templates/vue-app/files/src/utils/shortcuts.js +210 -210
  191. package/templates/vue-app/files/src/utils/upload.js +12 -12
  192. package/templates/vue-app/files/src/utils/validate.js +262 -262
  193. package/templates/vue-app/files/src/views/components/Echarts.vue +124 -124
  194. package/templates/vue-app/files/src/views/components/Editor.vue +75 -75
  195. package/templates/vue-app/files/src/views/components/MarkDown.vue +44 -44
  196. package/templates/vue-app/files/src/views/components/UVideo.vue +37 -37
  197. package/templates/vue-app/files/src/views/components/YamlEdit.vue +206 -206
  198. package/templates/vue-app/files/src/views/components/camera/camera.vue +115 -115
  199. package/templates/vue-app/files/src/views/components/camera/cameraTest.vue +158 -158
  200. package/templates/vue-app/files/src/views/components/excel/upload-excel.vue +41 -41
  201. package/templates/vue-app/files/src/views/components/icons/element-icons.js +74 -74
  202. package/templates/vue-app/files/src/views/components/icons/index.vue +106 -106
  203. package/templates/vue-app/files/src/views/components/icons/svg-icons.js +10 -10
  204. package/templates/vue-app/files/src/views/components/scroll/index.vue +107 -107
  205. package/templates/vue-app/files/src/views/components/scrollFull/index.vue +99 -99
  206. package/templates/vue-app/files/src/views/dashboard/LineChart.vue +138 -138
  207. package/templates/vue-app/files/src/views/dashboard/PanelGroup.vue +173 -173
  208. package/templates/vue-app/files/src/views/dashboard/mixins/resize.js +57 -57
  209. package/templates/vue-app/files/src/views/dataArchive/delTable.vue +354 -354
  210. package/templates/vue-app/files/src/views/dataArchive/exportDetail.vue +121 -121
  211. package/templates/vue-app/files/src/views/dataArchive/exportList.vue +160 -160
  212. package/templates/vue-app/files/src/views/dataArchive/index.vue +2104 -2104
  213. package/templates/vue-app/files/src/views/features/401.vue +83 -83
  214. package/templates/vue-app/files/src/views/features/404.vue +226 -226
  215. package/templates/vue-app/files/src/views/features/redirect.vue +12 -12
  216. package/templates/vue-app/files/src/views/generator/config.vue +348 -348
  217. package/templates/vue-app/files/src/views/generator/index.vue +143 -143
  218. package/templates/vue-app/files/src/views/generator/preview.vue +39 -39
  219. package/templates/vue-app/files/src/views/home.vue +80 -80
  220. package/templates/vue-app/files/src/views/indexManagement/index.vue +422 -422
  221. package/templates/vue-app/files/src/views/indexManagement/other.vue +286 -286
  222. package/templates/vue-app/files/src/views/institutionMonitor/components/LineChart.vue +191 -191
  223. package/templates/vue-app/files/src/views/institutionMonitor/index.scss +339 -339
  224. package/templates/vue-app/files/src/views/institutionMonitor/index.vue +1385 -1385
  225. package/templates/vue-app/files/src/views/institutionMonitor/mixins/resize.js +57 -57
  226. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/checkProjectCode.vue +267 -267
  227. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/imageAbnormalMonitor.vue +361 -361
  228. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/index.vue +686 -686
  229. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/leakageAnomaly.vue +270 -270
  230. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/moveMonitore.vue +114 -114
  231. package/templates/vue-app/files/src/views/institutionMonitor/monitorDetail/qualityMonitore.vue +338 -338
  232. package/templates/vue-app/files/src/views/institutionSet/cloudSet.vue +534 -534
  233. package/templates/vue-app/files/src/views/institutionSet/index.vue +2550 -2550
  234. package/templates/vue-app/files/src/views/login.vue +243 -243
  235. package/templates/vue-app/files/src/views/qualityLogin.vue +280 -280
  236. package/templates/vue-app/files/src/views/selfStatistics/components/LineChart.vue +296 -296
  237. package/templates/vue-app/files/src/views/selfStatistics/hospitalDetail/index.vue +533 -533
  238. package/templates/vue-app/files/src/views/selfStatistics/index.scss +447 -447
  239. package/templates/vue-app/files/src/views/selfStatistics/index.vue +903 -903
  240. package/templates/vue-app/files/src/views/selfStatistics/mixins/resize.js +57 -57
  241. package/templates/vue-app/files/src/views/selfStatistics/monitorDetail/index.vue +285 -285
  242. package/templates/vue-app/files/src/views/selfStatistics/offlineDetail/index.vue +104 -104
  243. package/templates/vue-app/files/src/views/selfStatistics/selfActiveDetail/index.vue +104 -104
  244. package/templates/vue-app/files/src/views/selfStatistics/selfMonitorDetail/index.vue +420 -420
  245. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/setWaterMark.js +68 -68
  246. package/templates/vue-app/files/src/views/selfStatistics/setWaterMark/waterMark.vue +69 -69
  247. package/templates/vue-app/files/src/views/system/dept/index.vue +144 -144
  248. package/templates/vue-app/files/src/views/system/dict/dictDetail.vue +146 -146
  249. package/templates/vue-app/files/src/views/system/dict/index.vue +159 -159
  250. package/templates/vue-app/files/src/views/system/examModality/index.vue +174 -174
  251. package/templates/vue-app/files/src/views/system/examPart/index.vue +184 -184
  252. package/templates/vue-app/files/src/views/system/examProject/index.vue +321 -321
  253. package/templates/vue-app/files/src/views/system/examine/index.vue +66 -66
  254. package/templates/vue-app/files/src/views/system/job/index.vue +119 -119
  255. package/templates/vue-app/files/src/views/system/job/module/form.vue +72 -72
  256. package/templates/vue-app/files/src/views/system/job/module/header.vue +48 -48
  257. package/templates/vue-app/files/src/views/system/menu/index.vue +327 -327
  258. package/templates/vue-app/files/src/views/system/model/index.vue +285 -285
  259. package/templates/vue-app/files/src/views/system/role/index.vue +434 -434
  260. package/templates/vue-app/files/src/views/system/sysSet/index.vue +84 -84
  261. package/templates/vue-app/files/src/views/system/timing/index.vue +289 -289
  262. package/templates/vue-app/files/src/views/system/timing/log.vue +143 -143
  263. package/templates/vue-app/files/src/views/system/user/admin.vue +414 -414
  264. package/templates/vue-app/files/src/views/system/user/center/updateEmail.vue +146 -146
  265. package/templates/vue-app/files/src/views/system/user/center/updatePass.vue +168 -168
  266. package/templates/vue-app/files/src/views/system/user/center.vue +140 -140
  267. package/templates/vue-app/files/src/views/system/user/index.vue +972 -972
  268. package/templates/vue-app/files/src/views/systemSet/role/index.vue +314 -314
  269. package/templates/vue-app/files/src/views/systemSet/user/admin.vue +414 -414
  270. package/templates/vue-app/files/src/views/systemSet/user/center/updateEmail.vue +146 -146
  271. package/templates/vue-app/files/src/views/systemSet/user/center/updatePass.vue +115 -115
  272. package/templates/vue-app/files/src/views/systemSet/user/center.vue +351 -351
  273. package/templates/vue-app/files/src/views/systemSet/user/index.vue +928 -928
  274. package/templates/vue-app/files/src/views/tools/aliPay/config.vue +102 -102
  275. package/templates/vue-app/files/src/views/tools/aliPay/index.vue +48 -48
  276. package/templates/vue-app/files/src/views/tools/aliPay/toPay.vue +91 -91
  277. package/templates/vue-app/files/src/views/tools/email/config.vue +91 -91
  278. package/templates/vue-app/files/src/views/tools/email/index.vue +42 -42
  279. package/templates/vue-app/files/src/views/tools/email/send.vue +159 -159
  280. package/templates/vue-app/files/src/views/tools/storage/index.vue +35 -35
  281. package/templates/vue-app/files/src/views/tools/storage/local/index.vue +207 -207
  282. package/templates/vue-app/files/src/views/tools/storage/qiniu/form.vue +108 -108
  283. package/templates/vue-app/files/src/views/tools/storage/qiniu/index.vue +241 -241
  284. package/templates/vue-app/files/src/views/tools/swagger/index.vue +14 -14
  285. package/templates/vue-app/files/vue.config.js +173 -173
  286. 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
+ };