Compare commits

..
Author SHA1 Message Date
Evan Bacon 754fb08327 Merge branch 'master' into @evanbacon/e2e-tests 2021-12-14 21:13:34 -07:00
Evan Bacon 05fe7bf107 Update package.json 2021-11-30 13:34:25 -07:00
Evan Bacon fa107895b6 Update detox.config.js 2021-11-29 17:18:39 -07:00
Evan Bacon d31b0273cf [WIP][NO-MERGE] 2021-11-29 17:01:02 -07:00
Evan Bacon 2f358c25e8 Try new monorepo imports 2021-11-29 16:30:21 -07:00
Evan Bacon d2eb511e1d Update e2e.yml 2021-11-29 14:38:53 -07:00
Evan Bacon f62a941bc6 Update e2e.yml 2021-11-29 14:38:30 -07:00
Evan Bacon d784d14486 Update app.json 2021-11-29 11:44:27 -07:00
Evan Bacon 7b0d0225f9 Update yarn.lock 2021-11-29 11:43:49 -07:00
Evan Bacon c1d25701ca Merge branch 'master' into @evanbacon/e2e-tests 2021-11-29 11:43:10 -07:00
Evan Bacon 5359120dbd Improved CI 2021-07-03 18:43:11 -06:00
Evan Bacon ed6b3a0ec0 Update detox.config.js 2021-07-03 18:30:03 -06:00
Evan Bacon efd3284272 remove webrtc and google chrome 2021-07-03 18:19:46 -06:00
Evan Bacon 46bc48726c Update App-e2e.ts 2021-07-03 18:00:57 -06:00
Evan Bacon ff47e492e4 Update App-e2e.ts 2021-07-03 17:40:47 -06:00
Evan Bacon be969274b9 Update app.json 2021-07-03 17:21:36 -06:00
Evan Bacon 359c1cfcb5 added missing resize mode 2021-07-03 17:15:17 -06:00
Evan Bacon 6c3fc5dff7 Update e2e.yml 2021-07-03 17:12:56 -06:00
Evan Bacon 99d3927680 Update e2e.yml 2021-07-03 17:06:40 -06:00
Evan Bacon 55482dae5f Create .ruby-version 2021-07-03 17:04:15 -06:00
Evan Bacon 395599abfa Added e2e tests 2021-07-03 16:59:15 -06:00
151 changed files with 875 additions and 6017 deletions

No files matched your search

-1
View File
@@ -1 +0,0 @@
/* @EvanBacon
-81
View File
@@ -1,81 +0,0 @@
name: "\U0001F41B Expo Config Plugin Bug Report"
description: Report a reproducible bug with one of the Expo Config Plugins.
labels: bug
body:
- type: markdown
attributes:
value: >-
Thanks for taking the time to file a bug report! Please fill out this
form as completely as possible.
- type: markdown
attributes:
value: >-
If you leave out sections there is a high likelihood your issue will be
closed. If you have a question, not a bug report, please post it on our
[forums](https://forums.expo.dev/) instead.
- type: textarea
attributes:
label: Summary
description: Describe the issue in 1 or 2 sentences
placeholder: >-
Clearly describe what the expected behavior is vs. what is actually
happening. This should be as short as possible, while still
communicating all the necessary information. If your summary is just 'X
library/method isn't working', then you need to continue debugging
yourself and provide more information.
validations:
required: true
- type: dropdown
attributes:
label: Config Plugin
options:
- '@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-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'
validations:
required: true
- type: dropdown
attributes:
label: What platform(s) does this occur on?
multiple: true
options:
- Android
- iOS
validations:
required: true
- type: input
attributes:
label: SDK Version
description: What version of the Expo SDK are you using?
- type: textarea
attributes:
label: Reproducible demo
description: >-
This should include as little code as possible, do not simply link your
entire project. If a reproducible demo is not provided, it is very
likely your issue will be closed. Read [here more
guidance](https://stackoverflow.com/help/mcve).
validations:
required: true
- type: markdown
attributes:
value: >-
Please make sure contributors can run your code and follow the steps
your provided in order to reproduce the bug.
- type: markdown
attributes:
value: >-
**Realize that it is up to you to debug your code and be as certain as
possible that the bug is with Expo, not with your own app.** [Here's an
excellent guide to debugging you can
follow](https://gist.github.com/brentvatne/5ac00cba0c70b7a06b89a56787d6bc4a).
-44
View File
@@ -1,44 +0,0 @@
---
blank_issues_enabled: false
contact_links:
- name: "\U0001F914 Question about an Expo Config Plugin"
about: >-
If you have a question about an Expo Config Plugin, please ask it on the
forums, discord, Twitter, or Stack Overflow.
url: 'https://forums.expo.io/'
- about: E2E tests and automation for mobile
name: "\U0001F4E6 detox issues"
url: 'https://github.com/wix/Detox/issues'
- about: FFmpeg Kit for React Native
name: "\U0001F4E6 ffmpeg-kit-react-native issues"
url: 'https://github.com/tanersener/ffmpeg-kit/issues'
- about: Adjust React Native SDK
name: "\U0001F4E6 react-native-adjust issues"
url: 'https://github.com/adjust/react_native_sdk/issues'
- about: React Native Bluetooth Low Energy library
name: "\U0001F4E6 react-native-ble-plx issues"
url: 'https://github.com/Polidea/react-native-ble-plx/issues'
- about: >-
A module provides upload, download, and files access API. Supports file
stream read/write for process large files.
name: "\U0001F4E6 react-native-blob-util issues"
url: 'https://github.com/RonRadtke/react-native-blob-util/issues'
- about: iOS 10 CallKit and Android ConnectionService Framework For React Native
name: "\U0001F4E6 react-native-callkeep issues"
url: 'https://github.com/react-native-webrtc/react-native-callkeep/issues'
- about: Programmatically change the app icon in React Native.
name: "\U0001F4E6 react-native-dynamic-app-icon issues"
url: 'https://github.com/idearockers/react-native-dynamic-app-icon/issues'
- about: React Native wrapper for the Google Cast SDK for iOS and Android
name: "\U0001F4E6 react-native-google-cast issues"
url: >-
https://github.com/react-native-google-cast/react-native-google-cast/issues
- about: 'A react native PDF view component, support ios and android platform'
name: "\U0001F4E6 react-native-pdf issues"
url: 'https://github.com/wonday/react-native-pdf/issues'
- about: A react-native interface for Touch 3D home screen quick actions
name: "\U0001F4E6 react-native-quick-actions issues"
url: 'https://github.com/jordanbyron/react-native-quick-actions/issues'
- about: WebRTC for React Native
name: "\U0001F4E6 react-native-webrtc issues"
url: 'https://github.com/react-native-webrtc/react-native-webrtc/issues'
-22
View File
@@ -1,22 +0,0 @@
name: "⭐️ Config Plugin Request"
description: "Suggest an idea for a new Expo Config Plugin."
labels: enhancement
body:
- type: markdown
attributes:
value: "This repo is used for publishing out-of-tree plugins that should eventually be upstreamed in a particular package. If the plugin is a utility or used to improve some particular workflow i.e. updates version numbers, than it's probably better suited for a personal repo or utility package."
- type: input
attributes:
label: Library
description: What package does this Config Plugin configure.
placeholder: URL to a React Native package.
validations:
required: true
- type: textarea
attributes:
label: Summary
description: Add some info on why this integration is important.
- type: textarea
attributes:
label: Any existing examples?
placeholder: Have you already created a local plugin for the requested library?
-24
View File
@@ -1,24 +0,0 @@
<!--
🚨 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.
-->
-91
View File
@@ -1,91 +0,0 @@
# AUTO GENERATED:
# This file was generated by running the following in the root directory:
#
# yarn update-dependabot-config
version: 2
updates:
- package-ecosystem: npm
directory: packages/android-jsc-intl
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/detox
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/ffmpeg-kit-react-native
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/ios-stickers
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-adjust
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-ble-plx
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-blob-util
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-branch
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-callkeep
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-dynamic-app-icon
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-google-cast
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-pdf
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-quick-actions
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
- package-ecosystem: npm
directory: packages/react-native-webrtc
schedule:
interval: daily
time: '09:00'
timezone: America/Los_Angeles
+155
View File
@@ -0,0 +1,155 @@
name: E2E Test
on:
workflow_dispatch: {}
push:
branches: [master]
paths:
- .github/workflows/ios.yml
- apps/app/**
- packages/**
- yarn.lock
pull_request:
paths:
- .github/workflows/ios.yml
- apps/app/**
- packages/**
- yarn.lock
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: true
jobs:
ios:
runs-on: macos-latest
steps:
- name: 👀 Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: 🍺 Install required tools
run: |
brew tap wix/brew
brew install applesimutils
brew install watchman
echo "$(pwd)/bin" >> $GITHUB_PATH
- name: 💎 Setup Ruby and install gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: ♻️ Restore workspace node modules
uses: actions/cache@v2
id: node-modules-cache
with:
path: |
# See "workspaces" → "packages" in the root package.json for the source of truth of
# which node_modules are affected by the root yarn.lock
node_modules
apps/*/node_modules
packages/*/node_modules
key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
- name: 🧶 Install node modules in root dir
run: yarn install --frozen-lockfile
- name: ♻️ Restore apps/app/ios/Pods from cache
uses: actions/cache@v2
id: pods-cache
with:
path: "apps/app/ios/Pods"
key: ${{ runner.os }}-app-pods-${{ hashFiles('apps/app/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-app-pods-
- run: yarn global add expo-cli
- name: 🔨 Prebuild
run: expo prebuild -p ios
working-directory: apps/app
- name: 🕵️ Debug CocoaPods lockfiles
run: git diff Podfile.lock Pods/Manifest.lock
working-directory: apps/app/ios
continue-on-error: true
- name: ⚛️ Display React Native config
run: yarn react-native config
working-directory: apps/app
- name: 🌳 Display pod environment
run: pod env
working-directory: apps/app/ios
- name: 🥥 Install pods in apps/app/ios
run: pod install
if: steps.pods-cache.outputs.cache-hit != 'true' || hashFiles('apps/app/ios/Podfile.lock') != hashFiles('apps/app/ios/Pods/Manifest.lock')
working-directory: apps/app/ios
- name: Clean Detox
run: yarn detox:clean
working-directory: apps/app
- name: Build iOS project for Detox
run: yarn build:ios-release
working-directory: apps/app
timeout-minutes: 30
- name: Run tests
run: yarn test:ios-release
working-directory: apps/app
- name: Store images of build failures
if: always()
uses: actions/upload-artifact@v2
with:
name: app-artifacts
path: apps/app/artifacts
android:
runs-on: macos-latest
steps:
- name: 👀 Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: 🍺 Install required tools
run: |
brew install watchman
echo "$(pwd)/bin" >> $GITHUB_PATH
- name: ♻️ Restore workspace node modules
uses: actions/cache@v2
id: node-modules-cache
with:
path: |
# See "workspaces" → "packages" in the root package.json for the source of truth of
# which node_modules are affected by the root yarn.lock
node_modules
apps/*/node_modules
packages/*/node_modules
key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
- name: 🧶 Install node modules in root dir
run: yarn install --frozen-lockfile
- uses: actions/cache@v2
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-v20210625-${{ hashFiles('android/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-v20210625
- run: yarn global add expo-cli
- name: 🔨 Prebuild
run: expo prebuild -p android
working-directory: apps/app
- name: ⚛️ Display React Native config
run: yarn react-native config
working-directory: apps/app
- name: Clean Detox
run: yarn detox:clean
working-directory: apps/app
- name: Build Android project for Detox
run: yarn build:android-release
working-directory: apps/app
timeout-minutes: 35
env:
GRADLE_OPTS: "-Dorg.gradle.internal.http.connectionTimeout=180000 -Dorg.gradle.internal.http.socketTimeout=180000 -Dorg.gradle.internal.network.retry.max.attempts=18 -Dorg.gradle.internal.network.retry.initial.backOff=2000"
- name: Run tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
avd-name: app
script: yarn test:android-release
working-directory: ./apps/app
- name: Store images of build failures
if: always()
uses: actions/upload-artifact@v2
with:
name: app-artifacts
path: apps/app/artifacts
+1 -1
View File
@@ -2,7 +2,7 @@ name: Check Markdown links
on: on:
workflow_dispatch: {} workflow_dispatch: {}
push: push:
branches: [main] branches: [master]
paths: paths:
- .github/workflows/lint-md.yml - .github/workflows/lint-md.yml
- "**.md" - "**.md"
-37
View File
@@ -1,37 +0,0 @@
name: Release
# https://github.com/bent10/monorepo-starter/blob/main/docs/recipes/release-automation.md
on:
push:
branches:
- main
jobs:
release:
name: Releasing
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/cache@v2
with:
path: "**/node_modules"
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- run: yarn install --frozen-lockfile --check-files
- run: yarn lerna run prepare --stream
# 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 --ignore-private-packages
env:
GITHUB_TOKEN: ${{ github.token }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+1 -5
View File
@@ -1,7 +1,7 @@
name: Test Packages name: Test Packages
on: on:
push: push:
branches: [main] branches: [master]
pull_request: pull_request:
types: [opened, synchronize] types: [opened, synchronize]
@@ -37,7 +37,6 @@ jobs:
# Manually add packages here # Manually add packages here
detox, detox,
ffmpeg-kit-react-native, ffmpeg-kit-react-native,
ios-stickers,
react-native-ble-plx, react-native-ble-plx,
react-native-blob-util, react-native-blob-util,
react-native-google-cast, react-native-google-cast,
@@ -54,9 +53,6 @@ jobs:
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node }} node-version: ${{ matrix.node }}
- name: Lint ${{ matrix.package }}
run: yarn lint --max-warnings 0
working-directory: packages/${{ matrix.package }}
- name: Test ${{ matrix.package }} - name: Test ${{ matrix.package }}
run: cd packages/${{ matrix.package }} && yarn test run: cd packages/${{ matrix.package }} && yarn test
env: env:
+1 -5
View File
@@ -51,8 +51,4 @@ xcuserdata
# VSCode # VSCode
.history/ .history/
# Ignore build folders # packages/*/build/
packages/*/build/**
packages/*/plugin/build/**
packages/@*/*/build/**
-62
View File
@@ -1,62 +0,0 @@
// From @byCedric https://github.com/expo/expo-github-action/blob/main/.releaserc.js
const rules = [
{ type: "feat", release: "minor", title: "Features" },
{ type: "fix", release: "patch", title: "Bug Fixes" },
{ type: "test", release: "patch", title: "Tests" },
{ type: "ci", release: "patch", title: "Continuous Integration" },
{ type: "refactor", release: "patch", title: "Code Refactoring" },
{ type: "chore", release: "patch", title: "Other chores" },
{ type: "docs", release: "patch", title: "Documentation changes" },
];
// Simple mapping to order the commit groups
const sortMap = Object.fromEntries(
rules.map((rule, index) => [rule.title, index])
);
module.exports = {
branches: ["main"],
tagFormat: "${version}",
repositoryUrl: "https://github.com/expo/config-plugins.git",
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "major" },
{ revert: true, release: "patch" },
].concat(
rules.map(({ type, release, breaking }) => ({
type,
release,
breaking,
}))
),
},
],
[
"@semantic-release/release-notes-generator",
{
preset: "conventionalcommits",
presetConfig: {
types: rules.map(({ type, title }) => ({ type, section: title })),
},
writerOpts: {
commitGroupsSort: (a, z) => sortMap[a.title] - sortMap[z.title],
},
},
],
"@semantic-release/changelog",
"@semantic-release/npm",
[
"@semantic-release/git",
{
message: "chore: ${nextRelease.version}\n\n${nextRelease.notes}",
assets: ["package.json", "CHANGELOG.md", "build/*"],
},
],
"@semantic-release/github",
],
};
+1
View File
@@ -0,0 +1 @@
2.7.0
-27
View File
@@ -1,27 +0,0 @@
# Contributing to Expo Config Plugins
## Submitting a pull request
To submit a pull request:
1. Fork the [repository](https://github.com/expo/config-plugins) and create a feature branch. (Existing contributors can create feature branches without forking. Prefix the branch name with `@your-github-username/`.)
2. Run `yarn` in the root directory to generate the build files.
3. Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) including in the PR tile.
4. Fill out the entire PR template. Ensure your code is tested locally and has continuous tests in CI.
5. Make sure all tests pass on GitHub Actions.
6. Wait for a review and adjust the code if necessary.
## Creating a plugin
- Plugins can be generated by running `yarn gen`.
- Add plugins to the example in [`apps/app`](/apps/app/package.json) to test them.
- The example app should always stay in a state of regeneration.
Be sure to run the following scripts in the **root directory** to update automation tools:
- Update dependabot: `yarn update-dependabot-config`
- Update the issue template: `yarn update-issue-template`
## Publishing a release
All publishing should be handled automatically whenever code is merged to `main`.
+6 -7
View File
@@ -1,11 +1,10 @@
# Expo Config Plugins # Expo Config Plugins
- A collection of [Expo config plugins](https://docs.expo.dev/guides/config-plugins/) for configuring the `expo prebuild` command. A collection of custom WIP config plugins for Expo dev clients. Use at your own discretion.
- This repo is to Expo config plugins as [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) is to TypeScript.
- We prefer packages ship their own Expo config plugin (to ensure versioning is aligned), but if they haven't adopted the system yet, the community can add a package here.
- All packages here are community maintained. Feel free to improve docs, packages, tests, etc.
- We maintain a 1-1 mapping of **native packages** ⇔ `@config-plugins/*`. This means there should be no general utility packages here -- those are better suited for a different repo / NPM namespace.
## Contributing!
See the [contributing guide](/CONTRIBUTING.md). ## Creating a plugin
- Plugins can be generated by running `yarn gen`.
- Add plugins to the example in [`apps/app`](/apps/app/package.json) to test them.
- The example app should always stay in a state of regeneration.
+2 -3
View File
@@ -1,9 +1,8 @@
// export { default } from './src/react-native-quick-actions/App'; // export { default } from './src/react-native-quick-actions/App';
// export { default } from './src/react-native-pdf/App';
// export { default } from './src/react-native-dynamic-app-icon/App'; // export { default } from './src/react-native-dynamic-app-icon/App';
// export { default } from './src/react-native-google-cast/App'; // export { default } from './src/react-native-google-cast/App';
// export { default } from './src/detox/App'; export { default } from './src/detox/App';
// export { default } from './src/react-native-ble-plx/App'; // export { default } from './src/react-native-ble-plx/App';
export { default } from './src/react-native-webrtc/App'; // export { default } from './src/react-native-webrtc/App';
// export { default } from './src/android-jsc-intl/App'; // export { default } from './src/android-jsc-intl/App';
// export { default } from './src/ffmpeg-kit-react-native/App'; // export { default } from './src/ffmpeg-kit-react-native/App';
-66
View File
@@ -1,66 +0,0 @@
### @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)
### Features
* create react-native-branch plugin ([0b06baa](https://github.com/expo/config-plugins/commit/0b06baa2b486c5e02d433a4ac785960934f403b9))
### Bug Fixes
* respect old config from expo-branch ([d0e0186](https://github.com/expo/config-plugins/commit/d0e018601c09c0e92191a4eb2998ab0e6fa1c6ec))
### Other chores
* added start-metro script ([4a7d707](https://github.com/expo/config-plugins/commit/4a7d707b200a3e499d9d71caf49ad4fc1d0a89e0))
* update script ([dcf61a9](https://github.com/expo/config-plugins/commit/dcf61a9b9542851095954d84c9054c97c5400dc9))
* upgrade to latest react-native-branch ([df98474](https://github.com/expo/config-plugins/commit/df98474d79ed139b42ddd698d13100160c656c26))
### Documentation changes
* add android-jsc-intl example ([d96c0b2](https://github.com/expo/config-plugins/commit/d96c0b2888da3808d7c4e2dd7993129711ba717d))
### Dependencies
* **@config-plugins/android-jsc-intl:** upgraded to 1.0.0
* **@config-plugins/detox:** upgraded to 1.0.0
* **@config-plugins/ffmpeg-kit-react-native:** upgraded to 1.0.0
* **@config-plugins/ios-stickers:** upgraded to 1.0.0
* **@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.0
* **@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
+6 -70
View File
@@ -13,89 +13,25 @@
"updates": { "updates": {
"fallbackToCacheTimeout": 0 "fallbackToCacheTimeout": 0
}, },
"assetBundlePatterns": ["**/*"], "assetBundlePatterns": [
"**/*"
],
"ios": { "ios": {
"supportsTablet": true, "supportsTablet": true,
"bundleIdentifier": "dev.bacon.app", "bundleIdentifier": "com.bacon.app"
"config": {
"branch": {
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8"
}
}
}, },
"android": { "android": {
"adaptiveIcon": { "adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png", "foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
"config": {
"branch": {
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8"
}
},
"package": "com.bacon.app" "package": "com.bacon.app"
}, },
"web": { "web": {
"favicon": "./assets/favicon.png" "favicon": "./assets/favicon.png"
}, },
"plugins": [ "plugins": [
[ "@config-plugins/detox"
"@config-plugins/react-native-dynamic-app-icon",
[
"./assets/icons/spring.png",
"./assets/icons/summer.png",
"./assets/icons/autumn.png",
"./assets/icons/fall.png",
"./assets/icons/solstice.png"
]
],
[
"@config-plugins/react-native-quick-actions",
[
{
"title": "Take Photo",
"type": "photo",
"iconType": "UIApplicationShortcutIconTypeCapturePhoto"
}
]
],
[
"@config-plugins/ffmpeg-kit-react-native",
{
"package": "min"
}
],
"@config-plugins/detox",
"@config-plugins/react-native-adjust",
"@config-plugins/react-native-branch",
"@config-plugins/react-native-google-cast",
"@config-plugins/react-native-ble-plx",
"@config-plugins/react-native-webrtc",
"@config-plugins/react-native-callkeep",
"@config-plugins/react-native-blob-util",
"@config-plugins/react-native-pdf",
"@config-plugins/android-jsc-intl",
[
"@config-plugins/ios-stickers",
{
"name": "Stickers",
"icon": "./assets/imessage-icon.png",
"columns": 4,
"stickers": [
"./assets/stickers/annoyed.png",
"./assets/stickers/cuddle.png",
"./assets/stickers/crazy.png",
"./assets/stickers/cant.png",
"./assets/stickers/donno.png",
"./assets/stickers/cozzy.png",
"./assets/stickers/dork.png",
"./assets/stickers/focus.png",
"./assets/stickers/avocool.png",
"./assets/stickers/coder-girl.png",
"./assets/stickers/teapot.png"
]
}
]
] ]
} }
} }
+2 -2
View File
@@ -1,6 +1,6 @@
const iosName = "app"; const iosName = "app";
const emulator = "Pixel_3a_API_30"; const emulator = process.env.CI ? "app" : "Pixel_3a_API_30";
const simulator = "iPhone 13 Pro"; const simulator = "iPhone 11";
const derivedDataPath = "ios/build"; const derivedDataPath = "ios/build";
const sdk = "iphonesimulator"; const sdk = "iphonesimulator";
+7 -14
View File
@@ -1,4 +1,4 @@
import { by, device, element, expect } from "detox"; import { device } from "detox";
import * as path from "path"; import * as path from "path";
import { createCapture } from "../lib"; import { createCapture } from "../lib";
@@ -6,7 +6,10 @@ import { createCapture } from "../lib";
const projectRoot = path.resolve(__dirname, "../../"); const projectRoot = path.resolve(__dirname, "../../");
// https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html // https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html
const languages = ["en-US", "nl-NL", "zh-CN"]; const languages = [
"en-US",
// "nl-NL", "zh-CN"
];
for (const locale of languages) { for (const locale of languages) {
const { captureAsync, resetAppAsync } = createCapture({ const { captureAsync, resetAppAsync } = createCapture({
@@ -21,18 +24,8 @@ for (const locale of languages) {
await device.reloadReactNative(); await device.reloadReactNative();
}); });
it("should have welcome screen", async () => { it("should load app", async () => {
await expect(element(by.id("welcome"))).toBeVisible(); // await expect(element(by.id("welcome"))).toBeVisible();
await captureAsync();
});
xit("should show hello screen after tap", async () => {
await element(by.id("hello_button")).tap();
await captureAsync();
});
xit("should show world screen after tap", async () => {
await element(by.id("world_button")).tap();
await captureAsync(); await captureAsync();
}); });
}); });
+16 -6
View File
@@ -4,10 +4,19 @@ import * as path from "path";
import { setStatusBar } from "./setStatusBar"; import { setStatusBar } from "./setStatusBar";
export function getOutputDir(projectRoot: string, locale: string) { export function getOutputDir(projectRoot: string, locale: string) {
return path.resolve( const store = device.getPlatform() === "ios" ? "apple" : "google";
projectRoot, return path.resolve(projectRoot, `merch/${store}/preview/${locale}/`);
`meta/screenshots/${device.getPlatform()}/${locale}/` }
);
function resolveName(str: string) {
if (str && device.getPlatform() === "ios" && typeof str === "string") {
// Convert a name like: `E9EA2214-6B88-4223-9872-8232168088FB {"type":"iPhone 12 Pro Max"}`
// to `iPhone 12 Pro Max`
// Name is important for screenshot sorting
const match = str.match(/"type"\s?:\s?"(.*)"}/i)?.[1];
return match || str;
}
return str;
} }
export async function takeScreenshotAsync({ export async function takeScreenshotAsync({
@@ -27,8 +36,9 @@ export async function takeScreenshotAsync({
if (index == null) { if (index == null) {
index = fs.readdirSync(outputDir).length; index = fs.readdirSync(outputDir).length;
} }
const deviceName = resolveName(device.name);
const name = `APP_${device.name}_${index}`.toUpperCase(); const name = `APP_${deviceName}-${index}`;
const imgPath = path.resolve(outputDir, `${name}.png`); const imgPath = path.resolve(outputDir, `${name}.png`);
const imagePath = await device.takeScreenshot(name); const imagePath = await device.takeScreenshot(name);
await fs.promises.copyFile(imagePath, imgPath); await fs.promises.copyFile(imagePath, imgPath);
@@ -58,7 +68,7 @@ export function createCapture({
clearAsync, clearAsync,
async resetAppAsync() { async resetAppAsync() {
// Clear old screen shots // Clear old screen shots
await clearAsync(); // await clearAsync();
// configure status bars // configure status bars
setStatusBar(); setStatusBar();
+1
View File
@@ -1,3 +1,4 @@
import "react-native-gesture-handler";
import { registerRootComponent } from "expo"; import { registerRootComponent } from "expo";
import Constants from "expo-constants"; import Constants from "expo-constants";
+15 -35
View File
@@ -3,6 +3,7 @@
"main": "./index.js", "main": "./index.js",
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {
"detox:clean": "detox clean-framework-cache && detox build-framework-cache",
"build:ios": "detox build -c ios.sim.debug", "build:ios": "detox build -c ios.sim.debug",
"test:ios": "detox test -c ios.sim.debug", "test:ios": "detox test -c ios.sim.debug",
"e2e:ios": "npm run build:ios && npm run test:ios", "e2e:ios": "npm run build:ios && npm run test:ios",
@@ -13,7 +14,7 @@
"test:android": "detox test -c android.emu.debug", "test:android": "detox test -c android.emu.debug",
"e2e:android": "npm run build:android && npm run test:android", "e2e:android": "npm run build:android && npm run test:android",
"build:android-release": "detox build -c android.emu.release", "build:android-release": "detox build -c android.emu.release",
"test:android-release": "detox test -c android.emu.release", "test:android-release": "detox test -c android.emu.release --headless",
"e2e:android-release": "npm run build:android-release && npm run test:android-release", "e2e:android-release": "npm run build:android-release && npm run test:android-release",
"clean:android": "pushd android && ./gradlew clean && popd", "clean:android": "pushd android && ./gradlew clean && popd",
"start": "expo start --dev-client", "start": "expo start --dev-client",
@@ -21,48 +22,27 @@
"android": "expo run:android" "android": "expo run:android"
}, },
"dependencies": { "dependencies": {
"@config-plugins/android-jsc-intl": "*", "@config-plugins/detox": "^1.0.0",
"@config-plugins/detox": "*", "expo": "^43.0.0",
"@config-plugins/ffmpeg-kit-react-native": "*", "expo-localization": "~11.0.0",
"@config-plugins/ios-stickers": "*", "expo-splash-screen": "~0.13.5",
"@config-plugins/react-native-adjust": "*", "expo-status-bar": "~1.1.0",
"@config-plugins/react-native-ble-plx": "*", "expo-updates": "~0.10.13",
"@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",
"expo-status-bar": "~1.2.0",
"expo-updates": "~0.11.2",
"fbjs": "^0.8.18",
"ffmpeg-kit-react-native": "^4.5.0", "ffmpeg-kit-react-native": "^4.5.0",
"i18n-js": "^3.8.0", "i18n-js": "^3.8.0",
"luxon": "^1.27.0",
"react": "17.0.1", "react": "17.0.1",
"react-dom": "17.0.1",
"react-native": "0.64.3", "react-native": "0.64.3",
"react-native-adjust": "^4.29.5", "react-native-reanimated": "~2.2.0",
"react-native-blob-util": "^0.13.17",
"react-native-callkeep": "^4.2.0",
"react-native-branch": "^5.3.0",
"react-native-dynamic-app-icon": "^1.1.0",
"react-native-google-cast": "^4.1.2",
"react-native-pdf": "^6.4.0",
"react-native-quick-actions": "^0.3.13",
"react-native-safe-area-context": "3.3.2", "react-native-safe-area-context": "3.3.2",
"react-native-web": "0.17.1", "react-native-screens": "~3.8.0",
"react-native-webrtc": "^1.89.3" "react-dom": "17.0.1",
"react-native-gesture-handler": "~1.10.2",
"react-native-web": "0.17.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.9", "@babel/core": "^7.12.9",
"@babel/plugin-syntax-jsx": "^7.16.0", "@babel/plugin-syntax-jsx": "^7.16.0",
"@expo/metro-config": "~0.3.7", "@expo/metro-config": "~0.3.0",
"@expo/xcpretty": "^4.1.0", "@expo/xcpretty": "^4.1.0",
"@types/jest": "^26.0.19", "@types/jest": "^26.0.19",
"@types/luxon": "^1.27.1", "@types/luxon": "^1.27.1",
@@ -70,7 +50,7 @@
"@types/react-native": "~0.64.12", "@types/react-native": "~0.64.12",
"babel-jest": "~25.2.6", "babel-jest": "~25.2.6",
"detox": "^19.1.0", "detox": "^19.1.0",
"jest": "^26.6.3", "jest": "^26.5.0",
"jest-circus": "^26.5.2", "jest-circus": "^26.5.2",
"ts-jest": "^26.4.4", "ts-jest": "^26.4.4",
"typescript": "~4.3.5" "typescript": "~4.3.5"
-27
View File
@@ -1,27 +0,0 @@
import React from "react";
import { SafeAreaView, Text, StyleSheet } from "react-native";
import { Adjust, AdjustConfig } from "react-native-adjust";
export default function App() {
React.useEffect(() => {
const adjustConfig = new AdjustConfig(
"APP_TOKEN",
AdjustConfig.EnvironmentSandbox
);
Adjust.create(adjustConfig);
}, []);
return (
<SafeAreaView style={styles.container}>
<Text>Adjust SDK</Text>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});
+1 -20
View File
@@ -1,14 +1,9 @@
{ {
"name": "@config-plugins/repo",
"version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"postinstall": "expo-yarn-workspaces check-workspace-dependencies", "postinstall": "expo-yarn-workspaces check-workspace-dependencies",
"gen": "ts-node ./scripts/generate-plugin.ts", "gen": "ts-node ./scripts/generate-plugin.ts",
"update-issue-template": "ts-node ./scripts/gh-issues-config.ts", "start": "lerna run build --parallel -- --watch"
"update-dependabot-config": "ts-node ./scripts/update-dependabot-config.ts",
"start": "lerna run build --parallel -- --watch",
"prepare": "lerna run prepare --parallel"
}, },
"workspaces": [ "workspaces": [
"apps/*", "apps/*",
@@ -16,22 +11,8 @@
], ],
"devDependencies": { "devDependencies": {
"@expo/package-manager": "^0.0.43", "@expo/package-manager": "^0.0.43",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/commit-analyzer": "^9.0.2",
"@semantic-release/error": "^3.0.0",
"@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"@semantic-release/github": "^8.0.2",
"@semantic-release/npm": "^9.0.1",
"@semantic-release/release-notes-generator": "^10.0.3",
"conventional-changelog-conventionalcommits": "^4.6.3",
"multi-semantic-release": "^2.11.1",
"semantic-release": "^19.0.2",
"@types/js-yaml": "^4.0.5",
"@types/prompts": "^2.0.13", "@types/prompts": "^2.0.13",
"eslint": "^7.25.0",
"expo-yarn-workspaces": "^1.5.1", "expo-yarn-workspaces": "^1.5.1",
"js-yaml": "^4.1.0",
"lerna": "3.4.1", "lerna": "3.4.1",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"prompts": "^2.4.1", "prompts": "^2.4.1",
-43
View File
@@ -1,43 +0,0 @@
### @config-plugins/android-jsc-intl [1.0.3](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/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)
### Features
* Intl support for android via withAndroidJscIntl ([eb6642c](https://github.com/expo/config-plugins/commit/eb6642c0e7b37d6d9baf196ec40cc520f559e665))
### Bug Fixes
* remove createPluginOnce ([68cf1c0](https://github.com/expo/config-plugins/commit/68cf1c07b2c48249cbbd0732668ea95455636a0b))
* run expo prepare ([8d364ed](https://github.com/expo/config-plugins/commit/8d364ed99ea4b0e0e3af73dbcc780819bf55d6c2))
### Other chores
* upgrade @expo/config-plugins ([#49](https://github.com/expo/config-plugins/issues/49)) ([119e31e](https://github.com/expo/config-plugins/commit/119e31edf110409272ace750f02d651124e1a22d))
### Documentation changes
* clarify readme ([b524633](https://github.com/expo/config-plugins/commit/b5246338cb37ae41d138bc6253703b0d438fc3e3))
+1 -1
View File
@@ -6,7 +6,7 @@ Adding this plugin lets you use `Intl` in your Android app, without using Hermes
## Expo installation ## Expo installation
> Tested against Expo SDK 44 > Tested against Expo SDK 43
This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/). This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
+3 -8
View File
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/android-jsc-intl", "name": "@config-plugins/android-jsc-intl",
"version": "1.0.3", "version": "0.0.1",
"description": "Config plugin for android-jsc-intl package", "description": "Config plugin for android-jsc-intl package",
"main": "build/withAndroidJscIntl.js", "main": "build/withAndroidJscIntl.js",
"types": "build/withAndroidJscIntl.d.ts", "types": "build/withAndroidJscIntl.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/android-jsc-intl"
},
"scripts": { "scripts": {
"build": "expo-module build", "build": "expo-module build",
"clean": "expo-module clean", "clean": "expo-module clean",
@@ -31,9 +26,9 @@
"preset": "expo-module-scripts" "preset": "expo-module-scripts"
}, },
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0" "@expo/config-plugins": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
"expo-module-scripts": "^2.0.0" "expo-module-scripts": "^2.0.0"
} }
} }
@@ -2,24 +2,22 @@ import { ConfigPlugin, withAppBuildGradle } from "@expo/config-plugins";
/** /**
* Apply android-jsc-intl configuration for Expo SDK 42 projects. * Apply android-jsc-intl configuration for Expo SDK 42 projects.
* *
* This plugin lets you access the `Intl` API in Android apps (without Hermes). * This plugin lets you access the `Intl` API in Android apps (without Hermes).
*/ */
const withAndroidJscIntl: ConfigPlugin = (config) => { const withAndroidJscIntl: ConfigPlugin = (config) => {
// Return the modified config. // Return the modified config.
return withAppBuildGradle(config, (config) => { return withAppBuildGradle(config, config => {
if (config.modResults.language === "groovy") { if (config.modResults.language === 'groovy') {
config.modResults.contents = config.modResults.contents.replace( config.modResults.contents = config.modResults.contents.replace(
"org.webkit:android-jsc:+", 'org.webkit:android-jsc:+',
"org.webkit:android-jsc-intl:+" 'org.webkit:android-jsc-intl:+'
); )
} else { } else {
throw new Error( throw new Error('[@expo/config-plugins][withAndroidJscIntl] Cannot enable Intl in Android JSC app gradle because the build.gradle is not groovy.')
"[@expo/config-plugins][withAndroidJscIntl] Cannot enable Intl in Android JSC app gradle because the build.gradle is not groovy."
);
} }
return config; return config
}); });
}; };
export default withAndroidJscIntl; export default withAndroidJscIntl
-22
View File
@@ -1,22 +0,0 @@
### @config-plugins/detox [1.2.3](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/detox [1.2.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
### Bug Fixes
* **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
+3 -27
View File
@@ -8,15 +8,14 @@ Ensure you use versions that work together!
| `expo` | `detox` | `@config-plugins/detox` | | `expo` | `detox` | `@config-plugins/detox` |
| ------ | ------- | ----------------------- | | ------ | ------- | ----------------------- |
| 44.0.0 | 19.1.0 | ^1.1.0 | | 43.0.0 | 19.1.0 | 1.0.0 |
| 43.0.0 | 19.1.0 | ~1.0.0 | | 40.0.0 | 18.6.2 | 0.0.0 |
| 40.0.0 | 18.6.2 | ~0.0.0 |
Most notably, the minimum required Kotlin version changed from `1.3.50` in SDK 40 to `1.4.21` in SDK 43. Failure to use the correct versioning could result in Android build errors like `Execution failed for task ':react-native-screens:compileDebugKotlin'.` or `Execution failed for task ':expo:compileDebugKotlin'.`. Most notably, the minimum required Kotlin version changed from `1.3.50` in SDK 40 to `1.4.21` in SDK 43. Failure to use the correct versioning could result in Android build errors like `Execution failed for task ':react-native-screens:compileDebugKotlin'.` or `Execution failed for task ':expo:compileDebugKotlin'.`.
### Add the package to your npm dependencies ### Add the package to your npm dependencies
> Tested against Expo SDK 44 > Tested against Expo SDK 43
``` ```
yarn add detox @config-plugins/detox yarn add detox @config-plugins/detox
@@ -53,29 +52,6 @@ Detox is an end-to-end (e2e) testing library for iOS and Android. You can use it
- Generate the native code `expo prebuild` - Generate the native code `expo prebuild`
- Run `yarn detox init -r jest` - Run `yarn detox init -r jest`
## API
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
- `skipProguard` (_boolean_): Disable adding proguard minification to the `app/build.gradle`. Defaults to `false`.
- `subdomains` (_string[] | '\*'_): Hostnames to add to the network security config. Pass `'*'` to allow all domains. Defaults to `['10.0.2.2', 'localhost']`.
`app.config.js`
```ts
export default {
plugins: [
[
"@config-plugins/detox",
{
skipProguard: false,
subdomains: ["10.0.2.2", "localhost"],
},
],
],
};
```
## FAQ ## FAQ
If the following commands fail, you can get better debug info by running a subset command: If the following commands fail, you can get better debug info by running a subset command:
+1 -3
View File
@@ -1,5 +1,4 @@
import { ConfigPlugin } from "@expo/config-plugins"; import { ConfigPlugin } from "@expo/config-plugins";
import { SubdomainsType } from "./withNetworkSecurityConfig";
declare const _default: ConfigPlugin<void | { declare const _default: ConfigPlugin<void | {
/** /**
* Disable adding proguard minification to the `app/build.gradle`. * Disable adding proguard minification to the `app/build.gradle`.
@@ -10,10 +9,9 @@ declare const _default: ConfigPlugin<void | {
/** /**
* Subdomains to add to the network security config. * Subdomains to add to the network security config.
* Pass `['10.0.3.2', 'localhost']` to use Genymotion emulators instead of Google emulators. * 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) * @default ['10.0.2.2', 'localhost'] // (Google emulators)
*/ */
subdomains?: SubdomainsType | undefined; subdomains?: string[] | undefined;
}>; }>;
export default _default; export default _default;
+2 -3
View File
@@ -1,9 +1,8 @@
import { ConfigPlugin } from "@expo/config-plugins"; import { ConfigPlugin } from "@expo/config-plugins";
export declare type SubdomainsType = string[] | "*"; export declare function getTemplateFile(subdomains: string[]): 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`. * [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<{ export declare const withNetworkSecurityConfigManifest: ConfigPlugin<{
subdomains: SubdomainsType; subdomains: string[];
} | void>; } | void>;
+6 -24
View File
@@ -27,30 +27,16 @@ const config_plugins_1 = require("@expo/config-plugins");
const path = __importStar(require("path")); const path = __importStar(require("path"));
const fs = __importStar(require("fs")); const fs = __importStar(require("fs"));
const assert_1 = __importDefault(require("assert")); const assert_1 = __importDefault(require("assert"));
function getTemplateConfigContent(subdomains) { function getTemplateFile(subdomains) {
if (subdomains === "*") { return `<?xml version="1.0" encoding="utf-8"?>
// allow all domains <network-security-config>
return '<base-config cleartextTrafficPermitted="true" />';
}
return `
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">
${subdomains ${subdomains
.map((subdomain) => `<domain includeSubdomains="true">${subdomain}</domain>`) .map((subdomain) => `<domain includeSubdomains="true">${subdomain}</domain>`)
.join("")} .join("")}
</domain-config> </domain-config>
`; </network-security-config>
} `;
function getTemplateFile(subdomains) {
const content = getTemplateConfigContent(subdomains);
/**
* 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>`;
} }
exports.getTemplateFile = getTemplateFile; exports.getTemplateFile = getTemplateFile;
/** /**
@@ -79,10 +65,6 @@ const withNetworkSecurityConfigManifest = (config, props) => {
// https://developer.android.com/training/articles/security-config // https://developer.android.com/training/articles/security-config
props = { subdomains: ["10.0.2.2", "localhost"] }; 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); config = withNetworkSecurityConfigFile(config, props);
return config_plugins_1.withAndroidManifest(config, (config) => { return config_plugins_1.withAndroidManifest(config, (config) => {
const application = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults); const application = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
+4 -4
View File
@@ -26,10 +26,10 @@ function addDetoxProguardRules(buildGradle) {
return buildGradle; return buildGradle;
} }
return buildGradle.replace(/proguardFiles getDefaultProguardFile\("proguard-android.txt"\),\s?"proguard-rules.pro"/, `proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 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 // 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") def detoxProguardRulesPath = new File(["node", "--print", "require.resolve('detox/package.json')"].execute(null, rootDir).text.trim(), "../android/detox/proguard-rules-app.pro")
proguardFile(detoxProguardRulesPath) proguardFile(detoxProguardRulesPath)
`); `);
} }
exports.addDetoxProguardRules = addDetoxProguardRules; exports.addDetoxProguardRules = addDetoxProguardRules;
exports.default = withProguardGradle; exports.default = withProguardGradle;
+3 -9
View File
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/detox", "name": "@config-plugins/detox",
"version": "1.2.3", "version": "1.1.0",
"description": "Config plugin to auto configure detox on prebuild", "description": "Config plugin to auto configure detox on prebuild",
"main": "build/withDetox.js", "main": "build/withDetox.js",
"types": "build/withDetox.d.ts", "types": "build/withDetox.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/detox"
},
"files": [ "files": [
"build", "build",
"app.plugin.js" "app.plugin.js"
@@ -30,10 +25,9 @@
"e2e" "e2e"
], ],
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0" "@expo/config-plugins": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
"expo-module-scripts": "^2.0.0" "expo-module-scripts": "^2.0.0"
}, }
"upstreamPackage": "detox"
} }
@@ -1,39 +0,0 @@
// 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>
<domain-config cleartextTrafficPermitted=\\"true\\">
<domain includeSubdomains=\\"true\\">localhost</domain>
</domain-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>"
`;
exports[`withNetworkSecurityConfigManifest doesn't modify config if subdomains is an empty array 1`] = `
Object {
"name": "foo",
"slug": "bar",
}
`;
exports[`withNetworkSecurityConfigManifest modifies config if subdomains is not empty 1`] = `
Object {
"mods": Object {
"android": Object {
"dangerous": [Function],
"manifest": [Function],
},
},
"name": "foo",
"slug": "bar",
}
`;
@@ -1,38 +0,0 @@
import {
getTemplateFile,
withNetworkSecurityConfigManifest,
} from "../withNetworkSecurityConfig";
describe(getTemplateFile, () => {
it(`returns only base-config when subdomains is '*'`, () => {
const content = getTemplateFile("*");
expect(content).toMatchSnapshot();
expect(content).toMatch(/base-config/);
expect(content).not.toMatch(/domain-config/);
});
it(`returns domain-config when subdomains is an array`, () => {
const content = getTemplateFile(["localhost"]);
expect(content).toMatchSnapshot();
expect(content).toMatch(/domain-config/);
expect(content).toMatch(/localhost/);
});
});
const exp = { name: "foo", slug: "bar" };
describe(withNetworkSecurityConfigManifest, () => {
it(`doesn't modify config if subdomains is an empty array`, () => {
const applied = withNetworkSecurityConfigManifest(exp, {
subdomains: [],
});
expect(applied).toMatchSnapshot();
expect(applied).toStrictEqual(exp);
});
it(`modifies config if subdomains is not empty`, () => {
const applied = withNetworkSecurityConfigManifest(exp, {
subdomains: ["10.0.2.2"],
});
expect(applied).toMatchSnapshot();
expect(applied).toHaveProperty("mods.android");
});
});
+2 -6
View File
@@ -8,10 +8,7 @@ import withDetoxProjectGradle from "./withDetoxProjectGradle";
import withDetoxTestAppGradle from "./withDetoxTestAppGradle"; import withDetoxTestAppGradle from "./withDetoxTestAppGradle";
import { withDetoxTestClass } from "./withDetoxTestClass"; import { withDetoxTestClass } from "./withDetoxTestClass";
import withKotlinGradle from "./withKotlinGradle"; import withKotlinGradle from "./withKotlinGradle";
import { import { withNetworkSecurityConfigManifest } from "./withNetworkSecurityConfig";
withNetworkSecurityConfigManifest,
SubdomainsType,
} from "./withNetworkSecurityConfig";
import withProguardGradle from "./withProguardGradle"; import withProguardGradle from "./withProguardGradle";
const withDetox: ConfigPlugin<{ const withDetox: ConfigPlugin<{
@@ -24,11 +21,10 @@ const withDetox: ConfigPlugin<{
/** /**
* Subdomains to add to the network security config. * Subdomains to add to the network security config.
* Pass `['10.0.3.2', 'localhost']` to use Genymotion emulators instead of Google emulators. * 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) * @default ['10.0.2.2', 'localhost'] // (Google emulators)
*/ */
subdomains?: SubdomainsType; subdomains?: string[];
} | void> = (config, { skipProguard, subdomains } = {}) => { } | void> = (config, { skipProguard, subdomains } = {}) => {
return withPlugins( return withPlugins(
config, config,
+1 -1
View File
@@ -28,7 +28,7 @@ const withDetoxTestAppGradle: ConfigPlugin = (config) => {
export function setGradleAndroidTestImplementation( export function setGradleAndroidTestImplementation(
buildGradle: string buildGradle: string
): string { ): string {
const pattern = /androidTestImplementation\('com.wix:detox:\+'\)/g; const pattern = /androidTestImplementation\(\'com.wix:detox:\+\'\)/g;
if (buildGradle.match(pattern)) { if (buildGradle.match(pattern)) {
return buildGradle; return buildGradle;
} }
+2 -2
View File
@@ -1,7 +1,7 @@
import { ConfigPlugin, withDangerousMod } from "@expo/config-plugins"; import { ConfigPlugin, withDangerousMod } from "@expo/config-plugins";
import * as path from "path";
import * as fs from "fs";
import assert from "assert"; import assert from "assert";
import fs from "fs";
import path from "path";
/** /**
* 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). * 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).
+18 -40
View File
@@ -4,48 +4,32 @@ import {
withAndroidManifest, withAndroidManifest,
withDangerousMod, withDangerousMod,
} from "@expo/config-plugins"; } from "@expo/config-plugins";
import * as path from "path";
import * as fs from "fs";
import assert from "assert"; import assert from "assert";
import fs from "fs";
import path from "path";
export type SubdomainsType = string[] | "*"; export function getTemplateFile(subdomains: string[]): string {
function getTemplateConfigContent(subdomains: SubdomainsType) {
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>
`;
}
export function getTemplateFile(subdomains: SubdomainsType): string {
const content = getTemplateConfigContent(subdomains);
/**
* 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"?> return `<?xml version="1.0" encoding="utf-8"?>
<network-security-config> <network-security-config>
${content} <domain-config cleartextTrafficPermitted="true">
</network-security-config>`; ${subdomains
.map(
(subdomain) =>
`<domain includeSubdomains="true">${subdomain}</domain>`
)
.join("")}
</domain-config>
</network-security-config>
`;
} }
/** /**
* Create `network_security_config.xml` resource file. * Create `network_security_config.xml` resource file.
*/ */
const withNetworkSecurityConfigFile: ConfigPlugin<{ const withNetworkSecurityConfigFile: ConfigPlugin<{ subdomains: string[] }> = (
subdomains: SubdomainsType; config,
}> = (config, { subdomains }) => { { subdomains }
) => {
return withDangerousMod(config, [ return withDangerousMod(config, [
"android", "android",
async (config) => { async (config) => {
@@ -70,19 +54,13 @@ const withNetworkSecurityConfigFile: ConfigPlugin<{
* [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`. * [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 const withNetworkSecurityConfigManifest: ConfigPlugin<{ export const withNetworkSecurityConfigManifest: ConfigPlugin<{
subdomains: SubdomainsType; subdomains: string[];
} | void> = (config, props) => { } | void> = (config, props) => {
if (!props || !props.subdomains) { if (!props || !props.subdomains) {
// (*) 10.0.2.2 for Google emulators, 10.0.3.2 for Genymotion emulators. // (*) 10.0.2.2 for Google emulators, 10.0.3.2 for Genymotion emulators.
// https://developer.android.com/training/articles/security-config // https://developer.android.com/training/articles/security-config
props = { subdomains: ["10.0.2.2", "localhost"] }; 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); config = withNetworkSecurityConfigFile(config, props);
return withAndroidManifest(config, (config) => { return withAndroidManifest(config, (config) => {
const application = AndroidConfig.Manifest.getMainApplicationOrThrow( const application = AndroidConfig.Manifest.getMainApplicationOrThrow(
+1 -1
View File
@@ -23,7 +23,7 @@ const withProguardGradle: ConfigPlugin = (config) => {
}; };
export function addDetoxProguardRules(buildGradle: string): string { export function addDetoxProguardRules(buildGradle: string): string {
const pattern = /detox\/proguard-rules-app\.pro/g; const pattern = /detox\/proguard\-rules\-app\.pro/g;
if (buildGradle.match(pattern)) { if (buildGradle.match(pattern)) {
return buildGradle; return buildGradle;
} }
@@ -1,27 +0,0 @@
### @config-plugins/ffmpeg-kit-react-native [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
### 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/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)
### 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
View File
@@ -4,7 +4,7 @@ Config plugin to auto configure ffmpeg-kit-react-native when the native code is
## Expo installation ## Expo installation
> Tested against Expo SDK 44. Most packages worked on iOS. Not all packages have been tested on Android. > Tested against Expo SDK 43. Only the `min` package appeared to work on Android. Most packages worked on iOS.
> This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/). > This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
> First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install). > First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
@@ -0,0 +1,10 @@
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;
@@ -0,0 +1,31 @@
"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;
+2 -1
View File
@@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const config_plugins_1 = require("@expo/config-plugins"); const config_plugins_1 = require("@expo/config-plugins");
const withAndroidFFMPEGPackage_1 = require("./withAndroidFFMPEGPackage"); const withAndroidFFMPEGPackage_1 = require("./withAndroidFFMPEGPackage");
const withBuildScriptExtMinimumVersion_1 = require("./withBuildScriptExtMinimumVersion");
const withCocoaPodsImport_1 = require("./withCocoaPodsImport"); const withCocoaPodsImport_1 = require("./withCocoaPodsImport");
const withIosDeploymentTarget_1 = require("./withIosDeploymentTarget"); const withIosDeploymentTarget_1 = require("./withIosDeploymentTarget");
let pkg = { let pkg = {
@@ -30,7 +31,7 @@ const withFFMPEG = (config, _props) => {
// Android // Android
// Set min SDK Version to 24. // Set min SDK Version to 24.
[ [
config_plugins_1.AndroidConfig.Version.withBuildScriptExtMinimumVersion, withBuildScriptExtMinimumVersion_1.withBuildScriptExtMinimumVersion,
{ {
name: "minSdkVersion", name: "minSdkVersion",
minVersion: 24, minVersion: 24,
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.updateDeploymentTargetXcodeProject = exports.updateDeploymentTargetPodfile = exports.withIosDeploymentTarget = void 0; 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 config_plugins_1 = require("@expo/config-plugins");
const fs_1 = __importDefault(require("fs")); const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path")); const path_1 = __importDefault(require("path"));
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/ffmpeg-kit-react-native", "name": "@config-plugins/ffmpeg-kit-react-native",
"version": "1.0.3", "version": "0.0.0",
"description": "Config plugin to auto configure FFMPEG on prebuild", "description": "Config plugin to auto configure FFMPEG on prebuild",
"main": "build/withFFMPEG.js", "main": "build/withFFMPEG.js",
"types": "build/withFFMPEG.d.ts", "types": "build/withFFMPEG.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/ffmpeg-kit-react-native"
},
"files": [ "files": [
"build", "build",
"app.plugin.js" "app.plugin.js"
@@ -32,12 +27,11 @@
"preset": "expo-module-scripts" "preset": "expo-module-scripts"
}, },
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0", "@expo/config-plugins": "^4.0.7",
"semver": "^7.3.5" "semver": "^7.3.5"
}, },
"devDependencies": { "devDependencies": {
"@types/semver": "^7.3.9", "@types/semver": "^7.3.9",
"expo-module-scripts": "^2.0.0" "expo-module-scripts": "^2.0.0"
}, }
"upstreamPackage": "ffmpeg-kit-react-native"
} }
@@ -0,0 +1,89 @@
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.'
);
});
});
@@ -0,0 +1,50 @@
// 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 { import {
AndroidConfig,
ConfigPlugin, ConfigPlugin,
createRunOncePlugin, createRunOncePlugin,
withPlugins, withPlugins,
} from "@expo/config-plugins"; } from "@expo/config-plugins";
import { withAndroidFFMPEGPackage } from "./withAndroidFFMPEGPackage"; import { withAndroidFFMPEGPackage } from "./withAndroidFFMPEGPackage";
import { withBuildScriptExtMinimumVersion } from "./withBuildScriptExtMinimumVersion";
import { import {
withCocoaPodsImport, withCocoaPodsImport,
withPodfilePropertiesPackage, withPodfilePropertiesPackage,
@@ -56,7 +56,7 @@ const withFFMPEG: ConfigPlugin<void | Props> = (config, _props) => {
// Set min SDK Version to 24. // Set min SDK Version to 24.
[ [
AndroidConfig.Version.withBuildScriptExtMinimumVersion, withBuildScriptExtMinimumVersion,
{ {
name: "minSdkVersion", name: "minSdkVersion",
minVersion: 24, minVersion: 24,
-25
View File
@@ -1,25 +0,0 @@
### @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
View File
@@ -4,7 +4,7 @@ Config plugin to auto configure iOS iMessage stickers
## Install ## Install
> Tested against Expo SDK 44 > Tested against Expo SDK 43
``` ```
yarn add @config-plugins/ios-stickers yarn add @config-plugins/ios-stickers
-58
View File
@@ -1,58 +0,0 @@
{
"title": "@config-plugins/ios-stickers options",
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/Props",
"definitions": {
"Props": {
"type": "object",
"properties": {
"stickers": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"$ref": "#/definitions/Sticker"
}
]
}
},
"icon": {
"type": "string"
},
"name": {
"type": "string"
},
"columns": {
"type": "number",
"enum": [
2,
3,
4
]
}
},
"additionalProperties": false
},
"Sticker": {
"type": "object",
"properties": {
"image": {
"type": "string"
},
"name": {
"type": "string"
},
"accessibilityLabel": {
"type": "string"
}
},
"required": [
"image"
],
"additionalProperties": false
}
}
}
-1
View File
@@ -1,5 +1,4 @@
import { ConfigPlugin } from "@expo/config-plugins"; import { ConfigPlugin } from "@expo/config-plugins";
/** Dangerously applies sticker assets to the iOS project. */
export declare const withStickerAssets: ConfigPlugin<{ export declare const withStickerAssets: ConfigPlugin<{
icon?: string; icon?: string;
size: string; size: string;
+1 -1
View File
@@ -44,7 +44,6 @@ function createSticker({ stickerpackPath, name, imageBuffer, extension, accessib
name: stickerName, name: stickerName,
}; };
} }
/** Dangerously applies sticker assets to the iOS project. */
const withStickerAssets = (config, { stickers, icon, size }) => { const withStickerAssets = (config, { stickers, icon, size }) => {
// Default to using the app icon // Default to using the app icon
if (!icon) { if (!icon) {
@@ -96,6 +95,7 @@ const withStickerAssets = (config, { stickers, icon, size }) => {
projectRoot: config.modRequest.projectRoot, projectRoot: config.modRequest.projectRoot,
cacheType: "ios-stickers", cacheType: "ios-stickers",
}, { }, {
resizeMode: "contain",
src, src,
}); });
// let results; // let results;
+1 -6
View File
@@ -4,8 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.normalizeStickersProps = void 0; exports.normalizeStickersProps = void 0;
const schema_utils_1 = require("schema-utils");
const options_json_1 = __importDefault(require("./options.json"));
const withStickerAssets_1 = require("./withStickerAssets"); const withStickerAssets_1 = require("./withStickerAssets");
const withStickerInfoPlist_1 = require("./withStickerInfoPlist"); const withStickerInfoPlist_1 = require("./withStickerInfoPlist");
const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget"); const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget");
@@ -31,10 +29,7 @@ function normalizeStickersProps(props = []) {
}); });
} }
exports.normalizeStickersProps = normalizeStickersProps; exports.normalizeStickersProps = normalizeStickersProps;
const withStickerPack = (config, options = {}) => { const withStickerPack = (config, { stickers, icon, name, columns = 3 } = {}) => {
// Perform option validation.
schema_utils_1.validate(options_json_1.default, options);
const { stickers, icon, name, columns = 3 } = options;
const size = sizeColumnMap[columns] || "regular"; const size = sizeColumnMap[columns] || "regular";
if (!size) { if (!size) {
throw new Error(`Column size "${columns}" is invalid. Expected one of: ${Object.keys(sizeColumnMap).join(", ")}`); throw new Error(`Column size "${columns}" is invalid. Expected one of: ${Object.keys(sizeColumnMap).join(", ")}`);
-1
View File
@@ -1 +0,0 @@
module.exports = require('expo-module-scripts/jest-preset-plugin');
+5 -8
View File
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/ios-stickers", "name": "@config-plugins/ios-stickers",
"version": "1.0.2", "version": "0.0.4",
"description": "Config plugin to auto configure iOS iMessage stickers", "description": "Config plugin to auto configure iOS iMessage stickers",
"main": "build/withStickerPack.js", "main": "build/withStickerPack.js",
"types": "build/withStickerPack.d.ts", "types": "build/withStickerPack.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/ios-stickers"
},
"scripts": { "scripts": {
"build": "expo-module build", "build": "expo-module build",
"clean": "expo-module clean", "clean": "expo-module clean",
@@ -23,10 +18,12 @@
"react", "react",
"expo" "expo"
], ],
"jest": {
"preset": "expo-module-scripts"
},
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0", "@expo/config-plugins": "^4.0.7",
"@expo/image-utils": "^0.3.17", "@expo/image-utils": "^0.3.17",
"schema-utils": "^4.0.0",
"xcode": "^3.0.1" "xcode": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -1,32 +0,0 @@
import withStickerPack from "../withStickerPack";
const exp = { name: "foo", slug: "bar" };
describe(withStickerPack, () => {
it("should not throw when options are valid", () => {
expect(() =>
withStickerPack(exp, {
name: "test",
stickers: [{ image: "test.png" }],
columns: 2,
icon: "test.png",
})
).not.toThrow();
});
it("should not throw when no options are provided", () => {
expect(() => withStickerPack(exp, {})).not.toThrow();
});
it("should throw if columns is not a number", () => {
expect(() => {
withStickerPack(exp, {
stickers: [],
icon: "",
name: "",
columns: "3",
} as any);
}).toThrowErrorMatchingInlineSnapshot(`
"Invalid options object. @config-plugins/ios-stickers has been initialized using an options object that does not match the API schema.
- options.columns should be one of these:
2 | 3 | 4"
`);
});
});
-58
View File
@@ -1,58 +0,0 @@
{
"title": "@config-plugins/ios-stickers options",
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/Props",
"definitions": {
"Props": {
"type": "object",
"properties": {
"stickers": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"$ref": "#/definitions/Sticker"
}
]
}
},
"icon": {
"type": "string"
},
"name": {
"type": "string"
},
"columns": {
"type": "number",
"enum": [
2,
3,
4
]
}
},
"additionalProperties": false
},
"Sticker": {
"type": "object",
"properties": {
"image": {
"type": "string"
},
"name": {
"type": "string"
},
"accessibilityLabel": {
"type": "string"
}
},
"required": [
"image"
],
"additionalProperties": false
}
}
}
@@ -68,7 +68,6 @@ function createSticker({
}; };
} }
/** Dangerously applies sticker assets to the iOS project. */
export const withStickerAssets: ConfigPlugin<{ export const withStickerAssets: ConfigPlugin<{
icon?: string; icon?: string;
size: string; size: string;
@@ -174,6 +173,7 @@ export const withStickerAssets: ConfigPlugin<{
cacheType: "ios-stickers", cacheType: "ios-stickers",
}, },
{ {
resizeMode: "contain",
src, src,
} as any } as any
); );
+5 -9
View File
@@ -1,11 +1,9 @@
import { ConfigPlugin } from "@expo/config-plugins"; import { ConfigPlugin } from "@expo/config-plugins";
import path from "path";
import { validate } from "schema-utils";
import schema from "./options.json";
import { Props, Sticker, withStickerAssets } from "./withStickerAssets"; import { Props, Sticker, withStickerAssets } from "./withStickerAssets";
import { withStickersPlist } from "./withStickerInfoPlist"; import { withStickersPlist } from "./withStickerInfoPlist";
import { withStickerXcodeTarget } from "./withStickerXcodeTarget"; import { withStickerXcodeTarget } from "./withStickerXcodeTarget";
import path from "path";
// TODO: Maybe the name is better to use as a prop... // TODO: Maybe the name is better to use as a prop...
const sizeColumnMap: Record<number, string> = { const sizeColumnMap: Record<number, string> = {
@@ -32,12 +30,10 @@ export function normalizeStickersProps(
}); });
} }
const withStickerPack: ConfigPlugin<Props> = (config, options = {}) => { const withStickerPack: ConfigPlugin<Props> = (
// Perform option validation. config,
validate(schema as any, options); { stickers, icon, name, columns = 3 } = {}
) => {
const { stickers, icon, name, columns = 3 } = options;
const size = sizeColumnMap[columns] || "regular"; const size = sizeColumnMap[columns] || "regular";
if (!size) { if (!size) {
throw new Error( throw new Error(
+3 -3
View File
@@ -91,9 +91,9 @@ export function addStickersTarget(
subfolder: string subfolder: string
) { ) {
// Setup uuid and name of new target // Setup uuid and name of new target
const targetUuid = proj.generateUuid(); let targetUuid = proj.generateUuid();
const targetType = "app_extension_messages_sticker_pack"; let targetType = "app_extension_messages_sticker_pack";
const targetName = name.trim(); let targetName = name.trim();
const bundleName = subfolder.trim().split(" ").join("-"); const bundleName = subfolder.trim().split(" ").join("-");
// Check type against list of allowed target types // Check type against list of allowed target types
+1 -2
View File
@@ -1,8 +1,7 @@
{ {
"extends": "expo-module-scripts/tsconfig.plugin", "extends": "expo-module-scripts/tsconfig.plugin",
"compilerOptions": { "compilerOptions": {
"outDir": "./build", "outDir": "./build"
"resolveJsonModule": true
}, },
"include": ["./src"], "include": ["./src"],
"exclude": ["**/__mocks__/*", "**/__tests__/*"] "exclude": ["**/__mocks__/*", "**/__tests__/*"]
@@ -1,2 +0,0 @@
// @generated by expo-module-scripts
module.exports = require('expo-module-scripts/eslintrc.base.js');
-20
View File
@@ -1,20 +0,0 @@
### @config-plugins/react-native-adjust [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/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))
-42
View File
@@ -1,42 +0,0 @@
# @config-plugins/react-native-adjust
Expo Config Plugin to auto configure [`react-native-adjust`](https://www.npmjs.com/package/react-native-adjust) when the native code is generated (`expo prebuild`).
## Expo installation
> Tested against Expo SDK 44
This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
- First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
```sh
expo install react-native-adjust @config-plugins/react-native-adjust
```
After installing this npm package, add the [config plugin](https://docs.expo.io/guides/config-plugins/) to the [`plugins`](https://docs.expo.io/versions/latest/config/app/#plugins) array of your `app.json` or `app.config.js`:
```json
{
"expo": {
"plugins": ["@config-plugins/react-native-adjust"]
}
}
```
If you are targeting Android 12 and above (API level 31), you need to add it in the options of the plugin:
```json
{
"expo": {
"plugins": [
"@config-plugins/react-native-adjust",
{ "targetAndroid12": true }
]
}
}
```
This will add the [appropriate permission](https://github.com/adjust/react_native_sdk#add-permission-to-gather-google-advertising-id) for you.
Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
@@ -1 +0,0 @@
module.exports = require("./build/withReactNativeAdjust");
-5
View File
@@ -1,5 +0,0 @@
import { ConfigPlugin } from "@expo/config-plugins";
declare const _default: ConfigPlugin<void | {
targetAndroid12?: boolean | undefined;
}>;
export default _default;
-92
View File
@@ -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);
-40
View File
@@ -1,40 +0,0 @@
{
"name": "@config-plugins/react-native-adjust",
"version": "1.0.2",
"description": "Config plugin to auto configure Adjust SDK on prebuild",
"main": "build/withReactNativeAdjust.js",
"types": "build/withReactNativeAdjust.d.ts",
"sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/react-native-adjust"
},
"scripts": {
"build": "expo-module build",
"clean": "expo-module clean",
"lint": "expo-module lint",
"test": "expo-module test",
"prepare": "expo-module prepare",
"prepublishOnly": "expo-module prepublishOnly",
"expo-module": "expo-module"
},
"keywords": [
"react",
"expo",
"config-plugins",
"prebuild",
"react-native-adjust",
"expo-44"
],
"jest": {
"preset": "expo-module-scripts"
},
"dependencies": {
"@expo/config-plugins": "^4.1.0"
},
"devDependencies": {
"expo-module-scripts": "^2.0.0"
},
"upstreamPackage": "react-native-adjust"
}
@@ -1,124 +0,0 @@
import {
AndroidConfig,
createRunOncePlugin,
IOSConfig,
withXcodeProject,
withAppBuildGradle,
ConfigPlugin,
} from "@expo/config-plugins";
import { mergeContents } from "@expo/config-plugins/build/utils/generateCode";
const withXcodeLinkBinaryWithLibraries: ConfigPlugin<{
library: string;
status?: string;
}> = (config, { library, status }) => {
return withXcodeProject(config, (config) => {
const options = status === "optional" ? { weak: true } : {};
const target = IOSConfig.XcodeUtils.getApplicationNativeTarget({
project: config.modResults,
projectName: config.modRequest.projectName!,
});
config.modResults.addFramework(library, {
target: target.uuid,
...options,
});
return config;
});
};
const addAndroidPackagingOptions = (src: string) => {
return 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: ConfigPlugin = (config) => {
return 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: ConfigPlugin<void | { targetAndroid12?: boolean }> = (
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 = AndroidConfig.Version.withBuildScriptExtMinimumVersion(config, {
name: "compileSdkVersion",
minVersion: 31,
});
config = 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",
};
export default createRunOncePlugin(withAdjustPlugin, pkg.name, pkg.version);
@@ -1,8 +0,0 @@
{
"extends": "expo-module-scripts/tsconfig.plugin",
"compilerOptions": {
"outDir": "./build"
},
"include": ["./src"],
"exclude": ["**/__mocks__/*", "**/__tests__/*"]
}
@@ -1,20 +0,0 @@
### @config-plugins/react-native-ble-plx [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/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))
+1 -1
View File
@@ -4,7 +4,7 @@ Config plugin to auto configure `react-native-ble-plx` when the native code is g
## Expo installation ## Expo installation
> Tested against Expo SDK 44 > Tested against Expo SDK 43
> This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/). > This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
> First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install). > First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
+3 -9
View File
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/react-native-ble-plx", "name": "@config-plugins/react-native-ble-plx",
"version": "1.0.2", "version": "0.0.2",
"description": "Config plugin to auto configure react-native-ble-plx on prebuild", "description": "Config plugin to auto configure react-native-ble-plx on prebuild",
"main": "build/withBLE.js", "main": "build/withBLE.js",
"types": "build/withBLE.d.ts", "types": "build/withBLE.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/react-native-ble-plx"
},
"files": [ "files": [
"build", "build",
"app.plugin.js" "app.plugin.js"
@@ -31,10 +26,9 @@
"preset": "expo-module-scripts" "preset": "expo-module-scripts"
}, },
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0" "@expo/config-plugins": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
"expo-module-scripts": "^2.0.0" "expo-module-scripts": "^2.0.0"
}, }
"upstreamPackage": "react-native-ble-plx"
} }
@@ -1,44 +1,42 @@
import { AndroidConfig, XML } from "@expo/config-plugins"; import { AndroidConfig, XML } from '@expo/config-plugins'
import { resolve } from "path";
import { import { resolve } from 'path'
addBLEHardwareFeatureToManifest,
addFineControlPermissionToManifest,
} from "../withBLEAndroidManifest";
const { readAndroidManifestAsync } = AndroidConfig.Manifest; import { addBLEHardwareFeatureToManifest, addFineControlPermissionToManifest } from '../withBLEAndroidManifest'
const sampleManifestPath = resolve(__dirname, "fixtures/AndroidManifest.xml"); const { readAndroidManifestAsync } = AndroidConfig.Manifest
describe("addFineControlPermissionToManifest", () => { const sampleManifestPath = resolve(__dirname, 'fixtures/AndroidManifest.xml')
describe('addFineControlPermissionToManifest', () => {
it(`adds element`, async () => { it(`adds element`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath); let androidManifest = await readAndroidManifestAsync(sampleManifestPath)
androidManifest = await addFineControlPermissionToManifest(androidManifest); androidManifest = await addFineControlPermissionToManifest(androidManifest)
expect(androidManifest.manifest["uses-permission-sdk-23"]).toStrictEqual([ expect(androidManifest.manifest['uses-permission-sdk-23']).toStrictEqual([
{ $: { "android:name": "android.permission.ACCESS_FINE_LOCATION" } }, { $: { 'android:name': 'android.permission.ACCESS_FINE_LOCATION' } }
]); ])
// Sanity // Sanity
expect(XML.format(androidManifest)).toMatch( expect(XML.format(androidManifest)).toMatch(
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION"\/>/ /<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION"\/>/
); )
}); })
}); })
describe("addBLEHardwareFeatureToManifest", () => { describe('addBLEHardwareFeatureToManifest', () => {
it(`adds element`, async () => { it(`adds element`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath); let androidManifest = await readAndroidManifestAsync(sampleManifestPath)
androidManifest = await addBLEHardwareFeatureToManifest(androidManifest); androidManifest = await addBLEHardwareFeatureToManifest(androidManifest)
expect(androidManifest.manifest["uses-feature"]).toStrictEqual([ expect(androidManifest.manifest['uses-feature']).toStrictEqual([
{ {
$: { $: {
"android:name": "android.hardware.bluetooth_le", 'android:name': 'android.hardware.bluetooth_le',
"android:required": "true", 'android:required': 'true'
}, }
}, }
]); ])
// Sanity // Sanity
expect(XML.format(androidManifest)).toMatch( expect(XML.format(androidManifest)).toMatch(
/<uses-feature android:name="android\.hardware\.bluetooth_le" android:required="true"\/>/ /<uses-feature android:name="android\.hardware\.bluetooth_le" android:required="true"\/>/
); )
}); })
}); })
@@ -1,3 +1,5 @@
/* eslint-disable flowtype/no-types-missing-file-annotation */
import { import {
AndroidConfig, AndroidConfig,
ConfigPlugin, ConfigPlugin,
@@ -1,10 +1,12 @@
/* eslint-disable flowtype/no-types-missing-file-annotation */
import { import {
ConfigPlugin, ConfigPlugin,
withAndroidManifest, withAndroidManifest,
AndroidConfig, AndroidConfig,
} from "@expo/config-plugins"; } from "@expo/config-plugins";
type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"]; type InnerManifest = AndroidConfig.Manifest.AndroidManifest['manifest'];
type ManifestPermission = InnerManifest["permission"]; type ManifestPermission = InnerManifest["permission"];
@@ -1,50 +1,42 @@
import { ConfigPlugin, withInfoPlist } from "@expo/config-plugins"; /* eslint-disable flowtype/no-types-missing-file-annotation */
import { ConfigPlugin, withInfoPlist } from '@expo/config-plugins'
export enum BackgroundMode { export enum BackgroundMode {
Central = "central", Central = 'central',
Peripheral = "peripheral", Peripheral = 'peripheral'
} }
function ensureKey(arr: string[], key: string) { function ensureKey(arr: string[], key: string) {
if (!arr.find((mode) => mode === key)) { if (!arr.find(mode => mode === key)) {
arr.push(key); arr.push(key)
} }
return arr; return arr
} }
const centralKey = "bluetooth-central"; const centralKey = 'bluetooth-central'
const peripheralKey = "bluetooth-peripheral"; const peripheralKey = 'bluetooth-peripheral'
/** /**
* Append `UIBackgroundModes` to the `Info.plist`. * Append `UIBackgroundModes` to the `Info.plist`.
*/ */
export const withBLEBackgroundModes: ConfigPlugin<BackgroundMode[]> = ( export const withBLEBackgroundModes: ConfigPlugin<BackgroundMode[]> = (c, modes) => {
c, return withInfoPlist(c, config => {
modes
) => {
return withInfoPlist(c, (config) => {
if (!Array.isArray(config.modResults.UIBackgroundModes)) { if (!Array.isArray(config.modResults.UIBackgroundModes)) {
config.modResults.UIBackgroundModes = []; config.modResults.UIBackgroundModes = []
} }
if (modes.includes(BackgroundMode.Central)) { if (modes.includes(BackgroundMode.Central)) {
config.modResults.UIBackgroundModes = ensureKey( config.modResults.UIBackgroundModes = ensureKey(config.modResults.UIBackgroundModes, centralKey)
config.modResults.UIBackgroundModes,
centralKey
);
} }
if (modes.includes(BackgroundMode.Peripheral)) { if (modes.includes(BackgroundMode.Peripheral)) {
config.modResults.UIBackgroundModes = ensureKey( config.modResults.UIBackgroundModes = ensureKey(config.modResults.UIBackgroundModes, peripheralKey)
config.modResults.UIBackgroundModes,
peripheralKey
);
} }
// Prevent empty array // Prevent empty array
if (!config.modResults.UIBackgroundModes.length) { if (!config.modResults.UIBackgroundModes.length) {
delete config.modResults.UIBackgroundModes; delete config.modResults.UIBackgroundModes
} }
return config; return config
}); })
}; }
@@ -1,3 +1,4 @@
/* eslint-disable flowtype/no-types-missing-file-annotation */
import { ConfigPlugin, withInfoPlist } from "@expo/config-plugins"; import { ConfigPlugin, withInfoPlist } from "@expo/config-plugins";
const BLUETOOTH_ALWAYS = const BLUETOOTH_ALWAYS =
@@ -1,27 +0,0 @@
### @config-plugins/react-native-blob-util [1.0.3](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/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)
### 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
View File
@@ -4,7 +4,7 @@ Config plugin to auto configure [`react-native-blob-util`][lib] when the native
### Add the package to your npm dependencies ### Add the package to your npm dependencies
> Tested against Expo SDK 44 > Tested against Expo SDK 43
``` ```
yarn add react-native-blob-util @config-plugins/react-native-blob-util yarn add react-native-blob-util @config-plugins/react-native-blob-util
+3 -9
View File
@@ -1,15 +1,10 @@
{ {
"name": "@config-plugins/react-native-blob-util", "name": "@config-plugins/react-native-blob-util",
"version": "1.0.3", "version": "0.0.0",
"description": "Config plugin to auto configure react-native-blob-util on prebuild", "description": "Config plugin to auto configure react-native-blob-util on prebuild",
"main": "build/withReactNativeBlobUtil.js", "main": "build/withReactNativeBlobUtil.js",
"types": "build/withReactNativeBlobUtil.d.ts", "types": "build/withReactNativeBlobUtil.d.ts",
"sideEffects": false, "sideEffects": false,
"repository": {
"type": "git",
"url": "https://github.com/expo/config-plugins.git",
"directory": "packages/react-native-blob-util"
},
"files": [ "files": [
"build", "build",
"app.plugin.js" "app.plugin.js"
@@ -32,10 +27,9 @@
"preset": "expo-module-scripts" "preset": "expo-module-scripts"
}, },
"dependencies": { "dependencies": {
"@expo/config-plugins": "^4.1.0" "@expo/config-plugins": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
"expo-module-scripts": "^2.0.0" "expo-module-scripts": "^2.0.0"
}, }
"upstreamPackage": "react-native-blob-util"
} }
@@ -1,5 +1,4 @@
import { XML } from "@expo/config-plugins"; import { AndroidConfig, XML } from "@expo/config-plugins";
import { appendDownloadCompleteAction } from "../withReactNativeBlobUtil"; import { appendDownloadCompleteAction } from "../withReactNativeBlobUtil";
const fixture = ` const fixture = `
@@ -1,2 +0,0 @@
// @generated by expo-module-scripts
module.exports = require('expo-module-scripts/eslintrc.base.js');
-50
View File
@@ -1,50 +0,0 @@
### @config-plugins/react-native-branch [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/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))
-51
View File
@@ -1,51 +0,0 @@
# config-plugins/react-native-branch
Config plugin to auto configure `react-native-branch` when the native code is generated (`expo prebuild`).
## Expo installation
> Tested against Expo SDK 44
> This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
> First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
```sh
expo install react-native-branch @config-plugins/react-native-branch
```
After installing this npm package, add the [config plugin](https://docs.expo.io/guides/config-plugins/) to the [`plugins`](https://docs.expo.io/versions/latest/config/app/#plugins) array of your `app.json` or `app.config.js`:
```json
{
"expo": {
"plugins": ["@config-plugins/react-native-branch"]
}
}
```
Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
## API
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
- `apiKey` (_string_): Branch API key. Optional.
- `iosAppDomain` (_string_): App Domain for iOS. Optional.
#### Example
```json
{
"expo": {
"plugins": [
[
"@config-plugins/react-native-branch",
{
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8",
"iosAppDomain": "awesome-alternate.app.link",
}
]
]
}
}
```
@@ -1,3 +0,0 @@
# Gradle files
.gradle/
build/
@@ -1,52 +0,0 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
group = 'host.exp.exponent'
version = '0.0.1'
buildscript {
// Simple helper that allows the root project to override versions declared by this library.
ext.safeExtGet = { prop, fallback ->
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', '1.4.21')}")
}
}
android {
compileSdkVersion safeExtGet("compileSdkVersion", 30)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion safeExtGet("minSdkVersion", 21)
targetSdkVersion safeExtGet("targetSdkVersion", 30)
versionCode 1
versionName '1.1.0'
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation project(':expo-modules-core')
implementation project(':react-native-branch')
//noinspection GradleDynamicVersion
implementation 'com.facebook.react:react-native:+'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${safeExtGet('kotlinVersion', '1.4.21')}"
}
@@ -1,2 +0,0 @@
<manifest package="expo.modules.adapters.branch">
</manifest>
@@ -1,15 +0,0 @@
package expo.modules.adapters.branch
import android.app.Application
import android.content.Context
import expo.modules.core.interfaces.ApplicationLifecycleListener
import io.branch.rnbranch.RNBranchModule
class BranchApplicationLifecycleListener(context: Context?) : ApplicationLifecycleListener {
var context = context
override fun onCreate(application: Application) {
super.onCreate(application)
RNBranchModule.getAutoInstance(this.context)
}
}
@@ -1,15 +0,0 @@
package expo.modules.adapters.branch
import android.content.Context
import expo.modules.core.interfaces.ApplicationLifecycleListener
import expo.modules.core.interfaces.Package
import expo.modules.core.interfaces.ReactActivityLifecycleListener
class BranchPackage : Package {
override fun createApplicationLifecycleListeners(context: Context?): List<ApplicationLifecycleListener> {
return listOf(BranchApplicationLifecycleListener(context))
}
override fun createReactActivityLifecycleListeners(activityContext: Context): List<ReactActivityLifecycleListener> {
return listOf(BranchReactActivityLifecycleListener(activityContext))
}
}
@@ -1,22 +0,0 @@
package expo.modules.adapters.branch
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import expo.modules.core.interfaces.ReactActivityLifecycleListener
import io.branch.rnbranch.RNBranchModule
class BranchReactActivityLifecycleListener(activityContext: Context) : ReactActivityLifecycleListener {
override fun onCreate(activity: Activity, savedInstanceState: Bundle?) {
RNBranchModule.initSession(activity.getIntent().getData(), activity);
}
override fun onNewIntent(intent: Intent?): Boolean {
if (intent != null) {
RNBranchModule.onNewIntent(intent);
}
return super.onNewIntent(intent)
}
}
@@ -1 +0,0 @@
module.exports = require("./build/withBranch");
-5
View File
@@ -1,5 +0,0 @@
export declare type ConfigData = {
apiKey?: string;
iosAppDomain?: string;
iosUniversalLinkDomains?: string[];
};
-2
View File
@@ -1,2 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Loaded 100 of 151 files, more files were not shown because too many files have changed in this diff. Show more