@atlaskit/editor-synced-block-provider 2.12.2 → 2.13.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/clients/block-service/ari.js +26 -9
  3. package/dist/cjs/clients/block-service/blockService.js +6 -5
  4. package/dist/cjs/clients/confluence/contentProperty.js +4 -3
  5. package/dist/cjs/clients/confluence/sourceInfo.js +2 -1
  6. package/dist/cjs/common/types.js +5 -0
  7. package/dist/cjs/index.js +12 -6
  8. package/dist/cjs/providers/block-service/blockServiceAPI.js +79 -49
  9. package/dist/cjs/providers/confluence/confluenceContentAPI.js +6 -0
  10. package/dist/cjs/providers/syncBlockProvider.js +18 -8
  11. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +8 -0
  12. package/dist/cjs/utils/resolveSyncBlockInstance.js +3 -3
  13. package/dist/cjs/utils/retry.js +66 -0
  14. package/dist/es2019/clients/block-service/ari.js +25 -8
  15. package/dist/es2019/clients/block-service/blockService.js +6 -5
  16. package/dist/es2019/clients/confluence/contentProperty.js +4 -3
  17. package/dist/es2019/clients/confluence/sourceInfo.js +2 -1
  18. package/dist/es2019/common/types.js +5 -0
  19. package/dist/es2019/index.js +1 -1
  20. package/dist/es2019/providers/block-service/blockServiceAPI.js +43 -13
  21. package/dist/es2019/providers/confluence/confluenceContentAPI.js +4 -0
  22. package/dist/es2019/providers/syncBlockProvider.js +6 -0
  23. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +6 -0
  24. package/dist/es2019/utils/resolveSyncBlockInstance.js +3 -3
  25. package/dist/es2019/utils/retry.js +26 -0
  26. package/dist/esm/clients/block-service/ari.js +25 -8
  27. package/dist/esm/clients/block-service/blockService.js +6 -5
  28. package/dist/esm/clients/confluence/contentProperty.js +4 -3
  29. package/dist/esm/clients/confluence/sourceInfo.js +2 -1
  30. package/dist/esm/common/types.js +5 -0
  31. package/dist/esm/index.js +1 -1
  32. package/dist/esm/providers/block-service/blockServiceAPI.js +79 -50
  33. package/dist/esm/providers/confluence/confluenceContentAPI.js +6 -0
  34. package/dist/esm/providers/syncBlockProvider.js +18 -8
  35. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +8 -0
  36. package/dist/esm/utils/resolveSyncBlockInstance.js +3 -3
  37. package/dist/esm/utils/retry.js +60 -0
  38. package/dist/types/clients/block-service/ari.d.ts +13 -5
  39. package/dist/types/common/types.d.ts +7 -0
  40. package/dist/types/index.d.ts +1 -1
  41. package/dist/types/providers/block-service/blockServiceAPI.d.ts +6 -3
  42. package/dist/types/providers/confluence/confluenceContentAPI.d.ts +3 -1
  43. package/dist/types/providers/syncBlockProvider.d.ts +2 -0
  44. package/dist/types/providers/types.d.ts +7 -0
  45. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +1 -0
  46. package/dist/types/utils/retry.d.ts +1 -0
  47. package/dist/types-ts4.5/clients/block-service/ari.d.ts +13 -5
  48. package/dist/types-ts4.5/common/types.d.ts +7 -0
  49. package/dist/types-ts4.5/index.d.ts +1 -1
  50. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +6 -3
  51. package/dist/types-ts4.5/providers/confluence/confluenceContentAPI.d.ts +3 -1
  52. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +2 -0
  53. package/dist/types-ts4.5/providers/types.d.ts +7 -0
  54. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +1 -0
  55. package/dist/types-ts4.5/utils/retry.d.ts +1 -0
  56. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 2.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`676d28a61e356`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/676d28a61e356) -
8
+ Add runtime blockAri generation for endpoint calls, update resourceId generation for create
9
+ reference from toolbar
10
+
11
+ ## 2.12.3
12
+
13
+ ### Patch Changes
14
+
15
+ - [`707c3960baedb`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/707c3960baedb) -
16
+ EDITOR-1923 retry api requests on rate limited for sync block provider
17
+ - Updated dependencies
18
+
3
19
  ## 2.12.2
4
20
 
5
21
  ### Patch Changes
@@ -3,21 +3,38 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getLocalIdFromBlockResourceId = exports.blockResourceIdFromSourceAndLocalId = void 0;
6
+ exports.getLocalIdFromBlockResourceId = exports.generateBlockAriFromReference = exports.generateBlockAri = void 0;
7
7
  /* eslint-disable require-unicode-regexp */
8
+
9
+ /**
10
+ * Generates the block ARI from the source page ARI and the source block's resource ID.
11
+ * @param sourceAri - the ARI of the document. E.G ari:cloud:confluence:cloudId:page/pageId
12
+ * @param resourceId - the resource ID of the block node. A randomly generated UUID
13
+ * @returns the block ARI. E.G ari:cloud:blocks:<cloudId>:synced-block/<product>/<pageId>/<resourceId>
14
+ */
15
+ var generateBlockAri = exports.generateBlockAri = function generateBlockAri(sourceAri, resourceId, product) {
16
+ var match = sourceAri.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/(\d+)/);
17
+ if (!(match !== null && match !== void 0 && match[1])) {
18
+ throw new Error("Invalid source ARI: ".concat(sourceAri));
19
+ }
20
+ var cloudId = match[1];
21
+ var pageId = match[3];
22
+ return "ari:cloud:blocks:".concat(cloudId, ":synced-block/").concat(product, "/").concat(pageId, "/").concat(resourceId);
23
+ };
24
+
8
25
  /**
9
- * Generates a unique block ARI from a source ARI and a local ID.
10
- * @param sourceId - the ARI of the document. E.G ari:cloud:confluence:cloudId:page/pageId
11
- * @param localId - the localId of the block node. A randomly generated UUID
12
- * @returns the block ARI. E.G ari:cloud:blocks:cloudId:synced-block/localId
26
+ *
27
+ * @param sourceAri - the ARI of the document. E.G ari:cloud:confluence:cloudId:page/pageId
28
+ * @param resourceId - the resource ID of the reference synced block. E.G confluence-page/pageId/sourceResourceId
29
+ * @returns the block ARI. E.G ari:cloud:blocks:<cloudId>:synced-block/<product>/<pageId>/<resourceId>
13
30
  */
14
- var blockResourceIdFromSourceAndLocalId = exports.blockResourceIdFromSourceAndLocalId = function blockResourceIdFromSourceAndLocalId(sourceId, localId) {
15
- var match = sourceId.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/.*/);
31
+ var generateBlockAriFromReference = exports.generateBlockAriFromReference = function generateBlockAriFromReference(sourceAri, resourceId) {
32
+ var match = sourceAri.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/(\d+)/);
16
33
  if (!(match !== null && match !== void 0 && match[1])) {
17
- throw new Error("Invalid source ARI: ".concat(sourceId));
34
+ throw new Error("Invalid source ARI: ".concat(sourceAri));
18
35
  }
19
36
  var cloudId = match[1];
20
- return "ari:cloud:blocks:".concat(cloudId, ":synced-block/").concat(localId);
37
+ return "ari:cloud:blocks:".concat(cloudId, ":synced-block/").concat(resourceId);
21
38
  };
22
39
 
23
40
  /**
@@ -13,6 +13,7 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
13
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
14
  var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
15
15
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
+ var _retry = require("../../utils/retry");
16
17
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
17
18
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
18
19
  var isBlockContentResponse = exports.isBlockContentResponse = function isBlockContentResponse(response) {
@@ -69,7 +70,7 @@ var getReferenceSyncedBlocks = exports.getReferenceSyncedBlocks = /*#__PURE__*/f
69
70
  while (1) switch (_context.prev = _context.next) {
70
71
  case 0:
71
72
  _context.next = 2;
72
- return fetch("".concat(BLOCK_SERVICE_API_URL, "/block/document/reference/").concat(encodeURIComponent(documentAri)), {
73
+ return (0, _retry.fetchWithRetry)("".concat(BLOCK_SERVICE_API_URL, "/block/document/reference/").concat(encodeURIComponent(documentAri)), {
73
74
  method: 'GET',
74
75
  headers: COMMON_HEADERS
75
76
  });
@@ -119,7 +120,7 @@ var getSyncedBlockContent = exports.getSyncedBlockContent = /*#__PURE__*/functio
119
120
  case 0:
120
121
  blockAri = _ref2.blockAri;
121
122
  _context2.next = 3;
122
- return fetch("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
123
+ return (0, _retry.fetchWithRetry)("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
123
124
  method: 'GET',
124
125
  headers: COMMON_HEADERS
125
126
  });
@@ -153,7 +154,7 @@ var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
153
154
  case 0:
154
155
  blockAri = _ref4.blockAri;
155
156
  _context3.next = 3;
156
- return fetch("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
157
+ return (0, _retry.fetchWithRetry)("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
157
158
  method: 'DELETE',
158
159
  headers: COMMON_HEADERS
159
160
  });
@@ -182,7 +183,7 @@ var updateSyncedBlock = exports.updateSyncedBlock = /*#__PURE__*/function () {
182
183
  case 0:
183
184
  blockAri = _ref6.blockAri, content = _ref6.content;
184
185
  _context4.next = 3;
185
- return fetch("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
186
+ return (0, _retry.fetchWithRetry)("".concat(BLOCK_SERVICE_API_URL, "/block/").concat(encodeURIComponent(blockAri)), {
186
187
  method: 'PUT',
187
188
  headers: COMMON_HEADERS,
188
189
  body: JSON.stringify({
@@ -214,7 +215,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
214
215
  case 0:
215
216
  blockAri = _ref8.blockAri, blockInstanceId = _ref8.blockInstanceId, sourceAri = _ref8.sourceAri, product = _ref8.product, content = _ref8.content;
216
217
  _context5.next = 3;
217
- return fetch("".concat(BLOCK_SERVICE_API_URL, "/block"), {
218
+ return (0, _retry.fetchWithRetry)("".concat(BLOCK_SERVICE_API_URL, "/block"), {
218
219
  method: 'POST',
219
220
  headers: COMMON_HEADERS,
220
221
  body: JSON.stringify({
@@ -8,6 +8,7 @@ exports.updateContentProperty = exports.getContentProperty = exports.deleteConte
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _retry = require("../../utils/retry");
11
12
  var _ari = require("./ari");
12
13
  var _utils = require("./utils");
13
14
  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; }
@@ -95,7 +96,7 @@ var getContentProperty = exports.getContentProperty = /*#__PURE__*/function () {
95
96
  }
96
97
  };
97
98
  _context.next = 6;
98
- return fetch(GRAPHQL_ENDPOINT, {
99
+ return (0, _retry.fetchWithRetry)(GRAPHQL_ENDPOINT, {
99
100
  method: 'POST',
100
101
  headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
101
102
  body: JSON.stringify(bodyData)
@@ -204,7 +205,7 @@ var createContentProperty = exports.createContentProperty = /*#__PURE__*/functio
204
205
  }
205
206
  };
206
207
  _context3.next = 6;
207
- return fetch(GRAPHQL_ENDPOINT, {
208
+ return (0, _retry.fetchWithRetry)(GRAPHQL_ENDPOINT, {
208
209
  method: 'POST',
209
210
  headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
210
211
  body: JSON.stringify(bodyData)
@@ -254,7 +255,7 @@ var deleteContentProperty = exports.deleteContentProperty = /*#__PURE__*/functio
254
255
  }
255
256
  };
256
257
  _context4.next = 6;
257
- return fetch(GRAPHQL_ENDPOINT, {
258
+ return (0, _retry.fetchWithRetry)(GRAPHQL_ENDPOINT, {
258
259
  method: 'POST',
259
260
  headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
260
261
  body: JSON.stringify(bodyData)
@@ -10,6 +10,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
11
  var _monitoring = require("@atlaskit/editor-common/monitoring");
12
12
  var _errorHandling = require("../../utils/errorHandling");
13
+ var _retry = require("../../utils/retry");
13
14
  var _ari = require("./ari");
14
15
  var _utils = require("./utils");
15
16
  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; }
@@ -43,7 +44,7 @@ var getConfluenceSourceInfo = /*#__PURE__*/function () {
43
44
  }
44
45
  };
45
46
  _context.next = 3;
46
- return fetch(GRAPHQL_ENDPOINT, {
47
+ return (0, _retry.fetchWithRetry)(GRAPHQL_ENDPOINT, {
47
48
  method: 'POST',
48
49
  headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
49
50
  body: JSON.stringify(bodyData)
@@ -8,6 +8,11 @@ var SyncBlockError = exports.SyncBlockError = /*#__PURE__*/function (SyncBlockEr
8
8
  SyncBlockError["Errored"] = "errored";
9
9
  SyncBlockError["NotFound"] = "not_found";
10
10
  SyncBlockError["Forbidden"] = "forbidden";
11
+ SyncBlockError["InvalidRequest"] = "invalid_request";
12
+ SyncBlockError["RateLimited"] = "rate_limited";
13
+ SyncBlockError["Conflict"] = "conflict";
14
+ // attempt to create block that already exists
15
+ SyncBlockError["ServerError"] = "server_error";
11
16
  SyncBlockError["InvalidContent"] = "invalid_content"; // content is not a valid JSON
12
17
  return SyncBlockError;
13
18
  }({});
package/dist/cjs/index.js CHANGED
@@ -27,12 +27,6 @@ Object.defineProperty(exports, "SyncedBlockProvider", {
27
27
  return _syncBlockProvider.SyncBlockProvider;
28
28
  }
29
29
  });
30
- Object.defineProperty(exports, "blockResourceIdFromSourceAndLocalId", {
31
- enumerable: true,
32
- get: function get() {
33
- return _ari.blockResourceIdFromSourceAndLocalId;
34
- }
35
- });
36
30
  Object.defineProperty(exports, "convertPMNodesToSyncBlockNodes", {
37
31
  enumerable: true,
38
32
  get: function get() {
@@ -75,6 +69,18 @@ Object.defineProperty(exports, "fetchReferences", {
75
69
  return _blockServiceAPI.fetchReferences;
76
70
  }
77
71
  });
72
+ Object.defineProperty(exports, "generateBlockAri", {
73
+ enumerable: true,
74
+ get: function get() {
75
+ return _ari.generateBlockAri;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "generateBlockAriFromReference", {
79
+ enumerable: true,
80
+ get: function get() {
81
+ return _ari.generateBlockAriFromReference;
82
+ }
83
+ });
78
84
  Object.defineProperty(exports, "getConfluencePageAri", {
79
85
  enumerable: true,
80
86
  get: function get() {
@@ -15,12 +15,25 @@ var _ari = require("../../clients/block-service/ari");
15
15
  var _blockService = require("../../clients/block-service/blockService");
16
16
  var _types = require("../../common/types");
17
17
  var _errorHandling = require("../../utils/errorHandling");
18
+ /* eslint-disable require-unicode-regexp */
19
+
18
20
  var mapBlockError = function mapBlockError(error) {
19
21
  switch (error.status) {
22
+ case 400:
23
+ case 401:
24
+ return _types.SyncBlockError.InvalidRequest;
20
25
  case 403:
21
26
  return _types.SyncBlockError.Forbidden;
22
27
  case 404:
23
28
  return _types.SyncBlockError.NotFound;
29
+ case 409:
30
+ return _types.SyncBlockError.Conflict;
31
+ case 429:
32
+ return _types.SyncBlockError.RateLimited;
33
+ case 500:
34
+ case 503:
35
+ case 504:
36
+ return _types.SyncBlockError.ServerError;
24
37
  }
25
38
  return _types.SyncBlockError.Errored;
26
39
  };
@@ -104,24 +117,26 @@ var fetchReferences = exports.fetchReferences = /*#__PURE__*/function () {
104
117
  * ADFFetchProvider implementation that fetches synced block data from Block Service API
105
118
  */
106
119
  var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
107
- function BlockServiceADFFetchProvider() {
120
+ function BlockServiceADFFetchProvider(sourceAri) {
108
121
  (0, _classCallCheck2.default)(this, BlockServiceADFFetchProvider);
122
+ this.sourceAri = sourceAri;
109
123
  }
124
+
125
+ // resourceId of the reference synced block.
126
+ // the ARI must be constructed to call the block service API
110
127
  return (0, _createClass2.default)(BlockServiceADFFetchProvider, [{
111
128
  key: "fetchData",
112
- value: // resourceId is the ARI of the block. E.G ari:cloud:blocks:site-123:synced-block/uuid-456
113
- // in the content API provider, this was the concatenation of the source document's ARI and the local ID. E.G ari:cloud:confluence:site-123:page/pageId/uuid-456
114
- function () {
129
+ value: function () {
115
130
  var _fetchData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(resourceId) {
116
- var localId, blockContentResponse, value, syncedBlockData;
131
+ var blockAri, blockContentResponse, value, syncedBlockData;
117
132
  return _regenerator.default.wrap(function _callee2$(_context2) {
118
133
  while (1) switch (_context2.prev = _context2.next) {
119
134
  case 0:
120
- localId = (0, _ari.getLocalIdFromBlockResourceId)(resourceId);
135
+ blockAri = (0, _ari.generateBlockAriFromReference)(this.sourceAri, resourceId);
121
136
  _context2.prev = 1;
122
137
  _context2.next = 4;
123
138
  return (0, _blockService.getSyncedBlockContent)({
124
- blockAri: resourceId
139
+ blockAri: blockAri
125
140
  });
126
141
  case 4:
127
142
  blockContentResponse = _context2.sent;
@@ -140,8 +155,9 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
140
155
  return _context2.abrupt("return", {
141
156
  data: {
142
157
  content: syncedBlockData,
143
- resourceId: resourceId,
144
- blockInstanceId: localId,
158
+ resourceId: blockAri,
159
+ blockInstanceId: blockContentResponse.blockInstanceId,
160
+ // this was the node's localId, but has become the resourceId.
145
161
  sourceAri: blockContentResponse.sourceAri,
146
162
  product: blockContentResponse.product
147
163
  },
@@ -167,7 +183,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
167
183
  case "end":
168
184
  return _context2.stop();
169
185
  }
170
- }, _callee2, null, [[1, 12]]);
186
+ }, _callee2, this, [[1, 12]]);
171
187
  }));
172
188
  function fetchData(_x2) {
173
189
  return _fetchData.apply(this, arguments);
@@ -191,42 +207,43 @@ var BlockServiceADFWriteProvider = /*#__PURE__*/function () {
191
207
  key: "writeData",
192
208
  value: function () {
193
209
  var _writeData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(data) {
194
- var resourceId;
210
+ var resourceId, blockAri;
195
211
  return _regenerator.default.wrap(function _callee3$(_context3) {
196
212
  while (1) switch (_context3.prev = _context3.next) {
197
213
  case 0:
198
214
  resourceId = data.resourceId;
199
- _context3.prev = 1;
200
- _context3.next = 4;
215
+ blockAri = (0, _ari.generateBlockAri)(this.sourceAri, resourceId, this.product);
216
+ _context3.prev = 2;
217
+ _context3.next = 5;
201
218
  return (0, _blockService.updateSyncedBlock)({
202
- blockAri: resourceId,
219
+ blockAri: blockAri,
203
220
  content: JSON.stringify(data.content)
204
221
  });
205
- case 4:
222
+ case 5:
206
223
  return _context3.abrupt("return", {
207
224
  resourceId: resourceId
208
225
  });
209
- case 7:
210
- _context3.prev = 7;
211
- _context3.t0 = _context3["catch"](1);
226
+ case 8:
227
+ _context3.prev = 8;
228
+ _context3.t0 = _context3["catch"](2);
212
229
  if (!(_context3.t0 instanceof _blockService.BlockError)) {
213
- _context3.next = 11;
230
+ _context3.next = 12;
214
231
  break;
215
232
  }
216
233
  return _context3.abrupt("return", {
217
234
  error: mapBlockError(_context3.t0),
218
235
  resourceId: resourceId
219
236
  });
220
- case 11:
237
+ case 12:
221
238
  return _context3.abrupt("return", {
222
239
  error: (0, _errorHandling.stringifyError)(_context3.t0),
223
240
  resourceId: resourceId
224
241
  });
225
- case 12:
242
+ case 13:
226
243
  case "end":
227
244
  return _context3.stop();
228
245
  }
229
- }, _callee3, null, [[1, 7]]);
246
+ }, _callee3, this, [[2, 8]]);
230
247
  }));
231
248
  function writeData(_x3) {
232
249
  return _writeData.apply(this, arguments);
@@ -237,45 +254,46 @@ var BlockServiceADFWriteProvider = /*#__PURE__*/function () {
237
254
  key: "createData",
238
255
  value: function () {
239
256
  var _createData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(data) {
240
- var resourceId;
257
+ var resourceId, blockAri;
241
258
  return _regenerator.default.wrap(function _callee4$(_context4) {
242
259
  while (1) switch (_context4.prev = _context4.next) {
243
260
  case 0:
244
261
  resourceId = data.resourceId;
245
- _context4.prev = 1;
246
- _context4.next = 4;
262
+ blockAri = (0, _ari.generateBlockAri)(this.sourceAri, resourceId, this.product);
263
+ _context4.prev = 2;
264
+ _context4.next = 5;
247
265
  return (0, _blockService.createSyncedBlock)({
248
- blockAri: resourceId,
266
+ blockAri: blockAri,
249
267
  blockInstanceId: data.blockInstanceId,
250
268
  sourceAri: this.sourceAri,
251
269
  product: this.product,
252
270
  content: JSON.stringify(data.content)
253
271
  });
254
- case 4:
272
+ case 5:
255
273
  return _context4.abrupt("return", {
256
274
  resourceId: resourceId
257
275
  });
258
- case 7:
259
- _context4.prev = 7;
260
- _context4.t0 = _context4["catch"](1);
276
+ case 8:
277
+ _context4.prev = 8;
278
+ _context4.t0 = _context4["catch"](2);
261
279
  if (!(_context4.t0 instanceof _blockService.BlockError)) {
262
- _context4.next = 11;
280
+ _context4.next = 12;
263
281
  break;
264
282
  }
265
283
  return _context4.abrupt("return", {
266
284
  error: mapBlockError(_context4.t0),
267
285
  resourceId: resourceId
268
286
  });
269
- case 11:
287
+ case 12:
270
288
  return _context4.abrupt("return", {
271
289
  error: (0, _errorHandling.stringifyError)(_context4.t0),
272
290
  resourceId: resourceId
273
291
  });
274
- case 12:
292
+ case 13:
275
293
  case "end":
276
294
  return _context4.stop();
277
295
  }
278
- }, _callee4, this, [[1, 7]]);
296
+ }, _callee4, this, [[2, 8]]);
279
297
  }));
280
298
  function createData(_x4) {
281
299
  return _createData.apply(this, arguments);
@@ -286,25 +304,27 @@ var BlockServiceADFWriteProvider = /*#__PURE__*/function () {
286
304
  key: "deleteData",
287
305
  value: function () {
288
306
  var _deleteData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(resourceId) {
307
+ var blockAri;
289
308
  return _regenerator.default.wrap(function _callee5$(_context5) {
290
309
  while (1) switch (_context5.prev = _context5.next) {
291
310
  case 0:
292
- _context5.prev = 0;
293
- _context5.next = 3;
311
+ blockAri = (0, _ari.generateBlockAri)(this.sourceAri, resourceId, this.product);
312
+ _context5.prev = 1;
313
+ _context5.next = 4;
294
314
  return (0, _blockService.deleteSyncedBlock)({
295
- blockAri: resourceId
315
+ blockAri: blockAri
296
316
  });
297
- case 3:
317
+ case 4:
298
318
  return _context5.abrupt("return", {
299
319
  resourceId: resourceId,
300
320
  success: true,
301
321
  error: undefined
302
322
  });
303
- case 6:
304
- _context5.prev = 6;
305
- _context5.t0 = _context5["catch"](0);
323
+ case 7:
324
+ _context5.prev = 7;
325
+ _context5.t0 = _context5["catch"](1);
306
326
  if (!(_context5.t0 instanceof _blockService.BlockError)) {
307
- _context5.next = 10;
327
+ _context5.next = 11;
308
328
  break;
309
329
  }
310
330
  return _context5.abrupt("return", {
@@ -312,27 +332,37 @@ var BlockServiceADFWriteProvider = /*#__PURE__*/function () {
312
332
  success: false,
313
333
  error: mapBlockError(_context5.t0)
314
334
  });
315
- case 10:
335
+ case 11:
316
336
  return _context5.abrupt("return", {
317
337
  resourceId: resourceId,
318
338
  success: false,
319
339
  error: (0, _errorHandling.stringifyError)(_context5.t0)
320
340
  });
321
- case 11:
341
+ case 12:
322
342
  case "end":
323
343
  return _context5.stop();
324
344
  }
325
- }, _callee5, null, [[0, 6]]);
345
+ }, _callee5, this, [[1, 7]]);
326
346
  }));
327
347
  function deleteData(_x5) {
328
348
  return _deleteData.apply(this, arguments);
329
349
  }
330
350
  return deleteData;
331
- }()
351
+ }() // the sourceId is the resourceId of the source synced block.
352
+ }, {
353
+ key: "generateResourceIdForReference",
354
+ value: function generateResourceIdForReference(sourceId) {
355
+ var match = this.sourceAri.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/(\d+)/);
356
+ if (!(match !== null && match !== void 0 && match[1])) {
357
+ throw new Error("Invalid source ARI: ".concat(this.sourceAri));
358
+ }
359
+ var pageId = match[3];
360
+ return "".concat(this.product, "/").concat(pageId, "/").concat(sourceId);
361
+ }
332
362
  }, {
333
363
  key: "generateResourceId",
334
- value: function generateResourceId(sourceAri, localId) {
335
- return (0, _ari.blockResourceIdFromSourceAndLocalId)(sourceAri, localId);
364
+ value: function generateResourceId() {
365
+ return crypto.randomUUID();
336
366
  }
337
367
  }]);
338
368
  }();
@@ -340,7 +370,7 @@ var BlockServiceADFWriteProvider = /*#__PURE__*/function () {
340
370
  * Factory function to create both providers with shared configuration
341
371
  */
342
372
  var createBlockServiceAPIProviders = function createBlockServiceAPIProviders(sourceAri, product) {
343
- var fetchProvider = new BlockServiceADFFetchProvider();
373
+ var fetchProvider = new BlockServiceADFFetchProvider(sourceAri);
344
374
  var writeProvider = new BlockServiceADFWriteProvider(sourceAri, product);
345
375
  return {
346
376
  fetchProvider: fetchProvider,
@@ -155,6 +155,7 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
155
155
  function ConfluenceADFWriteProvider(config) {
156
156
  var _this = this;
157
157
  (0, _classCallCheck2.default)(this, ConfluenceADFWriteProvider);
158
+ (0, _defineProperty2.default)(this, "product", 'confluence-page');
158
159
  (0, _defineProperty2.default)(this, "createNewContentProperty", /*#__PURE__*/function () {
159
160
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(pageId, key, value, pageType) {
160
161
  var options, _contentProperty$data3, contentProperty, _contentProperty2$dat, _contentProperty2;
@@ -403,6 +404,11 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
403
404
  value: function generateResourceId(sourceId, localId) {
404
405
  return (0, _ari.resourceIdFromConfluencePageSourceIdAndLocalId)(sourceId, localId);
405
406
  }
407
+ }, {
408
+ key: "generateResourceIdForReference",
409
+ value: function generateResourceIdForReference(sourceId) {
410
+ return sourceId;
411
+ }
406
412
  }]);
407
413
  }();
408
414
  /**
@@ -43,16 +43,21 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
43
43
  _this.providerOptions = providerOptions;
44
44
  return _this;
45
45
  }
46
-
47
- /**
48
- * Check if the node is supported by the provider
49
- *
50
- * @param node
51
- *
52
- * @returns True if the node is supported, false otherwise
53
- */
54
46
  (0, _inherits2.default)(SyncBlockProvider, _SyncBlockDataProvide);
55
47
  return (0, _createClass2.default)(SyncBlockProvider, [{
48
+ key: "getProduct",
49
+ value: function getProduct() {
50
+ return this.writeProvider.product;
51
+ }
52
+
53
+ /**
54
+ * Check if the node is supported by the provider
55
+ *
56
+ * @param node
57
+ *
58
+ * @returns True if the node is supported, false otherwise
59
+ */
60
+ }, {
56
61
  key: "isNodeSupported",
57
62
  value: function isNodeSupported(node) {
58
63
  return node.type === 'syncBlock' || node.type === 'bodiedSyncBlock';
@@ -248,6 +253,11 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
248
253
  value: function generateResourceId(sourceId, localId) {
249
254
  return this.writeProvider.generateResourceId(sourceId, localId);
250
255
  }
256
+ }, {
257
+ key: "generateResourceIdForReference",
258
+ value: function generateResourceIdForReference(sourceId) {
259
+ return this.writeProvider.generateResourceIdForReference(sourceId);
260
+ }
251
261
 
252
262
  /**
253
263
  * Get the synced block renderer provider options
@@ -40,6 +40,14 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
40
40
  this.fireAnalyticsEvent = fireAnalyticsEvent;
41
41
  }
42
42
  return (0, _createClass2.default)(ReferenceSyncBlockStoreManager, [{
43
+ key: "generateResourceIdForReference",
44
+ value: function generateResourceIdForReference(sourceId) {
45
+ if (!this.dataProvider) {
46
+ throw new Error('Data provider not set');
47
+ }
48
+ return this.dataProvider.generateResourceIdForReference(sourceId);
49
+ }
50
+ }, {
43
51
  key: "updateFireAnalyticsEvent",
44
52
  value: function updateFireAnalyticsEvent(fireAnalyticsEvent) {
45
53
  this.fireAnalyticsEvent = fireAnalyticsEvent;
@@ -26,10 +26,10 @@ var resolveSyncBlockInstance = exports.resolveSyncBlockInstance = function resol
26
26
  return newResult;
27
27
  } else if (!newResult.data) {
28
28
  // return the old result if there was an error, e.g. network error, but not if not found or forbidden
29
- if (newResult.error === _types.SyncBlockError.Errored) {
30
- return oldResult;
31
- } else {
29
+ if (newResult.error === _types.SyncBlockError.NotFound || newResult.error === _types.SyncBlockError.Forbidden) {
32
30
  return newResult;
31
+ } else {
32
+ return oldResult;
33
33
  }
34
34
  }
35
35