diff --git a/TAGS.md b/TAGS.md new file mode 100644 index 000000000..b848b2c9e --- /dev/null +++ b/TAGS.md @@ -0,0 +1,3 @@ +# TAG: AUTHORING-ANGULAR + +AUTHORING-ANGULAR tag is meant to mark code that has to be removed together with angular based authoring component when time comes. \ No newline at end of file diff --git a/client/components/PlanningDetailsWidget.tsx b/client/components/PlanningDetailsWidget.tsx index 2fea450b5..a2e416a75 100644 --- a/client/components/PlanningDetailsWidget.tsx +++ b/client/components/PlanningDetailsWidget.tsx @@ -1,14 +1,12 @@ import React from 'react'; import {Provider} from 'react-redux'; -import {connectServices} from 'superdesk-core/scripts/core/helpers/ReactRenderAsync'; +import ng from 'superdesk-core/scripts/core/services/ng'; import {PlanningPreviewContent} from './Planning/PlanningPreviewContent'; import {modifyForClient} from '../utils/planning'; import {WORKSPACE} from '../constants'; import {fetchAgendas} from '../actions'; interface IProps { - api: any; - sdPlanningStore: any; item: { assignment_id: string; }; @@ -19,7 +17,9 @@ interface IState { planning: any; } -export function getItemPlanningInfo(item: IProps['item'], api: IProps['api']) { +export function getItemPlanningInfo(item: {assignment_id: string}) { + const api = ng.get('api'); + if (item.assignment_id != null) { return api.find('assignments', item.assignment_id) .then((assignment) => api.find('planning', assignment.planning_item)) @@ -30,17 +30,25 @@ export function getItemPlanningInfo(item: IProps['item'], api: IProps['api']) { } class PlanningDetailsWidget extends React.Component { + static defaultProps: Partial; readonly state = {store: null, planning: null}; + private sdPlanningStore: any; + + constructor(props: IProps) { + super(props); + + this.sdPlanningStore = ng.get('sdPlanningStore'); + } componentDidMount() { - const {item, api, sdPlanningStore} = this.props; + const {item} = this.props; // Allow the Planning item and store to be loaded concurrently - getItemPlanningInfo(item, api).then((planning) => { + getItemPlanningInfo(item).then((planning) => { this.setState({planning}); }); - sdPlanningStore.initWorkspace(WORKSPACE.AUTHORING_WIDGET, (store) => { + this.sdPlanningStore.initWorkspace(WORKSPACE.AUTHORING_WIDGET, (store) => { // Fetch the agendas before saving the store to the state store.dispatch(fetchAgendas()).then(() => { this.setState({store}); @@ -55,16 +63,11 @@ class PlanningDetailsWidget extends React.Component { } return ( -
- - - -
+ + + ); } } -export default connectServices( - PlanningDetailsWidget, - ['api', 'sdPlanningStore'], -); +export default PlanningDetailsWidget; diff --git a/client/extension_bridge.ts b/client/extension_bridge.ts index ca938d98d..281799d71 100644 --- a/client/extension_bridge.ts +++ b/client/extension_bridge.ts @@ -12,7 +12,9 @@ import {getVocabularyItemFieldTranslated} from './utils/vocabularies'; import {getUserInterfaceLanguageFromCV} from './utils/users'; import {registerEditorField} from './components/fields/resources/registerEditorFields'; -import {IAssignmentItem, IEditorFieldProps, IPlanningAppState} from 'interfaces'; +import {IAssignmentItem, IEditorFieldProps, IPlanningAppState, IPlanningItem} from 'interfaces'; + +import PlanningDetailsWidget, {getItemPlanningInfo} from './components/PlanningDetailsWidget'; // KEEP IN SYNC WITH client/planning-extension/src/extension_bridge.ts interface IExtensionBridge { @@ -29,6 +31,9 @@ interface IExtensionBridge { StateComponent: React.ComponentType<{assignment: IAssignmentItem}>; }; }; + planning: { + getItemPlanningInfo(item: {assignment_id?: string}): Promise; + }, ui: { utils: { getUserInterfaceLanguageFromCV(): string; @@ -45,6 +50,7 @@ interface IExtensionBridge { components: { EditorFieldVocabulary: React.ComponentType; + PlanningDetailsWidget: React.ComponentType<{item: {assignment_id: string}}>; }; }; fields: { @@ -75,6 +81,9 @@ export const extensionBridge: IExtensionBridge = { StateComponent, }, }, + planning: { + getItemPlanningInfo, + }, ui: { utils: { getUserInterfaceLanguageFromCV, @@ -82,6 +91,7 @@ export const extensionBridge: IExtensionBridge = { }, components: { EditorFieldVocabulary, + PlanningDetailsWidget, }, }, fields: { diff --git a/client/index.ts b/client/index.ts index b3026c9b2..8df04d74a 100644 --- a/client/index.ts +++ b/client/index.ts @@ -5,8 +5,6 @@ import ng from 'superdesk-core/scripts/core/services/ng'; import * as actions from './actions'; import {PublishQueuePanel} from './apps'; import {gettext} from './utils'; -import {reactToAngular1} from 'superdesk-ui-framework'; -import PlanningDetailsWidget, {getItemPlanningInfo} from './components/PlanningDetailsWidget'; import {getSuperdeskApiImplementation} from 'superdesk-core/scripts/core/get-superdesk-api-implementation'; import {superdeskApi} from './superdeskApi'; @@ -51,7 +49,6 @@ export default angular.module('superdesk-planning', []) controller: ctrl.LocationsController, }) ) - .component('sdPlanningDetailsWidget', reactToAngular1(PlanningDetailsWidget, ['item'])) .service('sdPlanningStore', svc.PlanningStoreService) .service('assignments', svc.AssignmentsService) .config(['workspaceMenuProvider', (workspaceMenuProvider) => { @@ -76,24 +73,7 @@ export default angular.module('superdesk-planning', []) shortcut: 'ctrl+alt+p', }); }]) - .config(['authoringWidgetsProvider', (authoringWidgetsProvider) => { - authoringWidgetsProvider.widget('planning-details', { - label: gettext('Planning Details'), - icon: 'tasks', - side: 'right', - order: 80, - template: 'planning-details-widget.html', - display: { - authoring: true, - }, - configurable: false, - badgeAsync: ['item', 'api', (item, api) => - getItemPlanningInfo(item, api).then((planning) => planning.coverages.length)], - isWidgetVisible: (item) => [() => item.assignment_id != null], - }); - }]) .run(['$templateCache', ($templateCache) => { - $templateCache.put('planning-details-widget.html', require('./views/planning-details-widget.html')); $templateCache.put('locations.html', require('./views/locations.html')); }]) .run([ diff --git a/client/planning-extension/src/extension.ts b/client/planning-extension/src/extension.ts index 5699d55eb..725fc371e 100644 --- a/client/planning-extension/src/extension.ts +++ b/client/planning-extension/src/extension.ts @@ -14,6 +14,11 @@ import {IPlanningExtensionConfigurationOptions} from './extension_configuration_ import {AutopostIngestRuleEditor} from './ingest_rule_autopost/AutopostIngestRuleEditor'; import {AutopostIngestRulePreview} from './ingest_rule_autopost/AutopostIngestRulePreview'; import {extensionBridge} from './extension_bridge'; +import { + PlanningDetailsWidget, + PLANNING_DETAILS_WIDGET_ID, + PLANNING_DETAILS_WIDGET_LABEL, +} from './planning-details-widget'; function onSpike(superdesk: ISuperdesk, item: IArticle) { const {gettext} = superdesk.localization; @@ -109,6 +114,8 @@ const extension: IExtension = { && extensionConfig?.assignmentsTopBarWidget === true; const {gettext} = superdesk.localization; + const {getItemPlanningInfo} = extensionBridge.planning; + const result: IExtensionActivationResult = { contributions: { entities: { @@ -158,6 +165,24 @@ const extension: IExtension = { notifications: { 'email:notification:assignments': {name: superdesk.localization.gettext('Assignment')} }, + authoringSideWidgets: [ + { + _id: PLANNING_DETAILS_WIDGET_ID, + label: PLANNING_DETAILS_WIDGET_LABEL, + order: 12, + icon: 'tasks', + component: PlanningDetailsWidget, + isAllowed: (item) => item.assignment_id != null, + getBadge: (item) => { // KEEP IN SYNC WITH client/index.ts + if (item.assignment_id == null) { + return Promise.resolve(null); + } + + return getItemPlanningInfo({assignment_id: item.assignment_id}) + .then((planning) => planning.coverages.length.toString()); + }, + }, + ], globalMenuHorizontal: displayTopbarWidget ? [AssignmentsList] : [], }, }; diff --git a/client/planning-extension/src/extension_bridge.ts b/client/planning-extension/src/extension_bridge.ts index 16fdc8fdd..c8de0b2c2 100644 --- a/client/planning-extension/src/extension_bridge.ts +++ b/client/planning-extension/src/extension_bridge.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import {IVocabularyItem} from 'superdesk-api'; -import {IAssignmentItem, IEditorFieldProps, IPlanningAppState} from '../../interfaces'; +import {IAssignmentItem, IEditorFieldProps, IPlanningAppState, IPlanningItem} from '../../interfaces'; interface IEditorFieldVocabularyProps extends IEditorFieldProps { options: Array; @@ -27,6 +27,9 @@ interface IExtensionBridge { StateComponent: React.ComponentType<{assignment: IAssignmentItem}>; }; }; + planning: { + getItemPlanningInfo(item: {assignment_id?: string}): Promise; + }, ui: { utils: { getUserInterfaceLanguageFromCV(): string; @@ -42,6 +45,7 @@ interface IExtensionBridge { }; components: { EditorFieldVocabulary: React.ComponentType; + PlanningDetailsWidget: React.ComponentType<{item: {assignment_id: string}}>; }; }; fields: { diff --git a/client/planning-extension/src/planning-details-widget.tsx b/client/planning-extension/src/planning-details-widget.tsx new file mode 100644 index 000000000..f6fddbc32 --- /dev/null +++ b/client/planning-extension/src/planning-details-widget.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import {IArticleSideWidgetComponentType} from 'superdesk-api'; +import {superdesk} from './superdesk'; +import {extensionBridge} from './extension_bridge'; + +const {AuthoringWidgetLayout, AuthoringWidgetHeading} = superdesk.components; +const {gettext} = superdesk.localization; + +export const PLANNING_DETAILS_WIDGET_ID = 'planning_details'; +export const PLANNING_DETAILS_WIDGET_LABEL = gettext('Planning Details'); + +export class PlanningDetailsWidget extends React.PureComponent { + render() { + const PlanningDetailsBody = extensionBridge.ui.components.PlanningDetailsWidget; + + if (this.props.article.assignment_id == null) { + return null; + } + + return ( + + )} + body={( + + )} + /> + ); + } +} diff --git a/client/views/planning-details-widget.html b/client/views/planning-details-widget.html deleted file mode 100644 index f26c704f1..000000000 --- a/client/views/planning-details-widget.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c58da949d..e6740f6eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1368,16 +1368,6 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -3209,9 +3199,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.20", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.20.tgz", - "integrity": "sha512-74mdl6Fs1HHzK9SUX4CKFxAtAe3nUns48y79TskHNAG6fGOlLfyKA4j855x+0b5u8rWJIrlaG9tcTPstMlwjIw==", + "version": "1.5.23", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz", + "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==", "dev": true }, "elliptic": { @@ -4144,39 +4134,6 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", @@ -4188,47 +4145,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } } } }, @@ -4540,13 +4456,6 @@ "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -4574,6 +4483,29 @@ } } }, + "finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + } + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -7725,6 +7657,12 @@ "trim-newlines": "^1.0.0" } }, + "merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10901,6 +10839,41 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, + "send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", @@ -10964,6 +10937,26 @@ } } }, + "serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "requires": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "dependencies": { + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + } + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12142,7 +12135,7 @@ } }, "superdesk-core": { - "version": "github:superdesk/superdesk-client-core#61d411e5074fd6736693e67dcdf5b503d91198a8", + "version": "github:superdesk/superdesk-client-core#c1b648853877b8072918efb65b45bdd04f031775", "from": "github:superdesk/superdesk-client-core#develop", "dev": true, "requires": { @@ -12255,6 +12248,12 @@ "integrity": "sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw==", "dev": true }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true + }, "classnames": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", @@ -13403,7 +13402,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -13902,7 +13900,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } },