@topconsultnpm/sdkui-react 6.22.0-dev4.16 → 6.22.0-dev4.17

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 (115) hide show
  1. package/lib/components/NewComponents/ContextMenu/styles.d.ts +43 -45
  2. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +60 -67
  3. package/lib/components/base/Styled.d.ts +77 -93
  4. package/lib/components/base/TMCounterBar.d.ts +2 -2
  5. package/lib/components/base/TMCounterContainer.d.ts +1 -2
  6. package/lib/components/base/TMCustomButton.d.ts +1 -1
  7. package/lib/components/base/TMDataGrid.js +219 -219
  8. package/lib/components/base/TMDataGridExportForm.d.ts +1 -2
  9. package/lib/components/base/TMFileManager.d.ts +1 -2
  10. package/lib/components/base/TMFileManagerDataGridView.d.ts +1 -2
  11. package/lib/components/base/TMFileManagerThumbnailItems.d.ts +1 -1
  12. package/lib/components/base/TMFileManagerThumbnailsView.d.ts +1 -1
  13. package/lib/components/base/TMFileManagerUtils.d.ts +6 -4
  14. package/lib/components/base/TMLayout.d.ts +4 -4
  15. package/lib/components/base/TMList.d.ts +1 -2
  16. package/lib/components/base/TMListView.d.ts +1 -1
  17. package/lib/components/base/TMSpinner.d.ts +2 -3
  18. package/lib/components/base/TMTab.d.ts +3 -4
  19. package/lib/components/base/TMTabControl.js +208 -208
  20. package/lib/components/base/TMTooltip.d.ts +1 -1
  21. package/lib/components/base/TMTreeView.d.ts +8 -14
  22. package/lib/components/base/TMUserAvatar.d.ts +1 -2
  23. package/lib/components/base/TMVilViewer.d.ts +1 -2
  24. package/lib/components/base/TMWaitPanel.d.ts +2 -3
  25. package/lib/components/base/waitPanel/TMWaitPanelView.d.ts +1 -2
  26. package/lib/components/base/waitPanel/TMWaitPanelView.js +207 -207
  27. package/lib/components/choosers/TMDynDataListItemChooser.d.ts +1 -1
  28. package/lib/components/choosers/TMInvoiceRetrieveFormats.d.ts +1 -2
  29. package/lib/components/choosers/TMOrderRetrieveFormats.d.ts +1 -2
  30. package/lib/components/choosers/TMQuickSearchInfo.d.ts +1 -2
  31. package/lib/components/choosers/TMRelationChooser.d.ts +3 -3
  32. package/lib/components/choosers/TMUserChooser.d.ts +2 -2
  33. package/lib/components/editors/TMEditorStyled.d.ts +42 -20
  34. package/lib/components/editors/TMFormulaEditor.d.ts +1 -1
  35. package/lib/components/editors/TMHtmlContentDisplay.d.ts +1 -2
  36. package/lib/components/editors/TMHtmlEditor.d.ts +1 -2
  37. package/lib/components/editors/TMTreeDropDown.d.ts +1 -1
  38. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.d.ts +1 -1
  39. package/lib/components/features/blog/TMBlogCommentForm.d.ts +1 -2
  40. package/lib/components/features/documents/TMDcmtForm.d.ts +6 -1
  41. package/lib/components/features/documents/TMDcmtForm.js +9 -2
  42. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +1 -1
  43. package/lib/components/features/documents/TMDcmtFormActionButtons.js +5 -2
  44. package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -2
  45. package/lib/components/features/documents/TMDcmtPreview.d.ts +6 -8
  46. package/lib/components/features/documents/TMDcmtTasks.d.ts +1 -2
  47. package/lib/components/features/documents/TMDragDropOverlay.d.ts +1 -1
  48. package/lib/components/features/documents/TMFileUploader.js +21 -21
  49. package/lib/components/features/documents/TMMasterInfoFields.d.ts +1 -2
  50. package/lib/components/features/documents/TMMergeToPdfForm.d.ts +1 -2
  51. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +1 -2
  52. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +4 -4
  53. package/lib/components/features/search/TMDcmtCheckoutInfoForm.d.ts +1 -2
  54. package/lib/components/features/search/TMMetadataOutputForm.d.ts +1 -2
  55. package/lib/components/features/search/TMMetadataSorterForm.d.ts +1 -2
  56. package/lib/components/features/search/TMSavedQuerySelector.d.ts +2 -2
  57. package/lib/components/features/search/TMSearch.d.ts +1 -2
  58. package/lib/components/features/search/TMSearchQueryPanel.d.ts +3 -9
  59. package/lib/components/features/search/TMSearchResult.js +78 -78
  60. package/lib/components/features/search/TMSearchResultFloatingActionButton.d.ts +1 -1
  61. package/lib/components/features/search/TMSignatureInfoContent.d.ts +1 -2
  62. package/lib/components/features/search/TMViewHistoryDcmt.d.ts +1 -2
  63. package/lib/components/features/tasks/TMTaskForm.d.ts +1 -1
  64. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +10 -10
  65. package/lib/components/features/tasks/TMTasksAgenda.d.ts +1 -1
  66. package/lib/components/features/tasks/TMTasksCalendar.d.ts +1 -1
  67. package/lib/components/features/tasks/TMTasksHeader.d.ts +1 -1
  68. package/lib/components/features/tasks/TMTasksPanelContent.d.ts +1 -1
  69. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +5 -5
  70. package/lib/components/features/tasks/TMTasksView.d.ts +1 -1
  71. package/lib/components/features/wg/TMWGsCopyMoveForm.d.ts +2 -3
  72. package/lib/components/features/wg/TMWGsCopyMoveForm.js +9 -9
  73. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +7 -8
  74. package/lib/components/features/workflow/TMWorkflowPopup.js +1 -1
  75. package/lib/components/features/workflow/diagram/WorkitemRecipientsEditor.d.ts +1 -3
  76. package/lib/components/forms/Login/ChangePasswordInputs.d.ts +1 -3
  77. package/lib/components/forms/Login/Chooser.d.ts +2 -2
  78. package/lib/components/forms/TMChooserForm.d.ts +1 -2
  79. package/lib/components/forms/TMSaveForm.d.ts +4 -4
  80. package/lib/components/grids/TMBlogAttachments.d.ts +1 -2
  81. package/lib/components/grids/TMBlogHeader.d.ts +1 -1
  82. package/lib/components/grids/TMBlogsPost.d.ts +1 -1
  83. package/lib/components/grids/TMBlogsPostUtils.d.ts +9 -9
  84. package/lib/components/grids/TMValidationItemsList.d.ts +1 -2
  85. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -2
  86. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +12 -12
  87. package/lib/components/layout/panelManager/TMPanelManagerContext.d.ts +2 -2
  88. package/lib/components/layout/panelManager/TMPanelManagerLoader.d.ts +1 -2
  89. package/lib/components/layout/panelManager/TMPanelManagerToolbar.d.ts +6 -5
  90. package/lib/components/layout/panelManager/TMPanelManagerWithPersistenceProvider.d.ts +2 -2
  91. package/lib/components/layout/panelManager/TMPanelWrapper.d.ts +2 -2
  92. package/lib/components/pages/TMPage.d.ts +1 -1
  93. package/lib/components/query/TMQueryEditor.d.ts +10 -14
  94. package/lib/components/settings/SettingsAppearance.d.ts +1 -2
  95. package/lib/components/sidebar/TMAboutApp.d.ts +1 -2
  96. package/lib/components/sidebar/TMCommandsPanel.d.ts +4 -4
  97. package/lib/components/sidebar/TMHeader.d.ts +3 -3
  98. package/lib/components/viewers/TMDataListItemViewer.d.ts +2 -3
  99. package/lib/components/viewers/TMDataUserIdItemViewer.d.ts +2 -3
  100. package/lib/components/viewers/TMMidViewer.d.ts +2 -2
  101. package/lib/components/viewers/TMTidViewer.d.ts +2 -2
  102. package/lib/helper/TMAppUpdatedModal.d.ts +1 -2
  103. package/lib/helper/TMAppUpdatedModal.js +93 -93
  104. package/lib/helper/TMCommandsContextMenu.d.ts +1 -1
  105. package/lib/helper/TMIcons.d.ts +280 -280
  106. package/lib/helper/TMPdfViewer.d.ts +1 -2
  107. package/lib/helper/TMToppyMessage.d.ts +2 -2
  108. package/lib/helper/TMUtils.d.ts +4 -10
  109. package/lib/helper/helpers.d.ts +1 -1
  110. package/lib/hooks/useCaseFlowApprove.js +31 -6
  111. package/lib/hooks/useInputDialog.d.ts +1 -2
  112. package/lib/services/caseflow/caseFlowNameCache.d.ts +5 -0
  113. package/lib/services/caseflow/caseFlowNameCache.js +19 -0
  114. package/lib/services/platform_services.d.ts +2 -3
  115. package/package.json +1 -1
@@ -1,9 +1,8 @@
1
- import React from "react";
2
1
  interface TMPdfViewerProps {
3
2
  pdfBlob: Blob;
4
3
  title?: string;
5
4
  isResizingActive?: boolean;
6
5
  enableFitToWidth?: boolean;
7
6
  }
8
- declare const TMPdfViewer: (props: TMPdfViewerProps) => React.JSX.Element;
7
+ declare const TMPdfViewer: (props: TMPdfViewerProps) => import("react/jsx-runtime").JSX.Element;
9
8
  export default TMPdfViewer;
@@ -1,8 +1,8 @@
1
- import React, { ReactNode } from 'react';
1
+ import { ReactNode } from 'react';
2
2
  interface TMToppyMessageProps {
3
3
  message: ReactNode;
4
4
  titleTooltip?: string;
5
5
  maxWidth?: string;
6
6
  }
7
- declare const TMToppyMessage: (props: TMToppyMessageProps) => React.JSX.Element;
7
+ declare const TMToppyMessage: (props: TMToppyMessageProps) => import("react/jsx-runtime").JSX.Element;
8
8
  export default TMToppyMessage;
@@ -24,7 +24,7 @@ export declare const getFullFileExtension: (fileName: string, depth?: number) =>
24
24
  * Es: pdf.p7m.tsd → pdf, pdf.p7m → pdf, pdf → pdf
25
25
  */
26
26
  export declare const getBaseExtension: (ext: string) => string;
27
- export declare const getFileIcon: (fileExtension: string | undefined, fileCount: number | undefined, tooltipContent?: JSX.Element | string) => React.JSX.Element;
27
+ export declare const getFileIcon: (fileExtension: string | undefined, fileCount: number | undefined, tooltipContent?: JSX.Element | string) => import("react/jsx-runtime").JSX.Element;
28
28
  export declare function formatBytes(bytes: number | undefined, decimalPlaces?: number): string;
29
29
  export interface RowData {
30
30
  [key: string]: string | number | null;
@@ -52,15 +52,9 @@ interface TabItemProps {
52
52
  $isSelected: boolean;
53
53
  $activeGradient?: string;
54
54
  }
55
- export declare const StyledTabItem: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
56
- style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
57
- }, TabItemProps>> & string;
58
- export declare const StyledTabIcon: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
59
- style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
60
- }, TabItemProps>> & string;
61
- export declare const TMCountBadge: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
62
- style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
63
- }> & string;
55
+ export declare const StyledTabItem: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof TabItemProps> & TabItemProps, never> & Partial<Pick<import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof TabItemProps> & TabItemProps, never>>> & string;
56
+ export declare const StyledTabIcon: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, keyof TabItemProps> & TabItemProps, never> & Partial<Pick<import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, keyof TabItemProps> & TabItemProps, never>>> & string;
57
+ export declare const TMCountBadge: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
64
58
  export declare const PDGS_COLORS: {
65
59
  DOSSIER: string;
66
60
  DOCUMENT: string;
@@ -77,7 +77,7 @@ export { openApps, calcResponsiveDirection, calcResponsiveSizes, taskModalSizes,
77
77
  export declare function moduleVersion(module: moduleTypes): string;
78
78
  export declare function buildtype(module: moduleTypes): string;
79
79
  export declare const highlightText: (text: string, searchValue: string) => JSX.Element;
80
- export declare const renderHighlightedText: (text: string, searchText: string, isSelected: boolean) => string | (string | React.JSX.Element)[];
80
+ export declare const renderHighlightedText: (text: string, searchText: string, isSelected: boolean) => string | (string | import("react/jsx-runtime").JSX.Element)[];
81
81
  export declare function versionAndBuildtypeInfo(module: moduleTypes): string;
82
82
  export declare const getListMaxItems: (deviceType: DeviceType | undefined) => number;
83
83
  export declare const svgToString: (icon: React.ReactElement) => string;
@@ -1,7 +1,8 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
- import { SDK_Globals } from '@topconsultnpm/sdk-ts';
2
+ import { CF_WorkItemCategories, SDK_Globals } from '@topconsultnpm/sdk-ts';
3
3
  import { CaseFlowService } from '../services/caseflow/CaseFlowService';
4
- import { getWorkItemTargetDoc, isMoreInfoWorkItem, isSignatureWorkItem } from '../services/caseflow/caseFlowWorkItemUtils';
4
+ import { getWorkItemTargetDoc, isSignatureWorkItem } from '../services/caseflow/caseFlowWorkItemUtils';
5
+ import { isFinalActionSync } from '../services/caseflow/caseFlowNameCache';
5
6
  const CASEFLOW_APPROVE_CHANGED_EVENT = 'onCaseFlowApproveChange';
6
7
  let cache = [];
7
8
  let inFlight;
@@ -16,10 +17,27 @@ const notifyChanged = () => {
16
17
  return;
17
18
  window.dispatchEvent(new CustomEvent(CASEFLOW_APPROVE_CHANGED_EVENT));
18
19
  };
20
+ /**
21
+ * Categorie che si completano DAL DOCUMENTO: firmarlo, approvarlo, prenderne
22
+ * visione. Le altre si completano nella pratica, perché il Toppy del form offre
23
+ * solo Approva/Rifiuta e non saprebbe fare il resto:
24
+ * - Caricamento manuale (Upload): il commento è obbligatorio (TMC-2822);
25
+ * - Generica / caricamento automatico: si chiude da sola quando il documento
26
+ * viene agganciato;
27
+ * - Completamento dati: vanno inseriti i valori dei metadati;
28
+ * - Verifica bloccante: sblocca o interrompe la pratica;
29
+ * - Richiesta informazioni: ha una risposta, non un esito.
30
+ */
31
+ const DOCUMENT_CATEGORIES = new Set([
32
+ CF_WorkItemCategories.Approval,
33
+ CF_WorkItemCategories.Signature,
34
+ CF_WorkItemCategories.Acknowledgment,
35
+ ]);
19
36
  /**
20
37
  * Ricarica la cache: i workitem pendenti dell'utente, risolti sul documento su
21
- * cui lavorano. Le richieste di informazioni sono escluse (si rispondono nella
22
- * pratica, non sul documento) come i workitem senza documento.
38
+ * cui lavorano. Restano fuori le categorie che non si completano dal documento
39
+ * (vedi DOCUMENT_CATEGORIES), le azioni che chiudono la pratica e i workitem
40
+ * senza documento.
23
41
  */
24
42
  const reload = async () => {
25
43
  const userId = SDK_Globals.tmSession?.SessionDescr?.userID;
@@ -30,8 +48,7 @@ const reload = async () => {
30
48
  const groups = await CaseFlowService.getMyPendingWorkItems(userId);
31
49
  const resolved = [];
32
50
  for (const { caseflow, workItems } of groups) {
33
- // Le richieste di informazioni si rispondono nella pratica, non sul documento.
34
- const relevant = workItems.filter(wi => !isMoreInfoWorkItem(wi));
51
+ const relevant = workItems.filter(wi => DOCUMENT_CATEGORIES.has(wi.workItemCategory));
35
52
  if (relevant.length === 0)
36
53
  continue;
37
54
  // Il TID dell'azione è autorato sul TEMPLATE e non materializzato
@@ -47,6 +64,14 @@ const reload = async () => {
47
64
  instance = (await CaseFlowService.getCaseflow(instance.id, instance.cftid)) ?? instance;
48
65
  }
49
66
  for (const wi of relevant) {
67
+ // Un'azione che chiude la pratica richiede il motivo, che il Toppy del
68
+ // documento non chiede: si completa nella pratica. Il template è già
69
+ // risolto qui sopra, quindi `isFinal` è noto.
70
+ // La Firma resta: firmare si può solo da qui (l'ospite non ha altra
71
+ // strada). Fallirà il solo completamento automatico, che l'utente fa
72
+ // poi nella pratica scrivendo il motivo, con la firma già apposta.
73
+ if (!isSignatureWorkItem(wi) && isFinalActionSync(caseflow.cftid, wi.actionID))
74
+ continue;
50
75
  const target = getWorkItemTargetDoc(instance, wi);
51
76
  if (!target)
52
77
  continue;
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { FileDescriptor, FileFormats } from '@topconsultnpm/sdk-ts';
3
2
  export declare const useInputCvtFormatDialog: () => [() => Promise<FileFormats>, () => JSX.Element];
4
3
  export declare const useFileDialog: () => {
@@ -6,7 +5,7 @@ export declare const useFileDialog: () => {
6
5
  };
7
6
  export declare const useInputAttachmentsDialog: () => {
8
7
  openConfirmAttachmentsDialog: (list: FileDescriptor[]) => Promise<string[] | undefined>;
9
- ConfirmAttachmentsDialog: () => React.JSX.Element | null;
8
+ ConfirmAttachmentsDialog: () => import("react/jsx-runtime").JSX.Element | null;
10
9
  };
11
10
  export type FileSourceType = 'filesystem' | 'scanner-new' | 'scanner-edit' | undefined;
12
11
  export declare const useFileSourceDialog: () => [(hasExistingFile?: boolean) => Promise<FileSourceType>, () => JSX.Element];
@@ -30,3 +30,8 @@ export declare function primeActionNames(template?: CaseFlowTemplateDescriptor |
30
30
  * l'azione non lavora su un documento (o il template non è ancora risolto).
31
31
  */
32
32
  export declare function getActionTidSync(cftid?: number, actionID?: number): number | undefined;
33
+ /**
34
+ * true se l'azione del template chiude la pratica (`isFinal`). Con il template
35
+ * non ancora risolto ritorna false.
36
+ */
37
+ export declare function isFinalActionSync(cftid?: number, actionID?: number): boolean;
@@ -95,6 +95,11 @@ export function primeActionNames(template) {
95
95
  actionNameCache.set(actionKey(cftid, a.id), a.name ?? '');
96
96
  if (a.actionTID != null && a.actionTID > 0)
97
97
  actionTidCache.set(actionKey(cftid, a.id), a.actionTID);
98
+ // Il template può essere stato modificato: la chiave va anche tolta.
99
+ if (a.isFinal)
100
+ finalActionKeys.add(actionKey(cftid, a.id));
101
+ else
102
+ finalActionKeys.delete(actionKey(cftid, a.id));
98
103
  }
99
104
  }
100
105
  // ---- TID documento per azione (per template) --------------------------------
@@ -114,3 +119,17 @@ export function getActionTidSync(cftid, actionID) {
114
119
  return undefined;
115
120
  return actionTidCache.get(actionKey(cftid, actionID));
116
121
  }
122
+ // ---- Azioni che chiudono la pratica (per template) ---------------------------
123
+ //
124
+ // Anche `isFinal` vive solo SUL TEMPLATE: sull'azione d'istanza arriva sempre
125
+ // false. Popolata da {@link primeActionNames} come le cache qui sopra.
126
+ const finalActionKeys = new Set();
127
+ /**
128
+ * true se l'azione del template chiude la pratica (`isFinal`). Con il template
129
+ * non ancora risolto ritorna false.
130
+ */
131
+ export function isFinalActionSync(cftid, actionID) {
132
+ if (cftid == null || actionID == null)
133
+ return false;
134
+ return finalActionKeys.has(actionKey(cftid, actionID));
135
+ }
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { JobTypes, ObjectClasses, ProcessDescriptor, DcmtTypeDescriptor } from "@topconsultnpm/sdk-ts";
3
2
  export declare class PlatformObjectService {
4
3
  static readonly retrieveAllAsync: (objClass: ObjectClasses, refreshCache?: boolean) => Promise<import("@topconsultnpm/sdk-ts").AreaDescriptor[] | import("@topconsultnpm/sdk-ts").NotificationDescriptor[] | import("@topconsultnpm/sdk-ts").RelationDescriptor[] | import("@topconsultnpm/sdk-ts").TaskDescriptor[] | import("@topconsultnpm/sdk-ts").WorkingGroupDescriptor[] | undefined>;
@@ -14,6 +13,6 @@ export declare class PlatformObjectService {
14
13
  static readonly createAsync: (objClass: ObjectClasses, jobType: JobTypes, d: any) => Promise<number | undefined>;
15
14
  static readonly deleteAsync: (objClass: ObjectClasses, id: number) => Promise<number | undefined>;
16
15
  static readonly getName: (objClass: ObjectClasses, jobType?: JobTypes, isPlural?: boolean) => string;
17
- static readonly getIcon: (objClass: ObjectClasses, d: any) => React.JSX.Element;
18
- static readonly getTooltip: (objClass: ObjectClasses, d: any) => React.JSX.Element | null;
16
+ static readonly getIcon: (objClass: ObjectClasses, d: any) => import("react/jsx-runtime").JSX.Element;
17
+ static readonly getTooltip: (objClass: ObjectClasses, d: any) => import("react/jsx-runtime").JSX.Element | null;
19
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.22.0-dev4.16",
3
+ "version": "6.22.0-dev4.17",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",