Compare commits

...
Author SHA1 Message Date
semantic-release-bot 74f55fc342 chore: 2.0.2
### @config-plugins/ios-stickers [2.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-30)

### Other chores

* **deps-dev:** bump memfs in /packages/ios-stickers ([#83](https://github.com/expo/config-plugins/issues/83)) ([764a047](https://github.com/expo/config-plugins/commit/764a04710bea6e66dbc6d0065812acb1591435fb))
2022-06-30 17:32:49 +00:00
Evan Bacon e32378e8ed Add App Clips and Safari Extensions to Awesome list 2022-06-30 19:29:09 +02:00
dependabot[bot] 764a04710b chore(deps-dev): bump memfs in /packages/ios-stickers (#83) 2022-06-18 18:06:21 +02:00
Eugene Nagorny 837602af36 Update README.md (#89) 2022-06-18 18:04:46 +02:00
semantic-release-bot af22acc509 chore: 2.0.0
## @config-plugins/react-native-dynamic-app-icon [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-14)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-06-14 12:21:20 +00:00
Evan Bacon 994fadc8dd chore(react-native-siri-shortcut): add tests (#88)
* add: tests for siri

* add: unit tests

* chore: update repo settings

* chore: noop android

* Update withReactNativeSiriShortcut.ts
2022-06-14 14:17:45 +02:00
semantic-release-bot 987b109e46 chore: 2.0.0
## @config-plugins/react-native-quick-actions [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-13)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-06-13 13:35:03 +00:00
Derek W. Stavis 226b2a6412 feat(siri-shortcut): Add config plugin (#86) 2022-06-13 15:31:30 +02:00
semantic-release-bot d1a2929130 chore: 2.0.0
## @config-plugins/react-native-google-cast [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-05-30 22:16:53 +00:00
Evan Bacon a04de8a0e0 Update README.md 2022-05-30 17:13:19 -05:00
semantic-release-bot 20a4ecf8a8 chore: 2.0.1
### @config-plugins/ios-stickers [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)

### Bug Fixes

* **ios-stickers:** fix app icon generation ([#82](https://github.com/expo/config-plugins/issues/82)) ([190c489](https://github.com/expo/config-plugins/commit/190c489b764f285dbbecfa42fd7ee953fc849dcb))
2022-05-30 21:58:52 +00:00
Evan Bacon 9e8a90d523 Update README.md 2022-05-30 16:54:34 -05:00
semantic-release-bot 9c79b293d8 chore: 2.0.0
## @config-plugins/ffmpeg-kit-react-native [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-05-30 21:27:42 +00:00
evanbacon 77eb67c5b6 Publish @config-plugins/[email protected] 2022-05-30 16:24:03 -05:00
Evan Bacon 190c489b76 fix(ios-stickers): fix app icon generation (#82) 2022-05-27 16:46:49 -05:00
semantic-release-bot 6c898afd0e chore: 2.0.0
## @config-plugins/react-native-ble-plx [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-27)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-05-27 15:20:49 +00:00
evanbacon b55b04d5fd Update issue template with branch 2022-05-27 10:17:47 -05:00
evanbacon 0c7b413a76 chore: publish packages [no-ci] 2022-05-13 12:10:38 -05:00
57 changed files with 1510 additions and 67 deletions

No files matched your search

+3 -1
View File
@@ -1,4 +1,4 @@
name: "\U0001F41B Expo Config Plugin Bug Report"
name: 🐛 Expo Config Plugin Bug Report
description: Report a reproducible bug with one of the Expo Config Plugins.
labels: bug
body:
@@ -36,11 +36,13 @@ body:
- '@config-plugins/react-native-adjust'
- '@config-plugins/react-native-ble-plx'
- '@config-plugins/react-native-blob-util'
- '@config-plugins/react-native-branch'
- '@config-plugins/react-native-callkeep'
- '@config-plugins/react-native-dynamic-app-icon'
- '@config-plugins/react-native-google-cast'
- '@config-plugins/react-native-pdf'
- '@config-plugins/react-native-quick-actions'
- '@config-plugins/react-native-siri-shortcut'
- '@config-plugins/react-native-webrtc'
validations:
required: true
+27 -24
View File
@@ -1,44 +1,47 @@
---
blank_issues_enabled: false
contact_links:
- name: "\U0001F914 Question about an Expo Config Plugin"
- name: 🤔 Question about an Expo Config Plugin
about: >-
If you have a question about an Expo Config Plugin, please ask it on the
forums, discord, Twitter, or Stack Overflow.
url: 'https://forums.expo.io/'
url: https://forums.expo.io/
- about: E2E tests and automation for mobile
name: "\U0001F4E6 detox issues"
url: 'https://github.com/wix/Detox/issues'
name: 📦 detox issues
url: https://github.com/wix/Detox/issues
- about: FFmpeg Kit for React Native
name: "\U0001F4E6 ffmpeg-kit-react-native issues"
url: 'https://github.com/tanersener/ffmpeg-kit/issues'
name: 📦 ffmpeg-kit-react-native issues
url: https://github.com/tanersener/ffmpeg-kit/issues
- about: Adjust React Native SDK
name: "\U0001F4E6 react-native-adjust issues"
url: 'https://github.com/adjust/react_native_sdk/issues'
name: 📦 react-native-adjust issues
url: https://github.com/adjust/react_native_sdk/issues
- about: React Native Bluetooth Low Energy library
name: "\U0001F4E6 react-native-ble-plx issues"
url: 'https://github.com/Polidea/react-native-ble-plx/issues'
name: 📦 react-native-ble-plx issues
url: https://github.com/Polidea/react-native-ble-plx/issues
- about: >-
A module provides upload, download, and files access API. Supports file
stream read/write for process large files.
name: "\U0001F4E6 react-native-blob-util issues"
url: 'https://github.com/RonRadtke/react-native-blob-util/issues'
name: 📦 react-native-blob-util issues
url: https://github.com/RonRadtke/react-native-blob-util/issues
- about: iOS 10 CallKit and Android ConnectionService Framework For React Native
name: "\U0001F4E6 react-native-callkeep issues"
url: 'https://github.com/react-native-webrtc/react-native-callkeep/issues'
name: 📦 react-native-callkeep issues
url: https://github.com/react-native-webrtc/react-native-callkeep/issues
- about: Programmatically change the app icon in React Native.
name: "\U0001F4E6 react-native-dynamic-app-icon issues"
url: 'https://github.com/idearockers/react-native-dynamic-app-icon/issues'
name: 📦 react-native-dynamic-app-icon issues
url: https://github.com/idearockers/react-native-dynamic-app-icon/issues
- about: React Native wrapper for the Google Cast SDK for iOS and Android
name: "\U0001F4E6 react-native-google-cast issues"
name: 📦 react-native-google-cast issues
url: >-
https://github.com/react-native-google-cast/react-native-google-cast/issues
- about: 'A react native PDF view component, support ios and android platform'
name: "\U0001F4E6 react-native-pdf issues"
url: 'https://github.com/wonday/react-native-pdf/issues'
- about: A react native PDF view component, support ios and android platform
name: 📦 react-native-pdf issues
url: https://github.com/wonday/react-native-pdf/issues
- about: A react-native interface for Touch 3D home screen quick actions
name: "\U0001F4E6 react-native-quick-actions issues"
url: 'https://github.com/jordanbyron/react-native-quick-actions/issues'
name: 📦 react-native-quick-actions issues
url: https://github.com/jordanbyron/react-native-quick-actions/issues
- about: A React Native library that enables you to use iOS 12+ Siri Shortcuts.
name: 📦 react-native-siri-shortcut issues
url: https://github.com/Gustash/react-native-siri-shortcut/issues
- about: WebRTC for React Native
name: "\U0001F4E6 react-native-webrtc issues"
url: 'https://github.com/react-native-webrtc/react-native-webrtc/issues'
name: 📦 react-native-webrtc issues
url: https://github.com/react-native-webrtc/react-native-webrtc/issues
+6
View File
@@ -83,6 +83,12 @@ updates:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-siri-shortcut
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-webrtc
schedule:
+1
View File
@@ -41,6 +41,7 @@ jobs:
react-native-ble-plx,
react-native-blob-util,
react-native-branch,
react-native-siri-shortcut,
react-native-google-cast,
react-native-pdf,
# react-native-quick-actions,
+39
View File
@@ -6,6 +6,45 @@
- All packages here are community maintained. Feel free to improve docs, packages, tests, etc.
- We maintain a 1-1 mapping of **native packages** ⇔ `@config-plugins/*`. This means there should be no general utility packages here -- those are better suited for a different repo / NPM namespace.
## Awesome
Here is a list of known packages that have a built-in Config Plugin.
> Not all packages need a config plugin, packages that don't appear here might still work with managed EAS.
- [React Native Firebase](https://rnfirebase.io/) (`@react-native-firebase/perf`, `@react-native-firebase/app`)
- [react-native-nfc-manager](https://github.com/revtel/react-native-nfc-manager)
- [react-native-health](https://github.com/agencyenterprise/react-native-health)
- [@react-native-mapbox-gl/maps](https://github.com/rnmapbox/maps)
- [@logrocket/react-native](https://www.npmjs.com/package/@logrocket/react-native)
- [sentry-expo](https://www.npmjs.com/package/sentry-expo)
- [@leanplum/react-native-sdk](https://github.com/Leanplum/Leanplum-ReactNative-SDK#readme)
- [react-native-fbsdk-next](https://www.npmjs.com/package/react-native-fbsdk-next)
- [@stripe/stripe-react-native](https://www.npmjs.com/package/@stripe/stripe-react-native)
- [@react-native-voice/voice](https://www.npmjs.com/package/@react-native-voice/voice)
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
- [@viro-community/react-viro](https://github.com/virocommunity/viro)
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
- [react-native-spotlight-search](https://www.npmjs.com/package/react-native-spotlight-search)
- [newrelic-react-native-agent](https://www.npmjs.com/package/newrelic-react-native-agent)
- [react-native-videoeditorsdk](https://www.npmjs.com/package/react-native-videoeditorsdk)
- [notifee](https://notifee.app/)
- [App Clips](https://github.com/bndkt/react-native-app-clip/)
- [iOS Safari Extensions](https://github.com/andrew-levy/react-native-safari-extension/)
### Complementary
More out-of-tree plugins which can be used to configure more packages.
- [onesignal-expo-plugin](https://github.com/OneSignal/onesignal-expo-plugin) (for use with `react-native-onesignal`)
- [@lyrahealth-inc/react-native-orientation-plugin](@lyrahealth-inc/react-native-orientation-plugin) (for use with `react-native-orientation-plugin`)
- [airship-expo-plugin](https://www.npmjs.com/package/airship-expo-plugin) (for use with `urbanairship-react-native`)
- [config-plugin-react-native-intercom](https://www.npmjs.com/package/config-plugin-react-native-intercom) (for use with `intercom-react-native`)
- [@allboatsrise/expo-marketingcloudsdk](https://www.npmjs.com/package/@allboatsrise/expo-marketingcloudsdk) (for use with `react-native-marketingcloudsdk`)
- [@ouvio/react-native-background-location-plugin](https://www.npmjs.com/package/@ouvio/react-native-background-location-plugin) (for use with `react-native-background-location-plugin`)
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
## Contributing!
See the [contributing guide](/CONTRIBUTING.md).
@@ -0,0 +1,80 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
Whitespace-only changes.
@@ -0,0 +1,16 @@
const path = require("path");
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
// Expose CI env variables to the app
config.extra.CI = process.env.CI;
if (!config.ios) config.ios = {};
config.ios.bundleIdentifier = appId;
if (!config.android) config.android = {};
config.android.package = appId;
return config;
};
+14
View File
@@ -0,0 +1,14 @@
{
"expo": {
"icon": "https://icogen.vercel.app/api/icon",
"plugins": [
[
"@config-plugins/react-native-siri-shortcut",
[
"com.example.InitiateWorkout",
"com.example.FinishWorkout"
]
]
]
}
}
@@ -0,0 +1,6 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
+5
View File
@@ -0,0 +1,5 @@
import { registerRootComponent } from "expo";
import App from "./src/App";
registerRootComponent(App);
@@ -0,0 +1,6 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
@@ -0,0 +1,25 @@
{
"name": "@config-plugins-app/react-native-siri-shortcut",
"main": "./index.js",
"version": "1.0.0",
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/react-native-siri-shortcut": "*",
"expo": "^45.0.0",
"expo-splash-screen": "~0.15.1",
"react": "17.0.2",
"react-native": "0.68.2",
"react-native-siri-shortcut": "^3.1.0",
"expo-status-bar": "~1.3.0",
"react-dom": "17.0.2",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9"
},
"private": true
}
@@ -0,0 +1,264 @@
import React, { Component } from 'react';
import {
StyleSheet,
Text,
ScrollView,
Button,
SafeAreaView,
View,
EmitterSubscription,
} from 'react-native';
import {
ShortcutOptions,
ShortcutData,
ShortcutInfo,
donateShortcut,
suggestShortcuts,
clearAllShortcuts,
clearShortcutsWithIdentifiers,
presentShortcut,
getShortcuts,
addShortcutListener,
getInitialShortcut,
AddToSiriButton,
SiriButtonStyles,
} from 'react-native-siri-shortcut';
const opts1: ShortcutOptions = {
activityType: 'com.github.gustash.SiriShortcutsModuleExample.sayHello',
title: 'Say Hi',
userInfo: {
foo: 1,
bar: 'baz',
baz: 34.5,
},
requiredUserInfoKeys: ['foo', 'bar', 'baz'],
keywords: ['kek', 'foo', 'bar'],
persistentIdentifier:
'com.github.gustash.SiriShortcutsModuleExample.sayHello',
isEligibleForSearch: true,
isEligibleForPrediction: true,
suggestedInvocationPhrase: 'Say something',
needsSave: true,
};
const opts2: ShortcutOptions = {
activityType: 'com.github.gustash.SiriShortcutsModuleExample.somethingElse',
title: 'Something Else',
persistentIdentifier: 'some.persistent.identifier',
isEligibleForSearch: true,
isEligibleForPrediction: true,
suggestedInvocationPhrase: "What's up?",
description: 'Just a random description',
};
type State = {
shortcutInfo: any | null,
shortcutActivityType: string | null,
addToSiriStyle: 0 | 1 | 2 | 3 | 4 | 5,
shortcuts: Array<ShortcutData>,
};
export default class App extends Component<void, State> {
listener: EmitterSubscription | null = null;
state: State = {
shortcutInfo: null,
shortcutActivityType: null,
addToSiriStyle: SiriButtonStyles.blackOutline,
shortcuts: [],
};
componentDidMount() {
this.handleInitialShortcut();
this.listener = addShortcutListener(this.handleSiriShortcut.bind(this));
// This will suggest these two shortcuts so that they appear
// in Settings > Siri & Search, even if they are not yet
// donated. Suitable for shortcuts that you expect the user
// may want to use. (https://developer.apple.com/documentation/sirikit/shortcut_management/suggesting_shortcuts_to_users)
suggestShortcuts([opts1, opts2]);
this.updateShortcutList();
}
componentWillUnmount() {
if (this.listener) {
this.listener.remove();
}
}
async handleInitialShortcut() {
const initialShortcut = await getInitialShortcut();
if (!initialShortcut) {
return;
}
this.handleSiriShortcut(initialShortcut);
}
handleSiriShortcut({ userInfo, activityType }: ShortcutInfo) {
this.setState({
shortcutInfo: userInfo,
shortcutActivityType: activityType,
});
}
setupShortcut1() {
donateShortcut(opts1);
}
setupShortcut2() {
donateShortcut(opts2);
}
async clearShortcut1() {
try {
await clearShortcutsWithIdentifiers([
'com.github.gustash.SiriShortcutsModuleExample.sayHello',
]);
alert('Cleared Shortcut 1');
} catch (e) {
alert("You're not running iOS 12!");
}
}
async clearShortcut2() {
try {
await clearShortcutsWithIdentifiers(['some.persistent.identifier']);
alert('Cleared Shortcut 2');
} catch (e) {
alert("You're not running iOS 12!");
}
}
async updateShortcutList() {
try {
const shortcuts = await getShortcuts();
this.setState({
shortcuts,
});
} catch (e) {
alert("You're not running iOS 12!");
}
}
async clearBothShortcuts() {
try {
await clearShortcutsWithIdentifiers([
'com.github.gustash.SiriShortcutsModuleExample.sayHello',
'some.persistent.identifier',
]);
alert('Cleared Both Shortcuts');
} catch (e) {
alert("You're not running iOS 12!");
}
}
async clearShortcuts() {
try {
await clearAllShortcuts();
alert('Deleted all the shortcuts');
} catch (e) {
alert("You're not running iOS 12!");
}
}
swapSiriButtonTheme() {
const { addToSiriStyle } = this.state;
const styles = Object.keys(SiriButtonStyles).map(
key => SiriButtonStyles[key],
);
const index = styles.findIndex(style => style === addToSiriStyle);
if (index === styles.length - 1) this.setState({ addToSiriStyle: styles[0] });
else this.setState({ addToSiriStyle: styles[index + 1] });
}
render() {
const { shortcutInfo, shortcutActivityType, addToSiriStyle, shortcuts } =
this.state;
return (
<SafeAreaView style={styles.container}>
<ScrollView
style={styles.container}
contentContainerStyle={styles.contentContainer}>
<Text>Shortcut Activity Type: {shortcutActivityType || 'None'}</Text>
<Text>
Shortcut Info:{' '}
{shortcutInfo ? JSON.stringify(shortcutInfo) : 'No shortcut data.'}
</Text>
<Button
title="Create Shortcut 1"
onPress={this.setupShortcut1.bind(this)}
/>
<Button
title="Create Shortcut 2"
onPress={this.setupShortcut2.bind(this)}
/>
<Button
title="Clear Shortcut 1"
onPress={this.clearShortcut1.bind(this)}
/>
<Button
title="Clear Shortcut 2"
onPress={this.clearShortcut2.bind(this)}
/>
<Button
title="Clear Both Shortcuts"
onPress={this.clearBothShortcuts.bind(this)}
/>
<Button
title="Delete All Shortcuts"
onPress={this.clearShortcuts.bind(this)}
/>
<Button
title="Update list of shortcuts"
onPress={this.updateShortcutList.bind(this)}
/>
<AddToSiriButton
buttonStyle={addToSiriStyle}
onPress={() => {
presentShortcut(opts1, ({ status }) => {
console.log(`I was ${status}`);
});
}}
shortcut={opts1}
/>
<Button
title="Swap Siri Button Theme"
onPress={this.swapSiriButtonTheme.bind(this)}
/>
{shortcuts.length ? (
shortcuts.map(({ identifier, phrase, options }, i) => (
<View key={identifier}>
<Text>Shortcut {i + 1}:</Text>
<Text>Identifier - {identifier}</Text>
<Text>Phrase - {phrase}</Text>
<Text>Options - {JSON.stringify(options)}</Text>
</View>
))
) : (
<Text>No Shortcuts yet</Text>
)}
</ScrollView>
</SafeAreaView>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5FCFF',
},
contentContainer: {
justifyContent: 'center',
alignItems: 'center',
},
});
@@ -0,0 +1,6 @@
import React from 'react';
import { View, Text } from 'react-native';
export default function App() {
return (<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text>No-op on this platform</Text></View>)
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/detox",
"version": "1.2.3",
"version": "2.0.0",
"description": "Config plugin to auto configure detox on prebuild",
"main": "build/withDetox.js",
"types": "build/withDetox.d.ts",
@@ -1,3 +1,19 @@
## @config-plugins/ffmpeg-kit-react-native [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/ffmpeg-kit-react-native [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/ffmpeg-kit-react-native",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure FFMPEG on prebuild",
"main": "build/withFFMPEG.js",
"types": "build/withFFMPEG.d.ts",
+14
View File
@@ -1,3 +1,17 @@
### @config-plugins/ios-stickers [2.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-30)
### Other chores
* **deps-dev:** bump memfs in /packages/ios-stickers ([#83](https://github.com/expo/config-plugins/issues/83)) ([764a047](https://github.com/expo/config-plugins/commit/764a04710bea6e66dbc6d0065812acb1591435fb))
### @config-plugins/ios-stickers [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
### Bug Fixes
* **ios-stickers:** fix app icon generation ([#82](https://github.com/expo/config-plugins/issues/82)) ([190c489](https://github.com/expo/config-plugins/commit/190c489b764f285dbbecfa42fd7ee953fc849dcb))
## @config-plugins/ios-stickers [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-12)
+4 -4
View File
@@ -38,7 +38,7 @@ In your app.json `plugins` array:
]
```
- name: defaults to the iOS app name
- icon: defaults to the iOS app icon
- columns: number of stickers to render, defaults to `3` iirc.
- stickers: local file paths or remote URLs, or `{ image: "...", name: "...", accessibilityLabel: "..." }`. Order is preserved.
- `name`: defaults to the iOS app name
- `icon`: defaults to the iOS app icon
- `columns`: number of stickers to render, defaults to `3`. Can be one of `2`, `3`, `4`.
- `stickers`: local file paths or remote URLs, or `{ image: "...", name: "...", accessibilityLabel: "..." }`. Order is preserved.
@@ -0,0 +1,8 @@
export const generateImageAsync = jest.fn(async (input: any, { src }) => {
const fs = require("fs");
return { source: fs.readFileSync(src) };
});
export const compositeImagesAsync = jest.fn(async ({ foreground }) => {
return foreground;
});
+2
View File
@@ -0,0 +1,2 @@
import { fs } from 'memfs';
module.exports = fs;
@@ -59,11 +59,11 @@ const ICON_CONTENTS = [
idiom: "ios-marketing",
sizes: [
{
platform: "ios",
size: 1024,
scales: [1],
},
{
platform: "ios",
size: [1024, 768],
scales: [1],
},
@@ -108,15 +108,16 @@ async function generateImessageIconsAsync(projectRoot, icon, iconsPath) {
// Save a reference to the generated image so we don't create a duplicate.
generatedIcons[filename] = true;
}
imagesJson.push({
idiom: platform.idiom,
size: `${width}x${height}`,
// @ts-ignore: template types not supported in TS yet
scale: `${scale}x`,
const imgJson = {
filename,
});
idiom: platform.idiom,
scale: `${scale}x`,
size: `${width}x${height}`,
};
// This order closely matches Xcode formatting.
imagesJson.push(imgJson);
if (rest.platform) {
imagesJson[imagesJson.length - 1].platform = rest.platform;
imgJson.platform = rest.platform;
}
}
}
+3 -3
View File
@@ -8,7 +8,7 @@ const config_plugins_1 = require("@expo/config-plugins");
const image_utils_1 = require("@expo/image-utils");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const withStickerIcon_1 = require("./withStickerIcon");
const generateImessageIconsAsync_1 = require("./generateImessageIconsAsync");
const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget");
const STICKERS_ROOT_PATH = "Stickers.xcassets";
const IMESSAGE_APP_ICON_PATH = "Stickers.xcassets/iMessage App Icon.stickersiconset";
@@ -70,13 +70,13 @@ const withStickerAssets = (config, { stickers, icon, size }) => {
const iMessageAppIconsPath = path_1.default.join(stickerRootPath, IMESSAGE_APP_ICON_PATH);
// Only generate icons if an icon is defined
const imessageIconContents = icon
? await withStickerIcon_1.generateImessageIconsAsync(config.modRequest.projectRoot, icon, iMessageAppIconsPath)
? await generateImessageIconsAsync_1.generateImessageIconsAsync(config.modRequest.projectRoot, icon, iMessageAppIconsPath)
: [];
const iMessageAppIconContentsJsonPath = path_1.default.join(iMessageAppIconsPath, "Contents.json");
fs_1.default.mkdirSync(iMessageAppIconsPath, {
recursive: true,
});
fs_1.default.writeFileSync(iMessageAppIconContentsJsonPath, JSON.stringify({ info: defaultInfo, images: imessageIconContents }, null, 2));
fs_1.default.writeFileSync(iMessageAppIconContentsJsonPath, JSON.stringify({ images: imessageIconContents, info: defaultInfo }, null, 2));
const stickerPackContentsPath = path_1.default.join(stickerRootPath, STICKER_PACK_PATH);
const stickersContents = {
info: defaultInfo,
+12 -1
View File
@@ -1 +1,12 @@
module.exports = require('expo-module-scripts/jest-preset-plugin');
const path = require("path");
const roots = ["__mocks__", "src"];
module.exports = {
...require("expo-module-scripts/jest-preset-plugin"),
rootDir: path.resolve(__dirname),
displayName: require("./package").name,
roots,
setupFiles: ["<rootDir>/jest/setup.js"],
clearMocks: true,
};
+2
View File
@@ -0,0 +1,2 @@
jest.mock("@expo/image-utils");
jest.mock("fs");
+6 -2
View File
@@ -1,10 +1,13 @@
{
"name": "@config-plugins/ios-stickers",
"version": "2.0.0",
"version": "2.0.2",
"description": "Config plugin to auto configure iOS iMessage stickers",
"main": "build/withStickerPack.js",
"types": "build/withStickerPack.d.ts",
"sideEffects": false,
"files": [
"build"
],
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
@@ -30,6 +33,7 @@
"xcode": "^3.0.1"
},
"devDependencies": {
"expo-module-scripts": "^2.0.0"
"expo-module-scripts": "^2.0.0",
"memfs": "^3.4.4"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

@@ -0,0 +1,111 @@
import { generateImageAsync } from "@expo/image-utils";
import fs from "fs";
import { vol } from "memfs";
import path from "path";
import { generateImessageIconsAsync } from "../generateImessageIconsAsync";
const fsReal = jest.requireActual("fs") as typeof fs;
describe(generateImessageIconsAsync, () => {
it(`should generate imessage icons`, async () => {
vol.fromJSON({}, "/");
await fs.promises.writeFile(
"/icon.png",
await fsReal.promises.readFile(path.join(__dirname, "fixtures/icon.png"))
);
const contents = await generateImessageIconsAsync(
"/",
"/icon.png",
"/output"
);
expect(generateImageAsync).toHaveBeenCalledTimes(13);
expect(contents).toEqual([
{
filename: "[email protected]",
idiom: "iphone",
scale: "2x",
size: "29x29",
},
{
filename: "[email protected]",
idiom: "iphone",
scale: "3x",
size: "29x29",
},
{
filename: "[email protected]",
idiom: "iphone",
scale: "2x",
size: "60x45",
},
{
filename: "[email protected]",
idiom: "iphone",
scale: "3x",
size: "60x45",
},
{
filename: "[email protected]",
idiom: "ipad",
scale: "2x",
size: "29x29",
},
{
filename: "[email protected]",
idiom: "ipad",
scale: "2x",
size: "67x50",
},
{
filename: "[email protected]",
idiom: "ipad",
scale: "2x",
size: "74x55",
},
{
filename: "[email protected]",
idiom: "universal",
platform: "ios",
scale: "2x",
size: "27x20",
},
{
filename: "[email protected]",
idiom: "universal",
platform: "ios",
scale: "3x",
size: "27x20",
},
{
filename: "[email protected]",
idiom: "universal",
platform: "ios",
scale: "2x",
size: "32x24",
},
{
filename: "[email protected]",
idiom: "universal",
platform: "ios",
scale: "3x",
size: "32x24",
},
{
filename: "[email protected]",
idiom: "ios-marketing",
scale: "1x",
size: "1024x1024",
},
{
filename: "[email protected]",
idiom: "ios-marketing",
platform: "ios",
scale: "1x",
size: "1024x768",
},
]);
});
});
@@ -86,12 +86,11 @@ const ICON_CONTENTS: {
idiom: "ios-marketing",
sizes: [
{
platform: "ios",
size: 1024,
scales: [1],
},
{
platform: "ios",
size: [1024, 768],
scales: [1],
},
@@ -148,15 +147,16 @@ export async function generateImessageIconsAsync(
// Save a reference to the generated image so we don't create a duplicate.
generatedIcons[filename] = true;
}
imagesJson.push({
idiom: platform.idiom as ContentsJsonImageIdiom,
size: `${width}x${height}`,
// @ts-ignore: template types not supported in TS yet
scale: `${scale}x`,
const imgJson: ContentsJsonImage = {
filename,
});
idiom: platform.idiom as ContentsJsonImageIdiom,
scale: `${scale}x`,
size: `${width}x${height}`,
};
// This order closely matches Xcode formatting.
imagesJson.push(imgJson);
if (rest.platform) {
imagesJson[imagesJson.length - 1].platform = rest.platform;
imgJson.platform = rest.platform;
}
}
}
@@ -3,7 +3,7 @@ import { generateImageAsync } from "@expo/image-utils";
import fs from "fs";
import path from "path";
import { generateImessageIconsAsync } from "./withStickerIcon";
import { generateImessageIconsAsync } from "./generateImessageIconsAsync";
import { getProjectStickersName } from "./withStickerXcodeTarget";
const STICKERS_ROOT_PATH = "Stickers.xcassets";
@@ -136,7 +136,7 @@ export const withStickerAssets: ConfigPlugin<{
fs.writeFileSync(
iMessageAppIconContentsJsonPath,
JSON.stringify(
{ info: defaultInfo, images: imessageIconContents },
{ images: imessageIconContents, info: defaultInfo },
null,
2
)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-adjust",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure Adjust SDK on prebuild",
"main": "build/withReactNativeAdjust.js",
"types": "build/withReactNativeAdjust.d.ts",
@@ -1,3 +1,19 @@
## @config-plugins/react-native-ble-plx [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-27)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/react-native-ble-plx [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-09)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-ble-plx",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure react-native-ble-plx on prebuild",
"main": "build/withBLE.js",
"types": "build/withBLE.d.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-blob-util",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure react-native-blob-util on prebuild",
"main": "build/withReactNativeBlobUtil.js",
"types": "build/withReactNativeBlobUtil.d.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-branch",
"version": "1.0.2",
"version": "2.0.0",
"description": "Config plugin to auto configure react-native-branch on prebuild",
"author": "650 Industries, Inc.",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-callkeep",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure callkeep on prebuild",
"main": "build/withCallkeep.js",
"types": "build/withCallkeep.d.ts",
@@ -1,3 +1,19 @@
## @config-plugins/react-native-dynamic-app-icon [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-14)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/react-native-dynamic-app-icon [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-12)
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-dynamic-app-icon",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure react-native-dynamic-app-icon",
"main": "build/index.js",
"types": "build/index.d.ts",
@@ -1,3 +1,19 @@
## @config-plugins/react-native-google-cast [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/react-native-google-cast [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-23)
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-google-cast",
"version": "1.0.3",
"version": "2.0.0",
"description": "Config plugin to auto configure Google Cast on prebuild",
"main": "build/withGoogleCast.js",
"types": "build/withGoogleCast.d.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-pdf",
"version": "1.0.2",
"version": "2.0.0",
"description": "Config plugin to auto configure react-native-pdf on prebuild",
"main": "build/withPdf.js",
"types": "build/withPdf.d.ts",
@@ -1,3 +1,19 @@
## @config-plugins/react-native-quick-actions [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-13)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/react-native-quick-actions [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-quick-actions",
"version": "1.0.2",
"version": "2.0.0",
"description": "Config plugin for react-native-quick-actions package",
"main": "build/withReactNativeQuickActions.js",
"types": "build/withReactNativeQuickActions.d.ts",
@@ -0,0 +1,2 @@
// @generated by expo-module-scripts
module.exports = require('expo-module-scripts/eslintrc.base.js');
@@ -0,0 +1,49 @@
# @config-plugins/react-native-siri-shortcut
Expo Config Plugin to auto configure [`react-native-siri-shortcut`](https://www.npmjs.com/package/react-native-siri-shortcut) when the native code is generated (`expo prebuild`).
## Expo installation
> Tested against Expo SDK 42
This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
- First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
```sh
expo install react-native-siri-shortcut @config-plugins/react-native-siri-shortcut
```
After installing this npm package, add the [config plugin](https://docs.expo.io/guides/config-plugins/) to the [`plugins`](https://docs.expo.io/versions/latest/config/app/#plugins) array of your `app.json` or `app.config.js`:
```json
{
"expo": {
"plugins": ["@config-plugins/react-native-siri-shortcut"]
}
}
```
Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
## API
When working with Siri Shorcuts, you need to defined their identifiers on the Xcode project. To achieve the same result using this plugin, just pass an array of strings with the identifiers of your shortcuts, and they will be added automatically during the build cycle:
#### Example
```json
{
"expo": {
"plugins": [
[
"@config-plugins/react-native-siri-shortcut",
[
"com.example.InitiateWorkout",
"com.example.FinishWorkout",
],
]
]
}
}
```
@@ -0,0 +1 @@
module.exports = require("./build/withReactNativeSiriShortcut");
@@ -0,0 +1 @@
module.exports = require('expo-module-scripts/jest-preset-plugin');
@@ -0,0 +1,40 @@
{
"name": "@config-plugins/react-native-siri-shortcut",
"version": "0.0.0",
"description": "Config plugin for react-native-siri-shortcut package",
"main": "build/withReactNativeSiriShortcut.js",
"types": "build/withReactNativeSiriShortcut.d.ts",
"sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/react-native-siri-shortcut"
},
"scripts": {
"build": "expo-module build",
"clean": "expo-module clean",
"lint": "expo-module lint",
"test": "expo-module test",
"prepare": "expo-module prepare",
"prepublishOnly": "expo-module prepublishOnly",
"expo-module": "expo-module"
},
"keywords": [
"react",
"expo",
"config-plugins",
"prebuild",
"react-native-siri-shortcut",
"expo-42"
],
"jest": {
"preset": "expo-module-scripts"
},
"dependencies": {
"@expo/config-plugins": "^4.1.0"
},
"devDependencies": {
"expo-module-scripts": "^2.0.0"
},
"upstreamPackage": "react-native-siri-shortcut"
}
@@ -0,0 +1,306 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`addSiriShortcutAppDelegateImport adds import to Expo Modules AppDelegate 1`] = `
"
#import \\"AppDelegate.h\\"
// @generated begin react-native-siri-shortcut - expo prebuild (DO NOT MODIFY) sync-34828decdfd158f5b96fe11a1e590a684e296e0e
#import <RNSiriShortcuts/RNSiriShortcuts.h>
// @generated end react-native-siri-shortcut
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTLinkingManager.h>
#import <React/RCTConvert.h>
#import <React/RCTAppSetupUtils.h>
#if RCT_NEW_ARCH_ENABLED
#import <React/CoreModulesPlugins.h>
#import <React/RCTCxxBridgeDelegate.h>
#import <React/RCTFabricSurfaceHostingProxyRootView.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterBridgeAdapter.h>
#import <ReactCommon/RCTTurboModuleManager.h>
#import <react/config/ReactNativeConfig.h>
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
RCTTurboModuleManager *_turboModuleManager;
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
facebook::react::ContextContainer::Shared _contextContainer;
}
@end
#endif
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RCTAppSetupPrepareApp(application);
RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
#if RCT_NEW_ARCH_ENABLED
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
_contextContainer->insert(\\"ReactNativeConfig\\", _reactNativeConfig);
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
#endif
UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@\\"main\\" initialProperties:nil];
rootView.backgroundColor = [UIColor whiteColor];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [self.reactDelegate createRootViewController];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
[super application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
// If you'd like to export some custom RCTBridgeModules, add them here!
return @[];
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\\"index\\"];
#else
return [[NSBundle mainBundle] URLForResource:@\\"main\\" withExtension:@\\"jsbundle\\"];
#endif
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
}
// Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
#if RCT_NEW_ARCH_ENABLED
#pragma mark - RCTCxxBridgeDelegate
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
}
#pragma mark RCTTurboModuleManagerDelegate
- (Class)getModuleClassFromName:(const char *)name
{
return RCTCoreModulesClassProvider(name);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return nullptr;
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
initParams:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
return nullptr;
}
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
{
return RCTAppSetupDefaultModuleFromClass(moduleClass);
}
#endif
@end
"
`;
exports[`addSiriShortcutAppDelegateInit adds init to Expo Modules AppDelegate 1`] = `
"
#import \\"AppDelegate.h\\"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTLinkingManager.h>
#import <React/RCTConvert.h>
#import <React/RCTAppSetupUtils.h>
#if RCT_NEW_ARCH_ENABLED
#import <React/CoreModulesPlugins.h>
#import <React/RCTCxxBridgeDelegate.h>
#import <React/RCTFabricSurfaceHostingProxyRootView.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterBridgeAdapter.h>
#import <ReactCommon/RCTTurboModuleManager.h>
#import <react/config/ReactNativeConfig.h>
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
RCTTurboModuleManager *_turboModuleManager;
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
facebook::react::ContextContainer::Shared _contextContainer;
}
@end
#endif
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RCTAppSetupPrepareApp(application);
RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
#if RCT_NEW_ARCH_ENABLED
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
_contextContainer->insert(\\"ReactNativeConfig\\", _reactNativeConfig);
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
#endif
UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@\\"main\\" initialProperties:nil];
rootView.backgroundColor = [UIColor whiteColor];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [self.reactDelegate createRootViewController];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
[super application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
// If you'd like to export some custom RCTBridgeModules, add them here!
return @[];
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\\"index\\"];
#else
return [[NSBundle mainBundle] URLForResource:@\\"main\\" withExtension:@\\"jsbundle\\"];
#endif
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
}
// Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// @generated begin react-native-siri-shortcut-delegate - expo prebuild (DO NOT MODIFY) sync-291450a04ff243636b0bd0aef4a614f7218690b5
BOOL shortcutResult = [RNSSSiriShortcuts application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
if (shortcutResult) {
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || shortcutResult;
}
// @generated end react-native-siri-shortcut-delegate
BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
#if RCT_NEW_ARCH_ENABLED
#pragma mark - RCTCxxBridgeDelegate
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
}
#pragma mark RCTTurboModuleManagerDelegate
- (Class)getModuleClassFromName:(const char *)name
{
return RCTCoreModulesClassProvider(name);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return nullptr;
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
initParams:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
return nullptr;
}
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
{
return RCTAppSetupDefaultModuleFromClass(moduleClass);
}
#endif
@end
"
`;
@@ -0,0 +1,146 @@
// SDK +45: https://github.com/expo/expo/blob/sdk-45/templates/expo-template-bare-minimum/ios/HelloWorld/AppDelegate.m
export const ExpoModulesAppDelegate = `
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTLinkingManager.h>
#import <React/RCTConvert.h>
#import <React/RCTAppSetupUtils.h>
#if RCT_NEW_ARCH_ENABLED
#import <React/CoreModulesPlugins.h>
#import <React/RCTCxxBridgeDelegate.h>
#import <React/RCTFabricSurfaceHostingProxyRootView.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterBridgeAdapter.h>
#import <ReactCommon/RCTTurboModuleManager.h>
#import <react/config/ReactNativeConfig.h>
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
RCTTurboModuleManager *_turboModuleManager;
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
facebook::react::ContextContainer::Shared _contextContainer;
}
@end
#endif
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RCTAppSetupPrepareApp(application);
RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
#if RCT_NEW_ARCH_ENABLED
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
#endif
UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:nil];
rootView.backgroundColor = [UIColor whiteColor];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [self.reactDelegate createRootViewController];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
[super application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
// If you'd like to export some custom RCTBridgeModules, add them here!
return @[];
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
}
// Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
#if RCT_NEW_ARCH_ENABLED
#pragma mark - RCTCxxBridgeDelegate
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
}
#pragma mark RCTTurboModuleManagerDelegate
- (Class)getModuleClassFromName:(const char *)name
{
return RCTCoreModulesClassProvider(name);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return nullptr;
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
initParams:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
return nullptr;
}
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
{
return RCTAppSetupDefaultModuleFromClass(moduleClass);
}
#endif
@end
`;
@@ -0,0 +1,42 @@
import {
addSiriShortcutAppDelegateImport,
addSiriShortcutAppDelegateInit,
} from "../withReactNativeSiriShortcut";
import { ExpoModulesAppDelegate } from "./fixtures/AppDelegate";
describe(addSiriShortcutAppDelegateImport, () => {
it(`adds import to Expo Modules AppDelegate`, () => {
const results = addSiriShortcutAppDelegateImport(ExpoModulesAppDelegate);
// matches a static snapshot
expect(results.contents).toMatchSnapshot();
expect(results.contents).toMatch(/react-native-siri-shortcut/);
expect(results.contents).toMatch(/RNSiriShortcuts\/RNSiriShortcuts\.h/);
// did add new content
expect(results.didMerge).toBe(true);
// didn't remove old content
expect(results.didClear).toBe(false);
});
it(`fails to add to a malformed app delegate`, () => {
expect(() => addSiriShortcutAppDelegateImport(`foobar`)).toThrow(/foobar/);
});
});
describe(addSiriShortcutAppDelegateInit, () => {
it(`adds init to Expo Modules AppDelegate`, () => {
const results = addSiriShortcutAppDelegateInit(ExpoModulesAppDelegate);
// matches a static snapshot
expect(results.contents).toMatchSnapshot();
expect(results.contents).toMatch(/react-native-siri-shortcut-delegate/);
expect(results.contents).toMatch(
/RNSSSiriShortcuts application:application/
);
// did add new content
expect(results.didMerge).toBe(true);
// didn't remove old content
expect(results.didClear).toBe(false);
});
it(`fails to add to a malformed app delegate`, () => {
expect(() => addSiriShortcutAppDelegateInit(`foobar`)).toThrow(/foobar/);
});
});
@@ -0,0 +1,119 @@
import {
ConfigPlugin,
createRunOncePlugin,
withAppDelegate,
withInfoPlist,
withEntitlementsPlist,
} from "@expo/config-plugins";
import {
mergeContents,
MergeResults,
} from "@expo/config-plugins/build/utils/generateCode";
/**
* Apply react-native-siri-shortcut configuration for Expo SDK 44 projects.
*/
const withReactNativeSiriShortcut: ConfigPlugin<void | string[]> = (
config,
activityTypes
) => {
withSiriShortcutAppDelegate(config);
withSiriEntitlements(config);
const items = activityTypes || [];
if (!Array.isArray(items) || !items.length) {
return config;
}
return withReactNativeSiriShortcutInfoPlist(config, items);
};
const withReactNativeSiriShortcutInfoPlist: ConfigPlugin<string[]> = (
config,
activityTypes
) => {
return withInfoPlist(config, (config) => {
config.modResults.NSUserActivityTypes = activityTypes;
return config;
});
};
export function addSiriShortcutAppDelegateImport(src: string): MergeResults {
return mergeContents({
tag: "react-native-siri-shortcut",
src,
newSrc: "#import <RNSiriShortcuts/RNSiriShortcuts.h>",
anchor: /#import "AppDelegate\.h"/,
offset: 1,
comment: "//",
});
}
export function addSiriShortcutAppDelegateInit(src: string): MergeResults {
return mergeContents({
tag: "react-native-siri-shortcut-delegate",
src,
newSrc: [
" BOOL shortcutResult = [RNSSSiriShortcuts application:application continueUserActivity:userActivity restorationHandler:restorationHandler];",
" if (shortcutResult) {",
" return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || shortcutResult;",
" }",
].join("\n"),
anchor:
/ return \[super application:application continueUserActivity:userActivity restorationHandler:restorationHandler\] \|\| result;/,
offset: -1,
comment: "//",
});
}
/** Append the siri entitlement on iOS */
const withSiriEntitlements: ConfigPlugin = (config) => {
return withEntitlementsPlist(config, (config) => {
config.modResults["com.apple.developer.siri"] = true;
return config;
});
};
const withSiriShortcutAppDelegate: ConfigPlugin = (config) => {
return withAppDelegate(config, (config) => {
if (["objc", "objcpp"].includes(config.modResults.language)) {
try {
config.modResults.contents = addSiriShortcutAppDelegateImport(
config.modResults.contents
).contents;
config.modResults.contents = addSiriShortcutAppDelegateInit(
config.modResults.contents
).contents;
} catch (error: any) {
if (error.code === "ERR_NO_MATCH") {
throw new Error(
`Cannot add Siri Shortcut to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`
);
}
throw error;
}
} else {
throw new Error(
"Cannot setup Siri Shortcut because the AppDelegate is not Objective C"
);
}
return config;
});
};
const pkg = {
// Prevent this plugin from being run more than once.
// This pattern enables users to safely migrate off of this
// out-of-tree `@config-plugins/react-native-siri-shortcut` to a future
// upstream plugin in `react-native-siri-shortcut`
name: "react-native-siri-shortcut",
// Indicates that this plugin is dangerously linked to a module,
// and might not work with the latest version of that module.
version: "UNVERSIONED",
};
export default createRunOncePlugin(
withReactNativeSiriShortcut,
pkg.name,
pkg.version
);
@@ -0,0 +1,8 @@
{
"extends": "expo-module-scripts/tsconfig.plugin",
"compilerOptions": {
"outDir": "./build"
},
"include": ["./src"],
"exclude": ["**/__mocks__/*", "**/__tests__/*"]
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-webrtc",
"version": "2.1.1",
"version": "3.0.0",
"description": "Config plugin to setup react-native-webrtc on prebuild",
"main": "build/withWebRTC.js",
"types": "build/withWebRTC.d.ts",
+24 -1
View File
@@ -1402,7 +1402,7 @@
node-forge "^1.2.1"
nullthrows "^1.1.1"
"@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/config-plugins@^4.0.14", "@expo/config-plugins@~4.1.4":
"@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/config-plugins@^4.0.14", "@expo/config-plugins@^4.1.0", "@expo/config-plugins@~4.1.4":
version "4.1.4"
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.4.tgz#08e1a6314dc0f96cd165a748b5997b5ec75a84d0"
integrity sha512-fkOjXnSieQfVSWVLKhst0DnCAyeHksvWky1CldFCQllhDB1HHBiP09Z8pamVB783n3qr/1HNZiSp6k2iUcaSoA==
@@ -9060,6 +9060,11 @@ fast-diff@^1.1.2:
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
[email protected]:
version "0.0.2"
resolved "https://registry.yarnpkg.com/fast-extend/-/fast-extend-0.0.2.tgz#f5ec42cf40b9460f521a6387dfb52deeed671dbd"
integrity sha1-9exCz0C5Rg9SGmOH37Ut7u1nHb0=
fast-glob@^2.2.6:
version "2.2.7"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
@@ -9532,6 +9537,11 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0:
dependencies:
minipass "^3.0.0"
fs-monkey@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-0.3.3.tgz#7960bb2b1fa2653731b9d0e2e84812a7e8b3664a"
integrity sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw==
fs-readdir-recursive@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
@@ -13566,6 +13576,14 @@ [email protected]:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
memfs@^2.15.5:
version "2.17.1"
resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.17.1.tgz#bfcc11b6308214b4fb33eaca101132722d22e103"
integrity sha512-4kAcqibPAd8DN8/UIW/6OwvbhNq6MqwsQ0pxjo+2ZmxPlQAbn9TAepnRpdeYfw4Qq0Y+QqwE6wngLUowo2fcjg==
dependencies:
fast-extend "0.0.2"
fs-monkey "^0.3.3"
memory-cache@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a"
@@ -16923,6 +16941,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.2.4.tgz#4df42819759c4d3c74252c8678c2772cfa2271a6"
integrity sha512-OOX+W2G4YYufvryonn6Kw6YnyT8ZThkxPHZBD04NLHaZmicUaaDVII/PZ3M5fD1o5N62+T+8K4bCS5Un2ggvkA==
react-native-siri-shortcut@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/react-native-siri-shortcut/-/react-native-siri-shortcut-3.1.0.tgz#920adf41eb6c72c93ef8571259c8d35358e50e71"
integrity sha512-MM0f7HS3ADU2gUh0Q6n935uhdfA3KgjpN8hEEhf2RSf4azcRNh8zNMwZD08pGSrP9/JYj1kYndQ0oytpwPyk/A==
[email protected]:
version "0.17.7"
resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.17.7.tgz#038899dbc94467a0ca0be214b88a30e0c117b176"