@lvce-editor/about-view 7.0.0 → 7.1.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.
@@ -182,8 +182,8 @@ const getModuleNotFoundError = stderr => {
182
182
  const messageIndex = lines.findIndex(isModuleNotFoundMessage);
183
183
  const message = lines[messageIndex];
184
184
  return {
185
- message,
186
- code: ERR_MODULE_NOT_FOUND
185
+ code: ERR_MODULE_NOT_FOUND,
186
+ message
187
187
  };
188
188
  };
189
189
  const isModuleNotFoundError = stderr => {
@@ -206,14 +206,14 @@ const isUnhelpfulNativeModuleError = stderr => {
206
206
  const getNativeModuleErrorMessage = stderr => {
207
207
  const message = getMessageCodeBlock(stderr);
208
208
  return {
209
- message: `Incompatible native node module: ${message}`,
210
- code: E_INCOMPATIBLE_NATIVE_MODULE
209
+ code: E_INCOMPATIBLE_NATIVE_MODULE,
210
+ message: `Incompatible native node module: ${message}`
211
211
  };
212
212
  };
213
213
  const getModuleSyntaxError = () => {
214
214
  return {
215
- message: `ES Modules are not supported in electron`,
216
- code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
215
+ code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON,
216
+ message: `ES Modules are not supported in electron`
217
217
  };
218
218
  };
219
219
  const getHelpfulChildProcessError = (stdout, stderr) => {
@@ -232,8 +232,8 @@ const getHelpfulChildProcessError = (stdout, stderr) => {
232
232
  rest
233
233
  } = getDetails(lines);
234
234
  return {
235
- message: actualMessage,
236
235
  code: '',
236
+ message: actualMessage,
237
237
  stack: rest
238
238
  };
239
239
  };
@@ -243,8 +243,8 @@ class IpcError extends VError {
243
243
  if (stdout || stderr) {
244
244
  // @ts-ignore
245
245
  const {
246
- message,
247
246
  code,
247
+ message,
248
248
  stack
249
249
  } = getHelpfulChildProcessError(stdout, stderr);
250
250
  const cause = new Error(message);
@@ -305,8 +305,8 @@ const wrap$f = global => {
305
305
  };
306
306
  const waitForFirstMessage = async port => {
307
307
  const {
308
- resolve,
309
- promise
308
+ promise,
309
+ resolve
310
310
  } = Promise.withResolvers();
311
311
  port.addEventListener('message', resolve, {
312
312
  once: true
@@ -326,8 +326,8 @@ const listen$6 = async () => {
326
326
  const type = firstMessage.params[0];
327
327
  if (type === 'message-port') {
328
328
  parentIpc.send({
329
- jsonrpc: '2.0',
330
329
  id: firstMessage.id,
330
+ jsonrpc: '2.0',
331
331
  result: null
332
332
  });
333
333
  parentIpc.dispose();
@@ -369,56 +369,14 @@ const IpcChildWithModuleWorkerAndMessagePort$1 = {
369
369
  wrap: wrap$e
370
370
  };
371
371
 
372
- const Two = '2.0';
373
- const create$4 = (method, params) => {
374
- return {
375
- jsonrpc: Two,
376
- method,
377
- params
378
- };
379
- };
372
+ const Two$1 = '2.0';
380
373
  const callbacks = Object.create(null);
381
- const set$3 = (id, fn) => {
382
- callbacks[id] = fn;
383
- };
384
374
  const get$2 = id => {
385
375
  return callbacks[id];
386
376
  };
387
377
  const remove = id => {
388
378
  delete callbacks[id];
389
379
  };
390
- let id = 0;
391
- const create$3$1 = () => {
392
- return ++id;
393
- };
394
- const registerPromise = () => {
395
- const id = create$3$1();
396
- const {
397
- resolve,
398
- promise
399
- } = Promise.withResolvers();
400
- set$3(id, resolve);
401
- return {
402
- id,
403
- promise
404
- };
405
- };
406
- const create$2$1 = (method, params) => {
407
- const {
408
- id,
409
- promise
410
- } = registerPromise();
411
- const message = {
412
- jsonrpc: Two,
413
- method,
414
- params,
415
- id
416
- };
417
- return {
418
- message,
419
- promise
420
- };
421
- };
422
380
  class JsonRpcError extends Error {
423
381
  constructor(message) {
424
382
  super(message);
@@ -612,9 +570,9 @@ const getErrorProperty = (error, prettyError) => {
612
570
  }
613
571
  };
614
572
  };
615
- const create$1$1 = (id, error) => {
573
+ const create$1$2 = (id, error) => {
616
574
  return {
617
- jsonrpc: Two,
575
+ jsonrpc: Two$1,
618
576
  id,
619
577
  error
620
578
  };
@@ -623,22 +581,22 @@ const getErrorResponse = (id, error, preparePrettyError, logError) => {
623
581
  const prettyError = preparePrettyError(error);
624
582
  logError(error, prettyError);
625
583
  const errorProperty = getErrorProperty(error, prettyError);
626
- return create$1$1(id, errorProperty);
584
+ return create$1$2(id, errorProperty);
627
585
  };
628
- const create$5 = (message, result) => {
586
+ const create$3 = (message, result) => {
629
587
  return {
630
- jsonrpc: Two,
588
+ jsonrpc: Two$1,
631
589
  id: message.id,
632
590
  result: result ?? null
633
591
  };
634
592
  };
635
593
  const getSuccessResponse = (message, result) => {
636
594
  const resultProperty = result ?? null;
637
- return create$5(message, resultProperty);
595
+ return create$3(message, resultProperty);
638
596
  };
639
597
  const getErrorResponseSimple = (id, error) => {
640
598
  return {
641
- jsonrpc: Two,
599
+ jsonrpc: Two$1,
642
600
  id,
643
601
  error: {
644
602
  code: Custom,
@@ -725,29 +683,6 @@ const handleJsonRpcMessage = async (...args) => {
725
683
  }
726
684
  throw new JsonRpcError('unexpected message');
727
685
  };
728
- const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
729
- const {
730
- message,
731
- promise
732
- } = create$2$1(method, params);
733
- if (useSendAndTransfer && ipc.sendAndTransfer) {
734
- ipc.sendAndTransfer(message);
735
- } else {
736
- ipc.send(message);
737
- }
738
- const responseMessage = await promise;
739
- return unwrapJsonRpcResult(responseMessage);
740
- };
741
- const send = (transport, method, ...params) => {
742
- const message = create$4(method, params);
743
- transport.send(message);
744
- };
745
- const invoke$1 = (ipc, method, ...params) => {
746
- return invokeHelper(ipc, method, params, false);
747
- };
748
- const invokeAndTransfer = (ipc, method, ...params) => {
749
- return invokeHelper(ipc, method, params, true);
750
- };
751
686
 
752
687
  class CommandNotFoundError extends Error {
753
688
  constructor(command) {
@@ -770,24 +705,87 @@ const execute = (command, ...args) => {
770
705
  return fn(...args);
771
706
  };
772
707
 
708
+ const Two = '2.0';
709
+ const create$o = (method, params) => {
710
+ return {
711
+ jsonrpc: Two,
712
+ method,
713
+ params
714
+ };
715
+ };
716
+ const create$n = (id, method, params) => {
717
+ const message = {
718
+ id,
719
+ jsonrpc: Two,
720
+ method,
721
+ params
722
+ };
723
+ return message;
724
+ };
725
+ let id = 0;
726
+ const create$m = () => {
727
+ return ++id;
728
+ };
729
+
730
+ /* eslint-disable n/no-unsupported-features/es-syntax */
731
+
732
+ const registerPromise = map => {
733
+ const id = create$m();
734
+ const {
735
+ promise,
736
+ resolve
737
+ } = Promise.withResolvers();
738
+ map[id] = resolve;
739
+ return {
740
+ id,
741
+ promise
742
+ };
743
+ };
744
+
745
+ // @ts-ignore
746
+ const invokeHelper = async (callbacks, ipc, method, params, useSendAndTransfer) => {
747
+ const {
748
+ id,
749
+ promise
750
+ } = registerPromise(callbacks);
751
+ const message = create$n(id, method, params);
752
+ if (useSendAndTransfer && ipc.sendAndTransfer) {
753
+ ipc.sendAndTransfer(message);
754
+ } else {
755
+ ipc.send(message);
756
+ }
757
+ const responseMessage = await promise;
758
+ return unwrapJsonRpcResult(responseMessage);
759
+ };
773
760
  const createRpc = ipc => {
761
+ const callbacks = Object.create(null);
762
+ ipc._resolve = (id, response) => {
763
+ const fn = callbacks[id];
764
+ if (!fn) {
765
+ console.warn(`callback ${id} may already be disposed`);
766
+ return;
767
+ }
768
+ fn(response);
769
+ delete callbacks[id];
770
+ };
774
771
  const rpc = {
772
+ async dispose() {
773
+ await ipc?.dispose();
774
+ },
775
+ invoke(method, ...params) {
776
+ return invokeHelper(callbacks, ipc, method, params, false);
777
+ },
778
+ invokeAndTransfer(method, ...params) {
779
+ return invokeHelper(callbacks, ipc, method, params, true);
780
+ },
775
781
  // @ts-ignore
776
782
  ipc,
777
783
  /**
778
784
  * @deprecated
779
785
  */
780
786
  send(method, ...params) {
781
- send(ipc, method, ...params);
782
- },
783
- invoke(method, ...params) {
784
- return invoke$1(ipc, method, ...params);
785
- },
786
- invokeAndTransfer(method, ...params) {
787
- return invokeAndTransfer(ipc, method, ...params);
788
- },
789
- async dispose() {
790
- await ipc?.dispose();
787
+ const message = create$o(method, params);
788
+ ipc.send(message);
791
789
  }
792
790
  };
793
791
  return rpc;
@@ -804,7 +802,7 @@ const logError = () => {
804
802
  const handleMessage = event => {
805
803
  const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
806
804
  const actualExecute = event?.target?.execute || execute;
807
- return handleJsonRpcMessage(event.target, event.data, actualExecute, resolve, preparePrettyError, logError, actualRequiresSocket);
805
+ return handleJsonRpcMessage(event.target, event.data, actualExecute, event.target._resolve, preparePrettyError, logError, actualRequiresSocket);
808
806
  };
809
807
  const handleIpc = ipc => {
810
808
  if ('addEventListener' in ipc) {
@@ -822,7 +820,7 @@ const listen$1 = async (module, options) => {
822
820
  const ipc = module.wrap(rawIpc);
823
821
  return ipc;
824
822
  };
825
- const create$3 = async ({
823
+ const create$1$1 = async ({
826
824
  commandMap
827
825
  }) => {
828
826
  // TODO create a commandMap per rpc instance
@@ -834,21 +832,11 @@ const create$3 = async ({
834
832
  };
835
833
  const WebWorkerRpcClient = {
836
834
  __proto__: null,
837
- create: create$3
835
+ create: create$1$1
838
836
  };
839
837
 
840
- const Button$2 = 1;
841
- const Div = 4;
842
- const Text = 12;
843
- const Br = 55;
844
-
845
838
  const TargetName = 'event.target.name';
846
839
 
847
- const Tab = 2;
848
- const Escape = 8;
849
-
850
- const Shift = 1 << 10 >>> 0;
851
-
852
840
  const RendererWorker = 1;
853
841
 
854
842
  const rpcs = Object.create(null);
@@ -861,6 +849,10 @@ const get$1 = id => {
861
849
 
862
850
  const create$2 = rpcId => {
863
851
  return {
852
+ async dispose() {
853
+ const rpc = get$1(rpcId);
854
+ await rpc.dispose();
855
+ },
864
856
  // @ts-ignore
865
857
  invoke(method, ...params) {
866
858
  const rpc = get$1(rpcId);
@@ -875,17 +867,14 @@ const create$2 = rpcId => {
875
867
  },
876
868
  set(rpc) {
877
869
  set$2(rpcId, rpc);
878
- },
879
- async dispose() {
880
- const rpc = get$1(rpcId);
881
- await rpc.dispose();
882
870
  }
883
871
  };
884
872
  };
885
873
 
886
874
  const {
887
875
  invoke,
888
- set: set$1} = create$2(RendererWorker);
876
+ set: set$1
877
+ } = create$2(RendererWorker);
889
878
  const getElectronVersion$1 = async () => {
890
879
  return invoke('Process.getElectronVersion');
891
880
  };
@@ -950,10 +939,11 @@ const create$1 = () => {
950
939
  wrapCommand(fn) {
951
940
  const wrapped = async (uid, ...args) => {
952
941
  const {
942
+ oldState,
953
943
  newState
954
944
  } = states[uid];
955
945
  const newerState = await fn(newState, ...args);
956
- if (newState === newerState) {
946
+ if (oldState === newerState || newState === newerState) {
957
947
  return;
958
948
  }
959
949
  const latest = states[uid];
@@ -999,20 +989,20 @@ const create$1 = () => {
999
989
  };
1000
990
 
1001
991
  const {
1002
- get,
1003
- set,
1004
992
  dispose: dispose$1,
1005
- wrapCommand,
993
+ get,
994
+ getCommandIds,
1006
995
  registerCommands,
1007
- getCommandIds
996
+ set,
997
+ wrapCommand
1008
998
  } = create$1();
1009
999
 
1010
1000
  const create = uid => {
1011
1001
  const state = {
1012
- uid,
1013
1002
  focusId: 0,
1014
1003
  lines: [],
1015
- productName: ''
1004
+ productName: '',
1005
+ uid
1016
1006
  };
1017
1007
  set(uid, state, state);
1018
1008
  };
@@ -1052,8 +1042,8 @@ const diff = (oldState, newState) => {
1052
1042
 
1053
1043
  const diff2 = uid => {
1054
1044
  const {
1055
- oldState,
1056
- newState
1045
+ newState,
1046
+ oldState
1057
1047
  } = get(uid);
1058
1048
  const diffResult = diff(oldState, newState);
1059
1049
  return diffResult;
@@ -1069,10 +1059,10 @@ const Copy$2 = 2;
1069
1059
 
1070
1060
  const getNextFocus = focusId => {
1071
1061
  switch (focusId) {
1072
- case Ok$2:
1073
- return Copy$2;
1074
1062
  case Copy$2:
1075
1063
  return Ok$2;
1064
+ case Ok$2:
1065
+ return Copy$2;
1076
1066
  default:
1077
1067
  return None;
1078
1068
  }
@@ -1090,10 +1080,10 @@ const focusNext = state => {
1090
1080
 
1091
1081
  const getPreviousFocus = focusId => {
1092
1082
  switch (focusId) {
1093
- case Ok$2:
1094
- return Copy$2;
1095
1083
  case Copy$2:
1096
1084
  return Ok$2;
1085
+ case Ok$2:
1086
+ return Copy$2;
1097
1087
  default:
1098
1088
  return None;
1099
1089
  }
@@ -1109,6 +1099,16 @@ const focusPrevious = state => {
1109
1099
  };
1110
1100
  };
1111
1101
 
1102
+ const Button$2 = 1;
1103
+ const Div = 4;
1104
+ const Text = 12;
1105
+ const Br = 55;
1106
+
1107
+ const Tab = 2;
1108
+ const Escape = 8;
1109
+
1110
+ const Shift = 1 << 10 >>> 0;
1111
+
1112
1112
  const mergeClassNames = (...classNames) => {
1113
1113
  return classNames.filter(Boolean).join(' ');
1114
1114
  };
@@ -1125,16 +1125,16 @@ const FocusAbout = 4;
1125
1125
 
1126
1126
  const getKeyBindings = () => {
1127
1127
  return [{
1128
- key: Escape,
1129
1128
  command: 'About.handleClickClose',
1129
+ key: Escape,
1130
1130
  when: FocusAbout
1131
1131
  }, {
1132
- key: Tab,
1133
1132
  command: 'About.focusNext',
1133
+ key: Tab,
1134
1134
  when: FocusAbout
1135
1135
  }, {
1136
- key: Tab | Shift,
1137
1136
  command: 'About.focusPrevious',
1137
+ key: Tab | Shift,
1138
1138
  when: FocusAbout
1139
1139
  }];
1140
1140
  };
@@ -1187,12 +1187,12 @@ const Close = 'Close';
1187
1187
 
1188
1188
  const handleClickButton = async (state, name) => {
1189
1189
  switch (name) {
1190
+ case Close:
1191
+ return handleClickClose(state);
1190
1192
  case Copy$1:
1191
1193
  return handleClickCopy(state);
1192
1194
  case Ok$1:
1193
1195
  return handleClickOk(state);
1194
- case Close:
1195
- return handleClickClose(state);
1196
1196
  default:
1197
1197
  throw new Error(`unexpected button`);
1198
1198
  }
@@ -1532,9 +1532,9 @@ const loadContent2 = state => {
1532
1532
  const lines = getDetailStringWeb();
1533
1533
  return {
1534
1534
  ...state,
1535
- productName: productNameLong$1,
1535
+ focusId: Ok$2,
1536
1536
  lines,
1537
- focusId: Ok$2
1537
+ productName: productNameLong$1
1538
1538
  };
1539
1539
  };
1540
1540
 
@@ -1562,16 +1562,16 @@ const createViewModel = state => {
1562
1562
  const closeMessage = closeDialog();
1563
1563
  const infoMessage = info();
1564
1564
  const {
1565
- productName,
1566
- lines
1565
+ lines,
1566
+ productName
1567
1567
  } = state;
1568
1568
  return {
1569
- productName,
1570
- lines,
1571
1569
  closeMessage,
1572
- okMessage,
1573
1570
  copyMessage,
1574
- infoMessage
1571
+ infoMessage,
1572
+ lines,
1573
+ okMessage,
1574
+ productName
1575
1575
  };
1576
1576
  };
1577
1577
 
@@ -1600,8 +1600,8 @@ const HandleContextMenu = 5;
1600
1600
  const HandleFocusIn = 6;
1601
1601
 
1602
1602
  const br = {
1603
- type: Br,
1604
- childCount: 0
1603
+ childCount: 0,
1604
+ type: Br
1605
1605
  };
1606
1606
  const renderLine = (line, index) => {
1607
1607
  if (index === 0) {
@@ -1612,9 +1612,9 @@ const renderLine = (line, index) => {
1612
1612
 
1613
1613
  const getAboutContentVirtualDom = lines => {
1614
1614
  const dom = [{
1615
- type: Div,
1615
+ childCount: lines.length * 2 - 1,
1616
1616
  className: DialogMessage,
1617
- childCount: lines.length * 2 - 1
1617
+ type: Div
1618
1618
  }, ...lines.flatMap(renderLine)];
1619
1619
  return dom;
1620
1620
  };
@@ -1626,21 +1626,21 @@ const Dialog = 'dialog';
1626
1626
 
1627
1627
  const getPrimaryButtonVirtualDom = (message, name) => {
1628
1628
  return [{
1629
- type: Button$2,
1629
+ childCount: 1,
1630
1630
  className: mergeClassNames(Button$1, ButtonPrimary),
1631
+ name,
1631
1632
  onClick: HandleClickButton,
1632
- childCount: 1,
1633
- name
1633
+ type: Button$2
1634
1634
  }, text(message)];
1635
1635
  };
1636
1636
 
1637
1637
  const getSecondaryButtonVirtualDom = (message, name) => {
1638
1638
  return [{
1639
- type: Button$2,
1639
+ childCount: 1,
1640
1640
  className: mergeClassNames(Button$1, ButtonSecondary),
1641
+ name,
1641
1642
  onClick: HandleClickButton,
1642
- childCount: 1,
1643
- name
1643
+ type: Button$2
1644
1644
  }, text(message)];
1645
1645
  };
1646
1646
 
@@ -1655,52 +1655,52 @@ const Focusable = -1;
1655
1655
 
1656
1656
  const getDialogVirtualDom = (content, closeMessage, infoMessage, okMessage, copyMessage, productName) => {
1657
1657
  const dom = [{
1658
- type: Div,
1659
- className: DialogContent,
1660
- tabIndex: Focusable,
1661
- role: Dialog,
1662
- ariaModal: True,
1663
1658
  ariaLabelledBy: joinBySpace(DialogIcon, DialogHeading),
1659
+ ariaModal: True,
1660
+ childCount: 3,
1661
+ className: DialogContent,
1664
1662
  onFocusIn: HandleFocusIn,
1665
- childCount: 3
1663
+ role: Dialog,
1664
+ tabIndex: Focusable,
1665
+ type: Div
1666
1666
  }, {
1667
- type: Div,
1667
+ childCount: 1,
1668
1668
  className: DialogToolBarRow,
1669
- childCount: 1
1669
+ type: Div
1670
1670
  }, {
1671
- type: Div,
1672
- className: DialogClose,
1673
1671
  ariaLabel: closeMessage,
1674
- role: Button,
1672
+ childCount: 1,
1673
+ className: DialogClose,
1675
1674
  onClick: HandleClickClose,
1676
- childCount: 1
1675
+ role: Button,
1676
+ type: Div
1677
1677
  }, {
1678
- type: Div,
1678
+ childCount: 0,
1679
1679
  className: mergeClassNames(MaskIcon, MaskIconClose),
1680
- childCount: 0
1680
+ type: Div
1681
1681
  }, {
1682
- type: Div,
1682
+ childCount: 2,
1683
1683
  className: DialogMessageRow,
1684
- childCount: 2
1684
+ type: Div
1685
1685
  }, {
1686
- type: Div,
1686
+ ariaLabel: infoMessage,
1687
+ childCount: 0,
1687
1688
  className: mergeClassNames(DialogIcon$1, DialogInfoIcon, MaskIcon, MaskIconInfo),
1688
1689
  id: DialogIcon,
1689
- ariaLabel: infoMessage,
1690
- childCount: 0
1690
+ type: Div
1691
1691
  }, {
1692
- type: Div,
1692
+ childCount: 2,
1693
1693
  className: DialogContentRight,
1694
- childCount: 2
1694
+ type: Div
1695
1695
  }, {
1696
- type: Div,
1697
- id: DialogHeading,
1696
+ childCount: 1,
1698
1697
  className: DialogHeading$1,
1699
- childCount: 1
1698
+ id: DialogHeading,
1699
+ type: Div
1700
1700
  }, text(productName), ...content, {
1701
- type: Div,
1701
+ childCount: 2,
1702
1702
  className: DialogButtonsRow,
1703
- childCount: 2
1703
+ type: Div
1704
1704
  }, ...getSecondaryButtonVirtualDom(okMessage, Ok$1), ...getPrimaryButtonVirtualDom(copyMessage, Copy$1)];
1705
1705
  return dom;
1706
1706
  };
@@ -1708,10 +1708,10 @@ const getDialogVirtualDom = (content, closeMessage, infoMessage, okMessage, copy
1708
1708
  const getAboutVirtualDom = (productName, lines, closeMessage, okMessage, copyMessage, infoMessage) => {
1709
1709
  const content = getAboutContentVirtualDom(lines);
1710
1710
  return [{
1711
- type: Div,
1711
+ childCount: 1,
1712
1712
  className: mergeClassNames(Viewlet, About),
1713
1713
  onContextMenu: HandleContextMenu,
1714
- childCount: 1
1714
+ type: Div
1715
1715
  }, ...getDialogVirtualDom(content, closeMessage, infoMessage, okMessage, copyMessage, productName)];
1716
1716
  };
1717
1717
 
@@ -1765,8 +1765,8 @@ const applyRender = (oldState, newState, diffResult) => {
1765
1765
 
1766
1766
  const doRender = (uid, diffResult) => {
1767
1767
  const {
1768
- oldState,
1769
- newState
1768
+ newState,
1769
+ oldState
1770
1770
  } = get(uid);
1771
1771
  set(uid, newState, newState);
1772
1772
  const commands = applyRender(oldState, newState, diffResult);
@@ -1830,11 +1830,11 @@ const showAboutElectron = async () => {
1830
1830
  const detail = await getDetailString();
1831
1831
  const productNameLong = getProductNameLong();
1832
1832
  const options = {
1833
- windowId,
1834
- message: productNameLong,
1835
1833
  buttons: [copy(), ok()],
1834
+ detail,
1835
+ message: productNameLong,
1836
1836
  type: Info,
1837
- detail
1837
+ windowId
1838
1838
  };
1839
1839
  const index = await showMessageBox(options);
1840
1840
  switch (index) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/about-view",
3
- "version": "7.0.0",
3
+ "version": "7.1.0",
4
4
  "description": "About View Worker",
5
5
  "keywords": [
6
6
  "about-view"