@lcap/nasl 3.6.0-alpha.1 → 3.6.0-alpha.2

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 (245) hide show
  1. package/out/bak/translator.js +119 -39
  2. package/out/bak/translator.js.map +1 -1
  3. package/out/breakpoint/generator/BreakpointNode.d.ts +3 -0
  4. package/out/breakpoint/generator/BreakpointNode.js +9 -0
  5. package/out/breakpoint/generator/BreakpointNode.js.map +1 -1
  6. package/out/breakpoint/shared/constants.js +1 -0
  7. package/out/breakpoint/shared/constants.js.map +1 -1
  8. package/out/breakpoint/shared/utils.js +12 -6
  9. package/out/breakpoint/shared/utils.js.map +1 -1
  10. package/out/breakpoint/store/core.js +1 -1
  11. package/out/breakpoint/store/core.js.map +1 -1
  12. package/out/common/BaseNode.d.ts +1 -4
  13. package/out/common/BaseNode.js +23 -37
  14. package/out/common/BaseNode.js.map +1 -1
  15. package/out/concepts/AnonymousFunction__.d.ts +6 -1
  16. package/out/concepts/AnonymousFunction__.js +34 -16
  17. package/out/concepts/AnonymousFunction__.js.map +1 -1
  18. package/out/concepts/App__.d.ts +55 -51
  19. package/out/concepts/App__.js +76 -80
  20. package/out/concepts/App__.js.map +1 -1
  21. package/out/concepts/BackendVariable__.js +10 -2
  22. package/out/concepts/BackendVariable__.js.map +1 -1
  23. package/out/concepts/BindAttribute__.js +16 -6
  24. package/out/concepts/BindAttribute__.js.map +1 -1
  25. package/out/concepts/BindDirective__.d.ts +1 -0
  26. package/out/concepts/BindDirective__.js +19 -4
  27. package/out/concepts/BindDirective__.js.map +1 -1
  28. package/out/concepts/BindEvent__.d.ts +3 -1
  29. package/out/concepts/BindEvent__.js +39 -14
  30. package/out/concepts/BindEvent__.js.map +1 -1
  31. package/out/concepts/BusinessComponent__.d.ts +641 -0
  32. package/out/concepts/BusinessComponent__.js +1921 -0
  33. package/out/concepts/BusinessComponent__.js.map +1 -0
  34. package/out/concepts/BusinessLogic__.d.ts +38 -0
  35. package/out/concepts/BusinessLogic__.js +358 -0
  36. package/out/concepts/BusinessLogic__.js.map +1 -0
  37. package/out/concepts/CallEvent__.d.ts +101 -0
  38. package/out/concepts/CallEvent__.js +280 -0
  39. package/out/concepts/CallEvent__.js.map +1 -0
  40. package/out/concepts/CallFunction__.d.ts +0 -1
  41. package/out/concepts/CallFunction__.js +10 -10
  42. package/out/concepts/CallFunction__.js.map +1 -1
  43. package/out/concepts/CallLogic__.d.ts +2 -0
  44. package/out/concepts/CallLogic__.js +38 -27
  45. package/out/concepts/CallLogic__.js.map +1 -1
  46. package/out/concepts/Constant__.js +7 -6
  47. package/out/concepts/Constant__.js.map +1 -1
  48. package/out/concepts/Destination__.d.ts +1 -1
  49. package/out/concepts/Destination__.js +7 -5
  50. package/out/concepts/Destination__.js.map +1 -1
  51. package/out/concepts/End__.js +2 -1
  52. package/out/concepts/End__.js.map +1 -1
  53. package/out/concepts/Event__.d.ts +14 -0
  54. package/out/concepts/Event__.js +61 -0
  55. package/out/concepts/Event__.js.map +1 -1
  56. package/out/concepts/FrontendType__.d.ts +308 -0
  57. package/out/concepts/FrontendType__.js +605 -0
  58. package/out/concepts/FrontendType__.js.map +1 -0
  59. package/out/concepts/Frontend__.d.ts +0 -88
  60. package/out/concepts/Frontend__.js +1 -143
  61. package/out/concepts/Frontend__.js.map +1 -1
  62. package/out/concepts/Identifier__.d.ts +5 -0
  63. package/out/concepts/Identifier__.js +19 -9
  64. package/out/concepts/Identifier__.js.map +1 -1
  65. package/out/concepts/LogicItem__.d.ts +1 -1
  66. package/out/concepts/LogicItem__.js.map +1 -1
  67. package/out/concepts/Logic__.d.ts +3 -1
  68. package/out/concepts/Logic__.js +31 -21
  69. package/out/concepts/Logic__.js.map +1 -1
  70. package/out/concepts/Match__.d.ts +1 -1
  71. package/out/concepts/MemberExpression__.d.ts +1 -1
  72. package/out/concepts/MemberExpression__.js +3 -3
  73. package/out/concepts/MemberExpression__.js.map +1 -1
  74. package/out/concepts/NewComposite__.js.map +1 -1
  75. package/out/concepts/ParamWithGroup__.d.ts +39 -0
  76. package/out/concepts/ParamWithGroup__.js +85 -0
  77. package/out/concepts/ParamWithGroup__.js.map +1 -0
  78. package/out/concepts/Param__.js +11 -3
  79. package/out/concepts/Param__.js.map +1 -1
  80. package/out/concepts/ProcessElement__.js +9 -1
  81. package/out/concepts/ProcessElement__.js.map +1 -1
  82. package/out/concepts/Return__.js +17 -9
  83. package/out/concepts/Return__.js.map +1 -1
  84. package/out/concepts/ValidationRule__.js +2 -1
  85. package/out/concepts/ValidationRule__.js.map +1 -1
  86. package/out/concepts/Variable__.js +17 -8
  87. package/out/concepts/Variable__.js.map +1 -1
  88. package/out/concepts/ViewElement__.d.ts +17 -1
  89. package/out/concepts/ViewElement__.js +145 -16
  90. package/out/concepts/ViewElement__.js.map +1 -1
  91. package/out/concepts/View__.js +21 -20
  92. package/out/concepts/View__.js.map +1 -1
  93. package/out/concepts/index__.d.ts +5 -0
  94. package/out/concepts/index__.js +5 -0
  95. package/out/concepts/index__.js.map +1 -1
  96. package/out/concepts/utils/asserts.d.ts +258 -3
  97. package/out/concepts/utils/asserts.js +351 -13
  98. package/out/concepts/utils/asserts.js.map +1 -1
  99. package/out/concepts/utils/types.d.ts +20 -3
  100. package/out/generator/genBundleFiles.js +25 -11
  101. package/out/generator/genBundleFiles.js.map +1 -1
  102. package/out/generator/genReleaseBody.js +12 -3
  103. package/out/generator/genReleaseBody.js.map +1 -1
  104. package/out/generator/permission.js +3 -3
  105. package/out/generator/permission.js.map +1 -1
  106. package/out/natural/transformTSCode.js +1 -1
  107. package/out/natural/transformTSCode.js.map +1 -1
  108. package/out/server/extendBaseNode.js +6 -4
  109. package/out/server/extendBaseNode.js.map +1 -1
  110. package/out/server/getLogics.js +62 -27
  111. package/out/server/getLogics.js.map +1 -1
  112. package/out/server/getMemberIdentifier.js +6 -1
  113. package/out/server/getMemberIdentifier.js.map +1 -1
  114. package/out/server/getProcesses.js +3 -3
  115. package/out/server/getProcesses.js.map +1 -1
  116. package/out/server/naslServer.js +40 -19
  117. package/out/server/naslServer.js.map +1 -1
  118. package/out/server/translator.js +6 -1
  119. package/out/server/translator.js.map +1 -1
  120. package/out/service/storage/init.js +1 -2
  121. package/out/service/storage/init.js.map +1 -1
  122. package/out/templator/genCreateBlock.js +6 -6
  123. package/out/templator/genCreateBlock.js.map +1 -1
  124. package/out/templator/genCurdEditMultipleKeyBlock.js +16 -16
  125. package/out/templator/genCurdEditMultipleKeyBlock.js.map +1 -1
  126. package/out/templator/genCurdMultipleKeyBlock.js +36 -36
  127. package/out/templator/genCurdMultipleKeyBlock.js.map +1 -1
  128. package/out/templator/genGetBlock.js +6 -5
  129. package/out/templator/genGetBlock.js.map +1 -1
  130. package/out/templator/genGridViewBlock.js +12 -12
  131. package/out/templator/genGridViewBlock.js.map +1 -1
  132. package/out/templator/genListViewBlock.js +4 -4
  133. package/out/templator/genListViewBlock.js.map +1 -1
  134. package/out/templator/genSelectBlock.js +3 -3
  135. package/out/templator/genSelectBlock.js.map +1 -1
  136. package/out/templator/genTableBlock.js +10 -10
  137. package/out/templator/genTableBlock.js.map +1 -1
  138. package/out/templator/genUpdateBlock.js +10 -9
  139. package/out/templator/genUpdateBlock.js.map +1 -1
  140. package/out/templator/utils.d.ts +2 -2
  141. package/out/templator/utils.js.map +1 -1
  142. package/out/translator/utils.js +12 -1
  143. package/out/translator/utils.js.map +1 -1
  144. package/out/utils/i18nInfo.js +7 -2
  145. package/out/utils/i18nInfo.js.map +1 -1
  146. package/out/utils/index.d.ts +17 -0
  147. package/out/utils/index.js +184 -1
  148. package/out/utils/index.js.map +1 -1
  149. package/package.json +2 -2
  150. package/src/bak/translator.js +121 -43
  151. package/src/breakpoint/generator/BreakpointNode.ts +12 -0
  152. package/src/breakpoint/shared/constants.ts +1 -0
  153. package/src/breakpoint/shared/utils.ts +13 -8
  154. package/src/breakpoint/store/core.ts +1 -1
  155. package/src/common/BaseNode.ts +22 -41
  156. package/src/concepts/AnonymousFunction__.ts +36 -18
  157. package/src/concepts/App__.ts +129 -130
  158. package/src/concepts/BackendVariable__.ts +10 -2
  159. package/src/concepts/BindAttribute__.ts +14 -6
  160. package/src/concepts/BindDirective__.ts +19 -4
  161. package/src/concepts/BindEvent__.ts +41 -13
  162. package/src/concepts/BusinessComponent__.ts +2693 -0
  163. package/src/concepts/BusinessLogic__.ts +376 -0
  164. package/src/concepts/CallEvent__.ts +351 -0
  165. package/src/concepts/CallFunction__.ts +10 -13
  166. package/src/concepts/CallLogic__.ts +45 -32
  167. package/src/concepts/Constant__.ts +5 -7
  168. package/src/concepts/Destination__.ts +7 -5
  169. package/src/concepts/End__.ts +1 -0
  170. package/src/concepts/Event__.ts +70 -0
  171. package/src/concepts/FrontendType__.ts +919 -0
  172. package/src/concepts/Frontend__.ts +3 -251
  173. package/src/concepts/Identifier__.ts +29 -13
  174. package/src/concepts/LogicItem__.ts +1 -0
  175. package/src/concepts/Logic__.ts +36 -23
  176. package/src/concepts/MemberExpression__.ts +3 -3
  177. package/src/concepts/NewComposite__.ts +4 -6
  178. package/src/concepts/ParamWithGroup__.ts +101 -0
  179. package/src/concepts/Param__.ts +11 -3
  180. package/src/concepts/ProcessElement__.ts +8 -1
  181. package/src/concepts/Return__.ts +15 -12
  182. package/src/concepts/ValidationRule__.ts +6 -1
  183. package/src/concepts/Variable__.ts +17 -9
  184. package/src/concepts/ViewElement__.ts +168 -33
  185. package/src/concepts/View__.ts +23 -20
  186. package/src/concepts/index__.ts +5 -0
  187. package/src/concepts/utils/asserts.ts +367 -4
  188. package/src/concepts/utils/types.ts +28 -0
  189. package/src/generator/genBundleFiles.ts +33 -15
  190. package/src/generator/genReleaseBody.ts +14 -3
  191. package/src/generator/permission.ts +8 -6
  192. package/src/natural/transformTSCode.ts +1 -1
  193. package/src/server/extendBaseNode.ts +22 -20
  194. package/src/server/getLogics.ts +79 -41
  195. package/src/server/getMemberIdentifier.ts +7 -1
  196. package/src/server/getProcesses.ts +3 -3
  197. package/src/server/naslServer.ts +44 -20
  198. package/src/server/translator.ts +7 -1
  199. package/src/service/storage/init.ts +1 -2
  200. package/src/templator/genCreateBlock.ts +6 -6
  201. package/src/templator/genCurdEditMultipleKeyBlock.ts +16 -16
  202. package/src/templator/genCurdMultipleKeyBlock.ts +36 -36
  203. package/src/templator/genGetBlock.ts +6 -5
  204. package/src/templator/genGridViewBlock.ts +12 -12
  205. package/src/templator/genListViewBlock.ts +4 -4
  206. package/src/templator/genSelectBlock.ts +3 -3
  207. package/src/templator/genTableBlock.ts +10 -10
  208. package/src/templator/genUpdateBlock.ts +10 -9
  209. package/src/templator/utils.ts +2 -2
  210. package/src/translator/utils.ts +12 -1
  211. package/src/utils/i18nInfo.ts +7 -2
  212. package/src/utils/index.ts +211 -1
  213. package/test/concepts/call-function/fixtures/from-string.json +68 -59
  214. package/test/concepts/call-function/fixtures/to-string-global-tz.json +67 -58
  215. package/test/concepts/call-function/fixtures/to-string-no-tz.json +57 -48
  216. package/test/concepts/call-function/fixtures/to-string-user-tz.json +69 -60
  217. package/test/concepts/call-function/fixtures/to-string-utc-tz.json +69 -60
  218. package/test/concepts/call-interface/fixtures/only-interface.json +81 -72
  219. package/test/concepts/call-interface/fixtures/with-body-complex-argument.json +223 -214
  220. package/test/concepts/call-interface/fixtures/with-body-no-argument.json +85 -76
  221. package/test/concepts/call-interface/fixtures/with-body-simple-argument.json +100 -91
  222. package/test/concepts/call-interface/fixtures/with-headers-no-argument.json +88 -79
  223. package/test/concepts/call-interface/fixtures/with-headers.json +90 -81
  224. package/test/concepts/call-interface/fixtures/with-query-no-argument.json +88 -79
  225. package/test/concepts/call-interface/fixtures/with-query.json +90 -81
  226. package/test/concepts/call-logic/__snapshots__/getQuickInfoOffset.spec.ts.snap +4 -2
  227. package/test/concepts/call-logic/fixtures/entries-get-with-arguments.json +104 -95
  228. package/test/concepts/call-logic/fixtures/entries-update-with-arguments.json +209 -200
  229. package/test/concepts/call-logic/fixtures/global-logic-argument-no-expression.json +97 -88
  230. package/test/concepts/call-logic/fixtures/global-logic-argument-some-expression.json +124 -115
  231. package/test/concepts/call-logic/fixtures/json-deserialize.json +120 -111
  232. package/test/concepts/call-logic/fixtures/json-serialize-with-string.json +124 -115
  233. package/test/concepts/call-logic/fixtures/json-serialize.json +124 -115
  234. package/test/concepts/call-logic/fixtures/view-buildin-logic-with-argument.json +91 -82
  235. package/test/concepts/call-logic/fixtures/view-component-logic-no-argument.json +88 -79
  236. package/test/concepts/call-logic/fixtures/view-component-with-validation.json +144 -135
  237. package/test/concepts/identifier/fixtures/view-variable.json +145 -136
  238. package/test/concepts/view-element/__snapshots__/toVue.spec.ts.snap +1 -1
  239. package/test/concepts/view-element/fixtures/default-login.json +221 -212
  240. package/test/concepts/view-element/fixtures/default-not-found.json +183 -174
  241. package/test/concepts/view-element/fixtures/with-role-auth.json +91 -82
  242. package/test/concepts/view-element/fixtures/with-table.json +1894 -1885
  243. package/test/concepts/view-element/toVue.spec.ts +1 -0
  244. package/ts-worker/package.json +1 -1
  245. package/ts-worker/src/index.js +1 -0
@@ -0,0 +1,919 @@
1
+ import type { EmbeddedTSFileGenerator } from '../utils';
2
+ import { createCompilerState, withSourceMapGenerator, TranslatorGenerator } from '../translator';
3
+ import Namespace from './Namespace__';
4
+ import { AssetsInfo } from './App__';
5
+
6
+ //================================================================================
7
+ // 从这里开始到结尾注释之间的代码由 NASL Workbench 自动生成,请不手动修改!
8
+ // ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
9
+ //================================================================================
10
+ import { EventPayload, Params } from '../common/EventEmitter';
11
+ import { concept, excludedInJSON, property, getConceptConstructor, getBaseNode } from '../decorators';
12
+
13
+ import * as utils from '../utils';
14
+ import * as types from './utils/types';
15
+ import * as asserts from './utils/asserts';
16
+ import { v4 as uuidv4 } from 'uuid';
17
+ import BaseNode from '../common/BaseNode';
18
+ import type Frontend from './Frontend__';
19
+ import type BusinessComponent from './BusinessComponent__';
20
+ import type Module from './Module__';
21
+
22
+ /**
23
+ * 端类型
24
+ */
25
+ @concept('端类型')
26
+ export class FrontendType extends BaseNode {
27
+ /** 类名 */
28
+ static readonly ConceptName: string = 'FrontendType';
29
+
30
+ /** 继承链 */
31
+ static readonly inheritanceChain: string[] = ['BaseNode'];
32
+
33
+ /**
34
+ * 产品概念
35
+ */
36
+ @property('concept')
37
+ // @ts-ignore
38
+ readonly concept!: 'FrontendType';
39
+
40
+ /**
41
+ * 名称与type保持一致
42
+ */
43
+ @property()
44
+ name!: 'pc' | 'h5';
45
+
46
+ /**
47
+ * PC/H5 端
48
+ */
49
+ @property()
50
+ kind!: 'pc' | 'h5';
51
+
52
+ /**
53
+ * 前端列表
54
+ */
55
+ @property({
56
+ objectRef: 'Frontend',
57
+ isArray: true,
58
+ defaultValue: [],
59
+ })
60
+ frontends: Array<Frontend> = [];
61
+
62
+ /**
63
+ * 业务组件列表
64
+ */
65
+ @property({
66
+ objectRef: 'BusinessComponent',
67
+ isArray: true,
68
+ defaultValue: [],
69
+ })
70
+ businessComponents: Array<BusinessComponent> = [];
71
+
72
+ /**
73
+ * 扩展组件列表(兼容老版)
74
+ */
75
+ @property({
76
+ objectRef: 'Module',
77
+ isArray: true,
78
+ defaultValue: [],
79
+ })
80
+ componentDependencies: Array<Module> = [];
81
+
82
+ /**
83
+ * @param source 需要合并的部分参数
84
+ */
85
+ constructor(source?: Partial<FrontendType>) {
86
+ source = Object.assign({}, FrontendType.getDefaultOptions(), source);
87
+ super(source);
88
+ super.subConstructor(source);
89
+ }
90
+
91
+ static from(source: any, parentNode?: any, parentKey?: string): FrontendType {
92
+ return super.from(source, parentNode, parentKey) as FrontendType;
93
+ }
94
+
95
+ /**
96
+ * 从父级删除该节点
97
+ * @internal
98
+ */
99
+ _delete() {
100
+ let params: Params = null;
101
+ if (this.parentNode) {
102
+ params = (this.parentNode as any)?.__removeFrontendType?.(this);
103
+ }
104
+ return params;
105
+ }
106
+
107
+ getFrontendExistingNames(excludedList: Array<Frontend> = []) {
108
+ const excludedSet = new Set(excludedList);
109
+ return ((this.frontends as Frontend[]) || []).filter((item) => !excludedSet.has(item)).map((item) => item?.name);
110
+ }
111
+ getFrontendUniqueName(name = 'frontend1') {
112
+ return utils.unique(name, this.getFrontendExistingNames(), undefined, true);
113
+ }
114
+
115
+ /**
116
+ * 插入前端
117
+ * @internal
118
+ * @param name 前端名称,如果不填会自动生成一个唯一名称
119
+ */
120
+ _insertFrontendAt(name: string, index: number): Frontend;
121
+
122
+ /**
123
+ * 插入前端
124
+ * @internal
125
+ * @param frontendOptions 前端参数
126
+ */
127
+ _insertFrontendAt(frontendOptions: Partial<Frontend>, index: number): Frontend;
128
+
129
+ /**
130
+ * 插入前端
131
+ * @internal
132
+ * @param frontend 已有的前端实例
133
+ */
134
+ _insertFrontendAt(frontend: Frontend, index: number): Frontend;
135
+
136
+ _insertFrontendAt(options: string | Partial<Frontend> | Frontend, index: number) {
137
+ const frontendOptions: any = {};
138
+ const relationOptions = { parentNode: this, parentKey: 'frontends' };
139
+ const Frontend = getConceptConstructor('Frontend');
140
+ let frontend: Frontend;
141
+ if (!options) {
142
+ frontend = Frontend.from(
143
+ {
144
+ ...frontendOptions,
145
+ name: this.getFrontendUniqueName(),
146
+ },
147
+ this,
148
+ 'frontends',
149
+ );
150
+ } else if (typeof options === 'string') {
151
+ frontend = Frontend.from(
152
+ {
153
+ ...frontendOptions,
154
+ name: options,
155
+ },
156
+ this,
157
+ 'frontends',
158
+ );
159
+ } else if (asserts.isFrontend(options)) {
160
+ options.ensureDelete(); // 同一实例不支持多处存在
161
+ frontend = options;
162
+ Object.assign(frontend, relationOptions);
163
+ } else {
164
+ frontend = Frontend.from(
165
+ {
166
+ ...frontendOptions,
167
+ ...options,
168
+ },
169
+ this,
170
+ 'frontends',
171
+ );
172
+ }
173
+ this.frontends.splice(index, 0, frontend);
174
+ return frontend;
175
+ }
176
+
177
+ /**
178
+ * 插入前端
179
+ * @param name 前端名称,如果不填会自动生成一个唯一名称
180
+ */
181
+ insertFrontendAt(name: string, index: number): Frontend;
182
+
183
+ /**
184
+ * 插入前端
185
+ * @param frontendOptions 前端参数
186
+ */
187
+ insertFrontendAt(frontendOptions: Partial<Frontend>, index: number): Frontend;
188
+
189
+ /**
190
+ * 插入前端
191
+ * @param frontend 已有的前端实例
192
+ */
193
+ insertFrontendAt(frontend: Frontend, index: number): Frontend;
194
+
195
+ insertFrontendAt(options: string | Partial<Frontend> | Frontend, index: number) {
196
+ const node = this._insertFrontendAt(options as any, index);
197
+ node.create({
198
+ index,
199
+ parentNode: this,
200
+ parentKey: 'frontends',
201
+ });
202
+ return node;
203
+ }
204
+
205
+ /**
206
+ * 添加前端
207
+ * @internal
208
+ * @param name 前端名称,如果不填会自动生成一个唯一名称
209
+ */
210
+ _addFrontend(name?: string): Frontend;
211
+
212
+ /**
213
+ * 添加前端
214
+ * @internal
215
+ * @param frontendOptions 前端参数
216
+ */
217
+ _addFrontend(frontendOptions: Partial<Frontend>): Frontend;
218
+
219
+ /**
220
+ * 添加前端
221
+ * @internal
222
+ * @param frontend 已有的前端实例
223
+ */
224
+ _addFrontend(frontend: Frontend): Frontend;
225
+
226
+ _addFrontend(options?: string | Partial<Frontend> | Frontend) {
227
+ const index = this.frontends.length;
228
+ return this._insertFrontendAt(options as any, index);
229
+ }
230
+
231
+ /**
232
+ * 添加前端
233
+ * @internal
234
+ * @param name 前端名称,如果不填会自动生成一个唯一名称
235
+ */
236
+ addFrontend(name?: string): Frontend;
237
+
238
+ /**
239
+ * 添加前端
240
+ * @param frontendOptions 前端参数
241
+ */
242
+ addFrontend(frontendOptions: Partial<Frontend>): Frontend;
243
+
244
+ /**
245
+ * 添加前端
246
+ * @param frontend 已有的前端实例
247
+ */
248
+ addFrontend(frontend: Frontend): Frontend;
249
+
250
+ addFrontend(options?: string | Partial<Frontend> | Frontend) {
251
+ const node = this._addFrontend(options as any);
252
+ const index = this.frontends.indexOf(node);
253
+ node.create({
254
+ index,
255
+ parentNode: this,
256
+ parentKey: 'frontends',
257
+ });
258
+ return node;
259
+ }
260
+
261
+ getBusinessComponentExistingNames(excludedList: Array<BusinessComponent> = []) {
262
+ const excludedSet = new Set(excludedList);
263
+ return ((this.businessComponents as BusinessComponent[]) || [])
264
+ .filter((item) => !excludedSet.has(item))
265
+ .map((item) => item?.name);
266
+ }
267
+ getBusinessComponentUniqueName(name = 'component1') {
268
+ return utils.unique(name, this.getBusinessComponentExistingNames(), undefined, false);
269
+ }
270
+
271
+ /**
272
+ * 插入业务组件
273
+ * @internal
274
+ * @param name 业务组件名称,如果不填会自动生成一个唯一名称
275
+ */
276
+ _insertBusinessComponentAt(name: string, index: number): BusinessComponent;
277
+
278
+ /**
279
+ * 插入业务组件
280
+ * @internal
281
+ * @param componentOptions 业务组件参数
282
+ */
283
+ _insertBusinessComponentAt(componentOptions: Partial<BusinessComponent>, index: number): BusinessComponent;
284
+
285
+ /**
286
+ * 插入业务组件
287
+ * @internal
288
+ * @param component 已有的业务组件实例
289
+ */
290
+ _insertBusinessComponentAt(component: BusinessComponent, index: number): BusinessComponent;
291
+
292
+ _insertBusinessComponentAt(options: string | Partial<BusinessComponent> | BusinessComponent, index: number) {
293
+ const componentOptions: any = this.getBusinessComponentOptions();
294
+ const relationOptions = { parentNode: this, parentKey: 'businessComponents' };
295
+ const BusinessComponent = getConceptConstructor('BusinessComponent');
296
+ let component: BusinessComponent;
297
+ if (!options) {
298
+ component = BusinessComponent.from(
299
+ {
300
+ ...componentOptions,
301
+ name: this.getBusinessComponentUniqueName(),
302
+ },
303
+ this,
304
+ 'businessComponents',
305
+ );
306
+ } else if (typeof options === 'string') {
307
+ component = BusinessComponent.from(
308
+ {
309
+ ...componentOptions,
310
+ name: options,
311
+ },
312
+ this,
313
+ 'businessComponents',
314
+ );
315
+ } else if (asserts.isBusinessComponent(options)) {
316
+ options.ensureDelete(); // 同一实例不支持多处存在
317
+ component = options;
318
+ Object.assign(component, relationOptions);
319
+ } else {
320
+ component = BusinessComponent.from(
321
+ {
322
+ ...componentOptions,
323
+ ...options,
324
+ },
325
+ this,
326
+ 'businessComponents',
327
+ );
328
+ }
329
+ this.businessComponents.splice(index, 0, component);
330
+ return component;
331
+ }
332
+
333
+ /**
334
+ * 插入业务组件
335
+ * @param name 业务组件名称,如果不填会自动生成一个唯一名称
336
+ */
337
+ insertBusinessComponentAt(name: string, index: number): BusinessComponent;
338
+
339
+ /**
340
+ * 插入业务组件
341
+ * @param componentOptions 业务组件参数
342
+ */
343
+ insertBusinessComponentAt(componentOptions: Partial<BusinessComponent>, index: number): BusinessComponent;
344
+
345
+ /**
346
+ * 插入业务组件
347
+ * @param component 已有的业务组件实例
348
+ */
349
+ insertBusinessComponentAt(component: BusinessComponent, index: number): BusinessComponent;
350
+
351
+ insertBusinessComponentAt(options: string | Partial<BusinessComponent> | BusinessComponent, index: number) {
352
+ const node = this._insertBusinessComponentAt(options as any, index);
353
+ node.create({
354
+ index,
355
+ parentNode: this,
356
+ parentKey: 'businessComponents',
357
+ });
358
+ return node;
359
+ }
360
+
361
+ /**
362
+ * 添加业务组件
363
+ * @internal
364
+ * @param name 业务组件名称,如果不填会自动生成一个唯一名称
365
+ */
366
+ _addBusinessComponent(name?: string): BusinessComponent;
367
+
368
+ /**
369
+ * 添加业务组件
370
+ * @internal
371
+ * @param componentOptions 业务组件参数
372
+ */
373
+ _addBusinessComponent(componentOptions: Partial<BusinessComponent>): BusinessComponent;
374
+
375
+ /**
376
+ * 添加业务组件
377
+ * @internal
378
+ * @param component 已有的业务组件实例
379
+ */
380
+ _addBusinessComponent(component: BusinessComponent): BusinessComponent;
381
+
382
+ _addBusinessComponent(options?: string | Partial<BusinessComponent> | BusinessComponent) {
383
+ const index = this.businessComponents.length;
384
+ return this._insertBusinessComponentAt(options as any, index);
385
+ }
386
+
387
+ /**
388
+ * 添加业务组件
389
+ * @internal
390
+ * @param name 业务组件名称,如果不填会自动生成一个唯一名称
391
+ */
392
+ addBusinessComponent(name?: string): BusinessComponent;
393
+
394
+ /**
395
+ * 添加业务组件
396
+ * @param componentOptions 业务组件参数
397
+ */
398
+ addBusinessComponent(componentOptions: Partial<BusinessComponent>): BusinessComponent;
399
+
400
+ /**
401
+ * 添加业务组件
402
+ * @param component 已有的业务组件实例
403
+ */
404
+ addBusinessComponent(component: BusinessComponent): BusinessComponent;
405
+
406
+ addBusinessComponent(options?: string | Partial<BusinessComponent> | BusinessComponent) {
407
+ const node = this._addBusinessComponent(options as any);
408
+ const index = this.businessComponents.indexOf(node);
409
+ node.create({
410
+ index,
411
+ parentNode: this,
412
+ parentKey: 'businessComponents',
413
+ });
414
+ return node;
415
+ }
416
+
417
+ getModuleExistingNames(excludedList: Array<Module> = []) {
418
+ const excludedSet = new Set(excludedList);
419
+ return ((this.componentDependencies as Module[]) || [])
420
+ .filter((item) => !excludedSet.has(item))
421
+ .map((item) => item?.name);
422
+ }
423
+ getModuleUniqueName(name = 'module1') {
424
+ return utils.unique(name, this.getModuleExistingNames(), undefined, false);
425
+ }
426
+
427
+ /**
428
+ * 插入模块
429
+ * @internal
430
+ * @param name 模块名称,如果不填会自动生成一个唯一名称
431
+ */
432
+ _insertModuleAt(name: string, index: number): Module;
433
+
434
+ /**
435
+ * 插入模块
436
+ * @internal
437
+ * @param moduleOptions 模块参数
438
+ */
439
+ _insertModuleAt(moduleOptions: Partial<Module>, index: number): Module;
440
+
441
+ /**
442
+ * 插入模块
443
+ * @internal
444
+ * @param module 已有的模块实例
445
+ */
446
+ _insertModuleAt(module: Module, index: number): Module;
447
+
448
+ _insertModuleAt(options: string | Partial<Module> | Module, index: number) {
449
+ const moduleOptions: any = {};
450
+ const relationOptions = { parentNode: this, parentKey: 'componentDependencies' };
451
+ const Module = getConceptConstructor('Module');
452
+ let module: Module;
453
+ if (!options) {
454
+ module = Module.from(
455
+ {
456
+ ...moduleOptions,
457
+ name: this.getModuleUniqueName(),
458
+ },
459
+ this,
460
+ 'componentDependencies',
461
+ );
462
+ } else if (typeof options === 'string') {
463
+ module = Module.from(
464
+ {
465
+ ...moduleOptions,
466
+ name: options,
467
+ },
468
+ this,
469
+ 'componentDependencies',
470
+ );
471
+ } else if (asserts.isModule(options)) {
472
+ options.ensureDelete(); // 同一实例不支持多处存在
473
+ module = options;
474
+ Object.assign(module, relationOptions);
475
+ } else {
476
+ module = Module.from(
477
+ {
478
+ ...moduleOptions,
479
+ ...options,
480
+ },
481
+ this,
482
+ 'componentDependencies',
483
+ );
484
+ }
485
+ this.componentDependencies.splice(index, 0, module);
486
+ return module;
487
+ }
488
+
489
+ /**
490
+ * 插入模块
491
+ * @param name 模块名称,如果不填会自动生成一个唯一名称
492
+ */
493
+ insertModuleAt(name: string, index: number): Module;
494
+
495
+ /**
496
+ * 插入模块
497
+ * @param moduleOptions 模块参数
498
+ */
499
+ insertModuleAt(moduleOptions: Partial<Module>, index: number): Module;
500
+
501
+ /**
502
+ * 插入模块
503
+ * @param module 已有的模块实例
504
+ */
505
+ insertModuleAt(module: Module, index: number): Module;
506
+
507
+ insertModuleAt(options: string | Partial<Module> | Module, index: number) {
508
+ const node = this._insertModuleAt(options as any, index);
509
+ node.create({
510
+ index,
511
+ parentNode: this,
512
+ parentKey: 'componentDependencies',
513
+ });
514
+ return node;
515
+ }
516
+
517
+ /**
518
+ * 添加模块
519
+ * @internal
520
+ * @param name 模块名称,如果不填会自动生成一个唯一名称
521
+ */
522
+ _addModule(name?: string): Module;
523
+
524
+ /**
525
+ * 添加模块
526
+ * @internal
527
+ * @param moduleOptions 模块参数
528
+ */
529
+ _addModule(moduleOptions: Partial<Module>): Module;
530
+
531
+ /**
532
+ * 添加模块
533
+ * @internal
534
+ * @param module 已有的模块实例
535
+ */
536
+ _addModule(module: Module): Module;
537
+
538
+ _addModule(options?: string | Partial<Module> | Module) {
539
+ const index = this.componentDependencies.length;
540
+ return this._insertModuleAt(options as any, index);
541
+ }
542
+
543
+ /**
544
+ * 添加模块
545
+ * @internal
546
+ * @param name 模块名称,如果不填会自动生成一个唯一名称
547
+ */
548
+ addModule(name?: string): Module;
549
+
550
+ /**
551
+ * 添加模块
552
+ * @param moduleOptions 模块参数
553
+ */
554
+ addModule(moduleOptions: Partial<Module>): Module;
555
+
556
+ /**
557
+ * 添加模块
558
+ * @param module 已有的模块实例
559
+ */
560
+ addModule(module: Module): Module;
561
+
562
+ addModule(options?: string | Partial<Module> | Module) {
563
+ const node = this._addModule(options as any);
564
+ const index = this.componentDependencies.indexOf(node);
565
+ node.create({
566
+ index,
567
+ parentNode: this,
568
+ parentKey: 'componentDependencies',
569
+ });
570
+ return node;
571
+ }
572
+
573
+ /**
574
+ * 删除前端
575
+ * @param name 前端名称
576
+ */
577
+ removeFrontend(name: string): void;
578
+
579
+ /**
580
+ * 删除前端
581
+ * @param frontend 已有的前端实例
582
+ */
583
+ removeFrontend(frontend: Frontend): void;
584
+
585
+ removeFrontend(options: string | Frontend) {
586
+ let frontend: Frontend;
587
+ if (typeof options === 'string') {
588
+ frontend = (this.frontends as Frontend[]).find((item) => item.name === options);
589
+ if (!frontend) {
590
+ throw new Error('找不到前端 ' + options);
591
+ }
592
+ } else {
593
+ frontend = options;
594
+ }
595
+ return frontend.delete();
596
+ }
597
+
598
+ __removeFrontend(frontend: Frontend) {
599
+ const parentKey = frontend.parentKey;
600
+ const params: Params = {
601
+ parentNode: this,
602
+ parentKey,
603
+ index: -1,
604
+ object: null,
605
+ oldObject: frontend,
606
+ };
607
+ if (parentKey) {
608
+ params.parentKey = parentKey;
609
+ // @ts-ignore
610
+ const t = this.__v_raw || this;
611
+ // @ts-ignore
612
+ const n = frontend.__v_raw || frontend;
613
+ if (Array.isArray((t as any)[parentKey])) {
614
+ // @ts-ignore
615
+ const index = (t as any)[parentKey].findIndex((el) => (el.__v_raw || el) === n);
616
+ ~index && (this as any)[parentKey].splice(index, 1);
617
+ params.index = index;
618
+ } else {
619
+ const q = (t as any)[parentKey];
620
+ if ((q.__v_raw || q) === n) {
621
+ params.index = 0;
622
+ (this as any)[parentKey] = undefined;
623
+ }
624
+ }
625
+ }
626
+ return params;
627
+ }
628
+
629
+ /**
630
+ * 删除业务组件
631
+ * @param name 业务组件名称
632
+ */
633
+ removeBusinessComponent(name: string): void;
634
+
635
+ /**
636
+ * 删除业务组件
637
+ * @param component 已有的业务组件实例
638
+ */
639
+ removeBusinessComponent(component: BusinessComponent): void;
640
+
641
+ removeBusinessComponent(options: string | BusinessComponent) {
642
+ let component: BusinessComponent;
643
+ if (typeof options === 'string') {
644
+ component = (this.businessComponents as BusinessComponent[]).find((item) => item.name === options);
645
+ if (!component) {
646
+ throw new Error('找不到业务组件 ' + options);
647
+ }
648
+ } else {
649
+ component = options;
650
+ }
651
+ return component.delete();
652
+ }
653
+
654
+ __removeBusinessComponent(component: BusinessComponent) {
655
+ const parentKey = component.parentKey;
656
+ const params: Params = {
657
+ parentNode: this,
658
+ parentKey,
659
+ index: -1,
660
+ object: null,
661
+ oldObject: component,
662
+ };
663
+ if (parentKey) {
664
+ params.parentKey = parentKey;
665
+ // @ts-ignore
666
+ const t = this.__v_raw || this;
667
+ // @ts-ignore
668
+ const n = component.__v_raw || component;
669
+ if (Array.isArray((t as any)[parentKey])) {
670
+ // @ts-ignore
671
+ const index = (t as any)[parentKey].findIndex((el) => (el.__v_raw || el) === n);
672
+ ~index && (this as any)[parentKey].splice(index, 1);
673
+ params.index = index;
674
+ } else {
675
+ const q = (t as any)[parentKey];
676
+ if ((q.__v_raw || q) === n) {
677
+ params.index = 0;
678
+ (this as any)[parentKey] = undefined;
679
+ }
680
+ }
681
+ }
682
+ return params;
683
+ }
684
+
685
+ /**
686
+ * 删除模块
687
+ * @param name 模块名称
688
+ */
689
+ removeModule(name: string): void;
690
+
691
+ /**
692
+ * 删除模块
693
+ * @param module 已有的模块实例
694
+ */
695
+ removeModule(module: Module): void;
696
+
697
+ removeModule(options: string | Module) {
698
+ let module: Module;
699
+ if (typeof options === 'string') {
700
+ module = (this.componentDependencies as Module[]).find((item) => item.name === options);
701
+ if (!module) {
702
+ throw new Error('找不到模块 ' + options);
703
+ }
704
+ } else {
705
+ module = options;
706
+ }
707
+ return module.delete();
708
+ }
709
+
710
+ __removeModule(module: Module) {
711
+ const parentKey = module.parentKey;
712
+ const params: Params = {
713
+ parentNode: this,
714
+ parentKey,
715
+ index: -1,
716
+ object: null,
717
+ oldObject: module,
718
+ };
719
+ if (parentKey) {
720
+ params.parentKey = parentKey;
721
+ // @ts-ignore
722
+ const t = this.__v_raw || this;
723
+ // @ts-ignore
724
+ const n = module.__v_raw || module;
725
+ if (Array.isArray((t as any)[parentKey])) {
726
+ // @ts-ignore
727
+ const index = (t as any)[parentKey].findIndex((el) => (el.__v_raw || el) === n);
728
+ ~index && (this as any)[parentKey].splice(index, 1);
729
+ params.index = index;
730
+ } else {
731
+ const q = (t as any)[parentKey];
732
+ if ((q.__v_raw || q) === n) {
733
+ params.index = 0;
734
+ (this as any)[parentKey] = undefined;
735
+ }
736
+ }
737
+ }
738
+ return params;
739
+ }
740
+
741
+ //================================================================================
742
+ // ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
743
+ // 自动生成的代码已结束。下面可以手动编写。
744
+ //================================================================================
745
+ getNamespace() {
746
+ if (this.parentNode && (this.parentNode as Namespace).getNamespace) {
747
+ const parentNamespace = (this.parentNode as Namespace).getNamespace();
748
+ const parentName = this.parentNode.name;
749
+ const arr = [parentNamespace];
750
+ if (this.parentNode.concept !== 'App' && parentName) {
751
+ arr.push(parentName);
752
+ }
753
+ return `${arr.join('.')}.frontendTypes`;
754
+ }
755
+ throw new Error('无法获取命名空间,请设置 parentNode!');
756
+ }
757
+
758
+ /**
759
+ * 生成宿主语言的文件路径
760
+ * @param name 一般不用传,用于 rename
761
+ */
762
+ getEmbeddedFilePath(name = this.name) {
763
+ return `/embedded/${this.rootNode?.name || this.parentNode.name}/frontendTypes/${name}.ts`;
764
+ }
765
+
766
+ @withSourceMapGenerator
767
+ *toEmbeddedTS(state = createCompilerState()): TranslatorGenerator {
768
+ const self = this;
769
+ let code = `export namespace ${self.name} {\n`;
770
+ code += 'const name = ';
771
+ code += `"${self.name}";\n`;
772
+ code += '}\n';
773
+ return code;
774
+ }
775
+
776
+ *toEmbeddedTSFile(): EmbeddedTSFileGenerator {
777
+ let code = `namespace ${this.getNamespace()} {\n`;
778
+
779
+ const state = createCompilerState(code, { tabSize: 1 });
780
+ try {
781
+ code += yield* this.toEmbeddedTS(state);
782
+ } catch (err) {
783
+ code += '';
784
+ console.log(err);
785
+ }
786
+ code += '}\n';
787
+
788
+ return {
789
+ code,
790
+ filePath: this.getEmbeddedFilePath(),
791
+ sourceMap: state.sourceMap,
792
+ };
793
+ }
794
+
795
+ /**
796
+ * 获取业务组件的默认配置
797
+ * @returns
798
+ */
799
+ getBusinessComponentOptions() {
800
+ let options: any;
801
+ if (this.kind === 'pc') {
802
+ options = {
803
+ elements: [
804
+ {
805
+ concept: 'ViewElement',
806
+ type: 0,
807
+ tag: 'u-linear-layout',
808
+ name: 'uLinearLayout1',
809
+ staticClass: null,
810
+ slotTarget: null,
811
+ slotScope: null,
812
+ bindAttrs: [
813
+ {
814
+ concept: 'BindAttribute',
815
+ name: 'gap',
816
+ type: 'string',
817
+ value: 'none',
818
+ rules: [],
819
+ playground: [],
820
+ },
821
+ ],
822
+ bindEvents: [],
823
+ bindDirectives: [],
824
+ bindRoles: [],
825
+ bindStyles: [],
826
+ children: [],
827
+ },
828
+ ],
829
+ };
830
+ } else {
831
+ options = {
832
+ elements: [
833
+ {
834
+ concept: 'ViewElement',
835
+ name: 'vanLinearLayout1',
836
+ type: 0,
837
+ tag: 'van-linear-layout',
838
+ staticStyle: null,
839
+ slotTarget: null,
840
+ slotScope: null,
841
+ bindAttrs: [
842
+ {
843
+ concept: 'BindAttribute',
844
+ name: 'gap',
845
+ type: 'string',
846
+ value: 'none',
847
+ rules: [],
848
+ playground: [],
849
+ },
850
+ ],
851
+ bindEvents: [],
852
+ bindDirectives: [],
853
+ bindRoles: [],
854
+ bindStyles: [],
855
+ children: [],
856
+ },
857
+ ],
858
+ };
859
+ }
860
+ return options;
861
+ }
862
+
863
+ addFrontendForType(options?: string | Partial<Frontend> | Frontend) {
864
+ let insertIndex = -1;
865
+ this.frontends.forEach((frontend, index) => {
866
+ if (frontend.type === (options as any).type) {
867
+ insertIndex = index;
868
+ }
869
+ });
870
+ if ((options as any).type === 'h5' && insertIndex === -1) {
871
+ insertIndex = this.frontends.length;
872
+ }
873
+ const node = this._insertFrontendAt(options as any, insertIndex + 1);
874
+ const index = this.frontends.indexOf(node);
875
+ node.create({
876
+ index,
877
+ parentNode: this,
878
+ parentKey: 'frontends',
879
+ });
880
+ return node;
881
+ }
882
+
883
+ findComponentDependencyByName(name: string) {
884
+ return this.componentDependencies.find((componentDependency) => componentDependency.name === name);
885
+ }
886
+
887
+ genCustomAssetsInfo(prefix: string) {
888
+ const custom: AssetsInfo = {
889
+ js: [],
890
+ css: [],
891
+ names: [],
892
+ };
893
+ const existingSet = new Set();
894
+ this.componentDependencies.forEach((dep) => {
895
+ const { name, version } = dep;
896
+ const jsName = `${prefix}/packages/${name}@${version}/dist-theme/index.js`;
897
+ if (!existingSet.has(jsName)) {
898
+ existingSet.add(jsName);
899
+ custom.js.push(jsName);
900
+ if (utils.shouldLoadCss(name, version)) {
901
+ custom.css.push(`${prefix}/packages/${name}@${version}/dist-theme/index.css`);
902
+ }
903
+ custom.names.push(name);
904
+ }
905
+ });
906
+ return custom;
907
+ }
908
+
909
+ //================================================================================
910
+ // 从这里开始到结尾注释之间的代码由 NASL Workbench 自动生成,请不手动修改!
911
+ // ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
912
+ //================================================================================
913
+ }
914
+
915
+ export default FrontendType;
916
+ //================================================================================
917
+ // ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
918
+ // 自动生成的代码已结束。下面可以手动编写。
919
+ //================================================================================