@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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
},
|