Compare commits

..
Author SHA1 Message Date
Hassan Khan 8c15065eb9 ci: test on Node 22 and 24 (#338)
Node 20 reached end of life in April 2026.
2026-10-19 17:47:57 +01:00
Hassan Khan d299fbb361 chore: move lint and formatting to oxlint and oxfmt (#337)
* chore: add `oxlint` and `oxfmt`

* chore: switch lint to oxlint

Root oxlint.config.mjs extends oxlint-config-universe/node. Each package
re-exports it and runs oxlint --config oxlint.config.mjs ., since oxlint
does not discover a root .mjs config from a package directory. CI lints
with --deny-warnings and checks formatting with oxfmt.

Removes eslintrc.base.js, every .eslintrc.js, and the eslint,
eslint-config-universe and prettier devDependencies. Bumps oxlint and
oxfmt and aligns .oxfmtrc.json with expo/expo, ignoring the generated
SettingsPlist.ts that json2ts rewrites in prettier's default style.

Also runs pnpm dedupe. The package.json files in this commit carry the
oxfmt key reorder as well; the rest of the reformat is its own commit.

* chore: format with oxfmt

Mechanical reformat of the repo with oxfmt. No code changes.
2026-10-19 17:38:33 +01:00
Hassan Khan 3765a79aac chore: replace expo-module-scripts with direct tooling (#335)
expo-module-scripts stops at 56.x on npm and its successor is private
to expo/expo. The packages only used it for tsc, jest and eslint.

Shared tsconfig.base.json, jest.config.base.js and eslintrc.base.js now
live at the root and packages reference them. Package scripts call
tsc, eslint, jest and rm -rf build directly. Tests run through
@swc/jest, as in expo/expo. Lint stays on ESLint 8 with universe for
now; the oxlint move is a separate change.

Also drops the expo-module-scripts catalog entry and the
babel-preset-expo package extension, adds the missing jest.config.js to
react-native-adjust, and makes the plugin generator copy jest and
eslint configs from the template.
2026-10-19 17:11:16 +01:00
Hassan Khan 765211130a chore: move to pnpm 12 (#334)
Pin pnpm 12.2.1 through engines and devEngines.packageManager, matching
expo/expo. Enable the global virtual store and set the esbuild and
msgpackr-extract builds to true, replacing the placeholders that made
pnpm install fail on pnpm 12.

CI: switch to pnpm/setup, bump checkout and setup-node to v7, use the
matrix Node version instead of a hardcoded 20, and run tests on every
pull request.
2026-10-19 16:35:18 +01:00
Hassan Khan a7cc2b2fed chore(apple-settings): bump json-schema-to-typescript to v16 (#333) 2026-10-19 14:19:47 +01:00
Christian FalchandClaude Opus 5 5d9597dbd6 chore(expo-uiscene-lifecycle): remove plugin (#330)
The UIKit scene lifecycle support moved into expo-build-properties, so
this standalone config plugin is no longer needed. The package was never
published to npm, so removal needs no deprecation step.

pnpm-lock.yaml is restored to its pre-plugin state, which also undoes the
repo-wide @types/node downgrade that the package's devDependency caused.

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
2026-10-19 13:42:15 +01:00
Christopher Pruijsen 2b36569912 fix(react-native-pdf): use correct react-native-pdf version for SDK 54 in compatibility table (#331) 2026-10-19 13:33:35 +01:00
Hassan Khan e83c44c05e ci: pin pnpm version so the job can install (#332) 2026-10-19 13:31:29 +01:00
Alan Hughes 1fe140bae4 Add publish config to expo-uiscene-lifecycle (#328) 2026-09-15 19:00:09 +01:00
Alan Hughes 4a27ef455a Publish for 58 (#327) 2026-09-15 18:55:09 +01:00
Christian Falch 9d8dccc6fc feat(expo-uiscene-lifecycle): add SDK 57 scene lifecycle plugin (#326)
* feat(expo-uiscene-lifecycle): add SDK 57 scene lifecycle plugin

* chore: update plugin automation metadata

* chore: remove unrelated metadata churn

* fix(expo-uiscene-lifecycle): add lint configuration

* test(expo-uiscene-lifecycle): clarify SDK 57 fixture

* refactor(expo-uiscene-lifecycle): use Expo scene runtime

* refactor(expo-uiscene-lifecycle): simplify plugin tests

* style(expo-uiscene-lifecycle): format plugin

* fix(expo-uiscene-lifecycle): require Expo 57.0.23

* fix(expo-uiscene-lifecycle): require Expo 57.0.23

* test(expo-uiscene-lifecycle): cover version boundaries

* fix(expo-uiscene-lifecycle): remove Expo peer dependency

* fix(expo-uiscene-lifecycle): keep Expo peer unpinned
2026-09-15 18:08:06 +02:00
Phil Pluckthun bced4c7b0d Release patch update 2026-08-15 10:55:56 +01:00
Phil Pluckthun af26cb0d15 Open up expo peer (#325) 2026-08-15 10:54:30 +01:00
Phil Pluckthun 300770f462 release (#321) 2026-06-03 21:14:51 +01:00
Phil Pluckthun 6d6770068f chore: Update tsconfigs, prepublishOnly script, type errors (SDK 56) (#320)
* apple-settings: Update for TS strictness

* ios-stickers: Update for TS strictness

* react-native-callkeep: Fix up

* react-native-branch: Resolve SDK 56 deprecations

* chore: Update template

* chore: Update tsconfigs and publishing package.json:scripts

* ci: Update test worklow

* chore: Apply lints
2026-06-03 21:12:35 +01:00
Phil Pluckthun c8547c07ba publish (#317) 2026-06-03 13:46:32 +01:00
Hassan Khan f7a291fc55 feat: upgrade to v56 (#316)
* feat: upgrade to v56

* chore: remove `@config-plugins/react-native-dynamic-app-icon`
2026-05-31 12:17:14 +01:00
Vivek JM fc33478f00 fix(react-native-branch): defer API key validation to mods (#313) 2026-05-29 14:03:40 +01:00
evanbacon a48bb42c19 pnpm bump 2026-04-09 13:03:33 -07:00
c6292b104a chore(react-native-branch): update react-native-branch (#310)
* feat: introduce test environment handling into config plugin

* chore: configure Branch test app correctly

* fix(react-native-branch): re-init branch session when resumed from background

* chore(react-native-branch): emit warning when `apiKey` from `ExpoConfig.config` is present

---------

Co-authored-by: Rodolfo Perottoni <[email protected]>
Co-authored-by: Morgan Cromell <[email protected]>
2026-04-09 20:58:54 +01:00
Jason SafaiyehandClaude Opus 4.6 3ea7b43e64 fix(ios-stickers): inherit DEVELOPMENT_TEAM from main app target (#303)
* fix(ios-stickers): inherit DEVELOPMENT_TEAM from main app target

The sticker pack extension target was created without setting
DEVELOPMENT_TEAM, requiring developers to manually select the
team in Xcode after every prebuild. This follows the same pattern
used by expo-share-intent and Expo's own DevelopmentTeam utilities:
read the team from the main app target's build configurations and
apply it to the extension's build settings and TargetAttributes.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* refactor(ios-stickers): use DevelopmentTeam helper

* refactor(ios-stickers): simplify development team handling

* fix(ios-stickers): satisfy prettier lint

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
2026-04-08 11:16:23 +01:00
Hassan Khan d971f378d7 chore: replace Yarn with pnpm (#306)
* chore: replace Yarn with pnpm

* chore: update remaining Yarn references in scripts and CI workflows

* chore: remove `useWorkspaces` from `lerna.json`

* chore: add Jest

* chore: remove `prepublishOnly` scripts

* chore: replace Lerna commands with pnpm equivalents in root `package.json`

* chore: update template

* chore: replace Lerna commands with pnpm equivalents

* chore: use pnpm's `workspace:*` protocol for `apps/*`

* chore: use pnpm catalogs

* docs: update publishing instructions to be more accurate
2026-04-07 13:12:49 +01:00
Hassan Khan a2fdafe0d9 chore: slim down dependencies (#312)
* chore: replace `string.prototype.replaceall` with `replace()`

* chore: replace `ts-node` with `tsx`
2026-04-07 13:01:34 +01:00
Hassan Khan 17c928a7c6 chore: sync GitHub issue template configuration (#311) 2026-04-07 12:12:32 +01:00
Kasymbekov Sultanmyrza 93b0fda31b fix(react-native-callkeep): add missing permissions for CallKeep integration on Android (#285) 2026-04-06 18:25:51 +01:00
Hassan Khan 27cdb03c04 chore: add CLAUDE.md (#304) 2026-04-03 19:00:06 +01:00
Hassan Khan c1150cb723 chore: update README.md with link to React Native Directory (#305) 2026-04-02 02:23:49 +01:00
Raxit Majithiya 639473d539 chore(react-native-branch): update README.md with instructions for iosUniversalLinkDomains configuration (#275)
Document the `iosUniversalLinkDomains` field.
2026-03-24 21:32:26 +00:00
Hassan Khan 6a850e7902 feat: upgrade to v55 (#302)
* chore(apple-settings): bump to `expo@^55`

* chore(ios-stickers): bump to `expo@^55`

* chore(react-native-adjust): bump to `expo@^55`

* chore(react-native-blob-util,react-native-pdf): bump to `expo@^55`

* chore(react-native-branch): bump to `expo@^55`

* chore(react-native-callkeep): bump to `expo@^55`

* chore(react-native-siri-shortcut): bump to `expo@^55`

* chore(react-native-webrtc): bump to `expo@^55`

* chore: bump to `expo-module-scripts@^55`

* chore(react-native-dynamic-icon): bump to `expo@^55`

* chore: update SDK version in scripts and template
2026-03-24 21:10:34 +00:00
1de01f582c chore(react-native-adjust): update react-native-adjust (#301)
* feat(react-native-adjust): remove iAd.framework as it's legacy

* feat(react-native-adjust): update Google Play Services implementation

* feat(react-native-adjust): add support for SDK signature

* feat(adjust): add meta install referrer

---------

Co-authored-by: Hugo EXTRAT <[email protected]>
Co-authored-by: kenan.tendzo <[email protected]>
Co-authored-by: youssef eddibili <[email protected]>
2026-03-24 16:42:34 +00:00
Hassan Khan 69c2af5b87 chore: add WebStorm configuration directory to .gitignore (#300) 2026-03-24 16:40:19 +00:00
evanbacon bd1ffe70c5 publish 2025-09-24 08:24:19 -07:00
45c6742c6b feat: upgrade to v54 (#293)
* chore(apple-settings): update `@config-plugins/apple-settings` to Expo v54

* chore(ios-stickers): update `@config-plugins/ios-stickers` to Expo v54

* chore(react-native-branch): update `@config-plugins/react-native-branch` to Expo v54

Supersedes #279, #281
Fixes #283

* chore(react-native-pdf): update `@config-plugins/react-native-pdf` to Expo v54

* chore(react-native-siri-shortcuts): update `@config-plugins/react-native-siri-shortcuts` to Expo v54

* chore(android-jsc-intl,react-native-adjust,react-native-callkeep): update `@config-plugins/android-jsc-intl`, `@config-plugins/react-native-adjust` and `@config-pluginsreact-native-callkeep` to Expo v54

* chore(react-native-webrtc): update `@config-plugins/react-native-webrtc` to Expo v54

* chore: upgrade monorepo root to Expo v54

* chore: upgrade config plugin scripts to use Expo v54

* docs(CONTRIBUTING.md): add instructions for upgrading config plugins to newer Expo versions

* chore(react-native-dynamic-app-icon): update `@config-plugins/react-native-dynamic-app-icon` to Expo v54

* chore(android-jsc-intl): remove config plugin

* chore: align deprecated/removed package READMEs

* chore: remove `expo-build-properties` from example apps

* docs: sync readme versions with published versions

Closes #284

* docs: update READMEs with correct versions for SDK 54

* docs(react-native-branch): use correct version of `react-native-branch`

Closes #281

* docs(CONTRIBUTING.md): improve instructions for upgrading config plugins to newer Expo versions

---------

Co-authored-by: Anthony VanLent <[email protected]>
Co-authored-by: Lizzi Lindboe <[email protected]>
2025-09-23 18:32:15 +01:00
Hassan Khan 9412250df6 test: update Node versions in test workflow to use maintenance and active LTS releases (#291) 2025-09-15 22:49:11 +01:00
Hassan Khan bd70addec7 chore: restore index.js in apps/app (#292) 2025-09-15 22:48:57 +01:00
Hassan Khan 5deff9c0a0 chore: remove references to detox and ffmpeg-kit-react-native (#290) 2025-09-15 22:48:36 +01:00
Brent Vatne 566f54e785 Update README.md (#280) 2025-06-03 13:59:30 -07:00
Brent Vatne 59f94769fa Update README 2025-06-02 17:27:19 -07:00
Brent Vatne c30e5baa66 Update README 2025-06-02 17:24:01 -07:00
Brent Vatne 480485b5aa Update README 2025-06-02 17:22:04 -07:00
Brent Vatne 700dbf00dd Update README 2025-06-02 17:20:36 -07:00
Brent Vatne 3091b2236b Remove react-native-google-cast plugin directory 2025-06-02 17:14:30 -07:00
Brent Vatne ff43a0ea09 Remove detox from tests 2025-06-02 17:13:11 -07:00
Brent Vatne 00197c766b Remove @config-plugins/detox 2025-06-02 17:07:47 -07:00
Brent Vatne 5ec55510bc Remove ffmpegkit config plugin from tests 2025-06-02 17:07:41 -07:00
Brent Vatne 31975371cf Remove ffmpeg config plugin. Closes #268 2025-06-02 16:58:37 -07:00
Brent Vatne 0a1d687d61 Add publish script 2025-06-02 16:50:29 -07:00
Brent Vatne 2387fa9bd7 Publish
- @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
 - @config-plugins/[email protected]
2025-06-02 16:49:03 -07:00
Brent Vatne 91b88cd443 Revert "Remove versions from apps to skip publishing with lerna"
This reverts commit a1f6fbc2ec.
2025-06-02 16:48:10 -07:00
Brent Vatne a1f6fbc2ec Remove versions from apps to skip publishing with lerna 2025-06-02 16:45:21 -07:00
Evan BaconandBrent Vatne fed9abc5b8 feat: upgrade to SDK 53 (#272)
Co-authored-by: Brent Vatne <[email protected]>
2025-05-27 15:42:59 -07:00
evanbacon b368b0bfcb Update README.md 2025-05-01 13:11:35 -05:00
mphill 2fa8c2b809 fix(branch): Fix branch plugin namespace (#261)
* Update package.json

* Update build.gradle
2025-05-01 13:10:02 -05:00
Nick Novitski be399fdb3b Update actions/cache v2 -> v4 (#262)
v2 will stop working in February.
2025-05-01 13:09:42 -05:00
Dominique Rau 2927e09799 Update withDetoxProjectGradle.ts (#267) 2025-05-01 13:09:30 -05:00
Evan Bacon ec4f114b82 Update README.md 2024-12-29 23:56:24 -06:00
Evan Bacon 9a524549b7 Upgrade to 52 (#258)
* bump packages and drop extras

* reduce packages to update

* bump readmes

* build

* fix deps

* use whatever images

* add ccache

* fix upgrade

* fix apple settings

* attempt branch update

* add notices for better alternatives

* all ios confirmed to run

* drop unused android plugin in detox

* add splash screens

* delete google cast in favor of the upstream plugin

* Update README.md

* Update build.gradle

* update tests

* Update yarn.lock

* lint

* drop google cast workflow
2024-12-03 17:44:02 -06:00
Wilhelm Erasmus 4a3899c098 chore: adds expo-react-native-freshchat to out-of-tree plugin list (#257) 2024-12-02 12:40:23 -06:00
Evan Bacon 4eb10b7794 Upgrade to Expo SDK 51 (#234)
* update versions

* Update generate-plugin.ts

* Update yarn.lock

* ffmpeg running

* Update build.gradle

* fix android webrtc

* Update yarn.lock

* working detox tests
2024-05-08 11:12:56 -05:00
Cedric van Putten bc6856f7d3 fix(react-native-dynamic-app-icon): add exact ipad sizes 152/167 for exported icons (#233)
* fix(react-native-dynamic-app-icon): add exact ipad sizes `152x152`/`167x167` for exported icons

* fix(react-native-dynamic-app-icon): add ipad icons to pbxproj

* refactor(react-native-dynamic-app-icon): replace `scales` and `size` with `IconDimension` using additional dimensions for specific targets

* fix(react-native-dynamic-app-icon): add `width` and `height` to keep similar file name but override exact dimensions

* chore(react-native-dynamic-app-icon): enable tablet exports for icons

* fix(react-native-dynamic-app-icon): use proper plist names (without scales)
2024-05-07 14:48:07 -05:00
Evan Bacon fa4397d502 chore!: bump to SDK 50 (#220)
* upgrade apps

* update readmes

* update

* update typescript types

* update libs

* ✓ ios-stickers tested

* update android branch

* ✓ branch

* ✓ dynamic app icon (ios)

* Update yarn.lock

* ✓ react-native-pdf

* ✓ react-native-webrtc

* wip

* ✓ detox

* drop build folder

* update format

* update to node 18

* add faster template

* update prettier

* lint fix
2024-02-06 15:06:15 -06:00
Evan Bacon ace454934c chore: drop deprecated @config-plugins/react-native-ble-plx package (#219)
* drop react-native-ble-plx

* fix builds

* update
2024-02-05 15:41:41 -06:00
Evan Bacon 581ce227c6 chore: drop deprecated @config-plugins/react-native-quick-actions package (#218)
* drop react-native-quick-actions

* drop tests and update meta

* Update README.md
2024-02-05 15:29:15 -06:00
Aman Mittal a619addd70 Update React Native Firebase plugin list (#205)
The React Native Firebase is missing `"@react-native-firebase/crashlytics"` from the list and can be confusing as to why there is a parity between this doc and the actual React Native Firebase docs: https://rnfirebase.io/#expo-managed-workflow
2024-01-12 14:13:50 -06:00
Evan Bacon 87797617d7 Update README.md 2023-11-25 23:23:07 -06:00
Evan Bacon 7fb7fb0acf Update README.md (#206) 2023-11-20 13:00:06 -06:00
Evan Bacon 90dfa7aa55 Update README.md 2023-11-20 12:59:24 -06:00
Gustavo Gard 20e7914cad remove fbjs dependency (#171)
Remove `fbjs` because it is not a dependency anymore in `react-native-pdf`

https://github.com/wonday/react-native-pdf/releases/tag/v6.5.0
2023-11-02 14:37:17 -05:00
Nick Artman a8393fcfe8 docs(readme): fix link to lyrahealth-inc/react-native-orientation-plugin (#202) 2023-11-02 14:36:42 -05:00
Michael Wood c2cfc1e287 docs: add react-native-ble-plx (#203) 2023-11-02 14:35:52 -05:00
Douglas Lowder e650417b40 Remove packages/tv (#201) 2023-10-09 16:14:48 -07:00
evanbacon 2e57a4fee8 + @config-plugins/[email protected] 2023-09-28 19:39:58 -07:00
Douglas Lowder 93491ad59d feat(tv): Add TV plugin (@config-plugins/tv) (#194) 2023-09-28 12:08:58 -07:00
evanbacon b90eed0c0c feat(apple-settings): bump bacons/xcode 2023-08-05 22:04:47 -05:00
evanbacon 1ccbdb4855 feat(apple-settings): publish 0.0.4 2023-08-05 21:03:43 -05:00
evanbacon b20ef67eda fix(apple-settings): remove invalid types 2023-08-05 21:03:23 -05:00
evanbacon 9e43cce27f feat: add licenses 2023-08-05 20:21:01 -05:00
evanbacon 3740876bc7 feat(apple-settings): expose file for child pane 2023-08-05 15:48:09 -05:00
evanbacon 55e55e598f fix(apple-settings): export MultiValue 2023-08-05 15:45:10 -05:00
evanbacon f42cee7428 Update app.config.ts 2023-08-05 15:17:18 -05:00
Evan Bacon 59b1997c34 Update README.md (#184) 2023-08-05 15:17:06 -05:00
Evan Bacon bfb8838d5d Create @config-plugins/apple-settings plugin (#182)
* wip

* update repo meta

* working demo

* updates

* add linking

* Updated demo more

* drop assets

* add slider to example

* Updated types and usage

* add multi value page example
2023-08-05 15:03:04 -05:00
Evan Bacon 006142cd7a chore!: bump to SDK 49 (#180)
* bump

* Update yarn.lock

* drop default babel and metro configs

* reduce gitignores

* drop unused config files

* drop unused and web

* drop unused gitignores

* update and drop lodash

* yarn

* bump tested by

* bump all

* update

* Update app.json

* Update README.md

* bump kotlin

* update tests
2023-07-14 16:49:18 -05:00
Evan Bacon 79d464943b Update README.md 2023-05-24 15:58:49 -05:00
evanbacon 6f034e11f1 + @config-plugins/[email protected] 2023-03-09 11:26:23 -06:00
Evan Bacon 9b15ea96f6 update android detox plugin for detox 20 (#166)
* update android testing

* update with detox plugin

* use expo-build-properties for kotlin version

* update build files

* working

* update snaps for sdk 48
2023-03-09 11:25:10 -06:00
Evan Bacon d7626845d9 sdk 48 (#165)
* bump packages

* all running on iOS

* all running android

* bump

* update tests

* fix lint
2023-03-08 11:50:52 -06:00
dependabot[bot] bf2154da14 chore(deps): bump expo-build-properties in /packages/react-native-webrtc (#161)
Bumps [expo-build-properties](https://github.com/expo/expo/tree/HEAD/packages/expo-build-properties) from 0.4.1 to 0.5.1.
- [Release notes](https://github.com/expo/expo/releases)
- [Changelog](https://github.com/expo/expo/blob/main/packages/expo-build-properties/CHANGELOG.md)
- [Commits](https://github.com/expo/expo/commits/HEAD/packages/expo-build-properties)

---
updated-dependencies:
- dependency-name: expo-build-properties
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-07 15:34:59 -06:00
harry lachenmayer 0f41412dba fix(ffmpeg-kit-react-native): pick first libc++_shared.so in the Android project (#159) 2023-03-07 15:34:36 -06:00
Kim Brandwijk 841803b2d4 docs: add watermelondb out-of-tree plugin to readme 2023-02-10 16:02:07 +01:00
Pradeep Pandey a6d6b1dff8 docs: update detox docs link (#146) 2023-01-03 22:23:32 +01:00
evanbacon fee9e88c13 + @config-plugins/[email protected]
- Dropped support for the deprecated `NSBluetoothPeripheralUsageDescription` property
2022-12-16 19:33:17 -06:00
Evan Bacon 0cff8edfcd chore!: drop bluetoothPeripheralPermission property (#154) 2022-12-16 19:30:42 -06:00
evanbacon b4fe28fa00 + @config-plugins/[email protected]
- added `stickerBundleId` prop
2022-12-15 16:08:10 -06:00
Xavier Seignard 72da275f24 feat(ios-stickers): custom id for sticker project (#150) 2022-12-15 16:03:05 -06:00
evanbacon b86291107e rebuild and bump expo-module-scripts 2022-11-17 10:31:32 +00:00
Evan Bacon bce28777d1 feat: upgrade to Expo SDK 47 (#145)
* cd app/ && npx expo install --fix && cd .. && cd ios-stickers/ && npx expo install --fix && cd .. && cd react-native-dynamic-app-icon/ && npx expo install --fix && cd .. && cd react-native-quick-actions/ && npx expo install --fix && cd .. && cd react-native-ble-plx/ && npx expo install --fix && cd .. && cd react-native-google-cast/ && npx expo install --fix && cd .. && cd react-native-siri-shortcut/ && npx expo install --fix && cd .. && cd ffmpeg-kit-react-native/ && npx expo install --fix && cd .. && cd react-native-branch/ && npx expo install --fix && cd .. && cd react-native-pdf/ && npx expo install --fix && cd .. && cd react-native-webrtc/ && npx expo install --fix

* ✓ react-native-webrtc works

* update docs and notes

* updated versions

* all iOS builds pass

* Create tsconfig.json

* Update test.yml
2022-11-17 10:24:59 +00:00
evanbacon bf0d5383ab Revert " cd app/ && npx expo install --fix && cd .. && cd ios-stickers/ && npx expo install --fix && cd .. && cd react-native-dynamic-app-icon/ && npx expo install --fix && cd .. && cd react-native-quick-actions/ && npx expo install --fix && cd .. && cd react-native-ble-plx/ && npx expo install --fix && cd .. && cd react-native-google-cast/ && npx expo install --fix && cd .. && cd react-native-siri-shortcut/ && npx expo install --fix && cd .. && cd ffmpeg-kit-react-native/ && npx expo install --fix && cd .. && cd react-native-branch/ && npx expo install --fix && cd .. && cd react-native-pdf/ && npx expo install --fix && cd .. && cd react-native-webrtc/ && npx expo install --fix"
This reverts commit 4997e975ac.
2022-11-10 11:08:20 -06:00
evanbacon 4997e975ac cd app/ && npx expo install --fix && cd .. && cd ios-stickers/ && npx expo install --fix && cd .. && cd react-native-dynamic-app-icon/ && npx expo install --fix && cd .. && cd react-native-quick-actions/ && npx expo install --fix && cd .. && cd react-native-ble-plx/ && npx expo install --fix && cd .. && cd react-native-google-cast/ && npx expo install --fix && cd .. && cd react-native-siri-shortcut/ && npx expo install --fix && cd .. && cd ffmpeg-kit-react-native/ && npx expo install --fix && cd .. && cd react-native-branch/ && npx expo install --fix && cd .. && cd react-native-pdf/ && npx expo install --fix && cd .. && cd react-native-webrtc/ && npx expo install --fix 2022-11-10 11:07:55 -06:00
Frank Calise ed020d236b docs(contributing): fix typo in instructions (#128) 2022-11-09 09:18:44 -06:00
Martijn ArtsandEvan Bacon 92cae40eab docs(detox): Add "CLEARTEXT" error troubleshooting to README (#125)
* Add "CLEARTEXT" error troubleshooting to README

* Update packages/detox/README.md

Co-authored-by: Evan Bacon <[email protected]>
2022-10-27 10:00:46 -07:00
evanbacon f76b3eb281 + @config-plugins/[email protected] 2022-09-15 19:27:29 -05:00
Robert Herber 0ec44e86e4 Fix broken Universal links (#117)
* Fix broken Universal links

* fix: prettier warning
2022-09-15 19:24:32 -05:00
Scott Pritchard 6d990ea663 Update README.md (#118)
Added react-native-keyevent-expo-config-plugin link to 'out-of-tree' plugins
2022-09-14 18:39:09 -05:00
evanbacon 9d96dfbd68 chore: @config-plugins/[email protected] 2022-08-08 16:42:18 +02:00
Evan Bacon dca3987857 feat: add SDK 46 support (#114)
* updated all modules to SDK 46

* chore: drop all semantics

* feat: fix all plugins

* feat: update versions

* fix: format

fix ffmpeg

fix detox

fix google cast

* Update lint-md.yml
2022-08-08 16:40:35 +02:00
semantic-release-bot fc16d69ba6 chore: 2.0.0
## @config-plugins/react-native-pdf [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-08-04)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

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

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-08-04 16:53:20 +00:00
Fabrizio Rizzonelli bf11a17a81 docs: added expo-appcenter to the list of plugin (#95) 2022-08-04 18:50:24 +02:00
semantic-release-bot b3c6210ffc chore: 2.0.1
### @config-plugins/react-native-ble-plx [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)

### Bug Fixes

* **react-native-ble-plx:** Added new Bluetooth specific permission for Android 12 (SDK 31). ([#91](https://github.com/expo/config-plugins/issues/91)) ([d3df63f](https://github.com/expo/config-plugins/commit/d3df63fbb2344251b9b371959de3ce6e4b9ab0cd))
2022-07-25 12:57:23 +00:00
Tom d3df63fbb2 fix(react-native-ble-plx): Added new Bluetooth specific permission for Android 12 (SDK 31). (#91)
* fix(react-native-ble-plx): Added new Bluetooth specific permission for Android SDK 31.

Expo SDK 45 targets Android SDK 31 which requires new Bluetooth specific permissions. Without these new permissions Android 12 (SDK 31) devices don't get access to BLE.

* Update README.md

* chore(react-native-ble-plx): Added `tools:targetApi="31"` to Android Manifest (for Lint).
2022-07-25 14:54:10 +02:00
semantic-release-bot 057c6bd978 chore: 2.0.0
## @config-plugins/react-native-callkeep [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

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

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-07-25 11:16:39 +00:00
Michael WoodandEvan Bacon 3fbc237fd6 Add react-native-multiple-image-picker (#92)
Co-authored-by: Evan Bacon <[email protected]>
2022-07-25 13:13:39 +02:00
Joseph Odunsi 6603ab3215 Update README.md (#93)
Add shopify flashlist
2022-07-25 13:13:03 +02:00
semantic-release-bot 9f49f02401 chore: 1.0.0
## @config-plugins/react-native-siri-shortcut 1.0.0 (2022-07-12)

### Features

* **siri-shortcut:** Add config plugin ([#86](https://github.com/expo/config-plugins/issues/86)) ([226b2a6](https://github.com/expo/config-plugins/commit/226b2a6412ad3fe75c98952831fab5a63254d19f))

### Other chores

* **react-native-siri-shortcut:** add tests ([#88](https://github.com/expo/config-plugins/issues/88)) ([994fadc](https://github.com/expo/config-plugins/commit/994fadc8ddf9ee858f2ccb7d544674f107f7f9ad))
2022-07-12 12:04:10 +00:00
Evan Bacon 14dc560092 Update README.md 2022-07-12 14:01:17 +02:00
Evan Bacon 2dcaff6772 Update README.md 2022-07-12 13:17:20 +02:00
Evan Bacon 68190997b6 Update README.md 2022-07-12 10:39:42 +02:00
semantic-release-bot 74f55fc342 chore: 2.0.2
### @config-plugins/ios-stickers [2.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-06-30)

### Other chores

* **deps-dev:** bump memfs in /packages/ios-stickers ([#83](https://github.com/expo/config-plugins/issues/83)) ([764a047](https://github.com/expo/config-plugins/commit/764a04710bea6e66dbc6d0065812acb1591435fb))
2022-06-30 17:32:49 +00:00
Evan Bacon e32378e8ed Add App Clips and Safari Extensions to Awesome list 2022-06-30 19:29:09 +02:00
dependabot[bot] 764a04710b chore(deps-dev): bump memfs in /packages/ios-stickers (#83) 2022-06-18 18:06:21 +02:00
Eugene Nagorny 837602af36 Update README.md (#89) 2022-06-18 18:04:46 +02:00
462 changed files with 13990 additions and 32529 deletions

No files matched your search

+2 -7
View File
@@ -29,19 +29,14 @@ body:
attributes:
label: Config Plugin
options:
- '@config-plugins/android-jsc-intl'
- '@config-plugins/detox'
- '@config-plugins/ffmpeg-kit-react-native'
- '@config-plugins/apple-settings'
- '@config-plugins/ios-stickers'
- '@config-plugins/react-native-adjust'
- '@config-plugins/react-native-ble-plx'
- '@config-plugins/react-native-blob-util'
- '@config-plugins/react-native-branch'
- '@config-plugins/react-native-callkeep'
- '@config-plugins/react-native-dynamic-app-icon'
- '@config-plugins/react-native-google-cast'
- '@config-plugins/react-native-pdf'
- '@config-plugins/react-native-quick-actions'
- '@config-plugins/react-native-siri-shortcut'
- '@config-plugins/react-native-webrtc'
validations:
@@ -64,7 +59,7 @@ body:
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
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:
+4 -16
View File
@@ -6,39 +6,27 @@ contact_links:
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: 📦 detox issues
url: https://github.com/wix/Detox/issues
- about: FFmpeg Kit for React Native
name: 📦 ffmpeg-kit-react-native issues
url: https://github.com/tanersener/ffmpeg-kit/issues
- about: Adjust React Native SDK
name: 📦 react-native-adjust issues
url: https://github.com/adjust/react_native_sdk/issues
- about: React Native Bluetooth Low Energy library
name: 📦 react-native-ble-plx issues
url: https://github.com/Polidea/react-native-ble-plx/issues
- about: >-
A module provides upload, download, and files access API. Supports file
stream read/write for process large files.
name: 📦 react-native-blob-util issues
url: https://github.com/RonRadtke/react-native-blob-util/issues
- about: Branch Metrics React Native SDK
name: 📦 react-native-branch issues
url: >-
https://github.com/BranchMetrics/react-native-branch-deep-linking-attribution/issues
- about: iOS 10 CallKit and Android ConnectionService Framework For React Native
name: 📦 react-native-callkeep issues
url: https://github.com/react-native-webrtc/react-native-callkeep/issues
- about: Programmatically change the app icon in React Native.
name: 📦 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: 📦 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: 📦 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: 📦 react-native-quick-actions issues
url: https://github.com/jordanbyron/react-native-quick-actions/issues
- about: A React Native library that enables you to use iOS 12+ Siri Shortcuts.
name: 📦 react-native-siri-shortcut issues
url: https://github.com/Gustash/react-native-siri-shortcut/issues
+2 -2
View File
@@ -1,5 +1,5 @@
name: "⭐️ Config Plugin Request"
description: "Suggest an idea for a new Expo Config Plugin."
name: '⭐️ Config Plugin Request'
description: 'Suggest an idea for a new Expo Config Plugin.'
labels: enhancement
body:
- type: markdown
+1 -1
View File
@@ -2,7 +2,7 @@
🚨 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
🚨 Example: feat(ios-stickers): add new step
-->
# Why
-97
View File
@@ -1,97 +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-siri-shortcut
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
+23 -5
View File
@@ -5,16 +5,34 @@ on:
branches: [main]
paths:
- .github/workflows/lint-md.yml
- "**.md"
- '**.md'
pull_request:
paths:
- .github/workflows/lint-md.yml
- "**.md"
- '**.md'
jobs:
lint-md:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npx remark --use validate-links . .github
- name: 👀 Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1
- name: 🔨 Install pnpm
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
install: false
- name: 🔨 Setup Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
cache: pnpm
- name: Install packages
run: pnpm install --frozen-lockfile
- name: Check Markdown links
run: pnpm exec remark --use validate-links . .github
-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 }}
+30 -49
View File
@@ -2,66 +2,47 @@ name: Test Packages
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize]
pull_request: {}
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: ["16", "17"]
name: Build with Node ${{ matrix.node }}
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 1
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
- run: yarn install --frozen-lockfile --check-files
- run: yarn lerna run prepare --stream
- uses: actions/cache@v2
with:
path: "*"
key: v2-${{ github.sha }}-${{ matrix.node }}
test:
runs-on: ubuntu-latest
needs: build
strategy:
fail-fast: false
matrix:
node: ["16", "17"]
package: [
# Manually add packages here
detox,
ffmpeg-kit-react-native,
ios-stickers,
react-native-ble-plx,
react-native-blob-util,
react-native-branch,
react-native-siri-shortcut,
react-native-google-cast,
react-native-pdf,
# react-native-quick-actions,
]
name: Test ${{ matrix.package }} on Node ${{ matrix.node }}
node: ['22', '24']
name: Build and test on Node ${{ matrix.node }}
steps:
- uses: actions/cache@v2
- name: 👀 Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: "*"
key: v2-${{ github.sha }}-${{ matrix.node }}
- name: Set up Node
uses: actions/setup-node@v1
fetch-depth: 1
- name: 🔨 Install pnpm
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
install: false
- name: 🔨 Setup Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: ${{ matrix.node }}
- name: Lint ${{ matrix.package }}
run: yarn lint --max-warnings 0
working-directory: packages/${{ matrix.package }}
- name: Test ${{ matrix.package }}
run: yarn test
working-directory: packages/${{ matrix.package }}
cache: pnpm
- name: Install packages
run: pnpm install --frozen-lockfile
- name: Build all packages
run: pnpm --filter './packages/*' run build
- name: Lint all packages
run: pnpm --filter './packages/*' run lint --deny-warnings
- name: Check formatting
run: pnpm format --check
- name: Test all packages
run: pnpm --filter './packages/*' run test --passWithNoTests
env:
CI: true
EXPO_DEBUG: true
+6 -2
View File
@@ -9,7 +9,7 @@ web-build
# Node
node_modules
npm-debug.log
yarn-error.log
pnpm-debug.log
# Ruby
.direnv
@@ -48,6 +48,9 @@ xcuserdata
.project
.settings
# WebStorm
.idea
# VSCode
.history/
@@ -62,4 +65,5 @@ packages/@*/*/build/**
apps/*/ios/*
apps/*/android/*
apps/*/web-build/*
apps/*/web-build/*
apps/*/dist/*
+30
View File
@@ -0,0 +1,30 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 100,
"tabWidth": 2,
"singleQuote": true,
"bracketSameLine": true,
"trailingComma": "es5",
"ignorePatterns": [
"**/node_modules/**",
"**/build/**",
"**/dist/**",
"**/__generated__/**",
"**/fixtures/**",
"**/.expo/**",
"**/assets/**",
"**/android/**",
"**/ios/**",
"**/expo-env.d.ts",
"packages/apple-settings/src/schema/SettingsPlist.ts"
],
"sortImports": {
"groups": [
["builtin", "external"],
["internal", "subpath"],
["parent", "sibling", "index"],
"unknown"
],
"ignoreCase": false
}
}
-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",
],
};
+107
View File
@@ -0,0 +1,107 @@
# CLAUDE.md
## Project Overview
Monorepo of community-maintained Expo config plugins for React Native libraries. Plugins auto-configure native Android/iOS projects during `npx expo prebuild`.
- **Namespace**: `@config-plugins/*`
- **Package manager**: pnpm 12 with workspaces (version pinned in `devEngines.packageManager` in the root `package.json`)
- **Publishing**: `pnpm publish` (independent versioning)
## Common Commands
```bash
# Install dependencies
pnpm install
# Build all packages
pnpm prepare
# Watch build all packages
pnpm start
# Generate a new plugin
pnpm gen
# Run tests for a specific package
cd packages/<name> && pnpm test
# Lint a specific package
cd packages/<name> && pnpm lint --deny-warnings
# Format the whole repo (add --check to only verify)
pnpm format
# Build a specific package
cd packages/<name> && pnpm build
# Clean a specific package
cd packages/<name> && pnpm clean
# Rebuild an example app to test config plugins
cd apps/<name> && pnpm expo prebuild --clean
```
## Project Structure
- `packages/` — Config plugin packages (each has `src/`, `__tests__/`)
- `apps/` — Example apps for testing plugins
- `fixtures/` — Shared test fixtures (native config files: AppDelegate, build.gradle, Podfile, etc.)
- `scripts/` — Repo tooling (plugin generator, dependabot config, issue templates)
## Conventions
- Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) (e.g., `feat(react-native-foo): add bar`)
- Branch naming: `@your-github-username/type/description`
- Each package runs `tsc`, `jest` and `oxlint` directly. Shared config lives at the root: `tsconfig.base.json`, `jest.config.base.js`, `oxlint.config.mjs`. Formatting is `oxfmt` with `.oxfmtrc.json`
- TypeScript source in `src/`, compiled output in `build/`
- Shared dependency versions are defined in the `catalog:` block in `pnpm-workspace.yaml` and referenced with `catalog:` in each package's `package.json`
- Peer dependency on `expo@^56`
- Tests use Jest with `memfs` for virtual filesystem testing
## Upgrading Plugins for a New Expo SDK Version
When a new Expo SDK is released (e.g., SDK 54 → SDK 55), every package and example app must be updated. Use conventional commits scoped to the package name (e.g., `chore(react-native-foo): bump to expo@^55`).
### Catalog updates (`pnpm-workspace.yaml`)
Update the `catalog:` block with the new SDK versions for shared dependencies:
1. **`expo`** — Update to `^<NEW_SDK>` (used as `peerDependencies` in all packages).
2. **`@expo/config-plugins`** — Update to `^<NEW_SDK>`.
3. Review other catalog entries (`@expo/image-utils`, `@expo/plist`, etc.) and bump if needed.
### Per-package updates (`packages/<name>/`)
For each package:
1. **`README.md`** — Add a new row to the version compatibility table with the new SDK version, the latest compatible upstream package version, and the next config plugin major version.
2. **Build & test** — Run `pnpm build` and `pnpm test` (if tests exist) to verify nothing broke.
### Example app updates (`apps/<name>/`)
For each example app:
1. **`package.json`** — Update `expo` to the new SDK version (e.g., `~54` → `~55`).
2. Run `npx expo install --fix` to align all other dependencies (`react`, `react-native`, `expo-splash-screen`, etc.) to compatible versions.
3. Remove any stale vendored templates or files (e.g., old `expo-template-bare-minimum-*.tgz`).
### Monorepo root updates
1. **`scripts/generate-plugin.ts`** — Update `SDK_VERSION` to the new SDK number.
### Final steps
1. Run `pnpm install` from the root to regenerate `pnpm-lock.yaml`.
2. Run `pnpm prepare` to verify all packages build.
3. Run tests for packages that have them.
4. Update `CLAUDE.md` if any conventions changed (e.g., the peer dependency version listed under Conventions).
## After Adding/Removing Packages
Run these from the root:
```bash
pnpm update-dependabot-config
pnpm update-issue-template
```
+19 -6
View File
@@ -5,23 +5,36 @@
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.
2. Run `pnpm install` 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 title.
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`.
- Plugins can be generated by running `pnpm 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`
- Update dependabot: `pnpm update-dependabot-config`
- Update the issue template: `pnpm update-issue-template`
## Upgrading plugins for a new Expo version
- Update the `catalog:` block in `pnpm-workspace.yaml` with the new SDK versions for `expo`, `@expo/config-plugins`, and any other shared dependencies
- Ensure every project under `apps/` is updated to latest version of Expo
- Update each library’s `README.md`
- Ensuring the latest version of Expo is listed
- Ensure the upstream package version is correct
- Use the next version for the matching config plugin
- Update `SDK_VERSION` in [`scripts/generate-plugin.ts`](https://github.com/expo/config-plugins/blob/566f54e785147d88cb4c98490c3e536ee7ef3001/scripts/generate-plugin.ts#L67)
## Publishing a release
All publishing should be handled automatically whenever code is merged to `main`.
Packages are published manually using the scripts in the root `package.json`:
1. `pnpm bump`: Increments the major version of all packages.
2. `pnpm release`: Publishes all packages to npm.
+6 -37
View File
@@ -1,47 +1,16 @@
# Expo Config Plugins
- A collection of [Expo config plugins](https://docs.expo.dev/guides/config-plugins/) for configuring the `expo prebuild` command.
- 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.
This repository is a collection of assorted [Expo config plugins](https://docs.expo.dev/guides/config-plugins/) for configuring the `npx expo prebuild` command. It is meant to be a temporary home for packages that don't have a built-in Config Plugin.
## Awesome
- **We prefer packages to ship their own Expo config plugin**. This helps ensure that plugin and package versions are always aligned, and that new features are made available in both the package and plugin simultaneously. If packages haven't adopted config plugins yet, the community can add a package here as a temporary home.
Here is a list of known packages that have a built-in Config Plugin.
- **All packages here are community maintained.** They are not maintained by Expo. Feel free to improve docs, packages, tests, etc.
> Not all packages need a config plugin, packages that don't appear here might still work with managed EAS.
- **We maintain a one-to-one mapping between native packages and `@config-plugins/*`**. This means there should be no general utility packages here — those are better suited for a different repository or npm namespace.
- [React Native Firebase](https://rnfirebase.io/) (`@react-native-firebase/perf`, `@react-native-firebase/app`)
- [react-native-nfc-manager](https://github.com/revtel/react-native-nfc-manager)
- [react-native-health](https://github.com/agencyenterprise/react-native-health)
- [@react-native-mapbox-gl/maps](https://github.com/rnmapbox/maps)
- [@logrocket/react-native](https://www.npmjs.com/package/@logrocket/react-native)
- [sentry-expo](https://www.npmjs.com/package/sentry-expo)
- [@leanplum/react-native-sdk](https://github.com/Leanplum/Leanplum-ReactNative-SDK#readme)
- [react-native-fbsdk-next](https://www.npmjs.com/package/react-native-fbsdk-next)
- [@stripe/stripe-react-native](https://www.npmjs.com/package/@stripe/stripe-react-native)
- [@react-native-voice/voice](https://www.npmjs.com/package/@react-native-voice/voice)
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
- [@viro-community/react-viro](https://github.com/virocommunity/viro)
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
- [react-native-spotlight-search](https://www.npmjs.com/package/react-native-spotlight-search)
- [newrelic-react-native-agent](https://www.npmjs.com/package/newrelic-react-native-agent)
- [react-native-videoeditorsdk](https://www.npmjs.com/package/react-native-videoeditorsdk)
### Complementary
More out-of-tree plugins which can be used to configure more packages.
- [onesignal-expo-plugin](https://github.com/OneSignal/onesignal-expo-plugin) (for use with `react-native-onesignal`)
- [@lyrahealth-inc/react-native-orientation-plugin](@lyrahealth-inc/react-native-orientation-plugin) (for use with `react-native-orientation-plugin`)
- [airship-expo-plugin](https://www.npmjs.com/package/airship-expo-plugin) (for use with `urbanairship-react-native`)
- [config-plugin-react-native-intercom](https://www.npmjs.com/package/config-plugin-react-native-intercom) (for use with `intercom-react-native`)
- [@allboatsrise/expo-marketingcloudsdk](https://www.npmjs.com/package/@allboatsrise/expo-marketingcloudsdk) (for use with `react-native-marketingcloudsdk`)
- [@ouvio/react-native-background-location-plugin](https://www.npmjs.com/package/@ouvio/react-native-background-location-plugin) (for use with `react-native-background-location-plugin`)
- [with-notifee](https://www.npmjs.com/package/with-notifee) (for use with [notifee](https://notifee.app/))
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
## Looking for other config plugins?
Many React Native libraries ship their own built-in config plugins. You can find them on the [React Native Directory](https://reactnative.directory/).
## Contributing!
-4
View File
@@ -1,4 +0,0 @@
{
"12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true,
"40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true
}
+1 -79
View File
@@ -1,80 +1,2 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
/artifacts
+1 -3
View File
@@ -1,3 +1 @@
export { default } from './src/detox/App';
// export { default } from './src/android-jsc-intl/App';
// export { default } from './src/android-jsc-adjust/App';
export { default } from './src/react-native-adjust/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
+2 -5
View File
@@ -4,7 +4,7 @@
"slug": "app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "https://icogen.vercel.app/api/icon",
"icon": "https://github.com/expo.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
@@ -29,12 +29,9 @@
"favicon": "./assets/favicon.png"
},
"plugins": [
"@config-plugins/react-native-adjust",
"@config-plugins/react-native-callkeep",
"@config-plugins/react-native-blob-util",
"@config-plugins/react-native-pdf",
"@config-plugins/android-jsc-intl"
"expo-localization"
]
}
}
-6
View File
@@ -1,6 +0,0 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
-72
View File
@@ -1,72 +0,0 @@
const iosName = "app";
const emulator = "Pixel_3a_API_30";
const simulator = "iPhone 13 Pro";
const derivedDataPath = "ios/build";
const sdk = "iphonesimulator";
module.exports = {
testRunner: "jest",
runnerConfig: require.resolve("./e2e/jest.config.js"),
specs: "e2e",
behavior: {
init: {
exposeGlobals: false,
},
},
apps: {
"ios.release": {
type: "ios.app",
binaryPath: `${derivedDataPath}/Build/Products/Release-${sdk}/${iosName}.app`,
build: `./scripts/build-detox-ios.sh ${iosName} Release YES`,
},
"ios.debug": {
type: "ios.app",
binaryPath: `${derivedDataPath}/Build/Products/Debug-${sdk}/${iosName}.app`,
build: `./scripts/start-metro.sh && ./scripts/build-detox-ios.sh ${iosName} Debug`,
},
"android.debug": {
type: "android.apk",
binaryPath: "android/app/build/outputs/apk/debug/app-debug.apk",
build:
"./scripts/start-metro.sh && pushd android; ./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=debug; popd",
},
"android.release": {
type: "android.apk",
binaryPath: "android/app/build/outputs/apk/release/app-release.apk",
build:
"pushd android; ./gradlew app:assembleRelease app:assembleAndroidTest -DtestBuildType=release; popd",
},
},
devices: {
simulator: {
type: "ios.simulator",
device: {
type: simulator,
},
},
emulator: {
type: "android.emulator",
device: {
avdName: emulator,
},
},
},
configurations: {
"ios.sim.release": {
device: "simulator",
app: "ios.release",
},
"ios.sim.debug": {
device: "simulator",
app: "ios.debug",
},
"android.emu.debug": {
device: "emulator",
app: "android.debug",
},
"android.emu.release": {
device: "emulator",
app: "android.release",
},
},
};
-39
View File
@@ -1,39 +0,0 @@
import { by, device, element, expect } from "detox";
import * as path from "path";
import { createCapture } from "../lib";
const projectRoot = path.resolve(__dirname, "../../");
// https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html
const languages = ["en-US", "nl-NL", "zh-CN"];
for (const locale of languages) {
const { captureAsync, resetAppAsync } = createCapture({
projectRoot,
locale,
});
describe(locale, () => {
beforeAll(resetAppAsync);
beforeEach(async () => {
await device.reloadReactNative();
});
it("should have welcome screen", async () => {
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();
});
});
}
-23
View File
@@ -1,23 +0,0 @@
const {
DetoxCircusEnvironment,
SpecReporter,
WorkerAssignReporter,
} = require("detox/runners/jest-circus");
class CustomDetoxEnvironment extends DetoxCircusEnvironment {
constructor(config, context) {
super(config, context);
// Can be safely removed, if you are content with the default value (=300000ms)
this.initTimeout = 300000;
// This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
// This is strictly optional.
this.registerListeners({
SpecReporter,
WorkerAssignReporter,
});
}
}
module.exports = CustomDetoxEnvironment;
-11
View File
@@ -1,11 +0,0 @@
module.exports = {
testEnvironment: require.resolve("./environment.js"),
testRunner: require.resolve("jest-circus/runner"),
testTimeout: 120000,
testRegex: "/__tests__/.*(e2e)\\.[jt]sx?$",
transform: {
"^.+\\.[jt]sx?$": "ts-jest",
},
reporters: [require.resolve("detox/runners/jest/streamlineReporter")],
verbose: true,
};
-76
View File
@@ -1,76 +0,0 @@
import { device } from "detox";
import * as fs from "fs";
import * as path from "path";
import { setStatusBar } from "./setStatusBar";
export function getOutputDir(projectRoot: string, locale: string) {
return path.resolve(
projectRoot,
`meta/screenshots/${device.getPlatform()}/${locale}/`
);
}
export async function takeScreenshotAsync({
info,
projectRoot,
index,
locale,
}: {
projectRoot: string;
locale: string;
info?: string;
index?: number;
}) {
const outputDir = getOutputDir(projectRoot, locale);
fs.mkdirSync(outputDir, { recursive: true });
if (index == null) {
index = fs.readdirSync(outputDir).length;
}
const name = `APP_${device.name}_${index}`.toUpperCase();
const imgPath = path.resolve(outputDir, `${name}.png`);
const imagePath = await device.takeScreenshot(name);
await fs.promises.copyFile(imagePath, imgPath);
}
export function createCapture({
projectRoot,
locale,
}: {
locale: string;
projectRoot: string;
}) {
const captureAsync = () =>
takeScreenshotAsync({
projectRoot,
locale,
});
const clearAsync = async () => {
// Clear old screen shots
const outputDir = getOutputDir(projectRoot, locale);
await fs.promises.rmdir(outputDir, { recursive: true }).catch(() => null);
};
return {
captureAsync,
clearAsync,
async resetAppAsync() {
// Clear old screen shots
await clearAsync();
// configure status bars
setStatusBar();
// reset expo-localization which doesn't account for simulators dynamically updating without resetting the phone.
await device.terminateApp();
// launch with lang
await device.launchApp({
languageAndLocale: { locale, language: locale },
launchArgs: { locale },
});
},
};
}
-32
View File
@@ -1,32 +0,0 @@
import { execSync } from "child_process";
import { device } from "detox";
export async function setStatusBar() {
if (device.getPlatform() === "ios") {
// TODO: Set date on iPad - "Tue Jan 9"
// assumes only one simulator is booted
// use Apple's magic time "9:41" - new Date('1/9/2007 09:41').toISOString()
execSync(
"xcrun simctl status_bar booted override --time 9:41 --batteryState charged --batteryLevel 100 --wifiBars 3 --cellularMode active --cellularBars 4"
);
} else {
// enter demo mode
execSync("adb shell settings put global sysui_demo_allowed 1");
// display time 6:00
execSync(
"adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1850"
);
// Display full mobile data with 4g type and no wifi
execSync(
"adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 4 -e datatype 4g -e wifi false"
);
// Hide notifications
execSync(
"adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false"
);
// Show full battery but not in charging state
execSync(
"adb shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false -e level 100"
);
}
}
+2 -11
View File
@@ -1,15 +1,6 @@
import { registerRootComponent } from "expo";
import { registerRootComponent } from 'expo';
import Constants from "expo-constants";
let App;
// Only use the Detox test in CI
if ((Constants.manifest.extra || {}).CI) {
App = require("./src/detox/App").default;
} else {
App = require("./App").default;
}
// import App from "./App";
import App from './App';
// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
// It also ensures that whether you load the app in Expo Go or in a native build,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

-6
View File
@@ -1,6 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
+19 -44
View File
@@ -1,61 +1,36 @@
{
"name": "@expo/app",
"main": "./index.js",
"version": "1.0.0",
"private": true,
"main": "./index.js",
"scripts": {
"build:ios": "detox build -c ios.sim.debug",
"test:ios": "detox test -c ios.sim.debug",
"e2e:ios": "npm run build:ios && npm run test:ios",
"build:ios-release": "detox build -c ios.sim.release",
"test:ios-release": "detox test -c ios.sim.release",
"e2e:ios-release": "npm run build:ios-release && npm run test:ios-release",
"build:android": "detox build -c android.emu.debug",
"test:android": "detox test -c android.emu.debug",
"e2e:android": "npm run build:android && npm run test:android",
"build:android-release": "detox build -c android.emu.release",
"test:android-release": "detox test -c android.emu.release",
"e2e:android-release": "npm run build:android-release && npm run test:android-release",
"clean:android": "pushd android && ./gradlew clean && popd",
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/android-jsc-intl": "*",
"@config-plugins/detox": "*",
"@config-plugins/react-native-adjust": "*",
"@config-plugins/react-native-callkeep": "*",
"expo": "^45.0.0",
"detox": "^19.6.9",
"expo-localization": "~13.0.0",
"expo-splash-screen": "~0.15.1",
"expo-status-bar": "~1.3.0",
"expo-updates": "~0.13.1",
"@config-plugins/react-native-adjust": "workspace:*",
"@config-plugins/react-native-callkeep": "workspace:*",
"expo": "~56",
"expo-localization": "~56.0.6",
"expo-splash-screen": "~56.0.10",
"fbjs": "^0.8.18",
"i18n-js": "^3.8.0",
"luxon": "^1.27.0",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-native": "0.68.2",
"react-native-adjust": "^4.29.6",
"react-native-callkeep": "^4.3.3",
"react-native-safe-area-context": "4.2.4",
"react-native-web": "0.17.7"
"react": "19.2.3",
"react-native": "0.85.3",
"react-native-adjust": "^5.6.0",
"react-native-callkeep": "^4.3.16",
"react-native-safe-area-context": "~5.7.0"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@babel/plugin-syntax-jsx": "^7.16.0",
"@expo/metro-config": "~0.3.7",
"@expo/xcpretty": "^4.1.2",
"@types/jest": "^26.0.19",
"@types/jest": "^29.4.0",
"@types/luxon": "^1.27.1",
"@types/react": "~17.0.21",
"@types/react-native": "~0.64.12",
"babel-jest": "~25.2.6",
"jest": "^26.6.3",
"jest-circus": "^26.5.2",
"ts-jest": "^26.4.4",
"typescript": "~4.3.5"
},
"private": true
"babel-jest": "^29.5.0",
"jest": "~29.7.0",
"jest-circus": "^29.5.0",
"ts-jest": "^29.0.5",
"typescript": "~5.9.2"
}
}
-30
View File
@@ -1,30 +0,0 @@
#!/usr/bin/env bash
# This script wraps the xcodebuild command and exits with non-zero if the build fails.
#
# This ensures that CI fails on the correct step instead of attempting to run Detox tests without a
# build.
set -eu
iosName=$1
# Debug or Release
configuration=$2
# YES or NO
UseModernBuildSystem=${3:-"NO"}
xcodebuild \
-workspace ios/$iosName.xcworkspace \
-scheme $iosName \
-configuration "$configuration" \
-sdk iphonesimulator \
-derivedDataPath "ios/build" \
-UseModernBuildSystem="$UseModernBuildSystem" 2>&1 | npx excpretty ./
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
echo 'Build Failed'
set +e
exit 1
fi
echo 'Build Succeeded'
+1 -1
View File
@@ -16,7 +16,7 @@ else
commandFile=$(dirname "$0")/start.command
cat > ${commandFile} << EOF
cd "\$(dirname "\$0")/.."
# Run 'react-native start --help' to get more parameters
# Run 'npx expo start --help' to get more parameters
yarn start --port ${port}
EOF
# execute the file in a new command line window
-28
View File
@@ -1,28 +0,0 @@
import React from "react";
import { Text, View } from "react-native";
import { DateTime } from "luxon";
const currentDate = DateTime.fromObject({
locale: "en-US",
zone: "America/New_York",
});
export default function App() {
return (
<View
style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "blue",
}}
>
<Text style={{ fontSize: 18, color: "white", textAlign: "center" }}>
Intl support for Android, without Hermes 🤖
</Text>
<Text style={{ fontSize: 18, color: "white", textAlign: "center" }}>
{currentDate.toISO()}
</Text>
</View>
);
}
-62
View File
@@ -1,62 +0,0 @@
import React from "react";
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
import * as Localization from "expo-localization";
import i18n from "i18n-js";
// Set the key-value pairs for the different languages you want to support.
i18n.translations = {
"en-US": { welcome: "Welcome", hello: "Hello", world: "World" },
"nl-NL": { welcome: "Welkom", hello: "Hallo", world: "Wereld" },
"zh-CN": { welcome: "欢迎", hello: "你好", world: "世界" },
};
// Set the locale once at the beginning of your app.
i18n.locale = Localization.locale;
export default function App() {
const [greeting, setGreeting] = React.useState("");
if (greeting) {
return (
<View style={styles.container}>
<Text style={styles.text}>{greeting}!!!</Text>
</View>
);
}
return (
<View testID="welcome" style={styles.container}>
<Text style={styles.text}>
{i18n.t("welcome")} {JSON.stringify(Localization.locales)}
</Text>
<TouchableOpacity
testID="hello_button"
onPress={() => setGreeting(i18n.t("hello"))}
>
<Text style={styles.buttonText}>Say {i18n.t("hello")}</Text>
</TouchableOpacity>
<TouchableOpacity
testID="world_button"
onPress={() => setGreeting(i18n.t("world"))}
>
<Text style={styles.buttonText}>Say {i18n.t("world")}</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 20,
justifyContent: "center",
alignItems: "center",
},
text: {
fontSize: 25,
marginBottom: 30,
},
buttonText: {
color: "blue",
marginBottom: 20,
},
});
+8 -10
View File
@@ -1,14 +1,12 @@
import React from "react";
import { SafeAreaView, Text, StyleSheet } from "react-native";
import { Adjust, AdjustConfig } from "react-native-adjust";
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);
// https://github.com/adjust/react_native_sdk/blob/bd4fe59403a57599767606b2bcaa116852df973d/example/App.js#L45
const adjustConfig = new AdjustConfig('APP_TOKEN', AdjustConfig.EnvironmentSandbox);
Adjust.enable();
}, []);
return (
@@ -21,7 +19,7 @@ export default function App() {
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
justifyContent: 'center',
alignItems: 'center',
},
});
-3
View File
@@ -1,3 +0,0 @@
const { createWebpackConfigAsync } = require("expo-yarn-workspaces/webpack");
module.exports = createWebpackConfigAsync;
+49
View File
@@ -0,0 +1,49 @@
appId: dev.bacon.applesettings
---
# Kill the Settings app to ensure a clean state
- killApp: 'com.apple.Preferences'
# Launch the app
- launchApp
# Verify main UI elements are visible
- assertVisible:
id: 'name-input'
- assertVisible:
id: 'enabled-switch'
- assertVisible:
id: 'slider'
# Clear any existing text and type a new value
- tapOn:
id: 'name-input'
- eraseText: 50
- inputText: 'Maestro'
# Toggle the switch on (default is off)
- tapOn:
id: 'enabled-switch'
# Open iOS Settings for this app
- tapOn: 'Launch Settings'
# Navigate to the app's settings page
- scrollUntilVisible:
element: 'Apps'
direction: DOWN
- tapOn: 'Apps'
- scrollUntilVisible:
element: 'apple-settings'
direction: DOWN
- tapOn: 'apple-settings'
- scrollUntilVisible:
element: 'apple-settings Settings'
direction: DOWN
# Verify updated values in the iOS Settings app
- assertVisible: 'Maestro'
# Verify the Enabled toggle is on (checked = true when on)
- assertVisible:
id: 'PSToggleSwitchSpecifier.enabled_preference.Enabled'
checked: true
+123
View File
@@ -0,0 +1,123 @@
import withAppleSettings, {
ChildPane,
Group,
RadioGroup,
Slider,
Switch,
TextField,
Title,
} from '@config-plugins/apple-settings';
import { MultiValue } from '@config-plugins/apple-settings/build/models';
import { ConfigContext, ExpoConfig } from 'expo/config';
import path from 'node:path';
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, '');
const appId = 'dev.bacon.' + cleanName;
function withWhiteLabel(config: Partial<ExpoConfig>) {
if (!config.extra) config.extra = {};
// Expose CI env variables to the app
config.extra.CI = process.env.CI;
if (!config.ios) config.ios = {};
config.ios.bundleIdentifier = appId;
if (!config.android) config.android = {};
config.android.package = appId;
return config;
}
module.exports = ({ config }: ConfigContext): Partial<ExpoConfig> => {
config = withWhiteLabel(config);
config = withAppleSettings(config as ExpoConfig, {
// The name of the .plist file to generate. Root is the default and must be provided.
Root: {
// The locales object is optional. If provided, it will be used to generate the localized .strings files.
locales: {
// The Apple locale code. This will be used to generate the .strings file.
en: {
// Name of the localized key.
Name: 'Text Field',
},
},
// The page object is required. It will be used to generate the .plist file.
// The contents will be converted directly to plist.
page: {
// The `PreferenceSpecifiers` defines the UI elements to generate.
PreferenceSpecifiers: [
Title({
title: 'Title',
value: 'Default Title',
key: 'title_preference',
}),
// Helper models can be used to generate the UI elements using
// an API that's similar to React Native.
TextField({
title: 'Name',
key: 'name_preference',
value: '',
keyboardType: 'Alphabet',
autoCapitalize: 'None',
autoCorrect: 'No',
}),
Switch({
title: 'Enabled',
key: 'enabled_preference',
value: true,
}),
Slider({
key: 'slider_preference',
value: 0.5,
}),
// Broken https://forums.developer.apple.com/forums/thread/764519
// RadioGroup({
// value: "option1",
// key: "radio_preference",
// items: [
// {
// title: "Option 1",
// value: "option1",
// },
// {
// title: "Option 2",
// value: "option2",
// },
// ],
// }),
// MultiValue({
// title: "Multi Value",
// key: "multi_value_preference",
// value: "alpha",
// items: [
// {
// title: "Alpha",
// value: "alpha",
// short: "α",
// },
// {
// title: "Beta",
// value: "beta",
// short: "β",
// },
// {
// title: "Delta",
// value: "delta",
// short: "Δ",
// },
// {
// title: "Omega",
// value: "omega",
// short: "Ω",
// },
// ],
// }),
],
},
},
});
return config;
};
+7
View File
@@ -0,0 +1,7 @@
{
"expo": {
"name": "apple-settings",
"icon": "https://github.com/expo.png",
"platforms": ["ios"]
}
}
+5
View File
@@ -0,0 +1,5 @@
import { registerRootComponent } from 'expo';
import App from './src/App';
registerRootComponent(App);
+21
View File
@@ -0,0 +1,21 @@
{
"name": "@config-plugins-app/apple-settings",
"version": "1.0.0",
"private": true,
"main": "./index.js",
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android",
"e2e": "maestro test .maestro/"
},
"dependencies": {
"@config-plugins/apple-settings": "workspace:*",
"@react-native-community/slider": "5.2.0",
"@react-native-picker/picker": "2.11.4",
"expo": "~56",
"expo-splash-screen": "~56.0.10",
"react": "19.2.3",
"react-native": "0.85.3"
}
}
+59
View File
@@ -0,0 +1,59 @@
import React from 'react';
import { Button, Linking, StyleSheet, View } from 'react-native';
import {
SettingsRadioGroup,
SettingsSlider,
SettingsSwitch,
SettingsTextInput,
SettingsTitle,
} from './SettingsViews';
const App = () => {
return (
<View style={styles.container}>
{/* <SettingsTitle settingsKey="title_preference" /> */}
<SettingsTextInput
testID="name-input"
style={{
height: 40,
borderColor: 'gray',
borderWidth: 1,
padding: 8,
}}
settingsKey="name_preference"
/>
<SettingsSwitch testID="enabled-switch" settingsKey="enabled_preference" />
<SettingsSlider testID="slider" settingsKey="slider_preference" />
<View />
{/* Broken https://forums.developer.apple.com/forums/thread/764519 */}
{/*<SettingsRadioGroup settingsKey="radio_preference">*/}
{/* <SettingsRadioGroup.Item label="Option 1" value="option1" />*/}
{/* <SettingsRadioGroup.Item label="Option 2" value="option2" />*/}
{/*</SettingsRadioGroup>*/}
<View />
<Button
title="Launch Settings"
onPress={() => {
void Linking.openSettings();
}}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'stretch',
paddingHorizontal: 56,
gap: 12,
},
value: {
fontSize: 24,
marginVertical: 12,
},
});
export default App;
+79
View File
@@ -0,0 +1,79 @@
import Slider from '@react-native-community/slider';
import { Picker } from '@react-native-picker/picker';
import React from 'react';
import { Settings, Switch, Text, TextInput } from 'react-native';
export function useSetting<T = string>(key: string): [T, (value: T) => void] {
const [value, setValue] = React.useState<T>(() => Settings.get(key));
React.useEffect(() => {
let isMounted = true;
const callback = Settings.watchKeys(key, () => {
if (isMounted) {
setValue(Settings.get(key));
}
});
return () => {
Settings.clearWatch(callback);
isMounted = false;
};
}, [key]);
return [
value,
(value) => {
Settings.set({ [key]: value });
setValue(value);
},
];
}
export function SettingsSlider({
settingsKey,
...props
}: { settingsKey: string } & Omit<
React.ComponentProps<typeof Slider>,
'selectedValue' | 'onValueChange'
>) {
const [value, setValue] = useSetting<number>(settingsKey);
return <Slider {...props} value={value ?? 0} onValueChange={setValue} />;
}
export function SettingsRadioGroup({
settingsKey,
...props
}: { settingsKey: string } & Omit<
React.ComponentProps<typeof Picker>,
'selectedValue' | 'onValueChange'
>) {
const [value, setValue] = useSetting<string>(settingsKey);
return <Picker {...props} selectedValue={value ?? 'option1'} onValueChange={setValue} />;
}
SettingsRadioGroup.Item = Picker.Item;
export function SettingsSwitch({
settingsKey,
...props
}: { settingsKey: string } & Omit<React.ComponentProps<typeof Switch>, 'value' | 'onValueChange'>) {
const [value, setValue] = useSetting<boolean>(settingsKey);
return <Switch {...props} value={!!value} onValueChange={setValue} />;
}
export function SettingsTitle({
settingsKey,
...props
}: { settingsKey: string } & Omit<React.ComponentProps<typeof Text>, 'children'>) {
const [value] = useSetting<string>(settingsKey);
return <Text {...props} children={value} />;
}
export function SettingsTextInput({
settingsKey,
...props
}: { settingsKey: string } & Omit<
React.ComponentProps<typeof TextInput>,
'value' | 'onChangeText'
>) {
const [value, setValue] = useSetting<string>(settingsKey);
return <TextInput {...props} value={value} onChangeText={setValue} />;
}
File renamed without changes.
-80
View File
@@ -1,80 +0,0 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
Whitespace-only changes.
@@ -1,16 +0,0 @@
const path = require("path");
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
// Expose CI env variables to the app
config.extra.CI = process.env.CI;
if (!config.ios) config.ios = {};
config.ios.bundleIdentifier = appId;
if (!config.android) config.android = {};
config.android.package = appId;
return config;
};
-13
View File
@@ -1,13 +0,0 @@
{
"expo": {
"icon": "https://icogen.vercel.app/api/icon",
"plugins": [
[
"@config-plugins/ffmpeg-kit-react-native",
{
"package": "min"
}
]
]
}
}
@@ -1,6 +0,0 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
-5
View File
@@ -1,5 +0,0 @@
import { registerRootComponent } from "expo";
import App from "./src/App";
registerRootComponent(App);
@@ -1,6 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
-25
View File
@@ -1,25 +0,0 @@
{
"name": "@config-plugins-app/ffmpeg-kit-react-native",
"main": "./index.js",
"version": "1.0.0",
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/ffmpeg-kit-react-native": "*",
"expo": "^45.0.0",
"expo-splash-screen": "~0.15.1",
"react": "17.0.2",
"react-native": "0.68.2",
"ffmpeg-kit-react-native": "^4.5.1",
"expo-status-bar": "~1.3.0",
"react-dom": "17.0.2",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9"
},
"private": true
}
-41
View File
@@ -1,41 +0,0 @@
import { Session } from 'ffmpeg-kit-react-native';
import React from 'react';
import { ActivityIndicator, SafeAreaView, ScrollView, Text, View } from 'react-native';
import { useMediaInfo, useResolvedValue } from './useMediaInfo';
export default function App() {
const session = useMediaInfo('http://techslides.com/demos/sample-videos/small.mp4');
if (!session) {
return <View style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
}}><ActivityIndicator /><Text>Loading...</Text></View>
}
return <SessionInfo session={session} />
}
function SessionInfo(props: { session: Session }) {
const { session } = props;
const duration = useResolvedValue(session.getDuration.bind(session));
const output = useResolvedValue(session.getOutput.bind(session));
return (
<SafeAreaView
style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
}}
>
<ScrollView>
<Text>Duration: {duration}</Text>
<Text>Output: {output}</Text>
</ScrollView>
</SafeAreaView>
);
}
@@ -1,55 +0,0 @@
import { FFprobeKit, Session } from "ffmpeg-kit-react-native";
import React from "react";
function useMounted() {
const isMounted = React.useRef(true);
React.useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
export function useResolvedValue<T>(
method: () => Promise<T>
): [T | null, Error | null] {
const [error, setError] = React.useState<Error | null>(null);
const [value, setValue] = React.useState<T | null>(null);
React.useEffect(() => {
let isMounted = true;
method()
.then((value) => {
if (isMounted) {
setValue(value);
}
})
.catch((error) => {
if (isMounted) {
setError(error);
}
});
return () => {
isMounted = false;
};
}, []);
return [value, error];
}
export function useMediaInfo(filePathOrUrl: string) {
const [results, setResults] = React.useState<Session | undefined>(undefined);
const isMounted = useMounted();
React.useEffect(() => {
FFprobeKit.getMediaInformationAsync(filePathOrUrl, async (session) => {
if (isMounted) {
setResults(session);
}
});
}, [filePathOrUrl]);
return results;
}
-80
View File
@@ -1,80 +0,0 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
View File
Whitespace-only changes.
+3 -3
View File
@@ -1,7 +1,7 @@
const path = require("path");
const path = require('path');
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
const cleanName = folderName.replace(/[_\s-]/g, '');
const appId = 'dev.bacon.' + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
+4 -1
View File
@@ -1,11 +1,14 @@
{
"expo": {
"icon": "https://icogen.vercel.app/api/icon",
"name": "stickers",
"icon": "https://github.com/expo.png",
"platforms": ["ios"],
"plugins": [
[
"@config-plugins/ios-stickers",
{
"name": "Stickers",
"stickerBundleId": "dev.bacon.iosstickers.stickers",
"icon": "./assets/imessage-icon.png",
"columns": 4,
"stickers": [
-6
View File
@@ -1,6 +0,0 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
+2 -2
View File
@@ -1,5 +1,5 @@
import { registerRootComponent } from "expo";
import { registerRootComponent } from 'expo';
import App from "./src/App";
import App from './src/App';
registerRootComponent(App);
-6
View File
@@ -1,6 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
+7 -14
View File
@@ -1,24 +1,17 @@
{
"name": "@config-plugins-app/ios-stickers",
"main": "./index.js",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/ios-stickers": "*",
"expo": "^45.0.0",
"expo-splash-screen": "~0.15.1",
"react": "17.0.2",
"react-native": "0.68.2",
"expo-status-bar": "~1.3.0",
"react-dom": "17.0.2",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9"
},
"private": true
"@config-plugins/ios-stickers": "workspace:*",
"expo": "~56",
"expo-splash-screen": "~56.0.10",
"react": "19.2.3",
"react-native": "0.85.3"
}
}
+2 -3
View File
@@ -1,9 +1,8 @@
import React from "react";
import { Text, View } from "react-native";
import { Text, View } from 'react-native';
export default function App() {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Open iMessage to find the app</Text>
</View>
);
+4
View File
@@ -0,0 +1,4 @@
{
"compilerOptions": {},
"extends": "expo/tsconfig.base"
}
-80
View File
@@ -1,80 +0,0 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
Whitespace-only changes.
-16
View File
@@ -1,16 +0,0 @@
const path = require("path");
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
// Expose CI env variables to the app
config.extra.CI = process.env.CI;
if (!config.ios) config.ios = {};
config.ios.bundleIdentifier = appId;
if (!config.android) config.android = {};
config.android.package = appId;
return config;
};
-8
View File
@@ -1,8 +0,0 @@
{
"expo": {
"icon": "https://icogen.vercel.app/api/icon?icon=1f9b7&color_hex=0000ff",
"plugins": [
"@config-plugins/react-native-ble-plx"
]
}
}
@@ -1,6 +0,0 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
-5
View File
@@ -1,5 +0,0 @@
import { registerRootComponent } from "expo";
import App from "./src/App";
registerRootComponent(App);
@@ -1,6 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
-28
View File
@@ -1,28 +0,0 @@
{
"name": "@config-plugins-app/react-native-ble-plx",
"main": "./index.js",
"version": "1.0.0",
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/react-native-ble-plx": "*",
"expo": "^45.0.0",
"expo-splash-screen": "~0.15.1",
"react": "17.0.2",
"react-native": "0.68.2",
"react-native-ble-plx": "^2.0.3",
"expo-status-bar": "~1.3.0",
"react-dom": "17.0.2",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@types/react": "~17.0.21",
"@types/react-native": "~0.64.12",
"typescript": "~4.3.5"
},
"private": true
}
-32
View File
@@ -1,32 +0,0 @@
import React from 'react';
import { Text, View } from 'react-native';
import useBluetoothDevices, { useManager, useManagerState } from './useBluetoothDevices';
export default function App() {
const bleManager = useManager();
const state = useManagerState(bleManager);
console.log('Info:', state);
return (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: 'blue'}}>
<Text style={{fontSize: 18, color: 'white'}}>State: {state}</Text>
{state === 'PoweredOn' && <DeviceScanner bleManager={bleManager} />}
</View>
);
}
function DeviceScanner({ bleManager }) {
const [devices] = useBluetoothDevices(bleManager);
React.useEffect(() => {
console.log(devices);
}, [devices]);
return (
<View>
{devices.filter(({name}) => name).map((device, index) => (<Text key={`-${index}`} style={{fontSize: 14, color: 'white'}}>{device.name}</Text>))}
</View>
)
}
@@ -1,70 +0,0 @@
import { useEffect, useMemo, useRef, useState } from "react";
import { BleManager, State, Device } from "react-native-ble-plx";
import { uniqBy } from "lodash";
export function useManager() {
return useMemo(() => new BleManager(), []);
}
export function useManagerState(bleManager: BleManager): State | null {
const [state, setState] = useState<State | null>(null);
const isMounted = useMounted();
useEffect(() => {
if (!bleManager) return;
bleManager.onStateChange((state) => {
if (isMounted.current) {
setState(state);
}
}, true);
}, [bleManager]);
return state;
}
function useMounted() {
const isMounted = useRef(true);
useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
export function useBluetoothDevices(
bleManager: BleManager
): [Device[], null | string] {
const isMoutned = useMounted();
const [error, setError] = useState<string | null>(null);
const [devices, setDevices] = useState<Device[]>([]);
useEffect(() => {
bleManager.startDeviceScan(
[],
{ allowDuplicates: false },
(e, scannedDevice) => {
if (!isMoutned.current) return;
if (e) {
setError(e.message);
}
if (!scannedDevice) return;
setDevices((oldDevices) =>
uniqBy([...oldDevices, scannedDevice], "id")
);
}
);
return () => {
bleManager.stopDeviceScan();
};
}, [bleManager]);
return [devices, error];
}
export default useBluetoothDevices;
-80
View File
@@ -1,80 +0,0 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
Whitespace-only changes.
+3 -3
View File
@@ -1,7 +1,7 @@
const path = require("path");
const path = require('path');
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
const cleanName = folderName.replace(/[_\s-]/g, '');
const appId = 'dev.bacon.' + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
+10 -15
View File
@@ -1,22 +1,17 @@
{
"expo": {
"icon": "https://icogen.vercel.app/api/icon?icon=1f334",
"ios": {
"config": {
"branch": {
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8"
}
}
},
"android": {
"config": {
"branch": {
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8"
}
}
"name": "branch",
"icon": "https://github.com/expo.png",
"splash": {
"image": "https://github.com/expo.png"
},
"plugins": [
"@config-plugins/react-native-branch"
[
"@config-plugins/react-native-branch",
{
"apiKey": "key_live_f9f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8"
}
]
]
}
}
-6
View File
@@ -1,6 +0,0 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
+2 -2
View File
@@ -1,5 +1,5 @@
import { registerRootComponent } from "expo";
import { registerRootComponent } from 'expo';
import App from "./src/App";
import App from './src/App';
registerRootComponent(App);
-6
View File
@@ -1,6 +0,0 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("@expo/metro-config");
const config = getDefaultConfig(__dirname);
module.exports = config;
+9 -15
View File
@@ -1,25 +1,19 @@
{
"name": "@config-plugins-app/react-native-branch",
"main": "./index.js",
"version": "1.0.0",
"private": true,
"main": "./index.js",
"scripts": {
"start": "expo start --dev-client",
"ios": "expo run:ios",
"android": "expo run:android"
},
"dependencies": {
"@config-plugins/react-native-branch": "*",
"expo": "^45.0.0",
"expo-splash-screen": "~0.15.1",
"react": "17.0.2",
"react-native": "0.68.2",
"react-native-branch": "^5.4.0",
"expo-status-bar": "~1.3.0",
"react-dom": "17.0.2",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9"
},
"private": true
"@config-plugins/react-native-branch": "workspace:*",
"expo": "~56",
"expo-splash-screen": "~56.0.10",
"react": "19.2.3",
"react-native": "0.85.3",
"react-native-branch": "^6.10.0"
}
}
+2 -3
View File
@@ -1,9 +1,8 @@
import React from "react";
import { Text, View } from "react-native";
import { Text, View } from 'react-native';
export default function App() {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Branch</Text>
</View>
);
+4
View File
@@ -0,0 +1,4 @@
{
"compilerOptions": {},
"extends": "expo/tsconfig.base"
}
@@ -1,80 +0,0 @@
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
/artifacts
/scripts/start.command
/ios
/android
# @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8
# The following patterns were generated by expo-cli
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Expo
.expo/
web-build/
dist/
# @end expo-cli
Whitespace-only changes.
@@ -1,16 +0,0 @@
const path = require("path");
const folderName = path.basename(__dirname);
const cleanName = folderName.replace(/[_\s-]/g, "");
const appId = "dev.bacon." + cleanName;
module.exports = ({ config }) => {
if (!config.extra) config.extra = {};
// Expose CI env variables to the app
config.extra.CI = process.env.CI;
if (!config.ios) config.ios = {};
config.ios.bundleIdentifier = appId;
if (!config.android) config.android = {};
config.android.package = appId;
return config;
};
@@ -1,17 +0,0 @@
{
"expo": {
"icon": "./assets/icons/winter.png",
"plugins": [
[
"@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"
]
]
]
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Loaded 100 of 462 files, more files were not shown because too many files have changed in this diff. Show more