@byteluck-fe/model-driven-engine 2.9.0-beta.1 → 2.9.0-beta.3

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.
@@ -15,6 +15,10 @@ function _non_iterable_spread() {
15
15
  function _to_consumable_array(arr) {
16
16
  return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
17
17
  }
18
+ function _type_of(obj) {
19
+ "@swc/helpers - typeof";
20
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
21
+ }
18
22
  function _unsupported_iterable_to_array(o, minLen) {
19
23
  if (!o) return;
20
24
  if (typeof o === "string") return _array_like_to_array(o, minLen);
@@ -24,21 +28,21 @@ function _unsupported_iterable_to_array(o, minLen) {
24
28
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
25
29
  }
26
30
  var cc = console;
27
- import { error, logerror, JSONCopy } from "@byteluck-fe/model-driven-shared";
31
+ import { error, logerror, JSONCopy } from '@byteluck-fe/model-driven-shared';
28
32
  var proxyArrayApi = [
29
- "splice",
30
- "push",
31
- "shift",
32
- "pop",
33
- "unshift",
34
- "reverse"
33
+ 'splice',
34
+ 'push',
35
+ 'shift',
36
+ 'pop',
37
+ 'unshift',
38
+ 'reverse'
35
39
  ];
36
- export var engineProxyFlag = Symbol("__engineProxy__");
37
- export var engineTargetKey = Symbol("__engineTarget__");
38
- export var engineArrayBeforeSetCallbackFlag = Symbol("__engineArrayBeforeSetCallbackFlag__");
39
- export var engineProxyThisKey = Symbol("__engineProxyThisKey__");
40
+ export var engineProxyFlag = Symbol('__engineProxy__');
41
+ export var engineTargetKey = Symbol('__engineTarget__');
42
+ export var engineArrayBeforeSetCallbackFlag = Symbol('__engineArrayBeforeSetCallbackFlag__');
43
+ export var engineProxyThisKey = Symbol('__engineProxyThisKey__');
40
44
  var currentHandlerState = {
41
- type: "",
45
+ type: '',
42
46
  args: [],
43
47
  callback: emptyFn
44
48
  };
@@ -55,16 +59,16 @@ function ArrayHandler(target, propertyKey, value, thisKey, callback) {
55
59
  // 操作下标
56
60
  // Number(propertyKey) > target.length 说明当前操作的下标已经超过了安全范围(数组的运行长度,比如[1,2,3],它的长度为3,可操作的下标为0,1,2,3,如果操作4将会产生一个empty index)
57
61
  if (index > target.length) {
58
- error("Wrong array operations may cause unknown errors. It is recommended to use APIs such as ".concat(proxyArrayApi.join(","), " for array operations"));
62
+ error("Wrong array operations may cause unknown errors. It is recommended to use APIs such as ".concat(proxyArrayApi.join(','), " for array operations"));
59
63
  return;
60
64
  }
61
65
  // 不是操作下标,而是直接操作length或者自定义属性等
62
66
  var isNotHandlerIndex = Number.isNaN(index);
63
- if (isNotHandlerIndex && propertyKey !== "length") {
67
+ if (isNotHandlerIndex && propertyKey !== 'length') {
64
68
  return;
65
69
  }
66
70
  // 直接操作length
67
- if (propertyKey === "length") {
71
+ if (propertyKey === 'length') {
68
72
  var newLength = value;
69
73
  var oldLength = target.length;
70
74
  if (newLength > target.length) {
@@ -76,7 +80,7 @@ function ArrayHandler(target, propertyKey, value, thisKey, callback) {
76
80
  }
77
81
  // 通过操作length删除旧的行
78
82
  return function() {
79
- return callback.call(null, target, thisKey, "splice", [
83
+ return callback.call(null, target, thisKey, 'splice', [
80
84
  newLength,
81
85
  oldLength - newLength
82
86
  ]);
@@ -86,13 +90,13 @@ function ArrayHandler(target, propertyKey, value, thisKey, callback) {
86
90
  // 正常操作
87
91
  if (index === target.length) {
88
92
  return function() {
89
- return callback.call(null, target, thisKey, "push", [
93
+ return callback.call(null, target, thisKey, 'push', [
90
94
  value
91
95
  ]);
92
96
  };
93
97
  } else {
94
98
  return function() {
95
- return callback.call(null, target, thisKey, "splice", [
99
+ return callback.call(null, target, thisKey, 'splice', [
96
100
  index,
97
101
  1,
98
102
  value
@@ -128,9 +132,9 @@ function ArrayHandler(target, propertyKey, value, thisKey, callback) {
128
132
  var newValue = JSONCopy(value);
129
133
  // @ts-ignore
130
134
  var oldValue = target[propertyKey];
131
- var concatKey = thisKey === "" ? propertyKey : thisKey + "." + propertyKey;
135
+ var concatKey = thisKey === '' ? propertyKey : thisKey + '.' + propertyKey;
132
136
  function reProxyState(value) {
133
- if (typeof value === "object" && value !== null) {
137
+ if ((typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && value !== null) {
134
138
  // @ts-ignore
135
139
  if (value[engineProxyFlag] !== true) {
136
140
  return proxyState(value, callback, beforeSetCallback, concatKey);
@@ -186,15 +190,15 @@ function ArrayHandler(target, propertyKey, value, thisKey, callback) {
186
190
  * @param beforeSetCallback
187
191
  * @param prevKey 递归对象的key
188
192
  * */ export function proxyState(state, callback, beforeSetCallback) {
189
- var prevKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "";
193
+ var prevKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : '';
190
194
  // 冻结的对象不需要再执行proxy,否则会报错
191
195
  if (Object.isFrozen(state)) {
192
196
  return state;
193
197
  }
194
198
  for(var key in state){
195
- var concatKey = prevKey === "" ? key : prevKey + "." + key;
199
+ var concatKey = prevKey === '' ? key : prevKey + '.' + key;
196
200
  var obj = state[key];
197
- if (typeof obj === "object" && obj !== null) {
201
+ if ((typeof obj === "undefined" ? "undefined" : _type_of(obj)) === 'object' && obj !== null) {
198
202
  // @ts-ignore
199
203
  state[key] = proxyState(obj, callback, beforeSetCallback, concatKey);
200
204
  }
@@ -205,7 +209,7 @@ function flatInstanceForChildren(controls) {
205
209
  var result = [];
206
210
  controls.forEach(function(item) {
207
211
  result.push(item);
208
- if (item.controlType === "layout" || item.controlType === "wrap") {
212
+ if (item.controlType === 'layout' || item.controlType === 'wrap') {
209
213
  var _result;
210
214
  (_result = result).push.apply(_result, _to_consumable_array(flatInstanceForChildren(item.children)));
211
215
  }
@@ -217,11 +221,11 @@ function flatInstanceForChildren(controls) {
217
221
  * @param flatInstance 拍平的instance数组
218
222
  * @param key 操作的数据在state的key - 可以是深层次的 subtable.0.input等
219
223
  * */ export function findItem(key, engine) {
220
- if (key === "") return {
224
+ if (key === '') return {
221
225
  instance: undefined,
222
226
  rowIndex: undefined
223
227
  };
224
- var keys = key.split(".");
228
+ var keys = key.split('.');
225
229
  if (keys.length === 0) return {
226
230
  instance: undefined,
227
231
  rowIndex: undefined
@@ -246,22 +250,22 @@ function flatInstanceForChildren(controls) {
246
250
  }
247
251
  function getArrayNewValue(type, args) {
248
252
  if ([
249
- "push",
250
- "unshift"
253
+ 'push',
254
+ 'unshift'
251
255
  ].includes(type)) {
252
256
  return args;
253
- } else if (type === "splice") {
257
+ } else if (type === 'splice') {
254
258
  return args.slice(2);
255
259
  }
256
260
  return [];
257
261
  }
258
262
  function getArrayNewArgs(type, args, value) {
259
263
  if ([
260
- "push",
261
- "unshift"
264
+ 'push',
265
+ 'unshift'
262
266
  ].includes(type)) {
263
267
  return value;
264
- } else if (type === "splice") {
268
+ } else if (type === 'splice') {
265
269
  return args.slice(0, 2).concat(value);
266
270
  }
267
271
  }
@@ -296,8 +300,8 @@ function getArrayNewArgs(type, args, value) {
296
300
  // @ts-ignore
297
301
  result = oldApiHandler.apply(this, args);
298
302
  }
299
- typeof currentHandlerState.callback === "function" && currentHandlerState.callback(key, args, result);
300
- currentHandlerState.type = "";
303
+ typeof currentHandlerState.callback === 'function' && currentHandlerState.callback(key, args, result);
304
+ currentHandlerState.type = '';
301
305
  currentHandlerState.args = [];
302
306
  currentHandlerState.callback = emptyFn;
303
307
  return result;
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./common";
2
- export * from "./plugins";
3
- export * from "./utils";
1
+ export * from './common';
2
+ export * from './plugins';
3
+ export * from './utils';
@@ -47,6 +47,10 @@ function _non_iterable_spread() {
47
47
  function _to_consumable_array(arr) {
48
48
  return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
49
49
  }
50
+ function _type_of(obj) {
51
+ "@swc/helpers - typeof";
52
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
53
+ }
50
54
  function _unsupported_iterable_to_array(o, minLen) {
51
55
  if (!o) return;
52
56
  if (typeof o === "string") return _array_like_to_array(o, minLen);
@@ -55,17 +59,17 @@ function _unsupported_iterable_to_array(o, minLen) {
55
59
  if (n === "Map" || n === "Set") return Array.from(n);
56
60
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
57
61
  }
58
- import { CONTROL_TYPE, CALC_TOKEN_TYPE, CALC_AGGREGATE_TYPE } from "@byteluck-fe/model-driven-shared";
59
- import { format } from "mathjs";
60
- var DisplayType;
61
- (function(DisplayType) {
62
+ import { CONTROL_TYPE, CALC_TOKEN_TYPE, CALC_AGGREGATE_TYPE } from '@byteluck-fe/model-driven-shared';
63
+ import { format } from 'mathjs';
64
+ var DisplayType = /*#__PURE__*/ function(DisplayType) {
62
65
  /**
63
66
  * 完全等于
64
67
  */ DisplayType["EQ"] = "EQ";
65
68
  /**
66
69
  * 包含
67
70
  * */ DisplayType["IN"] = "IN";
68
- })(DisplayType || (DisplayType = {}));
71
+ return DisplayType;
72
+ }(DisplayType || {});
69
73
  export var CalcPlugin = /*#__PURE__*/ function() {
70
74
  "use strict";
71
75
  function CalcPlugin(options) {
@@ -170,7 +174,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
170
174
  this.watchControlChange();
171
175
  this.watchSubtableChange();
172
176
  this.watchSchemaHideChange();
173
- this.engine.on("engine-mounted", function() {
177
+ this.engine.on('engine-mounted', function() {
174
178
  requestAnimationFrame(function() {
175
179
  _this.resetDependencies();
176
180
  _this.allCalcControlComputed();
@@ -274,8 +278,8 @@ export var CalcPlugin = /*#__PURE__*/ function() {
274
278
  * @description 监听控件的显隐事件,把显隐会影响的控件触发一遍计算
275
279
  * */ function watchSchemaHideChange() {
276
280
  var _this = this;
277
- this.engine.on("schema-change", function(payload) {
278
- if (payload.props === "isHide") {
281
+ this.engine.on('schema-change', function(payload) {
282
+ if (payload.props === 'isHide') {
279
283
  var _this_dependenciesTriggerMap_get;
280
284
  var calcControls = (_this_dependenciesTriggerMap_get = _this.dependenciesTriggerMap.get(payload.instance.id)) !== null && _this_dependenciesTriggerMap_get !== void 0 ? _this_dependenciesTriggerMap_get : [];
281
285
  calcControls.forEach(function(calc) {
@@ -291,7 +295,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
291
295
  * @description 监听明细子表的change事件,把明细表会影响的控件触发一遍计算
292
296
  * */ function watchSubtableChange() {
293
297
  var _this = this;
294
- this.engine.on("list-change", function(payload) {
298
+ this.engine.on('list-change', function(payload) {
295
299
  var _payload_options;
296
300
  // 初始化前是批量操作。不做处理
297
301
  if (_this.engine.isMounted === false) return;
@@ -319,7 +323,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
319
323
  * @description 监听控件的change事件,当控件change的时候,取到控件会影响的计算公式,然后执行对应的计算
320
324
  * */ function watchControlChange() {
321
325
  var _this = this;
322
- this.engine.on("change", function(payload) {
326
+ this.engine.on('change', function(payload) {
323
327
  // 初始化前是批量操作。不做处理
324
328
  if (_this.engine.isMounted === false) return;
325
329
  var instance = payload.instance;
@@ -416,7 +420,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
416
420
  result += 0;
417
421
  }
418
422
  return result;
419
- }, "");
423
+ }, '');
420
424
  var value;
421
425
  // 有缓存的话取缓存,没有缓存再执行eval
422
426
  if (this.cacheComputedResult[scriptText] !== undefined) {
@@ -437,7 +441,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
437
441
  }
438
442
  }
439
443
  var oldValue = this.engine.getState(control.id, rowIndex);
440
- var result = !value || value === Infinity || value === -Infinity ? 0 : control.props.precision === "" ? value : Number(value.toFixed(control.props.precision));
444
+ var result = !value || value === Infinity || value === -Infinity ? 0 : control.props.precision === '' ? value : Number(value.toFixed(control.props.precision));
441
445
  // 如果值没变的话,不触发修改
442
446
  if (result === (oldValue === null || oldValue === void 0 ? void 0 : oldValue.result)) {
443
447
  return;
@@ -445,7 +449,7 @@ export var CalcPlugin = /*#__PURE__*/ function() {
445
449
  var _oldValue_unit;
446
450
  this.engine.setState(control.id, {
447
451
  result: result,
448
- unit: (_oldValue_unit = oldValue === null || oldValue === void 0 ? void 0 : oldValue.unit) !== null && _oldValue_unit !== void 0 ? _oldValue_unit : ""
452
+ unit: (_oldValue_unit = oldValue === null || oldValue === void 0 ? void 0 : oldValue.unit) !== null && _oldValue_unit !== void 0 ? _oldValue_unit : ''
449
453
  }, rowIndex);
450
454
  }
451
455
  },
@@ -454,14 +458,14 @@ export var CalcPlugin = /*#__PURE__*/ function() {
454
458
  value: /**
455
459
  * @description 获取数字值,因为计算公式可以依赖计算公式和金额,所以需要从value中取到对应的值
456
460
  * */ function getNumberValue(value) {
457
- if (typeof value === "object" && value) {
458
- if ("result" in value) {
461
+ if ((typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && value) {
462
+ if ('result' in value) {
459
463
  return value.result;
460
- } else if ("amount" in value) {
464
+ } else if ('amount' in value) {
461
465
  return value.amount;
462
466
  }
463
467
  }
464
- if (typeof value === "number") {
468
+ if (typeof value === 'number') {
465
469
  return value;
466
470
  }
467
471
  return 0;
@@ -154,7 +154,7 @@ function _ts_generator(thisArg, body) {
154
154
  };
155
155
  }
156
156
  }
157
- import { EventLogic } from "@byteluck-fe/model-driven-shared";
157
+ import { EventLogic } from '@byteluck-fe/model-driven-shared';
158
158
  // type EventKeyMap = {
159
159
  // [eventKey in EventKeys]?: string
160
160
  // }
@@ -207,13 +207,13 @@ export var ControlsEventPlugin = /*#__PURE__*/ function() {
207
207
  key: "engineAddEventListener",
208
208
  value: function engineAddEventListener(eventKey, controlEventKey) {
209
209
  var _this = this;
210
- this.engine.on(eventKey, function() {
210
+ this.engine.on(eventKey, /*#__PURE__*/ function() {
211
211
  var _ref = _async_to_generator(function(payload) {
212
212
  return _ts_generator(this, function(_state) {
213
213
  switch(_state.label){
214
214
  case 0:
215
215
  // 初始化state的时候不触发change事件,必须在engine mounted以后才触发
216
- if ((eventKey === "change" || eventKey === "list-change") && !_this.engine.isMounted) {
216
+ if ((eventKey === 'change' || eventKey === 'list-change') && !_this.engine.isMounted) {
217
217
  return [
218
218
  2
219
219
  ];
@@ -262,7 +262,7 @@ export var ControlsEventPlugin = /*#__PURE__*/ function() {
262
262
  }
263
263
  return [
264
264
  4,
265
- Promise.all(events[name].map(function() {
265
+ Promise.all(events[name].map(/*#__PURE__*/ function() {
266
266
  var _ref = _async_to_generator(function(eventName) {
267
267
  var execResult;
268
268
  return _ts_generator(this, function(_state) {
@@ -76,7 +76,7 @@ function _unsupported_iterable_to_array(o, minLen) {
76
76
  if (n === "Map" || n === "Set") return Array.from(n);
77
77
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
78
78
  }
79
- import { error } from "@byteluck-fe/model-driven-shared";
79
+ import { error } from '@byteluck-fe/model-driven-shared';
80
80
  export var ES6ModulePlugin = /*#__PURE__*/ function() {
81
81
  "use strict";
82
82
  function ES6ModulePlugin(config, env, eventJs) {
@@ -170,11 +170,11 @@ export function parseModule(action, engine, env) {
170
170
  }
171
171
  };
172
172
  try {
173
- new Function("module", "exports", compiled).call(module, module, module.exports);
173
+ new Function('module', 'exports', compiled).call(module, module, module.exports);
174
174
  } catch (e) {
175
- error(e.message + ". fail to parse the module");
176
- if (process.env.NODE_ENV !== "production") {
177
- error("fail to parse the module");
175
+ error(e.message + '. fail to parse the module');
176
+ if (process.env.NODE_ENV !== 'production') {
177
+ error('fail to parse the module');
178
178
  }
179
179
  }
180
180
  var funcMap = {};
@@ -183,7 +183,7 @@ export function parseModule(action, engine, env) {
183
183
  try {
184
184
  for(var _iterator = Object.entries(module.exports)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
185
185
  var _step_value = _sliced_to_array(_step.value, 2), key = _step_value[0], value = _step_value[1];
186
- if (typeof value === "function") {
186
+ if (typeof value === 'function') {
187
187
  funcMap[key] = value;
188
188
  } else {
189
189
  variables[key] = value;
@@ -201,11 +201,11 @@ function _ts_generator(thisArg, body) {
201
201
  }
202
202
  }
203
203
  var LifecycleEventKeyMap = {
204
- "engine-initialized": "did_init",
205
- "engine-mounted": "did_mount",
206
- "engine-submit": "will_submit",
207
- "engine-submit-params": "do_submit",
208
- "engine-submitted": "did_submit"
204
+ 'engine-initialized': 'did_init',
205
+ 'engine-mounted': 'did_mount',
206
+ 'engine-submit': 'will_submit',
207
+ 'engine-submit-params': 'do_submit',
208
+ 'engine-submitted': 'did_submit'
209
209
  };
210
210
  export var LifecycleEventPlugin = /*#__PURE__*/ function() {
211
211
  "use strict";
@@ -224,7 +224,7 @@ export var LifecycleEventPlugin = /*#__PURE__*/ function() {
224
224
  Object.entries(LifecycleEventKeyMap).forEach(function(param) {
225
225
  var _param = _sliced_to_array(param, 2), engineKey = _param[0], lifecycleKey = _param[1];
226
226
  var _this1 = _this;
227
- engine.on(engineKey, function() {
227
+ engine.on(engineKey, /*#__PURE__*/ function() {
228
228
  var _ref = _async_to_generator(function(payload) {
229
229
  var result;
230
230
  return _ts_generator(this, function(_state) {
@@ -278,7 +278,7 @@ export var LifecycleEventPlugin = /*#__PURE__*/ function() {
278
278
  }
279
279
  return [
280
280
  4,
281
- Promise.all(events[name].map(function() {
281
+ Promise.all(events[name].map(/*#__PURE__*/ function() {
282
282
  var _ref = _async_to_generator(function(eventName) {
283
283
  var execResult;
284
284
  return _ts_generator(this, function(_state) {
@@ -51,12 +51,12 @@ export var StylePlugin = /*#__PURE__*/ function() {
51
51
  var _this_config;
52
52
  this.engine = engine;
53
53
  var _this_config_source;
54
- var compiledStyle = (_this_config_source = (_this_config = this.config) === null || _this_config === void 0 ? void 0 : _this_config.source) !== null && _this_config_source !== void 0 ? _this_config_source : "";
55
- var style = document.createElement("style");
56
- style.className = "edit-css";
57
- style.type = "text/css";
54
+ var compiledStyle = (_this_config_source = (_this_config = this.config) === null || _this_config === void 0 ? void 0 : _this_config.source) !== null && _this_config_source !== void 0 ? _this_config_source : '';
55
+ var style = document.createElement('style');
56
+ style.className = 'edit-css';
57
+ style.type = 'text/css';
58
58
  style.innerHTML = compiledStyle;
59
- var dom = document.querySelector("head");
59
+ var dom = document.querySelector('head');
60
60
  dom.appendChild(style);
61
61
  }
62
62
  }
@@ -1,5 +1,5 @@
1
- export * from "./ES6ModulePlugin";
2
- export * from "./LifecycleEventPlugin";
3
- export * from "./ControlsEventPlugin";
4
- export * from "./CalcPlugin";
5
- export * from "./StylePlugin";
1
+ export * from './ES6ModulePlugin';
2
+ export * from './LifecycleEventPlugin';
3
+ export * from './ControlsEventPlugin';
4
+ export * from './CalcPlugin';
5
+ export * from './StylePlugin';
@@ -1 +1 @@
1
- export * from "./runtimeUtils";
1
+ export * from './runtimeUtils';
@@ -1,4 +1,4 @@
1
- import { CONTROL_BASE_TYPE, CONTROL_TYPE } from "@byteluck-fe/model-driven-shared";
1
+ import { CONTROL_BASE_TYPE, CONTROL_TYPE } from '@byteluck-fe/model-driven-shared';
2
2
  export function hasChildrenControl(instance) {
3
3
  return instance.controlType === CONTROL_BASE_TYPE.LAYOUT || instance.controlType === CONTROL_BASE_TYPE.WRAP || instance.controlType === CONTROL_BASE_TYPE.LIST || instance.controlType === CONTROL_BASE_TYPE.SEARCH || instance.controlType === CONTROL_BASE_TYPE.COLUMN && instance.type !== CONTROL_TYPE.OPERATION_COLUMN;
4
4
  }
@@ -36,9 +36,9 @@ callback) {
36
36
  var unique = 0;
37
37
  // uuid生成
38
38
  export function buildUUID() {
39
- var prefix = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
39
+ var prefix = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : '';
40
40
  var time = Date.now();
41
41
  var random = Math.floor(Math.random() * 1000000000);
42
42
  unique++;
43
- return prefix + "_" + random + unique + String(time);
43
+ return prefix + '_' + random + unique + String(time);
44
44
  }