amis-core 3.2.0 → 3.3.0

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 (297) hide show
  1. package/esm/Root.js +1 -1
  2. package/esm/RootRenderer.d.ts +1 -1
  3. package/esm/RootRenderer.js +3 -3
  4. package/esm/SchemaRenderer.js +5 -2
  5. package/esm/Scoped.d.ts +4 -1
  6. package/esm/Scoped.js +8 -5
  7. package/esm/StatusScoped.js +1 -1
  8. package/esm/WithRootStore.js +1 -1
  9. package/esm/WithStore.js +1 -1
  10. package/esm/actions/Action.d.ts +1 -0
  11. package/esm/actions/Action.js +62 -37
  12. package/esm/actions/AjaxAction.d.ts +6 -8
  13. package/esm/actions/AjaxAction.js +20 -18
  14. package/esm/actions/BreakAction.js +1 -1
  15. package/esm/actions/BroadcastAction.js +1 -1
  16. package/esm/actions/CmptAction.d.ts +1 -2
  17. package/esm/actions/CmptAction.js +46 -31
  18. package/esm/actions/ContinueAction.js +1 -1
  19. package/esm/actions/CopyAction.js +1 -1
  20. package/esm/actions/CustomAction.js +2 -2
  21. package/esm/actions/DialogAction.js +5 -6
  22. package/esm/actions/DrawerAction.js +4 -4
  23. package/esm/actions/EmailAction.js +1 -1
  24. package/esm/actions/LinkAction.js +1 -1
  25. package/esm/actions/LoopAction.js +1 -1
  26. package/esm/actions/PageAction.js +1 -1
  27. package/esm/actions/ParallelAction.js +1 -1
  28. package/esm/actions/StatusAction.d.ts +15 -0
  29. package/esm/actions/StatusAction.js +49 -0
  30. package/esm/actions/SwitchAction.js +1 -1
  31. package/esm/actions/ToastAction.js +1 -1
  32. package/esm/actions/index.d.ts +1 -0
  33. package/esm/components/CustomStyle.js +1 -1
  34. package/esm/components/LazyComponent.js +1 -1
  35. package/esm/components/Overlay.js +2 -2
  36. package/esm/components/PopOver.js +2 -2
  37. package/esm/env.js +1 -1
  38. package/esm/envOverwrite.js +1 -1
  39. package/esm/factory.js +2 -2
  40. package/esm/index.d.ts +2 -1
  41. package/esm/index.js +13 -13
  42. package/esm/locale.js +1 -1
  43. package/esm/polyfills.js +1 -1
  44. package/esm/renderers/Form.d.ts +6 -6
  45. package/esm/renderers/Form.js +168 -124
  46. package/esm/renderers/Item.d.ts +42 -66
  47. package/esm/renderers/Item.js +11 -41
  48. package/esm/renderers/Options.js +1 -2
  49. package/esm/renderers/Placeholder.js +1 -1
  50. package/esm/renderers/builtin.js +1 -1
  51. package/esm/renderers/register.js +1 -1
  52. package/esm/renderers/wrapControl.js +101 -47
  53. package/esm/store/app.js +8 -4
  54. package/esm/store/combo.d.ts +444 -1912
  55. package/esm/store/combo.js +9 -2
  56. package/esm/store/crud.d.ts +1 -0
  57. package/esm/store/crud.js +11 -5
  58. package/esm/store/form.d.ts +132 -892
  59. package/esm/store/form.js +83 -81
  60. package/esm/store/formItem.d.ts +5 -2
  61. package/esm/store/formItem.js +13 -2
  62. package/esm/store/iRenderer.js +2 -2
  63. package/esm/store/index.js +1 -1
  64. package/esm/store/list.js +1 -1
  65. package/esm/store/manager.js +1 -1
  66. package/esm/store/modal.js +1 -1
  67. package/esm/store/node.js +1 -1
  68. package/esm/store/pagination.js +1 -1
  69. package/esm/store/root.js +2 -2
  70. package/esm/store/service.js +4 -4
  71. package/esm/store/status.js +1 -1
  72. package/esm/store/table.d.ts +503 -2040
  73. package/esm/store/table.js +79 -55
  74. package/esm/store/table2.d.ts +49 -0
  75. package/esm/store/table2.js +37 -4
  76. package/esm/theme.js +1 -1
  77. package/esm/types.d.ts +17 -3
  78. package/esm/utils/Animation.js +1 -1
  79. package/esm/utils/ColorScale.js +1 -1
  80. package/esm/utils/DataSchema.js +1 -1
  81. package/esm/utils/DataScope.js +1 -1
  82. package/esm/utils/RootClose.js +1 -1
  83. package/esm/utils/SimpleMap.js +1 -1
  84. package/esm/utils/api.d.ts +2 -2
  85. package/esm/utils/api.js +113 -81
  86. package/esm/utils/arraySlice.js +1 -1
  87. package/esm/utils/attachmentAdpator.js +1 -1
  88. package/esm/utils/autobind.js +1 -1
  89. package/esm/utils/columnsSplit.js +1 -1
  90. package/esm/utils/dataMapping.js +4 -2
  91. package/esm/utils/date.js +1 -1
  92. package/esm/utils/debug.d.ts +2 -0
  93. package/esm/utils/debug.js +34 -7
  94. package/esm/utils/decodeEntity.js +1 -1
  95. package/esm/utils/dom.js +1 -1
  96. package/esm/utils/errors.js +1 -1
  97. package/esm/utils/escapeHtml.js +1 -1
  98. package/esm/utils/filter-schema.js +1 -1
  99. package/esm/utils/filter.js +1 -1
  100. package/esm/utils/formatDuration.js +1 -1
  101. package/esm/utils/formula.d.ts +0 -1
  102. package/esm/utils/formula.js +6 -9
  103. package/esm/utils/getVariable.js +1 -1
  104. package/esm/utils/grammar.js +1 -1
  105. package/esm/utils/handleAction.js +1 -1
  106. package/esm/utils/helper.d.ts +11 -1
  107. package/esm/utils/helper.js +14 -2
  108. package/esm/utils/highlight.js +1 -1
  109. package/esm/utils/icon.d.ts +4 -2
  110. package/esm/utils/icon.js +3 -2
  111. package/esm/utils/image.js +1 -1
  112. package/esm/utils/index.d.ts +1 -0
  113. package/esm/utils/isPureVariable.js +1 -1
  114. package/esm/utils/json-schema-2-amis-schema.js +1 -1
  115. package/esm/utils/keyToPath.js +1 -1
  116. package/esm/utils/makeSorter.js +1 -1
  117. package/esm/utils/math.d.ts +3 -0
  118. package/esm/utils/math.js +52 -0
  119. package/esm/utils/memoryParse.js +1 -1
  120. package/esm/utils/normalizeLink.js +1 -1
  121. package/esm/utils/normalizeOptions.js +1 -1
  122. package/esm/utils/object.d.ts +7 -0
  123. package/esm/utils/object.js +13 -2
  124. package/esm/utils/offset.js +1 -1
  125. package/esm/utils/offsetParent.js +1 -1
  126. package/esm/utils/optionValueCompare.js +2 -2
  127. package/esm/utils/position.js +1 -1
  128. package/esm/utils/prettyBytes.js +1 -1
  129. package/esm/utils/renderer-event.d.ts +1 -1
  130. package/esm/utils/renderer-event.js +14 -6
  131. package/esm/utils/replaceText.js +1 -1
  132. package/esm/utils/resize-sensor.js +1 -1
  133. package/esm/utils/resolveCondition.js +1 -1
  134. package/esm/utils/resolveVariable.js +1 -1
  135. package/esm/utils/resolveVariableAndFilter.js +1 -1
  136. package/esm/utils/resolveVariableAndFilterForAsync.js +1 -1
  137. package/esm/utils/scrollPosition.js +1 -1
  138. package/esm/utils/string2regExp.js +1 -1
  139. package/esm/utils/stripNumber.js +1 -1
  140. package/esm/utils/style-helper.js +1 -1
  141. package/esm/utils/style.js +1 -1
  142. package/esm/utils/toNumber.js +1 -1
  143. package/esm/utils/tokenize.js +1 -1
  144. package/esm/utils/tpl-builtin.js +1 -1
  145. package/esm/utils/tpl-lodash.js +1 -1
  146. package/esm/utils/tpl.js +1 -1
  147. package/esm/utils/uncontrollable.js +1 -1
  148. package/esm/utils/validations.js +1 -1
  149. package/lib/Root.js +10 -7
  150. package/lib/RootRenderer.d.ts +1 -1
  151. package/lib/RootRenderer.js +11 -8
  152. package/lib/SchemaRenderer.js +12 -6
  153. package/lib/Scoped.d.ts +4 -1
  154. package/lib/Scoped.js +18 -13
  155. package/lib/StatusScoped.js +5 -2
  156. package/lib/WithRootStore.js +5 -2
  157. package/lib/WithStore.js +5 -2
  158. package/lib/actions/Action.d.ts +1 -0
  159. package/lib/actions/Action.js +62 -37
  160. package/lib/actions/AjaxAction.d.ts +6 -8
  161. package/lib/actions/AjaxAction.js +20 -18
  162. package/lib/actions/BreakAction.js +1 -1
  163. package/lib/actions/BroadcastAction.js +1 -1
  164. package/lib/actions/CmptAction.d.ts +1 -2
  165. package/lib/actions/CmptAction.js +46 -31
  166. package/lib/actions/ContinueAction.js +1 -1
  167. package/lib/actions/CopyAction.js +1 -1
  168. package/lib/actions/CustomAction.js +8 -5
  169. package/lib/actions/DialogAction.js +5 -6
  170. package/lib/actions/DrawerAction.js +4 -4
  171. package/lib/actions/EmailAction.js +1 -1
  172. package/lib/actions/LinkAction.js +1 -1
  173. package/lib/actions/LoopAction.js +1 -1
  174. package/lib/actions/PageAction.js +1 -1
  175. package/lib/actions/ParallelAction.js +1 -1
  176. package/lib/actions/StatusAction.d.ts +15 -0
  177. package/lib/actions/StatusAction.js +53 -0
  178. package/lib/actions/SwitchAction.js +1 -1
  179. package/lib/actions/ToastAction.js +1 -1
  180. package/lib/actions/index.d.ts +1 -0
  181. package/lib/components/CustomStyle.js +1 -1
  182. package/lib/components/LazyComponent.js +12 -14
  183. package/lib/components/Overlay.js +14 -14
  184. package/lib/components/PopOver.js +11 -10
  185. package/lib/env.js +4 -1
  186. package/lib/envOverwrite.js +1 -1
  187. package/lib/factory.js +11 -9
  188. package/lib/index.d.ts +2 -1
  189. package/lib/index.js +21 -19
  190. package/lib/locale.js +6 -3
  191. package/lib/polyfills.js +1 -1
  192. package/lib/renderers/Form.d.ts +6 -6
  193. package/lib/renderers/Form.js +180 -131
  194. package/lib/renderers/Item.d.ts +42 -66
  195. package/lib/renderers/Item.js +51 -75
  196. package/lib/renderers/Options.js +10 -5
  197. package/lib/renderers/Placeholder.js +1 -1
  198. package/lib/renderers/builtin.js +1 -1
  199. package/lib/renderers/register.js +1 -1
  200. package/lib/renderers/wrapControl.js +104 -47
  201. package/lib/store/app.js +14 -7
  202. package/lib/store/combo.d.ts +444 -1912
  203. package/lib/store/combo.js +9 -2
  204. package/lib/store/crud.d.ts +1 -0
  205. package/lib/store/crud.js +11 -5
  206. package/lib/store/form.d.ts +132 -892
  207. package/lib/store/form.js +81 -79
  208. package/lib/store/formItem.d.ts +5 -2
  209. package/lib/store/formItem.js +13 -2
  210. package/lib/store/iRenderer.js +8 -5
  211. package/lib/store/index.js +1 -1
  212. package/lib/store/list.js +1 -1
  213. package/lib/store/manager.js +1 -1
  214. package/lib/store/modal.js +1 -1
  215. package/lib/store/node.js +1 -1
  216. package/lib/store/pagination.js +1 -1
  217. package/lib/store/root.js +8 -5
  218. package/lib/store/service.js +4 -4
  219. package/lib/store/status.js +1 -1
  220. package/lib/store/table.d.ts +503 -2040
  221. package/lib/store/table.js +79 -55
  222. package/lib/store/table2.d.ts +49 -0
  223. package/lib/store/table2.js +36 -3
  224. package/lib/theme.js +6 -3
  225. package/lib/types.d.ts +17 -3
  226. package/lib/utils/Animation.js +1 -1
  227. package/lib/utils/ColorScale.js +1 -1
  228. package/lib/utils/DataSchema.js +1 -1
  229. package/lib/utils/DataScope.js +1 -1
  230. package/lib/utils/RootClose.js +1 -1
  231. package/lib/utils/SimpleMap.js +1 -1
  232. package/lib/utils/api.d.ts +2 -2
  233. package/lib/utils/api.js +113 -81
  234. package/lib/utils/arraySlice.js +1 -1
  235. package/lib/utils/attachmentAdpator.js +1 -1
  236. package/lib/utils/autobind.js +1 -1
  237. package/lib/utils/columnsSplit.js +8 -6
  238. package/lib/utils/dataMapping.js +4 -2
  239. package/lib/utils/date.js +1 -1
  240. package/lib/utils/debug.d.ts +2 -0
  241. package/lib/utils/debug.js +61 -33
  242. package/lib/utils/decodeEntity.js +1 -1
  243. package/lib/utils/dom.js +7 -5
  244. package/lib/utils/errors.js +1 -1
  245. package/lib/utils/escapeHtml.js +1 -1
  246. package/lib/utils/filter-schema.js +1 -1
  247. package/lib/utils/filter.js +1 -1
  248. package/lib/utils/formatDuration.js +1 -1
  249. package/lib/utils/formula.d.ts +0 -1
  250. package/lib/utils/formula.js +6 -10
  251. package/lib/utils/getVariable.js +1 -1
  252. package/lib/utils/grammar.js +1 -1
  253. package/lib/utils/handleAction.js +1 -1
  254. package/lib/utils/helper.d.ts +11 -1
  255. package/lib/utils/helper.js +14 -1
  256. package/lib/utils/highlight.js +8 -9
  257. package/lib/utils/icon.d.ts +4 -2
  258. package/lib/utils/icon.js +12 -10
  259. package/lib/utils/image.js +1 -1
  260. package/lib/utils/index.d.ts +1 -0
  261. package/lib/utils/isPureVariable.js +1 -1
  262. package/lib/utils/json-schema-2-amis-schema.js +1 -1
  263. package/lib/utils/keyToPath.js +1 -1
  264. package/lib/utils/makeSorter.js +1 -1
  265. package/lib/utils/math.d.ts +3 -0
  266. package/lib/utils/math.js +58 -0
  267. package/lib/utils/memoryParse.js +1 -1
  268. package/lib/utils/normalizeLink.js +1 -1
  269. package/lib/utils/normalizeOptions.js +1 -1
  270. package/lib/utils/object.d.ts +7 -0
  271. package/lib/utils/object.js +13 -1
  272. package/lib/utils/offset.js +1 -1
  273. package/lib/utils/offsetParent.js +1 -1
  274. package/lib/utils/optionValueCompare.js +7 -3
  275. package/lib/utils/position.js +1 -1
  276. package/lib/utils/prettyBytes.js +1 -1
  277. package/lib/utils/renderer-event.d.ts +1 -1
  278. package/lib/utils/renderer-event.js +13 -5
  279. package/lib/utils/replaceText.js +1 -1
  280. package/lib/utils/resize-sensor.js +1 -1
  281. package/lib/utils/resolveCondition.js +1 -1
  282. package/lib/utils/resolveVariable.js +1 -1
  283. package/lib/utils/resolveVariableAndFilter.js +1 -1
  284. package/lib/utils/resolveVariableAndFilterForAsync.js +1 -1
  285. package/lib/utils/scrollPosition.js +1 -1
  286. package/lib/utils/string2regExp.js +1 -1
  287. package/lib/utils/stripNumber.js +1 -1
  288. package/lib/utils/style-helper.js +1 -1
  289. package/lib/utils/style.js +1 -1
  290. package/lib/utils/toNumber.js +1 -1
  291. package/lib/utils/tokenize.js +1 -1
  292. package/lib/utils/tpl-builtin.js +1 -1
  293. package/lib/utils/tpl-lodash.js +1 -1
  294. package/lib/utils/tpl.js +1 -1
  295. package/lib/utils/uncontrollable.js +1 -1
  296. package/lib/utils/validations.js +1 -1
  297. package/package.json +5 -5
package/lib/utils/api.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -56,10 +56,10 @@ function buildApi(api, data, options) {
56
56
  api.headers = dataMapping.dataMapping(api.headers, data, undefined, false);
57
57
  }
58
58
  if (api.requestAdaptor && typeof api.requestAdaptor === 'string') {
59
- api.requestAdaptor = str2function(api.requestAdaptor, 'api');
59
+ api.requestAdaptor = str2AsyncFunction(api.requestAdaptor, 'api', 'context');
60
60
  }
61
61
  if (api.adaptor && typeof api.adaptor === 'string') {
62
- api.adaptor = str2function(api.adaptor, 'payload', 'response', 'api');
62
+ api.adaptor = str2AsyncFunction(api.adaptor, 'payload', 'response', 'api', 'context');
63
63
  }
64
64
  if (!data) {
65
65
  return api;
@@ -363,68 +363,84 @@ function wrapFetcher(fn, tracker) {
363
363
  }
364
364
  var wrappedFetcher = function (api, data, options) {
365
365
  var _a, _b, _c;
366
- api = buildApi(api, data, options);
367
- if (api.requestAdaptor) {
368
- debug.debug('api', 'before requestAdaptor', api);
369
- api = api.requestAdaptor(api) || api;
370
- debug.debug('api', 'after requestAdaptor', api);
371
- }
372
- if (api.data &&
373
- (api.data instanceof FormData ||
374
- helper.hasFile(api.data) ||
375
- api.dataType === 'form-data')) {
376
- api.data =
377
- api.data instanceof FormData
378
- ? api.data
379
- : helper.object2formData(api.data, api.qsOptions);
380
- }
381
- else if (api.data &&
382
- typeof api.data !== 'string' &&
383
- api.dataType === 'form') {
384
- api.data = helper.qsstringify(api.data, api.qsOptions);
385
- api.headers = api.headers || (api.headers = {});
386
- api.headers['Content-Type'] = 'application/x-www-form-urlencoded';
387
- }
388
- else if (api.data &&
389
- typeof api.data !== 'string' &&
390
- api.dataType === 'json') {
391
- api.data = JSON.stringify(api.data);
392
- api.headers = api.headers || (api.headers = {});
393
- api.headers['Content-Type'] = 'application/json';
394
- }
395
- if (!isValidApi(api.url)) {
396
- throw new Error("invalid api url:".concat(api.url));
397
- }
398
- debug.debug('api', 'request api', api);
399
- tracker === null || tracker === void 0 ? void 0 : tracker({ eventType: 'api', eventData: omit__default["default"](api, ['config', 'data', 'body']) }, api.data);
400
- if (((_a = api.method) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'jsonp') {
401
- return wrapAdaptor(jsonpFetcher(api), api);
402
- }
403
- if (((_b = api.method) === null || _b === void 0 ? void 0 : _b.toLocaleLowerCase()) === 'js') {
404
- return wrapAdaptor(jsFetcher(fn, api), api);
405
- }
406
- if (typeof api.cache === 'number' && api.cache > 0) {
407
- var apiCache = getApiCache(api);
408
- return wrapAdaptor(apiCache
409
- ? apiCache.cachedPromise
410
- : setApiCache(api, fn(api)), api);
411
- }
412
- // IE get 请求会被缓存,所以自动加个时间戳
413
- if (isIE && api && ((_c = api.method) === null || _c === void 0 ? void 0 : _c.toLocaleLowerCase()) === 'get') {
414
- var timeStamp = "_t=".concat(Date.now());
415
- if (api.url.indexOf('?') === -1) {
416
- api.url = api.url + "?".concat(timeStamp);
417
- }
418
- else {
419
- api.url = api.url + "&".concat(timeStamp);
420
- }
421
- }
422
- return wrapAdaptor(fn(api), api);
366
+ return tslib.__awaiter(this, void 0, void 0, function () {
367
+ var apiCache, timeStamp;
368
+ return tslib.__generator(this, function (_d) {
369
+ switch (_d.label) {
370
+ case 0:
371
+ api = buildApi(api, data, options);
372
+ if (!api.requestAdaptor) return [3 /*break*/, 2];
373
+ debug.debug('api', 'before requestAdaptor', api);
374
+ return [4 /*yield*/, api.requestAdaptor(api, data)];
375
+ case 1:
376
+ api = (_d.sent()) || api;
377
+ debug.debug('api', 'after requestAdaptor', api);
378
+ _d.label = 2;
379
+ case 2:
380
+ if (api.data &&
381
+ (api.data instanceof FormData ||
382
+ helper.hasFile(api.data) ||
383
+ api.dataType === 'form-data')) {
384
+ api.data =
385
+ api.data instanceof FormData
386
+ ? api.data
387
+ : helper.object2formData(api.data, api.qsOptions);
388
+ }
389
+ else if (api.data &&
390
+ typeof api.data !== 'string' &&
391
+ api.dataType === 'form') {
392
+ api.data = helper.qsstringify(api.data, api.qsOptions);
393
+ api.headers = api.headers || (api.headers = {});
394
+ api.headers['Content-Type'] = 'application/x-www-form-urlencoded';
395
+ }
396
+ else if (api.data &&
397
+ typeof api.data !== 'string' &&
398
+ api.dataType === 'json') {
399
+ api.data = JSON.stringify(api.data);
400
+ api.headers = api.headers || (api.headers = {});
401
+ api.headers['Content-Type'] = 'application/json';
402
+ }
403
+ // 如果发送适配器中设置了 mockResponse
404
+ // 则直接跳过请求发送
405
+ if (api.mockResponse) {
406
+ return [2 /*return*/, wrapAdaptor(Promise.resolve(api.mockResponse), api, data)];
407
+ }
408
+ if (!isValidApi(api.url)) {
409
+ throw new Error("invalid api url:".concat(api.url));
410
+ }
411
+ debug.debug('api', 'request api', api);
412
+ tracker === null || tracker === void 0 ? void 0 : tracker({ eventType: 'api', eventData: omit__default["default"](api, ['config', 'data', 'body']) }, api.data);
413
+ if (((_a = api.method) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === 'jsonp') {
414
+ return [2 /*return*/, wrapAdaptor(jsonpFetcher(api), api, data)];
415
+ }
416
+ if (((_b = api.method) === null || _b === void 0 ? void 0 : _b.toLocaleLowerCase()) === 'js') {
417
+ return [2 /*return*/, wrapAdaptor(jsFetcher(fn, api), api, data)];
418
+ }
419
+ if (typeof api.cache === 'number' && api.cache > 0) {
420
+ apiCache = getApiCache(api);
421
+ return [2 /*return*/, wrapAdaptor(apiCache
422
+ ? apiCache.cachedPromise
423
+ : setApiCache(api, fn(api)), api, data)];
424
+ }
425
+ // IE 下 get 请求会被缓存,所以自动加个时间戳
426
+ if (isIE && api && ((_c = api.method) === null || _c === void 0 ? void 0 : _c.toLocaleLowerCase()) === 'get') {
427
+ timeStamp = "_t=".concat(Date.now());
428
+ if (api.url.indexOf('?') === -1) {
429
+ api.url = api.url + "?".concat(timeStamp);
430
+ }
431
+ else {
432
+ api.url = api.url + "&".concat(timeStamp);
433
+ }
434
+ }
435
+ return [2 /*return*/, wrapAdaptor(fn(api), api, data)];
436
+ }
437
+ });
438
+ });
423
439
  };
424
440
  wrappedFetcher._wrappedFetcher = true;
425
441
  return wrappedFetcher;
426
442
  }
427
- function wrapAdaptor(promise, api) {
443
+ function wrapAdaptor(promise, api, context) {
428
444
  var _this = this;
429
445
  var adaptor = api.adaptor;
430
446
  return adaptor
@@ -435,7 +451,7 @@ function wrapAdaptor(promise, api) {
435
451
  switch (_a.label) {
436
452
  case 0:
437
453
  debug.debug('api', 'before adaptor data', response.data);
438
- result = adaptor(response.data, response, api);
454
+ result = adaptor(response.data, response, api, context);
439
455
  if (!(result === null || result === void 0 ? void 0 : result.then)) return [3 /*break*/, 2];
440
456
  return [4 /*yield*/, result];
441
457
  case 1:
@@ -549,41 +565,57 @@ function isApiOutdated(prevApi, nextApi, prevData, nextData) {
549
565
  return true;
550
566
  }
551
567
  nextApi = normalizeApi(nextApi);
568
+ prevApi = (prevApi ? normalizeApi(prevApi) : prevApi);
552
569
  if (nextApi.autoRefresh === false) {
553
570
  return false;
554
571
  }
572
+ // api 本身有变化
573
+ if ((prevApi && prevApi.url !== nextApi.url) || !prevApi) {
574
+ return !!(isValidApi(nextApi.url) &&
575
+ (!nextApi.sendOn || tpl.evalExpression(nextApi.sendOn, nextData)));
576
+ }
555
577
  var trackExpression = (_a = nextApi.trackExpression) !== null && _a !== void 0 ? _a : nextApi.url;
556
578
  if (typeof trackExpression !== 'string' || !~trackExpression.indexOf('$')) {
557
579
  return false;
558
580
  }
559
581
  var isModified = false;
560
- if (prevApi) {
561
- prevApi = normalizeApi(prevApi);
562
- if (nextApi.trackExpression || prevApi.trackExpression) {
563
- isModified =
564
- tokenize.tokenize(prevApi.trackExpression || '', prevData) !==
565
- tokenize.tokenize(nextApi.trackExpression || '', nextData);
566
- }
567
- else {
568
- prevApi = buildApi(prevApi, prevData, {
569
- ignoreData: true
570
- });
571
- nextApi = buildApi(nextApi, nextData, {
572
- ignoreData: true
573
- });
574
- isModified = prevApi.url !== nextApi.url;
575
- }
582
+ if (nextApi.trackExpression || prevApi.trackExpression) {
583
+ isModified =
584
+ tokenize.tokenize(prevApi.trackExpression || '', prevData) !==
585
+ tokenize.tokenize(nextApi.trackExpression || '', nextData);
576
586
  }
577
587
  else {
578
- isModified = true;
588
+ prevApi = buildApi(prevApi, prevData, {
589
+ ignoreData: true
590
+ });
591
+ nextApi = buildApi(nextApi, nextData, {
592
+ ignoreData: true
593
+ });
594
+ isModified = prevApi.url !== nextApi.url;
579
595
  }
580
596
  return !!(isModified &&
581
597
  isValidApi(nextApi.url) &&
582
598
  (!nextApi.sendOn || tpl.evalExpression(nextApi.sendOn, nextData)));
583
599
  }
584
600
  function isValidApi(api) {
585
- return (api &&
586
- /^(?:(https?|wss?|taf):\/\/[^\/]+)?(\/?[^\s\/\?]*){1,}(\?.*)?$/.test(api));
601
+ if (!api || typeof api !== 'string') {
602
+ return false;
603
+ }
604
+ var idx = api.indexOf('://');
605
+ // 不允许直接相对路径写 api
606
+ // 不允许 :// 结尾
607
+ if ((!~idx && api[0] !== '/') || (~idx && idx + 3 === api.length)) {
608
+ return false;
609
+ }
610
+ try {
611
+ // 不补一个协议,URL 判断为 false
612
+ api = (~idx ? '' : 'schema://domain') + api;
613
+ new URL(api);
614
+ }
615
+ catch (error) {
616
+ return false;
617
+ }
618
+ return true;
587
619
  }
588
620
  function isEffectiveApi(api, data, initFetch, initFetchOn) {
589
621
  if (!api) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -8,14 +8,16 @@
8
8
  Object.defineProperty(exports, '__esModule', { value: true });
9
9
 
10
10
  var tslib = require('tslib');
11
- var React = require('react');
11
+ require('react');
12
12
  var chunk = require('lodash/chunk');
13
13
 
14
14
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
15
15
 
16
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
16
  var chunk__default = /*#__PURE__*/_interopDefaultLegacy(chunk);
18
17
 
18
+ var __react_jsx__ = require('react');
19
+ var _J$X_ = (__react_jsx__["default"] || __react_jsx__).createElement;
20
+ (__react_jsx__["default"] || __react_jsx__).Fragment;
19
21
  function columnsSplit(body, cx, columnsCount) {
20
22
  if (Array.isArray(columnsCount) && columnsCount.length) {
21
23
  var bodyIndex_1 = 0;
@@ -24,10 +26,10 @@ function columnsSplit(body, cx, columnsCount) {
24
26
  var cellClassName_1 = "Grid-col--sm".concat(maxSize);
25
27
  columnsCount.forEach(function (columnSize, groupIndex) {
26
28
  if (columnSize) {
27
- bodyList_1.push(React__default["default"].createElement("div", { className: cx('Grid'), key: groupIndex }, Array.from({ length: columnSize }).map(function (_, index) {
29
+ bodyList_1.push(_J$X_("div", { className: cx('Grid'), key: groupIndex }, Array.from({ length: columnSize }).map(function (_, index) {
28
30
  if (bodyIndex_1 + index < body.length) {
29
31
  // 避免溢出
30
- return (React__default["default"].createElement("div", { key: index, className: cx(cellClassName_1) }, body[bodyIndex_1 + index]));
32
+ return (_J$X_("div", { key: index, className: cx(cellClassName_1) }, body[bodyIndex_1 + index]));
31
33
  }
32
34
  else {
33
35
  return null;
@@ -41,7 +43,7 @@ function columnsSplit(body, cx, columnsCount) {
41
43
  else if (typeof columnsCount === 'number' && columnsCount > 1) {
42
44
  var weight = 12 / columnsCount;
43
45
  var cellClassName_2 = "Grid-col--sm".concat(weight === Math.round(weight) ? weight : '');
44
- body = chunk__default["default"](body, columnsCount).map(function (group, groupIndex) { return (React__default["default"].createElement("div", { className: cx('Grid'), key: groupIndex }, Array.from({ length: columnsCount }).map(function (_, index) { return (React__default["default"].createElement("div", { key: index, className: cx(cellClassName_2) }, group[index])); }))); });
46
+ body = chunk__default["default"](body, columnsCount).map(function (group, groupIndex) { return (_J$X_("div", { className: cx('Grid'), key: groupIndex }, Array.from({ length: columnsCount }).map(function (_, index) { return (_J$X_("div", { key: index, className: cx(cellClassName_2) }, group[index])); }))); });
45
47
  }
46
48
  return body;
47
49
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -139,7 +139,9 @@ function dataMapping(to, from, ignoreFunction, convertKeyToPath, ignoreIfNotMatc
139
139
  else if (value === '$$') {
140
140
  object.setVariable(ret, key, from, convertKeyToPath);
141
141
  }
142
- else if (value && value[0] === '$') {
142
+ else if (typeof value === 'string' &&
143
+ value.length > 0 &&
144
+ value[0] === '$') {
143
145
  var v = resolveMapping(value, from, undefined, ignoreIfNotMatch);
144
146
  object.setVariable(ret, key, v, convertKeyToPath);
145
147
  if (v === '__undefined') {
package/lib/utils/date.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -2,7 +2,9 @@
2
2
  * amis 运行时调试功能,为了避免循环引用,这个组件不要依赖 amis 里的组件
3
3
  */
4
4
  import React, { Component } from 'react';
5
+ export declare const JsonView: React.LazyExoticComponent<React.ComponentType<import("react-json-view").ReactJsonViewProps>>;
5
6
  export declare function enableDebug(): void;
7
+ export declare function disableDebug(): void;
6
8
  interface DebugWrapperProps {
7
9
  renderer: any;
8
10
  children?: React.ReactNode;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -11,7 +11,6 @@ var tslib = require('tslib');
11
11
  var React = require('react');
12
12
  var cx = require('classnames');
13
13
  var ReactDOM = require('react-dom');
14
- var JsonView = require('react-json-view');
15
14
  var mobx = require('mobx');
16
15
  var mobxReact = require('mobx-react');
17
16
  var helper = require('./helper.js');
@@ -21,11 +20,11 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
21
20
 
22
21
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
23
22
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
24
- var JsonView__default = /*#__PURE__*/_interopDefaultLegacy(JsonView);
25
23
 
26
- /**
27
- * amis 运行时调试功能,为了避免循环引用,这个组件不要依赖 amis 里的组件
28
- */
24
+ var __react_jsx__ = require('react');
25
+ var _J$X_ = (__react_jsx__["default"] || __react_jsx__).createElement;
26
+ (__react_jsx__["default"] || __react_jsx__).Fragment;
27
+ var JsonView = React__default["default"].lazy(function () { return Promise.resolve().then(function() {return new Promise(function(fullfill) {require(['react-json-view'], function(mod) {fullfill(tslib.__importStar(mod))})})}); });
29
28
  /** @class */ ((function () {
30
29
  function Log() {
31
30
  this.cat = '';
@@ -116,14 +115,15 @@ var LogView = mobxReact.observer(function (_a) {
116
115
  var store = _a.store;
117
116
  var logs = store.logs;
118
117
  var ellipsisThreshold = (_b = store.ellipsisThreshold) !== null && _b !== void 0 ? _b : 50;
119
- return (React__default["default"].createElement(React__default["default"].Fragment, null, logs.map(function (log, index) {
120
- return (React__default["default"].createElement("div", { className: "AMISDebug-logLine", key: "log-".concat(index) },
121
- React__default["default"].createElement("div", { className: "AMISDebug-logLineMsg" },
118
+ return (_J$X_(React__default["default"].Fragment, null, logs.map(function (log, index) {
119
+ return (_J$X_("div", { className: "AMISDebug-logLine", key: "log-".concat(index) },
120
+ _J$X_("div", { className: "AMISDebug-logLineMsg" },
122
121
  "[",
123
122
  log.cat,
124
123
  "] ",
125
124
  log.msg),
126
- log.ext ? (React__default["default"].createElement(JsonView__default["default"], { name: null, theme: "monokai", src: JSON.parse(log.ext), collapsed: true, enableClipboard: false, displayDataTypes: false, collapseStringsAfterLength: ellipsisThreshold, iconStyle: "square" })) : null));
125
+ log.ext ? (_J$X_(React__default["default"].Suspense, { fallback: _J$X_("div", null, "Loading...") },
126
+ _J$X_(JsonView, { name: null, theme: "monokai", src: JSON.parse(log.ext), collapsed: true, enableClipboard: false, displayDataTypes: false, collapseStringsAfterLength: ellipsisThreshold, iconStyle: "square" }))) : null));
127
127
  })));
128
128
  });
129
129
  var AMISDebug = mobxReact.observer(function (_a) {
@@ -149,11 +149,12 @@ var AMISDebug = mobxReact.observer(function (_a) {
149
149
  try {
150
150
  for (var stacks_1 = tslib.__values(stacks), stacks_1_1 = stacks_1.next(); !stacks_1_1.done; stacks_1_1 = stacks_1.next()) {
151
151
  var stack = stacks_1_1.value;
152
- stackDataView.push(React__default["default"].createElement("div", { key: "data-".concat(level) },
153
- React__default["default"].createElement("h3", null,
152
+ stackDataView.push(_J$X_("div", { key: "data-".concat(level) },
153
+ _J$X_("h3", null,
154
154
  "Data Level-",
155
155
  level),
156
- React__default["default"].createElement(JsonView__default["default"], { key: "dataview-".concat(stack), name: null, theme: "monokai", src: stack, collapsed: level === 0 ? false : true, enableClipboard: false, displayDataTypes: false, iconStyle: "square" })));
156
+ _J$X_(React__default["default"].Suspense, { fallback: _J$X_("div", null, "Loading...") },
157
+ _J$X_(JsonView, { key: "dataview-".concat(stack), name: null, theme: "monokai", src: stack, collapsed: level === 0 ? false : true, enableClipboard: false, displayDataTypes: false, iconStyle: "square" }))));
157
158
  level += 1;
158
159
  }
159
160
  }
@@ -199,47 +200,47 @@ var AMISDebug = mobxReact.observer(function (_a) {
199
200
  }
200
201
  };
201
202
  }, [isResizing]);
202
- return (React__default["default"].createElement("div", { className: cx__default["default"]('AMISDebug', {
203
+ return (_J$X_("div", { className: cx__default["default"]('AMISDebug', {
203
204
  'is-expanded': store.isExpanded,
204
205
  'is-left': store.position === 'left'
205
206
  }), ref: panelRef },
206
- React__default["default"].createElement("div", { className: "AMISDebug-toggle", title: "open debug", onClick: function () {
207
+ _J$X_("div", { className: "AMISDebug-toggle", title: "open debug", onClick: function () {
207
208
  store.isExpanded = true;
208
- } }, store.isExpanded ? (React__default["default"].createElement("i", { className: "fas fa-times" })) : (React__default["default"].createElement("i", { className: "fas fa-bug" }))),
209
- React__default["default"].createElement("div", { className: cx__default["default"]('AMISDebug-content') },
210
- React__default["default"].createElement("div", { className: "AMISDebug-close", title: "Close", onClick: function () {
209
+ } }, store.isExpanded ? (_J$X_("i", { className: "fas fa-times" })) : (_J$X_("i", { className: "fas fa-bug" }))),
210
+ _J$X_("div", { className: cx__default["default"]('AMISDebug-content') },
211
+ _J$X_("div", { className: "AMISDebug-close", title: "Close", onClick: function () {
211
212
  store.isExpanded = false;
212
213
  store.activeId = '';
213
214
  store.hoverId = '';
214
215
  } },
215
- React__default["default"].createElement("i", { className: "fas fa-times" })),
216
- React__default["default"].createElement("div", { className: "AMISDebug-resize", onMouseDown: function (event) {
216
+ _J$X_("i", { className: "fas fa-times" })),
217
+ _J$X_("div", { className: "AMISDebug-resize", onMouseDown: function (event) {
217
218
  setStartX(event.clientX);
218
219
  setPanelWidth(parseInt(getComputedStyle(panelRef.current).getPropertyValue('width'), 10));
219
220
  setResizing(true);
220
221
  } }),
221
- React__default["default"].createElement("div", { className: "AMISDebug-tab" },
222
- React__default["default"].createElement("button", { className: cx__default["default"]({ active: store.tab === 'log' }), onClick: function () {
222
+ _J$X_("div", { className: "AMISDebug-tab" },
223
+ _J$X_("button", { className: cx__default["default"]({ active: store.tab === 'log' }), onClick: function () {
223
224
  store.tab = 'log';
224
225
  } }, "Log"),
225
- React__default["default"].createElement("button", { className: cx__default["default"]({ active: store.tab === 'inspect' }), onClick: function () {
226
+ _J$X_("button", { className: cx__default["default"]({ active: store.tab === 'inspect' }), onClick: function () {
226
227
  store.tab = 'inspect';
227
228
  } }, "Inspect")),
228
- React__default["default"].createElement("div", { className: "AMISDebug-changePosition" }, store.position === 'right' ? (React__default["default"].createElement("i", { className: "fas fa-chevron-left", title: "move to left", onClick: function () {
229
+ _J$X_("div", { className: "AMISDebug-changePosition" }, store.position === 'right' ? (_J$X_("i", { className: "fas fa-chevron-left", title: "move to left", onClick: function () {
229
230
  store.position = 'left';
230
- } })) : (React__default["default"].createElement("i", { className: "fas fa-chevron-right", title: "move to right", onClick: function () {
231
+ } })) : (_J$X_("i", { className: "fas fa-chevron-right", title: "move to right", onClick: function () {
231
232
  store.position = 'right';
232
233
  } }))),
233
- store.tab === 'log' ? (React__default["default"].createElement("div", { className: "AMISDebug-log" },
234
- React__default["default"].createElement("button", { onClick: function () {
234
+ store.tab === 'log' ? (_J$X_("div", { className: "AMISDebug-log" },
235
+ _J$X_("button", { onClick: function () {
235
236
  store.logs = [];
236
237
  } }, "Clear Log"),
237
- React__default["default"].createElement(LogView, { store: store }))) : null,
238
- store.tab === 'inspect' ? (React__default["default"].createElement("div", { className: "AMISDebug-inspect" }, activeId ? (React__default["default"].createElement(React__default["default"].Fragment, null,
239
- React__default["default"].createElement("h3", null,
238
+ _J$X_(LogView, { store: store }))) : null,
239
+ store.tab === 'inspect' ? (_J$X_("div", { className: "AMISDebug-inspect" }, activeId ? (_J$X_(React__default["default"].Fragment, null,
240
+ _J$X_("h3", null,
240
241
  "Component:",
241
242
  ' ',
242
- React__default["default"].createElement("span", { className: "primary" }, activeComponentInspect.name)),
243
+ _J$X_("span", { className: "primary" }, activeComponentInspect.name)),
243
244
  stackDataView)) : ('Click component to display inspect'))) : null)));
244
245
  });
245
246
  /**
@@ -264,7 +265,7 @@ function handleMouseclick(e) {
264
265
  }
265
266
  var dom = e.target;
266
267
  var target = dom.closest("[data-debug-id]");
267
- if (target) {
268
+ if (target && !target.closest('.AMISDebug')) {
268
269
  store.activeId = target.getAttribute('data-debug-id');
269
270
  store.tab = 'inspect';
270
271
  }
@@ -304,6 +305,7 @@ mobx.autorun(function () {
304
305
  });
305
306
  // 页面中只能有一个实例
306
307
  var isEnabled = false;
308
+ var unmount;
307
309
  function enableDebug() {
308
310
  if (isEnabled) {
309
311
  return;
@@ -311,13 +313,37 @@ function enableDebug() {
311
313
  isEnabled = true;
312
314
  var amisDebugElement = document.createElement('div');
313
315
  document.body.appendChild(amisDebugElement);
314
- var element = React__default["default"].createElement(AMISDebug, { store: store });
316
+ var element = _J$X_(AMISDebug, { store: store });
317
+ // if (parseInt(version.split('.')[0], 10) >= 18) {
318
+ // const root = createRoot(amisDebugElement);
319
+ // root.render(element);
320
+ // unmount = () => {
321
+ // root.unmount();
322
+ // document.body.removeChild(amisDebugElement);
323
+ // };
324
+ // } else {
315
325
  ReactDOM.render(element, amisDebugElement);
326
+ unmount = function () {
327
+ ReactDOM.unmountComponentAtNode(amisDebugElement);
328
+ document.body.removeChild(amisDebugElement);
329
+ };
330
+ // }
316
331
  document.body.appendChild(amisHoverBox);
317
332
  document.body.appendChild(amisActiveBox);
318
333
  document.addEventListener('mousemove', handleMouseMove);
319
334
  document.addEventListener('click', handleMouseclick);
320
335
  }
336
+ function disableDebug() {
337
+ if (!isEnabled) {
338
+ return;
339
+ }
340
+ isEnabled = false;
341
+ unmount === null || unmount === void 0 ? void 0 : unmount();
342
+ document.body.removeChild(amisHoverBox);
343
+ document.body.removeChild(amisActiveBox);
344
+ document.removeEventListener('mousemove', handleMouseMove);
345
+ document.removeEventListener('click', handleMouseclick);
346
+ }
321
347
  var DebugWrapper = /** @class */ (function (_super) {
322
348
  tslib.__extends(DebugWrapper, _super);
323
349
  function DebugWrapper() {
@@ -397,6 +423,8 @@ function warning(cat, msg, ext) {
397
423
  }
398
424
 
399
425
  exports.DebugWrapper = DebugWrapper;
426
+ exports.JsonView = JsonView;
400
427
  exports.debug = debug;
428
+ exports.disableDebug = disableDebug;
401
429
  exports.enableDebug = enableDebug;
402
430
  exports.warning = warning;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
package/lib/utils/dom.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -9,15 +9,17 @@ Object.defineProperty(exports, '__esModule', { value: true });
9
9
 
10
10
  var tslib = require('tslib');
11
11
  var ReactDOM = require('react-dom');
12
- var React = require('react');
12
+ require('react');
13
13
  var offset = require('./offset.js');
14
14
  var position = require('./position.js');
15
15
 
16
16
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
17
 
18
18
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
19
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
20
19
 
20
+ var __react_jsx__ = require('react');
21
+ var _J$X_ = (__react_jsx__["default"] || __react_jsx__).createElement;
22
+ (__react_jsx__["default"] || __react_jsx__).Fragment;
21
23
  function getContainer(container, defaultContainer) {
22
24
  container = typeof container === 'function' ? container() : container;
23
25
  return ReactDOM__default["default"].findDOMNode(container) || defaultContainer;
@@ -225,9 +227,9 @@ function renderTextByKeyword(rendererText, curKeyword) {
225
227
  if (curKeyword && ~rendererText.indexOf(curKeyword)) {
226
228
  var keywordStartIndex = rendererText.indexOf(curKeyword);
227
229
  var keywordEndIndex = keywordStartIndex + curKeyword.length;
228
- return (React__default["default"].createElement("span", null,
230
+ return (_J$X_("span", null,
229
231
  rendererText.substring(0, keywordStartIndex),
230
- React__default["default"].createElement("span", { className: "is-keyword" }, curKeyword),
232
+ _J$X_("span", { className: "is-keyword" }, curKeyword),
231
233
  rendererText.substring(keywordEndIndex)));
232
234
  }
233
235
  else {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.2.0
2
+ * amis-core v3.3.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5