@atlassian/atlassian-connect-js 5.3.190 → 5.3.191

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 CHANGED
@@ -1,5 +1,7 @@
1
- PACKAGES_USERNAME=mi-ar-oi-bb-_c-58-43-9f-de-d0-46-ae-ab
2
- PACKAGES_PASSWORD=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLWQwLTQ2LWFlLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0NzcyNDc4MiwiaWF0IjoxNzQ3NzIxMTgyLCJqdGkiOiIzOTQ0NDlmYy03N2UxLTRjOTUtODk3NC1jNDIxM2VlOTYyMTQifQ.K9XhXsuh7fpalyDcoaoGRLryr8SRAWQcfY4GSHVRq4SBQmhT7EMlz6Efup6aZF2tx5VQ5kqaiYnUdVScDOPK6l0PSXu_Pzp3OgkIfzzjo8BzcfYxt0t8ZgufmXFO9WkFluR_F1ae_8Xw6rrv5BsGJyYLq4zZIeja5UUT2N12J9sBvTOk1S7k2aBz3lg_ObF6Ve7K1ndDF9qjKggFdWRQBuaFmqXLg-UajdiPo4c2FbVFNPTB6pRvjEq7ulPkNrArU6PA0uvwiHpdooyCLiCF1vbvjGBj8SDKkCKNkC1ST4wPD_xvQvmd5vzo3TW3M42fXqPqYfh2Undu9hAysfQLOA
3
- PACKAGES_ACCESS_TOKEN=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLWQwLTQ2LWFlLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0NzcyNDc4MiwiaWF0IjoxNzQ3NzIxMTgyLCJqdGkiOiIzOTQ0NDlmYy03N2UxLTRjOTUtODk3NC1jNDIxM2VlOTYyMTQifQ.K9XhXsuh7fpalyDcoaoGRLryr8SRAWQcfY4GSHVRq4SBQmhT7EMlz6Efup6aZF2tx5VQ5kqaiYnUdVScDOPK6l0PSXu_Pzp3OgkIfzzjo8BzcfYxt0t8ZgufmXFO9WkFluR_F1ae_8Xw6rrv5BsGJyYLq4zZIeja5UUT2N12J9sBvTOk1S7k2aBz3lg_ObF6Ve7K1ndDF9qjKggFdWRQBuaFmqXLg-UajdiPo4c2FbVFNPTB6pRvjEq7ulPkNrArU6PA0uvwiHpdooyCLiCF1vbvjGBj8SDKkCKNkC1ST4wPD_xvQvmd5vzo3TW3M42fXqPqYfh2Undu9hAysfQLOA
4
- PACKAGES_PASSWORD_BASE64=ZXlKMlpYSWlPaUl5SWl3aWRIbHdJam9pU2xkVUlpd2lZV3huSWpvaVVsTXlOVFlpTENKcmFXUWlPaUpDTUdrd1FXSjVZVEJyV0RoSGNtNDJjekZ6YjIxb1ptUm5hWGRaVWtWU1pGbFZYMk5yTTFsSE5YTkZJbjAuZXlKemRXSWlPaUpxWm1GalFEQXhaWFpyWldZeE5XRTBNWGRtTUROd09XUnJObW93YUhOMEwzVnpaWEp6TDIxcExXRnlMVzlwTFdKaUxWOWpMVFU0TFRRekxUbG1MV1JsTFdRd0xUUTJMV0ZsTFdGaUlpd2ljMk53SWpvaVlYQndiR2xsWkMxd1pYSnRhWE56YVc5dWN5OW5jbTkxY0hNNmIzQmxibk52ZFhKalpTMXdkV0pzYVhOb0lpd2lZWFZrSWpvaUtrQXFJaXdpYVhOeklqb2lhbVpoWTBBd01XVjJhMlZtTVRWaE5ERjNaakF6Y0Rsa2F6WnFNR2h6ZENJc0ltVjRjQ0k2TVRjME56Y3lORGM0TWl3aWFXRjBJam94TnpRM056SXhNVGd5TENKcWRHa2lPaUl6T1RRME5EbG1ZeTAzTjJVeExUUmpPVFV0T0RrM05DMWpOREl4TTJWbE9UWXlNVFFpZlEuSzlYaFhzdWg3ZnBhbHlEY29hb0dSTHJ5cjhTUkFXUWNmWTRHU0hWUnE0U0JRbWhUN0VNbHo2RWZ1cDZhWkYydHg1VlE1a3FhaVluVWRWU2NET1BLNmwwUFNYdV9QenAzT2drSWZ6empvOEJ6Y2ZZeHQwdDhaZ3VmbVhGTzlXa0ZsdVJfRjFhZV84WHc2cnJ2NUJzR0p5WUxxNHpaSWVqYTVVVVQyTjEySjlzQnZUT2sxUzdrMmFCejNsZ19PYkY2VmU3SzFuZERGOXFqS2dnRmRXUlFCdWFGbXFYTGctVWFqZGlQbzRjMkZiVkZOUFRCNnBSdmpFcTd1bFBrTnJBclU2UEEwdXZ3aUhwZG9veUNMaUNGMXZidmpHQmo4U0RLa0NLTmtDMVNUNHdQRF94dlF2bWQ1dnpvM1RXM000MmZYcVBxWWZoMlVuZHU5aEF5c2ZRTE9BCg==
1
+ PACKAGES_USERNAME=mi-ar-oi-bb-_c-58-43-9f-de-93-43-9d-ab
2
+ PACKAGES_PASSWORD=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTkzLTQzLTlkLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxMjE5MSwiaWF0IjoxNzQ4MzA4NTkxLCJqdGkiOiI5YTE1N2E5Yi0wNzVjLTRkZDktYWI2NS0zNDlmMjQ3OTExN2UifQ.NkUZlI-xvaQLcXwSdn25c8h2iOEbyzUdfaCwHpBmpT5HZKT8FVd_lV65c-TRd5oS71q2M6VOeOls_Cf7DB_X1qGKqdB-iwgALtUtK0efog3cJ68f-d_FAHILNCsUhh7BL2goPyIU6X3S7CM8N9H4E0aLOub2QT5NG1TfKJKFbxuEPslfEhQxexTjCTdjxBZcs17OXKh5PPGlTUoAw45bV1WUDyZEpuqkKGYv6SKrFA-w0-VjwzL26zF9_hzgAnMpuxZT4AYHEX50ljslwDx0-ssmRid07xUkmKmLTCo2mNvLr6PyZQVIIO_LelYDYI9qErvArAA2YP6yZ97FjPn33g
3
+ PACKAGES_ACCESS_TOKEN=eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTkzLTQzLTlkLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxMjE5MSwiaWF0IjoxNzQ4MzA4NTkxLCJqdGkiOiI5YTE1N2E5Yi0wNzVjLTRkZDktYWI2NS0zNDlmMjQ3OTExN2UifQ.NkUZlI-xvaQLcXwSdn25c8h2iOEbyzUdfaCwHpBmpT5HZKT8FVd_lV65c-TRd5oS71q2M6VOeOls_Cf7DB_X1qGKqdB-iwgALtUtK0efog3cJ68f-d_FAHILNCsUhh7BL2goPyIU6X3S7CM8N9H4E0aLOub2QT5NG1TfKJKFbxuEPslfEhQxexTjCTdjxBZcs17OXKh5PPGlTUoAw45bV1WUDyZEpuqkKGYv6SKrFA-w0-VjwzL26zF9_hzgAnMpuxZT4AYHEX50ljslwDx0-ssmRid07xUkmKmLTCo2mNvLr6PyZQVIIO_LelYDYI9qErvArAA2YP6yZ97FjPn33g
4
+ PACKAGES_PASSWORD_BASE64=ZXlKMlpYSWlPaUl5SWl3aWRIbHdJam9pU2xkVUlpd2lZV3huSWpvaVVsTXlOVFlpTENKcmFXUWlPaUpDTUdrd1FXSjVZVEJyV0RoSGNtNDJjekZ6YjIxb1ptUm5hWGRaVWtWU1pGbFZYMk5yTTFsSE5YTkZJbjAuZXlKemRXSWlPaUpxWm1GalFEQXhaWFpyWldZeE5XRTBNWGRtTUROd09XUnJObW93YUhOMEwzVnpaWEp6TDIxcExXRnlMVzlwTFdKaUxWOWpMVFU0TFRRekxUbG1MV1JsTFRrekxUUXpMVGxrTFdGaUlpd2ljMk53SWpvaVlYQndiR2xsWkMxd1pYSnRhWE56YVc5dWN5OW5jbTkxY0hNNmIzQmxibk52ZFhKalpTMXdkV0pzYVhOb0lpd2lZWFZrSWpvaUtrQXFJaXdpYVhOeklqb2lhbVpoWTBBd01XVjJhMlZtTVRWaE5ERjNaakF6Y0Rsa2F6WnFNR2h6ZENJc0ltVjRjQ0k2TVRjME9ETXhNakU1TVN3aWFXRjBJam94TnpRNE16QTROVGt4TENKcWRHa2lPaUk1WVRFMU4yRTVZaTB3TnpWakxUUmtaRGt0WVdJMk5TMHpORGxtTWpRM09URXhOMlVpZlEuTmtVWmxJLXh2YVFMY1h3U2RuMjVjOGgyaU9FYnl6VWRmYUN3SHBCbXBUNUhaS1Q4RlZkX2xWNjVjLVRSZDVvUzcxcTJNNlZPZU9sc19DZjdEQl9YMXFHS3FkQi1pd2dBTHRVdEswZWZvZzNjSjY4Zi1kX0ZBSElMTkNzVWhoN0JMMmdvUHlJVTZYM1M3Q004TjlINEUwYUxPdWIyUVQ1TkcxVGZLSktGYnh1RVBzbGZFaFF4ZXhUakNUZGp4QlpjczE3T1hLaDVQUEdsVFVvQXc0NWJWMVdVRHlaRXB1cWtLR1l2NlNLckZBLXcwLVZqd3pMMjZ6RjlfaHpnQW5NcHV4WlQ0QVlIRVg1MGxqc2x3RHgwLXNzbVJpZDA3eFVrbUttTFRDbzJtTnZMcjZQeVpRVklJT19MZWxZRFlJOXFFcnZBckFBMllQNnlaOTdGalBuMzNnCg==
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-d0-46-ae-ab password eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLWQwLTQ2LWFlLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0NzcyNDc4MiwiaWF0IjoxNzQ3NzIxMTgyLCJqdGkiOiIzOTQ0NDlmYy03N2UxLTRjOTUtODk3NC1jNDIxM2VlOTYyMTQifQ.K9XhXsuh7fpalyDcoaoGRLryr8SRAWQcfY4GSHVRq4SBQmhT7EMlz6Efup6aZF2tx5VQ5kqaiYnUdVScDOPK6l0PSXu_Pzp3OgkIfzzjo8BzcfYxt0t8ZgufmXFO9WkFluR_F1ae_8Xw6rrv5BsGJyYLq4zZIeja5UUT2N12J9sBvTOk1S7k2aBz3lg_ObF6Ve7K1ndDF9qjKggFdWRQBuaFmqXLg-UajdiPo4c2FbVFNPTB6pRvjEq7ulPkNrArU6PA0uvwiHpdooyCLiCF1vbvjGBj8SDKkCKNkC1ST4wPD_xvQvmd5vzo3TW3M42fXqPqYfh2Undu9hAysfQLOA
1
+ machine packages.atlassian.com login mi-ar-oi-bb-_c-58-43-9f-de-93-43-9d-ab password eyJ2ZXIiOiIyIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYiLCJraWQiOiJCMGkwQWJ5YTBrWDhHcm42czFzb21oZmRnaXdZUkVSZFlVX2NrM1lHNXNFIn0.eyJzdWIiOiJqZmFjQDAxZXZrZWYxNWE0MXdmMDNwOWRrNmowaHN0L3VzZXJzL21pLWFyLW9pLWJiLV9jLTU4LTQzLTlmLWRlLTkzLTQzLTlkLWFiIiwic2NwIjoiYXBwbGllZC1wZXJtaXNzaW9ucy9ncm91cHM6b3BlbnNvdXJjZS1wdWJsaXNoIiwiYXVkIjoiKkAqIiwiaXNzIjoiamZhY0AwMWV2a2VmMTVhNDF3ZjAzcDlkazZqMGhzdCIsImV4cCI6MTc0ODMxMjE5MSwiaWF0IjoxNzQ4MzA4NTkxLCJqdGkiOiI5YTE1N2E5Yi0wNzVjLTRkZDktYWI2NS0zNDlmMjQ3OTExN2UifQ.NkUZlI-xvaQLcXwSdn25c8h2iOEbyzUdfaCwHpBmpT5HZKT8FVd_lV65c-TRd5oS71q2M6VOeOls_Cf7DB_X1qGKqdB-iwgALtUtK0efog3cJ68f-d_FAHILNCsUhh7BL2goPyIU6X3S7CM8N9H4E0aLOub2QT5NG1TfKJKFbxuEPslfEhQxexTjCTdjxBZcs17OXKh5PPGlTUoAw45bV1WUDyZEpuqkKGYv6SKrFA-w0-VjwzL26zF9_hzgAnMpuxZT4AYHEX50ljslwDx0-ssmRid07xUkmKmLTCo2mNvLr6PyZQVIIO_LelYDYI9qErvArAA2YP6yZ97FjPn33g
@@ -10,10 +10,13 @@ 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
14
15
  - NODE_OPTIONS=--openssl-legacy-provider npm run test-sl
15
16
  - echo "Publishing to Atlassian Artifactory npm-public..."
16
17
  - npm publish --ddd --userconfig=./.npmrc-public --@atlassian/atlassian-connect-js:registry="https://packages.atlassian.com/api/npm/npm-public/"
18
+ - PACKAGE_VERSION=$(node -p "require('./package.json').version") && git add . && git commit -m "$PACKAGE_VERSION release [skip ci]"
19
+ - git push origin master
17
20
 
18
21
  default:
19
22
  - step:
@@ -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 getBooleanFeatureFlagStatsig(flagName) {
9724
- if (FeatureGates$1.initializeCompleted()) {
9725
- return FeatureGates$1.checkGate(flagName);
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
- analytics$1.trackGasV3FeatureFlagDefaultFalse(flagName);
9728
- console.error("[ACJS] Feature flag service is not initialised. Default flag '" + flagName + "' to false");
9729
- return false;
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
- * For all new feature flags, please create them in Statsig
9734
- * https://hello.atlassian.net/wiki/spaces/ECO/pages/3707522428
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
- return getBooleanFeatureFlagStatsig(flagName);
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.190';
13898
+ window._AP.version = '5.3.191';
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
- if (getBooleanFeatureFlag('acjs_iframe_click_analytics')) {
13892
- DomEventActions.registerClickHandler(function (iframe, data) {
13893
- var iframeInfo = JSON.parse(iframe.name || '{}');
13894
- var iframeInfoOptions = iframeInfo.options || {};
13895
- var analyticsData = {
13896
- moduleLocation: iframeInfoOptions.moduleLocation,
13897
- moduleType: iframeInfoOptions.moduleType,
13898
- addonKey: data.addon_key,
13899
- baseUrl: iframeInfoOptions.origin
13900
- };
13901
- AnalyticsAction.trackIframeClick(analyticsData);
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;
@@ -1374,7 +1374,7 @@ var AP = (function () {
1374
1374
  _this._eventHandlers = {};
1375
1375
  _this._pendingCallbacks = {};
1376
1376
  _this._keyListeners = [];
1377
- _this._version = "5.3.190";
1377
+ _this._version = "5.3.191";
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, isInNewFontCohort, fontRoot, woffUrl, cssUrl;
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
- _context5.next = 4;
10968
- return getBooleanFeatureFlagIframe('acjs_new_font');
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 7:
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 = 17;
10975
+ _context5.next = 14;
11004
10976
  break;
11005
- case 15:
11006
- _context5.prev = 15;
10977
+ case 12:
10978
+ _context5.prev = 12;
11007
10979
  _context5.t0 = _context5["catch"](0);
11008
- case 17:
10980
+ case 14:
11009
10981
  case "end":
11010
10982
  return _context5.stop();
11011
10983
  }
11012
- }, _callee5, null, [[0, 15]]);
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.190";
1377
+ _this._version = "5.3.191";
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, isInNewFontCohort, fontRoot, woffUrl, cssUrl;
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
- _context5.next = 4;
10968
- return getBooleanFeatureFlagIframe('acjs_new_font');
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 7:
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 = 17;
10975
+ _context5.next = 14;
11004
10976
  break;
11005
- case 15:
11006
- _context5.prev = 15;
10977
+ case 12:
10978
+ _context5.prev = 12;
11007
10979
  _context5.t0 = _context5["catch"](0);
11008
- case 17:
10980
+ case 14:
11009
10981
  case "end":
11010
10982
  return _context5.stop();
11011
10983
  }
11012
- }, _callee5, null, [[0, 15]]);
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.190",
3
+ "version": "5.3.191",
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', true);
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
- if (getBooleanFeatureFlag('acjs_iframe_click_analytics')) {
93
- DomEventActions.registerClickHandler(function (iframe, data) {
94
- var iframeInfo = JSON.parse(iframe.name || '{}')
95
- var iframeInfoOptions = iframeInfo.options || {}
96
- var analyticsData = {
97
- moduleLocation: iframeInfoOptions.moduleLocation,
98
- moduleType: iframeInfoOptions.moduleType,
99
- addonKey: data.addon_key,
100
- baseUrl: iframeInfoOptions.origin,
101
- };
102
- AnalyticsAction.trackIframeClick(analyticsData);
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
- function getBooleanFeatureFlagStatsig(flagName) {
5
- if (FeatureGates.initializeCompleted()) {
6
- return FeatureGates.checkGate(flagName);
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
- * For all new feature flags, please create them in Statsig
16
- * https://hello.atlassian.net/wiki/spaces/ECO/pages/3707522428
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
- return getBooleanFeatureFlagStatsig(flagName);
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 = {
@@ -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
- const isInNewFontCohort = await getBooleanFeatureFlagIframe('acjs_new_font')
119
- if (!isInNewFontCohort || !hasRefreshedTypography) {
118
+ if (!hasRefreshedTypography) {
120
119
  return;
121
120
  }
122
121