@atlaskit/editor-plugin-paste 13.0.6 → 13.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/editor-plugin-paste
2
2
 
3
+ ## 13.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`1a60a3ac641f9`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1a60a3ac641f9) -
8
+ Add a track analytics event that fires when a synced block reference is pasted into a surface that
9
+ does not support synced blocks, allowing these insertion attempts to be measured directly. The
10
+ event is gated behind the `platform_editor_blocks_patch_2` feature gate.
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
3
16
  ## 13.0.6
4
17
 
5
18
  ### Patch Changes
@@ -8,7 +8,9 @@ exports.handleSyncBlocksPaste = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _adfSchema = require("@atlaskit/adf-schema");
11
+ var _analytics = require("@atlaskit/editor-common/analytics");
11
12
  var _utils = require("@atlaskit/editor-common/utils");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
14
  var _actions = require("../../editor-actions/actions");
13
15
  var _pastePluginType = require("../../pastePluginType");
14
16
  var _pluginFactory = require("../../pm-plugins/plugin-factory");
@@ -71,6 +73,29 @@ var hasSyncedBlockInRawHtml = function hasSyncedBlockInRawHtml(rawHtml) {
71
73
  return rawHtml.includes('data-sync-block="');
72
74
  };
73
75
 
76
+ /**
77
+ * Extracts the source product of a synced block reference from the pasted raw HTML.
78
+ *
79
+ * A reference block's `data-resource-id` is prefixed with the source product, e.g.
80
+ * `confluence-page/5769323474/cdf6a1bc-...`. We only ever emit a controlled,
81
+ * enumerated value (`confluence-page` | `jira-work-item`) so the resulting
82
+ * analytics attribute can never carry user-generated content. Returns `undefined`
83
+ * when the marker is missing or the prefix is unrecognised.
84
+ *
85
+ * Note: this intentionally mirrors `getSourceProductFromResourceIdSafe` from
86
+ * `@atlaskit/editor-synced-block-provider/utils` but is duplicated locally to
87
+ * avoid adding a cross-package dependency from the paste plugin onto the
88
+ * synced-block provider.
89
+ */
90
+ var getSourceProductFromRawHtml = function getSourceProductFromRawHtml(rawHtml) {
91
+ // The capture group already constrains the match to exactly these two literals,
92
+ // so the assertion is safe. This mirrors `getContentIdAndProductFromResourceId`
93
+ // in `@atlaskit/editor-synced-block-provider`.
94
+ // eslint-disable-next-line require-unicode-regexp
95
+ var match = rawHtml.match(/data-resource-id="(confluence-page|jira-work-item)\//);
96
+ return match === null || match === void 0 ? void 0 : match[1];
97
+ };
98
+
74
99
  /**
75
100
  * If we are copying from editor, transform the copied source or reference sync block to a new reference sync block
76
101
  * Otherwise, (e.g. if copying from renderer), flatten out the content and remove the sync block
@@ -90,15 +115,36 @@ var handleSyncBlocksPaste = exports.handleSyncBlocksPaste = function handleSyncB
90
115
  }
91
116
  return node;
92
117
  });
93
- if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock && !hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
94
- var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
95
- showWarningFlag({
96
- api: api,
97
- title: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
98
- description: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
99
- urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
100
- urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
101
- });
118
+
119
+ // A synced block reference was on the clipboard (`isSyncedBlockInRawHtml`) but the
120
+ // destination schema dropped it (`!hasSyncedBlockInSlice`) — i.e. the user attempted
121
+ // to insert a synced block into a surface that does not support synced blocks (e.g.
122
+ // Bitbucket). Emit a track event so this can be measured directly instead of relying
123
+ // on the "copied-but-never-landed" proxy. See EDITOR-7749.
124
+ if (!hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
125
+ if ((0, _platformFeatureFlags.fg)('platform_editor_blocks_patch_2')) {
126
+ var _api$analytics;
127
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || (_api$analytics = _api$analytics.actions) === null || _api$analytics === void 0 || _api$analytics.fireAnalyticsEvent({
128
+ eventType: _analytics.EVENT_TYPE.TRACK,
129
+ action: _analytics.ACTION.INSERT_ATTEMPTED,
130
+ actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
131
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.UNSUPPORTED_SURFACE,
132
+ attributes: {
133
+ sourceProduct: getSourceProductFromRawHtml(rawHtml),
134
+ pasteSource: pasteSource
135
+ }
136
+ });
137
+ }
138
+ if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock) {
139
+ var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
140
+ showWarningFlag({
141
+ api: api,
142
+ title: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
143
+ description: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
144
+ urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
145
+ urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
146
+ });
147
+ }
102
148
  }
103
149
  return slice;
104
150
  };
@@ -1,5 +1,7 @@
1
1
  import { uuid } from '@atlaskit/adf-schema';
2
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
2
3
  import { mapSlice } from '@atlaskit/editor-common/utils';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
3
5
  import { PastePluginActionTypes } from '../../editor-actions/actions';
4
6
  import { FLAG_TYPE } from '../../pastePluginType';
5
7
  import { pluginKey } from '../../pm-plugins/plugin-factory';
@@ -63,6 +65,29 @@ const hasSyncedBlockInRawHtml = rawHtml => {
63
65
  return rawHtml.includes('data-sync-block="');
64
66
  };
65
67
 
68
+ /**
69
+ * Extracts the source product of a synced block reference from the pasted raw HTML.
70
+ *
71
+ * A reference block's `data-resource-id` is prefixed with the source product, e.g.
72
+ * `confluence-page/5769323474/cdf6a1bc-...`. We only ever emit a controlled,
73
+ * enumerated value (`confluence-page` | `jira-work-item`) so the resulting
74
+ * analytics attribute can never carry user-generated content. Returns `undefined`
75
+ * when the marker is missing or the prefix is unrecognised.
76
+ *
77
+ * Note: this intentionally mirrors `getSourceProductFromResourceIdSafe` from
78
+ * `@atlaskit/editor-synced-block-provider/utils` but is duplicated locally to
79
+ * avoid adding a cross-package dependency from the paste plugin onto the
80
+ * synced-block provider.
81
+ */
82
+ const getSourceProductFromRawHtml = rawHtml => {
83
+ // The capture group already constrains the match to exactly these two literals,
84
+ // so the assertion is safe. This mirrors `getContentIdAndProductFromResourceId`
85
+ // in `@atlaskit/editor-synced-block-provider`.
86
+ // eslint-disable-next-line require-unicode-regexp
87
+ const match = rawHtml.match(/data-resource-id="(confluence-page|jira-work-item)\//);
88
+ return match === null || match === void 0 ? void 0 : match[1];
89
+ };
90
+
66
91
  /**
67
92
  * If we are copying from editor, transform the copied source or reference sync block to a new reference sync block
68
93
  * Otherwise, (e.g. if copying from renderer), flatten out the content and remove the sync block
@@ -82,15 +107,36 @@ export const handleSyncBlocksPaste = (slice, schema, pasteSource, rawHtml, paste
82
107
  }
83
108
  return node;
84
109
  });
85
- if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock && !hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
86
- var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
87
- showWarningFlag({
88
- api,
89
- title: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
90
- description: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
91
- urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
92
- urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
93
- });
110
+
111
+ // A synced block reference was on the clipboard (`isSyncedBlockInRawHtml`) but the
112
+ // destination schema dropped it (`!hasSyncedBlockInSlice`) — i.e. the user attempted
113
+ // to insert a synced block into a surface that does not support synced blocks (e.g.
114
+ // Bitbucket). Emit a track event so this can be measured directly instead of relying
115
+ // on the "copied-but-never-landed" proxy. See EDITOR-7749.
116
+ if (!hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
117
+ if (fg('platform_editor_blocks_patch_2')) {
118
+ var _api$analytics, _api$analytics$action;
119
+ api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : (_api$analytics$action = _api$analytics.actions) === null || _api$analytics$action === void 0 ? void 0 : _api$analytics$action.fireAnalyticsEvent({
120
+ eventType: EVENT_TYPE.TRACK,
121
+ action: ACTION.INSERT_ATTEMPTED,
122
+ actionSubject: ACTION_SUBJECT.SYNCED_BLOCK,
123
+ actionSubjectId: ACTION_SUBJECT_ID.UNSUPPORTED_SURFACE,
124
+ attributes: {
125
+ sourceProduct: getSourceProductFromRawHtml(rawHtml),
126
+ pasteSource
127
+ }
128
+ });
129
+ }
130
+ if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock) {
131
+ var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
132
+ showWarningFlag({
133
+ api,
134
+ title: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
135
+ description: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
136
+ urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
137
+ urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 ? void 0 : (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
138
+ });
139
+ }
94
140
  }
95
141
  return slice;
96
142
  };
@@ -3,7 +3,9 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  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; }
4
4
  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; }
5
5
  import { uuid } from '@atlaskit/adf-schema';
6
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
6
7
  import { mapSlice } from '@atlaskit/editor-common/utils';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
7
9
  import { PastePluginActionTypes } from '../../editor-actions/actions';
8
10
  import { FLAG_TYPE } from '../../pastePluginType';
9
11
  import { pluginKey } from '../../pm-plugins/plugin-factory';
@@ -64,6 +66,29 @@ var hasSyncedBlockInRawHtml = function hasSyncedBlockInRawHtml(rawHtml) {
64
66
  return rawHtml.includes('data-sync-block="');
65
67
  };
66
68
 
69
+ /**
70
+ * Extracts the source product of a synced block reference from the pasted raw HTML.
71
+ *
72
+ * A reference block's `data-resource-id` is prefixed with the source product, e.g.
73
+ * `confluence-page/5769323474/cdf6a1bc-...`. We only ever emit a controlled,
74
+ * enumerated value (`confluence-page` | `jira-work-item`) so the resulting
75
+ * analytics attribute can never carry user-generated content. Returns `undefined`
76
+ * when the marker is missing or the prefix is unrecognised.
77
+ *
78
+ * Note: this intentionally mirrors `getSourceProductFromResourceIdSafe` from
79
+ * `@atlaskit/editor-synced-block-provider/utils` but is duplicated locally to
80
+ * avoid adding a cross-package dependency from the paste plugin onto the
81
+ * synced-block provider.
82
+ */
83
+ var getSourceProductFromRawHtml = function getSourceProductFromRawHtml(rawHtml) {
84
+ // The capture group already constrains the match to exactly these two literals,
85
+ // so the assertion is safe. This mirrors `getContentIdAndProductFromResourceId`
86
+ // in `@atlaskit/editor-synced-block-provider`.
87
+ // eslint-disable-next-line require-unicode-regexp
88
+ var match = rawHtml.match(/data-resource-id="(confluence-page|jira-work-item)\//);
89
+ return match === null || match === void 0 ? void 0 : match[1];
90
+ };
91
+
67
92
  /**
68
93
  * If we are copying from editor, transform the copied source or reference sync block to a new reference sync block
69
94
  * Otherwise, (e.g. if copying from renderer), flatten out the content and remove the sync block
@@ -83,15 +108,36 @@ export var handleSyncBlocksPaste = function handleSyncBlocksPaste(slice, schema,
83
108
  }
84
109
  return node;
85
110
  });
86
- if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock && !hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
87
- var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
88
- showWarningFlag({
89
- api: api,
90
- title: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
91
- description: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
92
- urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
93
- urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
94
- });
111
+
112
+ // A synced block reference was on the clipboard (`isSyncedBlockInRawHtml`) but the
113
+ // destination schema dropped it (`!hasSyncedBlockInSlice`) — i.e. the user attempted
114
+ // to insert a synced block into a surface that does not support synced blocks (e.g.
115
+ // Bitbucket). Emit a track event so this can be measured directly instead of relying
116
+ // on the "copied-but-never-landed" proxy. See EDITOR-7749.
117
+ if (!hasSyncedBlockInSlice && isSyncedBlockInRawHtml) {
118
+ if (fg('platform_editor_blocks_patch_2')) {
119
+ var _api$analytics;
120
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || (_api$analytics = _api$analytics.actions) === null || _api$analytics === void 0 || _api$analytics.fireAnalyticsEvent({
121
+ eventType: EVENT_TYPE.TRACK,
122
+ action: ACTION.INSERT_ATTEMPTED,
123
+ actionSubject: ACTION_SUBJECT.SYNCED_BLOCK,
124
+ actionSubjectId: ACTION_SUBJECT_ID.UNSUPPORTED_SURFACE,
125
+ attributes: {
126
+ sourceProduct: getSourceProductFromRawHtml(rawHtml),
127
+ pasteSource: pasteSource
128
+ }
129
+ });
130
+ }
131
+ if (pasteWarningOptions !== null && pasteWarningOptions !== void 0 && pasteWarningOptions.cannotPasteSyncedBlock) {
132
+ var _pasteWarningOptions$, _pasteWarningOptions$2, _pasteWarningOptions$3, _pasteWarningOptions$4;
133
+ showWarningFlag({
134
+ api: api,
135
+ title: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$ = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$ === void 0 ? void 0 : _pasteWarningOptions$.title,
136
+ description: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$2 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$2 === void 0 ? void 0 : _pasteWarningOptions$2.description,
137
+ urlText: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$3 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$3 === void 0 ? void 0 : _pasteWarningOptions$3.urlText,
138
+ urlHref: pasteWarningOptions === null || pasteWarningOptions === void 0 || (_pasteWarningOptions$4 = pasteWarningOptions.cannotPasteSyncedBlock) === null || _pasteWarningOptions$4 === void 0 ? void 0 : _pasteWarningOptions$4.urlHref
139
+ });
140
+ }
95
141
  }
96
142
  return slice;
97
143
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-paste",
3
- "version": "13.0.6",
3
+ "version": "13.1.0",
4
4
  "description": "Paste plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -41,14 +41,14 @@
41
41
  "@atlaskit/media-common": "^14.0.0",
42
42
  "@atlaskit/platform-feature-flags": "^2.0.0",
43
43
  "@atlaskit/prosemirror-history": "^1.0.0",
44
- "@atlaskit/tmp-editor-statsig": "^109.0.0",
44
+ "@atlaskit/tmp-editor-statsig": "^109.1.0",
45
45
  "@atlaskit/tokens": "^14.0.0",
46
46
  "@babel/runtime": "^7.0.0",
47
47
  "lodash": "^4.17.21",
48
48
  "uuid": "^3.1.0"
49
49
  },
50
50
  "peerDependencies": {
51
- "@atlaskit/editor-common": "^116.6.0",
51
+ "@atlaskit/editor-common": "^116.9.0",
52
52
  "react": "^18.2.0",
53
53
  "react-dom": "^18.2.0",
54
54
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
@@ -97,6 +97,10 @@
97
97
  }
98
98
  },
99
99
  "platform-feature-flags": {
100
+ "platform_editor_blocks_patch_2": {
101
+ "type": "boolean",
102
+ "referenceOnly": true
103
+ },
100
104
  "platform_editor_legacy_content_macro_insert": {
101
105
  "type": "boolean"
102
106
  },