@atlassian/atlassian-connect-js 5.3.190 → 5.3.192
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/.envrc +6 -4
- package/.netrc +1 -1
- package/bitbucket-pipelines.yml +9 -1
- package/dist/connect-host.js +76 -24
- package/dist/iframe-fedramp.js +10 -38
- package/dist/iframe.js +10 -38
- package/package.json +2 -2
- package/spec/tests/analytics_dispatcher_spec.js +1 -1
- package/spec/tests/feature_flag_spec.js +98 -0
- package/spec/tests/utils/host_util_spec.js +29 -0
- package/src/host/index.js +11 -13
- package/src/host/util.js +9 -0
- package/src/host/utils/feature-flag.js +42 -9
- package/src/plugin/theming.js +1 -2
package/.envrc
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
PACKAGES_USERNAME=mi-ar-oi-bb-_c-58-43-9f-de-
|
|
2
|
-
PACKAGES_PASSWORD=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.
|
|
3
|
-
PACKAGES_ACCESS_TOKEN=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.
|
|
4
|
-
PACKAGES_PASSWORD_BASE64=
|
|
1
|
+
PACKAGES_USERNAME=mi-ar-oi-bb-_c-58-43-9f-de-58-48-92-96
|
|
2
|
+
PACKAGES_PASSWORD=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTU4LTQ4LTkyLTk2Iiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxOTQzOCwiaWF0IjoxNzQ4MzE1ODM4LCJqdGkiOiJjMDQ2YzM0Mi02MjZlLTQ0OTUtOTA3YS1iMTJhNzNhMTM4ZmIifQ.T4_bjnPXzB-vTyiPridf7SjtuH181svu4wpjp-BVoa2Cp3UDclquis0daSzrU5CH7f2AEDlGODkeuvqqqm75PrffgBfulIq-LLYtpHu1QjpCWcShI_31hQaO--4RvMTjpx9K3IHtK93Gqhkr_m0FznOc0mkqybfAbMgaIHO_1SX9j3EL-z2NFs7IltVOhhf4UoxUXUDlodU30kEdXxfYAsG9qVzwh7dL4DxqA3PZOvUl8Xn-Qwb1xMuREREfyddbuUA1JA9kHpEKTa-VbidA3-CoopyeScRrLgq-eula9eKSAcBiBmgX7tRgChMesoRgDIB1nC2ONhwtFQH-AgkznQ
|
|
3
|
+
PACKAGES_ACCESS_TOKEN=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTU4LTQ4LTkyLTk2Iiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxOTQzOCwiaWF0IjoxNzQ4MzE1ODM4LCJqdGkiOiJjMDQ2YzM0Mi02MjZlLTQ0OTUtOTA3YS1iMTJhNzNhMTM4ZmIifQ.T4_bjnPXzB-vTyiPridf7SjtuH181svu4wpjp-BVoa2Cp3UDclquis0daSzrU5CH7f2AEDlGODkeuvqqqm75PrffgBfulIq-LLYtpHu1QjpCWcShI_31hQaO--4RvMTjpx9K3IHtK93Gqhkr_m0FznOc0mkqybfAbMgaIHO_1SX9j3EL-z2NFs7IltVOhhf4UoxUXUDlodU30kEdXxfYAsG9qVzwh7dL4DxqA3PZOvUl8Xn-Qwb1xMuREREfyddbuUA1JA9kHpEKTa-VbidA3-CoopyeScRrLgq-eula9eKSAcBiBmgX7tRgChMesoRgDIB1nC2ONhwtFQH-AgkznQ
|
|
4
|
+
PACKAGES_PASSWORD_BASE64=ZXlKMlpYSWlPaUl5SWl3aWRIbHdJam9pU2xkVUlpd2lZV3huSWpvaVVsTXlOVFlpTENKcmFXUWlPaUpDTUdrd1FXSjVZVEJyV0RoSGNtNDJjekZ6YjIxb1ptUm5hWGRaVWtWU1pGbFZYMk5yTTFsSE5YTkZJbjAuZXlKemRXSWlPaUpxWm1GalFEQXhaWFpyWldZeE5XRTBNWGRtTUROd09XUnJObW93YUhOMEwzVnpaWEp6TDIxcExXRnlMVzlwTFdKaUxWOWpMVFU0TFRRekxUbG1MV1JsTFRVNExUUTRMVGt5TFRrMklpd2ljMk53SWpvaVlYQndiR2xsWkMxd1pYSnRhWE56YVc5dWN5OW5jbTkxY0hNNmIzQmxibk52ZFhKalpTMXdkV0pzYVhOb0lpd2lZWFZrSWpvaUtrQXFJaXdpYVhOeklqb2lhbVpoWTBBd01XVjJhMlZtTVRWaE5ERjNaakF6Y0Rsa2F6WnFNR2h6ZENJc0ltVjRjQ0k2TVRjME9ETXhPVFF6T0N3aWFXRjBJam94TnpRNE16RTFPRE00TENKcWRHa2lPaUpqTURRMll6TTBNaTAyTWpabExUUTBPVFV0T1RBM1lTMWlNVEpoTnpOaE1UTTRabUlpZlEuVDRfYmpuUFh6Qi12VHlpUHJpZGY3U2p0dUgxODFzdnU0d3BqcC1CVm9hMkNwM1VEY2xxdWlzMGRhU3pyVTVDSDdmMkFFRGxHT0RrZXV2cXFxbTc1UHJmZmdCZnVsSXEtTExZdHBIdTFRanBDV2NTaElfMzFoUWFPLS00UnZNVGpweDlLM0lIdEs5M0dxaGtyX20wRnpuT2MwbWtxeWJmQWJNZ2FJSE9fMVNYOWozRUwtejJORnM3SWx0Vk9oaGY0VW94VVhVRGxvZFUzMGtFZFh4ZllBc0c5cVZ6d2g3ZEw0RHhxQTNQWk92VWw4WG4tUXdiMXhNdVJFUkVmeWRkYnVVQTFKQTlrSHBFS1RhLVZiaWRBMy1Db29weWVTY1JyTGdxLWV1bGE5ZUtTQWNCaUJtZ1g3dFJnQ2hNZXNvUmdESUIxbkMyT05od3RGUUgtQWdrem5RCg==
|
|
5
5
|
export PACKAGES_USERNAME PACKAGES_PASSWORD PACKAGES_ACCESS_TOKEN PACKAGES_PASSWORD_BASE64
|
|
6
|
+
mkdir -p /root/.m2
|
|
7
|
+
mv /opt/atlassian/pipelines/agent/build/settings.xml /root/.m2/settings.xml
|
package/.netrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
machine packages.atlassian.com login mi-ar-oi-bb-_c-58-43-9f-de-
|
|
1
|
+
machine packages.atlassian.com login mi-ar-oi-bb-_c-58-43-9f-de-58-48-92-96 password eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTU4LTQ4LTkyLTk2Iiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxOTQzOCwiaWF0IjoxNzQ4MzE1ODM4LCJqdGkiOiJjMDQ2YzM0Mi02MjZlLTQ0OTUtOTA3YS1iMTJhNzNhMTM4ZmIifQ.T4_bjnPXzB-vTyiPridf7SjtuH181svu4wpjp-BVoa2Cp3UDclquis0daSzrU5CH7f2AEDlGODkeuvqqqm75PrffgBfulIq-LLYtpHu1QjpCWcShI_31hQaO--4RvMTjpx9K3IHtK93Gqhkr_m0FznOc0mkqybfAbMgaIHO_1SX9j3EL-z2NFs7IltVOhhf4UoxUXUDlodU30kEdXxfYAsG9qVzwh7dL4DxqA3PZOvUl8Xn-Qwb1xMuREREfyddbuUA1JA9kHpEKTa-VbidA3-CoopyeScRrLgq-eula9eKSAcBiBmgX7tRgChMesoRgDIB1nC2ONhwtFQH-AgkznQ
|
package/bitbucket-pipelines.yml
CHANGED
|
@@ -10,10 +10,18 @@ pipelines:
|
|
|
10
10
|
- pipe: docker://atlassian/packages-oidc-pipe:latest
|
|
11
11
|
- source .envrc
|
|
12
12
|
- apt-get update && apt-get install -y jq
|
|
13
|
+
- npm version patch --no-git-tag-version
|
|
13
14
|
- npm ci # prepublish/build also runs at this stage
|
|
15
|
+
- PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
|
14
16
|
- NODE_OPTIONS=--openssl-legacy-provider npm run test-sl
|
|
15
|
-
- echo "Publishing to Atlassian Artifactory npm-public..."
|
|
17
|
+
- echo "Publishing new version $PACKAGE_VERSION to Atlassian Artifactory npm-public..."
|
|
16
18
|
- npm publish --ddd --userconfig=./.npmrc-public --@atlassian/atlassian-connect-js:registry="https://packages.atlassian.com/api/npm/npm-public/"
|
|
19
|
+
- echo "Commiting new version $PACKAGE_VERSION to git "
|
|
20
|
+
- TOKEN=`curl -s -S -f -X POST -u "${BUILDBOT_KEY}:${BUILDBOT_SECRET}" https://bitbucket.org/site/oauth2/access_token -d grant_type=client_credentials | jq '.access_token'`
|
|
21
|
+
- git remote set-url origin https://x-token-auth:${TOKEN}@bitbucket.org/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}.git
|
|
22
|
+
- git config user.email "${BUILDBOT_EMAIL}"
|
|
23
|
+
- git config user.name "${BUILDBOT_NAME}"
|
|
24
|
+
- git add . && git commit -m "$PACKAGE_VERSION release [skip ci]" && git push origin master
|
|
17
25
|
|
|
18
26
|
default:
|
|
19
27
|
- step:
|
package/dist/connect-host.js
CHANGED
|
@@ -1588,6 +1588,14 @@
|
|
|
1588
1588
|
}
|
|
1589
1589
|
return '';
|
|
1590
1590
|
}
|
|
1591
|
+
|
|
1592
|
+
/**
|
|
1593
|
+
* Returns whether the page we are on is Jira based on meta tag 'application-name'
|
|
1594
|
+
* @returns {boolean}
|
|
1595
|
+
*/
|
|
1596
|
+
function guessIsJiraFromMetaTag() {
|
|
1597
|
+
return $('meta[name=\'application-name\']').attr('content') === 'JIRA';
|
|
1598
|
+
}
|
|
1591
1599
|
var Util = {
|
|
1592
1600
|
escapeSelector: escapeSelector,
|
|
1593
1601
|
stringToDimension: stringToDimension,
|
|
@@ -1598,7 +1606,8 @@
|
|
|
1598
1606
|
debounce: debounce$1,
|
|
1599
1607
|
isSupported: isSupported,
|
|
1600
1608
|
extend: Object.assign,
|
|
1601
|
-
guessProductFromModuleDefined: guessProductFromModuleDefined
|
|
1609
|
+
guessProductFromModuleDefined: guessProductFromModuleDefined,
|
|
1610
|
+
guessIsJiraFromMetaTag: guessIsJiraFromMetaTag
|
|
1602
1611
|
};
|
|
1603
1612
|
|
|
1604
1613
|
var events = {
|
|
@@ -9720,24 +9729,69 @@
|
|
|
9720
9729
|
*/
|
|
9721
9730
|
var FeatureGates$1 = boundFGJS;
|
|
9722
9731
|
|
|
9723
|
-
function
|
|
9724
|
-
|
|
9725
|
-
|
|
9732
|
+
function getFeatureGateJiraLegacy(flagName) {
|
|
9733
|
+
try {
|
|
9734
|
+
var FeatureManager = window.require('jira/featureflags/feature-manager');
|
|
9735
|
+
var value = FeatureManager.isFeatureEnabled(flagName);
|
|
9736
|
+
console.debug('[ACJS] Feature flag evaluated via Jira Legacy Feature Flag Manager', {
|
|
9737
|
+
flagName: flagName,
|
|
9738
|
+
value: value
|
|
9739
|
+
});
|
|
9740
|
+
return value;
|
|
9741
|
+
} catch (e) {
|
|
9742
|
+
console.error('[ACJS] Jira Legacy Feature Flag Manager not available. Default flag to false', {
|
|
9743
|
+
flagName: flagName,
|
|
9744
|
+
e: e
|
|
9745
|
+
});
|
|
9746
|
+
analytics$1.trackGasV3FeatureFlagDefaultFalse(flagName);
|
|
9747
|
+
return false;
|
|
9726
9748
|
}
|
|
9727
|
-
|
|
9728
|
-
|
|
9729
|
-
|
|
9749
|
+
}
|
|
9750
|
+
function getFeatureGateConfluenceLegacy(flagName) {
|
|
9751
|
+
if (!AJS.DarkFeatures) {
|
|
9752
|
+
console.error('[ACJS] Confluence Dark Features not available. Default flag to false', {
|
|
9753
|
+
flagName: flagName
|
|
9754
|
+
});
|
|
9755
|
+
analytics$1.trackGasV3FeatureFlagDefaultFalse(flagName);
|
|
9756
|
+
return false;
|
|
9757
|
+
}
|
|
9758
|
+
var value = AJS.DarkFeatures.isEnabled(flagName);
|
|
9759
|
+
console.debug('[ACJS] Feature flag evaluated via Confluence Dark Features', {
|
|
9760
|
+
flagName: flagName,
|
|
9761
|
+
value: value
|
|
9762
|
+
});
|
|
9763
|
+
return value;
|
|
9730
9764
|
}
|
|
9731
9765
|
|
|
9732
9766
|
/**
|
|
9733
|
-
*
|
|
9734
|
-
*
|
|
9767
|
+
* Fetches feature flag value from Statsig either from:
|
|
9768
|
+
* - feature-gate-js-client which is initialised in AFM
|
|
9769
|
+
* - AMD module jira/featureflags/feature-manager
|
|
9770
|
+
* - AJS.DarkFeatures module
|
|
9771
|
+
*
|
|
9772
|
+
* For legacy pages, the feature gate client is initialised after the ACJS host code is run (i.e. connectHost)
|
|
9773
|
+
* Therefore, upon page load for legacy pages, we use modules defined by Legacy WRMs to retrieve the feature flag values instead.
|
|
9735
9774
|
*
|
|
9736
9775
|
* @param {string} flagName Feature flag name
|
|
9737
9776
|
* @returns {boolean}
|
|
9738
9777
|
*/
|
|
9739
9778
|
function getBooleanFeatureFlag(flagName) {
|
|
9740
|
-
|
|
9779
|
+
if (FeatureGates$1.initializeCompleted()) {
|
|
9780
|
+
var value = FeatureGates$1.checkGate(flagName);
|
|
9781
|
+
console.debug('[ACJS] Feature flag evaluated via SPA Statsig Client', {
|
|
9782
|
+
flagName: flagName,
|
|
9783
|
+
value: value
|
|
9784
|
+
});
|
|
9785
|
+
return value;
|
|
9786
|
+
}
|
|
9787
|
+
console.warn('[ACJS] SPA Statsig Client not initialised.', {
|
|
9788
|
+
flagName: flagName
|
|
9789
|
+
});
|
|
9790
|
+
var product = Util.guessIsJiraFromMetaTag() ? 'jira' : 'confluence';
|
|
9791
|
+
if (product === 'jira') {
|
|
9792
|
+
return getFeatureGateJiraLegacy(flagName);
|
|
9793
|
+
}
|
|
9794
|
+
return getFeatureGateConfluenceLegacy(flagName);
|
|
9741
9795
|
}
|
|
9742
9796
|
var Flags = {
|
|
9743
9797
|
getBooleanFeatureFlag: getBooleanFeatureFlag
|
|
@@ -13841,7 +13895,7 @@
|
|
|
13841
13895
|
* Add version
|
|
13842
13896
|
*/
|
|
13843
13897
|
if (!window._AP.version) {
|
|
13844
|
-
window._AP.version = '5.3.
|
|
13898
|
+
window._AP.version = '5.3.192';
|
|
13845
13899
|
}
|
|
13846
13900
|
host$1.defineModule('messages', messages);
|
|
13847
13901
|
host$1.defineModule('flag', flag);
|
|
@@ -13888,19 +13942,17 @@
|
|
|
13888
13942
|
} else {
|
|
13889
13943
|
onDocumentReady();
|
|
13890
13944
|
}
|
|
13891
|
-
|
|
13892
|
-
|
|
13893
|
-
|
|
13894
|
-
|
|
13895
|
-
|
|
13896
|
-
|
|
13897
|
-
|
|
13898
|
-
|
|
13899
|
-
|
|
13900
|
-
|
|
13901
|
-
|
|
13902
|
-
});
|
|
13903
|
-
}
|
|
13945
|
+
DomEventActions.registerClickHandler(function (iframe, data) {
|
|
13946
|
+
var iframeInfo = JSON.parse(iframe.name || '{}');
|
|
13947
|
+
var iframeInfoOptions = iframeInfo.options || {};
|
|
13948
|
+
var analyticsData = {
|
|
13949
|
+
moduleLocation: iframeInfoOptions.moduleLocation,
|
|
13950
|
+
moduleType: iframeInfoOptions.moduleType,
|
|
13951
|
+
addonKey: data.addon_key,
|
|
13952
|
+
baseUrl: iframeInfoOptions.origin
|
|
13953
|
+
};
|
|
13954
|
+
AnalyticsAction.trackIframeClick(analyticsData);
|
|
13955
|
+
});
|
|
13904
13956
|
host$1.setFeatureFlagGetter(getBooleanFeatureFlag);
|
|
13905
13957
|
|
|
13906
13958
|
return HostApi$1;
|
package/dist/iframe-fedramp.js
CHANGED
|
@@ -1374,7 +1374,7 @@ var AP = (function () {
|
|
|
1374
1374
|
_this._eventHandlers = {};
|
|
1375
1375
|
_this._pendingCallbacks = {};
|
|
1376
1376
|
_this._keyListeners = [];
|
|
1377
|
-
_this._version = "5.3.
|
|
1377
|
+
_this._version = "5.3.192";
|
|
1378
1378
|
_this._apiTampered = undefined;
|
|
1379
1379
|
_this._isSubIframe = _this._topHost !== window.parent;
|
|
1380
1380
|
_this._onConfirmedFns = [];
|
|
@@ -10804,30 +10804,6 @@ var AP = (function () {
|
|
|
10804
10804
|
}();
|
|
10805
10805
|
var setGlobalTheme$1 = setGlobalTheme;
|
|
10806
10806
|
|
|
10807
|
-
function getBooleanFeatureFlagIframe(_x) {
|
|
10808
|
-
return _getBooleanFeatureFlagIframe.apply(this, arguments);
|
|
10809
|
-
}
|
|
10810
|
-
function _getBooleanFeatureFlagIframe() {
|
|
10811
|
-
_getBooleanFeatureFlagIframe = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(flagName) {
|
|
10812
|
-
return regenerator.wrap(function _callee$(_context) {
|
|
10813
|
-
while (1) switch (_context.prev = _context.next) {
|
|
10814
|
-
case 0:
|
|
10815
|
-
if (!(combined._featureFlag && combined._featureFlag.getBooleanFeatureFlag)) {
|
|
10816
|
-
_context.next = 2;
|
|
10817
|
-
break;
|
|
10818
|
-
}
|
|
10819
|
-
return _context.abrupt("return", combined._featureFlag.getBooleanFeatureFlag(flagName));
|
|
10820
|
-
case 2:
|
|
10821
|
-
return _context.abrupt("return", false);
|
|
10822
|
-
case 3:
|
|
10823
|
-
case "end":
|
|
10824
|
-
return _context.stop();
|
|
10825
|
-
}
|
|
10826
|
-
}, _callee);
|
|
10827
|
-
}));
|
|
10828
|
-
return _getBooleanFeatureFlagIframe.apply(this, arguments);
|
|
10829
|
-
}
|
|
10830
|
-
|
|
10831
10807
|
// The CDN URL is now dynamic since we now serve all.js for both commercial and in FedRamp
|
|
10832
10808
|
// It will be injected during the build process
|
|
10833
10809
|
// eslint-disable-next-line no-undef
|
|
@@ -10958,22 +10934,18 @@ var AP = (function () {
|
|
|
10958
10934
|
}
|
|
10959
10935
|
function _preloadWebFonts() {
|
|
10960
10936
|
_preloadWebFonts = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(data) {
|
|
10961
|
-
var hasRefreshedTypography,
|
|
10937
|
+
var hasRefreshedTypography, fontRoot, woffUrl, cssUrl;
|
|
10962
10938
|
return regenerator.wrap(function _callee5$(_context5) {
|
|
10963
10939
|
while (1) switch (_context5.prev = _context5.next) {
|
|
10964
10940
|
case 0:
|
|
10965
10941
|
_context5.prev = 0;
|
|
10966
10942
|
hasRefreshedTypography = data && data.initialTheme && data.initialTheme.typography === 'typography-refreshed';
|
|
10967
|
-
|
|
10968
|
-
|
|
10969
|
-
case 4:
|
|
10970
|
-
isInNewFontCohort = _context5.sent;
|
|
10971
|
-
if (!(!isInNewFontCohort || !hasRefreshedTypography)) {
|
|
10972
|
-
_context5.next = 7;
|
|
10943
|
+
if (hasRefreshedTypography) {
|
|
10944
|
+
_context5.next = 4;
|
|
10973
10945
|
break;
|
|
10974
10946
|
}
|
|
10975
10947
|
return _context5.abrupt("return");
|
|
10976
|
-
case
|
|
10948
|
+
case 4:
|
|
10977
10949
|
fontRoot = 'https://ds-cdn.prod-east.frontend.public.atl-paas.net';
|
|
10978
10950
|
woffUrl = fontRoot + "/assets/fonts/atlassian-sans/v2/AtlassianSans-latin.woff2";
|
|
10979
10951
|
cssUrl = fontRoot + "/assets/font-rules/v4/atlassian-fonts.css";
|
|
@@ -11000,16 +10972,16 @@ var AP = (function () {
|
|
|
11000
10972
|
crossOrigin: 'true'
|
|
11001
10973
|
});
|
|
11002
10974
|
}
|
|
11003
|
-
_context5.next =
|
|
10975
|
+
_context5.next = 14;
|
|
11004
10976
|
break;
|
|
11005
|
-
case
|
|
11006
|
-
_context5.prev =
|
|
10977
|
+
case 12:
|
|
10978
|
+
_context5.prev = 12;
|
|
11007
10979
|
_context5.t0 = _context5["catch"](0);
|
|
11008
|
-
case
|
|
10980
|
+
case 14:
|
|
11009
10981
|
case "end":
|
|
11010
10982
|
return _context5.stop();
|
|
11011
10983
|
}
|
|
11012
|
-
}, _callee5, null, [[0,
|
|
10984
|
+
}, _callee5, null, [[0, 12]]);
|
|
11013
10985
|
}));
|
|
11014
10986
|
return _preloadWebFonts.apply(this, arguments);
|
|
11015
10987
|
}
|
package/dist/iframe.js
CHANGED
|
@@ -1374,7 +1374,7 @@ var AP = (function () {
|
|
|
1374
1374
|
_this._eventHandlers = {};
|
|
1375
1375
|
_this._pendingCallbacks = {};
|
|
1376
1376
|
_this._keyListeners = [];
|
|
1377
|
-
_this._version = "5.3.
|
|
1377
|
+
_this._version = "5.3.192";
|
|
1378
1378
|
_this._apiTampered = undefined;
|
|
1379
1379
|
_this._isSubIframe = _this._topHost !== window.parent;
|
|
1380
1380
|
_this._onConfirmedFns = [];
|
|
@@ -10804,30 +10804,6 @@ var AP = (function () {
|
|
|
10804
10804
|
}();
|
|
10805
10805
|
var setGlobalTheme$1 = setGlobalTheme;
|
|
10806
10806
|
|
|
10807
|
-
function getBooleanFeatureFlagIframe(_x) {
|
|
10808
|
-
return _getBooleanFeatureFlagIframe.apply(this, arguments);
|
|
10809
|
-
}
|
|
10810
|
-
function _getBooleanFeatureFlagIframe() {
|
|
10811
|
-
_getBooleanFeatureFlagIframe = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(flagName) {
|
|
10812
|
-
return regenerator.wrap(function _callee$(_context) {
|
|
10813
|
-
while (1) switch (_context.prev = _context.next) {
|
|
10814
|
-
case 0:
|
|
10815
|
-
if (!(combined._featureFlag && combined._featureFlag.getBooleanFeatureFlag)) {
|
|
10816
|
-
_context.next = 2;
|
|
10817
|
-
break;
|
|
10818
|
-
}
|
|
10819
|
-
return _context.abrupt("return", combined._featureFlag.getBooleanFeatureFlag(flagName));
|
|
10820
|
-
case 2:
|
|
10821
|
-
return _context.abrupt("return", false);
|
|
10822
|
-
case 3:
|
|
10823
|
-
case "end":
|
|
10824
|
-
return _context.stop();
|
|
10825
|
-
}
|
|
10826
|
-
}, _callee);
|
|
10827
|
-
}));
|
|
10828
|
-
return _getBooleanFeatureFlagIframe.apply(this, arguments);
|
|
10829
|
-
}
|
|
10830
|
-
|
|
10831
10807
|
// The CDN URL is now dynamic since we now serve all.js for both commercial and in FedRamp
|
|
10832
10808
|
// It will be injected during the build process
|
|
10833
10809
|
// eslint-disable-next-line no-undef
|
|
@@ -10958,22 +10934,18 @@ var AP = (function () {
|
|
|
10958
10934
|
}
|
|
10959
10935
|
function _preloadWebFonts() {
|
|
10960
10936
|
_preloadWebFonts = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(data) {
|
|
10961
|
-
var hasRefreshedTypography,
|
|
10937
|
+
var hasRefreshedTypography, fontRoot, woffUrl, cssUrl;
|
|
10962
10938
|
return regenerator.wrap(function _callee5$(_context5) {
|
|
10963
10939
|
while (1) switch (_context5.prev = _context5.next) {
|
|
10964
10940
|
case 0:
|
|
10965
10941
|
_context5.prev = 0;
|
|
10966
10942
|
hasRefreshedTypography = data && data.initialTheme && data.initialTheme.typography === 'typography-refreshed';
|
|
10967
|
-
|
|
10968
|
-
|
|
10969
|
-
case 4:
|
|
10970
|
-
isInNewFontCohort = _context5.sent;
|
|
10971
|
-
if (!(!isInNewFontCohort || !hasRefreshedTypography)) {
|
|
10972
|
-
_context5.next = 7;
|
|
10943
|
+
if (hasRefreshedTypography) {
|
|
10944
|
+
_context5.next = 4;
|
|
10973
10945
|
break;
|
|
10974
10946
|
}
|
|
10975
10947
|
return _context5.abrupt("return");
|
|
10976
|
-
case
|
|
10948
|
+
case 4:
|
|
10977
10949
|
fontRoot = 'https://ds-cdn.prod-east.frontend.public.atl-paas.net';
|
|
10978
10950
|
woffUrl = fontRoot + "/assets/fonts/atlassian-sans/v2/AtlassianSans-latin.woff2";
|
|
10979
10951
|
cssUrl = fontRoot + "/assets/font-rules/v4/atlassian-fonts.css";
|
|
@@ -11000,16 +10972,16 @@ var AP = (function () {
|
|
|
11000
10972
|
crossOrigin: 'true'
|
|
11001
10973
|
});
|
|
11002
10974
|
}
|
|
11003
|
-
_context5.next =
|
|
10975
|
+
_context5.next = 14;
|
|
11004
10976
|
break;
|
|
11005
|
-
case
|
|
11006
|
-
_context5.prev =
|
|
10977
|
+
case 12:
|
|
10978
|
+
_context5.prev = 12;
|
|
11007
10979
|
_context5.t0 = _context5["catch"](0);
|
|
11008
|
-
case
|
|
10980
|
+
case 14:
|
|
11009
10981
|
case "end":
|
|
11010
10982
|
return _context5.stop();
|
|
11011
10983
|
}
|
|
11012
|
-
}, _callee5, null, [[0,
|
|
10984
|
+
}, _callee5, null, [[0, 12]]);
|
|
11013
10985
|
}));
|
|
11014
10986
|
return _preloadWebFonts.apply(this, arguments);
|
|
11015
10987
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlassian/atlassian-connect-js",
|
|
3
|
-
"version": "5.3.
|
|
3
|
+
"version": "5.3.192",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Atlassian Connect JavaScript bridge",
|
|
6
6
|
"main": "dist/connect-host.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dev:build": "npx yalc publish --push",
|
|
17
17
|
"bundlesize": "bundlesize --config=bundlesize.config.json",
|
|
18
18
|
"depcheck": "depcheck --config=.depcheckrc.json",
|
|
19
|
-
"karma": "karma start spec/config/karma.conf.js",
|
|
19
|
+
"karma": "NODE_OPTIONS=--openssl-legacy-provider karma start spec/config/karma.conf.js",
|
|
20
20
|
"karma-ci": "npm run karma -- --single-run",
|
|
21
21
|
"lint": "eslint \"**/*.js\"",
|
|
22
22
|
"prepublish": "npm run build",
|
|
@@ -349,7 +349,7 @@ describe('Analytics Dispatcher', () => {
|
|
|
349
349
|
|
|
350
350
|
it('should trigger analytics when statsig client is not initialized', () => {
|
|
351
351
|
spyOn(AnalyticsDispatcher, '_trackAndForwardGasV3');
|
|
352
|
-
getBooleanFeatureFlag('some-flag'
|
|
352
|
+
getBooleanFeatureFlag('some-flag');
|
|
353
353
|
expect(AnalyticsDispatcher._trackAndForwardGasV3).toHaveBeenCalledWith('operational', {
|
|
354
354
|
action: 'returned',
|
|
355
355
|
actionSubject: 'defaultFalseFeatureFlag',
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import FeatureGates from '@atlaskit/feature-gate-js-client';
|
|
2
|
+
import AnalyticsDispatcher from 'src/host/dispatchers/analytics_dispatcher';
|
|
3
|
+
import util from 'src/host/util';
|
|
4
|
+
import getBooleanFeatureFlag from 'src/host/utils/feature-flag';
|
|
5
|
+
|
|
6
|
+
describe('getBooleanFeatureFlag', () => {
|
|
7
|
+
const mockFlagName = 'test-flag';
|
|
8
|
+
let originalRequire;
|
|
9
|
+
let originalAJS;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
originalRequire = window.require;
|
|
13
|
+
originalAJS = window.AJS;
|
|
14
|
+
|
|
15
|
+
// Spy on and reset all dependencies
|
|
16
|
+
spyOn(FeatureGates, 'initializeCompleted').and.callFake(() => false);
|
|
17
|
+
spyOn(FeatureGates, 'checkGate');
|
|
18
|
+
spyOn(util, 'guessIsJiraFromMetaTag').and.callFake(() => false);
|
|
19
|
+
spyOn(AnalyticsDispatcher, 'trackGasV3FeatureFlagDefaultFalse');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
window.require = originalRequire;
|
|
24
|
+
window.AJS = originalAJS;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should return Statsig JS Client return value when client has been initialized', () => {
|
|
28
|
+
FeatureGates.initializeCompleted.and.returnValue(true);
|
|
29
|
+
FeatureGates.checkGate.and.returnValue(true);
|
|
30
|
+
|
|
31
|
+
const result = getBooleanFeatureFlag(mockFlagName);
|
|
32
|
+
|
|
33
|
+
expect(FeatureGates.initializeCompleted).toHaveBeenCalled();
|
|
34
|
+
expect(FeatureGates.checkGate).toHaveBeenCalledWith(mockFlagName);
|
|
35
|
+
expect(result).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should return value from Jira feature-manager AMD when client has not yet initialized in Jira', () => {
|
|
39
|
+
util.guessIsJiraFromMetaTag.and.returnValue(true);
|
|
40
|
+
|
|
41
|
+
const mockFeatureManager = { isFeatureEnabled: jasmine.createSpy('isFeatureEnabled').and.returnValue(true) };
|
|
42
|
+
window.require = jasmine.createSpy('require').and.callFake((moduleName) => {
|
|
43
|
+
if (moduleName === 'jira/featureflags/feature-manager') {
|
|
44
|
+
return mockFeatureManager;
|
|
45
|
+
}
|
|
46
|
+
throw new Error('Module not found');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const result = getBooleanFeatureFlag(mockFlagName);
|
|
50
|
+
|
|
51
|
+
expect(util.guessIsJiraFromMetaTag).toHaveBeenCalled();
|
|
52
|
+
expect(window.require).toHaveBeenCalledWith('jira/featureflags/feature-manager');
|
|
53
|
+
expect(mockFeatureManager.isFeatureEnabled).toHaveBeenCalledWith(mockFlagName);
|
|
54
|
+
expect(result).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should fallback to false when we fail to load feature-manager AMD module in Jira', () => {
|
|
58
|
+
util.guessIsJiraFromMetaTag.and.returnValue(true);
|
|
59
|
+
|
|
60
|
+
window.require = jasmine.createSpy('require').and.callFake(() => {
|
|
61
|
+
throw new Error('Module not found');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const result = getBooleanFeatureFlag(mockFlagName);
|
|
65
|
+
|
|
66
|
+
expect(util.guessIsJiraFromMetaTag).toHaveBeenCalled();
|
|
67
|
+
expect(window.require).toHaveBeenCalledWith('jira/featureflags/feature-manager');
|
|
68
|
+
expect(AnalyticsDispatcher.trackGasV3FeatureFlagDefaultFalse).toHaveBeenCalledWith(mockFlagName);
|
|
69
|
+
expect(result).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should return value from AJS.DarkFeatures when client has not yet initialized in Confluence', () => {
|
|
73
|
+
util.guessIsJiraFromMetaTag.and.returnValue(false);
|
|
74
|
+
const mockAJS = {
|
|
75
|
+
DarkFeatures: {
|
|
76
|
+
isEnabled: jasmine.createSpy('isEnabled').and.returnValue(true),
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
window.AJS = mockAJS;
|
|
80
|
+
const result = getBooleanFeatureFlag(mockFlagName);
|
|
81
|
+
expect(util.guessIsJiraFromMetaTag).toHaveBeenCalled();
|
|
82
|
+
expect(mockAJS.DarkFeatures.isEnabled).toHaveBeenCalledWith(mockFlagName);
|
|
83
|
+
expect(result).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it('should fallback to false when AJS.DarkFeatures is not defined in Confluence', () => {
|
|
86
|
+
util.guessIsJiraFromMetaTag.and.returnValue(false);
|
|
87
|
+
window.AJS = {};
|
|
88
|
+
spyOn(console, 'error');
|
|
89
|
+
const result = getBooleanFeatureFlag(mockFlagName);
|
|
90
|
+
expect(util.guessIsJiraFromMetaTag).toHaveBeenCalled();
|
|
91
|
+
expect(console.error).toHaveBeenCalledWith(
|
|
92
|
+
'[ACJS] Confluence Dark Features not available. Default flag to false',
|
|
93
|
+
{ flagName: mockFlagName }
|
|
94
|
+
);
|
|
95
|
+
expect(AnalyticsDispatcher.trackGasV3FeatureFlagDefaultFalse).toHaveBeenCalledWith(mockFlagName);
|
|
96
|
+
expect(result).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -41,5 +41,34 @@ describe('host util', () => {
|
|
|
41
41
|
expect(util.stringToDimension(dimension)).toEqual(`${dimension}px`);
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
+
|
|
45
|
+
describe('guessIsJiraFromMetaTag', ()=>{
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
// Remove all meta tags from the document head before each test
|
|
48
|
+
const metaTags = document.head.getElementsByTagName('meta');
|
|
49
|
+
while (metaTags[0]) {
|
|
50
|
+
metaTags[0].parentNode.removeChild(metaTags[0]);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('should return true if page contains Jira application-name meta tag', ()=>{
|
|
54
|
+
var jiraMetaTag = document.createElement('meta');
|
|
55
|
+
jiraMetaTag.setAttribute('name', 'application-name');
|
|
56
|
+
jiraMetaTag.setAttribute('content', 'JIRA');
|
|
57
|
+
document.head.appendChild(jiraMetaTag);
|
|
58
|
+
|
|
59
|
+
expect(util.guessIsJiraFromMetaTag()).toEqual(true);
|
|
60
|
+
})
|
|
61
|
+
it('should return false if page contains non-Jira application-name meta tag ', ()=>{
|
|
62
|
+
var nonJiraMetaTag = document.createElement('meta');
|
|
63
|
+
nonJiraMetaTag.setAttribute('name', 'application-name');
|
|
64
|
+
nonJiraMetaTag.setAttribute('content', 'Bitbucket');
|
|
65
|
+
|
|
66
|
+
document.head.appendChild(nonJiraMetaTag);
|
|
67
|
+
expect(util.guessIsJiraFromMetaTag()).toEqual(false);
|
|
68
|
+
})
|
|
69
|
+
it('should return false if page does not have application-name meta tag ', ()=>{
|
|
70
|
+
expect(util.guessIsJiraFromMetaTag()).toEqual(false);
|
|
71
|
+
})
|
|
72
|
+
})
|
|
44
73
|
});
|
|
45
74
|
|
package/src/host/index.js
CHANGED
|
@@ -89,19 +89,17 @@ if (document.readyState === 'loading') {
|
|
|
89
89
|
onDocumentReady();
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
});
|
|
104
|
-
}
|
|
92
|
+
DomEventActions.registerClickHandler(function (iframe, data) {
|
|
93
|
+
var iframeInfo = JSON.parse(iframe.name || '{}')
|
|
94
|
+
var iframeInfoOptions = iframeInfo.options || {}
|
|
95
|
+
var analyticsData = {
|
|
96
|
+
moduleLocation: iframeInfoOptions.moduleLocation,
|
|
97
|
+
moduleType: iframeInfoOptions.moduleType,
|
|
98
|
+
addonKey: data.addon_key,
|
|
99
|
+
baseUrl: iframeInfoOptions.origin,
|
|
100
|
+
};
|
|
101
|
+
AnalyticsAction.trackIframeClick(analyticsData);
|
|
102
|
+
});
|
|
105
103
|
|
|
106
104
|
simpleXDM.setFeatureFlagGetter(getBooleanFeatureFlag);
|
|
107
105
|
|
package/src/host/util.js
CHANGED
|
@@ -84,6 +84,14 @@ function guessProductFromModuleDefined(connectHost) {
|
|
|
84
84
|
return '';
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Returns whether the page we are on is Jira based on meta tag 'application-name'
|
|
89
|
+
* @returns {boolean}
|
|
90
|
+
*/
|
|
91
|
+
function guessIsJiraFromMetaTag() {
|
|
92
|
+
return $('meta[name=\'application-name\']').attr('content') === 'JIRA';
|
|
93
|
+
}
|
|
94
|
+
|
|
87
95
|
export default {
|
|
88
96
|
escapeSelector,
|
|
89
97
|
stringToDimension,
|
|
@@ -95,4 +103,5 @@ export default {
|
|
|
95
103
|
isSupported,
|
|
96
104
|
extend: Object.assign,
|
|
97
105
|
guessProductFromModuleDefined,
|
|
106
|
+
guessIsJiraFromMetaTag
|
|
98
107
|
};
|
|
@@ -1,25 +1,58 @@
|
|
|
1
1
|
import FeatureGates from '@atlaskit/feature-gate-js-client';
|
|
2
2
|
import AnalyticsDispatcher from '../dispatchers/analytics_dispatcher';
|
|
3
|
+
import util from '../util';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
function getFeatureGateJiraLegacy(flagName) {
|
|
7
|
+
try {
|
|
8
|
+
const FeatureManager = window.require('jira/featureflags/feature-manager');
|
|
9
|
+
const value = FeatureManager.isFeatureEnabled(flagName);
|
|
10
|
+
console.debug('[ACJS] Feature flag evaluated via Jira Legacy Feature Flag Manager', {flagName, value});
|
|
11
|
+
return value;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error('[ACJS] Jira Legacy Feature Flag Manager not available. Default flag to false', {flagName, e});
|
|
14
|
+
AnalyticsDispatcher.trackGasV3FeatureFlagDefaultFalse(flagName);
|
|
15
|
+
return false;
|
|
7
16
|
}
|
|
8
|
-
AnalyticsDispatcher.trackGasV3FeatureFlagDefaultFalse(flagName);
|
|
9
|
-
console.error(`[ACJS] Feature flag service is not initialised. Default flag '${flagName}' to false`);
|
|
10
|
-
return false;
|
|
11
17
|
}
|
|
12
18
|
|
|
19
|
+
function getFeatureGateConfluenceLegacy(flagName) {
|
|
20
|
+
if (!AJS.DarkFeatures) {
|
|
21
|
+
console.error('[ACJS] Confluence Dark Features not available. Default flag to false', {flagName})
|
|
22
|
+
AnalyticsDispatcher.trackGasV3FeatureFlagDefaultFalse(flagName);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const value = AJS.DarkFeatures.isEnabled(flagName);
|
|
27
|
+
console.debug('[ACJS] Feature flag evaluated via Confluence Dark Features', {flagName, value});
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
13
30
|
|
|
14
31
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
32
|
+
* Fetches feature flag value from Statsig either from:
|
|
33
|
+
* - feature-gate-js-client which is initialised in AFM
|
|
34
|
+
* - AMD module jira/featureflags/feature-manager
|
|
35
|
+
* - AJS.DarkFeatures module
|
|
36
|
+
*
|
|
37
|
+
* For legacy pages, the feature gate client is initialised after the ACJS host code is run (i.e. connectHost)
|
|
38
|
+
* Therefore, upon page load for legacy pages, we use modules defined by Legacy WRMs to retrieve the feature flag values instead.
|
|
17
39
|
*
|
|
18
40
|
* @param {string} flagName Feature flag name
|
|
19
41
|
* @returns {boolean}
|
|
20
42
|
*/
|
|
21
43
|
export default function getBooleanFeatureFlag(flagName) {
|
|
22
|
-
|
|
44
|
+
if (FeatureGates.initializeCompleted()) {
|
|
45
|
+
const value = FeatureGates.checkGate(flagName);
|
|
46
|
+
console.debug('[ACJS] Feature flag evaluated via SPA Statsig Client', {flagName, value});
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
console.warn('[ACJS] SPA Statsig Client not initialised.', {flagName});
|
|
50
|
+
|
|
51
|
+
const product = util.guessIsJiraFromMetaTag() ? 'jira' : 'confluence';
|
|
52
|
+
if (product === 'jira') {
|
|
53
|
+
return getFeatureGateJiraLegacy(flagName);
|
|
54
|
+
}
|
|
55
|
+
return getFeatureGateConfluenceLegacy(flagName);
|
|
23
56
|
}
|
|
24
57
|
|
|
25
58
|
export const Flags = {
|
package/src/plugin/theming.js
CHANGED
|
@@ -115,8 +115,7 @@ See https://developer.atlassian.com/platform/marketplace/security-requirements/#
|
|
|
115
115
|
async function preloadWebFonts(data) {
|
|
116
116
|
try {
|
|
117
117
|
const hasRefreshedTypography = data && data.initialTheme && data.initialTheme.typography === 'typography-refreshed';
|
|
118
|
-
|
|
119
|
-
if (!isInNewFontCohort || !hasRefreshedTypography) {
|
|
118
|
+
if (!hasRefreshedTypography) {
|
|
120
119
|
return;
|
|
121
120
|
}
|
|
122
121
|
|