weaver-e10-builder 1.0.2-beta

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 (301) hide show
  1. package/README.md +200 -0
  2. package/dist/commands/app.d.ts +3 -0
  3. package/dist/commands/app.d.ts.map +1 -0
  4. package/dist/commands/app.js +305 -0
  5. package/dist/commands/app.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +386 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/check.d.ts +3 -0
  11. package/dist/commands/check.d.ts.map +1 -0
  12. package/dist/commands/check.js +106 -0
  13. package/dist/commands/check.js.map +1 -0
  14. package/dist/commands/compile.d.ts +3 -0
  15. package/dist/commands/compile.d.ts.map +1 -0
  16. package/dist/commands/compile.js +134 -0
  17. package/dist/commands/compile.js.map +1 -0
  18. package/dist/commands/docx.d.ts +3 -0
  19. package/dist/commands/docx.d.ts.map +1 -0
  20. package/dist/commands/docx.js +54 -0
  21. package/dist/commands/docx.js.map +1 -0
  22. package/dist/commands/form-button.d.ts +3 -0
  23. package/dist/commands/form-button.d.ts.map +1 -0
  24. package/dist/commands/form-button.js +441 -0
  25. package/dist/commands/form-button.js.map +1 -0
  26. package/dist/commands/form-data.d.ts +3 -0
  27. package/dist/commands/form-data.d.ts.map +1 -0
  28. package/dist/commands/form-data.js +197 -0
  29. package/dist/commands/form-data.js.map +1 -0
  30. package/dist/commands/form-ebuilder-columns.d.ts +3 -0
  31. package/dist/commands/form-ebuilder-columns.d.ts.map +1 -0
  32. package/dist/commands/form-ebuilder-columns.js +118 -0
  33. package/dist/commands/form-ebuilder-columns.js.map +1 -0
  34. package/dist/commands/form-ebuilder-filter.d.ts +3 -0
  35. package/dist/commands/form-ebuilder-filter.d.ts.map +1 -0
  36. package/dist/commands/form-ebuilder-filter.js +135 -0
  37. package/dist/commands/form-ebuilder-filter.js.map +1 -0
  38. package/dist/commands/form-ebuilder-scope.d.ts +3 -0
  39. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -0
  40. package/dist/commands/form-ebuilder-scope.js +321 -0
  41. package/dist/commands/form-ebuilder-scope.js.map +1 -0
  42. package/dist/commands/form-ebuilder-search.d.ts +3 -0
  43. package/dist/commands/form-ebuilder-search.d.ts.map +1 -0
  44. package/dist/commands/form-ebuilder-search.js +252 -0
  45. package/dist/commands/form-ebuilder-search.js.map +1 -0
  46. package/dist/commands/form-formula.d.ts +12 -0
  47. package/dist/commands/form-formula.d.ts.map +1 -0
  48. package/dist/commands/form-formula.js +252 -0
  49. package/dist/commands/form-formula.js.map +1 -0
  50. package/dist/commands/form-layout-init.d.ts +15 -0
  51. package/dist/commands/form-layout-init.d.ts.map +1 -0
  52. package/dist/commands/form-layout-init.js +162 -0
  53. package/dist/commands/form-layout-init.js.map +1 -0
  54. package/dist/commands/form-layout.d.ts +3 -0
  55. package/dist/commands/form-layout.d.ts.map +1 -0
  56. package/dist/commands/form-layout.js +236 -0
  57. package/dist/commands/form-layout.js.map +1 -0
  58. package/dist/commands/form-list-click.d.ts +3 -0
  59. package/dist/commands/form-list-click.d.ts.map +1 -0
  60. package/dist/commands/form-list-click.js +154 -0
  61. package/dist/commands/form-list-click.js.map +1 -0
  62. package/dist/commands/form-list-event.d.ts +3 -0
  63. package/dist/commands/form-list-event.d.ts.map +1 -0
  64. package/dist/commands/form-list-event.js +203 -0
  65. package/dist/commands/form-list-event.js.map +1 -0
  66. package/dist/commands/form-list-filter.d.ts +9 -0
  67. package/dist/commands/form-list-filter.d.ts.map +1 -0
  68. package/dist/commands/form-list-filter.js +107 -0
  69. package/dist/commands/form-list-filter.js.map +1 -0
  70. package/dist/commands/form-list-group.d.ts +11 -0
  71. package/dist/commands/form-list-group.d.ts.map +1 -0
  72. package/dist/commands/form-list-group.js +100 -0
  73. package/dist/commands/form-list-group.js.map +1 -0
  74. package/dist/commands/form-list-permission.d.ts +3 -0
  75. package/dist/commands/form-list-permission.d.ts.map +1 -0
  76. package/dist/commands/form-list-permission.js +127 -0
  77. package/dist/commands/form-list-permission.js.map +1 -0
  78. package/dist/commands/form-list-search-group.d.ts +3 -0
  79. package/dist/commands/form-list-search-group.d.ts.map +1 -0
  80. package/dist/commands/form-list-search-group.js +132 -0
  81. package/dist/commands/form-list-search-group.js.map +1 -0
  82. package/dist/commands/form-list-stats.d.ts +11 -0
  83. package/dist/commands/form-list-stats.d.ts.map +1 -0
  84. package/dist/commands/form-list-stats.js +139 -0
  85. package/dist/commands/form-list-stats.js.map +1 -0
  86. package/dist/commands/form-list-unit.d.ts +3 -0
  87. package/dist/commands/form-list-unit.d.ts.map +1 -0
  88. package/dist/commands/form-list-unit.js +95 -0
  89. package/dist/commands/form-list-unit.js.map +1 -0
  90. package/dist/commands/form-list-utils.d.ts +32 -0
  91. package/dist/commands/form-list-utils.d.ts.map +1 -0
  92. package/dist/commands/form-list-utils.js +76 -0
  93. package/dist/commands/form-list-utils.js.map +1 -0
  94. package/dist/commands/form-list.d.ts +3 -0
  95. package/dist/commands/form-list.d.ts.map +1 -0
  96. package/dist/commands/form-list.js +624 -0
  97. package/dist/commands/form-list.js.map +1 -0
  98. package/dist/commands/form-permission.d.ts +3 -0
  99. package/dist/commands/form-permission.d.ts.map +1 -0
  100. package/dist/commands/form-permission.js +193 -0
  101. package/dist/commands/form-permission.js.map +1 -0
  102. package/dist/commands/form-relate.d.ts +14 -0
  103. package/dist/commands/form-relate.d.ts.map +1 -0
  104. package/dist/commands/form-relate.js +140 -0
  105. package/dist/commands/form-relate.js.map +1 -0
  106. package/dist/commands/form-serial-mark.d.ts +18 -0
  107. package/dist/commands/form-serial-mark.d.ts.map +1 -0
  108. package/dist/commands/form-serial-mark.js +167 -0
  109. package/dist/commands/form-serial-mark.js.map +1 -0
  110. package/dist/commands/form-table-view.d.ts +3 -0
  111. package/dist/commands/form-table-view.d.ts.map +1 -0
  112. package/dist/commands/form-table-view.js +217 -0
  113. package/dist/commands/form-table-view.js.map +1 -0
  114. package/dist/commands/form-validate.d.ts +3 -0
  115. package/dist/commands/form-validate.d.ts.map +1 -0
  116. package/dist/commands/form-validate.js +122 -0
  117. package/dist/commands/form-validate.js.map +1 -0
  118. package/dist/commands/form-view-permission.d.ts +3 -0
  119. package/dist/commands/form-view-permission.d.ts.map +1 -0
  120. package/dist/commands/form-view-permission.js +86 -0
  121. package/dist/commands/form-view-permission.js.map +1 -0
  122. package/dist/commands/form-view.d.ts +3 -0
  123. package/dist/commands/form-view.d.ts.map +1 -0
  124. package/dist/commands/form-view.js +145 -0
  125. package/dist/commands/form-view.js.map +1 -0
  126. package/dist/commands/form.d.ts +3 -0
  127. package/dist/commands/form.d.ts.map +1 -0
  128. package/dist/commands/form.js +2467 -0
  129. package/dist/commands/form.js.map +1 -0
  130. package/dist/commands/icon.d.ts +3 -0
  131. package/dist/commands/icon.d.ts.map +1 -0
  132. package/dist/commands/icon.js +82 -0
  133. package/dist/commands/icon.js.map +1 -0
  134. package/dist/commands/matrix.d.ts +3 -0
  135. package/dist/commands/matrix.d.ts.map +1 -0
  136. package/dist/commands/matrix.js +587 -0
  137. package/dist/commands/matrix.js.map +1 -0
  138. package/dist/commands/menu-permission.d.ts +3 -0
  139. package/dist/commands/menu-permission.d.ts.map +1 -0
  140. package/dist/commands/menu-permission.js +188 -0
  141. package/dist/commands/menu-permission.js.map +1 -0
  142. package/dist/commands/menu.d.ts +16 -0
  143. package/dist/commands/menu.d.ts.map +1 -0
  144. package/dist/commands/menu.js +269 -0
  145. package/dist/commands/menu.js.map +1 -0
  146. package/dist/commands/project.d.ts +3 -0
  147. package/dist/commands/project.d.ts.map +1 -0
  148. package/dist/commands/project.js +345 -0
  149. package/dist/commands/project.js.map +1 -0
  150. package/dist/commands/role.d.ts +3 -0
  151. package/dist/commands/role.d.ts.map +1 -0
  152. package/dist/commands/role.js +224 -0
  153. package/dist/commands/role.js.map +1 -0
  154. package/dist/commands/user.d.ts +3 -0
  155. package/dist/commands/user.d.ts.map +1 -0
  156. package/dist/commands/user.js +49 -0
  157. package/dist/commands/user.js.map +1 -0
  158. package/dist/commands/workflow-action.d.ts +3 -0
  159. package/dist/commands/workflow-action.d.ts.map +1 -0
  160. package/dist/commands/workflow-action.js +1821 -0
  161. package/dist/commands/workflow-action.js.map +1 -0
  162. package/dist/commands/workflow-advanced.d.ts +3 -0
  163. package/dist/commands/workflow-advanced.d.ts.map +1 -0
  164. package/dist/commands/workflow-advanced.js +290 -0
  165. package/dist/commands/workflow-advanced.js.map +1 -0
  166. package/dist/commands/workflow-condition.d.ts +7 -0
  167. package/dist/commands/workflow-condition.d.ts.map +1 -0
  168. package/dist/commands/workflow-condition.js +562 -0
  169. package/dist/commands/workflow-condition.js.map +1 -0
  170. package/dist/commands/workflow-message.d.ts +3 -0
  171. package/dist/commands/workflow-message.d.ts.map +1 -0
  172. package/dist/commands/workflow-message.js +399 -0
  173. package/dist/commands/workflow-message.js.map +1 -0
  174. package/dist/commands/workflow-node-overtime.d.ts +3 -0
  175. package/dist/commands/workflow-node-overtime.d.ts.map +1 -0
  176. package/dist/commands/workflow-node-overtime.js +150 -0
  177. package/dist/commands/workflow-node-overtime.js.map +1 -0
  178. package/dist/commands/workflow-node-reject.d.ts +3 -0
  179. package/dist/commands/workflow-node-reject.d.ts.map +1 -0
  180. package/dist/commands/workflow-node-reject.js +115 -0
  181. package/dist/commands/workflow-node-reject.js.map +1 -0
  182. package/dist/commands/workflow-node-sign.d.ts +15 -0
  183. package/dist/commands/workflow-node-sign.d.ts.map +1 -0
  184. package/dist/commands/workflow-node-sign.js +100 -0
  185. package/dist/commands/workflow-node-sign.js.map +1 -0
  186. package/dist/commands/workflow-node-validate.d.ts +16 -0
  187. package/dist/commands/workflow-node-validate.d.ts.map +1 -0
  188. package/dist/commands/workflow-node-validate.js +169 -0
  189. package/dist/commands/workflow-node-validate.js.map +1 -0
  190. package/dist/commands/workflow-node.d.ts +3 -0
  191. package/dist/commands/workflow-node.d.ts.map +1 -0
  192. package/dist/commands/workflow-node.js +347 -0
  193. package/dist/commands/workflow-node.js.map +1 -0
  194. package/dist/commands/workflow-numbering.d.ts +17 -0
  195. package/dist/commands/workflow-numbering.d.ts.map +1 -0
  196. package/dist/commands/workflow-numbering.js +191 -0
  197. package/dist/commands/workflow-numbering.js.map +1 -0
  198. package/dist/commands/workflow-plan-range.d.ts +3 -0
  199. package/dist/commands/workflow-plan-range.d.ts.map +1 -0
  200. package/dist/commands/workflow-plan-range.js +116 -0
  201. package/dist/commands/workflow-plan-range.js.map +1 -0
  202. package/dist/commands/workflow-setting.d.ts +3 -0
  203. package/dist/commands/workflow-setting.d.ts.map +1 -0
  204. package/dist/commands/workflow-setting.js +440 -0
  205. package/dist/commands/workflow-setting.js.map +1 -0
  206. package/dist/commands/workflow-title.d.ts +14 -0
  207. package/dist/commands/workflow-title.d.ts.map +1 -0
  208. package/dist/commands/workflow-title.js +106 -0
  209. package/dist/commands/workflow-title.js.map +1 -0
  210. package/dist/commands/workflow.d.ts +26 -0
  211. package/dist/commands/workflow.d.ts.map +1 -0
  212. package/dist/commands/workflow.js +2359 -0
  213. package/dist/commands/workflow.js.map +1 -0
  214. package/dist/core/auth.d.ts +36 -0
  215. package/dist/core/auth.d.ts.map +1 -0
  216. package/dist/core/auth.js +351 -0
  217. package/dist/core/auth.js.map +1 -0
  218. package/dist/core/client.d.ts +27 -0
  219. package/dist/core/client.d.ts.map +1 -0
  220. package/dist/core/client.js +100 -0
  221. package/dist/core/client.js.map +1 -0
  222. package/dist/core/crypto.d.ts +11 -0
  223. package/dist/core/crypto.d.ts.map +1 -0
  224. package/dist/core/crypto.js +102 -0
  225. package/dist/core/crypto.js.map +1 -0
  226. package/dist/core/edition.d.ts +4 -0
  227. package/dist/core/edition.d.ts.map +1 -0
  228. package/dist/core/edition.js +19 -0
  229. package/dist/core/edition.js.map +1 -0
  230. package/dist/index.d.ts +3 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +118 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/services/action-detail.d.ts +112 -0
  235. package/dist/services/action-detail.d.ts.map +1 -0
  236. package/dist/services/action-detail.js +443 -0
  237. package/dist/services/action-detail.js.map +1 -0
  238. package/dist/services/condition-rules.d.ts +45 -0
  239. package/dist/services/condition-rules.d.ts.map +1 -0
  240. package/dist/services/condition-rules.js +207 -0
  241. package/dist/services/condition-rules.js.map +1 -0
  242. package/dist/services/form-create.d.ts +102 -0
  243. package/dist/services/form-create.d.ts.map +1 -0
  244. package/dist/services/form-create.js +835 -0
  245. package/dist/services/form-create.js.map +1 -0
  246. package/dist/services/form-ebuilder-filter.d.ts +60 -0
  247. package/dist/services/form-ebuilder-filter.d.ts.map +1 -0
  248. package/dist/services/form-ebuilder-filter.js +562 -0
  249. package/dist/services/form-ebuilder-filter.js.map +1 -0
  250. package/dist/services/form-table-view.d.ts +117 -0
  251. package/dist/services/form-table-view.d.ts.map +1 -0
  252. package/dist/services/form-table-view.js +882 -0
  253. package/dist/services/form-table-view.js.map +1 -0
  254. package/dist/services/form-view-permission.d.ts +30 -0
  255. package/dist/services/form-view-permission.d.ts.map +1 -0
  256. package/dist/services/form-view-permission.js +208 -0
  257. package/dist/services/form-view-permission.js.map +1 -0
  258. package/dist/services/form-view.d.ts +41 -0
  259. package/dist/services/form-view.d.ts.map +1 -0
  260. package/dist/services/form-view.js +334 -0
  261. package/dist/services/form-view.js.map +1 -0
  262. package/dist/services/formula-detail.d.ts +31 -0
  263. package/dist/services/formula-detail.d.ts.map +1 -0
  264. package/dist/services/formula-detail.js +66 -0
  265. package/dist/services/formula-detail.js.map +1 -0
  266. package/dist/services/rich-types.d.ts +35 -0
  267. package/dist/services/rich-types.d.ts.map +1 -0
  268. package/dist/services/rich-types.js +105 -0
  269. package/dist/services/rich-types.js.map +1 -0
  270. package/dist/services/workflow-layout.d.ts +118 -0
  271. package/dist/services/workflow-layout.d.ts.map +1 -0
  272. package/dist/services/workflow-layout.js +279 -0
  273. package/dist/services/workflow-layout.js.map +1 -0
  274. package/dist/services/workflow-operator.d.ts +36 -0
  275. package/dist/services/workflow-operator.d.ts.map +1 -0
  276. package/dist/services/workflow-operator.js +65 -0
  277. package/dist/services/workflow-operator.js.map +1 -0
  278. package/dist/types.d.ts +53 -0
  279. package/dist/types.d.ts.map +1 -0
  280. package/dist/types.js +2 -0
  281. package/dist/types.js.map +1 -0
  282. package/dist/utils/column-name.d.ts +13 -0
  283. package/dist/utils/column-name.d.ts.map +1 -0
  284. package/dist/utils/column-name.js +45 -0
  285. package/dist/utils/column-name.js.map +1 -0
  286. package/ecodecmd/package.json +27 -0
  287. package/ecodecmd/src/build.js +709 -0
  288. package/ecodecmd/src/compile.js +81 -0
  289. package/ecodecmd/src/index.js +48 -0
  290. package/ecodecmd/src/init.js +73 -0
  291. package/ecodecmd/src/lib/@babel/plugin-proposal-object-rest-spread@7.5.5/index.js +1795 -0
  292. package/ecodecmd/src/lib/@babel/plugin-proposal-optional-chaining@7.6.0/index.js +135 -0
  293. package/ecodecmd/src/lib/@babel/preset-env-standalone@7.5.5/babel-preset-env.js +76043 -0
  294. package/ecodecmd/src/lib/@babel/standalone@7.5.5/babel.js +90802 -0
  295. package/ecodecmd/src/lib/exec.js +77 -0
  296. package/ecodecmd/src/loaddep.js +154 -0
  297. package/ecodecmd/src/util/compress.js +58 -0
  298. package/ecodecmd/src/util/crypto-util.js +19 -0
  299. package/ecodecmd/src/util/index.js +153 -0
  300. package/ecodecmd/src/util/snowflake.js +144 -0
  301. package/package.json +43 -0
@@ -0,0 +1,709 @@
1
+
2
+ // const chalk = require('chalk').Chalk;
3
+
4
+ const path = require('path');
5
+ const fs = require('fs-extra');
6
+ const utils = require('./util/index');
7
+ const { compileJs, compileJsE10 } = require('./lib/exec');
8
+ const { zip } = require('./util/compress');
9
+ const snowflake = require('./util/snowflake');
10
+ const { uuid } = require("./util");
11
+ const { encode } = require("js-base64");
12
+ const process = require('process');
13
+
14
+
15
+ const path_filter_nams = ['.temp', '.target', '.git'];
16
+
17
+ /**
18
+ * 打包对应的目录为补丁包
19
+ * @param {*} path
20
+ */
21
+ module.exports = function(path_name, type, otherArgs) {
22
+ // 判断当前的模式,默认E9 打包模式, --e10 表示采用E10 打包模式
23
+ if (type.toUpperCase() === 'E10') {
24
+ buildWithE10(path_name);
25
+ } else {
26
+ if (otherArgs.type === 'config') {
27
+ // 反向生成config 目录文件
28
+ buildConfigWithE9(path_name);
29
+ } else {
30
+ buildWithE9(path_name);
31
+ }
32
+ }
33
+ }
34
+
35
+ /**
36
+ * 根据ecode.json文件反向生成config目录下的文件
37
+ * @param {*} path_name
38
+ */
39
+ async function buildConfigWithE9(path_name) {
40
+ const ecodeJsonPath = path.join(path_name, 'ecode.json');
41
+ const ecodeJsonFileObj = utils.parseFileObj(ecodeJsonPath);
42
+ if (!ecodeJsonFileObj.isFile) {
43
+ console.error('ecode.json 文件不存在');
44
+ return true;
45
+ }
46
+ console.info('generate config dir => ', ecodeJsonFileObj.path);
47
+ // 判断是否存在历史config 目录
48
+ const configDirPath = utils.parseFileObj(path.join(path_name, 'config'));
49
+ if (configDirPath.isDir) {
50
+ // 询问是否覆盖
51
+ const readStr = await utils.readLine('config目录已存在是否覆盖(Y/n): ') || 'y';
52
+ if (readStr.trim().toUpperCase() !== 'Y') {
53
+ return;
54
+ }
55
+ // 删除历史目录
56
+ utils.delDir(configDirPath.path);
57
+ }
58
+ // 创建目录
59
+ utils.mkdirs(configDirPath.path);
60
+ const ecodeJsonObj = parseEcodeJson(ecodeJsonPath);
61
+ const configs = ecodeJsonObj.confParams;
62
+ // console.info('configs', configs);
63
+ Object.keys(configs).forEach(k => {
64
+ if (k.endsWith('_id')) {
65
+ return;
66
+ }
67
+ // 根据内容生成文件
68
+ // 目前json 文件不支持编辑, 先直接过滤掉
69
+ if (k.endsWith('.json')) {
70
+ return;
71
+ }
72
+ // console.info('k => ', k);
73
+ fs.writeFile(path.join(configDirPath.path, k), configs[k].content);
74
+ });
75
+ }
76
+
77
+ /**
78
+ * 生成雪花算法ID
79
+ */
80
+ function createSnowFlakeId() {
81
+ return snowflake.generate();
82
+ }
83
+
84
+ /**
85
+ * 构造E10的 rootFolder对象
86
+ * @param buildJson
87
+ */
88
+ function createRootFolder(buildJson, path_name) {
89
+ const res = {
90
+ appUUID: buildJson.appUUID || createSnowFlakeId(),
91
+ id: buildJson.id || createSnowFlakeId(),
92
+ attribute: 'P',
93
+ debugFlag: buildJson.debugFlag || 'n',
94
+ deleteType: 0,
95
+ displayOrder: 10000,
96
+ lockFlag: buildJson.lockFlag || 'n',
97
+ treeType: 'R',
98
+ systemFlag: buildJson.systemFlag || 'n',
99
+ // 配置文件名 或者 目录名
100
+ name: buildJson.name || utils.parseFileObj(path_name).name,
101
+ flowNum: 0,
102
+ officialFlag: buildJson.officialFlag || 'n'
103
+ };
104
+ return res;
105
+ }
106
+
107
+ /**
108
+ * 扫描资源目录, 返回资源对象,并且拷贝文件到临时目录下
109
+ * @param path_name 项目路径
110
+ * @param rootFolder rootFolder对象
111
+ * @param resFolder resource对象
112
+ */
113
+ function scannerResources(path_name, rootFolder, resFolder, temp_dir) {
114
+ // 遍历 resource 目录
115
+ // 检查是否存在
116
+ const resources = [];
117
+ if (!utils.checkIsDir(path.join(path_name, 'resources'))) {
118
+ return resources;
119
+ }
120
+ const parse_path = utils.parsePath(path.join(path_name, 'resources'));
121
+ fs.readdirSync(parse_path).forEach(item => {
122
+ const tmp_path = path.join(parse_path, item);
123
+ if (utils.checkIsFile(tmp_path)) {
124
+ // 构造resource对象,拷贝文件至 临时目录
125
+ const obj = utils.parseFileObj(tmp_path);
126
+ const res = {
127
+ attribute: "RF",
128
+ deleteType: 0,
129
+ extension: (obj.ext).substring(1),
130
+ name: obj.filename,
131
+ parentId: resFolder.id || '',
132
+ rootFolderId: rootFolder.id,
133
+ id: createSnowFlakeId(),
134
+ fileId: createSnowFlakeId()
135
+ };
136
+ resources.push(res);
137
+ utils.mkdirs(path.join(temp_dir, rootFolder.id, '${resources'));
138
+ fs.copyFileSync(tmp_path, path.join(temp_dir, rootFolder.id, '${resources', item));
139
+ }
140
+ })
141
+ return resources;
142
+ }
143
+
144
+ /**
145
+ * 获取pids
146
+ * @param pidMap id映射关系
147
+ * @param rootFolder rootFolder
148
+ * @param tmp_path 当前目录
149
+ */
150
+ function getPids(pidMap, rootFolder, tmp_path, parse_path) {
151
+ let path = [];
152
+ let itemObj = utils.parseFileObj(tmp_path);
153
+ let t = 0;
154
+ // console.log('tmp_path', tmp_path);
155
+ // console.log('parse_path', parse_path);
156
+ // console.log('itemObj', itemObj.path);
157
+ const normalizedRoot = parse_path.replace(/[\\\/]$/, '').replace(/\\/g, '/');
158
+ while (itemObj.path.replace(/\\/g, '/') !== normalizedRoot) {
159
+ if (t++ > 10) {
160
+ throw new Error("文件层级超过10");
161
+ }
162
+ path.push(pidMap[itemObj.parentDir]);
163
+ itemObj = utils.parseFileObj(itemObj.parentDir);
164
+ // console.log('111itemObj', itemObj.path);
165
+ }
166
+ return ',' + path.reverse().join(',') + ',';
167
+ }
168
+
169
+ /**
170
+ * 添加确实的config 文件
171
+ * @param cfgName
172
+ * @param rootFolder
173
+ * @param pidMap
174
+ * @param parse_path
175
+ */
176
+ function checkAddConfig(cfgName, rootFolder, pidMap, parse_path, ecodeJson, state) {
177
+ let fincCfg = ecodeJson.codes.find(c => c.name === cfgName && c.parentId === pidMap[path.join(parse_path, 'config')]);
178
+ if (!fincCfg) {
179
+ // 添加文件
180
+ ecodeJson.codes.push({
181
+ attribute: "GC",
182
+ compiledId: 0,
183
+ compress: "n",
184
+ deleteType: 0,
185
+ extension: ".js",
186
+ flowNum: 0,
187
+ id: createSnowFlakeId(),
188
+ name: cfgName,
189
+ parentId: pidMap[path.join(parse_path, 'config')],
190
+ parentIds: `,${rootFolder.id},${pidMap[path.join(parse_path, 'config')]},`,
191
+ rootFolderId: rootFolder.id,
192
+ sourceId: 0,
193
+ state,
194
+ systemFlag: 'y'
195
+ });
196
+ }
197
+ }
198
+
199
+ function pretreatmentCode(content, tmpObj, parse_path) {
200
+ const refPath = tmpObj.path.replace(parse_path, '').replace(/\\/g, '/').substring(1);
201
+ let res = content
202
+ .replace(/"use strict";\n\n/, "")
203
+ .replace(/(\n)+/g, (v) => `${v} `)
204
+ .replace(/%40weapp/g, `@weapp`);
205
+ const code = `(function () {
206
+ "use strict";
207
+ window.weappEcodesdk.jsonp.export("\${appId}", "${refPath}", function () {
208
+ var exports = {};
209
+ var require = window.weappEcodesdk.jsonp.require.bind(null, "\${appId}", "${refPath}");
210
+
211
+ ${res}
212
+
213
+ return exports;
214
+ })
215
+ })();`;
216
+ return code;
217
+
218
+ }
219
+
220
+ /**
221
+ * 构建一个默认数据的build.json
222
+ * @param {*} path_dir
223
+ */
224
+ async function createDefaultBuildJson(path_dir) {
225
+ const buildJson = {
226
+ "appId": "",
227
+ "appUUID": "",
228
+ "lockFlag": "n",
229
+ "officialFlag": "n",
230
+ "systemFlag": "n",
231
+ "codes": {
232
+ // "entry.pre.js": {
233
+ // "state": "y",
234
+ // "compress": "n"
235
+ // },
236
+ // "page.js": {
237
+ // "state": "n"
238
+ // },
239
+ // "index.pre.css": {
240
+ // "state": "y"
241
+ // }
242
+ }
243
+ }
244
+ // 扫描当前目录下的所有文件, 即资源文件以及普通文件 (非config resources 目录)
245
+ const fileList = await getAllFileList(path_dir);
246
+ for (let f of fileList) {
247
+ f = f.replace(path.join(path_dir, ''), '');
248
+ const fileName = f.substring(1);
249
+ if (fileName.endsWith('.pre.js') || fileName.endsWith('.css') || fileName.endsWith('formApi.js')) {
250
+ buildJson.codes[fileName] = { 'state': 'y' }
251
+ } else {
252
+ buildJson.codes[fileName] = { 'state': fileName === 'entry.js' ? 'y': 'n' }
253
+ }
254
+ }
255
+ fs.writeFileSync(path.join(path_dir, 'build.json'), JSON.stringify(buildJson, null, '\t'));
256
+ }
257
+
258
+ /**
259
+ * 扫描项目目录下的所有文件
260
+ */
261
+ function getAllFileList(dir_path) {
262
+ return new Promise((resolve) => {
263
+ const fileList = [];
264
+ const scannerList = [];
265
+ scannerList.push(dir_path);
266
+ const whiteList = [
267
+ path.join(dir_path, '.target'),
268
+ path.join(dir_path, 'config'),
269
+ path.join(dir_path, 'resources'),
270
+ ]
271
+ while (scannerList.length != 0) {
272
+ const dir = scannerList.pop();
273
+ const tmp = fs.readdirSync(dir);
274
+ for (const entry of tmp) {
275
+ const entryPath = path.join(dir, entry);
276
+ if (fs.statSync(entryPath).isFile()) {
277
+ fileList.push(entryPath);
278
+ } else {
279
+ if (!whiteList.includes(entryPath)) {
280
+ scannerList.push(entryPath);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ resolve(fileList);
286
+ });
287
+ }
288
+
289
+ /**
290
+ * E10 打包模式
291
+ * @param path_name
292
+ */
293
+ async function buildWithE10(path_name) {
294
+ console.info("打包方式 => E10");
295
+ const parse_path = utils.parsePath(path_name);
296
+ if (!utils.checkIsDir(parse_path)) {
297
+ console.error(`${parse_path} 不是一个目录`);
298
+ process.exit(1);
299
+ }
300
+ if (!utils.checkIsFile(path.join(path_name, 'build.json'))) {
301
+ // console.error(`${parse_path}缺失ecode项目配置文件[build.json]`);
302
+ // 这里需要判断是否自动生成build.json
303
+ const readStr = 'y';
304
+ if (readStr.trim().toUpperCase() === 'Y') {
305
+ // 生成一个文件
306
+ await createDefaultBuildJson(path_name)
307
+ } else {
308
+ console.error('exit(1)');
309
+ process.exit(1);
310
+ }
311
+ }
312
+ // 查询是否存在配置文件
313
+ const buildJson = JSON.parse(fs.readFileSync(path.join(path_name, 'build.json')));
314
+ // 创建临时目录
315
+ const temp_dir = path.join(parse_path, ".temp");
316
+ if (!utils.mkdirs(temp_dir, true)) {
317
+ console.error(`临时目录[${temp_dir}] 创建失败`);
318
+ process.exit(1);
319
+ }
320
+ // 构造rootFolders
321
+ // 构造ecode.json对象;
322
+ const ecodeJson = {
323
+ rootFolders: [],
324
+ codes: [],
325
+ folders: [],
326
+ cronAttrs: [],
327
+ datasources: [],
328
+ resources: [],
329
+ funcAttrs: []
330
+ };
331
+ const rootFolder = createRootFolder(buildJson, path_name);
332
+ ecodeJson.rootFolders.push(rootFolder);
333
+ const resFolder = { // 创建资源目录对象
334
+ appUUID: rootFolder.appUUID,
335
+ attribute: 'R',
336
+ debugFlag: rootFolder.debugFlag,
337
+ deleteType: 0,
338
+ id: createSnowFlakeId(),
339
+ displayOrder: 10000,
340
+ lockFlag: rootFolder.lockFlag,
341
+ name: 'resources',
342
+ flowNum: 0,
343
+ officialFlag: rootFolder.officialFlag,
344
+ systemFlag: 'y',
345
+ treeType: 'R',
346
+ rootFolderId: rootFolder.id,
347
+ parentId: rootFolder.id,
348
+ parentIds: ',' + rootFolder.id + ','
349
+ };
350
+ ecodeJson.folders.push(resFolder);
351
+ const resources = scannerResources(path_name, rootFolder, resFolder, temp_dir);
352
+ ecodeJson.resources = resources;
353
+ const pidMap = {};
354
+ pidMap[parse_path] = rootFolder.id;
355
+ const path_dp = [];
356
+ path_dp.push(parse_path);
357
+ // 遍历当前目录
358
+ while (path_dp.length !== 0) {
359
+ const tmp_path = path_dp.pop();
360
+ if (path_filter_nams.includes(path.parse(tmp_path).name)) {
361
+ continue;
362
+ }
363
+ const tmpObj = utils.parseFileObj(tmp_path);
364
+ // resource 已经处理过 直接过滤
365
+ if (tmpObj.path.startsWith(path.join(parse_path, 'resources'))) {
366
+ continue;
367
+ }
368
+ if (tmpObj.isFile) { // 说明文件
369
+ // 文件只有js 和 css
370
+ if (tmpObj.ext !== '.js' && tmpObj.ext !== '.css' && tmpObj.ext !== '.md') {
371
+ continue;
372
+ }
373
+ let attribute = 'NC';
374
+ // 如果路径是在config下的 则是GC
375
+ if (tmpObj.path.startsWith(path.join(parse_path, 'config'))) {
376
+ attribute = 'GC';
377
+ }
378
+ // 编译当前的文件内容
379
+ let compileContent = tmpObj.content;
380
+ if (tmpObj.ext === '.js') {
381
+ // 使用编译内容, 这里要特殊处理,增加包裹
382
+ compileContent = pretreatmentCode(compileJsE10(compileContent, tmpObj.path) || '', tmpObj, parse_path);
383
+ }
384
+ // 需要兼容window 处理路径
385
+ let codeKeyPath = tmpObj.path.replace(parse_path, '').substring(1);
386
+ // if (codeKeyPath && codeKeyPath.includes("\\")) {
387
+ // codeKeyPath = codeKeyPath.replace(/\\/g, '/');
388
+ // }
389
+ // console.log('codeKeyPath', codeKeyPath);
390
+ const code = {
391
+ attribute,
392
+ compiledContent: encode(compileContent),
393
+ name: tmpObj.name,
394
+ flowNum: 0,
395
+ compiledId: createSnowFlakeId(),
396
+ compress: buildJson.codes[tmpObj.path.replace(parse_path, '')]?.compress || 'n',
397
+ content: encode(tmpObj.content),
398
+ deleteType: 0,
399
+ extension: tmpObj.ext,
400
+ id: createSnowFlakeId(),
401
+ rootFolderId: rootFolder.id,
402
+ sourceId: 0,
403
+ systemFlag: rootFolder.systemFlag,
404
+ state: (buildJson.codes[codeKeyPath] || buildJson.codes['/' + codeKeyPath])?.state || 'n', // 是否前置加载,
405
+ parentId: pidMap[tmpObj.parentDir],
406
+ parentIds: getPids(pidMap, rootFolder, tmp_path, parse_path)
407
+ };
408
+ // console.info('file tmpObj.name => ', tmpObj.name, tmpObj.path, tmpObj.isDir)
409
+ // console.info('filepath => ', tmpObj.path, codeKeyPath, buildJson.codes[codeKeyPath])
410
+ ecodeJson.codes.push(code);
411
+ } else if (tmpObj.isDir) {
412
+ // 判断当前路径 如果是跟路径则跳过
413
+ if (tmpObj.path !== parse_path) {
414
+ // 比较根目录的相对路径
415
+ const resolve_path = String(tmp_path).replace(parse_path, '');
416
+ let attribute = 'N';
417
+ if (resolve_path.length > 1) {
418
+ if (resolve_path.startsWith('/resources')) {
419
+ attribute = 'R';
420
+ } else if (resolve_path.startsWith('/config')) { // 配置文件,需要整合到ecode.json中
421
+ attribute = 'G';
422
+ }
423
+ }
424
+ // 构造文件夹对象
425
+ const folderObj = {
426
+ appUUID: rootFolder.appUUID,
427
+ rootFolderId: rootFolder.id,
428
+ debugFlag: rootFolder.debugFlag,
429
+ deleteType: 0,
430
+ displayOrder: 10000,
431
+ lockFlag: rootFolder.lockFlag,
432
+ name: tmpObj.name,
433
+ flowNum: 0,
434
+ id: createSnowFlakeId(),
435
+ officialFlag: rootFolder.officialFlag,
436
+ systemFlag: rootFolder.systemFlag,
437
+ treeType: 'R',
438
+ parentId: pidMap[utils.parsePath(tmpObj.parentDir)],
439
+ parentIds: getPids(pidMap, rootFolder, tmp_path, parse_path),
440
+ attribute,
441
+ }
442
+ // console.info('tmpObj.name => ', tmpObj.name, tmpObj.path, tmpObj.isDir)
443
+ pidMap[tmp_path] = folderObj.id;
444
+ ecodeJson.folders.push(folderObj);
445
+ }
446
+
447
+ // 遍历当前目录下的子文件
448
+ // 获取当前目录下的所有路径
449
+ fs.readdirSync(tmp_path).forEach(item => {
450
+ path_dp.push(path.join(tmp_path, item));
451
+ });
452
+
453
+ }
454
+ }
455
+
456
+ // 判断缺少的文件夹
457
+ let findConfigFolder = ecodeJson.folders.find(f => {
458
+ return f.name === 'config' && f.parentId === rootFolder.id;
459
+ });
460
+ if (!findConfigFolder) {
461
+ const configId = createSnowFlakeId();
462
+ pidMap[path.join(parse_path, 'config')] = configId;
463
+ ecodeJson.folders.push({
464
+ appUUID: rootFolder.appUUID,
465
+ attribute: 'G',
466
+ debugFlag: rootFolder.debugFlag,
467
+ deleteType: 0,
468
+ flowNum: 0,
469
+ id: configId,
470
+ lockFlag: rootFolder.lockFlag,
471
+ name: 'config',
472
+ officalFlag: rootFolder.officialFlag,
473
+ parentId: rootFolder.id,
474
+ parentIds: ',' + rootFolder.id + ',',
475
+ systemFlag: rootFolder.systemFlag,
476
+ treeType: 'R'
477
+ });
478
+
479
+ }
480
+ // 判断 默认配置生成
481
+ checkAddConfig('config', rootFolder, pidMap, parse_path, ecodeJson, 'y');
482
+ checkAddConfig('config_default', rootFolder, pidMap, parse_path, ecodeJson, 'y');
483
+ checkAddConfig('configLoad', rootFolder, pidMap, parse_path, ecodeJson, 'n');
484
+ checkAddConfig('configLoad_default', rootFolder, pidMap, parse_path, ecodeJson, 'n');
485
+ // for (let i = 0; i < ecodeJson.codes.push())
486
+
487
+ fs.writeFileSync(path.join(temp_dir, 'ecode.json'), JSON.stringify(ecodeJson, null, '\t'));
488
+ // 生成打包目录
489
+ utils.mkdirs(path.join(parse_path, '.target_bak'), true);
490
+ utils.mkdirs(path.join(parse_path, '.target'), true);
491
+ // 移动当前目录
492
+ const uuidname = uuid().toUpperCase();
493
+ fs.moveSync(path.join(parse_path, '.temp'), path.join(parse_path, '.target_bak', uuidname));
494
+ zip(path.join(parse_path, '.target_bak'), path.join(parse_path, '.target', uuidname + '.zip')).then(res => {
495
+ fs.removeSync(path.join(parse_path, '.temp'));
496
+ fs.removeSync(path.join(parse_path, '.target_bak'));
497
+ console.info('补丁包生成成功 ' + res + ' bytes');
498
+ }).catch(err => {
499
+ console.error('生成补丁包异常 => ', err);
500
+ process.exit(1);
501
+ });
502
+ }
503
+
504
+ /**
505
+ * 针对E9的打包模式
506
+ * @param path_name
507
+ */
508
+ function buildWithE9(path_name) {
509
+ console.info("打包方式 => E9");
510
+ const parse_path = utils.parsePath(path_name);
511
+ console.log('执行打包命令 => ', parse_path);
512
+
513
+ if (!utils.checkIsDir(parse_path)) {
514
+ console.error(`${parse_path} 不是一个目录`);
515
+ process.exit(1);
516
+ }
517
+
518
+ // 检查当前目录是否为一个ecode 项目
519
+ if (!checkIsEcodeProject(parse_path)) {
520
+ console.error(`${parse_path}缺失ecode项目配置文件`);
521
+ process.exit(1);
522
+ }
523
+
524
+ // 创建临时目录
525
+ const temp_dir = path.join(parse_path, '.temp');
526
+ if (!utils.mkdirs(temp_dir, true)) {
527
+ console.error(`临时目录[${temp_dir}] 创建失败`);
528
+ process.exit(1);
529
+ }
530
+
531
+ // 解析ecode.json文件
532
+ const appObj = parseEcodeJson(parse_path);
533
+ // 生成config.json文件
534
+ const configJsonObj = { [appObj.id]: { "autoRelease": "y" } };
535
+ // 生成pinyin.json文件
536
+ const pinyinJsonObj = { };
537
+ // console.info(appObj);
538
+ const path_map = [];
539
+ // 遍历项目文件
540
+ const path_dp = [];
541
+ path_dp.push(parse_path);
542
+ utils.mkdirs(path.join(parse_path, '.temp', appObj.id, appObj.id));
543
+ while (path_dp.length !== 0) {
544
+ const tmp_path = path_dp.pop();
545
+ if (path_filter_nams.includes(path.parse(tmp_path).name)) {
546
+ continue;
547
+ }
548
+ if (utils.checkIsFile(tmp_path)) {
549
+ path_map.push({source: tmp_path, target: tmp_path});
550
+ } else if (utils.checkIsDir(tmp_path)) {
551
+
552
+ // 比较根目录的相对路径
553
+ const resolve_path = String(tmp_path).replace(parse_path, '');
554
+ if (resolve_path.length > 1) {
555
+ let path_key = resolve_path.substring(1);
556
+ if (resolve_path.startsWith('/resources')) {
557
+ path_key = '${' + resolve_path.substring(1);
558
+ } else if (resolve_path.startsWith('/jar')) {
559
+ path_key = '&{' + resolve_path.substring(1);
560
+ }
561
+ pinyinJsonObj[path_key] = path_key;
562
+ if (path_key !== 'config') {
563
+ // 生成对应的临时目录
564
+ utils.mkdirs(path.join(parse_path, '.temp', appObj.id, appObj.id, path_key));
565
+ }
566
+ }
567
+
568
+ // 获取当前目录下的所有路径
569
+ fs.readdirSync(tmp_path).forEach(item => {
570
+ const checkPath = path.join(tmp_path, item);
571
+ if (!path_filter_nams.includes(path.parse(checkPath).name)) {
572
+ const fileObj = utils.parseFileObj(checkPath);
573
+ if (fileObj.isFile && fileObj.filename !== 'ecode.json') {
574
+ let target = checkPath;
575
+ let filename = fileObj.filename;
576
+ // 判断是否为jar包 或者 resource的路径
577
+ if (fileObj.parentDir.startsWith(path.join(parse_path, 'resources'))) {
578
+ target = target.replace(path.join(parse_path, 'resources'), path.join(parse_path, '${resources'))
579
+ target = target.replace(fileObj.filename, '${' + fileObj.filename);
580
+ filename = '${' + fileObj.filename;
581
+ } else if (fileObj.parentDir.startsWith(path.join(parse_path, 'jar'))) {
582
+ target = target.replace(path.join(parse_path, 'jar'), path.join(parse_path, '&{jar'))
583
+ target = target.replace(fileObj.filename, '&{' + fileObj.filename);
584
+ filename = '&{' + fileObj.filename;
585
+ } else if (fileObj.parentDir === path.join(parse_path, 'config')) { // 说明是配置文件
586
+ if (fileObj.filename === 'config.json') {
587
+ appObj.confParams['config.json'].compiledContent = String(fileObj.content);
588
+ appObj.confParams['config.json'].content = String(fileObj.content);
589
+ } else if (fileObj.filename === 'config_default.json') {
590
+ appObj.confParams['config_default.json'].compiledContent = String(fileObj.content);
591
+ appObj.confParams['config_default.json'].content = String(fileObj.content);
592
+ } else if (fileObj.filename === 'config.js') {
593
+ appObj.confParams['config.js'].compiledContent = compileJs(String(fileObj.content), fileObj.path) || '';
594
+ appObj.confParams['config.js'].content = String(fileObj.content);
595
+ } else if (fileObj.filename === 'config_default.js') {
596
+ appObj.confParams['config_default.js'].compiledContent = compileJs(String(fileObj.content), fileObj.path) || '';
597
+ appObj.confParams['config_default.js'].content = String(fileObj.content);
598
+ }
599
+ }
600
+ if (fileObj.parentDir.startsWith(path.join(parse_path, 'config'))) {
601
+ return;
602
+ }
603
+ const isPrestate = fileObj.name.endsWith('.pre');
604
+ let originName = filename;
605
+ // 需要判断一下上级目录是否存在,如果不存在则先创建一下,window 不会自动创建
606
+ const targetFileDir = path.join(parse_path, '.temp', appObj.id, appObj.id, target.replace(parse_path, ''));
607
+ const targetObj = path.parse(targetFileDir);
608
+ if (targetObj.dir && !fs.existsSync(targetObj.dir)) {
609
+ fs.ensureDirSync(targetObj.dir);
610
+ }
611
+ // 拷贝当前文件过去
612
+ fs.copyFileSync(path.join(checkPath), targetFileDir); // 这里是原文件
613
+ if (isPrestate) {
614
+ originName = fileObj.name.substring(0, fileObj.name.lastIndexOf('.')) + fileObj.ext;
615
+ pinyinJsonObj[originName] = originName;
616
+ } else {
617
+ pinyinJsonObj[filename] = filename;
618
+ }
619
+ if ((fileObj.ext === '.js' || fileObj.ext === '.css') && fileObj.filename === filename) {
620
+ // 编译当前的文件内容
621
+ let compileContent = fileObj.content;
622
+ if (fileObj.ext === '.js') { // 不用编译,与原内容一致
623
+ // 使用编译内容
624
+ compileContent = compileJs(compileContent, checkPath) || '';
625
+ }
626
+ if (isPrestate) {
627
+ fs.writeFileSync(path.join(parse_path, '.temp', appObj.id, appObj.id, target.replace(filename, 'compiled_prestate_' + filename).replace(parse_path, '')), compileContent);
628
+ pinyinJsonObj['compiled_prestate_' + originName] = 'compiled_prestate_' + originName;
629
+ } else {
630
+ fs.writeFileSync(path.join(parse_path, '.temp', appObj.id, appObj.id, target.replace(filename, 'compiled_' + filename).replace(parse_path, '')), compileContent);
631
+ pinyinJsonObj['compiled_' + originName] = 'compiled_' + originName;
632
+ }
633
+ }
634
+
635
+ path_map.push({ source: checkPath, target, filename });
636
+ } else if (fileObj.isDir) {
637
+ path_dp.push(checkPath);
638
+ }
639
+ }
640
+ });
641
+ }
642
+ }
643
+ // 判断是否有resources jar 目录,没有的话创建一个
644
+ if (!pinyinJsonObj['${resources']) {
645
+ pinyinJsonObj['${resources'] = '${resources';
646
+ utils.mkdirs(path.join(parse_path, '.temp', appObj.id, appObj.id, '${resources'));
647
+ }
648
+ if (!pinyinJsonObj['&{jar']) {
649
+ pinyinJsonObj['&{jar'] = '&{jar';
650
+ utils.mkdirs(path.join(parse_path, '.temp', appObj.id, appObj.id, '&{jar'));
651
+ }
652
+
653
+ // console.info('config.json => ', configJsonObj);
654
+ // console.info('pinyin.json => ', pinyinJsonObj);
655
+ // 拷贝json文件
656
+ fs.writeFileSync(path.join(parse_path, '.temp', appObj.id,'config.json'), JSON.stringify(configJsonObj, null, '\t'));
657
+ fs.writeFileSync(path.join(parse_path, '.temp', appObj.id, 'pinyin.json'), JSON.stringify(pinyinJsonObj, null , '\t'));
658
+ // 修改ecodeJson
659
+ const ecodeJson = JSON.parse(utils.parseFileObj(path.join(parse_path, 'ecode.json')).content);
660
+ let tmpObj = ecodeJson.datas[0];
661
+ while (tmpObj.id != appObj.id) {
662
+ if (Array.isArray(tmpObj['children']) && tmpObj['children'].length > 0) {
663
+ tmpObj = tmpObj['children'][0];
664
+ } else {
665
+ break;
666
+ }
667
+ }
668
+ tmpObj.confParams = appObj.confParams;
669
+ fs.writeFileSync(path.join(parse_path, '.temp', appObj.id, 'ecode.json'), JSON.stringify(ecodeJson, null , '\t'));
670
+
671
+ // 生成压缩zip包
672
+ // 先创建对应的目录
673
+ utils.mkdirs(path.join(parse_path, '.target'), true);
674
+ zip(path.join(parse_path, '.temp'), path.join(parse_path, '.target', appObj.id + '.zip')).then(res => {
675
+ fs.removeSync(path.join(parse_path, '.temp'));
676
+ console.info('补丁包生成成功 ' + res + ' bytes');
677
+ }).catch(err => {
678
+ console.error('生成补丁包异常 => ', err);
679
+ process.exit(1);
680
+ });
681
+
682
+ }
683
+
684
+ /**
685
+ * 检查当前目录是否为一个ecode项目
686
+ * @param {*} path_name
687
+ */
688
+ function checkIsEcodeProject(path_name) {
689
+ return utils.checkIsFile(path.join(path_name, 'ecode.json'));
690
+ }
691
+
692
+ /**
693
+ * 解析ecode.json文件, 获取当前应用对象,默认中可能含有分类的层级
694
+ * @param {*} path_name
695
+ */
696
+ function parseEcodeJson(path_name) {
697
+ const jsonPath = path_name.endsWith('ecode.json') ? path_name
698
+ : path.join(path_name, 'ecode.json');
699
+ const ecodeJson = JSON.parse(fs.readFileSync(jsonPath));
700
+ let appObj = ecodeJson.datas[0];
701
+ while (appObj.treeType != 'folder') {
702
+ if (Array.isArray(appObj['children']) && appObj['children'].length > 0) {
703
+ appObj = appObj['children'][0];
704
+ } else {
705
+ break;
706
+ }
707
+ }
708
+ return appObj;
709
+ }