mirror of
https://github.com/expo/config-plugins.git
synced 2026-11-13 20:28:07 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28997c1062 | ||
|
|
d6050beb2a | ||
|
|
5f4e90059e | ||
|
|
c3a375b292 | ||
|
|
1648e8598b | ||
|
|
e2d2b27494 | ||
|
|
ff8b167764 | ||
|
|
eee366bebc | ||
|
|
72fa3e14ef | ||
|
|
6324eb041b | ||
|
|
480ec19161 | ||
|
|
39a9e63fe9 | ||
|
|
7ffc38a808 | ||
|
|
97dcf1aca6 | ||
|
|
4dcc613a70 | ||
|
|
b07ab9e848 | ||
|
|
7411365343 | ||
|
|
e6e8745f05 | ||
|
|
e9f737cfeb | ||
|
|
b0cfebadb4 | ||
|
|
eb957dec79 | ||
|
|
eb4927760b | ||
|
|
3719d67596 | ||
|
|
df9ac710d5 | ||
|
|
73109da98d | ||
|
|
c904bc6a5f | ||
|
|
1374ab2bf4 | ||
|
|
429dcdc1d0 | ||
|
|
5de4ae3e61 | ||
|
|
537afa4c7d | ||
|
|
ada8b99f32 | ||
|
|
546da1c354 | ||
|
|
71c0aa1387 | ||
|
|
8414fda99b | ||
|
|
95c1f0fcd0 | ||
|
|
718c3f9347 | ||
|
|
2591fe2de7 | ||
|
|
39a88c3703 | ||
|
|
1bc203e66e | ||
|
|
352e887b21 | ||
|
|
96fbab5b2a | ||
|
|
4b7192f364 | ||
|
|
7896eccf49 | ||
|
|
ab8076adf5 | ||
|
|
4affbbb7cc | ||
|
|
831546f34b |
No files matched your search
@@ -0,0 +1 @@
|
||||
/* @EvanBacon
|
||||
@@ -0,0 +1,24 @@
|
||||
<!--
|
||||
🚨 We use semantic release (a bot publishes everything automatically)
|
||||
🚨 so please use conventional commit style for the PR title:
|
||||
🚨 https://www.conventionalcommits.org/en/v1.0.0/
|
||||
🚨 Example: feat(detox): add new step
|
||||
-->
|
||||
|
||||
# Why
|
||||
|
||||
<!--
|
||||
Please describe the motivation for this PR, and link to relevant GitHub issues, forums posts, or feature requests.
|
||||
-->
|
||||
|
||||
# How
|
||||
|
||||
<!--
|
||||
How did you build this feature or fix this bug and why?
|
||||
-->
|
||||
|
||||
# Test Plan
|
||||
|
||||
<!--
|
||||
Please describe how you tested this change and how a reviewer could reproduce your test, especially if this PR does not include automated tests! If possible, please also provide terminal output and/or screenshots demonstrating your test/reproduction.
|
||||
-->
|
||||
@@ -1,25 +0,0 @@
|
||||
name: PR Title
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "*"
|
||||
types:
|
||||
- opened
|
||||
- reopened
|
||||
- edited
|
||||
- synchronize
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: aslafy-z/[email protected]
|
||||
# continue-on-error: true
|
||||
id: title-check
|
||||
with:
|
||||
success-state: PR title is valid
|
||||
failure-state: "PR title does not follow the conventional commit spec: https://www.conventionalcommits.org/en/v1.0.0/"
|
||||
context-name: pr-title
|
||||
preset: conventional-changelog-angular@latest
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
@@ -22,11 +22,16 @@ jobs:
|
||||
- run: yarn install --frozen-lockfile --check-files
|
||||
- run: yarn lerna run prepare --stream
|
||||
|
||||
# https://github.com/dhoulb/multi-semantic-release
|
||||
# If the dry run fails then it will prevent us from automatically breaking the repo.
|
||||
- name: Semantic release (dry run)
|
||||
run: npx multi-semantic-release --dry-run --ignore-private-packages
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
- name: Semantic release
|
||||
# use `--ignore-packages` to ignore packages on bumping process
|
||||
# npx multi-semantic-release --ignore-packages=packages/a/**,packages/b/**
|
||||
run: npx multi-semantic-release
|
||||
run: npx multi-semantic-release --ignore-private-packages
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
+5
-1
@@ -51,4 +51,8 @@ xcuserdata
|
||||
# VSCode
|
||||
.history/
|
||||
|
||||
# packages/*/build/
|
||||
# Ignore build folders
|
||||
|
||||
packages/*/build/**
|
||||
packages/*/plugin/build/**
|
||||
packages/@*/*/build/**
|
||||
+1
-1
@@ -49,6 +49,7 @@ module.exports = {
|
||||
},
|
||||
],
|
||||
"@semantic-release/changelog",
|
||||
"@semantic-release/npm",
|
||||
[
|
||||
"@semantic-release/git",
|
||||
{
|
||||
@@ -57,6 +58,5 @@ module.exports = {
|
||||
},
|
||||
],
|
||||
"@semantic-release/github",
|
||||
"@semantic-release/npm",
|
||||
],
|
||||
};
|
||||
@@ -1,3 +1,27 @@
|
||||
### @expo/app [1.0.1](https://github.com/expo/config-plugins/compare/@expo/[email protected]...@expo/[email protected]) (2022-03-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ci:** use correct internal versions ([ab8076a](https://github.com/expo/config-plugins/commit/ab8076adf51e9ba0439eba60b153d729a0996b8d))
|
||||
|
||||
|
||||
|
||||
### Dependencies
|
||||
|
||||
* **@config-plugins/android-jsc-intl:** upgraded to 1.0.1
|
||||
* **@config-plugins/detox:** upgraded to 1.0.1
|
||||
* **@config-plugins/react-native-adjust:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-ble-plx:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-blob-util:** upgraded to 1.0.1
|
||||
* **@config-plugins/react-native-branch:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-callkeep:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-dynamic-app-icon:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-google-cast:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-pdf:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-quick-actions:** upgraded to 1.0.0
|
||||
* **@config-plugins/react-native-webrtc:** upgraded to 1.0.0
|
||||
|
||||
## @expo/app 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
|
||||
+14
-14
@@ -21,20 +21,20 @@
|
||||
"android": "expo run:android"
|
||||
},
|
||||
"dependencies": {
|
||||
"@config-plugins/android-jsc-intl": "1.0.0",
|
||||
"@config-plugins/detox": "1.0.0",
|
||||
"@config-plugins/ffmpeg-kit-react-native": "1.0.0",
|
||||
"@config-plugins/ios-stickers": "1.0.0",
|
||||
"@config-plugins/react-native-adjust": "1.0.0",
|
||||
"@config-plugins/react-native-ble-plx": "1.0.0",
|
||||
"@config-plugins/react-native-blob-util": "1.0.0",
|
||||
"@config-plugins/react-native-branch": "1.0.0",
|
||||
"@config-plugins/react-native-callkeep": "1.0.0",
|
||||
"@config-plugins/react-native-dynamic-app-icon": "1.0.0",
|
||||
"@config-plugins/react-native-google-cast": "1.0.0",
|
||||
"@config-plugins/react-native-pdf": "1.0.0",
|
||||
"@config-plugins/react-native-quick-actions": "1.0.0",
|
||||
"@config-plugins/react-native-webrtc": "1.0.0",
|
||||
"@config-plugins/android-jsc-intl": "*",
|
||||
"@config-plugins/detox": "*",
|
||||
"@config-plugins/ffmpeg-kit-react-native": "*",
|
||||
"@config-plugins/ios-stickers": "*",
|
||||
"@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-webrtc": "*",
|
||||
"expo": "^44.0.0",
|
||||
"expo-localization": "~12.0.0",
|
||||
"expo-splash-screen": "~0.14.0",
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
### @config-plugins/android-jsc-intl [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
### @config-plugins/android-jsc-intl [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ci:** use correct internal versions ([ab8076a](https://github.com/expo/config-plugins/commit/ab8076adf51e9ba0439eba60b153d729a0996b8d))
|
||||
|
||||
## @config-plugins/android-jsc-intl 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/**
|
||||
* Apply android-jsc-intl configuration for Expo SDK 42 projects.
|
||||
*
|
||||
* This plugin lets you access the `Intl` API in Android apps (without Hermes).
|
||||
*/
|
||||
declare const withAndroidJscIntl: ConfigPlugin;
|
||||
export default withAndroidJscIntl;
|
||||
@@ -1,21 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
/**
|
||||
* Apply android-jsc-intl configuration for Expo SDK 42 projects.
|
||||
*
|
||||
* This plugin lets you access the `Intl` API in Android apps (without Hermes).
|
||||
*/
|
||||
const withAndroidJscIntl = (config) => {
|
||||
// Return the modified config.
|
||||
return config_plugins_1.withAppBuildGradle(config, config => {
|
||||
if (config.modResults.language === 'groovy') {
|
||||
config.modResults.contents = config.modResults.contents.replace('org.webkit:android-jsc:+', 'org.webkit:android-jsc-intl:+');
|
||||
}
|
||||
else {
|
||||
throw new Error('[@expo/config-plugins][withAndroidJscIntl] Cannot enable Intl in Android JSC app gradle because the build.gradle is not groovy.');
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.default = withAndroidJscIntl;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/android-jsc-intl",
|
||||
"version": "0.0.2",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin for android-jsc-intl package",
|
||||
"main": "build/withAndroidJscIntl.js",
|
||||
"types": "build/withAndroidJscIntl.d.ts",
|
||||
@@ -36,4 +36,4 @@
|
||||
"devDependencies": {
|
||||
"expo-module-scripts": "^2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,15 @@
|
||||
## @config-plugins/detox 1.0.0 (2022-03-15)
|
||||
### @config-plugins/detox [1.2.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Other chores
|
||||
### Bug Fixes
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
* **networkConfig:** Fix android crash on empty subdomains config ([#46](https://github.com/expo/config-plugins/issues/46)) ([88e0cd0](https://github.com/expo/config-plugins/commit/88e0cd0ccfdcc337e9c03f318d781aa1097e148b)), closes [#3](https://github.com/expo/config-plugins/issues/3)
|
||||
* **detox:** use improved xml generation ([#47](https://github.com/expo/config-plugins/issues/47)) ([6324eb0](https://github.com/expo/config-plugins/commit/6324eb041b3b4eb2318c0a1ea0297e3b7bf28f7c))
|
||||
|
||||
### @config-plugins/detox [1.2.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
### @config-plugins/detox 1.2.0
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
import { SubdomainsType } from "./withNetworkSecurityConfig";
|
||||
declare const _default: ConfigPlugin<void | {
|
||||
/**
|
||||
* Disable adding proguard minification to the `app/build.gradle`.
|
||||
*
|
||||
* @default false
|
||||
*/
|
||||
skipProguard?: boolean | undefined;
|
||||
/**
|
||||
* Subdomains to add to the network security config.
|
||||
* Pass `['10.0.3.2', 'localhost']` to use Genymotion emulators instead of Google emulators.
|
||||
* Pass `*` to allow all domains.
|
||||
*
|
||||
* @default ['10.0.2.2', 'localhost'] // (Google emulators)
|
||||
*/
|
||||
subdomains?: SubdomainsType | undefined;
|
||||
}>;
|
||||
export default _default;
|
||||
Generated
-42
@@ -1,42 +0,0 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withDetoxProjectGradle_1 = __importDefault(require("./withDetoxProjectGradle"));
|
||||
const withDetoxTestAppGradle_1 = __importDefault(require("./withDetoxTestAppGradle"));
|
||||
const withDetoxTestClass_1 = require("./withDetoxTestClass");
|
||||
const withKotlinGradle_1 = __importDefault(require("./withKotlinGradle"));
|
||||
const withNetworkSecurityConfig_1 = require("./withNetworkSecurityConfig");
|
||||
const withProguardGradle_1 = __importDefault(require("./withProguardGradle"));
|
||||
const withDetox = (config, { skipProguard, subdomains } = {}) => {
|
||||
return config_plugins_1.withPlugins(config, [
|
||||
// 3.
|
||||
withDetoxProjectGradle_1.default,
|
||||
// 3.
|
||||
withDetoxTestAppGradle_1.default,
|
||||
// 4.
|
||||
[
|
||||
withKotlinGradle_1.default,
|
||||
// Minimum version of Kotlin required to work with expo packages in SDK 43
|
||||
"1.4.21",
|
||||
],
|
||||
// 5.
|
||||
withDetoxTestClass_1.withDetoxTestClass,
|
||||
// 6.
|
||||
[withNetworkSecurityConfig_1.withNetworkSecurityConfigManifest, { subdomains }],
|
||||
// 7.
|
||||
!skipProguard && withProguardGradle_1.default,
|
||||
].filter(Boolean));
|
||||
};
|
||||
let pkg = {
|
||||
name: "detox",
|
||||
// UNVERSIONED...
|
||||
};
|
||||
try {
|
||||
const detoxPkg = require("detox/package.json");
|
||||
pkg = detoxPkg;
|
||||
}
|
||||
catch (_a) { }
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withDetox, pkg.name, pkg.version);
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
import { MergeResults } from "@expo/config-plugins/build/utils/generateCode";
|
||||
/**
|
||||
* [Step 3](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#3-add-the-native-detox-dependency) Add detox to the project build.gradle.
|
||||
* @param config
|
||||
*/
|
||||
declare const withDetoxProjectGradle: ConfigPlugin;
|
||||
export declare function addDetoxImport(src: string): MergeResults;
|
||||
export default withDetoxProjectGradle;
|
||||
-59
@@ -1,59 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addDetoxImport = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
// Because we need the package to be added AFTER the React and Google maven packages, we create a new allprojects.
|
||||
// It's ok to have multiple allprojects.repositories, so we create a new one since it's cheaper than tokenizing
|
||||
// the existing block to find the correct place to insert our camera maven.
|
||||
const gradleMaven = [
|
||||
`def detoxMavenPath = new File(["node", "--print", "require.resolve('detox/package.json')"].execute(null, rootDir).text.trim(), "../Detox-android")`,
|
||||
`allprojects { repositories { maven { url(detoxMavenPath) } } }`,
|
||||
].join("\n");
|
||||
/**
|
||||
* [Step 3](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#3-add-the-native-detox-dependency) Add detox to the project build.gradle.
|
||||
* @param config
|
||||
*/
|
||||
const withDetoxProjectGradle = (config) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addDetoxImport(config.modResults.contents).contents;
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot add Detox maven gradle because the project build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
function addDetoxImport(src) {
|
||||
return appendContents({
|
||||
tag: "detox-import",
|
||||
src,
|
||||
newSrc: gradleMaven,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
exports.addDetoxImport = addDetoxImport;
|
||||
// Fork of config-plugins mergeContents, but appends the contents to the end of the file.
|
||||
function appendContents({ src, newSrc, tag, comment, }) {
|
||||
const header = generateCode_1.createGeneratedHeaderComment(newSrc, tag, comment);
|
||||
if (!src.includes(header)) {
|
||||
// Ensure the old generated contents are removed.
|
||||
const sanitizedTarget = generateCode_1.removeGeneratedContents(src, tag);
|
||||
const contentsToAdd = [
|
||||
// @something
|
||||
header,
|
||||
// contents
|
||||
newSrc,
|
||||
// @end
|
||||
`${comment} @generated end ${tag}`,
|
||||
].join("\n");
|
||||
return {
|
||||
contents: sanitizedTarget !== null && sanitizedTarget !== void 0 ? sanitizedTarget : src + contentsToAdd,
|
||||
didMerge: true,
|
||||
didClear: !!sanitizedTarget,
|
||||
};
|
||||
}
|
||||
return { contents: src, didClear: false, didMerge: false };
|
||||
}
|
||||
exports.default = withDetoxProjectGradle;
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/**
|
||||
* [Step 3](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#3-add-the-native-detox-dependency). Add the Native Detox dependency.
|
||||
*
|
||||
* 1. Add `androidTestImplementation` to the app/build.gradle
|
||||
* 2. Add `testInstrumentationRunner` to the app/build.gradle
|
||||
* @param config
|
||||
*/
|
||||
declare const withDetoxTestAppGradle: ConfigPlugin;
|
||||
export declare function setGradleAndroidTestImplementation(buildGradle: string): string;
|
||||
export declare function addDetoxDefaultConfigBlock(buildGradle: string): string;
|
||||
export default withDetoxTestAppGradle;
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addDetoxDefaultConfigBlock = exports.setGradleAndroidTestImplementation = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
/**
|
||||
* [Step 3](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#3-add-the-native-detox-dependency). Add the Native Detox dependency.
|
||||
*
|
||||
* 1. Add `androidTestImplementation` to the app/build.gradle
|
||||
* 2. Add `testInstrumentationRunner` to the app/build.gradle
|
||||
* @param config
|
||||
*/
|
||||
const withDetoxTestAppGradle = (config) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = setGradleAndroidTestImplementation(config.modResults.contents);
|
||||
config.modResults.contents = addDetoxDefaultConfigBlock(config.modResults.contents);
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot add Detox maven gradle because the project build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
function setGradleAndroidTestImplementation(buildGradle) {
|
||||
const pattern = /androidTestImplementation\(\'com.wix:detox:\+\'\)/g;
|
||||
if (buildGradle.match(pattern)) {
|
||||
return buildGradle;
|
||||
}
|
||||
return buildGradle.replace(/dependencies\s?{/, `dependencies {
|
||||
androidTestImplementation('com.wix:detox:+')`);
|
||||
}
|
||||
exports.setGradleAndroidTestImplementation = setGradleAndroidTestImplementation;
|
||||
function addDetoxDefaultConfigBlock(buildGradle) {
|
||||
const pattern = /detox-plugin-default-config/g;
|
||||
if (buildGradle.match(pattern)) {
|
||||
return buildGradle;
|
||||
}
|
||||
return buildGradle.replace(/defaultConfig\s?{/, `defaultConfig {
|
||||
// detox-plugin-default-config
|
||||
testBuildType System.getProperty('testBuildType', 'debug')
|
||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'`);
|
||||
}
|
||||
exports.addDetoxDefaultConfigBlock = addDetoxDefaultConfigBlock;
|
||||
exports.default = withDetoxTestAppGradle;
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/**
|
||||
* [Step 5](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#5-create-a-detox-test-class). Create `DetoxTest.java`
|
||||
*/
|
||||
export declare const withDetoxTestClass: ConfigPlugin;
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withDetoxTestClass = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const path = __importStar(require("path"));
|
||||
const fs = __importStar(require("fs"));
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
/**
|
||||
* Copied from the [official template file](https://github.com/wix/Detox/blob/master/examples/demo-react-native/android/app/src/androidTest/java/com/example/DetoxTest.java).
|
||||
*
|
||||
* @param androidPackage
|
||||
*/
|
||||
function getTemplateFile(androidPackage) {
|
||||
// This shouldn't change in standard Expo apps.
|
||||
// Replace 'MainActivity' with the value of android:name entry in
|
||||
// <activity> in AndroidManifest.xml
|
||||
const mainApplicationClassName = "MainActivity";
|
||||
return `package ${androidPackage};
|
||||
|
||||
import com.wix.detox.Detox;
|
||||
import com.wix.detox.config.DetoxConfig;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.LargeTest;
|
||||
import androidx.test.rule.ActivityTestRule;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
@LargeTest
|
||||
public class DetoxTest {
|
||||
@Rule
|
||||
public ActivityTestRule<${mainApplicationClassName}> mActivityRule = new ActivityTestRule<>(${mainApplicationClassName}.class, false, false);
|
||||
|
||||
@Test
|
||||
public void runDetoxTests() {
|
||||
DetoxConfig detoxConfig = new DetoxConfig();
|
||||
detoxConfig.idlePolicyConfig.masterTimeoutSec = 90;
|
||||
detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60;
|
||||
detoxConfig.rnContextLoadTimeoutSec = (${androidPackage}.BuildConfig.DEBUG ? 180 : 60);
|
||||
|
||||
Detox.runTests(mActivityRule, detoxConfig);
|
||||
}
|
||||
}
|
||||
`;
|
||||
}
|
||||
/**
|
||||
* [Step 5](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#5-create-a-detox-test-class). Create `DetoxTest.java`
|
||||
*/
|
||||
const withDetoxTestClass = (config) => {
|
||||
return config_plugins_1.withDangerousMod(config, [
|
||||
"android",
|
||||
async (config) => {
|
||||
var _a;
|
||||
const packageName = (_a = config.android) === null || _a === void 0 ? void 0 : _a.package;
|
||||
assert_1.default(packageName, "android.package must be defined");
|
||||
const folder = path.join(config.modRequest.platformProjectRoot, `app/src/androidTest/java/${packageName.split(".").join("/")}`);
|
||||
fs.mkdirSync(folder, { recursive: true });
|
||||
fs.writeFileSync(path.join(folder, "DetoxTest.java"), getTemplateFile(packageName), { encoding: "utf8" });
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
exports.withDetoxTestClass = withDetoxTestClass;
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/**
|
||||
* [Step 4](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#4-add-kotlin). Add Kotlin.
|
||||
*
|
||||
* Lifted from [unimodules-test-core](https://github.com/expo/expo/blob/master/packages/unimodules-test-core/app.plugin.js).
|
||||
*
|
||||
* @param config Expo config
|
||||
* @param version Kotlin version to use
|
||||
*/
|
||||
declare const withKotlinGradle: ConfigPlugin<string>;
|
||||
export default withKotlinGradle;
|
||||
Generated
-43
@@ -1,43 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const kotlinClassPath = "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion";
|
||||
/**
|
||||
* [Step 4](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#4-add-kotlin). Add Kotlin.
|
||||
*
|
||||
* Lifted from [unimodules-test-core](https://github.com/expo/expo/blob/master/packages/unimodules-test-core/app.plugin.js).
|
||||
*
|
||||
* @param config Expo config
|
||||
* @param version Kotlin version to use
|
||||
*/
|
||||
const withKotlinGradle = (config, version) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
console.log(`[config-plugins/detox] Setting Kotlin version to: ${version}. This could lead to Android build issues.`);
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = setKotlinVersion(config.modResults.contents, version);
|
||||
config.modResults.contents = setKotlinClassPath(config.modResults.contents);
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot setup kotlin because the build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
function setKotlinVersion(buildGradle, version) {
|
||||
const pattern = /kotlinVersion\s?=\s?(["'])(?:(?=(\\?))\2.)*?\1/g;
|
||||
const replacement = `kotlinVersion = "${version}"`;
|
||||
if (buildGradle.match(pattern)) {
|
||||
// Select kotlinVersion = '***' and replace the contents between the quotes.
|
||||
return buildGradle.replace(pattern, replacement);
|
||||
}
|
||||
return buildGradle.replace(/ext\s?{/, `ext {
|
||||
${replacement}`);
|
||||
}
|
||||
function setKotlinClassPath(buildGradle) {
|
||||
if (buildGradle.includes(kotlinClassPath)) {
|
||||
return buildGradle;
|
||||
}
|
||||
return buildGradle.replace(/dependencies\s?{/, `dependencies {
|
||||
classpath "${kotlinClassPath}"`);
|
||||
}
|
||||
exports.default = withKotlinGradle;
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare type SubdomainsType = string[] | "*";
|
||||
export declare function getTemplateFile(subdomains: SubdomainsType): string;
|
||||
/**
|
||||
* [Step 6](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#6-enable-clear-text-unencrypted-traffic-for-detox). Link the `network_security_config.xml` file to the `AndroidManifest.xml`.
|
||||
*/
|
||||
export declare const withNetworkSecurityConfigManifest: ConfigPlugin<{
|
||||
subdomains: SubdomainsType;
|
||||
} | void>;
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withNetworkSecurityConfigManifest = exports.getTemplateFile = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const path = __importStar(require("path"));
|
||||
const fs = __importStar(require("fs"));
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
function getTemplateConfigContent(subdomains) {
|
||||
if (subdomains === "*") {
|
||||
// allow all domains
|
||||
return '<base-config cleartextTrafficPermitted="true" />';
|
||||
}
|
||||
return `
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
${subdomains
|
||||
.map((subdomain) => `<domain includeSubdomains="true">${subdomain}</domain>`)
|
||||
.join("")}
|
||||
</domain-config>
|
||||
`;
|
||||
}
|
||||
function getTemplateFile(subdomains) {
|
||||
const content = getTemplateConfigContent(subdomains);
|
||||
return `
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
${content}
|
||||
</network-security-config>
|
||||
`;
|
||||
}
|
||||
exports.getTemplateFile = getTemplateFile;
|
||||
/**
|
||||
* Create `network_security_config.xml` resource file.
|
||||
*/
|
||||
const withNetworkSecurityConfigFile = (config, { subdomains }) => {
|
||||
return config_plugins_1.withDangerousMod(config, [
|
||||
"android",
|
||||
async (config) => {
|
||||
var _a;
|
||||
const packageName = (_a = config.android) === null || _a === void 0 ? void 0 : _a.package;
|
||||
assert_1.default(packageName, "android.package must be defined");
|
||||
const folder = path.join(config.modRequest.platformProjectRoot, `app/src/main/res/xml`);
|
||||
fs.mkdirSync(folder, { recursive: true });
|
||||
fs.writeFileSync(path.join(folder, "network_security_config.xml"), getTemplateFile(subdomains), { encoding: "utf8" });
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
/**
|
||||
* [Step 6](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#6-enable-clear-text-unencrypted-traffic-for-detox). Link the `network_security_config.xml` file to the `AndroidManifest.xml`.
|
||||
*/
|
||||
const withNetworkSecurityConfigManifest = (config, props) => {
|
||||
if (!props || !props.subdomains) {
|
||||
// (*) 10.0.2.2 for Google emulators, 10.0.3.2 for Genymotion emulators.
|
||||
// https://developer.android.com/training/articles/security-config
|
||||
props = { subdomains: ["10.0.2.2", "localhost"] };
|
||||
}
|
||||
if (typeof props.subdomains === "object" && !props.subdomains.length) {
|
||||
// if subdomains is an empty array, skip network config mod
|
||||
return config;
|
||||
}
|
||||
config = withNetworkSecurityConfigFile(config, props);
|
||||
return config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
const application = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
|
||||
application.$["android:networkSecurityConfig"] =
|
||||
"@xml/network_security_config";
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withNetworkSecurityConfigManifest = withNetworkSecurityConfigManifest;
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/**
|
||||
* [Step 7](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#7-proguard-minification-obfuscation). Add Proguard (Minification, Obfuscation) to the app/build.gradle.
|
||||
*
|
||||
* 1. Add `androidTestImplementation` to the app/build.gradle
|
||||
* 2. Add `testInstrumentationRunner` to the app/build.gradle
|
||||
* @param config
|
||||
*/
|
||||
declare const withProguardGradle: ConfigPlugin;
|
||||
export declare function addDetoxProguardRules(buildGradle: string): string;
|
||||
export default withProguardGradle;
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addDetoxProguardRules = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
/**
|
||||
* [Step 7](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#7-proguard-minification-obfuscation). Add Proguard (Minification, Obfuscation) to the app/build.gradle.
|
||||
*
|
||||
* 1. Add `androidTestImplementation` to the app/build.gradle
|
||||
* 2. Add `testInstrumentationRunner` to the app/build.gradle
|
||||
* @param config
|
||||
*/
|
||||
const withProguardGradle = (config) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addDetoxProguardRules(config.modResults.contents);
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot add Detox maven gradle because the project build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
function addDetoxProguardRules(buildGradle) {
|
||||
const pattern = /detox\/proguard\-rules\-app\.pro/g;
|
||||
if (buildGradle.match(pattern)) {
|
||||
return buildGradle;
|
||||
}
|
||||
return buildGradle.replace(/proguardFiles getDefaultProguardFile\("proguard-android.txt"\),\s?"proguard-rules.pro"/, `proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
||||
// Detox-specific additions to pro-guard
|
||||
def detoxProguardRulesPath = new File(["node", "--print", "require.resolve('detox/package.json')"].execute(null, rootDir).text.trim(), "../android/detox/proguard-rules-app.pro")
|
||||
proguardFile(detoxProguardRulesPath)
|
||||
`);
|
||||
}
|
||||
exports.addDetoxProguardRules = addDetoxProguardRules;
|
||||
exports.default = withProguardGradle;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/detox",
|
||||
"version": "1.2.0",
|
||||
"version": "1.2.2",
|
||||
"description": "Config plugin to auto configure detox on prebuild",
|
||||
"main": "build/withDetox.js",
|
||||
"types": "build/withDetox.d.ts",
|
||||
|
||||
@@ -1,25 +1,21 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`getTemplateFile returns domain-config when subdomains is an array 1`] = `
|
||||
"
|
||||
<?xml version=\\"1.0\\" encoding=\\"utf-8\\"?>
|
||||
<network-security-config>
|
||||
|
||||
"<?xml version=\\"1.0\\" encoding=\\"utf-8\\"?>
|
||||
<network-security-config>
|
||||
|
||||
<domain-config cleartextTrafficPermitted=\\"true\\">
|
||||
<domain includeSubdomains=\\"true\\">localhost</domain>
|
||||
</domain-config>
|
||||
|
||||
</network-security-config>
|
||||
"
|
||||
</network-security-config>"
|
||||
`;
|
||||
|
||||
exports[`getTemplateFile returns only base-config when subdomains is '*' 1`] = `
|
||||
"
|
||||
<?xml version=\\"1.0\\" encoding=\\"utf-8\\"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted=\\"true\\" />
|
||||
</network-security-config>
|
||||
"
|
||||
"<?xml version=\\"1.0\\" encoding=\\"utf-8\\"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted=\\"true\\" />
|
||||
</network-security-config>"
|
||||
`;
|
||||
|
||||
exports[`withNetworkSecurityConfigManifest doesn't modify config if subdomains is an empty array 1`] = `
|
||||
|
||||
@@ -29,12 +29,15 @@ function getTemplateConfigContent(subdomains: SubdomainsType) {
|
||||
|
||||
export function getTemplateFile(subdomains: SubdomainsType): string {
|
||||
const content = getTemplateConfigContent(subdomains);
|
||||
return `
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
${content}
|
||||
</network-security-config>
|
||||
`;
|
||||
/**
|
||||
* May not have new lines or spaces in the beginning.
|
||||
* Otherwise build fails with:
|
||||
* "AAPT: error: XML or text declaration not at start of entity"
|
||||
*/
|
||||
return `<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
${content}
|
||||
</network-security-config>`;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
### @config-plugins/ffmpeg-kit-react-native [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* **ffmpeg-kit-react-native:** update plugin to use `AndroidConfig.Version.withBuildScriptExtMinimumVersion` ([#60](https://github.com/expo/config-plugins/issues/60)) ([c3a375b](https://github.com/expo/config-plugins/commit/c3a375b292d6405be7b3277d10ab4f8dbb006047))
|
||||
|
||||
### @config-plugins/ffmpeg-kit-react-native [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/ffmpeg-kit-react-native 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withAndroidFFMPEGPackage: ConfigPlugin<string | undefined>;
|
||||
export declare function addPackageName(src: string, packageName?: string): string;
|
||||
@@ -1,54 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addPackageName = exports.withAndroidFFMPEGPackage = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
const withAndroidFFMPEGPackage = (config, packageName) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addPackageName(config.modResults.contents, packageName);
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot add camera maven gradle because the build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withAndroidFFMPEGPackage = withAndroidFFMPEGPackage;
|
||||
function addPackageName(src, packageName) {
|
||||
const tag = "ffmpeg-kit-react-native-package";
|
||||
const gradleMaven = packageName
|
||||
? `ext { ffmpegKitPackage = "${packageName}" }`
|
||||
: "";
|
||||
return appendContents({
|
||||
tag,
|
||||
src,
|
||||
newSrc: gradleMaven,
|
||||
comment: "//",
|
||||
}).contents;
|
||||
}
|
||||
exports.addPackageName = addPackageName;
|
||||
// Fork of config-plugins mergeContents, but appends the contents to the end of the file.
|
||||
function appendContents({ src, newSrc, tag, comment, }) {
|
||||
const header = generateCode_1.createGeneratedHeaderComment(newSrc, tag, comment);
|
||||
if (!src.includes(header)) {
|
||||
// Ensure the old generated contents are removed.
|
||||
let sanitizedTarget = generateCode_1.removeGeneratedContents(src, tag);
|
||||
if (sanitizedTarget)
|
||||
sanitizedTarget += "\n";
|
||||
const contentsToAdd = [
|
||||
// @something
|
||||
header,
|
||||
// contents
|
||||
newSrc,
|
||||
// @end
|
||||
`${comment} @generated end ${tag}`,
|
||||
].join("\n");
|
||||
return {
|
||||
contents: (sanitizedTarget !== null && sanitizedTarget !== void 0 ? sanitizedTarget : src) + contentsToAdd,
|
||||
didMerge: true,
|
||||
didClear: !!sanitizedTarget,
|
||||
};
|
||||
}
|
||||
return { contents: src, didClear: false, didMerge: false };
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */
|
||||
export declare const withBuildScriptExtMinimumVersion: ConfigPlugin<{
|
||||
name: string;
|
||||
minVersion: number;
|
||||
}>;
|
||||
export declare function setMinBuildScriptExtVersion(buildGradle: string, { name, minVersion }: {
|
||||
name: string;
|
||||
minVersion: number;
|
||||
}): string;
|
||||
@@ -1,31 +0,0 @@
|
||||
"use strict";
|
||||
// Copied from https://github.com/expo/expo-cli/blob/main/packages/config-plugins/src/android/Version.ts
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.setMinBuildScriptExtVersion = exports.withBuildScriptExtMinimumVersion = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
/** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */
|
||||
const withBuildScriptExtMinimumVersion = (config, props) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = setMinBuildScriptExtVersion(config.modResults.contents, props);
|
||||
}
|
||||
else {
|
||||
config_plugins_1.WarningAggregator.addWarningAndroid("withBuildScriptExtVersion", `Cannot automatically configure project build.gradle if it's not groovy`);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withBuildScriptExtMinimumVersion = withBuildScriptExtMinimumVersion;
|
||||
function setMinBuildScriptExtVersion(buildGradle, { name, minVersion }) {
|
||||
var _a;
|
||||
const regex = new RegExp(`(${name}\\s?=\\s?)(\\d+(?:\\.\\d+)?)`);
|
||||
const currentVersion = (_a = buildGradle.match(regex)) === null || _a === void 0 ? void 0 : _a[2];
|
||||
if (!currentVersion) {
|
||||
config_plugins_1.WarningAggregator.addWarningAndroid("withBuildScriptExtVersion", `Cannot set minimum buildscript.ext.${name} version because the property "${name}" cannot be found or does not have a numeric value.`);
|
||||
// TODO: Maybe just add the property...
|
||||
return buildGradle;
|
||||
}
|
||||
const currentVersionNum = Number(currentVersion);
|
||||
return buildGradle.replace(regex, `$1${Math.max(minVersion, currentVersionNum)}`);
|
||||
}
|
||||
exports.setMinBuildScriptExtVersion = setMinBuildScriptExtVersion;
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withPodfilePropertiesPackage: ConfigPlugin<string>;
|
||||
/** Dangerously adds the custom import to the CocoaPods. */
|
||||
export declare const withCocoaPodsImport: ConfigPlugin;
|
||||
export declare function addCocoaPodsImport(src: string): string;
|
||||
@@ -1,47 +0,0 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addCocoaPodsImport = exports.withCocoaPodsImport = exports.withPodfilePropertiesPackage = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const ios_plugins_1 = require("@expo/config-plugins/build/plugins/ios-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
const fs_1 = require("fs");
|
||||
const path_1 = __importDefault(require("path"));
|
||||
const withPodfilePropertiesPackage = (config, packageName) => {
|
||||
return ios_plugins_1.withPodfileProperties(config, (config) => {
|
||||
// @ts-ignore: wrong type
|
||||
config.modResults["ffmpeg-kit-react-native.subspecs"] = [
|
||||
packageName,
|
||||
].filter(Boolean);
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withPodfilePropertiesPackage = withPodfilePropertiesPackage;
|
||||
/** Dangerously adds the custom import to the CocoaPods. */
|
||||
const withCocoaPodsImport = (c) => {
|
||||
return config_plugins_1.withDangerousMod(c, [
|
||||
"ios",
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
||||
async (config) => {
|
||||
const file = path_1.default.join(config.modRequest.platformProjectRoot, "Podfile");
|
||||
const contents = await fs_1.promises.readFile(file, "utf8");
|
||||
await fs_1.promises.writeFile(file, addCocoaPodsImport(contents), "utf-8");
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
exports.withCocoaPodsImport = withCocoaPodsImport;
|
||||
function addCocoaPodsImport(src) {
|
||||
return generateCode_1.mergeContents({
|
||||
tag: `ffmpeg-kit-react-native-import`,
|
||||
src,
|
||||
newSrc: ` pod 'ffmpeg-kit-react-native', :subspecs => podfile_properties['ffmpeg-kit-react-native.subspecs'] || [], :podspec => File.join(File.dirname(\`node --print "require.resolve('ffmpeg-kit-react-native/package.json')"\`), "ffmpeg-kit-react-native.podspec")`,
|
||||
anchor: /use_native_modules/,
|
||||
// We can't go after the use_native_modules block because it might have parameters, causing it to be multi-line (see react-native template).
|
||||
offset: 0,
|
||||
comment: "#",
|
||||
}).contents;
|
||||
}
|
||||
exports.addCocoaPodsImport = addCocoaPodsImport;
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
declare type Package = "min" | "min-gpl" | "https" | "https-gpl" | "audio" | "video" | "full" | "full-gpl";
|
||||
export declare type Props = {
|
||||
package?: Package;
|
||||
ios?: {
|
||||
package?: Package;
|
||||
};
|
||||
android?: {
|
||||
package?: Package;
|
||||
};
|
||||
};
|
||||
export {};
|
||||
@@ -1,43 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withAndroidFFMPEGPackage_1 = require("./withAndroidFFMPEGPackage");
|
||||
const withBuildScriptExtMinimumVersion_1 = require("./withBuildScriptExtMinimumVersion");
|
||||
const withCocoaPodsImport_1 = require("./withCocoaPodsImport");
|
||||
const withIosDeploymentTarget_1 = require("./withIosDeploymentTarget");
|
||||
let pkg = {
|
||||
name: "ffmpeg-kit-react-native",
|
||||
};
|
||||
try {
|
||||
pkg = require("ffmpeg-kit-react-native/package.json");
|
||||
}
|
||||
catch (_a) {
|
||||
// empty catch block
|
||||
}
|
||||
const withFFMPEG = (config, _props) => {
|
||||
var _a, _b;
|
||||
const props = _props || {};
|
||||
const iosPackage = ((_a = props.ios) === null || _a === void 0 ? void 0 : _a.package) || props.package;
|
||||
const androidPackage = ((_b = props.android) === null || _b === void 0 ? void 0 : _b.package) || props.package;
|
||||
return config_plugins_1.withPlugins(config, [
|
||||
// iOS
|
||||
[withCocoaPodsImport_1.withPodfilePropertiesPackage, iosPackage],
|
||||
[
|
||||
withIosDeploymentTarget_1.withIosDeploymentTarget,
|
||||
// https://github.com/tanersener/ffmpeg-kit/tree/main/react-native#211-package-names
|
||||
{ deploymentTarget: "12.1" },
|
||||
],
|
||||
withCocoaPodsImport_1.withCocoaPodsImport,
|
||||
// Android
|
||||
// Set min SDK Version to 24.
|
||||
[
|
||||
withBuildScriptExtMinimumVersion_1.withBuildScriptExtMinimumVersion,
|
||||
{
|
||||
name: "minSdkVersion",
|
||||
minVersion: 24,
|
||||
},
|
||||
],
|
||||
[withAndroidFFMPEGPackage_1.withAndroidFFMPEGPackage, androidPackage],
|
||||
]);
|
||||
};
|
||||
module.exports = config_plugins_1.createRunOncePlugin(withFFMPEG, pkg.name, pkg.version);
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
import { ConfigPlugin, XcodeProject } from "@expo/config-plugins";
|
||||
declare type IosDeploymentTargetConfigPlugin = ConfigPlugin<{
|
||||
deploymentTarget: string;
|
||||
}>;
|
||||
export declare const withIosDeploymentTarget: IosDeploymentTargetConfigPlugin;
|
||||
export declare function updateDeploymentTargetPodfile(contents: string, deploymentTarget: string): string;
|
||||
export declare function updateDeploymentTargetXcodeProject(project: XcodeProject, deploymentTarget: string): XcodeProject;
|
||||
export {};
|
||||
@@ -1,61 +0,0 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.updateDeploymentTargetXcodeProject = exports.updateDeploymentTargetPodfile = exports.withIosDeploymentTarget = void 0;
|
||||
// Copied from https://github.com/expo/expo-cli/blob/main/packages/install-expo-modules/src/plugins/ios/withIosDeploymentTarget.ts
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const fs_1 = __importDefault(require("fs"));
|
||||
const path_1 = __importDefault(require("path"));
|
||||
const semver_1 = __importDefault(require("semver"));
|
||||
const withIosDeploymentTarget = (config, props) => {
|
||||
config = withIosDeploymentTargetPodfile(config, props);
|
||||
config = withIosDeploymentTargetXcodeProject(config, props);
|
||||
return config;
|
||||
};
|
||||
exports.withIosDeploymentTarget = withIosDeploymentTarget;
|
||||
const withIosDeploymentTargetPodfile = (config, props) => {
|
||||
return config_plugins_1.withDangerousMod(config, [
|
||||
"ios",
|
||||
async (config) => {
|
||||
const podfile = path_1.default.join(config.modRequest.platformProjectRoot, "Podfile");
|
||||
let contents = await fs_1.default.promises.readFile(podfile, "utf8");
|
||||
contents = updateDeploymentTargetPodfile(contents, props.deploymentTarget);
|
||||
await fs_1.default.promises.writeFile(podfile, contents);
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
function updateDeploymentTargetPodfile(contents, deploymentTarget) {
|
||||
return contents.replace(/^(\s*platform :ios, ['"])([\d.]+)(['"])/gm, (match, prefix, version, suffix) => {
|
||||
if (semver_1.default.lt(toSemVer(version), toSemVer(deploymentTarget))) {
|
||||
return `${prefix}${deploymentTarget}${suffix}`;
|
||||
}
|
||||
return match;
|
||||
});
|
||||
}
|
||||
exports.updateDeploymentTargetPodfile = updateDeploymentTargetPodfile;
|
||||
const withIosDeploymentTargetXcodeProject = (config, props) => {
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
config.modResults = updateDeploymentTargetXcodeProject(config.modResults, props.deploymentTarget);
|
||||
return config;
|
||||
});
|
||||
};
|
||||
function updateDeploymentTargetXcodeProject(project, deploymentTarget) {
|
||||
const configurations = project.pbxXCBuildConfigurationSection();
|
||||
// @ts-ignore
|
||||
for (const { buildSettings } of Object.values(configurations !== null && configurations !== void 0 ? configurations : {})) {
|
||||
const currDeploymentTarget = buildSettings === null || buildSettings === void 0 ? void 0 : buildSettings.IPHONEOS_DEPLOYMENT_TARGET;
|
||||
if (currDeploymentTarget &&
|
||||
semver_1.default.lt(toSemVer(currDeploymentTarget), toSemVer(deploymentTarget))) {
|
||||
buildSettings.IPHONEOS_DEPLOYMENT_TARGET = deploymentTarget;
|
||||
}
|
||||
}
|
||||
return project;
|
||||
}
|
||||
exports.updateDeploymentTargetXcodeProject = updateDeploymentTargetXcodeProject;
|
||||
function toSemVer(version) {
|
||||
var _a;
|
||||
return (_a = semver_1.default.coerce(version)) !== null && _a !== void 0 ? _a : new semver_1.default.SemVer("0.0.0");
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/ffmpeg-kit-react-native",
|
||||
"version": "0.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure FFMPEG on prebuild",
|
||||
"main": "build/withFFMPEG.js",
|
||||
"types": "build/withFFMPEG.d.ts",
|
||||
|
||||
-89
@@ -1,89 +0,0 @@
|
||||
import { WarningAggregator } from "@expo/config-plugins";
|
||||
import { setMinBuildScriptExtVersion } from "../withBuildScriptExtMinimumVersion";
|
||||
|
||||
const EXAMPLE_PROJECT_BUILD_GRADLE = `
|
||||
buildscript {
|
||||
ext {
|
||||
buildToolsVersion = "29.0.3"
|
||||
minSdkVersion = 21
|
||||
compileSdkVersion = 30
|
||||
targetSdkVersion = 30
|
||||
oddFormat = 30.2
|
||||
}
|
||||
repositories {
|
||||
}
|
||||
dependencies {
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
maven {
|
||||
// Android JSC is installed from npm
|
||||
url(new File(["node", "--print", "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), "../dist"))
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
describe(setMinBuildScriptExtVersion, () => {
|
||||
beforeEach(() => {
|
||||
// @ts-ignore: jest
|
||||
// eslint-disable-next-line import/namespace
|
||||
WarningAggregator.addWarningAndroid = jest.fn();
|
||||
});
|
||||
|
||||
it(`sets the minSdkVersion in build.gradle if minSdkVersion is given`, () => {
|
||||
expect(
|
||||
setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
|
||||
name: "minSdkVersion",
|
||||
minVersion: 22,
|
||||
})
|
||||
).toMatch(/minSdkVersion = 22/);
|
||||
expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it(`sets the oddFormat in build.gradle if oddFormat is given`, () => {
|
||||
expect(
|
||||
setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
|
||||
name: "oddFormat",
|
||||
minVersion: 30.3,
|
||||
})
|
||||
).toMatch(/oddFormat = 30\.3/);
|
||||
expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
|
||||
});
|
||||
it(`does not change the compileSdkVersion in build.gradle if compileSdkVersion is lower than the existing value`, () => {
|
||||
expect(
|
||||
setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
|
||||
name: "compileSdkVersion",
|
||||
minVersion: 12,
|
||||
})
|
||||
).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
|
||||
expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
|
||||
});
|
||||
it(`warns when it cannot find the requested value`, () => {
|
||||
expect(
|
||||
setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
|
||||
name: "foobar",
|
||||
minVersion: 12,
|
||||
})
|
||||
).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
|
||||
expect(WarningAggregator.addWarningAndroid).toBeCalledWith(
|
||||
"withBuildScriptExtVersion",
|
||||
'Cannot set minimum buildscript.ext.foobar version because the property "foobar" cannot be found or does not have a numeric value.'
|
||||
);
|
||||
});
|
||||
it(`does warns when targeting a property with a string value`, () => {
|
||||
expect(
|
||||
setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
|
||||
name: "buildToolsVersion",
|
||||
minVersion: 12,
|
||||
})
|
||||
).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
|
||||
expect(WarningAggregator.addWarningAndroid).toBeCalledWith(
|
||||
"withBuildScriptExtVersion",
|
||||
'Cannot set minimum buildscript.ext.buildToolsVersion version because the property "buildToolsVersion" cannot be found or does not have a numeric value.'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copied from https://github.com/expo/expo-cli/blob/main/packages/config-plugins/src/android/Version.ts
|
||||
|
||||
import {
|
||||
ConfigPlugin,
|
||||
WarningAggregator,
|
||||
withProjectBuildGradle,
|
||||
} from "@expo/config-plugins";
|
||||
|
||||
/** Sets a numeric version for a value in the project.gradle buildscript.ext object to be at least the provided props.minVersion, if the existing value is greater then no change will be made. */
|
||||
export const withBuildScriptExtMinimumVersion: ConfigPlugin<{
|
||||
name: string;
|
||||
minVersion: number;
|
||||
}> = (config, props) => {
|
||||
return withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = setMinBuildScriptExtVersion(
|
||||
config.modResults.contents,
|
||||
props
|
||||
);
|
||||
} else {
|
||||
WarningAggregator.addWarningAndroid(
|
||||
"withBuildScriptExtVersion",
|
||||
`Cannot automatically configure project build.gradle if it's not groovy`
|
||||
);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
|
||||
export function setMinBuildScriptExtVersion(
|
||||
buildGradle: string,
|
||||
{ name, minVersion }: { name: string; minVersion: number }
|
||||
) {
|
||||
const regex = new RegExp(`(${name}\\s?=\\s?)(\\d+(?:\\.\\d+)?)`);
|
||||
const currentVersion = buildGradle.match(regex)?.[2];
|
||||
if (!currentVersion) {
|
||||
WarningAggregator.addWarningAndroid(
|
||||
"withBuildScriptExtVersion",
|
||||
`Cannot set minimum buildscript.ext.${name} version because the property "${name}" cannot be found or does not have a numeric value.`
|
||||
);
|
||||
// TODO: Maybe just add the property...
|
||||
return buildGradle;
|
||||
}
|
||||
|
||||
const currentVersionNum = Number(currentVersion);
|
||||
return buildGradle.replace(
|
||||
regex,
|
||||
`$1${Math.max(minVersion, currentVersionNum)}`
|
||||
);
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
import {
|
||||
AndroidConfig,
|
||||
ConfigPlugin,
|
||||
createRunOncePlugin,
|
||||
withPlugins,
|
||||
} from "@expo/config-plugins";
|
||||
|
||||
import { withAndroidFFMPEGPackage } from "./withAndroidFFMPEGPackage";
|
||||
import { withBuildScriptExtMinimumVersion } from "./withBuildScriptExtMinimumVersion";
|
||||
import {
|
||||
withCocoaPodsImport,
|
||||
withPodfilePropertiesPackage,
|
||||
@@ -56,7 +56,7 @@ const withFFMPEG: ConfigPlugin<void | Props> = (config, _props) => {
|
||||
|
||||
// Set min SDK Version to 24.
|
||||
[
|
||||
withBuildScriptExtMinimumVersion,
|
||||
AndroidConfig.Version.withBuildScriptExtMinimumVersion,
|
||||
{
|
||||
name: "minSdkVersion",
|
||||
minVersion: 24,
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
### @config-plugins/ios-stickers [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* git ignore build folders ([#59](https://github.com/expo/config-plugins/issues/59)) ([d6050be](https://github.com/expo/config-plugins/commit/d6050beb2a5c68dc59287c27ec388c2002ec7904))
|
||||
|
||||
### @config-plugins/ios-stickers [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
|
||||
### Documentation changes
|
||||
|
||||
* **ios-stickers:** add doc block ([#55](https://github.com/expo/config-plugins/issues/55)) ([c904bc6](https://github.com/expo/config-plugins/commit/c904bc6a5f410645696a0356b5c188b94f80c231))
|
||||
|
||||
## @config-plugins/ios-stickers 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
+1
@@ -1,4 +1,5 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
/** Dangerously applies sticker assets to the iOS project. */
|
||||
export declare const withStickerAssets: ConfigPlugin<{
|
||||
icon?: string;
|
||||
size: string;
|
||||
|
||||
@@ -44,6 +44,7 @@ function createSticker({ stickerpackPath, name, imageBuffer, extension, accessib
|
||||
name: stickerName,
|
||||
};
|
||||
}
|
||||
/** Dangerously applies sticker assets to the iOS project. */
|
||||
const withStickerAssets = (config, { stickers, icon, size }) => {
|
||||
// Default to using the app icon
|
||||
if (!icon) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/ios-stickers",
|
||||
"version": "0.0.4",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure iOS iMessage stickers",
|
||||
"main": "build/withStickerPack.js",
|
||||
"types": "build/withStickerPack.d.ts",
|
||||
|
||||
@@ -68,6 +68,7 @@ function createSticker({
|
||||
};
|
||||
}
|
||||
|
||||
/** Dangerously applies sticker assets to the iOS project. */
|
||||
export const withStickerAssets: ConfigPlugin<{
|
||||
icon?: string;
|
||||
size: string;
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-adjust [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-adjust 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare const _default: ConfigPlugin<void | {
|
||||
targetAndroid12?: boolean | undefined;
|
||||
}>;
|
||||
export default _default;
|
||||
-92
@@ -1,92 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
const withXcodeLinkBinaryWithLibraries = (config, { library, status }) => {
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
const options = status === "optional" ? { weak: true } : {};
|
||||
const target = config_plugins_1.IOSConfig.XcodeUtils.getApplicationNativeTarget({
|
||||
project: config.modResults,
|
||||
projectName: config.modRequest.projectName,
|
||||
});
|
||||
config.modResults.addFramework(library, {
|
||||
target: target.uuid,
|
||||
...options,
|
||||
});
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const addAndroidPackagingOptions = (src) => {
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-play-services-analytics",
|
||||
src,
|
||||
newSrc: `
|
||||
implementation 'com.google.android.gms:play-services-analytics:18.0.0'
|
||||
implementation 'com.android.installreferrer:installreferrer:2.2'
|
||||
`,
|
||||
anchor: /dependencies(?:\s+)?\{/,
|
||||
// Inside the dependencies block.
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
};
|
||||
const withGradle = (config) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addAndroidPackagingOptions(config.modResults.contents).contents;
|
||||
}
|
||||
else {
|
||||
throw new Error("Cannot add Play Services maven gradle because the project build.gradle is not groovy");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
/**
|
||||
* Apply react-native-adjust configuration for Expo SDK +44 projects.
|
||||
*/
|
||||
const withAdjustPlugin = (config, _props) => {
|
||||
const props = _props || {};
|
||||
config = withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "iAd.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "AdServices.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "AdSupport.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "StoreKit.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "AppTrackingTransparency.framework",
|
||||
status: "optional",
|
||||
});
|
||||
if (props.targetAndroid12) {
|
||||
config = config_plugins_1.AndroidConfig.Version.withBuildScriptExtMinimumVersion(config, {
|
||||
name: "compileSdkVersion",
|
||||
minVersion: 31,
|
||||
});
|
||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||
"com.google.android.gms.permission.AD_ID",
|
||||
]);
|
||||
}
|
||||
config = withGradle(config);
|
||||
// Return the modified config.
|
||||
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-adjust` to a future
|
||||
// upstream plugin in `react-native-adjust`
|
||||
name: "react-native-adjust",
|
||||
// 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(withAdjustPlugin, pkg.name, pkg.version);
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-adjust",
|
||||
"version": "0.0.1",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure Adjust SDK on prebuild",
|
||||
"main": "build/withReactNativeAdjust.js",
|
||||
"types": "build/withReactNativeAdjust.d.ts",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-ble-plx [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-ble-plx 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
import { BackgroundMode } from "./withBLEBackgroundModes";
|
||||
export { BackgroundMode };
|
||||
declare const _default: ConfigPlugin<void | {
|
||||
isBackgroundEnabled?: boolean | undefined;
|
||||
modes?: BackgroundMode[] | undefined;
|
||||
bluetoothAlwaysPermission?: string | false | undefined;
|
||||
bluetoothPeripheralPermission?: string | false | undefined;
|
||||
}>;
|
||||
export default _default;
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
"use strict";
|
||||
/* eslint-disable flowtype/no-types-missing-file-annotation */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BackgroundMode = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withBLEAndroidManifest_1 = require("./withBLEAndroidManifest");
|
||||
const withBLEBackgroundModes_1 = require("./withBLEBackgroundModes");
|
||||
Object.defineProperty(exports, "BackgroundMode", { enumerable: true, get: function () { return withBLEBackgroundModes_1.BackgroundMode; } });
|
||||
const withBluetoothPermissions_1 = require("./withBluetoothPermissions");
|
||||
const pkg = { name: "react-native-ble-plx", version: "UNVERSIONED" }; //require('react-native-ble-plx/package.json')
|
||||
/**
|
||||
* Apply BLE configuration for Expo SDK 42 projects.
|
||||
*/
|
||||
const withBLE = (config, props = {}) => {
|
||||
var _a;
|
||||
const _props = props || {};
|
||||
const isBackgroundEnabled = (_a = _props.isBackgroundEnabled) !== null && _a !== void 0 ? _a : false;
|
||||
// iOS
|
||||
config = withBluetoothPermissions_1.withBluetoothPermissions(config, _props);
|
||||
config = withBLEBackgroundModes_1.withBLEBackgroundModes(config, _props.modes || []);
|
||||
// Android
|
||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||
"android.permission.BLUETOOTH",
|
||||
"android.permission.BLUETOOTH_ADMIN",
|
||||
]);
|
||||
config = withBLEAndroidManifest_1.withBLEAndroidManifest(config, { isBackgroundEnabled });
|
||||
return config;
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withBLE, pkg.name, pkg.version);
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
import { ConfigPlugin, AndroidConfig } from "@expo/config-plugins";
|
||||
declare type InnerManifest = AndroidConfig.Manifest.AndroidManifest['manifest'];
|
||||
declare type ManifestPermission = InnerManifest["permission"];
|
||||
declare type AndroidManifest = {
|
||||
manifest: InnerManifest & {
|
||||
permission?: ManifestPermission;
|
||||
"uses-permission"?: InnerManifest["uses-permission"];
|
||||
"uses-permission-sdk-23"?: InnerManifest["uses-permission"];
|
||||
"uses-feature"?: InnerManifest["uses-feature"];
|
||||
};
|
||||
};
|
||||
export declare const withBLEAndroidManifest: ConfigPlugin<{
|
||||
isBackgroundEnabled: boolean;
|
||||
}>;
|
||||
export declare function addFineControlPermissionToManifest(androidManifest: AndroidManifest): AndroidManifest;
|
||||
export declare function addBLEHardwareFeatureToManifest(androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
|
||||
export {};
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
"use strict";
|
||||
/* eslint-disable flowtype/no-types-missing-file-annotation */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addBLEHardwareFeatureToManifest = exports.addFineControlPermissionToManifest = exports.withBLEAndroidManifest = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withBLEAndroidManifest = (config, { isBackgroundEnabled }) => {
|
||||
return config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
config.modResults = addFineControlPermissionToManifest(config.modResults);
|
||||
if (isBackgroundEnabled) {
|
||||
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withBLEAndroidManifest = withBLEAndroidManifest;
|
||||
function addFineControlPermissionToManifest(androidManifest) {
|
||||
var _a;
|
||||
// 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"])) {
|
||||
androidManifest.manifest["uses-permission-sdk-23"] = [];
|
||||
}
|
||||
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({
|
||||
$: {
|
||||
"android:name": "android.permission.ACCESS_FINE_LOCATION",
|
||||
},
|
||||
});
|
||||
}
|
||||
return androidManifest;
|
||||
}
|
||||
exports.addFineControlPermissionToManifest = addFineControlPermissionToManifest;
|
||||
// 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) {
|
||||
var _a;
|
||||
// Add `<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>` to the AndroidManifest.xml
|
||||
if (!Array.isArray(androidManifest.manifest["uses-feature"])) {
|
||||
androidManifest.manifest["uses-feature"] = [];
|
||||
}
|
||||
if (!androidManifest.manifest["uses-feature"].find((item) => item.$["android:name"] === "android.hardware.bluetooth_le")) {
|
||||
(_a = androidManifest.manifest["uses-feature"]) === null || _a === void 0 ? void 0 : _a.push({
|
||||
$: {
|
||||
"android:name": "android.hardware.bluetooth_le",
|
||||
"android:required": "true",
|
||||
},
|
||||
});
|
||||
}
|
||||
return androidManifest;
|
||||
}
|
||||
exports.addBLEHardwareFeatureToManifest = addBLEHardwareFeatureToManifest;
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
import { ConfigPlugin } from '@expo/config-plugins';
|
||||
export declare enum BackgroundMode {
|
||||
Central = "central",
|
||||
Peripheral = "peripheral"
|
||||
}
|
||||
/**
|
||||
* Append `UIBackgroundModes` to the `Info.plist`.
|
||||
*/
|
||||
export declare const withBLEBackgroundModes: ConfigPlugin<BackgroundMode[]>;
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withBLEBackgroundModes = exports.BackgroundMode = void 0;
|
||||
/* eslint-disable flowtype/no-types-missing-file-annotation */
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
var BackgroundMode;
|
||||
(function (BackgroundMode) {
|
||||
BackgroundMode["Central"] = "central";
|
||||
BackgroundMode["Peripheral"] = "peripheral";
|
||||
})(BackgroundMode = exports.BackgroundMode || (exports.BackgroundMode = {}));
|
||||
function ensureKey(arr, key) {
|
||||
if (!arr.find(mode => mode === key)) {
|
||||
arr.push(key);
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
const centralKey = 'bluetooth-central';
|
||||
const peripheralKey = 'bluetooth-peripheral';
|
||||
/**
|
||||
* Append `UIBackgroundModes` to the `Info.plist`.
|
||||
*/
|
||||
const withBLEBackgroundModes = (c, modes) => {
|
||||
return config_plugins_1.withInfoPlist(c, config => {
|
||||
if (!Array.isArray(config.modResults.UIBackgroundModes)) {
|
||||
config.modResults.UIBackgroundModes = [];
|
||||
}
|
||||
if (modes.includes(BackgroundMode.Central)) {
|
||||
config.modResults.UIBackgroundModes = ensureKey(config.modResults.UIBackgroundModes, centralKey);
|
||||
}
|
||||
if (modes.includes(BackgroundMode.Peripheral)) {
|
||||
config.modResults.UIBackgroundModes = ensureKey(config.modResults.UIBackgroundModes, peripheralKey);
|
||||
}
|
||||
// Prevent empty array
|
||||
if (!config.modResults.UIBackgroundModes.length) {
|
||||
delete config.modResults.UIBackgroundModes;
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withBLEBackgroundModes = withBLEBackgroundModes;
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withBluetoothPermissions: ConfigPlugin<{
|
||||
bluetoothAlwaysPermission?: string | false;
|
||||
bluetoothPeripheralPermission?: string | false;
|
||||
}>;
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withBluetoothPermissions = void 0;
|
||||
/* eslint-disable flowtype/no-types-missing-file-annotation */
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const BLUETOOTH_ALWAYS = "Allow $(PRODUCT_NAME) to connect to bluetooth devices";
|
||||
const BLUETOOTH_PERIPHERAL_USAGE = "Allow $(PRODUCT_NAME) to connect to bluetooth devices";
|
||||
const withBluetoothPermissions = (c, { bluetoothAlwaysPermission, bluetoothPeripheralPermission } = {}) => {
|
||||
return config_plugins_1.withInfoPlist(c, (config) => {
|
||||
if (bluetoothAlwaysPermission !== false) {
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription =
|
||||
bluetoothAlwaysPermission ||
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription ||
|
||||
BLUETOOTH_ALWAYS;
|
||||
}
|
||||
if (bluetoothPeripheralPermission !== false) {
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription =
|
||||
bluetoothPeripheralPermission ||
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription ||
|
||||
BLUETOOTH_PERIPHERAL_USAGE;
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withBluetoothPermissions = withBluetoothPermissions;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-ble-plx",
|
||||
"version": "0.0.2",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure react-native-ble-plx on prebuild",
|
||||
"main": "build/withBLE.js",
|
||||
"types": "build/withBLE.d.ts",
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
### @config-plugins/react-native-blob-util [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
### @config-plugins/react-native-blob-util [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ci:** use correct internal versions ([ab8076a](https://github.com/expo/config-plugins/commit/ab8076adf51e9ba0439eba60b153d729a0996b8d))
|
||||
|
||||
## @config-plugins/react-native-blob-util 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
import { AndroidConfig, ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare function appendDownloadCompleteAction(androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
|
||||
declare const _default: ConfigPlugin<void>;
|
||||
export default _default;
|
||||
-59
@@ -1,59 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.appendDownloadCompleteAction = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
let pkg = {
|
||||
name: "react-native-blob-util",
|
||||
};
|
||||
try {
|
||||
pkg = require("react-native-blob-util/package.json");
|
||||
}
|
||||
catch (_a) {
|
||||
// empty catch block
|
||||
}
|
||||
function appendDownloadCompleteAction(androidManifest) {
|
||||
var _a, _b;
|
||||
if (!Array.isArray(androidManifest.manifest.application)) {
|
||||
return androidManifest;
|
||||
}
|
||||
for (const application of androidManifest.manifest.application) {
|
||||
for (const activity of application.activity || []) {
|
||||
if (((_a = activity === null || activity === void 0 ? void 0 : activity.$) === null || _a === void 0 ? void 0 : _a["android:launchMode"]) === "singleTask") {
|
||||
for (const intentFilter of activity["intent-filter"] || []) {
|
||||
const isLauncher = (_b = intentFilter.category) === null || _b === void 0 ? void 0 : _b.some((action) => action.$["android:name"] === "android.intent.category.LAUNCHER");
|
||||
if (!isLauncher)
|
||||
continue;
|
||||
intentFilter.action = intentFilter.action || [];
|
||||
const hasDownloadCompleteAction = intentFilter.action.some((action) => action.$["android:name"] ===
|
||||
"android.intent.action.DOWNLOAD_COMPLETE");
|
||||
if (!hasDownloadCompleteAction) {
|
||||
intentFilter.action.push({
|
||||
$: {
|
||||
"android:name": "android.intent.action.DOWNLOAD_COMPLETE",
|
||||
},
|
||||
});
|
||||
return androidManifest;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return androidManifest;
|
||||
}
|
||||
exports.appendDownloadCompleteAction = appendDownloadCompleteAction;
|
||||
const withReactNativeBlobUtil = (config) => {
|
||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||
"android.permission.READ_EXTERNAL_STORAGE",
|
||||
"android.permission.WRITE_EXTERNAL_STORAGE",
|
||||
"android.permission.DOWNLOAD_WITHOUT_NOTIFICATION",
|
||||
// Wifi-only mode.
|
||||
"android.permission.ACCESS_NETWORK_STATE",
|
||||
]);
|
||||
config = config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
config.modResults = appendDownloadCompleteAction(config.modResults);
|
||||
return config;
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withReactNativeBlobUtil, pkg.name, pkg.version);
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-blob-util",
|
||||
"version": "0.0.0",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure react-native-blob-util on prebuild",
|
||||
"main": "build/withReactNativeBlobUtil.js",
|
||||
"types": "build/withReactNativeBlobUtil.d.ts",
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
### @config-plugins/react-native-branch [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-branch 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* create react-native-branch plugin ([0b06baa](https://github.com/expo/config-plugins/commit/0b06baa2b486c5e02d433a4ac785960934f403b9))
|
||||
* support for universalLinkDomains ([01ca879](https://github.com/expo/config-plugins/commit/01ca879ca3f6cebac1177d74969337819a5fc72d))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* added expo-module.config.json to files ([57d589b](https://github.com/expo/config-plugins/commit/57d589ba8ad60e057b34ad7b2f404f67e85896ab))
|
||||
* fixed MATCH_INIT for SDKv44 ([904741a](https://github.com/expo/config-plugins/commit/904741a3bdb02f5bb76ebcf44131f1698dad0831))
|
||||
* fixed missing files when publish ([ebb8666](https://github.com/expo/config-plugins/commit/ebb86666d6e61a70838048839b144c7217886d73))
|
||||
* removed proguard-rules.pro edit step ([e1159b4](https://github.com/expo/config-plugins/commit/e1159b4021ab722cf3998479e6a459374bdb5075))
|
||||
* updates from code-reviews ([597ffc3](https://github.com/expo/config-plugins/commit/597ffc3bd76517ac96c39b77d8b76e6aee2609dd))
|
||||
* **android:** added `onNewIntent` handler ([31ed997](https://github.com/expo/config-plugins/commit/31ed9978ca6c0a079341b5b4be5479a5e5633f79))
|
||||
* rename module ([7f0dd05](https://github.com/expo/config-plugins/commit/7f0dd05fdc15293b84606cb000bcd7321b418de8))
|
||||
* respect old config from expo-branch ([d0e0186](https://github.com/expo/config-plugins/commit/d0e018601c09c0e92191a4eb2998ab0e6fa1c6ec))
|
||||
|
||||
|
||||
### Code Refactoring
|
||||
|
||||
* **android:** migrate to new expo modules system ([1ac233e](https://github.com/expo/config-plugins/commit/1ac233eb432eaeeb7ead6723a4a232f86cfc8e50))
|
||||
* **ios:** migrate to new expo modules system ([a98a6e0](https://github.com/expo/config-plugins/commit/a98a6e022fc06f8b9c996e4e2b4a1d7aac830d8a))
|
||||
* update plugin to use CodeMod ([ae66cac](https://github.com/expo/config-plugins/commit/ae66cac141847e33add62cc30375620e1a5cc1d0))
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* apply suggestions from code review ([0ccc227](https://github.com/expo/config-plugins/commit/0ccc22771d5ecc97da7720c362ecf90a76e5de1c))
|
||||
* cleanup android gitignore ([c88609a](https://github.com/expo/config-plugins/commit/c88609a8666be1b4137a3694bd844bb6a0f1ec12))
|
||||
* latest cleanup ([ef50c05](https://github.com/expo/config-plugins/commit/ef50c05892b965e2ccd70418da962f2c3d96ab2e))
|
||||
* rename files to avoid possible conflict ([d0b32ce](https://github.com/expo/config-plugins/commit/d0b32ce4a1c28060e61e7109f59be215c5f92f14))
|
||||
* rename module ([71e429b](https://github.com/expo/config-plugins/commit/71e429b77fca05953e94636b31e9b1b8da2ddcb6))
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
export declare type ConfigData = {
|
||||
apiKey?: string;
|
||||
iosAppDomain?: string;
|
||||
iosUniversalLinkDomains?: string[];
|
||||
};
|
||||
-2
@@ -1,2 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
import type { ConfigPlugin } from "@expo/config-plugins";
|
||||
import type { ConfigData } from "./types";
|
||||
declare const _default: ConfigPlugin<ConfigData>;
|
||||
export default _default;
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withBranchAndroid_1 = require("./withBranchAndroid");
|
||||
const withBranchIOS_1 = require("./withBranchIOS");
|
||||
const withBranch = (config, { apiKey, iosAppDomain, iosUniversalLinkDomains } = {}) => {
|
||||
config = withBranchAndroid_1.withBranchAndroid(config, { apiKey });
|
||||
config = withBranchIOS_1.withBranchIOS(config, {
|
||||
apiKey,
|
||||
iosAppDomain,
|
||||
iosUniversalLinkDomains,
|
||||
});
|
||||
return config;
|
||||
};
|
||||
let pkg = {
|
||||
name: "react-native-branch",
|
||||
};
|
||||
try {
|
||||
const branchPkg = require("react-native-branch/package.json");
|
||||
pkg = branchPkg;
|
||||
}
|
||||
catch (_a) { }
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withBranch, pkg.name, pkg.version);
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
import { AndroidConfig } from "@expo/config-plugins";
|
||||
import type { ConfigPlugin } from "@expo/config-plugins";
|
||||
import type { ExpoConfig } from "@expo/config-types";
|
||||
export declare function getBranchApiKey(config: ExpoConfig): string | null;
|
||||
export declare function setBranchApiKey(apiKey: string, androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
|
||||
export declare const withBranchAndroid: ConfigPlugin<{
|
||||
apiKey?: string;
|
||||
}>;
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withBranchAndroid = exports.setBranchApiKey = exports.getBranchApiKey = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const { addMetaDataItemToMainApplication, getMainApplicationOrThrow, removeMetaDataItemFromMainApplication, } = config_plugins_1.AndroidConfig.Manifest;
|
||||
const META_BRANCH_KEY = "io.branch.sdk.BranchKey";
|
||||
function getBranchApiKey(config) {
|
||||
var _a, _b, _c, _d;
|
||||
return (_d = (_c = (_b = (_a = config.android) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.branch) === null || _c === void 0 ? void 0 : _c.apiKey) !== null && _d !== void 0 ? _d : null;
|
||||
}
|
||||
exports.getBranchApiKey = getBranchApiKey;
|
||||
function setBranchApiKey(apiKey, androidManifest) {
|
||||
const mainApplication = getMainApplicationOrThrow(androidManifest);
|
||||
if (apiKey) {
|
||||
// If the item exists, add it back
|
||||
addMetaDataItemToMainApplication(mainApplication, META_BRANCH_KEY, apiKey);
|
||||
}
|
||||
else {
|
||||
// Remove any existing item
|
||||
removeMetaDataItemFromMainApplication(mainApplication, META_BRANCH_KEY);
|
||||
}
|
||||
return androidManifest;
|
||||
}
|
||||
exports.setBranchApiKey = setBranchApiKey;
|
||||
const withBranchAndroid = (config, data) => {
|
||||
var _a;
|
||||
const apiKey = (_a = data.apiKey) !== null && _a !== void 0 ? _a : getBranchApiKey(config);
|
||||
if (!apiKey) {
|
||||
throw new Error("Branch API key is required");
|
||||
}
|
||||
config = config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
config.modResults = setBranchApiKey(apiKey, config.modResults);
|
||||
return config;
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.withBranchAndroid = withBranchAndroid;
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
import type { ConfigPlugin, InfoPlist } from "@expo/config-plugins";
|
||||
import type { ExpoConfig } from "@expo/config-types";
|
||||
import type { ConfigData } from "./types";
|
||||
export declare function getBranchApiKey(config: Pick<ExpoConfig, "ios">): string | null;
|
||||
export declare function setBranchApiKey(apiKey: string, infoPlist: InfoPlist): InfoPlist;
|
||||
export declare const withBranchIOS: ConfigPlugin<ConfigData>;
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withBranchIOS = exports.setBranchApiKey = exports.getBranchApiKey = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
function getBranchApiKey(config) {
|
||||
var _a, _b, _c, _d;
|
||||
return (_d = (_c = (_b = (_a = config.ios) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.branch) === null || _c === void 0 ? void 0 : _c.apiKey) !== null && _d !== void 0 ? _d : null;
|
||||
}
|
||||
exports.getBranchApiKey = getBranchApiKey;
|
||||
function setBranchApiKey(apiKey, infoPlist) {
|
||||
if (apiKey === null) {
|
||||
return infoPlist;
|
||||
}
|
||||
return {
|
||||
...infoPlist,
|
||||
branch_key: {
|
||||
live: apiKey,
|
||||
},
|
||||
};
|
||||
}
|
||||
exports.setBranchApiKey = setBranchApiKey;
|
||||
const withBranchIOS = (config, data) => {
|
||||
var _a;
|
||||
// Ensure object exist
|
||||
if (!config.ios) {
|
||||
config.ios = {};
|
||||
}
|
||||
const apiKey = (_a = data.apiKey) !== null && _a !== void 0 ? _a : getBranchApiKey(config);
|
||||
if (!apiKey) {
|
||||
throw new Error("Branch API key is required");
|
||||
}
|
||||
// Update the infoPlist with the branch key and branch domain
|
||||
config = config_plugins_1.withInfoPlist(config, (config) => {
|
||||
config.modResults = setBranchApiKey(apiKey, config.modResults);
|
||||
if (data.iosAppDomain) {
|
||||
config.modResults.branch_app_domain = data.iosAppDomain;
|
||||
}
|
||||
else {
|
||||
delete config.modResults.branch_app_domain;
|
||||
}
|
||||
if (data.iosUniversalLinkDomains) {
|
||||
config.modResults.branch_universal_link_domains =
|
||||
data.iosUniversalLinkDomains;
|
||||
}
|
||||
else {
|
||||
delete config.modResults.branch_universal_link_domains;
|
||||
}
|
||||
return config;
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.withBranchIOS = withBranchIOS;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-branch",
|
||||
"version": "0.0.1",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure react-native-branch on prebuild",
|
||||
"author": "650 Industries, Inc.",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-callkeep [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-callkeep 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-2
@@ -1,2 +0,0 @@
|
||||
import { XcodeProject } from "@expo/config-plugins";
|
||||
export declare function ensureHeaderSearchPath(project: XcodeProject, file: string): void;
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ensureHeaderSearchPath = void 0;
|
||||
const COMMENT_KEY = /_comment$/;
|
||||
function unquote(str) {
|
||||
if (str)
|
||||
return str.replace(/^"(.*)"$/, "$1");
|
||||
}
|
||||
function nonComments(obj) {
|
||||
var keys = Object.keys(obj), newObj = {}, i = 0;
|
||||
for (i; i < keys.length; i++) {
|
||||
if (!COMMENT_KEY.test(keys[i])) {
|
||||
newObj[keys[i]] = obj[keys[i]];
|
||||
}
|
||||
}
|
||||
return newObj;
|
||||
}
|
||||
function ensureHeaderSearchPath(project, file) {
|
||||
const configurations = nonComments(project.pbxXCBuildConfigurationSection());
|
||||
const INHERITED = '"$(inherited)"';
|
||||
for (const config in configurations) {
|
||||
const buildSettings = configurations[config].buildSettings;
|
||||
if (unquote(buildSettings["PRODUCT_NAME"]) != project.productName)
|
||||
continue;
|
||||
if (!buildSettings["HEADER_SEARCH_PATHS"]) {
|
||||
buildSettings["HEADER_SEARCH_PATHS"] = [INHERITED];
|
||||
}
|
||||
if (!buildSettings.HEADER_SEARCH_PATHS.includes(file)) {
|
||||
buildSettings["HEADER_SEARCH_PATHS"].push(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.ensureHeaderSearchPath = ensureHeaderSearchPath;
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare const withCallkeep: ConfigPlugin;
|
||||
export declare const withXcodeLinkBinaryWithLibraries: ConfigPlugin<{
|
||||
library: string;
|
||||
status?: string;
|
||||
}>;
|
||||
export default withCallkeep;
|
||||
-110
@@ -1,110 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withXcodeLinkBinaryWithLibraries = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const ensureHeaderSearchPath_1 = require("./ensureHeaderSearchPath");
|
||||
const withCallkeepHeaderSearchPath = (config) => {
|
||||
const headerSearchPath = `"$(SRCROOT)/../node_modules/react-native-callkeep/ios/RNCallKeep"`;
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
ensureHeaderSearchPath_1.ensureHeaderSearchPath(config.modResults, headerSearchPath);
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withAndroidManifestService = (config) => {
|
||||
return config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
// <service
|
||||
// android:name="io.wazo.callkeep.VoiceConnectionService"
|
||||
// android:label="Wazo"
|
||||
// android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
|
||||
// // Use this to target android >= 11
|
||||
// android:foregroundServiceType="camera|microphone"
|
||||
// // For android < 11
|
||||
// android:foregroundServiceType="phoneCall"
|
||||
// >
|
||||
// <intent-filter>
|
||||
// <action android:name="android.telecom.ConnectionService" />
|
||||
// </intent-filter>
|
||||
// </service>;
|
||||
const app = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
|
||||
if (!Array.isArray(app.service))
|
||||
app.service = [];
|
||||
if (!app.service.find((item) => item.$["android:name"] ===
|
||||
"io.wazo.callkeep.RNCallKeepBackgroundMessagingService")) {
|
||||
app.service.push({
|
||||
$: {
|
||||
"android:name": "io.wazo.callkeep.RNCallKeepBackgroundMessagingService",
|
||||
},
|
||||
});
|
||||
}
|
||||
// TODO: Update item
|
||||
if (!app.service.find((item) => item.$["android:name"] === "io.wazo.callkeep.VoiceConnectionService")) {
|
||||
app.service.push({
|
||||
$: {
|
||||
"android:name": "io.wazo.callkeep.VoiceConnectionService",
|
||||
// @ts-ignore
|
||||
"android:label": "Wazo",
|
||||
"android:permission": "android.permission.BIND_TELECOM_CONNECTION_SERVICE",
|
||||
// Use this to target android >= 11
|
||||
// "android:foregroundServiceType": "camera|microphone",
|
||||
// For android < 11
|
||||
"android:foregroundServiceType": "phoneCall",
|
||||
},
|
||||
"intent-filter": [
|
||||
{
|
||||
action: [
|
||||
{
|
||||
$: {
|
||||
"android:name": "android.telecom.ConnectionService",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withCallkeep = (config) => {
|
||||
config = config_plugins_1.withInfoPlist(config, (config) => {
|
||||
if (!Array.isArray(config.modResults.UIBackgroundModes)) {
|
||||
config.modResults.UIBackgroundModes = [];
|
||||
}
|
||||
if (!config.modResults.UIBackgroundModes.includes("voip")) {
|
||||
config.modResults.UIBackgroundModes.push("voip");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
config = withCallkeepHeaderSearchPath(config);
|
||||
config = exports.withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "Intents.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = exports.withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "CallKit.framework",
|
||||
});
|
||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||
"android.permission.BIND_TELECOM_CONNECTION_SERVICE",
|
||||
"android.permission.FOREGROUND_SERVICE",
|
||||
"android.permission.READ_PHONE_STATE",
|
||||
"android.permission.CALL_PHONE",
|
||||
]);
|
||||
config = withAndroidManifestService(config);
|
||||
return config;
|
||||
};
|
||||
const withXcodeLinkBinaryWithLibraries = (config, { library, status }) => {
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
const options = status === "optional" ? { weak: true } : {};
|
||||
const target = config_plugins_1.IOSConfig.XcodeUtils.getApplicationNativeTarget({
|
||||
project: config.modResults,
|
||||
projectName: config.modRequest.projectName,
|
||||
});
|
||||
config.modResults.addFramework(library, {
|
||||
target: target.uuid,
|
||||
...options,
|
||||
});
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withXcodeLinkBinaryWithLibraries = withXcodeLinkBinaryWithLibraries;
|
||||
exports.default = withCallkeep;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-callkeep",
|
||||
"version": "0.0.1",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure callkeep on prebuild",
|
||||
"main": "build/withCallkeep.js",
|
||||
"types": "build/withCallkeep.d.ts",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-dynamic-app-icon [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-dynamic-app-icon 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare type IconSet = Record<string, {
|
||||
image: string;
|
||||
prerendered?: boolean;
|
||||
}>;
|
||||
declare const withDynamicIcon: ConfigPlugin<string[] | IconSet | void>;
|
||||
export default withDynamicIcon;
|
||||
-175
@@ -1,175 +0,0 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
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 folderName = "DynamicAppIcons";
|
||||
const size = 60;
|
||||
const scales = [2, 3];
|
||||
function arrayToImages(images) {
|
||||
return images.reduce((prev, curr, i) => ({ ...prev, [i]: { image: curr } }), {});
|
||||
}
|
||||
const withDynamicIcon = (config, props = {}) => {
|
||||
const _props = props || {};
|
||||
let prepped = {};
|
||||
if (Array.isArray(_props)) {
|
||||
prepped = arrayToImages(_props);
|
||||
}
|
||||
else if (_props) {
|
||||
prepped = _props;
|
||||
}
|
||||
config = withIconXcodeProject(config, { icons: prepped });
|
||||
config = withIconInfoPlist(config, { icons: prepped });
|
||||
config = withIconImages(config, { icons: prepped });
|
||||
return config;
|
||||
};
|
||||
function getIconName(name, size, scale) {
|
||||
const fileName = `${name}-Icon-${size}x${size}`;
|
||||
if (scale != null) {
|
||||
return `${fileName}@${scale}x.png`;
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
// @ts-ignore
|
||||
const pbxFile_1 = __importDefault(require("xcode/lib/pbxFile"));
|
||||
const withIconXcodeProject = (config, { icons }) => {
|
||||
return config_plugins_1.withXcodeProject(config, async (config) => {
|
||||
const groupPath = `${config.modRequest.projectName}/${folderName}`;
|
||||
const group = config_plugins_1.IOSConfig.XcodeUtils.ensureGroupRecursively(config.modResults, groupPath);
|
||||
const project = config.modResults;
|
||||
const opt = {};
|
||||
// Unlink old assets
|
||||
const groupId = Object.keys(project.hash.project.objects["PBXGroup"]).find((id) => {
|
||||
const _group = project.hash.project.objects["PBXGroup"][id];
|
||||
return _group.name === group.name;
|
||||
});
|
||||
if (!project.hash.project.objects["PBXVariantGroup"]) {
|
||||
project.hash.project.objects["PBXVariantGroup"] = {};
|
||||
}
|
||||
const variantGroupId = Object.keys(project.hash.project.objects["PBXVariantGroup"]).find((id) => {
|
||||
const _group = project.hash.project.objects["PBXVariantGroup"][id];
|
||||
return _group.name === group.name;
|
||||
});
|
||||
const children = [...(group.children || [])];
|
||||
for (const child of children) {
|
||||
const file = new pbxFile_1.default(path_1.default.join(group.name, child.comment), opt);
|
||||
file.target = opt ? opt.target : undefined;
|
||||
project.removeFromPbxBuildFileSection(file); // PBXBuildFile
|
||||
project.removeFromPbxFileReferenceSection(file); // PBXFileReference
|
||||
if (group) {
|
||||
if (groupId) {
|
||||
project.removeFromPbxGroup(file, groupId); //Group other than Resources (i.e. 'splash')
|
||||
}
|
||||
else if (variantGroupId) {
|
||||
project.removeFromPbxVariantGroup(file, variantGroupId); // PBXVariantGroup
|
||||
}
|
||||
}
|
||||
project.removeFromPbxResourcesBuildPhase(file); // PBXResourcesBuildPhase
|
||||
}
|
||||
// Link new assets
|
||||
await iterateIconsAsync({ icons }, async (key, icon, index) => {
|
||||
for (const scale of scales) {
|
||||
const iconFileName = getIconName(key, size, scale);
|
||||
if (!(group === null || group === void 0 ? void 0 : group.children.some(({ comment }) => comment === iconFileName))) {
|
||||
// Only write the file if it doesn't already exist.
|
||||
config.modResults = config_plugins_1.IOSConfig.XcodeUtils.addResourceFileToGroup({
|
||||
filepath: path_1.default.join(groupPath, iconFileName),
|
||||
groupName: groupPath,
|
||||
project: config.modResults,
|
||||
isBuildFile: true,
|
||||
verbose: true,
|
||||
});
|
||||
}
|
||||
else {
|
||||
console.log("Skipping duplicate: ", iconFileName);
|
||||
}
|
||||
}
|
||||
});
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIconInfoPlist = (config, { icons }) => {
|
||||
return config_plugins_1.withInfoPlist(config, async (config) => {
|
||||
const altIcons = {};
|
||||
await iterateIconsAsync({ icons }, async (key, icon) => {
|
||||
altIcons[key] = {
|
||||
CFBundleIconFiles: [
|
||||
// Must be a file path relative to the source root (not a icon set it seems).
|
||||
// i.e. `Bacon-Icon-60x60` when the image is `ios/somn/appIcons/[email protected]`
|
||||
getIconName(key, size),
|
||||
],
|
||||
UIPrerenderedIcon: !!icon.prerendered,
|
||||
};
|
||||
});
|
||||
function applyToPlist(key) {
|
||||
if (typeof config.modResults[key] !== "object" ||
|
||||
Array.isArray(config.modResults[key]) ||
|
||||
!config.modResults[key]) {
|
||||
config.modResults[key] = {};
|
||||
}
|
||||
// @ts-expect-error
|
||||
config.modResults[key].CFBundleAlternateIcons = altIcons;
|
||||
// @ts-expect-error
|
||||
config.modResults[key].CFBundlePrimaryIcon = {
|
||||
CFBundleIconFiles: ["AppIcon"],
|
||||
};
|
||||
}
|
||||
// Apply for both tablet and phone support
|
||||
applyToPlist("CFBundleIcons");
|
||||
applyToPlist("CFBundleIcons~ipad");
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIconImages = (config, props) => {
|
||||
return config_plugins_1.withDangerousMod(config, [
|
||||
"ios",
|
||||
async (config) => {
|
||||
await createIconsAsync(config, props);
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
async function createIconsAsync(config, { icons }) {
|
||||
const iosRoot = path_1.default.join(config.modRequest.platformProjectRoot, config.modRequest.projectName);
|
||||
// Delete all existing assets
|
||||
await fs_1.default.promises
|
||||
.rmdir(path_1.default.join(iosRoot, folderName), { recursive: true })
|
||||
.catch(() => null);
|
||||
// Ensure directory exists
|
||||
await fs_1.default.promises.mkdir(path_1.default.join(iosRoot, folderName), { recursive: true });
|
||||
// Generate new assets
|
||||
await iterateIconsAsync({ icons }, async (key, icon) => {
|
||||
for (const scale of scales) {
|
||||
const iconFileName = getIconName(key, size, scale);
|
||||
const fileName = path_1.default.join(folderName, iconFileName);
|
||||
const outputPath = path_1.default.join(iosRoot, fileName);
|
||||
const scaledSize = scale * size;
|
||||
const { source } = await image_utils_1.generateImageAsync({
|
||||
projectRoot: config.modRequest.projectRoot,
|
||||
cacheType: "react-native-dynamic-app-icon",
|
||||
}, {
|
||||
name: iconFileName,
|
||||
src: icon.image,
|
||||
removeTransparency: true,
|
||||
backgroundColor: "#ffffff",
|
||||
resizeMode: "cover",
|
||||
width: scaledSize,
|
||||
height: scaledSize,
|
||||
});
|
||||
await fs_1.default.promises.writeFile(outputPath, source);
|
||||
}
|
||||
});
|
||||
}
|
||||
async function iterateIconsAsync({ icons }, callback) {
|
||||
const entries = Object.entries(icons);
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
const [key, val] = entries[i];
|
||||
await callback(key, val, i);
|
||||
}
|
||||
}
|
||||
exports.default = withDynamicIcon;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yDAO8B;AAC9B,mDAAuD;AACvD,4CAAoB;AACpB,gDAAwB;AAExB,MAAM,UAAU,GAAG,iBAAiB,CAAC;AACrC,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAQtB,SAAS,aAAa,CAAC,MAAgB;IACrC,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EACtD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAA4C,CAC/D,MAAM,EACN,KAAK,GAAG,EAAE,EACV,EAAE;IACF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;IAE3B,IAAI,OAAO,GAAmB,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM,IAAI,MAAM,EAAE;QACjB,OAAO,GAAG,MAAM,CAAC;KAClB;IAED,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,KAAc;IAC7D,MAAM,QAAQ,GAAG,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;IAEhD,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,GAAG,QAAQ,IAAI,KAAK,OAAO,CAAC;KACpC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,aAAa;AACb,gEAAwC;AAExC,MAAM,oBAAoB,GAAwB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IACtE,OAAO,iCAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,WAAY,IAAI,UAAU,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,0BAAS,CAAC,UAAU,CAAC,sBAAsB,CACvD,MAAM,CAAC,UAAU,EACjB,SAAS,CACV,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;QAClC,MAAM,GAAG,GAAQ,EAAE,CAAC;QAEpB,oBAAoB;QAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CACxE,CAAC,EAAE,EAAE,EAAE;YACL,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QACpC,CAAC,CACF,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YACpD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;SACtD;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAChD,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAE7C,KAAK,MAAM,KAAK,IAAI,QAGjB,EAAE;YACH,MAAM,IAAI,GAAG,IAAI,iBAAO,CAAC,cAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAE3C,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;YAC5D,OAAO,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB;YACpE,IAAI,KAAK,EAAE;gBACT,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,4CAA4C;iBACxF;qBAAM,IAAI,cAAc,EAAE;oBACzB,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,kBAAkB;iBAC5E;aACF;YACD,OAAO,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB;SAC1E;QAED,kBAAkB;QAElB,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEnD,IACE,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,IAAI,CACnB,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE,CAAC,OAAO,KAAK,YAAY,CAC/D,CAAA,EACD;oBACA,mDAAmD;oBACnD,MAAM,CAAC,UAAU,GAAG,0BAAS,CAAC,UAAU,CAAC,sBAAsB,CAAC;wBAC9D,QAAQ,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;wBAC5C,SAAS,EAAE,SAAS;wBACpB,OAAO,EAAE,MAAM,CAAC,UAAU;wBAC1B,WAAW,EAAE,IAAI;wBACjB,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;iBACnD;aACF;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAwB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IACnE,OAAO,8BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,QAAQ,GAGV,EAAE,CAAC;QAEP,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACrD,QAAQ,CAAC,GAAG,CAAC,GAAG;gBACd,iBAAiB,EAAE;oBACjB,6EAA6E;oBAC7E,wFAAwF;oBACxF,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;iBACvB;gBACD,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;aACtC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS,YAAY,CAAC,GAAW;YAC/B,IACE,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAC1C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EACvB;gBACA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;aAC7B;YAED,mBAAmB;YACnB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,sBAAsB,GAAG,QAAQ,CAAC;YAEzD,mBAAmB;YACnB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,GAAG;gBAC3C,iBAAiB,EAAE,CAAC,SAAS,CAAC;aAC/B,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,YAAY,CAAC,eAAe,CAAC,CAAC;QAC9B,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAEnC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAC5D,OAAO,iCAAgB,CAAC,MAAM,EAAE;QAC9B,KAAK;QACL,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC;QAChLine truncated
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-dynamic-app-icon",
|
||||
"version": "0.0.2",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure react-native-dynamic-app-icon",
|
||||
"main": "build/index.js",
|
||||
"types": "build/index.d.ts",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-google-cast [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-google-cast 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withAndroidGoogleCast: ConfigPlugin<{
|
||||
/**
|
||||
* @default '+'
|
||||
*/
|
||||
androidPlayServicesCastFrameworkVersion?: string;
|
||||
/**
|
||||
* ??
|
||||
*/
|
||||
receiverAppId?: string;
|
||||
}>;
|
||||
-151
@@ -1,151 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withAndroidGoogleCast = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
const codeMod_1 = require("@expo/config-plugins/build/android/codeMod");
|
||||
const { addMetaDataItemToMainApplication, getMainApplicationOrThrow } = config_plugins_1.AndroidConfig.Manifest;
|
||||
const META_PROVIDER_CLASS = "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME";
|
||||
const META_RECEIVER_APP_ID = "com.reactnative.googlecast.RECEIVER_APPLICATION_ID";
|
||||
const CUSTOM_ACTIVITY = "com.reactnative.googlecast.RNGCExpandedControllerActivity";
|
||||
async function ensureCustomActivityAsync({ mainApplication, }) {
|
||||
if (Array.isArray(mainApplication.activity)) {
|
||||
// Remove all activities matching the custom name
|
||||
mainApplication.activity = mainApplication.activity.filter((activity) => {
|
||||
var _a;
|
||||
return ((_a = activity.$) === null || _a === void 0 ? void 0 : _a["android:name"]) !== CUSTOM_ACTIVITY;
|
||||
});
|
||||
}
|
||||
else {
|
||||
mainApplication.activity = [];
|
||||
}
|
||||
// `<activity android:name="${CUSTOM_ACTIVITY}" />`
|
||||
mainApplication.activity.push({
|
||||
$: {
|
||||
"android:name": CUSTOM_ACTIVITY,
|
||||
},
|
||||
});
|
||||
return mainApplication;
|
||||
}
|
||||
const withAndroidManifestCast = (config, { receiverAppId } = {}) => {
|
||||
return config_plugins_1.withAndroidManifest(config, async (config) => {
|
||||
const mainApplication = getMainApplicationOrThrow(config.modResults);
|
||||
ensureCustomActivityAsync({ mainApplication });
|
||||
addMetaDataItemToMainApplication(mainApplication, META_PROVIDER_CLASS,
|
||||
// This is the native Java class
|
||||
"com.reactnative.googlecast.GoogleCastOptionsProvider");
|
||||
if (receiverAppId) {
|
||||
addMetaDataItemToMainApplication(mainApplication, META_RECEIVER_APP_ID, receiverAppId);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withProjectBuildGradleVersion = (config, { version }) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language !== "groovy")
|
||||
throw new Error("react-native-google-cast config plugin does not support Kotlin /build.gradle yet.");
|
||||
config.modResults.contents = addGoogleCastVersionImport(config.modResults.contents, {
|
||||
version,
|
||||
}).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withAppBuildGradleImport = (config, { version }) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language !== "groovy")
|
||||
throw new Error("react-native-google-cast config plugin does not support Kotlin app/build.gradle yet.");
|
||||
config.modResults.contents = addSafeExtGet(config.modResults.contents);
|
||||
config.modResults.contents = addGoogleCastImport(config.modResults.contents, {
|
||||
version,
|
||||
}).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withMainActivityLazyLoading = (config) => {
|
||||
return config_plugins_1.withMainActivity(config, async (config) => {
|
||||
let src = codeMod_1.addImports(config.modResults.contents, ["com.google.android.gms.cast.framework.CastContext"], config.modResults.language === "java");
|
||||
if (config.modResults.language === "java") {
|
||||
config.modResults.contents = addGoogleCastLazyLoadingImport(src).contents;
|
||||
}
|
||||
else {
|
||||
throw new Error("react-native-google-cast config plugin does not support kotlin MainActivity yet.");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
// castFrameworkVersion
|
||||
const withAndroidGoogleCast = (config, props) => {
|
||||
var _a, _b;
|
||||
config = withAndroidManifestCast(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
});
|
||||
config = withMainActivityLazyLoading(config);
|
||||
config = withProjectBuildGradleVersion(config, {
|
||||
// gradle dep version
|
||||
version: (_a = props.androidPlayServicesCastFrameworkVersion) !== null && _a !== void 0 ? _a : "+",
|
||||
});
|
||||
config = withAppBuildGradleImport(config, {
|
||||
// gradle dep version
|
||||
version: (_b = props.androidPlayServicesCastFrameworkVersion) !== null && _b !== void 0 ? _b : "+",
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.withAndroidGoogleCast = withAndroidGoogleCast;
|
||||
function addGoogleCastLazyLoadingImport(src) {
|
||||
const newSrc = [];
|
||||
newSrc.push(" CastContext.getSharedInstance(this);");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-onCreate",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /super\.onCreate\(\w+\);/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
// TODO: Add this ability to autolinking
|
||||
// dependencies { implementation "com.google.android.gms:play-services-cast-framework:+" }
|
||||
function addGoogleCastImport(src, { version } = {}) {
|
||||
const newSrc = [];
|
||||
newSrc.push(` implementation "com.google.android.gms:play-services-cast-framework:\${safeExtGet('castFrameworkVersion', '${version}')}"`);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-dependencies",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /dependencies(?:\s+)?\{/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
function addSafeExtGet(src) {
|
||||
const tag = "safeExtGet";
|
||||
src = generateCode_1.removeContents({ src, tag }).contents;
|
||||
// If the source already has a safeExtGet method after removing this one, then go with the existing one.
|
||||
if (src.match(/def(?:\s+)?safeExtGet\(/)) {
|
||||
return src;
|
||||
}
|
||||
// Otherwise add a new one
|
||||
const newSrc = [];
|
||||
newSrc.push("def safeExtGet(prop, fallback) {", " rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback", "}");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "safeExtGet",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
// This block can go anywhere in the upper scope
|
||||
anchor: /apply plugin/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
}).contents;
|
||||
}
|
||||
function addGoogleCastVersionImport(src, { version } = {}) {
|
||||
const newSrc = [];
|
||||
newSrc.push(` castFrameworkVersion = "${version}"`);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-version",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /ext(?:\s+)?\{/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare const _default: ConfigPlugin<void | {
|
||||
/**
|
||||
* @default '+'
|
||||
*/
|
||||
androidPlayServicesCastFrameworkVersion?: string | undefined;
|
||||
/**
|
||||
* @default 'CC1AD845'
|
||||
*/
|
||||
iosReceiverAppId?: string | undefined;
|
||||
/**
|
||||
* ??
|
||||
*/
|
||||
androidReceiverAppId?: string | undefined;
|
||||
}>;
|
||||
export default _default;
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withAndroidGoogleCast_1 = require("./withAndroidGoogleCast");
|
||||
const withIosGoogleCast_1 = require("./withIosGoogleCast");
|
||||
const withGoogleCast = (config, _props) => {
|
||||
const props = _props || {};
|
||||
// TODO: Are the Android and iOS receiverAppId values the same?
|
||||
config = withIosGoogleCast_1.withIosGoogleCast(config, {
|
||||
receiverAppId: props.iosReceiverAppId,
|
||||
// disableDiscoveryAutostart?: boolean;
|
||||
// startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
});
|
||||
config = withAndroidGoogleCast_1.withAndroidGoogleCast(config, {
|
||||
receiverAppId: props.androidReceiverAppId,
|
||||
androidPlayServicesCastFrameworkVersion: props.androidPlayServicesCastFrameworkVersion,
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withGoogleCast, "react-native-google-cast");
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withIosGoogleCast: ConfigPlugin<{
|
||||
/**
|
||||
* @default 'CC1AD845'
|
||||
*/
|
||||
receiverAppId?: string;
|
||||
}>;
|
||||
export declare const MATCH_INIT: RegExp;
|
||||
declare type IosProps = {
|
||||
receiverAppId?: string | null;
|
||||
disableDiscoveryAutostart?: boolean;
|
||||
startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
};
|
||||
export declare function addGoogleCastAppDelegateDidFinishLaunchingWithOptions(src: string, { receiverAppId, disableDiscoveryAutostart, startDiscoveryAfterFirstTapOnCastButton, }?: IosProps): import("@expo/config-plugins/build/utils/generateCode").MergeResults;
|
||||
export {};
|
||||
-124
@@ -1,124 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addGoogleCastAppDelegateDidFinishLaunchingWithOptions = exports.MATCH_INIT = exports.withIosGoogleCast = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
/**
|
||||
* In Xcode, go to Signing & Capabilities, click + Capability and select Access WiFi Information. (This is required since iOS 12.)
|
||||
* Note that "Wireless Accessory Configuration" is unrelated.
|
||||
*
|
||||
* @param {*} config
|
||||
* @returns
|
||||
*/
|
||||
const withIosWifiEntitlements = (config) => {
|
||||
return config_plugins_1.withEntitlementsPlist(config, (config) => {
|
||||
config.modResults["com.apple.developer.networking.wifi-info"] = true;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const LOCAL_NETWORK_USAGE = "${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi network";
|
||||
const BLUETOOTH_ALWAYS_USAGE = "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices";
|
||||
const BLUETOOTH_PERIPHERAL_USAGE = "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices";
|
||||
const MICROPHONE_USAGE = "${PRODUCT_NAME} uses microphone access to listen for ultrasonic tokens when pairing with nearby Cast devices";
|
||||
/**
|
||||
* On iOS, a dialog asking the user for the local network permission will now be displayed immediately when the app is opened.
|
||||
*
|
||||
* @param {*} config
|
||||
* @param {*} props.receiverAppId If using a custom receiver, make sure to replace `CC1AD845` with your custom receiver app id.
|
||||
* @returns
|
||||
*/
|
||||
const withIosLocalNetworkPermissions = (config, { receiverAppId = "CC1AD845" } = {}) => {
|
||||
return config_plugins_1.withInfoPlist(config, (config) => {
|
||||
if (!Array.isArray(config.modResults.NSBonjourServices)) {
|
||||
config.modResults.NSBonjourServices = [];
|
||||
}
|
||||
// Add required values
|
||||
config.modResults.NSBonjourServices.push("_googlecast._tcp", `_${receiverAppId}._googlecast._tcp`);
|
||||
// Remove duplicates
|
||||
config.modResults.NSBonjourServices = [
|
||||
...new Set(config.modResults.NSBonjourServices),
|
||||
];
|
||||
// For iOS 14+, you need to add local network permissions to Info.plist:
|
||||
// https://developers.google.com/cast/docs/ios_sender/ios_permissions_changes#updating_your_app_on_ios_14
|
||||
config.modResults.NSLocalNetworkUsageDescription =
|
||||
config.modResults.NSLocalNetworkUsageDescription || LOCAL_NETWORK_USAGE;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIosGuestMode = (config) => {
|
||||
return config_plugins_1.withInfoPlist(config, (config) => {
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription =
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription ||
|
||||
BLUETOOTH_ALWAYS_USAGE;
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription =
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription ||
|
||||
BLUETOOTH_PERIPHERAL_USAGE;
|
||||
config.modResults.NSMicrophoneUsageDescription =
|
||||
config.modResults.NSMicrophoneUsageDescription || MICROPHONE_USAGE;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
// TODO: Use AppDelegate swizzling
|
||||
const withIosAppDelegateLoaded = (config, props) => {
|
||||
return config_plugins_1.withAppDelegate(config, (config) => {
|
||||
if (config.modResults.language !== "objc") {
|
||||
throw new Error("react-native-google-cast config plugin does not support Swift AppDelegate yet.");
|
||||
}
|
||||
config.modResults.contents =
|
||||
addGoogleCastAppDelegateDidFinishLaunchingWithOptions(config.modResults.contents, props).contents;
|
||||
config.modResults.contents = addGoogleCastAppDelegateImport(config.modResults.contents).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIosGoogleCast = (config, props) => {
|
||||
config = withIosWifiEntitlements(config);
|
||||
config = withIosLocalNetworkPermissions(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
});
|
||||
config = withIosAppDelegateLoaded(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
// disableDiscoveryAutostart?: boolean;
|
||||
// startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
});
|
||||
// TODO
|
||||
// config = withIosGuestMode(config)
|
||||
return config;
|
||||
};
|
||||
exports.withIosGoogleCast = withIosGoogleCast;
|
||||
// From expo-cli RNMaps setup
|
||||
exports.MATCH_INIT = /(?:(self\.|_)(\w+)\s?=\s?\[\[UMModuleRegistryAdapter alloc\])|(?:RCTBridge\s?\*\s?(\w+)\s?=\s?\[\[RCTBridge alloc\])|(\[self\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\])/g;
|
||||
function addGoogleCastAppDelegateDidFinishLaunchingWithOptions(src, { receiverAppId = null, disableDiscoveryAutostart = false, startDiscoveryAfterFirstTapOnCastButton = true, } = {}) {
|
||||
let newSrc = [];
|
||||
newSrc.push(
|
||||
// For extra safety
|
||||
"#if __has_include(<GoogleCast/GoogleCast.h>)",
|
||||
// TODO: This should probably read safely from a static file like the Info.plist
|
||||
` NSString *receiverAppID = ${receiverAppId
|
||||
? `@"${receiverAppId}"`
|
||||
: "kGCKDefaultMediaReceiverApplicationID"};`, " GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc] initWithApplicationID:receiverAppID];", " GCKCastOptions* options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria];",
|
||||
// TODO: Same as above, read statically
|
||||
// ` options.disableDiscoveryAutostart = ${String(!!disableDiscoveryAutostart)};`,
|
||||
` options.startDiscoveryAfterFirstTapOnCastButton = ${String(!!startDiscoveryAfterFirstTapOnCastButton)};`, " [GCKCastContext setSharedInstanceWithOptions:options];", "#endif");
|
||||
newSrc = newSrc.filter(Boolean);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-didFinishLaunchingWithOptions",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: exports.MATCH_INIT,
|
||||
offset: 0,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
exports.addGoogleCastAppDelegateDidFinishLaunchingWithOptions = addGoogleCastAppDelegateDidFinishLaunchingWithOptions;
|
||||
function addGoogleCastAppDelegateImport(src) {
|
||||
const newSrc = [];
|
||||
newSrc.push("#if __has_include(<GoogleCast/GoogleCast.h>)", "#import <GoogleCast/GoogleCast.h>", "#endif");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-import",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /#import "AppDelegate\.h"/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-google-cast",
|
||||
"version": "0.1.0",
|
||||
"version": "1.0.1",
|
||||
"description": "Config plugin to auto configure Google Cast on prebuild",
|
||||
"main": "build/withGoogleCast.js",
|
||||
"types": "build/withGoogleCast.d.ts",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
### @config-plugins/react-native-pdf [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
* fix versions [skip ci] ([#53](https://github.com/expo/config-plugins/issues/53)) ([5de4ae3](https://github.com/expo/config-plugins/commit/5de4ae3e6182c32b7aa24d70ccd23a11663bb089))
|
||||
|
||||
## @config-plugins/react-native-pdf 1.0.0 (2022-03-15)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withAndroidPackagingOptions: ConfigPlugin;
|
||||
export declare function addAndroidPackagingOptions(src: string): import("@expo/config-plugins/build/utils/generateCode").MergeResults;
|
||||
declare const _default: ConfigPlugin<void>;
|
||||
export default _default;
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addAndroidPackagingOptions = exports.withAndroidPackagingOptions = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
let pkg = {
|
||||
name: "react-native-pdf",
|
||||
};
|
||||
try {
|
||||
pkg = require("react-native-pdf/package.json");
|
||||
}
|
||||
catch (_a) {
|
||||
// empty catch block
|
||||
}
|
||||
const withAndroidPackagingOptions = (config) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addAndroidPackagingOptions(config.modResults.contents).contents;
|
||||
}
|
||||
else {
|
||||
config_plugins_1.WarningAggregator.addWarningAndroid("@config-plugins/react-native-pdf", `Cannot automatically configure app build.gradle if it's not groovy`);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withAndroidPackagingOptions = withAndroidPackagingOptions;
|
||||
function addAndroidPackagingOptions(src) {
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-pdf-packaging-options",
|
||||
src,
|
||||
newSrc: packagingOptionsContents,
|
||||
anchor: /android(?:\s+)?\{/,
|
||||
// Inside the android block.
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
exports.addAndroidPackagingOptions = addAndroidPackagingOptions;
|
||||
const packagingOptionsContents = `
|
||||
packagingOptions {
|
||||
pickFirst 'lib/x86/libc++_shared.so'
|
||||
pickFirst 'lib/x86_64/libjsc.so'
|
||||
pickFirst 'lib/arm64-v8a/libjsc.so'
|
||||
pickFirst 'lib/arm64-v8a/libc++_shared.so'
|
||||
pickFirst 'lib/x86_64/libc++_shared.so'
|
||||
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
|
||||
}
|
||||
`;
|
||||
const withReactNativePdf = (config) => {
|
||||
return exports.withAndroidPackagingOptions(config);
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withReactNativePdf, pkg.name, pkg.version);
|
||||
Loaded 100 of 118 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user