mirror of
https://github.com/expo/config-plugins.git
synced 2026-11-14 10:08:06 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
987b109e46 | ||
|
|
226b2a6412 | ||
|
|
d1a2929130 | ||
|
|
a04de8a0e0 | ||
|
|
20a4ecf8a8 | ||
|
|
9e8a90d523 | ||
|
|
9c79b293d8 | ||
|
|
77eb67c5b6 | ||
|
|
190c489b76 |
No files matched your search
@@ -6,6 +6,43 @@
|
|||||||
- All packages here are community maintained. Feel free to improve docs, packages, tests, etc.
|
- 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.
|
- 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)
|
||||||
|
|
||||||
|
### 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`)
|
||||||
|
- [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)
|
||||||
|
|
||||||
|
|
||||||
## Contributing!
|
## Contributing!
|
||||||
|
|
||||||
See the [contributing guide](/CONTRIBUTING.md).
|
See the [contributing guide](/CONTRIBUTING.md).
|
||||||
@@ -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)
|
### @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,3 +1,10 @@
|
|||||||
|
### @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)
|
## @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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ In your app.json `plugins` array:
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
- name: defaults to the iOS app name
|
- `name`: defaults to the iOS app name
|
||||||
- icon: defaults to the iOS app icon
|
- `icon`: defaults to the iOS app icon
|
||||||
- columns: number of stickers to render, defaults to `3` iirc.
|
- `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.
|
- `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;
|
||||||
|
});
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
import { fs } from 'memfs';
|
||||||
|
module.exports = fs;
|
||||||
Generated
Vendored
File renamed without changes.
+9
-8
@@ -59,11 +59,11 @@ const ICON_CONTENTS = [
|
|||||||
idiom: "ios-marketing",
|
idiom: "ios-marketing",
|
||||||
sizes: [
|
sizes: [
|
||||||
{
|
{
|
||||||
platform: "ios",
|
|
||||||
size: 1024,
|
size: 1024,
|
||||||
scales: [1],
|
scales: [1],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
platform: "ios",
|
||||||
size: [1024, 768],
|
size: [1024, 768],
|
||||||
scales: [1],
|
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.
|
// Save a reference to the generated image so we don't create a duplicate.
|
||||||
generatedIcons[filename] = true;
|
generatedIcons[filename] = true;
|
||||||
}
|
}
|
||||||
imagesJson.push({
|
const imgJson = {
|
||||||
idiom: platform.idiom,
|
|
||||||
size: `${width}x${height}`,
|
|
||||||
// @ts-ignore: template types not supported in TS yet
|
|
||||||
scale: `${scale}x`,
|
|
||||||
filename,
|
filename,
|
||||||
});
|
idiom: platform.idiom,
|
||||||
|
scale: `${scale}x`,
|
||||||
|
size: `${width}x${height}`,
|
||||||
|
};
|
||||||
|
// This order closely matches Xcode formatting.
|
||||||
|
imagesJson.push(imgJson);
|
||||||
if (rest.platform) {
|
if (rest.platform) {
|
||||||
imagesJson[imagesJson.length - 1].platform = rest.platform;
|
imgJson.platform = rest.platform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-3
@@ -8,7 +8,7 @@ const config_plugins_1 = require("@expo/config-plugins");
|
|||||||
const image_utils_1 = require("@expo/image-utils");
|
const image_utils_1 = require("@expo/image-utils");
|
||||||
const fs_1 = __importDefault(require("fs"));
|
const fs_1 = __importDefault(require("fs"));
|
||||||
const path_1 = __importDefault(require("path"));
|
const path_1 = __importDefault(require("path"));
|
||||||
const withStickerIcon_1 = require("./withStickerIcon");
|
const generateImessageIconsAsync_1 = require("./generateImessageIconsAsync");
|
||||||
const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget");
|
const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget");
|
||||||
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
||||||
const IMESSAGE_APP_ICON_PATH = "Stickers.xcassets/iMessage App Icon.stickersiconset";
|
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);
|
const iMessageAppIconsPath = path_1.default.join(stickerRootPath, IMESSAGE_APP_ICON_PATH);
|
||||||
// Only generate icons if an icon is defined
|
// Only generate icons if an icon is defined
|
||||||
const imessageIconContents = icon
|
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");
|
const iMessageAppIconContentsJsonPath = path_1.default.join(iMessageAppIconsPath, "Contents.json");
|
||||||
fs_1.default.mkdirSync(iMessageAppIconsPath, {
|
fs_1.default.mkdirSync(iMessageAppIconsPath, {
|
||||||
recursive: true,
|
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 stickerPackContentsPath = path_1.default.join(stickerRootPath, STICKER_PACK_PATH);
|
||||||
const stickersContents = {
|
const stickersContents = {
|
||||||
info: defaultInfo,
|
info: defaultInfo,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
jest.mock("@expo/image-utils");
|
||||||
|
jest.mock("fs");
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "@config-plugins/ios-stickers",
|
"name": "@config-plugins/ios-stickers",
|
||||||
"version": "2.0.0",
|
"version": "2.0.1",
|
||||||
"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",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
"files": [
|
||||||
|
"build"
|
||||||
|
],
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/expo/config-plugins.git",
|
"url": "https://github.com/expo/config-plugins.git",
|
||||||
@@ -30,6 +33,7 @@
|
|||||||
"xcode": "^3.0.1"
|
"xcode": "^3.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expo-module-scripts": "^2.0.0"
|
"expo-module-scripts": "^2.0.0",
|
||||||
|
"memfs": "^2.15.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
+9
-9
@@ -86,12 +86,11 @@ const ICON_CONTENTS: {
|
|||||||
idiom: "ios-marketing",
|
idiom: "ios-marketing",
|
||||||
sizes: [
|
sizes: [
|
||||||
{
|
{
|
||||||
platform: "ios",
|
|
||||||
|
|
||||||
size: 1024,
|
size: 1024,
|
||||||
scales: [1],
|
scales: [1],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
platform: "ios",
|
||||||
size: [1024, 768],
|
size: [1024, 768],
|
||||||
scales: [1],
|
scales: [1],
|
||||||
},
|
},
|
||||||
@@ -148,15 +147,16 @@ export async function generateImessageIconsAsync(
|
|||||||
// Save a reference to the generated image so we don't create a duplicate.
|
// Save a reference to the generated image so we don't create a duplicate.
|
||||||
generatedIcons[filename] = true;
|
generatedIcons[filename] = true;
|
||||||
}
|
}
|
||||||
imagesJson.push({
|
const imgJson: ContentsJsonImage = {
|
||||||
idiom: platform.idiom as ContentsJsonImageIdiom,
|
|
||||||
size: `${width}x${height}`,
|
|
||||||
// @ts-ignore: template types not supported in TS yet
|
|
||||||
scale: `${scale}x`,
|
|
||||||
filename,
|
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) {
|
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 fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
|
||||||
import { generateImessageIconsAsync } from "./withStickerIcon";
|
import { generateImessageIconsAsync } from "./generateImessageIconsAsync";
|
||||||
import { getProjectStickersName } from "./withStickerXcodeTarget";
|
import { getProjectStickersName } from "./withStickerXcodeTarget";
|
||||||
|
|
||||||
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
||||||
@@ -136,7 +136,7 @@ export const withStickerAssets: ConfigPlugin<{
|
|||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
iMessageAppIconContentsJsonPath,
|
iMessageAppIconContentsJsonPath,
|
||||||
JSON.stringify(
|
JSON.stringify(
|
||||||
{ info: defaultInfo, images: imessageIconContents },
|
{ images: imessageIconContents, info: defaultInfo },
|
||||||
null,
|
null,
|
||||||
2
|
2
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
### @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,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)
|
### @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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,39 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
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
|
||||||
|
) => {
|
||||||
|
config = withSiriShortcutAppDelegate(config);
|
||||||
|
|
||||||
|
const items = activityTypes || [];
|
||||||
|
|
||||||
|
if (!Array.isArray(items) || !items.length) {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
return withInfoPlist(config, (config) => {
|
||||||
|
config.modResults.NSUserActivityTypes = items;
|
||||||
|
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 {
|
||||||
|
const newSrc = [];
|
||||||
|
newSrc.push(
|
||||||
|
" BOOL shortcutResult = [RNSSSiriShortcuts application:application continueUserActivity:userActivity restorationHandler:restorationHandler];",
|
||||||
|
" if (shortcutResult) {",
|
||||||
|
" return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || shortcutResult;",
|
||||||
|
" }"
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(src);
|
||||||
|
return mergeContents({
|
||||||
|
tag: "react-native-siri-shortcut-delegate",
|
||||||
|
src,
|
||||||
|
newSrc: newSrc.join("\n"),
|
||||||
|
anchor:
|
||||||
|
/ return \[super application:application continueUserActivity:userActivity restorationHandler:restorationHandler\] \|\| result;/,
|
||||||
|
offset: -1,
|
||||||
|
comment: "//",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const withSiriEntitlements: ConfigPlugin = (config) => {
|
||||||
|
return withEntitlementsPlist(config, (config) => {
|
||||||
|
config.modResults["com.apple.developer.siri"] = true;
|
||||||
|
return config;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const withSiriShortcutAppDelegate: ConfigPlugin = (config) => {
|
||||||
|
let cfg = 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;
|
||||||
|
});
|
||||||
|
cfg = withSiriEntitlements(cfg);
|
||||||
|
|
||||||
|
return cfg;
|
||||||
|
};
|
||||||
|
|
||||||
|
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__/*"]
|
||||||
|
}
|
||||||
@@ -1402,7 +1402,7 @@
|
|||||||
node-forge "^1.2.1"
|
node-forge "^1.2.1"
|
||||||
nullthrows "^1.1.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"
|
version "4.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.4.tgz#08e1a6314dc0f96cd165a748b5997b5ec75a84d0"
|
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.4.tgz#08e1a6314dc0f96cd165a748b5997b5ec75a84d0"
|
||||||
integrity sha512-fkOjXnSieQfVSWVLKhst0DnCAyeHksvWky1CldFCQllhDB1HHBiP09Z8pamVB783n3qr/1HNZiSp6k2iUcaSoA==
|
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"
|
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
|
||||||
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
|
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:
|
fast-glob@^2.2.6:
|
||||||
version "2.2.7"
|
version "2.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
|
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:
|
dependencies:
|
||||||
minipass "^3.0.0"
|
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:
|
fs-readdir-recursive@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
|
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"
|
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
||||||
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
|
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:
|
memory-cache@~0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a"
|
resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a"
|
||||||
@@ -20100,8 +20118,10 @@ watchpack@^1.6.1:
|
|||||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
|
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
|
||||||
integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
|
integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
|
chokidar "^3.4.1"
|
||||||
graceful-fs "^4.1.2"
|
graceful-fs "^4.1.2"
|
||||||
neo-async "^2.5.0"
|
neo-async "^2.5.0"
|
||||||
|
watchpack-chokidar2 "^2.0.1"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
chokidar "^3.4.1"
|
chokidar "^3.4.1"
|
||||||
watchpack-chokidar2 "^2.0.1"
|
watchpack-chokidar2 "^2.0.1"
|
||||||
|
|||||||
Reference in new issue
Block a user