@atlaskit/editor-synced-block-provider 3.2.2 → 3.4.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 +18 -0
- package/dist/cjs/clients/block-service/blockService.js +92 -46
- package/dist/cjs/providers/block-service/blockServiceAPI.js +275 -76
- package/dist/cjs/providers/syncBlockProvider.js +85 -47
- package/dist/es2019/clients/block-service/blockService.js +24 -0
- package/dist/es2019/providers/block-service/blockServiceAPI.js +118 -2
- package/dist/es2019/providers/syncBlockProvider.js +26 -13
- package/dist/esm/clients/block-service/blockService.js +91 -45
- package/dist/esm/providers/block-service/blockServiceAPI.js +276 -75
- package/dist/esm/providers/syncBlockProvider.js +85 -47
- package/dist/types/clients/block-service/blockService.d.ts +16 -0
- package/dist/types/providers/block-service/blockServiceAPI.d.ts +11 -0
- package/dist/types/providers/syncBlockProvider.d.ts +1 -1
- package/dist/types/providers/types.d.ts +1 -0
- package/dist/types-ts4.5/clients/block-service/blockService.d.ts +16 -0
- package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +11 -0
- package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +1 -1
- package/dist/types-ts4.5/providers/types.d.ts +1 -0
- package/package.json +8 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
1
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
3
|
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
4
4
|
import _createClass from "@babel/runtime/helpers/createClass";
|
|
5
5
|
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
@@ -10,6 +10,7 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
|
10
10
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
11
11
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
12
12
|
import { useMemo } from 'react';
|
|
13
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
13
14
|
import { getPageIdAndTypeFromConfluencePageAri } from '../clients/confluence/ari';
|
|
14
15
|
import { fetchConfluencePageInfo } from '../clients/confluence/sourceInfo';
|
|
15
16
|
import { SyncBlockError } from '../common/types';
|
|
@@ -66,7 +67,7 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
/**
|
|
69
|
-
* Fetch the data from the fetch provider
|
|
70
|
+
* Fetch the data from the fetch provider using batch API
|
|
70
71
|
*
|
|
71
72
|
* @param nodes
|
|
72
73
|
*
|
|
@@ -74,30 +75,66 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
74
75
|
*/
|
|
75
76
|
}, {
|
|
76
77
|
key: "fetchNodesData",
|
|
77
|
-
value: function
|
|
78
|
-
var
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
value: (function () {
|
|
79
|
+
var _fetchNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(nodes) {
|
|
80
|
+
var _this2 = this;
|
|
81
|
+
var resourceIdSet, resourceIds;
|
|
82
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
83
|
+
while (1) switch (_context.prev = _context.next) {
|
|
84
|
+
case 0:
|
|
85
|
+
resourceIdSet = new Set(nodes.map(function (node) {
|
|
86
|
+
return node.attrs.resourceId;
|
|
87
|
+
}));
|
|
88
|
+
resourceIds = _toConsumableArray(resourceIdSet);
|
|
89
|
+
if (!fg('platform_synced_block_dogfooding')) {
|
|
90
|
+
_context.next = 14;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
_context.prev = 3;
|
|
94
|
+
_context.next = 6;
|
|
95
|
+
return this.fetchProvider.batchFetchData(resourceIds);
|
|
96
|
+
case 6:
|
|
97
|
+
return _context.abrupt("return", _context.sent);
|
|
98
|
+
case 9:
|
|
99
|
+
_context.prev = 9;
|
|
100
|
+
_context.t0 = _context["catch"](3);
|
|
101
|
+
return _context.abrupt("return", resourceIds.map(function (resourceId) {
|
|
102
|
+
return {
|
|
103
|
+
error: SyncBlockError.Errored,
|
|
104
|
+
resourceId: resourceId
|
|
105
|
+
};
|
|
106
|
+
}));
|
|
107
|
+
case 12:
|
|
108
|
+
_context.next = 15;
|
|
109
|
+
break;
|
|
110
|
+
case 14:
|
|
111
|
+
return _context.abrupt("return", Promise.allSettled(resourceIds.map(function (resourceId) {
|
|
112
|
+
return _this2.fetchProvider.fetchData(resourceId).then(function (data) {
|
|
113
|
+
return data;
|
|
114
|
+
}, function () {
|
|
115
|
+
return {
|
|
116
|
+
error: SyncBlockError.Errored,
|
|
117
|
+
resourceId: resourceId
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
})).then(function (results) {
|
|
121
|
+
return results.filter(function (result) {
|
|
122
|
+
return result.status === 'fulfilled';
|
|
123
|
+
}).map(function (result) {
|
|
124
|
+
return result.value;
|
|
125
|
+
});
|
|
126
|
+
}));
|
|
127
|
+
case 15:
|
|
128
|
+
case "end":
|
|
129
|
+
return _context.stop();
|
|
130
|
+
}
|
|
131
|
+
}, _callee, this, [[3, 9]]);
|
|
81
132
|
}));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
error: SyncBlockError.Errored,
|
|
89
|
-
resourceId: resourceId
|
|
90
|
-
};
|
|
91
|
-
});
|
|
92
|
-
})).then(function (results) {
|
|
93
|
-
return results.filter(function (result) {
|
|
94
|
-
return result.status === 'fulfilled';
|
|
95
|
-
}).map(function (result) {
|
|
96
|
-
return result.value;
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
133
|
+
function fetchNodesData(_x) {
|
|
134
|
+
return _fetchNodesData.apply(this, arguments);
|
|
135
|
+
}
|
|
136
|
+
return fetchNodesData;
|
|
137
|
+
}()
|
|
101
138
|
/**
|
|
102
139
|
* Write the data to the write provider
|
|
103
140
|
*
|
|
@@ -107,22 +144,23 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
107
144
|
* @returns Array of {resourceId?: string, error?: string}.
|
|
108
145
|
* resourceId: resource id of the node if write successfully , error: reason for when write failed
|
|
109
146
|
*/
|
|
147
|
+
)
|
|
110
148
|
}, {
|
|
111
149
|
key: "writeNodesData",
|
|
112
150
|
value: (function () {
|
|
113
|
-
var _writeNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function
|
|
151
|
+
var _writeNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(nodes, data) {
|
|
114
152
|
var _this3 = this;
|
|
115
153
|
var results;
|
|
116
|
-
return _regeneratorRuntime.wrap(function
|
|
117
|
-
while (1) switch (
|
|
154
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
155
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
118
156
|
case 0:
|
|
119
157
|
if (this.writeProvider) {
|
|
120
|
-
|
|
158
|
+
_context2.next = 2;
|
|
121
159
|
break;
|
|
122
160
|
}
|
|
123
|
-
return
|
|
161
|
+
return _context2.abrupt("return", Promise.reject(new Error('Write provider not set')));
|
|
124
162
|
case 2:
|
|
125
|
-
|
|
163
|
+
_context2.next = 4;
|
|
126
164
|
return Promise.allSettled(nodes.map(function (_node, index) {
|
|
127
165
|
var _this3$writeProvider;
|
|
128
166
|
if (!_this3.writeProvider) {
|
|
@@ -134,8 +172,8 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
134
172
|
return (_this3$writeProvider = _this3.writeProvider) === null || _this3$writeProvider === void 0 ? void 0 : _this3$writeProvider.writeData(data[index]);
|
|
135
173
|
}));
|
|
136
174
|
case 4:
|
|
137
|
-
results =
|
|
138
|
-
return
|
|
175
|
+
results = _context2.sent;
|
|
176
|
+
return _context2.abrupt("return", results.map(function (result) {
|
|
139
177
|
if (result.status === 'fulfilled') {
|
|
140
178
|
return result.value;
|
|
141
179
|
} else {
|
|
@@ -146,11 +184,11 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
146
184
|
}));
|
|
147
185
|
case 6:
|
|
148
186
|
case "end":
|
|
149
|
-
return
|
|
187
|
+
return _context2.stop();
|
|
150
188
|
}
|
|
151
|
-
},
|
|
189
|
+
}, _callee2, this);
|
|
152
190
|
}));
|
|
153
|
-
function writeNodesData(
|
|
191
|
+
function writeNodesData(_x2, _x3) {
|
|
154
192
|
return _writeNodesData.apply(this, arguments);
|
|
155
193
|
}
|
|
156
194
|
return writeNodesData;
|
|
@@ -180,19 +218,19 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
180
218
|
}, {
|
|
181
219
|
key: "deleteNodesData",
|
|
182
220
|
value: (function () {
|
|
183
|
-
var _deleteNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function
|
|
221
|
+
var _deleteNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(resourceIds) {
|
|
184
222
|
var _this4 = this;
|
|
185
223
|
var results;
|
|
186
|
-
return _regeneratorRuntime.wrap(function
|
|
187
|
-
while (1) switch (
|
|
224
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
225
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
188
226
|
case 0:
|
|
189
227
|
if (this.writeProvider) {
|
|
190
|
-
|
|
228
|
+
_context3.next = 2;
|
|
191
229
|
break;
|
|
192
230
|
}
|
|
193
|
-
return
|
|
231
|
+
return _context3.abrupt("return", Promise.reject(new Error('Write provider not set')));
|
|
194
232
|
case 2:
|
|
195
|
-
|
|
233
|
+
_context3.next = 4;
|
|
196
234
|
return Promise.allSettled(resourceIds.map(function (resourceId) {
|
|
197
235
|
if (!_this4.writeProvider) {
|
|
198
236
|
return Promise.reject('Write provider not set');
|
|
@@ -200,8 +238,8 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
200
238
|
return _this4.writeProvider.deleteData(resourceId);
|
|
201
239
|
}));
|
|
202
240
|
case 4:
|
|
203
|
-
results =
|
|
204
|
-
return
|
|
241
|
+
results = _context3.sent;
|
|
242
|
+
return _context3.abrupt("return", results.map(function (result, index) {
|
|
205
243
|
if (result.status === 'fulfilled') {
|
|
206
244
|
return result.value;
|
|
207
245
|
} else {
|
|
@@ -214,11 +252,11 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
|
|
|
214
252
|
}));
|
|
215
253
|
case 6:
|
|
216
254
|
case "end":
|
|
217
|
-
return
|
|
255
|
+
return _context3.stop();
|
|
218
256
|
}
|
|
219
|
-
},
|
|
257
|
+
}, _callee3, this);
|
|
220
258
|
}));
|
|
221
|
-
function deleteNodesData(
|
|
259
|
+
function deleteNodesData(_x4) {
|
|
222
260
|
return _deleteNodesData.apply(this, arguments);
|
|
223
261
|
}
|
|
224
262
|
return deleteNodesData;
|
|
@@ -90,11 +90,27 @@ type UpdateReferenceSyncedBlockOnDocumentRequest = {
|
|
|
90
90
|
documentAri: string;
|
|
91
91
|
noContent?: boolean;
|
|
92
92
|
};
|
|
93
|
+
export type BatchRetrieveSyncedBlocksRequest = {
|
|
94
|
+
blockAris: string[];
|
|
95
|
+
};
|
|
96
|
+
export type BatchRetrieveSyncedBlocksResponse = {
|
|
97
|
+
error?: Array<BlockContentErrorResponse>;
|
|
98
|
+
success?: Array<BlockContentResponse>;
|
|
99
|
+
};
|
|
93
100
|
export declare class BlockError extends Error {
|
|
94
101
|
readonly status: number;
|
|
95
102
|
constructor(status: number);
|
|
96
103
|
}
|
|
97
104
|
export declare const getSyncedBlockContent: ({ blockAri, }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
|
|
105
|
+
/**
|
|
106
|
+
* Batch retrieves multiple synced blocks by their ARIs.
|
|
107
|
+
*
|
|
108
|
+
* Calls the Block Service API endpoint: `POST /v1/block/batch-retrieve`
|
|
109
|
+
*
|
|
110
|
+
* @param blockAris - Array of block ARIs to retrieve
|
|
111
|
+
* @returns A promise containing arrays of successfully fetched blocks and any errors encountered
|
|
112
|
+
*/
|
|
113
|
+
export declare const batchRetrieveSyncedBlocks: ({ blockAris, }: BatchRetrieveSyncedBlocksRequest) => Promise<BatchRetrieveSyncedBlocksResponse>;
|
|
98
114
|
export declare const deleteSyncedBlock: ({ blockAri }: DeleteSyncedBlockRequest) => Promise<void>;
|
|
99
115
|
export declare const updateSyncedBlock: ({ blockAri, content, stepVersion, }: UpdateSyncedBlockRequest) => Promise<void>;
|
|
100
116
|
export declare const createSyncedBlock: ({ blockAri, blockInstanceId, sourceAri, product, content, stepVersion, }: CreateSyncedBlockRequest) => Promise<BlockContentResponse>;
|
|
@@ -11,6 +11,17 @@ declare class BlockServiceADFFetchProvider implements ADFFetchProvider {
|
|
|
11
11
|
private cloudId;
|
|
12
12
|
constructor({ cloudId }: BlockServiceADFFetchProviderProps);
|
|
13
13
|
fetchData(resourceId: string): Promise<SyncBlockInstance>;
|
|
14
|
+
/**
|
|
15
|
+
* Extracts the resourceId from a block ARI.
|
|
16
|
+
* Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
|
|
17
|
+
*/
|
|
18
|
+
private extractResourceIdFromBlockAri;
|
|
19
|
+
/**
|
|
20
|
+
* Batch fetches multiple synced blocks by their resource IDs.
|
|
21
|
+
* @param resourceIds - Array of resource IDs to fetch
|
|
22
|
+
* @returns Array of SyncBlockInstance results
|
|
23
|
+
*/
|
|
24
|
+
batchFetchData(resourceIds: string[]): Promise<SyncBlockInstance[]>;
|
|
14
25
|
}
|
|
15
26
|
interface BlockServiceADFWriteProviderProps {
|
|
16
27
|
cloudId: string;
|
|
@@ -33,7 +33,7 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
|
|
|
33
33
|
*/
|
|
34
34
|
nodeDataKey(node: SyncBlockNode): string;
|
|
35
35
|
/**
|
|
36
|
-
* Fetch the data from the fetch provider
|
|
36
|
+
* Fetch the data from the fetch provider using batch API
|
|
37
37
|
*
|
|
38
38
|
* @param nodes
|
|
39
39
|
*
|
|
@@ -44,6 +44,7 @@ export type UpdateReferenceSyncBlockResult = {
|
|
|
44
44
|
success: boolean;
|
|
45
45
|
};
|
|
46
46
|
export interface ADFFetchProvider {
|
|
47
|
+
batchFetchData: (resourceIds: ResourceId[]) => Promise<SyncBlockInstance[]>;
|
|
47
48
|
fetchData: (resourceId: ResourceId) => Promise<SyncBlockInstance>;
|
|
48
49
|
}
|
|
49
50
|
export interface ADFWriteProvider {
|
|
@@ -90,11 +90,27 @@ type UpdateReferenceSyncedBlockOnDocumentRequest = {
|
|
|
90
90
|
documentAri: string;
|
|
91
91
|
noContent?: boolean;
|
|
92
92
|
};
|
|
93
|
+
export type BatchRetrieveSyncedBlocksRequest = {
|
|
94
|
+
blockAris: string[];
|
|
95
|
+
};
|
|
96
|
+
export type BatchRetrieveSyncedBlocksResponse = {
|
|
97
|
+
error?: Array<BlockContentErrorResponse>;
|
|
98
|
+
success?: Array<BlockContentResponse>;
|
|
99
|
+
};
|
|
93
100
|
export declare class BlockError extends Error {
|
|
94
101
|
readonly status: number;
|
|
95
102
|
constructor(status: number);
|
|
96
103
|
}
|
|
97
104
|
export declare const getSyncedBlockContent: ({ blockAri, }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
|
|
105
|
+
/**
|
|
106
|
+
* Batch retrieves multiple synced blocks by their ARIs.
|
|
107
|
+
*
|
|
108
|
+
* Calls the Block Service API endpoint: `POST /v1/block/batch-retrieve`
|
|
109
|
+
*
|
|
110
|
+
* @param blockAris - Array of block ARIs to retrieve
|
|
111
|
+
* @returns A promise containing arrays of successfully fetched blocks and any errors encountered
|
|
112
|
+
*/
|
|
113
|
+
export declare const batchRetrieveSyncedBlocks: ({ blockAris, }: BatchRetrieveSyncedBlocksRequest) => Promise<BatchRetrieveSyncedBlocksResponse>;
|
|
98
114
|
export declare const deleteSyncedBlock: ({ blockAri }: DeleteSyncedBlockRequest) => Promise<void>;
|
|
99
115
|
export declare const updateSyncedBlock: ({ blockAri, content, stepVersion, }: UpdateSyncedBlockRequest) => Promise<void>;
|
|
100
116
|
export declare const createSyncedBlock: ({ blockAri, blockInstanceId, sourceAri, product, content, stepVersion, }: CreateSyncedBlockRequest) => Promise<BlockContentResponse>;
|
|
@@ -11,6 +11,17 @@ declare class BlockServiceADFFetchProvider implements ADFFetchProvider {
|
|
|
11
11
|
private cloudId;
|
|
12
12
|
constructor({ cloudId }: BlockServiceADFFetchProviderProps);
|
|
13
13
|
fetchData(resourceId: string): Promise<SyncBlockInstance>;
|
|
14
|
+
/**
|
|
15
|
+
* Extracts the resourceId from a block ARI.
|
|
16
|
+
* Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
|
|
17
|
+
*/
|
|
18
|
+
private extractResourceIdFromBlockAri;
|
|
19
|
+
/**
|
|
20
|
+
* Batch fetches multiple synced blocks by their resource IDs.
|
|
21
|
+
* @param resourceIds - Array of resource IDs to fetch
|
|
22
|
+
* @returns Array of SyncBlockInstance results
|
|
23
|
+
*/
|
|
24
|
+
batchFetchData(resourceIds: string[]): Promise<SyncBlockInstance[]>;
|
|
14
25
|
}
|
|
15
26
|
interface BlockServiceADFWriteProviderProps {
|
|
16
27
|
cloudId: string;
|
|
@@ -33,7 +33,7 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
|
|
|
33
33
|
*/
|
|
34
34
|
nodeDataKey(node: SyncBlockNode): string;
|
|
35
35
|
/**
|
|
36
|
-
* Fetch the data from the fetch provider
|
|
36
|
+
* Fetch the data from the fetch provider using batch API
|
|
37
37
|
*
|
|
38
38
|
* @param nodes
|
|
39
39
|
*
|
|
@@ -44,6 +44,7 @@ export type UpdateReferenceSyncBlockResult = {
|
|
|
44
44
|
success: boolean;
|
|
45
45
|
};
|
|
46
46
|
export interface ADFFetchProvider {
|
|
47
|
+
batchFetchData: (resourceIds: ResourceId[]) => Promise<SyncBlockInstance[]>;
|
|
47
48
|
fetchData: (resourceId: ResourceId) => Promise<SyncBlockInstance>;
|
|
48
49
|
}
|
|
49
50
|
export interface ADFWriteProvider {
|
package/package.json
CHANGED
|
@@ -28,12 +28,13 @@
|
|
|
28
28
|
"@atlaskit/editor-json-transformer": "^8.31.0",
|
|
29
29
|
"@atlaskit/editor-prosemirror": "^7.2.0",
|
|
30
30
|
"@atlaskit/node-data-provider": "^8.0.0",
|
|
31
|
+
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
31
32
|
"@babel/runtime": "^7.0.0",
|
|
32
33
|
"@compiled/react": "^0.18.6",
|
|
33
34
|
"uuid": "^3.1.0"
|
|
34
35
|
},
|
|
35
36
|
"peerDependencies": {
|
|
36
|
-
"@atlaskit/editor-common": "^111.
|
|
37
|
+
"@atlaskit/editor-common": "^111.2.0",
|
|
37
38
|
"react": "^18.2.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
@@ -76,11 +77,16 @@
|
|
|
76
77
|
}
|
|
77
78
|
},
|
|
78
79
|
"name": "@atlaskit/editor-synced-block-provider",
|
|
79
|
-
"version": "3.
|
|
80
|
+
"version": "3.4.0",
|
|
80
81
|
"description": "Synced Block Provider for @atlaskit/editor-plugin-synced-block",
|
|
81
82
|
"author": "Atlassian Pty Ltd",
|
|
82
83
|
"license": "Apache-2.0",
|
|
83
84
|
"publishConfig": {
|
|
84
85
|
"registry": "https://registry.npmjs.org/"
|
|
86
|
+
},
|
|
87
|
+
"platform-feature-flags": {
|
|
88
|
+
"platform_synced_block_dogfooding": {
|
|
89
|
+
"type": "boolean"
|
|
90
|
+
}
|
|
85
91
|
}
|
|
86
92
|
}
|