efront 4.22.7 → 4.22.9

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.
@@ -6,14 +6,17 @@
6
6
  var body = document.body;
7
7
  var onbacks = [];
8
8
  var window_history = window.history || { length: 0, go() { }, back() { } };
9
- var window_history_length = window_history.length;
10
- var sessionSavedHashKey = "__zimoli_session_init_hash" + location.pathname;
11
- var sessionInitHash = sessionStorage.getItem(sessionSavedHashKey);
12
- var hostoryStorage = sessionStorage;
13
- var pagehash_reg = /#([\/\w\:@\.\_\(\)\+\-\*\$@!~_'\?,&~%]+)$/;
14
- var locationInitHash = location.hash;
15
- var isFirstTimeLoad = sessionInitHash === null;
16
- var isSimpleRefresh = sessionInitHash === locationInitHash;
9
+ var historyStorage = sessionStorage;
10
+ var getLocationHash = function () {
11
+ if ('hash' in location) return location.hash;
12
+ return location.href.replace(/^[^#]+/, '');
13
+ };
14
+ var setLocationHash = function (hash) {
15
+ preventNextHashChange = true;
16
+ if ('hash' in location) location.hash = hash;
17
+ else location.href = location.href.replace(/#[\s\S]*$/, '') + hash;
18
+ };
19
+ var locationInitHash = getLocationHash();
17
20
  var preventNextHashChange = false;
18
21
  window_history.scrollRestoration = 'manual';
19
22
  var popupHashlessPath = '/';
@@ -28,9 +31,8 @@ onhashchange(window, function (event) {
28
31
  if (preventNextHashChange) return preventNextHashChange = false;
29
32
  // 如果是返回事件,一定不是第一次改变hash
30
33
  // 这里刚好可以屏蔽首次手动改变url可能产生的hashchange事件
31
- var targetHash = location.hash;
32
- sessionStorage.setItem(sessionSavedHashKey, targetHash);
33
- if (pagehash_reg.test(targetHash)) {
34
+ var targetHash = getLocationHash();
35
+ if (targetHash) {
34
36
  var currentHash = getCurrentHash();
35
37
  if (currentHash && currentHash === targetHash) return;
36
38
  var targetpath = pathFromHash(targetHash);
@@ -70,7 +72,7 @@ function getReverseStyle(style) {
70
72
  }
71
73
  var getZimoliParams = function (pagepath) {
72
74
  try {
73
- return JSAM.parse(hostoryStorage.getItem(_zimoli_params_key + pagepath)) || {};
75
+ return JSAM.parse(historyStorage.getItem(_zimoli_params_key + pagepath)) || {};
74
76
  } catch (e) {
75
77
  console.warn(i18n`存储空间被破坏`);
76
78
  }
@@ -78,14 +80,19 @@ var getZimoliParams = function (pagepath) {
78
80
  };
79
81
  var setZimoliParams = function (pagepath, args) {
80
82
  try {
81
- var stringified_args = JSAM.stringify(args);
82
- if (stringified_args.length === 2) hostoryStorage.removeItem(_zimoli_params_key + pagepath);
83
- else hostoryStorage.setItem(_zimoli_params_key + pagepath, stringified_args);
83
+ if (!isHandled(args)) {
84
+ historyStorage.removeItem(_zimoli_params_key + pagepath);
85
+ }
86
+ else {
87
+ var stringified_args = JSAM.stringify(args);
88
+ if (stringified_args.length === 2) historyStorage.removeItem(_zimoli_params_key + pagepath);
89
+ else historyStorage.setItem(_zimoli_params_key + pagepath, stringified_args);
90
+ }
84
91
  } catch (e) {
85
92
  console.warn(i18n`写入存储空间失败!`, e);
86
93
  }
87
94
  };
88
- var fullfill_is_dispatched = 0;
95
+ var fullfill_is_dispatched = false;
89
96
  function go(pagepath, args, history_name, oldpagepath) {
90
97
  if (history_name === undefined)
91
98
  history_name = current_history;
@@ -192,7 +199,7 @@ function createState(pgpath) {
192
199
  var [pgpath] = getpgpath(pgpath);
193
200
  var _zimoli_state_key = _zimoli_state_prefix + pgpath;
194
201
  var state = function state(condition, setAsAdditional = condition !== null) {
195
- var state_string = hostoryStorage.getItem(_zimoli_state_key);
202
+ var state_string = historyStorage.getItem(_zimoli_state_key);
196
203
  var state_object;
197
204
  if (state_string) {
198
205
  try {
@@ -217,7 +224,7 @@ function createState(pgpath) {
217
224
  state_object = condition;
218
225
  }
219
226
  if (arguments.length) {
220
- hostoryStorage.setItem(_zimoli_state_key, JSAM.stringify(state_object) || null);
227
+ historyStorage.setItem(_zimoli_state_key, JSAM.stringify(state_object) || null);
221
228
  }
222
229
  return state_object;
223
230
  };
@@ -365,11 +372,14 @@ function create(pagepath, args, from, needroles) {
365
372
  if (!checkroles(user.roles, roles) || !checkroles(user.roles, needroles)) {
366
373
  // 检查权限
367
374
  if (!user.isLogin && user.loginPath) {
368
- return create(user.loginPath);
375
+ var pg = create(user.loginPath);
376
+ history[current_history].wardable = false;
377
+ return pg;
369
378
  }
370
379
  return alert(i18n`没有权限!`, 0);
371
380
  }
372
381
  if (!pg) return;
382
+ history[current_history].wardable = true;
373
383
  var _with_length = _with_elements.length;
374
384
  state.onback = function (handler) {
375
385
  _pageback_listener = handler;
@@ -406,9 +416,10 @@ function create(pagepath, args, from, needroles) {
406
416
  return _page;
407
417
 
408
418
  }
409
- var createEmptyHistory = function (emptyState) {
419
+ var createEmptyHistory = function (emptyState, allowForward = true) {
410
420
  var h = [emptyState];
411
421
  h.index = 0;
422
+ h.wardable = allowForward;
412
423
  return h;
413
424
  }
414
425
  var zimoliid = 0, zimoliad = 0;
@@ -418,19 +429,9 @@ function zimoli(pagepath, args, history_name, oldpagepath) {
418
429
  history_name = current_history;
419
430
  var _history = history[history_name] || createEmptyHistory('/main');
420
431
  root_path = _history[0];
421
- pagepath = location.hash;
422
- if (pagepath) {
423
- pagepath = pathFromHash(pagepath);
424
- if (pagepath === popupHashlessPath) {
425
- preventNextHashChange = true;
426
- window_history.go(-1);
427
- pagepath = pathFromHash(location.hash);
428
- }
429
- if (_history.index === 0) pagepath = '';
430
- }
431
- if (!pagepath) pagepath = _history[_history.index];
432
+ pagepath = _history[_history.index];
432
433
  try {
433
- var saveddata = JSAM.parse(hostoryStorage.getItem(_zimoli_params_key + pagepath)) || {};
434
+ var saveddata = JSAM.parse(historyStorage.getItem(_zimoli_params_key + pagepath)) || {};
434
435
  } catch (e) {
435
436
  var saveddata = {};
436
437
  }
@@ -451,13 +452,16 @@ function zimoli(pagepath, args, history_name, oldpagepath) {
451
452
  var global = {};
452
453
  var history = {};
453
454
  var current_history, default_history = current_history = "";
454
- history[current_history] = createEmptyHistory('/main');
455
+ history[current_history] = createEmptyHistory('/main', false);
455
456
  var history_session_object_key = `_zimoli_history_key:${location_pathname}`;
456
457
  try {
457
- history = JSAM.parse(hostoryStorage.getItem(history_session_object_key)) || history;
458
+ history = JSAM.parse(historyStorage.getItem(history_session_object_key)) || history;
458
459
  } catch (e) {
459
460
  }
460
461
  var root_path;
462
+ var savestate = function () {
463
+ historyStorage.setItem(history_session_object_key, JSAM.stringify(history) || null);
464
+ };
461
465
  var pushstate = function (path_name, history_name) {
462
466
  var isBack = false;
463
467
  if (history_name === undefined) {
@@ -468,7 +472,7 @@ var pushstate = function (path_name, history_name) {
468
472
  history[history_name] = createEmptyHistory(path_name);
469
473
  } else {
470
474
  var _history = history[history_name];
471
- var prevIndex = _history.index;
475
+ var index = _history.index;
472
476
  for (var cx = 0, dx = _history.index + 1; cx < dx; cx++) {
473
477
  if (_history[cx] === path_name) {
474
478
  _history.index = cx;
@@ -480,12 +484,12 @@ var pushstate = function (path_name, history_name) {
480
484
  _history.index++;
481
485
  }
482
486
  if (_history[_history.index] !== path_name) {
487
+ _history.lastIndex = index;
483
488
  _history.splice(_history.index, _history.length - _history.index);
484
489
  _history[_history.index] = path_name;
485
490
  }
486
- if (_history.index >= 0) fixurl(_history.index - prevIndex);
487
491
  }
488
- hostoryStorage.setItem(history_session_object_key, JSAM.stringify(history) || null);
492
+ savestate();
489
493
  return isBack;
490
494
  };
491
495
  var popstate = function (path_name, history_name) {
@@ -500,6 +504,7 @@ var popstate = function (path_name, history_name) {
500
504
  }
501
505
  }
502
506
  };
507
+
503
508
  var getCurrentHash = function () {
504
509
  var history_name = current_history.replace(/\/$/, '');
505
510
  if (rootElements.length) {
@@ -510,39 +515,48 @@ var getCurrentHash = function () {
510
515
  var targeturl = `#${history_name}${_historylist.length ? _historylist[_historylist.index] : ""}`;
511
516
  return encodeURI(targeturl);
512
517
  };
513
-
514
- var fixurl = function (historyDelta) {
515
- var hash = getCurrentHash();
516
- preventNextHashChange = true;
517
- if (pagehash_reg.test(hash)) {
518
- hash = location.href.replace(/\#[\s\S]*$/, '') + hash;
519
- if (!pagehash_reg.test(location.href)) location.href = hash;
520
- else if (location.href !== hash) {
521
- if (historyDelta) {
522
- window_history.go(historyDelta);
523
- if (location.href !== hash) {
524
- location.href = hash;
525
- }
526
- else {
527
- preventNextHashChange = false;
518
+ var fixurl = function () {
519
+ if (false === fullfill_is_dispatched) return;
520
+ var zimoli_hash = getCurrentHash();
521
+ var location_hash = getLocationHash();
522
+ if (location_hash === zimoli_hash) return;
523
+ var location_path = pathFromHash(location_hash);
524
+ if (location_path === popupHashlessPath) {
525
+ preventNextHashChange = true;
526
+ window_history.go(-1);
527
+ location_hash = getCurrentHash();
528
+ location_path = pathFromHash(location_hash);
529
+ };
530
+ if (zimoli_hash === location_hash) return;
531
+ var zimoli_path = pathFromHash(zimoli_hash);
532
+ if (zimoli_path === popupHashlessPath) return setLocationHash(zimoli_hash);
533
+ if (zimoli_hash) {
534
+ if (!location_hash) setLocationHash(zimoli_hash);
535
+ else {
536
+ var _history = history[current_history];
537
+ var b = _history.indexOf(location_path);
538
+ if (b >= 0) {
539
+ var c = _history.indexOf(zimoli_path);
540
+ if (c >= 0) {
541
+ var d = c - b;
542
+ preventNextHashChange = true;
543
+ window_history.go(d);
544
+ location_hash = getLocationHash();
528
545
  }
529
546
  }
530
- else if (location.href !== hash) {
531
- location.href = hash;
532
- }
533
- else {
534
- preventNextHashChange = false;
547
+ if (location_hash !== zimoli_hash) {
548
+ setLocationHash(zimoli_hash);
535
549
  }
536
550
  }
537
- else {
538
- preventNextHashChange = false;
539
- }
540
- }
541
- else if (pagehash_reg.test(location.hash)) {
542
- window_history.go(-1);
543
551
  }
544
- else {
545
- preventNextHashChange = false;
552
+ else if (location_path !== getInitPath()) {
553
+ var _history = history[current_history];
554
+ var i = _history.indexOf(location_path);
555
+ if (i === -1) i = _history.lastIndex;
556
+ if (i > 0) {
557
+ preventNextHashChange = true;
558
+ window_history.go(-i);
559
+ }
546
560
  }
547
561
  };
548
562
  var checkonback = function (elements) {
@@ -564,12 +578,14 @@ put(":empty", function () {
564
578
  });
565
579
  var forward = function (pgpath) {
566
580
  var hty = history[current_history];
581
+ if (hty[hty.index - 1] === pgpath) {
582
+ backward();
583
+ return;
584
+ }
585
+ if (!hty.wardable) return;
567
586
  if (hty[hty.index + 1] === pgpath) {
568
587
  go(1);
569
588
  }
570
- else if (hty[hty.index - 1] === pgpath) {
571
- backward();
572
- }
573
589
  else {
574
590
  go(pgpath);
575
591
  }
@@ -577,11 +593,12 @@ var forward = function (pgpath) {
577
593
  var backward = function () {
578
594
  if (rootElements.length) {
579
595
  var onback = checkonback(rootElements.slice(rootElements.length - 1));
580
- fixurl();
581
596
  if (onback === false) {
597
+ fixurl();
582
598
  return;
583
599
  }
584
600
  remove(rootElements.pop());
601
+ fixurl();
585
602
  return;
586
603
  }
587
604
  var onback = checkonback([
@@ -610,7 +627,10 @@ function setWithStyle(target, isDestroy) {
610
627
  }
611
628
 
612
629
  }
630
+ var fixLock = false;
613
631
  function addGlobal(element, name = null, isBack) {
632
+ var hasLock = !fixLock;
633
+ if (hasLock) fixLock = true;
614
634
  if (isString(name)) {
615
635
  if (global[name] === element) return;
616
636
  var oldElement = global[name];
@@ -648,6 +668,7 @@ function addGlobal(element, name = null, isBack) {
648
668
  }
649
669
  rootElements.push(element);
650
670
  }
671
+ if (hasLock) fixurl(), fixLock = false;
651
672
  }
652
673
  var _switch = zimoli.switch = function (history_name = default_history, target_body = document.body, emptyState) {
653
674
  if (!arguments.length) {
@@ -660,7 +681,18 @@ var _switch = zimoli.switch = function (history_name = default_history, target_b
660
681
  }
661
682
  if (target_body) body = target_body;
662
683
  }
663
- if (emptyState !== false && !history[current_history]) root_path = (history[current_history] = createEmptyHistory(emptyState))[0];
684
+ if (isHandled(emptyState) && emptyState !== false) {
685
+ if (isObject(emptyState)) {
686
+ var { path: pagepath, need, roles = need, data: args, id, options } = emptyState;
687
+ setZimoliParams(pagepath, { roles, data: args, id, options });
688
+ emptyState = pagepath;
689
+ }
690
+ if (!history[current_history]) root_path = (history[current_history] = createEmptyHistory(emptyState))[0];
691
+ else {
692
+ var _history = history[current_history];
693
+ if (_history.index === 0) root_path = _history[0] = emptyState;
694
+ }
695
+ }
664
696
  };
665
697
  popup.global = zimoli.global = addGlobal;
666
698
  popup.go = zimoli.go = go;
@@ -686,9 +718,9 @@ appendChild.transition = transition;
686
718
  remove.transition = transition;
687
719
  zimoli.prepare = prepare;
688
720
  zimoli.setStorage = function (storage) {
689
- hostoryStorage = storage;
721
+ historyStorage = storage;
690
722
  try {
691
- history = JSAM.parse(hostoryStorage.getItem(history_session_object_key)) || history;
723
+ history = JSAM.parse(historyStorage.getItem(history_session_object_key)) || history;
692
724
  } catch (e) {
693
725
  }
694
726
  };
@@ -701,15 +733,25 @@ zimoli.register = function (pathlike) {
701
733
  pathmaped[pathlike] = params;
702
734
  };
703
735
  zimoli.clearHistory = function () {
704
- hostoryStorage.removeItem(history_session_object_key);
736
+ historyStorage.removeItem(history_session_object_key);
705
737
  history = {};
706
738
  };
707
739
  zimoli.getCurrentHistory = function () {
708
- if (!history[current_history]) history[current_history] = createEmptyHistory();
709
- return history[current_history];
740
+ var h = history[current_history];
741
+ if (h) h = h.slice(0, h.index + 1);
742
+ else h = [];
743
+ return h;
710
744
  };
711
745
  zimoli.inithash = locationInitHash;
712
746
  zimoli.createState = createState;
747
+ // 赤匪最擅长的是移花接木。别人写好的文章,它改一下作者名,就成了它写的;别人种的粮食,它抢过来,说是别人贡献的。
748
+ // 赤匪在中国设置各种语言陷井,欺压民众,不让民众发声,还说这是民众对它的信任。
749
+ // 家中进了贼,我们是把家让给它,还是找机会把贼杀了。
750
+ var getInitPath = zimoli.getInitPath = function () {
751
+ var h = history[current_history];
752
+ if (h.length < 2) return pathFromHash(locationInitHash);
753
+ return h[0];
754
+ };
713
755
  var touchEnabled = false;
714
756
  zimoli.enableTouchBack = function () {
715
757
  if (touchEnabled) return;
@@ -781,6 +823,7 @@ zimoli.enableTouchBack = function () {
781
823
  remove(forwardTarget, false);
782
824
  transition(backwardTarget, 1);
783
825
  global[history_name] = backwardTarget;
826
+ fixurl();
784
827
  }
785
828
  else if (historyList.index < historyList.length - 1 && (deltaX < 0 && ratio < -.1 || deltaX > 0 && ratio < -.9 || deltaX === 0 && ratio < -.4)) {
786
829
  pushstate(historyList[historyList.index + 1], history_name);
@@ -789,6 +832,7 @@ zimoli.enableTouchBack = function () {
789
832
  remove(backwardTarget, false);
790
833
  transition(forwardTarget, 1);
791
834
  global[history_name] = forwardTarget;
835
+ fixurl();
792
836
  }
793
837
  else {
794
838
  if (backwardTarget) setWithStyle(backwardTarget, false), remove(backwardTarget);
@@ -1,5 +1,8 @@
1
+ # 紫茉莉
2
+ 默认不支持带hash打开页面,但您可以在主页面或您指定的初始化脚本中切换到hash指向的页面,这样可以让一些写在主文件中的配置项按序加载。
1
3
  ```javascript
2
4
  zimoli(pathname, params) // 跳转
5
+ zimoli.getInitPath()// 返回页面加载时的hash路径在当前历史中指向的路径
3
6
  zimoli.switch(historyName, targetElement, homePath) // 切换历史及目标挂载元素
4
7
  zimoli() // 切换历史后初始化
5
8
  zimoli.clearHistory() // 清空历史
@@ -264,10 +264,10 @@
264
264
  // 克什米尔: ["ks", "Kashmiri"],
265
265
  // 哈萨克语: ["kk", "Kazakh"],
266
266
  // 高棉语: ["km", "Khmer"],
267
- // Kikuyu公司: ["ki", "Kikuyu"],
267
+ // 基库尤: ["ki", "Kikuyu"],
268
268
  // "基尼亚卢旺达语(卢旺达)": ["rw", "Kinyarwanda (Rwanda)"],
269
269
  // 基隆迪语: ["rn", "Kirundi"],
270
- // Kyrgyz: ["ky", "Kyrgyz"],
270
+ // 吉尔吉斯斯坦: ["ky", "Kyrgyz"],
271
271
  // 科米牌手表: ["kv", "Komi"],
272
272
  // 孔戈: ["kg", "Kongo"],
273
273
  // 韩国人: ["ko", "Korean"],
@@ -372,34 +372,34 @@
372
372
  // 祖鲁语: ["zu", "Zulu"]
373
373
  // };
374
374
  var supports = [
375
- { name: i18n`中文`, id: "zh", lang: "zh-CN" },
376
- { name: i18n`繁体中文`, id: "cht", lang: "zh-TW" },
377
- { name: i18n`英语`, id: "en", lang: "en" },
375
+ { name: `汉语`/*中文简体*/, id: "zh", lang: "zh-CN" },
376
+ { name: `漢語`/*中文繁体*/, id: "cht", lang: "zh-TW" },
377
+ { name: `English`/*英文*/, id: "en", lang: "en" },
378
378
  // { name: i18n`文言文`, id: "wyw" },
379
379
  // { name: i18n`粤语`, id: "yue" },
380
- { name: i18n`日语`, id: "jp", lang: "ja" },
381
- { name: i18n`法语`, id: "fra", lang: 'fr' },
382
- { name: i18n`俄语`, id: "ru", lang: 'ru' },
383
- { name: i18n`韩语`, id: "kor", lang: "ko" },
384
- { name: i18n`德语`, id: "de", lang: "de" },
385
- { name: i18n`意大利语`, id: "it", lang: 'it' },
386
- { name: i18n`泰语`, id: "th", lang: "th" },
387
- { name: i18n`越南语`, id: "vie", lang: 'vi' },
388
- { name: i18n`阿拉伯语`, id: "ara", lang: "ar" },
389
- { name: i18n`荷兰语`, id: "nl", lang: "nl" },
390
- { name: i18n`芬兰语`, id: "fin", lang: "fi" },
391
- { name: i18n`希腊语`, id: "el", lang: "el" },
392
- { name: i18n`西班牙语`, id: "spa", lang: "es" },
393
- // { name: i18n`葡萄牙语`, id: "pt", lang: /pt\-(BR|PT)/ },
394
- { name: i18n`匈牙利语`, id: "hu", lang: 'hu' },
395
- { name: i18n`瑞典语`, id: "swe", lang: 'sv' },
396
- { name: i18n`丹麦语`, id: "dan", lang: 'da' },
397
- { name: i18n`捷克语`, id: "cs", lang: 'cs' },
398
- // { name: i18n`波兰语`, id: "pl" },
399
- { name: i18n`保加利亚语`, id: "bul", lang: "bg" },
400
- { name: i18n`爱沙尼亚语`, id: "est", lang: 'et' },
401
- { name: i18n`罗马尼亚语`, id: "rom", lang: 'ro' },
402
- { name: i18n`斯洛文尼亚语`, id: "slo", lang: 'sl' },
380
+ { name: `日本語`/*日语*/, id: "jp", lang: "ja" },
381
+ { name: `Français`/*法语*/, id: "fra", lang: 'fr' },
382
+ { name: `Русский язык`/*俄语*/, id: "ru", lang: 'ru' },
383
+ { name: `한국어`/*韩语*/, id: "kor", lang: "ko" },
384
+ { name: `Deutsch`/*德语*/, id: "de", lang: "de" },
385
+ { name: `Italiano`/*意大利语*/, id: "it", lang: 'it' },
386
+ { name: `ภาษาไทย`/*泰语*/, id: "th", lang: "th" },
387
+ { name: `Tiếng Việt`/*越南语*/, id: "vie", lang: 'vi' },
388
+ { name: `بالعربية`/*阿拉伯语*/, id: "ara", lang: "ar" },
389
+ { name: `Nederlands`/*荷兰语*/, id: "nl", lang: "nl" },
390
+ { name: `suomi`/*芬兰语*/, id: "fin", lang: "fi" },
391
+ { name: `Ελληνικά`/*希腊语*/, id: "el", lang: "el" },
392
+ { name: `Español`/*西班牙语*/, id: "spa", lang: "es" },
393
+ { name: `Português`/*葡萄牙语*/, id: "pt", lang: /pt\-(BR|PT)/ },
394
+ { name: `Húngaro`/*匈牙利语*/, id: "hu", lang: 'hu' },
395
+ { name: `Svenska`/*瑞典语*/, id: "swe", lang: 'sv' },
396
+ { name: `Dansk`/*丹麦语*/, id: "dan", lang: 'da' },
397
+ { name: `Čeština`/*捷克语*/, id: "cs", lang: 'cs' },
398
+ { name: `Polski`/*波兰语*/, id: "pl" },
399
+ { name: `Български`/*保加利亚语*/, id: "bul", lang: "bg" },
400
+ { name: `Eesti keel`/*爱沙尼亚语*/, id: "est", lang: 'et' },
401
+ { name: `Română`/*罗马尼亚语*/, id: "rom", lang: 'ro' },
402
+ { name: `slovenski jezik`/*斯洛文尼亚语*/, id: "slo", lang: 'sl' },
403
403
  ];
404
404
  supports.forEach(s => s.key = s.id);
405
405
  var getAllText = function (data, f) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "4.22.7",
3
+ "version": "4.22.9",
4
4
  "description": "一个开发环境,提供一种自由的前端开发模式,也可作为辅助工具使用。",
5
5
  "main": "public/efront.js",
6
6
  "directories": {