mirror of
https://github.com/expo/config-plugins.git
synced 2026-11-13 20:28:07 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3c6210ffc | ||
|
|
d3df63fbb2 | ||
|
|
057c6bd978 | ||
|
|
3fbc237fd6 | ||
|
|
6603ab3215 | ||
|
|
9f49f02401 | ||
|
|
14dc560092 | ||
|
|
2dcaff6772 | ||
|
|
68190997b6 | ||
|
|
74f55fc342 | ||
|
|
e32378e8ed | ||
|
|
764a04710b | ||
|
|
837602af36 |
No files matched your search
@@ -23,11 +23,14 @@ Here is a list of known packages that have a built-in Config Plugin.
|
|||||||
- [@stripe/stripe-react-native](https://www.npmjs.com/package/@stripe/stripe-react-native)
|
- [@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-voice/voice](https://www.npmjs.com/package/@react-native-voice/voice)
|
||||||
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
|
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
|
||||||
- [@viro-community/react-viro](https://github.com/virocommunity/viro)
|
- [@viro-community/react-viro](https://github.com/virocommunity/viro) -- [Guide](https://viro-community.readme.io/docs/integrating-with-expo)
|
||||||
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
|
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
|
||||||
- [react-native-spotlight-search](https://www.npmjs.com/package/react-native-spotlight-search)
|
- [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)
|
- [newrelic-react-native-agent](https://www.npmjs.com/package/newrelic-react-native-agent)
|
||||||
- [react-native-videoeditorsdk](https://www.npmjs.com/package/react-native-videoeditorsdk)
|
- [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
|
### Complementary
|
||||||
|
|
||||||
@@ -39,9 +42,20 @@ More out-of-tree plugins which can be used to configure more packages.
|
|||||||
- [config-plugin-react-native-intercom](https://www.npmjs.com/package/config-plugin-react-native-intercom) (for use with `intercom-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`)
|
- [@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`)
|
- [@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`)
|
||||||
- [with-notifee](https://www.npmjs.com/package/with-notifee) (for use with [notifee](https://notifee.app/))
|
|
||||||
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
|
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
|
||||||
|
|
||||||
|
### No Plugin Required
|
||||||
|
|
||||||
|
Just install and rebuild! If a package doesn't require any futher setup then it most likely doesn't need an Expo config plugin. Most packages work without a config plugin (including packages not listed below):
|
||||||
|
|
||||||
|
- [react-native-share](https://github.com/react-native-share/react-native-share)
|
||||||
|
- [@react-native-menu/menu](https://github.com/react-native-menu/menu)
|
||||||
|
- [react-native-blurhash](https://github.com/mrousavy/react-native-blurhash)
|
||||||
|
- [react-native-app-shortcuts](https://github.com/lokyoung/react-native-app-shortcuts)
|
||||||
|
- [react-native-multiple-image-picker](https://github.com/baronha/react-native-multiple-image-picker)
|
||||||
|
- [`@shopify/flash-list`](https://github.com/Shopify/flash-list)
|
||||||
|
|
||||||
|
> Feel free to [open a PR](https://github.com/expo/config-plugins/edit/main/README.md) with missing packages.
|
||||||
|
|
||||||
## Contributing!
|
## Contributing!
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
### @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)
|
### @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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@config-plugins/ios-stickers",
|
"name": "@config-plugins/ios-stickers",
|
||||||
"version": "2.0.1",
|
"version": "2.0.2",
|
||||||
"description": "Config plugin to auto configure iOS iMessage stickers",
|
"description": "Config plugin to auto configure iOS iMessage stickers",
|
||||||
"main": "build/withStickerPack.js",
|
"main": "build/withStickerPack.js",
|
||||||
"types": "build/withStickerPack.d.ts",
|
"types": "build/withStickerPack.d.ts",
|
||||||
@@ -34,6 +34,6 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expo-module-scripts": "^2.0.0",
|
"expo-module-scripts": "^2.0.0",
|
||||||
"memfs": "^2.15.5"
|
"memfs": "^3.4.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
|
### @config-plugins/react-native-ble-plx [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **react-native-ble-plx:** Added new Bluetooth specific permission for Android 12 (SDK 31). ([#91](https://github.com/expo/config-plugins/issues/91)) ([d3df63f](https://github.com/expo/config-plugins/commit/d3df63fbb2344251b9b371959de3ce6e4b9ab0cd))
|
||||||
|
|
||||||
## @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)
|
## @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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ Next, rebuild your app as described in the ["Adding custom native code"](https:/
|
|||||||
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
|
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
|
||||||
|
|
||||||
- `isBackgroundEnabled` (_boolean_): Enable background BLE support on Android. Adds `<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>` to the `AndroidManifest.xml`. Default `false`.
|
- `isBackgroundEnabled` (_boolean_): Enable background BLE support on Android. Adds `<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>` to the `AndroidManifest.xml`. Default `false`.
|
||||||
|
- `neverForLocation` (_boolean_): Set to true only if you can strongly assert that your app never derives physical location from Bluetooth scan results. The location permission will be still required on older Android devices. Note, that some BLE beacons are filtered from the scan results. Android SDK 31+. Default `false`. *WARNING: This parameter is experimental and BLE might not work. Make sure to test before releasing to production.*
|
||||||
- `modes` (_string[]_): Adds iOS `UIBackgroundModes` to the `Info.plist`. Options are: `peripheral`, and `central`. Defaults to undefined.
|
- `modes` (_string[]_): Adds iOS `UIBackgroundModes` to the `Info.plist`. Options are: `peripheral`, and `central`. Defaults to undefined.
|
||||||
- `bluetoothAlwaysPermission` (_string | false_): Sets the iOS `NSBluetoothAlwaysUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
|
- `bluetoothAlwaysPermission` (_string | false_): Sets the iOS `NSBluetoothAlwaysUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
|
||||||
- `bluetoothPeripheralPermission` (_string | false_): Sets the iOS `NSBluetoothPeripheralUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
|
- `bluetoothPeripheralPermission` (_string | false_): Sets the iOS `NSBluetoothPeripheralUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
|
||||||
|
|||||||
+1
@@ -3,6 +3,7 @@ import { BackgroundMode } from "./withBLEBackgroundModes";
|
|||||||
export { BackgroundMode };
|
export { BackgroundMode };
|
||||||
declare const _default: ConfigPlugin<void | {
|
declare const _default: ConfigPlugin<void | {
|
||||||
isBackgroundEnabled?: boolean | undefined;
|
isBackgroundEnabled?: boolean | undefined;
|
||||||
|
neverForLocation?: boolean | undefined;
|
||||||
modes?: BackgroundMode[] | undefined;
|
modes?: BackgroundMode[] | undefined;
|
||||||
bluetoothAlwaysPermission?: string | false | undefined;
|
bluetoothAlwaysPermission?: string | false | undefined;
|
||||||
bluetoothPeripheralPermission?: string | false | undefined;
|
bluetoothPeripheralPermission?: string | false | undefined;
|
||||||
|
|||||||
+7
-2
@@ -11,9 +11,10 @@ const pkg = { name: "react-native-ble-plx", version: "UNVERSIONED" }; //require(
|
|||||||
* Apply BLE configuration for Expo SDK 42 projects.
|
* Apply BLE configuration for Expo SDK 42 projects.
|
||||||
*/
|
*/
|
||||||
const withBLE = (config, props = {}) => {
|
const withBLE = (config, props = {}) => {
|
||||||
var _a;
|
var _a, _b;
|
||||||
const _props = props || {};
|
const _props = props || {};
|
||||||
const isBackgroundEnabled = (_a = _props.isBackgroundEnabled) !== null && _a !== void 0 ? _a : false;
|
const isBackgroundEnabled = (_a = _props.isBackgroundEnabled) !== null && _a !== void 0 ? _a : false;
|
||||||
|
const neverForLocation = (_b = _props.neverForLocation) !== null && _b !== void 0 ? _b : false;
|
||||||
// iOS
|
// iOS
|
||||||
config = withBluetoothPermissions_1.withBluetoothPermissions(config, _props);
|
config = withBluetoothPermissions_1.withBluetoothPermissions(config, _props);
|
||||||
config = withBLEBackgroundModes_1.withBLEBackgroundModes(config, _props.modes || []);
|
config = withBLEBackgroundModes_1.withBLEBackgroundModes(config, _props.modes || []);
|
||||||
@@ -21,8 +22,12 @@ const withBLE = (config, props = {}) => {
|
|||||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||||
"android.permission.BLUETOOTH",
|
"android.permission.BLUETOOTH",
|
||||||
"android.permission.BLUETOOTH_ADMIN",
|
"android.permission.BLUETOOTH_ADMIN",
|
||||||
|
"android.permission.BLUETOOTH_CONNECT", // since Android SDK 31
|
||||||
]);
|
]);
|
||||||
config = withBLEAndroidManifest_1.withBLEAndroidManifest(config, { isBackgroundEnabled });
|
config = withBLEAndroidManifest_1.withBLEAndroidManifest(config, {
|
||||||
|
isBackgroundEnabled,
|
||||||
|
neverForLocation,
|
||||||
|
});
|
||||||
return config;
|
return config;
|
||||||
};
|
};
|
||||||
exports.default = config_plugins_1.createRunOncePlugin(withBLE, pkg.name, pkg.version);
|
exports.default = config_plugins_1.createRunOncePlugin(withBLE, pkg.name, pkg.version);
|
||||||
+21
-3
@@ -1,17 +1,35 @@
|
|||||||
import { ConfigPlugin, AndroidConfig } from "@expo/config-plugins";
|
import { ConfigPlugin, AndroidConfig } from "@expo/config-plugins";
|
||||||
declare type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"];
|
declare type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"];
|
||||||
declare type ManifestPermission = InnerManifest["permission"];
|
declare type ManifestPermission = InnerManifest["permission"];
|
||||||
|
declare type ExtraTools = {
|
||||||
|
"tools:targetApi"?: string;
|
||||||
|
};
|
||||||
|
declare type ManifestUsesPermissionWithExtraTools = {
|
||||||
|
$: AndroidConfig.Manifest.ManifestUsesPermission["$"] & ExtraTools;
|
||||||
|
};
|
||||||
declare type AndroidManifest = {
|
declare type AndroidManifest = {
|
||||||
manifest: InnerManifest & {
|
manifest: InnerManifest & {
|
||||||
permission?: ManifestPermission;
|
permission?: ManifestPermission;
|
||||||
"uses-permission"?: InnerManifest["uses-permission"];
|
"uses-permission"?: ManifestUsesPermissionWithExtraTools[];
|
||||||
"uses-permission-sdk-23"?: InnerManifest["uses-permission"];
|
"uses-permission-sdk-23"?: ManifestUsesPermissionWithExtraTools[];
|
||||||
"uses-feature"?: InnerManifest["uses-feature"];
|
"uses-feature"?: InnerManifest["uses-feature"];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
export declare const withBLEAndroidManifest: ConfigPlugin<{
|
export declare const withBLEAndroidManifest: ConfigPlugin<{
|
||||||
isBackgroundEnabled: boolean;
|
isBackgroundEnabled: boolean;
|
||||||
|
neverForLocation: boolean;
|
||||||
}>;
|
}>;
|
||||||
export declare function addFineControlPermissionToManifest(androidManifest: AndroidManifest): AndroidManifest;
|
/**
|
||||||
|
* Add location permissions
|
||||||
|
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
|
||||||
|
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
|
||||||
|
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
|
||||||
|
*/
|
||||||
|
export declare function addLocationPermissionToManifest(androidManifest: AndroidManifest, neverForLocationSinceSdk31: boolean): AndroidManifest;
|
||||||
|
/**
|
||||||
|
* Add 'android.permission.BLUETOOTH_SCAN'.
|
||||||
|
* Required since Android SDK 31 (Android 12).
|
||||||
|
*/
|
||||||
|
export declare function addScanPermissionToManifest(androidManifest: AndroidManifest, neverForLocation: boolean): AndroidManifest;
|
||||||
export declare function addBLEHardwareFeatureToManifest(androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
|
export declare function addBLEHardwareFeatureToManifest(androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
|
||||||
export {};
|
export {};
|
||||||
+53
-8
@@ -1,10 +1,11 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.addBLEHardwareFeatureToManifest = exports.addFineControlPermissionToManifest = exports.withBLEAndroidManifest = void 0;
|
exports.addBLEHardwareFeatureToManifest = exports.addScanPermissionToManifest = exports.addLocationPermissionToManifest = exports.withBLEAndroidManifest = void 0;
|
||||||
const config_plugins_1 = require("@expo/config-plugins");
|
const config_plugins_1 = require("@expo/config-plugins");
|
||||||
const withBLEAndroidManifest = (config, { isBackgroundEnabled }) => {
|
const withBLEAndroidManifest = (config, { isBackgroundEnabled, neverForLocation }) => {
|
||||||
return config_plugins_1.withAndroidManifest(config, (config) => {
|
return config_plugins_1.withAndroidManifest(config, (config) => {
|
||||||
config.modResults = addFineControlPermissionToManifest(config.modResults);
|
config.modResults = addLocationPermissionToManifest(config.modResults, neverForLocation);
|
||||||
|
config.modResults = addScanPermissionToManifest(config.modResults, neverForLocation);
|
||||||
if (isBackgroundEnabled) {
|
if (isBackgroundEnabled) {
|
||||||
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
|
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
|
||||||
}
|
}
|
||||||
@@ -12,22 +13,66 @@ const withBLEAndroidManifest = (config, { isBackgroundEnabled }) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
exports.withBLEAndroidManifest = withBLEAndroidManifest;
|
exports.withBLEAndroidManifest = withBLEAndroidManifest;
|
||||||
function addFineControlPermissionToManifest(androidManifest) {
|
/**
|
||||||
var _a;
|
* Add location permissions
|
||||||
// Add `<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>` to the AndroidManifest.xml
|
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
|
||||||
|
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
|
||||||
|
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
|
||||||
|
*/
|
||||||
|
function addLocationPermissionToManifest(androidManifest, neverForLocationSinceSdk31) {
|
||||||
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
|
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
|
||||||
androidManifest.manifest["uses-permission-sdk-23"] = [];
|
androidManifest.manifest["uses-permission-sdk-23"] = [];
|
||||||
}
|
}
|
||||||
|
const optMaxSdkVersion = neverForLocationSinceSdk31
|
||||||
|
? {
|
||||||
|
"android:maxSdkVersion": "30",
|
||||||
|
}
|
||||||
|
: {};
|
||||||
|
if (!androidManifest.manifest["uses-permission-sdk-23"].find((item) => item.$["android:name"] === "android.permission.ACCESS_COARSE_LOCATION")) {
|
||||||
|
androidManifest.manifest["uses-permission-sdk-23"].push({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
|
||||||
|
...optMaxSdkVersion,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!androidManifest.manifest["uses-permission-sdk-23"].find((item) => item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION")) {
|
if (!androidManifest.manifest["uses-permission-sdk-23"].find((item) => item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION")) {
|
||||||
(_a = androidManifest.manifest["uses-permission-sdk-23"]) === null || _a === void 0 ? void 0 : _a.push({
|
androidManifest.manifest["uses-permission-sdk-23"].push({
|
||||||
$: {
|
$: {
|
||||||
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
||||||
|
...optMaxSdkVersion,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return androidManifest;
|
return androidManifest;
|
||||||
}
|
}
|
||||||
exports.addFineControlPermissionToManifest = addFineControlPermissionToManifest;
|
exports.addLocationPermissionToManifest = addLocationPermissionToManifest;
|
||||||
|
/**
|
||||||
|
* Add 'android.permission.BLUETOOTH_SCAN'.
|
||||||
|
* Required since Android SDK 31 (Android 12).
|
||||||
|
*/
|
||||||
|
function addScanPermissionToManifest(androidManifest, neverForLocation) {
|
||||||
|
var _a;
|
||||||
|
if (!Array.isArray(androidManifest.manifest["uses-permission"])) {
|
||||||
|
androidManifest.manifest["uses-permission"] = [];
|
||||||
|
}
|
||||||
|
if (!androidManifest.manifest["uses-permission"].find((item) => item.$["android:name"] === "android.permission.BLUETOOTH_SCAN")) {
|
||||||
|
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
|
||||||
|
(_a = androidManifest.manifest["uses-permission"]) === null || _a === void 0 ? void 0 : _a.push({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.BLUETOOTH_SCAN",
|
||||||
|
...(neverForLocation
|
||||||
|
? {
|
||||||
|
"android:usesPermissionFlags": "neverForLocation",
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
|
"tools:targetApi": "31",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return androidManifest;
|
||||||
|
}
|
||||||
|
exports.addScanPermissionToManifest = addScanPermissionToManifest;
|
||||||
// Add this line if your application always requires BLE. More info can be found on: https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#permissions
|
// Add this line if your application always requires BLE. More info can be found on: https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#permissions
|
||||||
function addBLEHardwareFeatureToManifest(androidManifest) {
|
function addBLEHardwareFeatureToManifest(androidManifest) {
|
||||||
var _a;
|
var _a;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@config-plugins/react-native-ble-plx",
|
"name": "@config-plugins/react-native-ble-plx",
|
||||||
"version": "2.0.0",
|
"version": "2.0.1",
|
||||||
"description": "Config plugin to auto configure react-native-ble-plx on prebuild",
|
"description": "Config plugin to auto configure react-native-ble-plx on prebuild",
|
||||||
"main": "build/withBLE.js",
|
"main": "build/withBLE.js",
|
||||||
"types": "build/withBLE.d.ts",
|
"types": "build/withBLE.d.ts",
|
||||||
|
|||||||
@@ -2,31 +2,98 @@ import { AndroidConfig, XML } from "@expo/config-plugins";
|
|||||||
import { resolve } from "path";
|
import { resolve } from "path";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
addLocationPermissionToManifest,
|
||||||
|
addScanPermissionToManifest,
|
||||||
addBLEHardwareFeatureToManifest,
|
addBLEHardwareFeatureToManifest,
|
||||||
addFineControlPermissionToManifest,
|
|
||||||
} from "../withBLEAndroidManifest";
|
} from "../withBLEAndroidManifest";
|
||||||
|
|
||||||
const { readAndroidManifestAsync } = AndroidConfig.Manifest;
|
const { readAndroidManifestAsync } = AndroidConfig.Manifest;
|
||||||
|
|
||||||
const sampleManifestPath = resolve(__dirname, "fixtures/AndroidManifest.xml");
|
const sampleManifestPath = resolve(__dirname, "fixtures/AndroidManifest.xml");
|
||||||
|
|
||||||
describe("addFineControlPermissionToManifest", () => {
|
describe("addLocationPermissionToManifest", () => {
|
||||||
it(`adds element`, async () => {
|
it(`adds elements`, async () => {
|
||||||
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
||||||
androidManifest = await addFineControlPermissionToManifest(androidManifest);
|
androidManifest = addLocationPermissionToManifest(androidManifest, false);
|
||||||
expect(androidManifest.manifest["uses-permission-sdk-23"]).toStrictEqual([
|
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
|
||||||
{ $: { "android:name": "android.permission.ACCESS_FINE_LOCATION" } },
|
$: {
|
||||||
]);
|
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
||||||
|
},
|
||||||
|
});
|
||||||
// Sanity
|
// Sanity
|
||||||
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
|
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_COARSE_LOCATION"\/>/
|
||||||
|
);
|
||||||
expect(XML.format(androidManifest)).toMatch(
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION"\/>/
|
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION"\/>/
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it(`adds elements with SDK limit`, async () => {
|
||||||
|
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
||||||
|
androidManifest = addLocationPermissionToManifest(androidManifest, true);
|
||||||
|
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
|
||||||
|
"android:maxSdkVersion": "30",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
||||||
|
"android:maxSdkVersion": "30",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// Sanity
|
||||||
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
|
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30"\/>/
|
||||||
|
);
|
||||||
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
|
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"\/>/
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("addScanPermissionToManifest", () => {
|
||||||
|
it(`adds element`, async () => {
|
||||||
|
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
||||||
|
androidManifest = addScanPermissionToManifest(androidManifest, false);
|
||||||
|
expect(androidManifest.manifest["uses-permission"]).toContainEqual({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.BLUETOOTH_SCAN",
|
||||||
|
"tools:targetApi": "31",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// Sanity
|
||||||
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
|
/<uses-permission android:name="android\.permission\.BLUETOOTH_SCAN" tools:targetApi="31"\/>/
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it(`adds element with 'neverForLocation' attribute`, async () => {
|
||||||
|
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
||||||
|
androidManifest = addScanPermissionToManifest(androidManifest, true);
|
||||||
|
expect(androidManifest.manifest["uses-permission"]).toContainEqual({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.BLUETOOTH_SCAN",
|
||||||
|
"android:usesPermissionFlags": "neverForLocation",
|
||||||
|
"tools:targetApi": "31",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// Sanity
|
||||||
|
expect(XML.format(androidManifest)).toMatch(
|
||||||
|
/<uses-permission android:name="android\.permission\.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" tools:targetApi="31"\/>/
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("addBLEHardwareFeatureToManifest", () => {
|
describe("addBLEHardwareFeatureToManifest", () => {
|
||||||
it(`adds element`, async () => {
|
it(`adds element`, async () => {
|
||||||
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
|
||||||
androidManifest = await addBLEHardwareFeatureToManifest(androidManifest);
|
androidManifest = addBLEHardwareFeatureToManifest(androidManifest);
|
||||||
|
|
||||||
expect(androidManifest.manifest["uses-feature"]).toStrictEqual([
|
expect(androidManifest.manifest["uses-feature"]).toStrictEqual([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,12 +18,14 @@ const pkg = { name: "react-native-ble-plx", version: "UNVERSIONED" }; //require(
|
|||||||
*/
|
*/
|
||||||
const withBLE: ConfigPlugin<{
|
const withBLE: ConfigPlugin<{
|
||||||
isBackgroundEnabled?: boolean;
|
isBackgroundEnabled?: boolean;
|
||||||
|
neverForLocation?: boolean;
|
||||||
modes?: BackgroundMode[];
|
modes?: BackgroundMode[];
|
||||||
bluetoothAlwaysPermission?: string | false;
|
bluetoothAlwaysPermission?: string | false;
|
||||||
bluetoothPeripheralPermission?: string | false;
|
bluetoothPeripheralPermission?: string | false;
|
||||||
} | void> = (config, props = {}) => {
|
} | void> = (config, props = {}) => {
|
||||||
const _props = props || {};
|
const _props = props || {};
|
||||||
const isBackgroundEnabled = _props.isBackgroundEnabled ?? false;
|
const isBackgroundEnabled = _props.isBackgroundEnabled ?? false;
|
||||||
|
const neverForLocation = _props.neverForLocation ?? false;
|
||||||
|
|
||||||
// iOS
|
// iOS
|
||||||
config = withBluetoothPermissions(config, _props);
|
config = withBluetoothPermissions(config, _props);
|
||||||
@@ -33,8 +35,12 @@ const withBLE: ConfigPlugin<{
|
|||||||
config = AndroidConfig.Permissions.withPermissions(config, [
|
config = AndroidConfig.Permissions.withPermissions(config, [
|
||||||
"android.permission.BLUETOOTH",
|
"android.permission.BLUETOOTH",
|
||||||
"android.permission.BLUETOOTH_ADMIN",
|
"android.permission.BLUETOOTH_ADMIN",
|
||||||
|
"android.permission.BLUETOOTH_CONNECT", // since Android SDK 31
|
||||||
]);
|
]);
|
||||||
config = withBLEAndroidManifest(config, { isBackgroundEnabled });
|
config = withBLEAndroidManifest(config, {
|
||||||
|
isBackgroundEnabled,
|
||||||
|
neverForLocation,
|
||||||
|
});
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,20 +8,38 @@ type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"];
|
|||||||
|
|
||||||
type ManifestPermission = InnerManifest["permission"];
|
type ManifestPermission = InnerManifest["permission"];
|
||||||
|
|
||||||
|
// TODO: add to `AndroidManifestAttributes` in @expo/config-plugins
|
||||||
|
type ExtraTools = {
|
||||||
|
// https://developer.android.com/studio/write/tool-attributes#toolstargetapi
|
||||||
|
"tools:targetApi"?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ManifestUsesPermissionWithExtraTools = {
|
||||||
|
$: AndroidConfig.Manifest.ManifestUsesPermission["$"] & ExtraTools;
|
||||||
|
};
|
||||||
|
|
||||||
type AndroidManifest = {
|
type AndroidManifest = {
|
||||||
manifest: InnerManifest & {
|
manifest: InnerManifest & {
|
||||||
permission?: ManifestPermission;
|
permission?: ManifestPermission;
|
||||||
"uses-permission"?: InnerManifest["uses-permission"];
|
"uses-permission"?: ManifestUsesPermissionWithExtraTools[];
|
||||||
"uses-permission-sdk-23"?: InnerManifest["uses-permission"];
|
"uses-permission-sdk-23"?: ManifestUsesPermissionWithExtraTools[];
|
||||||
"uses-feature"?: InnerManifest["uses-feature"];
|
"uses-feature"?: InnerManifest["uses-feature"];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const withBLEAndroidManifest: ConfigPlugin<{
|
export const withBLEAndroidManifest: ConfigPlugin<{
|
||||||
isBackgroundEnabled: boolean;
|
isBackgroundEnabled: boolean;
|
||||||
}> = (config, { isBackgroundEnabled }) => {
|
neverForLocation: boolean;
|
||||||
|
}> = (config, { isBackgroundEnabled, neverForLocation }) => {
|
||||||
return withAndroidManifest(config, (config) => {
|
return withAndroidManifest(config, (config) => {
|
||||||
config.modResults = addFineControlPermissionToManifest(config.modResults);
|
config.modResults = addLocationPermissionToManifest(
|
||||||
|
config.modResults,
|
||||||
|
neverForLocation
|
||||||
|
);
|
||||||
|
config.modResults = addScanPermissionToManifest(
|
||||||
|
config.modResults,
|
||||||
|
neverForLocation
|
||||||
|
);
|
||||||
if (isBackgroundEnabled) {
|
if (isBackgroundEnabled) {
|
||||||
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
|
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
|
||||||
}
|
}
|
||||||
@@ -29,23 +47,84 @@ export const withBLEAndroidManifest: ConfigPlugin<{
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export function addFineControlPermissionToManifest(
|
/**
|
||||||
androidManifest: AndroidManifest
|
* Add location permissions
|
||||||
|
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
|
||||||
|
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
|
||||||
|
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
|
||||||
|
*/
|
||||||
|
export function addLocationPermissionToManifest(
|
||||||
|
androidManifest: AndroidManifest,
|
||||||
|
neverForLocationSinceSdk31: boolean
|
||||||
) {
|
) {
|
||||||
// Add `<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>` to the AndroidManifest.xml
|
|
||||||
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
|
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
|
||||||
androidManifest.manifest["uses-permission-sdk-23"] = [];
|
androidManifest.manifest["uses-permission-sdk-23"] = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const optMaxSdkVersion = neverForLocationSinceSdk31
|
||||||
|
? {
|
||||||
|
"android:maxSdkVersion": "30",
|
||||||
|
}
|
||||||
|
: {};
|
||||||
|
|
||||||
|
if (
|
||||||
|
!androidManifest.manifest["uses-permission-sdk-23"].find(
|
||||||
|
(item) =>
|
||||||
|
item.$["android:name"] === "android.permission.ACCESS_COARSE_LOCATION"
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
androidManifest.manifest["uses-permission-sdk-23"].push({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
|
||||||
|
...optMaxSdkVersion,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!androidManifest.manifest["uses-permission-sdk-23"].find(
|
!androidManifest.manifest["uses-permission-sdk-23"].find(
|
||||||
(item) =>
|
(item) =>
|
||||||
item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION"
|
item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION"
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
androidManifest.manifest["uses-permission-sdk-23"]?.push({
|
androidManifest.manifest["uses-permission-sdk-23"].push({
|
||||||
$: {
|
$: {
|
||||||
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
||||||
|
...optMaxSdkVersion,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return androidManifest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add 'android.permission.BLUETOOTH_SCAN'.
|
||||||
|
* Required since Android SDK 31 (Android 12).
|
||||||
|
*/
|
||||||
|
export function addScanPermissionToManifest(
|
||||||
|
androidManifest: AndroidManifest,
|
||||||
|
neverForLocation: boolean
|
||||||
|
) {
|
||||||
|
if (!Array.isArray(androidManifest.manifest["uses-permission"])) {
|
||||||
|
androidManifest.manifest["uses-permission"] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!androidManifest.manifest["uses-permission"].find(
|
||||||
|
(item) => item.$["android:name"] === "android.permission.BLUETOOTH_SCAN"
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
|
||||||
|
androidManifest.manifest["uses-permission"]?.push({
|
||||||
|
$: {
|
||||||
|
"android:name": "android.permission.BLUETOOTH_SCAN",
|
||||||
|
...(neverForLocation
|
||||||
|
? {
|
||||||
|
"android:usesPermissionFlags": "neverForLocation",
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
|
"tools:targetApi": "31",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,19 @@
|
|||||||
|
## @config-plugins/react-native-callkeep [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)
|
||||||
|
|
||||||
|
|
||||||
|
### ⚠ 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-callkeep [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
### @config-plugins/react-native-callkeep [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
## @config-plugins/react-native-siri-shortcut 1.0.0 (2022-07-12)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **siri-shortcut:** Add config plugin ([#86](https://github.com/expo/config-plugins/issues/86)) ([226b2a6](https://github.com/expo/config-plugins/commit/226b2a6412ad3fe75c98952831fab5a63254d19f))
|
||||||
|
|
||||||
|
|
||||||
|
### Other chores
|
||||||
|
|
||||||
|
* **react-native-siri-shortcut:** add tests ([#88](https://github.com/expo/config-plugins/issues/88)) ([994fadc](https://github.com/expo/config-plugins/commit/994fadc8ddf9ee858f2ccb7d544674f107f7f9ad))
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
import { ConfigPlugin } from "@expo/config-plugins";
|
||||||
|
import { MergeResults } from "@expo/config-plugins/build/utils/generateCode";
|
||||||
|
export declare function addSiriShortcutAppDelegateImport(src: string): MergeResults;
|
||||||
|
export declare function addSiriShortcutAppDelegateInit(src: string): MergeResults;
|
||||||
|
declare const _default: ConfigPlugin<void | string[]>;
|
||||||
|
export default _default;
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.addSiriShortcutAppDelegateInit = exports.addSiriShortcutAppDelegateImport = void 0;
|
||||||
|
const config_plugins_1 = require("@expo/config-plugins");
|
||||||
|
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||||
|
/**
|
||||||
|
* Apply react-native-siri-shortcut configuration for Expo SDK 44 projects.
|
||||||
|
*/
|
||||||
|
const withReactNativeSiriShortcut = (config, activityTypes) => {
|
||||||
|
withSiriShortcutAppDelegate(config);
|
||||||
|
withSiriEntitlements(config);
|
||||||
|
const items = activityTypes || [];
|
||||||
|
if (!Array.isArray(items) || !items.length) {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
return withReactNativeSiriShortcutInfoPlist(config, items);
|
||||||
|
};
|
||||||
|
const withReactNativeSiriShortcutInfoPlist = (config, activityTypes) => {
|
||||||
|
return config_plugins_1.withInfoPlist(config, (config) => {
|
||||||
|
config.modResults.NSUserActivityTypes = activityTypes;
|
||||||
|
return config;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
function addSiriShortcutAppDelegateImport(src) {
|
||||||
|
return generateCode_1.mergeContents({
|
||||||
|
tag: "react-native-siri-shortcut",
|
||||||
|
src,
|
||||||
|
newSrc: "#import <RNSiriShortcuts/RNSiriShortcuts.h>",
|
||||||
|
anchor: /#import "AppDelegate\.h"/,
|
||||||
|
offset: 1,
|
||||||
|
comment: "//",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.addSiriShortcutAppDelegateImport = addSiriShortcutAppDelegateImport;
|
||||||
|
function addSiriShortcutAppDelegateInit(src) {
|
||||||
|
return generateCode_1.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: "//",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.addSiriShortcutAppDelegateInit = addSiriShortcutAppDelegateInit;
|
||||||
|
/** Append the siri entitlement on iOS */
|
||||||
|
const withSiriEntitlements = (config) => {
|
||||||
|
return config_plugins_1.withEntitlementsPlist(config, (config) => {
|
||||||
|
config.modResults["com.apple.developer.siri"] = true;
|
||||||
|
return config;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const withSiriShortcutAppDelegate = (config) => {
|
||||||
|
return config_plugins_1.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) {
|
||||||
|
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",
|
||||||
|
};
|
||||||
|
exports.default = config_plugins_1.createRunOncePlugin(withReactNativeSiriShortcut, pkg.name, pkg.version);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@config-plugins/react-native-siri-shortcut",
|
"name": "@config-plugins/react-native-siri-shortcut",
|
||||||
"version": "0.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Config plugin for react-native-siri-shortcut package",
|
"description": "Config plugin for react-native-siri-shortcut package",
|
||||||
"main": "build/withReactNativeSiriShortcut.js",
|
"main": "build/withReactNativeSiriShortcut.js",
|
||||||
"types": "build/withReactNativeSiriShortcut.d.ts",
|
"types": "build/withReactNativeSiriShortcut.d.ts",
|
||||||
@@ -37,4 +37,4 @@
|
|||||||
"expo-module-scripts": "^2.0.0"
|
"expo-module-scripts": "^2.0.0"
|
||||||
},
|
},
|
||||||
"upstreamPackage": "react-native-siri-shortcut"
|
"upstreamPackage": "react-native-siri-shortcut"
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user