@atlaskit/editor-synced-block-provider 25.0.1 → 25.0.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,23 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 25.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`004b7c3c33232`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/004b7c3c33232) -
8
+ Fire a per-request `syncedBlockGetSourceInfo` success event, tagged with `sourceLocation`, when a
9
+ reference synced block resolves its source info, and tag the missing-source-ARI error with
10
+ `sourceLocation`. Stop adding `sourceLocation` metadata to the shared source-info experience
11
+ events. Gated by the `platform_editor_blocks_patch_12` experiment (with
12
+ `editor_synced_blocks_jira_custom_rich_text`); with the experiment off, events are unchanged.
13
+ - Updated dependencies
14
+
15
+ ## 25.0.2
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies
20
+
3
21
  ## 25.0.1
4
22
 
5
23
  ### Patch Changes
@@ -435,17 +435,20 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
435
435
  // `product` from cached data is preferred when available; fall back to parsing
436
436
  // the resourceId.
437
437
  var sourceProduct = product !== null && product !== void 0 ? product : (0, _utils.getSourceProductFromResourceIdSafe)(resourceId);
438
+
439
+ // With the experiment off, events and experience calls are identical to master.
440
+ var isPerRequestSourceInfo = (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_blocks_patch_12');
438
441
  if (!sourceAri || !product || !blockInstanceId) {
439
442
  var _this$fireAnalyticsEv3;
440
- (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 || _this$fireAnalyticsEv3.call(this, (0, _errorHandling.getSourceInfoErrorPayload)('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct));
443
+ (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 || _this$fireAnalyticsEv3.call(this, (0, _errorHandling.getSourceInfoErrorPayload)('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct, isPerRequestSourceInfo ? (0, _fieldAwareLocations.getSourceLocation)(sourceAri) : undefined));
441
444
  return Promise.resolve(undefined);
442
445
  }
443
446
  var sourceLocation = (0, _fieldAwareLocations.getSourceLocation)(sourceAri);
444
- // Undefined with `platform_editor_blocks_patch_13` off, so experience calls below keep
445
- // exactly their previous arguments (no `metadata` key, `success()` without arguments).
446
- var experienceMetadata = sourceLocation && {
447
+ // The shared experience cannot count requests, so with the experiment on the
448
+ // per-request event below carries `sourceLocation` instead of the experience.
449
+ var experienceMetadata = !isPerRequestSourceInfo && sourceLocation ? {
447
450
  sourceLocation: sourceLocation
448
- };
451
+ } : undefined;
449
452
  var withExperienceMetadata = function withExperienceMetadata(options) {
450
453
  return experienceMetadata ? _objectSpread(_objectSpread({}, options), {}, {
451
454
  metadata: experienceMetadata
@@ -476,20 +479,25 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
476
479
  var _this2$fetchSourceInf3;
477
480
  (_this2$fetchSourceInf3 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf3 === void 0 || _this2$fetchSourceInf3.success();
478
481
  }
482
+ // Pairs with the error event above as the per-request denominator.
483
+ if (isPerRequestSourceInfo && sourceLocation) {
484
+ var _this2$fireAnalyticsE2;
485
+ (_this2$fireAnalyticsE2 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE2 === void 0 || _this2$fireAnalyticsE2.call(_this2, (0, _errorHandling.getSourceInfoSuccessPayload)(resourceId, blockInstanceId, sourceProduct, sourceLocation));
486
+ }
479
487
  } else {
480
- var _this2$fetchSourceInf4, _this2$fireAnalyticsE2;
488
+ var _this2$fetchSourceInf4, _this2$fireAnalyticsE3;
481
489
  (_this2$fetchSourceInf4 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf4 === void 0 || _this2$fetchSourceInf4.failure(withExperienceMetadata({
482
490
  reason: 'Missing title or url'
483
491
  }));
484
- (_this2$fireAnalyticsE2 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE2 === void 0 || _this2$fireAnalyticsE2.call(_this2, (0, _errorHandling.getSourceInfoErrorPayload)('Missing title or url', resourceId, sourceProduct, sourceLocation));
492
+ (_this2$fireAnalyticsE3 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE3 === void 0 || _this2$fireAnalyticsE3.call(_this2, (0, _errorHandling.getSourceInfoErrorPayload)('Missing title or url', resourceId, sourceProduct, sourceLocation));
485
493
  }
486
494
  return sourceInfo;
487
495
  }).catch(function (error) {
488
- var _this2$fetchSourceInf5, _this2$fireAnalyticsE3;
496
+ var _this2$fetchSourceInf5, _this2$fireAnalyticsE4;
489
497
  (_this2$fetchSourceInf5 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf5 === void 0 || _this2$fetchSourceInf5.failure(withExperienceMetadata({
490
498
  reason: error.message
491
499
  }));
492
- (_this2$fireAnalyticsE3 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE3 === void 0 || _this2$fireAnalyticsE3.call(_this2, (0, _errorHandling.getSourceInfoErrorPayload)(error.message, resourceId, sourceProduct, sourceLocation));
500
+ (_this2$fireAnalyticsE4 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE4 === void 0 || _this2$fireAnalyticsE4.call(_this2, (0, _errorHandling.getSourceInfoErrorPayload)(error.message, resourceId, sourceProduct, sourceLocation));
493
501
  return undefined;
494
502
  }).finally(function () {
495
503
  _this2.syncBlockSourceInfoRequests.delete(resourceId);
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.fetchSuccessPayload = exports.fetchReferencesErrorPayload = exports.fetchErrorPayload = exports.deleteSuccessPayload = exports.deleteErrorPayload = exports.createSuccessPayload = exports.createSuccessOperationalPayload = exports.createErrorPayload = exports.classifyFetchErrorReason = exports.classifyErrorReason = exports.cacheDeletionForcedPayload = exports.buildFetchErrorAttribution = exports.buildErrorAttribution = exports.addContentSuccessPayload = exports.FETCH_BENIGN_REASONS = void 0;
8
8
  exports.getErrorPayload = getErrorPayload;
9
- exports.updateSuccessPayload = exports.updateReferenceErrorPayload = exports.updateErrorPayload = exports.updateCacheErrorPayload = exports.stringifyError = exports.sourceInfoOrphanedPayload = exports.getSourceInfoErrorPayload = exports.getPiiSafeOriginalError = void 0;
9
+ exports.updateSuccessPayload = exports.updateReferenceErrorPayload = exports.updateErrorPayload = exports.updateCacheErrorPayload = exports.stringifyError = exports.sourceInfoOrphanedPayload = exports.getSourceInfoSuccessPayload = exports.getSourceInfoErrorPayload = exports.getPiiSafeOriginalError = void 0;
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
12
  var _enums = require("@atlaskit/editor-common/analytics/types/enums");
@@ -333,6 +333,28 @@ var fetchSuccessPayload = exports.fetchSuccessPayload = function fetchSuccessPay
333
333
  })
334
334
  };
335
335
  };
336
+
337
+ /**
338
+ * Per-request `syncedBlockGetSourceInfo` success event. Pairs with
339
+ * `getSourceInfoErrorPayload` so a success rate can be computed per request.
340
+ */
341
+ var getSourceInfoSuccessPayload = exports.getSourceInfoSuccessPayload = function getSourceInfoSuccessPayload(resourceId, blockInstanceId, sourceProduct, sourceLocation) {
342
+ return {
343
+ action: _enums.ACTION.FETCHED,
344
+ actionSubject: _enums.ACTION_SUBJECT.SYNCED_BLOCK,
345
+ actionSubjectId: _enums.ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
346
+ eventType: _enums.EVENT_TYPE.OPERATIONAL,
347
+ attributes: _objectSpread(_objectSpread(_objectSpread({
348
+ resourceId: resourceId
349
+ }, blockInstanceId && {
350
+ blockInstanceId: blockInstanceId
351
+ }), sourceProduct && {
352
+ sourceProduct: sourceProduct
353
+ }), sourceLocation && {
354
+ sourceLocation: sourceLocation
355
+ })
356
+ };
357
+ };
336
358
  var createSuccessPayload = exports.createSuccessPayload = function createSuccessPayload(resourceId, sourceProduct, sourceLocation) {
337
359
  return {
338
360
  action: _enums.ACTION.INSERTED,
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.isFieldAwareJiraLocation = exports.getSourceLocation = exports.getFieldAwareLocationScope = void 0;
7
7
  var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
8
- var _fg = require("@atlaskit/platform-feature-flags/fg");
9
8
  var _ari = require("../clients/block-service/ari");
10
9
  var _ari2 = require("../clients/jira/ari");
11
10
  /**
@@ -34,14 +33,8 @@ var getFieldAwareLocationScope = exports.getFieldAwareLocationScope = function g
34
33
  /**
35
34
  * Analytics `sourceLocation` for a source ARI: `undefined` for non-Jira sources and for the
36
35
  * control cohort, so events outside the experiment keep their current shape.
37
- *
38
- * The `platform_editor_blocks_patch_13` gate runs first: with it off this returns `undefined`
39
- * without the product check or the experiment read, so no new exposure is logged.
40
36
  */
41
37
  var getSourceLocation = exports.getSourceLocation = function getSourceLocation(sourceAri) {
42
- if (!(0, _fg.fg)('platform_editor_blocks_patch_13')) {
43
- return undefined;
44
- }
45
38
  if (!sourceAri || !isFieldAwareJiraLocation((0, _ari.getProductFromSourceAri)(sourceAri))) {
46
39
  return undefined;
47
40
  }
@@ -3,7 +3,7 @@ import isEqual from 'lodash/isEqual';
3
3
  import { logException } from '@atlaskit/editor-common/monitoring/error';
4
4
  import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
5
5
  import { isProviderNotReadyError, ProviderNotReadyError, SyncBlockError } from '../common/types';
6
- import { buildErrorAttribution, buildFetchErrorAttribution, cacheDeletionForcedPayload, fetchErrorPayload, fetchSuccessPayload, getSourceInfoErrorPayload, sourceInfoOrphanedPayload, updateReferenceErrorPayload } from '../utils/errorHandling';
6
+ import { buildErrorAttribution, buildFetchErrorAttribution, cacheDeletionForcedPayload, fetchErrorPayload, fetchSuccessPayload, getSourceInfoErrorPayload, getSourceInfoSuccessPayload, sourceInfoOrphanedPayload, updateReferenceErrorPayload } from '../utils/errorHandling';
7
7
  import { getFetchExperience, getFetchSourceInfoExperience, getSaveReferenceExperience } from '../utils/experienceTracking';
8
8
  import { getSourceLocation } from '../utils/fieldAwareLocations';
9
9
  import { resolveSyncBlockInstance } from '../utils/resolveSyncBlockInstance';
@@ -343,17 +343,20 @@ export class ReferenceSyncBlockStoreManager {
343
343
  // `product` from cached data is preferred when available; fall back to parsing
344
344
  // the resourceId.
345
345
  const sourceProduct = product !== null && product !== void 0 ? product : getSourceProductFromResourceIdSafe(resourceId);
346
+
347
+ // With the experiment off, events and experience calls are identical to master.
348
+ const isPerRequestSourceInfo = isExperimentEnabled('platform_editor_blocks_patch_12');
346
349
  if (!sourceAri || !product || !blockInstanceId) {
347
350
  var _this$fireAnalyticsEv3;
348
- (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 ? void 0 : _this$fireAnalyticsEv3.call(this, getSourceInfoErrorPayload('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct));
351
+ (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 ? void 0 : _this$fireAnalyticsEv3.call(this, getSourceInfoErrorPayload('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct, isPerRequestSourceInfo ? getSourceLocation(sourceAri) : undefined));
349
352
  return Promise.resolve(undefined);
350
353
  }
351
354
  const sourceLocation = getSourceLocation(sourceAri);
352
- // Undefined with `platform_editor_blocks_patch_13` off, so experience calls below keep
353
- // exactly their previous arguments (no `metadata` key, `success()` without arguments).
354
- const experienceMetadata = sourceLocation && {
355
+ // The shared experience cannot count requests, so with the experiment on the
356
+ // per-request event below carries `sourceLocation` instead of the experience.
357
+ const experienceMetadata = !isPerRequestSourceInfo && sourceLocation ? {
355
358
  sourceLocation
356
- };
359
+ } : undefined;
357
360
  const withExperienceMetadata = options => experienceMetadata ? {
358
361
  ...options,
359
362
  metadata: experienceMetadata
@@ -383,20 +386,25 @@ export class ReferenceSyncBlockStoreManager {
383
386
  var _this$fetchSourceInfo4;
384
387
  (_this$fetchSourceInfo4 = this.fetchSourceInfoExperience) === null || _this$fetchSourceInfo4 === void 0 ? void 0 : _this$fetchSourceInfo4.success();
385
388
  }
389
+ // Pairs with the error event above as the per-request denominator.
390
+ if (isPerRequestSourceInfo && sourceLocation) {
391
+ var _this$fireAnalyticsEv5;
392
+ (_this$fireAnalyticsEv5 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv5 === void 0 ? void 0 : _this$fireAnalyticsEv5.call(this, getSourceInfoSuccessPayload(resourceId, blockInstanceId, sourceProduct, sourceLocation));
393
+ }
386
394
  } else {
387
- var _this$fetchSourceInfo5, _this$fireAnalyticsEv5;
395
+ var _this$fetchSourceInfo5, _this$fireAnalyticsEv6;
388
396
  (_this$fetchSourceInfo5 = this.fetchSourceInfoExperience) === null || _this$fetchSourceInfo5 === void 0 ? void 0 : _this$fetchSourceInfo5.failure(withExperienceMetadata({
389
397
  reason: 'Missing title or url'
390
398
  }));
391
- (_this$fireAnalyticsEv5 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv5 === void 0 ? void 0 : _this$fireAnalyticsEv5.call(this, getSourceInfoErrorPayload('Missing title or url', resourceId, sourceProduct, sourceLocation));
399
+ (_this$fireAnalyticsEv6 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv6 === void 0 ? void 0 : _this$fireAnalyticsEv6.call(this, getSourceInfoErrorPayload('Missing title or url', resourceId, sourceProduct, sourceLocation));
392
400
  }
393
401
  return sourceInfo;
394
402
  }).catch(error => {
395
- var _this$fetchSourceInfo6, _this$fireAnalyticsEv6;
403
+ var _this$fetchSourceInfo6, _this$fireAnalyticsEv7;
396
404
  (_this$fetchSourceInfo6 = this.fetchSourceInfoExperience) === null || _this$fetchSourceInfo6 === void 0 ? void 0 : _this$fetchSourceInfo6.failure(withExperienceMetadata({
397
405
  reason: error.message
398
406
  }));
399
- (_this$fireAnalyticsEv6 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv6 === void 0 ? void 0 : _this$fireAnalyticsEv6.call(this, getSourceInfoErrorPayload(error.message, resourceId, sourceProduct, sourceLocation));
407
+ (_this$fireAnalyticsEv7 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv7 === void 0 ? void 0 : _this$fireAnalyticsEv7.call(this, getSourceInfoErrorPayload(error.message, resourceId, sourceProduct, sourceLocation));
400
408
  return undefined;
401
409
  }).finally(() => {
402
410
  this.syncBlockSourceInfoRequests.delete(resourceId);
@@ -404,11 +412,11 @@ export class ReferenceSyncBlockStoreManager {
404
412
  this.syncBlockSourceInfoRequests.set(resourceId, sourceInfoPromise);
405
413
  return sourceInfoPromise;
406
414
  } catch (error) {
407
- var _this$fireAnalyticsEv7;
415
+ var _this$fireAnalyticsEv8;
408
416
  logException(error, {
409
417
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
410
418
  });
411
- (_this$fireAnalyticsEv7 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv7 === void 0 ? void 0 : _this$fireAnalyticsEv7.call(this, getSourceInfoErrorPayload(error.message, resourceId, getSourceProductFromResourceIdSafe(resourceId)));
419
+ (_this$fireAnalyticsEv8 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv8 === void 0 ? void 0 : _this$fireAnalyticsEv8.call(this, getSourceInfoErrorPayload(error.message, resourceId, getSourceProductFromResourceIdSafe(resourceId)));
412
420
  }
413
421
  return Promise.resolve(undefined);
414
422
  }
@@ -536,12 +544,12 @@ export class ReferenceSyncBlockStoreManager {
536
544
  data.forEach(syncBlockInstance => {
537
545
  var _resolvedSyncBlockIns;
538
546
  if (!syncBlockInstance.resourceId) {
539
- var _syncBlockInstance$er, _syncBlockInstance$er2, _this$fireAnalyticsEv8, _syncBlockInstance$er3, _syncBlockInstance$er4, _syncBlockInstance$er5;
547
+ var _syncBlockInstance$er, _syncBlockInstance$er2, _this$fireAnalyticsEv9, _syncBlockInstance$er3, _syncBlockInstance$er4, _syncBlockInstance$er5;
540
548
  const payload = ((_syncBlockInstance$er = syncBlockInstance.error) === null || _syncBlockInstance$er === void 0 ? void 0 : _syncBlockInstance$er.reason) || ((_syncBlockInstance$er2 = syncBlockInstance.error) === null || _syncBlockInstance$er2 === void 0 ? void 0 : _syncBlockInstance$er2.type) || 'Returned sync block instance does not have resource id';
541
549
  // No resourceId means we cannot derive a sourceProduct here; intentionally omit.
542
550
  // Classify on the structured `type` first, falling back to the free-text
543
551
  // `reason`/payload (EDITOR-7862).
544
- (_this$fireAnalyticsEv8 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv8 === void 0 ? void 0 : _this$fireAnalyticsEv8.call(this, fetchErrorPayload(payload, undefined, undefined, buildFetchErrorAttribution(((_syncBlockInstance$er3 = syncBlockInstance.error) === null || _syncBlockInstance$er3 === void 0 ? void 0 : _syncBlockInstance$er3.type) || ((_syncBlockInstance$er4 = syncBlockInstance.error) === null || _syncBlockInstance$er4 === void 0 ? void 0 : _syncBlockInstance$er4.reason) || payload, (_syncBlockInstance$er5 = syncBlockInstance.error) === null || _syncBlockInstance$er5 === void 0 ? void 0 : _syncBlockInstance$er5.statusCode)));
552
+ (_this$fireAnalyticsEv9 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv9 === void 0 ? void 0 : _this$fireAnalyticsEv9.call(this, fetchErrorPayload(payload, undefined, undefined, buildFetchErrorAttribution(((_syncBlockInstance$er3 = syncBlockInstance.error) === null || _syncBlockInstance$er3 === void 0 ? void 0 : _syncBlockInstance$er3.type) || ((_syncBlockInstance$er4 = syncBlockInstance.error) === null || _syncBlockInstance$er4 === void 0 ? void 0 : _syncBlockInstance$er4.reason) || payload, (_syncBlockInstance$er5 = syncBlockInstance.error) === null || _syncBlockInstance$er5 === void 0 ? void 0 : _syncBlockInstance$er5.statusCode)));
545
553
  return;
546
554
  }
547
555
  const existingSyncBlock = this.getFromCache(syncBlockInstance.resourceId);
@@ -574,11 +582,11 @@ export class ReferenceSyncBlockStoreManager {
574
582
  // inflating error-rate metrics with expected transient failures
575
583
  const isRetryingEntityNotFound = syncBlockInstance.error.type === SyncBlockError.EntityNotFound && ((_this$entityNotFoundR = this.entityNotFoundRetryCount.get(syncBlockInstance.resourceId)) !== null && _this$entityNotFoundR !== void 0 ? _this$entityNotFoundR : 0) < ENTITY_NOT_FOUND_MAX_RETRIES;
576
584
  if (!isRetryingEntityNotFound) {
577
- var _this$fireAnalyticsEv9, _syncBlockInstance$da, _syncBlockInstance$da2;
585
+ var _this$fireAnalyticsEv0, _syncBlockInstance$da, _syncBlockInstance$da2;
578
586
  // Classify on the structured `type` (a `SyncBlockError` enum value) first,
579
587
  // falling back to the free-text `reason` so source-state/permission strings
580
588
  // are still bucketed (EDITOR-7862). The emitted `error` attribute is unchanged.
581
- (_this$fireAnalyticsEv9 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv9 === void 0 ? void 0 : _this$fireAnalyticsEv9.call(this, fetchErrorPayload(syncBlockInstance.error.reason || syncBlockInstance.error.type, syncBlockInstance.resourceId, (_syncBlockInstance$da = (_syncBlockInstance$da2 = syncBlockInstance.data) === null || _syncBlockInstance$da2 === void 0 ? void 0 : _syncBlockInstance$da2.product) !== null && _syncBlockInstance$da !== void 0 ? _syncBlockInstance$da : getSourceProductFromResourceIdSafe(syncBlockInstance.resourceId), buildFetchErrorAttribution(syncBlockInstance.error.type || syncBlockInstance.error.reason, syncBlockInstance.error.statusCode)));
589
+ (_this$fireAnalyticsEv0 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv0 === void 0 ? void 0 : _this$fireAnalyticsEv0.call(this, fetchErrorPayload(syncBlockInstance.error.reason || syncBlockInstance.error.type, syncBlockInstance.resourceId, (_syncBlockInstance$da = (_syncBlockInstance$da2 = syncBlockInstance.data) === null || _syncBlockInstance$da2 === void 0 ? void 0 : _syncBlockInstance$da2.product) !== null && _syncBlockInstance$da !== void 0 ? _syncBlockInstance$da : getSourceProductFromResourceIdSafe(syncBlockInstance.resourceId), buildFetchErrorAttribution(syncBlockInstance.error.type || syncBlockInstance.error.reason, syncBlockInstance.error.statusCode)));
582
590
  }
583
591
  if (syncBlockInstance.error.type === SyncBlockError.NotFound || syncBlockInstance.error.type === SyncBlockError.Forbidden) {
584
592
  hasExpectedError = true;
@@ -598,8 +606,8 @@ export class ReferenceSyncBlockStoreManager {
598
606
  const callbacks = this._subscriptionManager.getSubscriptions().get(syncBlockInstance.resourceId);
599
607
  const localIds = callbacks ? Object.keys(callbacks) : [];
600
608
  localIds.forEach(localId => {
601
- var _this$fireAnalyticsEv0, _syncBlockInstance$da3, _syncBlockInstance$da4;
602
- (_this$fireAnalyticsEv0 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv0 === void 0 ? void 0 : _this$fireAnalyticsEv0.call(this, fetchSuccessPayload(syncBlockInstance.resourceId, localId, (_syncBlockInstance$da3 = (_syncBlockInstance$da4 = syncBlockInstance.data) === null || _syncBlockInstance$da4 === void 0 ? void 0 : _syncBlockInstance$da4.product) !== null && _syncBlockInstance$da3 !== void 0 ? _syncBlockInstance$da3 : getSourceProductFromResourceIdSafe(syncBlockInstance.resourceId)));
609
+ var _this$fireAnalyticsEv1, _syncBlockInstance$da3, _syncBlockInstance$da4;
610
+ (_this$fireAnalyticsEv1 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv1 === void 0 ? void 0 : _this$fireAnalyticsEv1.call(this, fetchSuccessPayload(syncBlockInstance.resourceId, localId, (_syncBlockInstance$da3 = (_syncBlockInstance$da4 = syncBlockInstance.data) === null || _syncBlockInstance$da4 === void 0 ? void 0 : _syncBlockInstance$da4.product) !== null && _syncBlockInstance$da3 !== void 0 ? _syncBlockInstance$da3 : getSourceProductFromResourceIdSafe(syncBlockInstance.resourceId)));
603
611
  });
604
612
  this.fetchSyncBlockSourceInfo(resolvedSyncBlockInstance.resourceId);
605
613
  });
@@ -613,8 +621,8 @@ export class ReferenceSyncBlockStoreManager {
613
621
  // If the cache entry was deleted while the source-info request was
614
622
  // in flight, fire an analytics event so the race is observable.
615
623
  if (!existingSyncBlock) {
616
- var _this$fireAnalyticsEv1;
617
- (_this$fireAnalyticsEv1 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv1 === void 0 ? void 0 : _this$fireAnalyticsEv1.call(this, sourceInfoOrphanedPayload(resourceId, getSourceProductFromResourceIdSafe(resourceId), {
624
+ var _this$fireAnalyticsEv10;
625
+ (_this$fireAnalyticsEv10 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv10 === void 0 ? void 0 : _this$fireAnalyticsEv10.call(this, sourceInfoOrphanedPayload(resourceId, getSourceProductFromResourceIdSafe(resourceId), {
618
626
  hasPendingDeletion: this.pendingCacheDeletions.has(resourceId),
619
627
  hasSubscribers: this._subscriptionManager.getSubscriptions().has(resourceId)
620
628
  }));
@@ -753,7 +761,7 @@ export class ReferenceSyncBlockStoreManager {
753
761
  }
754
762
  const currentCount = (_this$cacheDeletionRe = this.cacheDeletionRescheduleCounts.get(resourceId)) !== null && _this$cacheDeletionRe !== void 0 ? _this$cacheDeletionRe : 0;
755
763
  if (currentCount >= CACHE_DELETION_MAX_RESCHEDULES) {
756
- var _this$fireAnalyticsEv10;
764
+ var _this$fireAnalyticsEv11;
757
765
  // Stuck guard — force deletion to prevent unbounded memory growth and
758
766
  // fire analytics so the stuck state is visible in production telemetry.
759
767
  //
@@ -763,7 +771,7 @@ export class ReferenceSyncBlockStoreManager {
763
771
  // continue to render with stale data until their next re-render
764
772
  // triggers a new batch fetch — typically within ~1 frame. We accept
765
773
  // this brief stale window in exchange for bounded memory growth.
766
- (_this$fireAnalyticsEv10 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv10 === void 0 ? void 0 : _this$fireAnalyticsEv10.call(this, cacheDeletionForcedPayload(currentCount, resourceId, getSourceProductFromResourceIdSafe(resourceId)));
774
+ (_this$fireAnalyticsEv11 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv11 === void 0 ? void 0 : _this$fireAnalyticsEv11.call(this, cacheDeletionForcedPayload(currentCount, resourceId, getSourceProductFromResourceIdSafe(resourceId)));
767
775
  logException(new Error(`Cache deletion forced after ${currentCount} reschedules — stuck in-flight guard`), {
768
776
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager/cache-deletion-forced'
769
777
  });
@@ -891,7 +899,7 @@ export class ReferenceSyncBlockStoreManager {
891
899
  }
892
900
  return this.subscribeToSyncBlock(resourceId, localId, callback);
893
901
  } catch (error) {
894
- var _this$fireAnalyticsEv11;
902
+ var _this$fireAnalyticsEv12;
895
903
  // EDITOR-7860: benign not-ready/torn-down case — suppress both the
896
904
  // exception-tracker log and the analytics event (checked first so the
897
905
  // benign case stays fully silent).
@@ -901,7 +909,7 @@ export class ReferenceSyncBlockStoreManager {
901
909
  logException(error, {
902
910
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
903
911
  });
904
- (_this$fireAnalyticsEv11 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv11 === void 0 ? void 0 : _this$fireAnalyticsEv11.call(this, fetchErrorPayload(error.message, undefined, undefined, buildFetchErrorAttribution(error.message)));
912
+ (_this$fireAnalyticsEv12 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv12 === void 0 ? void 0 : _this$fireAnalyticsEv12.call(this, fetchErrorPayload(error.message, undefined, undefined, buildFetchErrorAttribution(error.message)));
905
913
  return () => {};
906
914
  }
907
915
  }
@@ -1005,15 +1013,15 @@ export class ReferenceSyncBlockStoreManager {
1005
1013
  (_this$saveExperience = this.saveExperience) === null || _this$saveExperience === void 0 ? void 0 : _this$saveExperience.start();
1006
1014
  const updateResult = await this.dataProvider.updateReferenceData(blocks);
1007
1015
  if (!updateResult.success) {
1008
- var _this$saveExperience2, _this$fireAnalyticsEv12;
1016
+ var _this$saveExperience2, _this$fireAnalyticsEv13;
1009
1017
  success = false;
1010
1018
  (_this$saveExperience2 = this.saveExperience) === null || _this$saveExperience2 === void 0 ? void 0 : _this$saveExperience2.failure({
1011
1019
  reason: updateResult.error || 'Failed to update reference synced blocks on the document'
1012
1020
  });
1013
- (_this$fireAnalyticsEv12 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv12 === void 0 ? void 0 : _this$fireAnalyticsEv12.call(this, updateReferenceErrorPayload(updateResult.error || 'Failed to update reference synced blocks on the document', undefined, undefined, buildErrorAttribution(updateResult.error, updateResult.statusCode)));
1021
+ (_this$fireAnalyticsEv13 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv13 === void 0 ? void 0 : _this$fireAnalyticsEv13.call(this, updateReferenceErrorPayload(updateResult.error || 'Failed to update reference synced blocks on the document', undefined, undefined, buildErrorAttribution(updateResult.error, updateResult.statusCode)));
1014
1022
  }
1015
1023
  } catch (error) {
1016
- var _this$saveExperience3, _this$fireAnalyticsEv13;
1024
+ var _this$saveExperience3, _this$fireAnalyticsEv14;
1017
1025
  success = false;
1018
1026
  logException(error, {
1019
1027
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
@@ -1024,7 +1032,7 @@ export class ReferenceSyncBlockStoreManager {
1024
1032
  // No `resourceId` available in this catch — sourceProduct is intentionally omitted.
1025
1033
  // No structured SyncBlockError/status here, so the attribution `reason` falls back
1026
1034
  // to `unknown`.
1027
- (_this$fireAnalyticsEv13 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv13 === void 0 ? void 0 : _this$fireAnalyticsEv13.call(this, updateReferenceErrorPayload(error.message, undefined, undefined, buildErrorAttribution()));
1035
+ (_this$fireAnalyticsEv14 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv14 === void 0 ? void 0 : _this$fireAnalyticsEv14.call(this, updateReferenceErrorPayload(error.message, undefined, undefined, buildErrorAttribution()));
1028
1036
  } finally {
1029
1037
  if (!success) {
1030
1038
  // set isCacheDirty back to true for cases where it failed to update the reference synced blocks on the BE
@@ -319,6 +319,29 @@ export const fetchSuccessPayload = (resourceId, blockInstanceId, sourceProduct)
319
319
  })
320
320
  }
321
321
  });
322
+
323
+ /**
324
+ * Per-request `syncedBlockGetSourceInfo` success event. Pairs with
325
+ * `getSourceInfoErrorPayload` so a success rate can be computed per request.
326
+ */
327
+ export const getSourceInfoSuccessPayload = (resourceId, blockInstanceId, sourceProduct, sourceLocation) => ({
328
+ action: ACTION.FETCHED,
329
+ actionSubject: ACTION_SUBJECT.SYNCED_BLOCK,
330
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
331
+ eventType: EVENT_TYPE.OPERATIONAL,
332
+ attributes: {
333
+ resourceId,
334
+ ...(blockInstanceId && {
335
+ blockInstanceId
336
+ }),
337
+ ...(sourceProduct && {
338
+ sourceProduct
339
+ }),
340
+ ...(sourceLocation && {
341
+ sourceLocation
342
+ })
343
+ }
344
+ });
322
345
  export const createSuccessPayload = (resourceId, sourceProduct, sourceLocation) => {
323
346
  return {
324
347
  action: ACTION.INSERTED,
@@ -1,5 +1,4 @@
1
1
  import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
2
- import { fg } from '@atlaskit/platform-feature-flags/fg';
3
2
  import { getLocationScope, getProductFromSourceAri } from '../clients/block-service/ari';
4
3
  import { JIRA_DESCRIPTION_FIELD_ID, parseJiraFieldLocation } from '../clients/jira/ari';
5
4
  /**
@@ -25,14 +24,8 @@ export const getFieldAwareLocationScope = ({
25
24
  /**
26
25
  * Analytics `sourceLocation` for a source ARI: `undefined` for non-Jira sources and for the
27
26
  * control cohort, so events outside the experiment keep their current shape.
28
- *
29
- * The `platform_editor_blocks_patch_13` gate runs first: with it off this returns `undefined`
30
- * without the product check or the experiment read, so no new exposure is logged.
31
27
  */
32
28
  export const getSourceLocation = sourceAri => {
33
- if (!fg('platform_editor_blocks_patch_13')) {
34
- return undefined;
35
- }
36
29
  if (!sourceAri || !isFieldAwareJiraLocation(getProductFromSourceAri(sourceAri))) {
37
30
  return undefined;
38
31
  }
@@ -14,7 +14,7 @@ import isEqual from 'lodash/isEqual';
14
14
  import { logException } from '@atlaskit/editor-common/monitoring/error';
15
15
  import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
16
16
  import { isProviderNotReadyError, ProviderNotReadyError, SyncBlockError } from '../common/types';
17
- import { buildErrorAttribution, buildFetchErrorAttribution, cacheDeletionForcedPayload, fetchErrorPayload, fetchSuccessPayload, getSourceInfoErrorPayload, sourceInfoOrphanedPayload, updateReferenceErrorPayload } from '../utils/errorHandling';
17
+ import { buildErrorAttribution, buildFetchErrorAttribution, cacheDeletionForcedPayload, fetchErrorPayload, fetchSuccessPayload, getSourceInfoErrorPayload, getSourceInfoSuccessPayload, sourceInfoOrphanedPayload, updateReferenceErrorPayload } from '../utils/errorHandling';
18
18
  import { getFetchExperience, getFetchSourceInfoExperience, getSaveReferenceExperience } from '../utils/experienceTracking';
19
19
  import { getSourceLocation } from '../utils/fieldAwareLocations';
20
20
  import { resolveSyncBlockInstance } from '../utils/resolveSyncBlockInstance';
@@ -428,17 +428,20 @@ export var ReferenceSyncBlockStoreManager = /*#__PURE__*/function () {
428
428
  // `product` from cached data is preferred when available; fall back to parsing
429
429
  // the resourceId.
430
430
  var sourceProduct = product !== null && product !== void 0 ? product : getSourceProductFromResourceIdSafe(resourceId);
431
+
432
+ // With the experiment off, events and experience calls are identical to master.
433
+ var isPerRequestSourceInfo = isExperimentEnabled('platform_editor_blocks_patch_12');
431
434
  if (!sourceAri || !product || !blockInstanceId) {
432
435
  var _this$fireAnalyticsEv3;
433
- (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 || _this$fireAnalyticsEv3.call(this, getSourceInfoErrorPayload('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct));
436
+ (_this$fireAnalyticsEv3 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 || _this$fireAnalyticsEv3.call(this, getSourceInfoErrorPayload('SourceAri, product or blockInstanceId missing', resourceId, sourceProduct, isPerRequestSourceInfo ? getSourceLocation(sourceAri) : undefined));
434
437
  return Promise.resolve(undefined);
435
438
  }
436
439
  var sourceLocation = getSourceLocation(sourceAri);
437
- // Undefined with `platform_editor_blocks_patch_13` off, so experience calls below keep
438
- // exactly their previous arguments (no `metadata` key, `success()` without arguments).
439
- var experienceMetadata = sourceLocation && {
440
+ // The shared experience cannot count requests, so with the experiment on the
441
+ // per-request event below carries `sourceLocation` instead of the experience.
442
+ var experienceMetadata = !isPerRequestSourceInfo && sourceLocation ? {
440
443
  sourceLocation: sourceLocation
441
- };
444
+ } : undefined;
442
445
  var withExperienceMetadata = function withExperienceMetadata(options) {
443
446
  return experienceMetadata ? _objectSpread(_objectSpread({}, options), {}, {
444
447
  metadata: experienceMetadata
@@ -469,20 +472,25 @@ export var ReferenceSyncBlockStoreManager = /*#__PURE__*/function () {
469
472
  var _this2$fetchSourceInf3;
470
473
  (_this2$fetchSourceInf3 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf3 === void 0 || _this2$fetchSourceInf3.success();
471
474
  }
475
+ // Pairs with the error event above as the per-request denominator.
476
+ if (isPerRequestSourceInfo && sourceLocation) {
477
+ var _this2$fireAnalyticsE2;
478
+ (_this2$fireAnalyticsE2 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE2 === void 0 || _this2$fireAnalyticsE2.call(_this2, getSourceInfoSuccessPayload(resourceId, blockInstanceId, sourceProduct, sourceLocation));
479
+ }
472
480
  } else {
473
- var _this2$fetchSourceInf4, _this2$fireAnalyticsE2;
481
+ var _this2$fetchSourceInf4, _this2$fireAnalyticsE3;
474
482
  (_this2$fetchSourceInf4 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf4 === void 0 || _this2$fetchSourceInf4.failure(withExperienceMetadata({
475
483
  reason: 'Missing title or url'
476
484
  }));
477
- (_this2$fireAnalyticsE2 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE2 === void 0 || _this2$fireAnalyticsE2.call(_this2, getSourceInfoErrorPayload('Missing title or url', resourceId, sourceProduct, sourceLocation));
485
+ (_this2$fireAnalyticsE3 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE3 === void 0 || _this2$fireAnalyticsE3.call(_this2, getSourceInfoErrorPayload('Missing title or url', resourceId, sourceProduct, sourceLocation));
478
486
  }
479
487
  return sourceInfo;
480
488
  }).catch(function (error) {
481
- var _this2$fetchSourceInf5, _this2$fireAnalyticsE3;
489
+ var _this2$fetchSourceInf5, _this2$fireAnalyticsE4;
482
490
  (_this2$fetchSourceInf5 = _this2.fetchSourceInfoExperience) === null || _this2$fetchSourceInf5 === void 0 || _this2$fetchSourceInf5.failure(withExperienceMetadata({
483
491
  reason: error.message
484
492
  }));
485
- (_this2$fireAnalyticsE3 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE3 === void 0 || _this2$fireAnalyticsE3.call(_this2, getSourceInfoErrorPayload(error.message, resourceId, sourceProduct, sourceLocation));
493
+ (_this2$fireAnalyticsE4 = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE4 === void 0 || _this2$fireAnalyticsE4.call(_this2, getSourceInfoErrorPayload(error.message, resourceId, sourceProduct, sourceLocation));
486
494
  return undefined;
487
495
  }).finally(function () {
488
496
  _this2.syncBlockSourceInfoRequests.delete(resourceId);
@@ -324,6 +324,28 @@ export var fetchSuccessPayload = function fetchSuccessPayload(resourceId, blockI
324
324
  })
325
325
  };
326
326
  };
327
+
328
+ /**
329
+ * Per-request `syncedBlockGetSourceInfo` success event. Pairs with
330
+ * `getSourceInfoErrorPayload` so a success rate can be computed per request.
331
+ */
332
+ export var getSourceInfoSuccessPayload = function getSourceInfoSuccessPayload(resourceId, blockInstanceId, sourceProduct, sourceLocation) {
333
+ return {
334
+ action: ACTION.FETCHED,
335
+ actionSubject: ACTION_SUBJECT.SYNCED_BLOCK,
336
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
337
+ eventType: EVENT_TYPE.OPERATIONAL,
338
+ attributes: _objectSpread(_objectSpread(_objectSpread({
339
+ resourceId: resourceId
340
+ }, blockInstanceId && {
341
+ blockInstanceId: blockInstanceId
342
+ }), sourceProduct && {
343
+ sourceProduct: sourceProduct
344
+ }), sourceLocation && {
345
+ sourceLocation: sourceLocation
346
+ })
347
+ };
348
+ };
327
349
  export var createSuccessPayload = function createSuccessPayload(resourceId, sourceProduct, sourceLocation) {
328
350
  return {
329
351
  action: ACTION.INSERTED,
@@ -1,5 +1,4 @@
1
1
  import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
2
- import { fg } from '@atlaskit/platform-feature-flags/fg';
3
2
  import { getLocationScope, getProductFromSourceAri } from '../clients/block-service/ari';
4
3
  import { JIRA_DESCRIPTION_FIELD_ID, parseJiraFieldLocation } from '../clients/jira/ari';
5
4
  /**
@@ -28,14 +27,8 @@ export var getFieldAwareLocationScope = function getFieldAwareLocationScope(_ref
28
27
  /**
29
28
  * Analytics `sourceLocation` for a source ARI: `undefined` for non-Jira sources and for the
30
29
  * control cohort, so events outside the experiment keep their current shape.
31
- *
32
- * The `platform_editor_blocks_patch_13` gate runs first: with it off this returns `undefined`
33
- * without the product check or the experiment read, so no new exposure is logged.
34
30
  */
35
31
  export var getSourceLocation = function getSourceLocation(sourceAri) {
36
- if (!fg('platform_editor_blocks_patch_13')) {
37
- return undefined;
38
- }
39
32
  if (!sourceAri || !isFieldAwareJiraLocation(getProductFromSourceAri(sourceAri))) {
40
33
  return undefined;
41
34
  }
@@ -175,6 +175,11 @@ export declare const sourceInfoOrphanedPayload: (resourceId?: string, sourceProd
175
175
  export declare const cacheDeletionForcedPayload: (rescheduleCount: number, resourceId?: string, sourceProduct?: string) => RendererSyncBlockEventPayload;
176
176
  export declare const fetchReferencesErrorPayload: (error: string, resourceId?: string, sourceProduct?: string) => SyncBlockEventPayload;
177
177
  export declare const fetchSuccessPayload: (resourceId: string, blockInstanceId?: string, sourceProduct?: string) => RendererSyncBlockEventPayload;
178
+ /**
179
+ * Per-request `syncedBlockGetSourceInfo` success event. Pairs with
180
+ * `getSourceInfoErrorPayload` so a success rate can be computed per request.
181
+ */
182
+ export declare const getSourceInfoSuccessPayload: (resourceId: string, blockInstanceId?: string, sourceProduct?: string, sourceLocation?: SyncBlockSourceLocation) => RendererSyncBlockEventPayload;
178
183
  export declare const createSuccessPayload: (resourceId: string, sourceProduct?: string, sourceLocation?: SyncBlockSourceLocation) => SyncBlockEventPayload;
179
184
  /**
180
185
  * Optional enrichment for the `syncedBlockCreate` success event. All fields
@@ -17,8 +17,5 @@ export declare const getFieldAwareLocationScope: ({ documentAri, hostAri, produc
17
17
  /**
18
18
  * Analytics `sourceLocation` for a source ARI: `undefined` for non-Jira sources and for the
19
19
  * control cohort, so events outside the experiment keep their current shape.
20
- *
21
- * The `platform_editor_blocks_patch_13` gate runs first: with it off this returns `undefined`
22
- * without the product check or the experiment read, so no new exposure is logged.
23
20
  */
24
21
  export declare const getSourceLocation: (sourceAri: string | undefined) => SyncBlockSourceLocation | undefined;
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "@atlaskit/platform-feature-experiments": "^0.3.0",
27
27
  "@atlaskit/platform-feature-flags": "^2.2.0",
28
28
  "@atlaskit/task-decision": "^21.12.0",
29
- "@atlaskit/tmp-editor-statsig": "^243.0.0",
29
+ "@atlaskit/tmp-editor-statsig": "^244.0.0",
30
30
  "@babel/runtime": "^7.0.0",
31
31
  "@compiled/react": "^1.0.2",
32
32
  "bind-event-listener": "^3.0.0",
@@ -36,7 +36,7 @@
36
36
  "uuid": "^11.1.1"
37
37
  },
38
38
  "peerDependencies": {
39
- "@atlaskit/editor-common": "^133.1.0",
39
+ "@atlaskit/editor-common": "^133.2.0",
40
40
  "react": "^18.2.0 || ^19.2.0"
41
41
  },
42
42
  "devDependencies": {
@@ -45,16 +45,11 @@
45
45
  "react-dom": "^19.2.0"
46
46
  },
47
47
  "name": "@atlaskit/editor-synced-block-provider",
48
- "version": "25.0.1",
48
+ "version": "25.0.3",
49
49
  "description": "Synced Block Provider for @atlaskit/editor-plugin-synced-block",
50
50
  "author": "Atlassian Pty Ltd",
51
51
  "license": "Apache-2.0",
52
52
  "publishConfig": {
53
53
  "registry": "https://registry.npmjs.org/"
54
- },
55
- "platform-feature-flags": {
56
- "platform_editor_blocks_patch_13": {
57
- "type": "boolean"
58
- }
59
54
  }
60
55
  }