@atlaskit/editor-plugin-panel 4.2.2 → 4.2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-plugin-panel
2
2
 
3
+ ## 4.2.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#123010](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/123010)
8
+ [`de55801631775`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/de55801631775) -
9
+ [ux] Move copy/delete to overflow menu on editor floating toolbar
10
+
3
11
  ## 4.2.2
4
12
 
5
13
  ### Patch Changes
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.panelIconMap = exports.getToolbarItems = exports.getToolbarConfig = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _react = _interopRequireDefault(require("react"));
10
11
  var _adfSchema = require("@atlaskit/adf-schema");
11
12
  var _analytics = require("@atlaskit/editor-common/analytics");
12
13
  var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
@@ -14,6 +15,7 @@ var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/message
14
15
  var _panel = require("@atlaskit/editor-common/panel");
15
16
  var _uiColor = require("@atlaskit/editor-common/ui-color");
16
17
  var _utils = require("@atlaskit/editor-prosemirror/utils");
18
+ var _copy = _interopRequireDefault(require("@atlaskit/icon/core/copy"));
17
19
  var _crossCircle = _interopRequireDefault(require("@atlaskit/icon/core/cross-circle"));
18
20
  var _delete = _interopRequireDefault(require("@atlaskit/icon/core/delete"));
19
21
  var _discovery = _interopRequireDefault(require("@atlaskit/icon/core/discovery"));
@@ -54,7 +56,7 @@ var panelIconMap = exports.panelIconMap = (0, _defineProperty2.default)((0, _def
54
56
  shortName: ':tip:',
55
57
  id: 'atlassian-tip'
56
58
  });
57
- var getToolbarItems = exports.getToolbarItems = function getToolbarItems(formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state) {
59
+ var getToolbarItems = exports.getToolbarItems = function getToolbarItems(formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state, api) {
58
60
  // TODO: ED-14403 investigate why these titles are not getting translated for the tooltips
59
61
  var items = [{
60
62
  id: 'editor.panel.info',
@@ -275,36 +277,31 @@ var getToolbarItems = exports.getToolbarItems = function getToolbarItems(formatM
275
277
  tabIndex: null
276
278
  });
277
279
  } else {
278
- items.push({
279
- type: 'separator'
280
+ var overflowMenuConfig = [{
281
+ type: 'separator',
282
+ fullHeight: true
280
283
  }, {
281
- id: 'editor.panel.delete',
282
- type: 'button',
283
- appearance: 'danger',
284
- focusEditoronEnter: true,
285
- icon: _delete.default,
286
- iconFallback: _remove.default,
287
- onClick: (0, _actions.removePanel)(editorAnalyticsAPI),
288
- onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
289
- onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
290
- onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
291
- onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
292
- title: formatMessage(_messages.default.remove),
293
- tabIndex: null
294
- });
295
- if (state) {
296
- items.push({
297
- type: 'separator'
298
- });
299
- items.push({
300
- type: 'copy-button',
301
- items: [{
302
- state: state,
303
- formatMessage: formatMessage,
304
- nodeType: panelNodeType
305
- }]
306
- });
307
- }
284
+ type: 'overflow-dropdown',
285
+ options: [{
286
+ title: 'Copy',
287
+ onClick: function onClick() {
288
+ var _api$core, _api$floatingToolbar;
289
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute( // @ts-ignore
290
+ api === null || api === void 0 || (_api$floatingToolbar = api.floatingToolbar) === null || _api$floatingToolbar === void 0 ? void 0 : _api$floatingToolbar.commands.copyNode(panelNodeType));
291
+ return true;
292
+ },
293
+ icon: /*#__PURE__*/_react.default.createElement(_copy.default, {
294
+ label: "Copy"
295
+ })
296
+ }, {
297
+ title: 'Delete',
298
+ onClick: (0, _actions.removePanel)(editorAnalyticsAPI),
299
+ icon: /*#__PURE__*/_react.default.createElement(_delete.default, {
300
+ label: "Delete"
301
+ })
302
+ }]
303
+ }];
304
+ items.push.apply(items, overflowMenuConfig);
308
305
  }
309
306
  return items;
310
307
  };
@@ -326,7 +323,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig(stat
326
323
  };
327
324
 
328
325
  // force toolbar to be turned on
329
- var items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state);
326
+ var items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state, (0, _experiments.editorExperiment)('platform_editor_controls', 'variant1') ? api : undefined);
330
327
  var getDomRef = function getDomRef(editorView) {
331
328
  var domAtPos = editorView.domAtPos.bind(editorView);
332
329
  var element = (0, _utils.findDomRefAtPos)(panelObject.pos, domAtPos);
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import { PanelType } from '@atlaskit/adf-schema';
2
3
  import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
3
4
  import { withAnalytics } from '@atlaskit/editor-common/editor-analytics';
@@ -5,6 +6,7 @@ import commonMessages, { panelMessages as messages } from '@atlaskit/editor-comm
5
6
  import { getPanelTypeBackgroundNoTokens } from '@atlaskit/editor-common/panel';
6
7
  import { DEFAULT_BORDER_COLOR, panelBackgroundPalette } from '@atlaskit/editor-common/ui-color';
7
8
  import { findDomRefAtPos } from '@atlaskit/editor-prosemirror/utils';
9
+ import CopyIcon from '@atlaskit/icon/core/copy';
8
10
  import CrossCircleIcon from '@atlaskit/icon/core/cross-circle';
9
11
  import DeleteIcon from '@atlaskit/icon/core/delete';
10
12
  import DiscoveryIcon from '@atlaskit/icon/core/discovery';
@@ -48,7 +50,7 @@ export const panelIconMap = {
48
50
  id: 'atlassian-tip'
49
51
  }
50
52
  };
51
- export const getToolbarItems = (formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state) => {
53
+ export const getToolbarItems = (formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state, api) => {
52
54
  // TODO: ED-14403 investigate why these titles are not getting translated for the tooltips
53
55
  const items = [{
54
56
  id: 'editor.panel.info',
@@ -259,36 +261,31 @@ export const getToolbarItems = (formatMessage, panelNodeType, isCustomPanelEnabl
259
261
  tabIndex: null
260
262
  });
261
263
  } else {
262
- items.push({
263
- type: 'separator'
264
+ const overflowMenuConfig = [{
265
+ type: 'separator',
266
+ fullHeight: true
264
267
  }, {
265
- id: 'editor.panel.delete',
266
- type: 'button',
267
- appearance: 'danger',
268
- focusEditoronEnter: true,
269
- icon: DeleteIcon,
270
- iconFallback: RemoveIcon,
271
- onClick: removePanel(editorAnalyticsAPI),
272
- onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
273
- onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
274
- onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
275
- onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
276
- title: formatMessage(commonMessages.remove),
277
- tabIndex: null
278
- });
279
- if (state) {
280
- items.push({
281
- type: 'separator'
282
- });
283
- items.push({
284
- type: 'copy-button',
285
- items: [{
286
- state,
287
- formatMessage,
288
- nodeType: panelNodeType
289
- }]
290
- });
291
- }
268
+ type: 'overflow-dropdown',
269
+ options: [{
270
+ title: 'Copy',
271
+ onClick: () => {
272
+ var _api$core, _api$floatingToolbar;
273
+ api === null || api === void 0 ? void 0 : (_api$core = api.core) === null || _api$core === void 0 ? void 0 : _api$core.actions.execute( // @ts-ignore
274
+ api === null || api === void 0 ? void 0 : (_api$floatingToolbar = api.floatingToolbar) === null || _api$floatingToolbar === void 0 ? void 0 : _api$floatingToolbar.commands.copyNode(panelNodeType));
275
+ return true;
276
+ },
277
+ icon: /*#__PURE__*/React.createElement(CopyIcon, {
278
+ label: "Copy"
279
+ })
280
+ }, {
281
+ title: 'Delete',
282
+ onClick: removePanel(editorAnalyticsAPI),
283
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, {
284
+ label: "Delete"
285
+ })
286
+ }]
287
+ }];
288
+ items.push(...overflowMenuConfig);
292
289
  }
293
290
  return items;
294
291
  };
@@ -310,7 +307,7 @@ export const getToolbarConfig = (state, intl, options = {}, providerFactory, api
310
307
  };
311
308
 
312
309
  // force toolbar to be turned on
313
- const items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 ? void 0 : (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state);
310
+ const items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 ? void 0 : (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state, editorExperiment('platform_editor_controls', 'variant1') ? api : undefined);
314
311
  const getDomRef = editorView => {
315
312
  const domAtPos = editorView.domAtPos.bind(editorView);
316
313
  const element = findDomRefAtPos(panelObject.pos, domAtPos);
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
3
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ import React from 'react';
4
5
  import { PanelType } from '@atlaskit/adf-schema';
5
6
  import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
6
7
  import { withAnalytics } from '@atlaskit/editor-common/editor-analytics';
@@ -8,6 +9,7 @@ import commonMessages, { panelMessages as messages } from '@atlaskit/editor-comm
8
9
  import { getPanelTypeBackgroundNoTokens } from '@atlaskit/editor-common/panel';
9
10
  import { DEFAULT_BORDER_COLOR, panelBackgroundPalette } from '@atlaskit/editor-common/ui-color';
10
11
  import { findDomRefAtPos } from '@atlaskit/editor-prosemirror/utils';
12
+ import CopyIcon from '@atlaskit/icon/core/copy';
11
13
  import CrossCircleIcon from '@atlaskit/icon/core/cross-circle';
12
14
  import DeleteIcon from '@atlaskit/icon/core/delete';
13
15
  import DiscoveryIcon from '@atlaskit/icon/core/discovery';
@@ -44,7 +46,7 @@ export var panelIconMap = _defineProperty(_defineProperty(_defineProperty(_defin
44
46
  shortName: ':tip:',
45
47
  id: 'atlassian-tip'
46
48
  });
47
- export var getToolbarItems = function getToolbarItems(formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state) {
49
+ export var getToolbarItems = function getToolbarItems(formatMessage, panelNodeType, isCustomPanelEnabled, isCustomPanelEditable, providerFactory, hoverDecoration, editorAnalyticsAPI, activePanelType, activePanelColor, activePanelIcon, state, api) {
48
50
  // TODO: ED-14403 investigate why these titles are not getting translated for the tooltips
49
51
  var items = [{
50
52
  id: 'editor.panel.info',
@@ -265,36 +267,31 @@ export var getToolbarItems = function getToolbarItems(formatMessage, panelNodeTy
265
267
  tabIndex: null
266
268
  });
267
269
  } else {
268
- items.push({
269
- type: 'separator'
270
+ var overflowMenuConfig = [{
271
+ type: 'separator',
272
+ fullHeight: true
270
273
  }, {
271
- id: 'editor.panel.delete',
272
- type: 'button',
273
- appearance: 'danger',
274
- focusEditoronEnter: true,
275
- icon: DeleteIcon,
276
- iconFallback: RemoveIcon,
277
- onClick: removePanel(editorAnalyticsAPI),
278
- onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
279
- onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
280
- onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, true),
281
- onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(panelNodeType, false),
282
- title: formatMessage(commonMessages.remove),
283
- tabIndex: null
284
- });
285
- if (state) {
286
- items.push({
287
- type: 'separator'
288
- });
289
- items.push({
290
- type: 'copy-button',
291
- items: [{
292
- state: state,
293
- formatMessage: formatMessage,
294
- nodeType: panelNodeType
295
- }]
296
- });
297
- }
274
+ type: 'overflow-dropdown',
275
+ options: [{
276
+ title: 'Copy',
277
+ onClick: function onClick() {
278
+ var _api$core, _api$floatingToolbar;
279
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute( // @ts-ignore
280
+ api === null || api === void 0 || (_api$floatingToolbar = api.floatingToolbar) === null || _api$floatingToolbar === void 0 ? void 0 : _api$floatingToolbar.commands.copyNode(panelNodeType));
281
+ return true;
282
+ },
283
+ icon: /*#__PURE__*/React.createElement(CopyIcon, {
284
+ label: "Copy"
285
+ })
286
+ }, {
287
+ title: 'Delete',
288
+ onClick: removePanel(editorAnalyticsAPI),
289
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, {
290
+ label: "Delete"
291
+ })
292
+ }]
293
+ }];
294
+ items.push.apply(items, overflowMenuConfig);
298
295
  }
299
296
  return items;
300
297
  };
@@ -316,7 +313,7 @@ export var getToolbarConfig = function getToolbarConfig(state, intl) {
316
313
  };
317
314
 
318
315
  // force toolbar to be turned on
319
- var items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state);
316
+ var items = getToolbarItems(formatMessage, nodeType, options.allowCustomPanel || false, options.allowCustomPanel && options.allowCustomPanelEdit || false, providerFactory, api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, panelType, options.allowCustomPanel ? panelColor : undefined, options.allowCustomPanel ? panelIcon || isStandardPanel(panelType) : undefined, state, editorExperiment('platform_editor_controls', 'variant1') ? api : undefined);
320
317
  var getDomRef = function getDomRef(editorView) {
321
318
  var domAtPos = editorView.domAtPos.bind(editorView);
322
319
  var element = findDomRefAtPos(panelObject.pos, domAtPos);
@@ -11,5 +11,5 @@ import type { EmojiInfo, PanelPluginOptions } from '../panelPluginType';
11
11
  export declare const panelIconMap: {
12
12
  [key in Exclude<PanelType, PanelType.CUSTOM>]: EmojiInfo;
13
13
  };
14
- export declare const getToolbarItems: (formatMessage: IntlShape['formatMessage'], panelNodeType: NodeType, isCustomPanelEnabled: boolean, isCustomPanelEditable: boolean, providerFactory: ProviderFactory, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, activePanelType?: string, activePanelColor?: string, activePanelIcon?: string, state?: EditorState) => FloatingToolbarItem<Command>[];
14
+ export declare const getToolbarItems: (formatMessage: IntlShape['formatMessage'], panelNodeType: NodeType, isCustomPanelEnabled: boolean, isCustomPanelEditable: boolean, providerFactory: ProviderFactory, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, activePanelType?: string, activePanelColor?: string, activePanelIcon?: string, state?: EditorState, api?: ExtractInjectionAPI<PanelPlugin>) => FloatingToolbarItem<Command>[];
15
15
  export declare const getToolbarConfig: (state: EditorState, intl: IntlShape, options: PanelPluginOptions | undefined, providerFactory: ProviderFactory, api: ExtractInjectionAPI<PanelPlugin> | undefined) => FloatingToolbarConfig | undefined;
@@ -11,5 +11,5 @@ import type { EmojiInfo, PanelPluginOptions } from '../panelPluginType';
11
11
  export declare const panelIconMap: {
12
12
  [key in Exclude<PanelType, PanelType.CUSTOM>]: EmojiInfo;
13
13
  };
14
- export declare const getToolbarItems: (formatMessage: IntlShape['formatMessage'], panelNodeType: NodeType, isCustomPanelEnabled: boolean, isCustomPanelEditable: boolean, providerFactory: ProviderFactory, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, activePanelType?: string, activePanelColor?: string, activePanelIcon?: string, state?: EditorState) => FloatingToolbarItem<Command>[];
14
+ export declare const getToolbarItems: (formatMessage: IntlShape['formatMessage'], panelNodeType: NodeType, isCustomPanelEnabled: boolean, isCustomPanelEditable: boolean, providerFactory: ProviderFactory, hoverDecoration: HoverDecorationHandler | undefined, editorAnalyticsAPI: EditorAnalyticsAPI | undefined, activePanelType?: string, activePanelColor?: string, activePanelIcon?: string, state?: EditorState, api?: ExtractInjectionAPI<PanelPlugin>) => FloatingToolbarItem<Command>[];
15
15
  export declare const getToolbarConfig: (state: EditorState, intl: IntlShape, options: PanelPluginOptions | undefined, providerFactory: ProviderFactory, api: ExtractInjectionAPI<PanelPlugin> | undefined) => FloatingToolbarConfig | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-panel",
3
- "version": "4.2.2",
3
+ "version": "4.2.3",
4
4
  "description": "Panel plugin for @atlaskit/editor-core.",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",