diff --git a/packages/react-native-app-auth/package.json b/packages/react-native-app-auth/package.json index 8d1a7ed9..e3382c1a 100644 --- a/packages/react-native-app-auth/package.json +++ b/packages/react-native-app-auth/package.json @@ -37,6 +37,7 @@ "react-native": ">=0.63.0" }, "devDependencies": { + "@expo/config-plugins": "^8.0.8", "jest": "24.9.0", "react": "16.9.0", "react-native": "0.63.0" diff --git a/packages/react-native-app-auth/plugin/android/app-build-gradle.js b/packages/react-native-app-auth/plugin/android/app-build-gradle.js new file mode 100644 index 00000000..5c1e4cfb --- /dev/null +++ b/packages/react-native-app-auth/plugin/android/app-build-gradle.js @@ -0,0 +1,54 @@ +const { AndroidConfig, withDangerousMod } = require('@expo/config-plugins'); +const { + createGeneratedHeaderComment, + removeContents, +} = require('@expo/config-plugins/build/utils/generateCode'); +const codeModAndroid = require('@expo/config-plugins/build/android/codeMod'); +const fs = require('fs'); + +const withAppAuthAppBuildGradle = (rootConfig, options) => + withDangerousMod(rootConfig, [ + 'android', + config => { + // detauls to app scheme + const authScheme = options?.authScheme ?? config.scheme ?? ''; + + // find the app/build.gradle file and checks its format + const appBuildGradlePath = AndroidConfig.Paths.getAppBuildGradleFilePath( + config.modRequest.projectRoot + ); + + // BEWARE: we update the app/build.gradle file *outside* of the standard Expo config procedure ! + let contents = fs.readFileSync(appBuildGradlePath, 'utf-8'); + + if (contents.includes('manifestPlaceholders')) { + throw new Error( + 'app/build.gradle already contains manifestPlaceholders, cannot update automatically !' + ); + } + + // let's add the manifestPlaceholders section ! + contents = removeContents({ + src: contents, + tag: 'react-native-app-auth', + }).contents; + contents = codeModAndroid.appendContentsInsideDeclarationBlock( + contents, + 'defaultConfig', + ` + ${createGeneratedHeaderComment(contents, 'react-native-app-auth', '//')} + manifestPlaceholders = [ + 'appAuthRedirectScheme': '${authScheme}', + ] + // @generated end react-native-app-auth +` + ); + + // and finally we write the file back to the disk + fs.writeFileSync(appBuildGradlePath, contents, 'utf-8'); + + return config; + }, + ]); + +module.exports = { withAppAuthAppBuildGradle }; diff --git a/packages/react-native-app-auth/plugin/android/index.js b/packages/react-native-app-auth/plugin/android/index.js new file mode 100644 index 00000000..9b9a5d7f --- /dev/null +++ b/packages/react-native-app-auth/plugin/android/index.js @@ -0,0 +1,5 @@ +const { withAppAuthAppBuildGradle } = require('./app-build-gradle'); + +module.exports = { + withAppAuthAppBuildGradle, +}; diff --git a/packages/react-native-app-auth/plugin/index.js b/packages/react-native-app-auth/plugin/index.js new file mode 100644 index 00000000..b1fe4579 --- /dev/null +++ b/packages/react-native-app-auth/plugin/index.js @@ -0,0 +1,17 @@ +const { withPlugins, createRunOncePlugin } = require('@expo/config-plugins'); +const { withAppAuthAppDelegate, withAppAuthAppDelegateHeader } = require('./ios'); +const { withAppAuthAppBuildGradle } = require('./android'); + +const withAppAuth = config => { + return withPlugins(config, [ + // iOS + withAppAuthAppDelegate, + withAppAuthAppDelegateHeader, // 👈 ️this one uses withDangerousMod ! + + // Android + withAppAuthAppBuildGradle, // 👈 ️this one uses withDangerousMod ! + ]); +}; + +const packageJson = require('../package.json'); +module.exports = createRunOncePlugin(withAppAuth, packageJson.name, packageJson.version); diff --git a/packages/react-native-app-auth/plugin/ios/app-delegate-header.js b/packages/react-native-app-auth/plugin/ios/app-delegate-header.js new file mode 100644 index 00000000..b2c6fee2 --- /dev/null +++ b/packages/react-native-app-auth/plugin/ios/app-delegate-header.js @@ -0,0 +1,60 @@ +const { IOSConfig, withDangerousMod } = require('@expo/config-plugins'); +const codeModIOs = require('@expo/config-plugins/build/ios/codeMod'); +const { + createGeneratedHeaderComment, + removeContents, +} = require('@expo/config-plugins/build/utils/generateCode'); +const fs = require('fs'); +const { insertProtocolDeclaration } = require('./utils/insert-protocol-declaration'); + +const withAppAuthAppDelegateHeader = rootConfig => + withDangerousMod(rootConfig, [ + 'ios', + config => { + // find the AppDelegate.h file in the project + const headerFilePath = IOSConfig.Paths.getAppDelegateObjcHeaderFilePath( + config.modRequest.projectRoot + ); + + // BEWARE: we update the AppDelegate.h file *outside* of the standard Expo config procedure ! + let contents = fs.readFileSync(headerFilePath, 'utf-8'); + + // add a new import (unless it already exists) + contents = codeModIOs.addObjcImports(contents, [ + '"RNAppAuthAuthorizationFlowManager.h"', + "", // in reverse order because of the way the code-mod works + ]); + + // adds a new protocol to the AppDelegate interface (unless it already exists) + contents = insertProtocolDeclaration({ + source: contents, + interfaceName: 'AppDelegate', + protocolName: 'RNAppAuthAuthorizationFlowManager', + baseClassName: 'EXAppDelegateWrapper', + }); + + // add a new property to the AppDelegate interface (unless it already exists) + contents = removeContents({ + src: contents, + tag: 'react-native-app-auth', + }).contents; + contents = codeModIOs.insertContentsInsideObjcInterfaceBlock( + contents, + '@interface AppDelegate', + ` +${createGeneratedHeaderComment(contents, 'react-native-app-auth', '//')} +@property(nonatomic, weak) id authorizationFlowManagerDelegate; +// @generated end react-native-app-auth`, + { position: 'head' } + ); + + // and finally we write the file back to the disk + fs.writeFileSync(headerFilePath, contents, 'utf-8'); + + return config; + }, + ]); + +module.exports = { + withAppAuthAppDelegateHeader, +}; diff --git a/packages/react-native-app-auth/plugin/ios/app-delegate.js b/packages/react-native-app-auth/plugin/ios/app-delegate.js new file mode 100644 index 00000000..7e92bd24 --- /dev/null +++ b/packages/react-native-app-auth/plugin/ios/app-delegate.js @@ -0,0 +1,55 @@ +const { withAppDelegate } = require('@expo/config-plugins'); +const codeModIOs = require('@expo/config-plugins/build/ios/codeMod'); +const { + createGeneratedHeaderComment, + removeContents, +} = require('@expo/config-plugins/build/utils/generateCode'); + +const withAppAuthAppDelegate = (rootConfig) => + withAppDelegate(rootConfig, (config) => { + let { contents } = config.modResults; + + // generation tags & headers + const tag1 = 'react-native-app-auth custom scheme'; + const tag2 = 'react-native-app-auth deep linking'; + const header1 = createGeneratedHeaderComment(contents, tag1, '//'); + const header2 = createGeneratedHeaderComment(contents, tag2, '//'); + + // insert the code that handles the custom scheme redirections + contents = removeContents({ src: contents, tag: tag1 }).contents; + contents = codeModIOs.insertContentsInsideObjcFunctionBlock( + contents, + 'application:openURL:options:', + ` ${header1} + if ([self.authorizationFlowManagerDelegate resumeExternalUserAgentFlowWithURL:url]) { + return YES; + } + // @generated end ${tag1}`, + { position: 'head' } + ); + + // insert the code that handles the deep linking continuation + contents = removeContents({ src: contents, tag: tag2 }).contents; + contents = codeModIOs.insertContentsInsideObjcFunctionBlock( + contents, + 'application:continueUserActivity:restorationHandler:', + ` ${header2} + if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { + if (self.authorizationFlowManagerDelegate) { + BOOL resumableAuth = [self.authorizationFlowManagerDelegate resumeExternalUserAgentFlowWithURL:userActivity.webpageURL]; + if (resumableAuth) { + return YES; + } + } + } + // @generated end ${tag2}`, + { position: 'head' } + ); + + config.modResults.contents = contents; + return config; + }); + +module.exports = { + withAppAuthAppDelegate, +}; diff --git a/packages/react-native-app-auth/plugin/ios/index.js b/packages/react-native-app-auth/plugin/ios/index.js new file mode 100644 index 00000000..22be718d --- /dev/null +++ b/packages/react-native-app-auth/plugin/ios/index.js @@ -0,0 +1,7 @@ +const { withAppAuthAppDelegateHeader } = require('./app-delegate-header'); +const { withAppAuthAppDelegate } = require('./app-delegate'); + +module.exports = { + withAppAuthAppDelegate, + withAppAuthAppDelegateHeader, +}; diff --git a/packages/react-native-app-auth/plugin/ios/utils/insert-protocol-declaration.js b/packages/react-native-app-auth/plugin/ios/utils/insert-protocol-declaration.js new file mode 100644 index 00000000..9ffd929e --- /dev/null +++ b/packages/react-native-app-auth/plugin/ios/utils/insert-protocol-declaration.js @@ -0,0 +1,35 @@ +/** + * Inserts a protocol into an Objective-C class interface declaration. + * @param {string} source source code of the file + * @param {string} interfaceName Name of the interface to insert the protocol into (ex: AppDelegate) + * @param {string} protocolName Name of the protocol to add to the list of protocols (ex: RNAppAuthAuthorizationFlowManagerDelegate) + * @param {string|undefined} baseClassName Base class name of the interface (ex: NSObject) + * @returns {string} the patched source code + */ +const insertProtocolDeclaration = ({ + source, + interfaceName, + protocolName, + baseClassName = 'NSObject', +}) => { + const matchInterfaceDeclarationRegexp = new RegExp( + `(@interface\\s+${interfaceName}\\s*:\\s*${baseClassName})(\\s*\\<(.*)\\>)?` + ); + const match = source.match(matchInterfaceDeclarationRegexp); + if (match) { + const [line, interfaceDeclaration, , existingProtocols] = match; + if (!existingProtocols || !existingProtocols.includes(protocolName)) { + source = source.replace( + line, + `${interfaceDeclaration} <${ + existingProtocols ? `${existingProtocols},` : '' + }${protocolName}>` + ); + } + } + return source; +}; + +module.exports = { + insertProtocolDeclaration, +}; diff --git a/yarn.lock b/yarn.lock index 6444abd5..a54cf7b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,13 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@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.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" @@ -476,7 +483,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/highlight@^7.24.7": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== @@ -1971,6 +1978,55 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@expo/config-plugins@^8.0.8": + version "8.0.8" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.8.tgz#294a71905a498ea02c8b79bea950b5e37ab5d748" + integrity sha512-Fvu6IO13EUw0R9WeqxUO37FkM62YJBNcZb9DyJAOgMz7Ez/vaKQGEjKt9cwT+Q6uirtCATMgaq6VWAW7YW8xXw== + dependencies: + "@expo/config-types" "^51.0.0-unreleased" + "@expo/json-file" "~8.3.0" + "@expo/plist" "^0.1.0" + "@expo/sdk-runtime-versions" "^1.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.5.4" + slash "^3.0.0" + slugify "^1.6.6" + xcode "^3.0.1" + xml2js "0.6.0" + +"@expo/config-types@^51.0.0-unreleased": + version "51.0.2" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.2.tgz#7385451b180d34d8f2a4eeb5feabe1fe3c5d4f32" + integrity sha512-IglkIoiDwJMY01lYkF/ZSBoe/5cR+O3+Gx6fpLFjLfgZGBTdyPkKa1g8NWoWQCk+D3cKL2MDbszT2DyRRB0YqQ== + +"@expo/json-file@~8.3.0": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.3.tgz#7926e3592f76030ce63d6b1308ac8f5d4d9341f4" + integrity sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + +"@expo/plist@^0.1.0": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.3.tgz#b4fbee2c4f7a88512a4853d85319f4d95713c529" + integrity sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg== + dependencies: + "@xmldom/xmldom" "~0.7.7" + 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== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -3264,6 +3320,16 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xmldom/xmldom@~0.7.7": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" + integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== + abab@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" @@ -4011,7 +4077,7 @@ base64-js@^1.1.2, base64-js@^1.2.3: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64-js@^1.3.1: +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== @@ -4043,6 +4109,11 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + big-integer@^1.6.44: version "1.6.48" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" @@ -4071,6 +4142,13 @@ bplist-creator@0.0.8: dependencies: stream-buffers "~2.2.0" +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + bplist-parser@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" @@ -4078,6 +4156,13 @@ bplist-parser@0.2.0: dependencies: big-integer "^1.6.44" +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -5969,7 +6054,7 @@ 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: +find-up@^5.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== @@ -6099,9 +6184,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -6226,6 +6311,11 @@ 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" @@ -6254,7 +6344,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: +glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -8200,7 +8290,7 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" -json5@^2.2.3: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -10338,6 +10428,15 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" +plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + plugin-error@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" @@ -11254,6 +11353,11 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" +sax@>=0.6.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -11476,6 +11580,15 @@ simple-plist@^1.0.0: bplist-parser "0.2.0" plist "^3.0.1" +simple-plist@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + sisteransi@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" @@ -11505,6 +11618,11 @@ slice-ansi@^2.0.0, slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slugify@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + smartwrap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" @@ -11712,7 +11830,7 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-buffers@~2.2.0: +stream-buffers@2.2.x, stream-buffers@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= @@ -12511,6 +12629,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +uuid@^7.0.3: + 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== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -12842,16 +12965,47 @@ 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.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" + integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== + 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@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + 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== + xmldoc@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7"