diff --git a/packages/react-native-analytics/package.json b/packages/react-native-analytics/package.json index 5519af6..6b7eb9e 100644 --- a/packages/react-native-analytics/package.json +++ b/packages/react-native-analytics/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@castleio/react-native-castle": "^1.1.5", - "@farfetch/blackout-core": "^1.58.2", + "@farfetch/blackout-core": "^1.79.0", "@react-native-async-storage/async-storage": "^1.16.0", "@react-native-firebase/analytics": "^18.9.0", "@react-native-firebase/app": "^18.9.0", @@ -23,7 +23,7 @@ }, "peerDependencies": { "@castleio/react-native-castle": "^1.1.5", - "@farfetch/blackout-core": "^1.58.2", + "@farfetch/blackout-core": "^1.79.0", "@react-native-async-storage/async-storage": "^1.6.1", "@react-native-firebase/analytics": "^18.9.0", "react-native": "^0.62.3", diff --git a/packages/react-native-analytics/src/__tests__/__snapshots__/index.test.js.snap b/packages/react-native-analytics/src/__tests__/__snapshots__/index.test.js.snap index 933da5f..19b4539 100644 --- a/packages/react-native-analytics/src/__tests__/__snapshots__/index.test.js.snap +++ b/packages/react-native-analytics/src/__tests__/__snapshots__/index.test.js.snap @@ -5,11 +5,13 @@ Object { "ADDRESS_INFO_ADDED": "Address Info Added", "APP_CLOSED": "App Closed", "APP_OPENED": "App Opened", + "BILLING_INFO_ADDED": "Billing Info Added", "CHECKOUT_ABANDONED": "Checkout Abandoned", "CHECKOUT_STARTED": "Checkout Started", "CHECKOUT_STEP_COMPLETED": "Checkout Step Completed", "CHECKOUT_STEP_EDITING": "Checkout Step Editing", "CHECKOUT_STEP_VIEWED": "Checkout Step Viewed", + "DELIVERY_METHOD_ADDED": "Delivery Method Added", "FILTERS_APPLIED": "Filters Applied", "FILTERS_CLEARED": "Filters Cleared", "INTERACT_CONTENT": "Interact Content", @@ -37,5 +39,6 @@ Object { "SIGNUP_FORM_COMPLETED": "Sign-up Form Completed", "SIGNUP_FORM_VIEWED": "Sign-up Form Viewed", "SIGNUP_NEWSLETTER": "Sign-up Newsletter", + "SITE_PERFORMANCE": "Site Performance", } `; diff --git a/packages/react-native-analytics/src/__tests__/analytics.test.js b/packages/react-native-analytics/src/__tests__/analytics.test.js index 5ab8cdd..149af5e 100644 --- a/packages/react-native-analytics/src/__tests__/analytics.test.js +++ b/packages/react-native-analytics/src/__tests__/analytics.test.js @@ -79,7 +79,12 @@ describe('analytics react native', () => { type: trackTypes.TRACK, event, properties, - context: expect.objectContaining({ event: eventContext }), + context: expect.objectContaining({ + event: expect.objectContaining({ + ...eventContext, + __blackoutAnalyticsEventId: expect.any(String), + }), + }), }), ); @@ -99,7 +104,12 @@ describe('analytics react native', () => { type: trackTypes.SCREEN, event, properties, - context: expect.objectContaining({ event: eventContext }), + context: expect.objectContaining({ + event: expect.objectContaining({ + ...eventContext, + __blackoutAnalyticsEventId: expect.any(String), + }), + }), }), ); }); diff --git a/packages/react-native-analytics/src/integrations/__fixtures__/generateAnalyticsEventData.fixtures.js b/packages/react-native-analytics/src/integrations/__fixtures__/generateAnalyticsEventData.fixtures.js index 376afc8..380ecd3 100644 --- a/packages/react-native-analytics/src/integrations/__fixtures__/generateAnalyticsEventData.fixtures.js +++ b/packages/react-native-analytics/src/integrations/__fixtures__/generateAnalyticsEventData.fixtures.js @@ -1,4 +1,7 @@ -import { trackTypes as analyticsTrackTypes } from '@farfetch/blackout-core/analytics'; +import { + trackTypes as analyticsTrackTypes, + utils, +} from '@farfetch/blackout-core/analytics'; export default function generateAnalyticsEventData( trackType = analyticsTrackTypes.TRACK, @@ -13,7 +16,10 @@ export default function generateAnalyticsEventData( device: 'iPhone13,2', deviceLanguage: 'en', deviceOS: 'iOS 14.3', - event: null, + event: { + [utils.ANALYTICS_UNIQUE_EVENT_ID]: + '179373c4-5651-40fe-8a50-66c3d7c86912', + }, library: { version: '1.15.0-chore-FPSCH-625-add-support-for-site-features.0', name: '@farfetch/blackout-core/analytics', diff --git a/packages/react-native-analytics/src/integrations/firebaseAnalytics/FirebaseAnalytics.js b/packages/react-native-analytics/src/integrations/firebaseAnalytics/FirebaseAnalytics.js index b7572ec..7e5c9da 100644 --- a/packages/react-native-analytics/src/integrations/firebaseAnalytics/FirebaseAnalytics.js +++ b/packages/react-native-analytics/src/integrations/firebaseAnalytics/FirebaseAnalytics.js @@ -17,6 +17,7 @@ import { getVirtualEventsFromEvent, } from './defaultMappers'; import get from 'lodash/get'; +import omit from 'lodash/omit'; import Integration from '../integration'; import screenTypes from '../../screenTypes'; @@ -58,18 +59,27 @@ class FirebaseAnalytics extends Integration { this.initialize(options); this.onSetUser(loadData, options); this.googleConsentConfig = options[OPTION_GOOGLE_CONSENT_CONFIG]; + this.googleConsentConfigWithoutMode = omit(this.googleConsentConfig, [ + 'mode', + ]); } /** * Method to check if the integration is ready to be loaded. + * If the googleConsentConfig.mode property is set to 'Advanced' + * the integration will be loaded regardless of user consent. + * Else, only if statistics consent is given by the user. * - * @static - * - * @param {object} consent - The consent object representing the user preferences. + * @param consent - User consent data. + * @param options - Options passed for the Firebase integration. * - * @returns {boolean} - If the integration is ready to be loaded. + * @returns If the integration is ready to be loaded. */ - static shouldLoad(consent) { + static shouldLoad(consent, options) { + if (get(options, `${OPTION_GOOGLE_CONSENT_CONFIG}.mode`) === 'Advanced') { + return true; + } + return !!consent && !!consent.statistics; } @@ -374,32 +384,41 @@ class FirebaseAnalytics extends Integration { * @param {object} consentData - Consent object containing the user consent. */ async setConsent(consentData) { - if (this.googleConsentConfig) { + if (this.googleConsentConfigWithoutMode) { // Dealing with null or undefined consent values const safeConsent = consentData || {}; // Fill consent value into consent element, using analytics consent categories - const consentValues = Object.keys(this.googleConsentConfig).reduce( - (result, consentKey) => { - let consentValue = false; - - const consent = this.googleConsentConfig[consentKey]; - - if (consent && consent.categories) { - consentValue = consent.categories.every( - consentCategory => safeConsent[consentCategory], - ); - } - - return { - ...result, - [consentKey]: consentValue, - }; - }, - {}, - ); + const consentValues = Object.keys( + this.googleConsentConfigWithoutMode, + ).reduce((result, consentKey) => { + let consentValue = false; + + const consent = this.googleConsentConfigWithoutMode[consentKey]; + + if (consent && consent.categories) { + consentValue = consent.categories.every( + consentCategory => safeConsent[consentCategory], + ); + } + + return { + ...result, + [consentKey]: consentValue, + }; + }, {}); await firebaseAnalytics().setConsent(consentValues); + + // If in basic mode we need to activate analytics collection + // We do not need to look for the consent variable because this method + // will only be called if the integration was loaded, i.e., the + // statistics consent was given. + if ( + get(this.options, `${OPTION_GOOGLE_CONSENT_CONFIG}.mode`) === 'Basic' + ) { + await firebaseAnalytics().setAnalyticsCollectionEnabled(true); + } } } } diff --git a/packages/react-native-analytics/src/integrations/firebaseAnalytics/__tests__/FirebaseAnalytics.test.js b/packages/react-native-analytics/src/integrations/firebaseAnalytics/__tests__/FirebaseAnalytics.test.js index 0e7440c..3c8d9b9 100644 --- a/packages/react-native-analytics/src/integrations/firebaseAnalytics/__tests__/FirebaseAnalytics.test.js +++ b/packages/react-native-analytics/src/integrations/firebaseAnalytics/__tests__/FirebaseAnalytics.test.js @@ -33,6 +33,7 @@ const mockFirebaseAnalyticsReturn = { logEvent: jest.fn(), logSelectItem: jest.fn(), setConsent: jest.fn(), + setAnalyticsCollectionEnabled: jest.fn(), }; jest.mock('@react-native-firebase/analytics', () => { @@ -70,18 +71,39 @@ describe('FirebaseAnalyticsIntegration integration', () => { expect(FirebaseAnalyticsIntegration.prototype).toBeInstanceOf(Integration); }); - it('`shouldLoad` should return false if there is no user consent', () => { - expect(FirebaseAnalyticsIntegration.shouldLoad({ statistics: false })).toBe( - false, - ); - expect(FirebaseAnalyticsIntegration.shouldLoad()).toBe(false); - expect(FirebaseAnalyticsIntegration.shouldLoad({})).toBe(false); - }); + describe('shouldLoad', () => { + describe('When in basic mode', () => { + it('`shouldLoad` should return false if there is no user consent', () => { + expect( + FirebaseAnalyticsIntegration.shouldLoad({ statistics: false }), + ).toBe(false); + expect(FirebaseAnalyticsIntegration.shouldLoad()).toBe(false); + expect(FirebaseAnalyticsIntegration.shouldLoad({})).toBe(false); + }); - it('`shouldLoad` should return true if there is user consent', () => { - expect(FirebaseAnalyticsIntegration.shouldLoad({ statistics: true })).toBe( - true, - ); + it('`shouldLoad` should return true if there is user consent', () => { + expect( + FirebaseAnalyticsIntegration.shouldLoad({ statistics: true }), + ).toBe(true); + }); + }); + + describe('When in advanced mode', () => { + it('`shouldLoad` should return true whether there is user consent or not', () => { + expect( + FirebaseAnalyticsIntegration.shouldLoad( + { statistics: false }, + { [OPTION_GOOGLE_CONSENT_CONFIG]: { mode: 'Advanced' } }, + ), + ).toBe(true); + expect( + FirebaseAnalyticsIntegration.shouldLoad( + { statistics: true }, + { [OPTION_GOOGLE_CONSENT_CONFIG]: { mode: 'Advanced' } }, + ), + ).toBe(true); + }); + }); }); it('Should return a FirebaseAnalyticsIntegration instance from createInstance', () => { @@ -986,6 +1008,60 @@ describe('FirebaseAnalyticsIntegration instance', () => { }); describe('Consent', () => { + describe('When in basic mode', () => { + it('should call `setAnalyticsCollectionEnabled` with true in setConsent', async () => { + const instance = createInstance({ + [OPTION_GOOGLE_CONSENT_CONFIG]: { + ad_user_data: { categories: ['marketing'] }, + ad_personalization: { categories: ['marketing'] }, + analytics_storage: { categories: ['marketing'] }, + ad_storage: { categories: ['marketing'] }, + mode: 'Basic', + }, + }); + + await instance.setConsent({ marketing: true }); + + expect(firebaseAnalytics().setConsent).toHaveBeenCalledWith({ + ad_personalization: true, + ad_storage: true, + ad_user_data: true, + analytics_storage: true, + }); + + expect( + firebaseAnalytics().setAnalyticsCollectionEnabled, + ).toHaveBeenCalledWith(true); + }); + }); + + describe('When in advanced mode', () => { + it('should not call `setAnalyticsCollectionEnabled` in setConsent', async () => { + const instance = createInstance({ + [OPTION_GOOGLE_CONSENT_CONFIG]: { + ad_user_data: { categories: ['marketing'] }, + ad_personalization: { categories: ['marketing'] }, + analytics_storage: { categories: ['marketing'] }, + ad_storage: { categories: ['marketing'] }, + mode: 'Advanced', + }, + }); + + await instance.setConsent({ marketing: true }); + + expect(firebaseAnalytics().setConsent).toHaveBeenCalledWith({ + ad_personalization: true, + ad_storage: true, + ad_user_data: true, + analytics_storage: true, + }); + + expect( + firebaseAnalytics().setAnalyticsCollectionEnabled, + ).not.toHaveBeenCalled(); + }); + }); + it('Should update the user consent on the native side when setConsent is called', async () => { const instance = createInstance({ [OPTION_GOOGLE_CONSENT_CONFIG]: { diff --git a/packages/react-native-analytics/src/integrations/forter/__tests__/Forter.test.js b/packages/react-native-analytics/src/integrations/forter/__tests__/Forter.test.js index 953d70a..2388afc 100644 --- a/packages/react-native-analytics/src/integrations/forter/__tests__/Forter.test.js +++ b/packages/react-native-analytics/src/integrations/forter/__tests__/Forter.test.js @@ -244,6 +244,8 @@ describe('Forter', () => { }), ); + jest.clearAllMocks(); + const mockSecondUserEventData = generateAnalyticsEventData( 'onSetUser', 'onSetUser', diff --git a/yarn.lock b/yarn.lock index f7f3673..7e14eb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,13 +45,6 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@~7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" @@ -704,15 +697,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.10.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -1660,59 +1644,10 @@ unique-filename "^1.1.1" which "^1.3.1" -"@expo/config-plugins@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.5.tgz#9d357d2cda9c095e511b51583ede8a3b76174068" - integrity sha512-RVvU40RtZt12HavuDAe+LDIq9lHj7sheOfMEHdmpJ/uTA8pgvkbc56XF6JHQD+yRr6+uhhb+JnAasGq49dsQbw== - dependencies: - "@expo/config-types" "^45.0.0" - "@expo/json-file" "8.2.36" - "@expo/plist" "0.0.18" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.3.5" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "0.4.23" - -"@expo/config-types@^45.0.0": - version "45.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-45.0.0.tgz#963c2fdce8fbcbd003758b92ed8a25375f437ef6" - integrity sha512-/QGhhLWyaGautgEyU50UJr5YqKJix5t77ePTwreOVAhmZH+ff3nrrtYTTnccx+qF08ZNQmfAyYMCD3rQfzpiJA== - -"@expo/json-file@8.2.36": - version "8.2.36" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff" - integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^1.0.1" - write-file-atomic "^2.3.0" - -"@expo/plist@0.0.18": - version "0.0.18" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0" - integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w== - dependencies: - "@xmldom/xmldom" "~0.7.0" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - -"@expo/sdk-runtime-versions@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" - integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== - -"@farfetch/blackout-core@^1.58.2": - version "1.58.2" - resolved "https://registry.yarnpkg.com/@farfetch/blackout-core/-/blackout-core-1.58.2.tgz#7bd08cb041e5a914ca111a8622587423d846ef70" - integrity sha512-JDTqpKdoi0OZXAKwYH5YLr0dGEk2jDRdfCSQqXYOOFOhSamKmwjDW6Us8GTxw2+82oTPxB++5KN+rY3andpV4Q== +"@farfetch/blackout-core@^1.79.0": + version "1.101.0" + resolved "https://registry.yarnpkg.com/@farfetch/blackout-core/-/blackout-core-1.101.0.tgz#695caaa4f60eaf86e8c529c55c32317dfa2cb09d" + integrity sha512-8KaevsW2MouhoAA5QpYxYgFb9PuGBpHRbktycczrFjiASnYdkDCV5rjSv7OMn9y3EkESM6QEC7CV6390xgbdEg== dependencies: axios-token-interceptor "^0.2.0" crypto-js "3.1.9-1" @@ -3206,18 +3141,17 @@ resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.1.0.tgz#e42b1bef12d2415411519fd528e64b593b1363dc" integrity sha512-W/J0fNYVO01tioHjvYWQ9m6RgndVtbElzYozBq1ZPrHO/iCzlqoySHl4gO/fpCl9QEFjvJfjPgtPMTMlsoq5DQ== -"@react-native-firebase/analytics@^14.11.0": - version "14.11.0" - resolved "https://registry.yarnpkg.com/@react-native-firebase/analytics/-/analytics-14.11.0.tgz#99a3bb96f0ed6362907a120a40489f9a8bcf9ccd" - integrity sha512-hYc2avm4S1vicBdKLtBif87SFGru85LOMPqDblC9GM7cGFRR5WlkOiECvNTzzs+a5Jrfq1zPJsK1YQKxD7CRfQ== +"@react-native-firebase/analytics@^18.9.0": + version "18.9.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/analytics/-/analytics-18.9.0.tgz#15defe1052b01975e8b9dd487aff4041b5e42c1d" + integrity sha512-+5xuU2k+6zCG+QOzHTKLdZpD14DD9tz1m7gfO89/gO2qFdCqwOpLcBu2bb6ocsfgUE9CJkb0cFceO/m/9pe3jw== -"@react-native-firebase/app@^14.11.0": - version "14.11.0" - resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-14.11.0.tgz#41b1b7d41f51b6880ebad6a12ff87c85bcdab0d6" - integrity sha512-LzqgZNx+WcNGYRZG6LB9BkJAx4LE+LsbPF9p65TMSagWYd/iJafoXl4d6KWQeUMIFZQH7Ke/eJ/fIZkc+4eMRw== +"@react-native-firebase/app@^18.9.0": + version "18.9.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-18.9.0.tgz#e3c26156ac4f1d12ad5b2c9ce5caf7745204be65" + integrity sha512-kMY4HVWxfz0YjQ5n9oyW9uifI5CkQfLfj2FEeQrI9mCwaCNuRw04x9Yc8LeFpew7NPEDVfty7tlL3WEjDpvNEw== dependencies: - "@expo/config-plugins" "^4.1.5" - opencollective-postinstall "^2.0.1" + opencollective-postinstall "^2.0.3" superstruct "^0.6.2" "@react-native/assets@1.0.0": @@ -3225,7 +3159,7 @@ resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@2.0.0", "@react-native/normalize-color@^2.0.0": +"@react-native/normalize-color@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== @@ -3501,11 +3435,6 @@ semver "^7.3.2" tsutils "^3.17.1" -"@xmldom/xmldom@~0.7.0": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.10.tgz#b1f4a7dc63ac35b2750847644d5dacf5b4ead12f" - integrity sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ== - "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -4119,7 +4048,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -5069,7 +4998,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1: +debug@4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -6025,14 +5954,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -6287,11 +6208,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getenv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" - integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -6371,7 +6287,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7891,13 +7807,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - json5@^2.1.2, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" @@ -8117,13 +8026,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lock@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/lock/-/lock-1.1.0.tgz#53157499d1653b136ca66451071fca615703fa55" @@ -8260,13 +8162,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -9711,7 +9606,7 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -opencollective-postinstall@^2.0.1: +opencollective-postinstall@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== @@ -9805,13 +9700,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -9833,13 +9721,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-map-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" @@ -11097,7 +10978,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@>=0.6.0, sax@^1.2.1: +sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11152,13 +11033,6 @@ semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -11279,7 +11153,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-plist@^1.0.0, simple-plist@^1.1.0, simple-plist@^1.3.1: +simple-plist@^1.0.0, simple-plist@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== @@ -12378,7 +12252,7 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.2, uuid@^7.0.3: +uuid@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== @@ -12664,42 +12538,16 @@ xcode@^2.0.0: simple-plist "^1.0.0" uuid "^3.3.2" -xcode@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" - integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== - dependencies: - simple-plist "^1.1.0" - uuid "^7.0.3" - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" - integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== - xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -12739,11 +12587,6 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.7.2: version "1.9.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" @@ -12789,8 +12632,3 @@ yargs@^15.1.0, yargs@^15.3.1, yargs@^15.4.1: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==