mirror of
https://github.com/expo/config-plugins.git
synced 2026-11-13 20:28:07 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1a2929130 | ||
|
|
a04de8a0e0 | ||
|
|
20a4ecf8a8 | ||
|
|
9e8a90d523 | ||
|
|
9c79b293d8 | ||
|
|
77eb67c5b6 | ||
|
|
190c489b76 | ||
|
|
6c898afd0e |
No files matched your search
@@ -6,6 +6,43 @@
|
||||
- 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.
|
||||
|
||||
## Awesome
|
||||
|
||||
Here is a list of known packages that have a built-in Config Plugin.
|
||||
|
||||
> Not all packages need a config plugin, packages that don't appear here might still work with managed EAS.
|
||||
|
||||
- [React Native Firebase](https://rnfirebase.io/) (`@react-native-firebase/perf`, `@react-native-firebase/app`)
|
||||
- [react-native-nfc-manager](https://github.com/revtel/react-native-nfc-manager)
|
||||
- [react-native-health](https://github.com/agencyenterprise/react-native-health)
|
||||
- [@react-native-mapbox-gl/maps](https://github.com/rnmapbox/maps)
|
||||
- [@logrocket/react-native](https://www.npmjs.com/package/@logrocket/react-native)
|
||||
- [sentry-expo](https://www.npmjs.com/package/sentry-expo)
|
||||
- [@leanplum/react-native-sdk](https://github.com/Leanplum/Leanplum-ReactNative-SDK#readme)
|
||||
- [react-native-fbsdk-next](https://www.npmjs.com/package/react-native-fbsdk-next)
|
||||
- [@stripe/stripe-react-native](https://www.npmjs.com/package/@stripe/stripe-react-native)
|
||||
- [@react-native-voice/voice](https://www.npmjs.com/package/@react-native-voice/voice)
|
||||
- [react-native-imglysdk](https://www.npmjs.com/package/react-native-imglysdk)
|
||||
- [@viro-community/react-viro](https://github.com/virocommunity/viro)
|
||||
- [react-native-msal](https://www.npmjs.com/package/react-native-msal)
|
||||
- [react-native-spotlight-search](https://www.npmjs.com/package/react-native-spotlight-search)
|
||||
- [newrelic-react-native-agent](https://www.npmjs.com/package/newrelic-react-native-agent)
|
||||
- [react-native-videoeditorsdk](https://www.npmjs.com/package/react-native-videoeditorsdk)
|
||||
|
||||
### Complementary
|
||||
|
||||
More out-of-tree plugins which can be used to configure more packages.
|
||||
|
||||
- [onesignal-expo-plugin](https://github.com/OneSignal/onesignal-expo-plugin) (for use with `react-native-onesignal`)
|
||||
- [@lyrahealth-inc/react-native-orientation-plugin](@lyrahealth-inc/react-native-orientation-plugin) (for use with `react-native-orientation-plugin`)
|
||||
- [airship-expo-plugin](https://www.npmjs.com/package/airship-expo-plugin) (for use with `urbanairship-react-native`)
|
||||
- [config-plugin-react-native-intercom](https://www.npmjs.com/package/config-plugin-react-native-intercom) (for use with `intercom-react-native`)
|
||||
- [@allboatsrise/expo-marketingcloudsdk](https://www.npmjs.com/package/@allboatsrise/expo-marketingcloudsdk) (for use with `react-native-marketingcloudsdk`)
|
||||
- [@ouvio/react-native-background-location-plugin](https://www.npmjs.com/package/@ouvio/react-native-background-location-plugin) (for use with `react-native-background-location-plugin`)
|
||||
- [with-notifee](https://www.npmjs.com/package/with-notifee) (for use with [notifee](https://notifee.app/))
|
||||
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
|
||||
|
||||
|
||||
## Contributing!
|
||||
|
||||
See the [contributing guide](/CONTRIBUTING.md).
|
||||
@@ -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,8 +0,0 @@
|
||||
{
|
||||
"expo": {
|
||||
"icon": "https://icogen.vercel.app/api/icon?icon=1f334",
|
||||
"plugins": [
|
||||
"@config-plugins/airbridge-react-native-sdk"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = function(api) {
|
||||
api.cache(true);
|
||||
return {
|
||||
presets: ['babel-preset-expo'],
|
||||
};
|
||||
};
|
||||
@@ -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;
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "@config-plugins-app/airbridge-react-native-sdk",
|
||||
"main": "./index.js",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"start": "expo start --dev-client",
|
||||
"ios": "expo run:ios",
|
||||
"android": "expo run:android"
|
||||
},
|
||||
"dependencies": {
|
||||
"@config-plugins/airbridge-react-native-sdk": "*",
|
||||
"expo": "^45.0.0",
|
||||
"expo-splash-screen": "~0.15.1",
|
||||
"react": "17.0.2",
|
||||
"react-native": "0.68.2",
|
||||
"airbridge-react-native-sdk": "^1.4.5",
|
||||
"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
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
import React from "react";
|
||||
import { Text, View } from "react-native";
|
||||
|
||||
export default function App() {
|
||||
return (
|
||||
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
|
||||
<Text>airbridge-react-native-sdk</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
// @generated by expo-module-scripts
|
||||
module.exports = require('expo-module-scripts/eslintrc.base.js');
|
||||
@@ -1,50 +0,0 @@
|
||||
# @config-plugins/airbridge-react-native-sdk
|
||||
|
||||
Expo Config Plugin to auto configure [`airbridge-react-native-sdk`](https://www.npmjs.com/package/airbridge-react-native-sdk) when the native code is generated (`expo prebuild`).
|
||||
|
||||
## Expo installation
|
||||
|
||||
> Tested against Expo SDK 42
|
||||
|
||||
This package cannot be used in the "Expo Go" app because [it requires custom native code](https://docs.expo.io/workflow/customizing/).
|
||||
|
||||
- First install the package with yarn, npm, or [`expo install`](https://docs.expo.io/workflow/expo-cli/#expo-install).
|
||||
|
||||
```sh
|
||||
expo install airbridge-react-native-sdk @config-plugins/airbridge-react-native-sdk
|
||||
```
|
||||
|
||||
After installing this npm package, add the [config plugin](https://docs.expo.io/guides/config-plugins/) to the [`plugins`](https://docs.expo.io/versions/latest/config/app/#plugins) array of your `app.json` or `app.config.js`:
|
||||
|
||||
```json
|
||||
{
|
||||
"expo": {
|
||||
"plugins": ["@config-plugins/airbridge-react-native-sdk"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
|
||||
|
||||
## API
|
||||
|
||||
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
|
||||
|
||||
- `foobar` (_boolean_): Does XYZ. Default `false`.
|
||||
|
||||
#### Example
|
||||
|
||||
```json
|
||||
{
|
||||
"expo": {
|
||||
"plugins": [
|
||||
[
|
||||
"@config-plugins/airbridge-react-native-sdk",
|
||||
{
|
||||
// props ...
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
@@ -1,67 +0,0 @@
|
||||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
group = 'host.exp.exponent'
|
||||
version = '2.0.0'
|
||||
|
||||
buildscript {
|
||||
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
||||
if (expoModulesCorePlugin.exists()) {
|
||||
apply from: expoModulesCorePlugin
|
||||
applyKotlinExpoModulesCorePlugin()
|
||||
}
|
||||
|
||||
// Simple helper that allows the root project to override versions declared by this library.
|
||||
ext.safeExtGet = { prop, fallback ->
|
||||
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
|
||||
}
|
||||
|
||||
// Ensures backward compatibility
|
||||
ext.getKotlinVersion = {
|
||||
if (ext.has("kotlinVersion")) {
|
||||
ext.kotlinVersion()
|
||||
} else {
|
||||
ext.safeExtGet("kotlinVersion", "1.6.10")
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinVersion()}")
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion safeExtGet("compileSdkVersion", 31)
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_11.majorVersion
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion safeExtGet("minSdkVersion", 21)
|
||||
targetSdkVersion safeExtGet("targetSdkVersion", 31)
|
||||
versionCode 2
|
||||
versionName '2.0.0'
|
||||
}
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':expo-modules-core')
|
||||
// implementation project(':react-native-branch')
|
||||
|
||||
//noinspection GradleDynamicVersion
|
||||
implementation 'com.facebook.react:react-native:+'
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}"
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
<manifest package="expo.modules.adapters.airbridge">
|
||||
</manifest>
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
package expo.modules.adapters.airbridge
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import expo.modules.core.interfaces.ApplicationLifecycleListener
|
||||
// import io.branch.rnbranch.RNBranchModule
|
||||
|
||||
class AirbridgeApplicationLifecycleListener(context: Context?) : ApplicationLifecycleListener {
|
||||
var context = context
|
||||
|
||||
override fun onCreate(application: Application) {
|
||||
super.onCreate(application)
|
||||
// RNBranchModule.getAutoInstance(this.context)
|
||||
}
|
||||
}
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
package expo.modules.adapters.airbridge
|
||||
|
||||
import android.content.Context
|
||||
import expo.modules.core.interfaces.ApplicationLifecycleListener
|
||||
import expo.modules.core.interfaces.Package
|
||||
import expo.modules.core.interfaces.ReactActivityLifecycleListener
|
||||
|
||||
class AirbridgePackage : Package {
|
||||
override fun createApplicationLifecycleListeners(context: Context?): List<ApplicationLifecycleListener> {
|
||||
return listOf(AirbridgeApplicationLifecycleListener(context))
|
||||
}
|
||||
override fun createReactActivityLifecycleListeners(activityContext: Context): List<ReactActivityLifecycleListener> {
|
||||
return listOf(AirbridgeReactActivityLifecycleListener(activityContext))
|
||||
}
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package expo.modules.adapters.airbridge
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import expo.modules.core.interfaces.ReactActivityLifecycleListener
|
||||
// import io.airbridge.rnbranch.RNBranchModule
|
||||
|
||||
|
||||
class AirbridgeReactActivityLifecycleListener(activityContext: Context) : ReactActivityLifecycleListener {
|
||||
override fun onCreate(activity: Activity, savedInstanceState: Bundle?) {
|
||||
// RNBranchModule.initSession(activity.getIntent().getData(), activity);
|
||||
}
|
||||
|
||||
override fun onNewIntent(intent: Intent?): Boolean {
|
||||
if (intent != null) {
|
||||
// RNBranchModule.onNewIntent(intent);
|
||||
}
|
||||
return super.onNewIntent(intent)
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
module.exports = require("./build/withAirbridgeReactNativeSdk");
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"platforms": [
|
||||
"android",
|
||||
"ios"
|
||||
],
|
||||
"ios": {
|
||||
"appDelegateSubscribers": ["AirbridgeAppDelegate"]
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
require 'json'
|
||||
|
||||
package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ExpoAdapterAirbridge'
|
||||
s.version = package['version']
|
||||
s.summary = package['description']
|
||||
s.description = package['description']
|
||||
s.license = package['license']
|
||||
s.author = package['author']
|
||||
s.homepage = package['homepage']
|
||||
s.platform = :ios, '12.0'
|
||||
s.swift_version = '5.4'
|
||||
s.source = { git: 'https://github.com/expo/config-plugins.git' }
|
||||
s.static_framework = true
|
||||
|
||||
# s.compiler_flags = %(-DRNBRANCH_VERSION=@\\"#{package['dependencies']['react-native-branch']}\\")
|
||||
|
||||
s.dependency 'ExpoModulesCore'
|
||||
s.dependency 'React-Core'
|
||||
# s.dependency 'react-native-branch'
|
||||
|
||||
# Swift/Objective-C compatibility
|
||||
s.pod_target_xcconfig = {
|
||||
'DEFINES_MODULE' => 'YES'
|
||||
}
|
||||
|
||||
if !$ExpoUseSources&.include?(package['name']) && ENV['EXPO_USE_SOURCE'].to_i == 0 && File.exist?("#{s.name}.xcframework") && Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
|
||||
s.source_files = "#{s.name}/**/*.h"
|
||||
s.vendored_frameworks = "#{s.name}.xcframework"
|
||||
else
|
||||
s.source_files = "#{s.name}/**/*.{h,m,swift}"
|
||||
end
|
||||
end
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
import ExpoModulesCore
|
||||
import AirbridgeRN
|
||||
|
||||
public class AirbridgeAppDelegate: ExpoAppDelegateSubscriber {
|
||||
public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
||||
AirbridgeRN.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
|
||||
// RNBranch.initSession(launchOptions: launchOptions, isReferrable: true)
|
||||
return true
|
||||
}
|
||||
|
||||
// public func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
|
||||
// return RNBranch.application(application, open:url, options:options)
|
||||
// }
|
||||
|
||||
// public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
// return RNBranch.continue(userActivity)
|
||||
// }
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
{
|
||||
"name": "@config-plugins/airbridge-react-native-sdk",
|
||||
"version": "0.0.0",
|
||||
"description": "Config plugin for airbridge-react-native-sdk package",
|
||||
"author": "650 Industries, Inc.",
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/expo/config-plugins/tree/main/packages/airbridge-react-native-sdk",
|
||||
"main": "build/withAirbridgeReactNativeSdk.js",
|
||||
"types": "build/withAirbridgeReactNativeSdk.d.ts",
|
||||
"sideEffects": false,
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/expo/config-plugins.git",
|
||||
"directory": "packages/airbridge-react-native-sdk"
|
||||
},
|
||||
"files": [
|
||||
"android",
|
||||
"app.plugin.js",
|
||||
"build",
|
||||
"expo-module.config.json",
|
||||
"ios"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "expo-module build",
|
||||
"clean": "expo-module clean",
|
||||
"lint": "expo-module lint",
|
||||
"test": "expo-module test",
|
||||
"prepare": "expo-module prepare",
|
||||
"prepublishOnly": "expo-module prepublishOnly",
|
||||
"expo-module": "expo-module"
|
||||
},
|
||||
"keywords": [
|
||||
"react",
|
||||
"expo",
|
||||
"config-plugins",
|
||||
"prebuild",
|
||||
"airbridge-react-native-sdk",
|
||||
"expo-42"
|
||||
],
|
||||
"jest": {
|
||||
"preset": "expo-module-scripts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/config-plugins": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"expo-module-scripts": "^2.0.0"
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
import { ConfigPlugin, createRunOncePlugin } from "@expo/config-plugins";
|
||||
|
||||
/**
|
||||
* Apply airbridge-react-native-sdk configuration for Expo SDK 42 projects.
|
||||
*/
|
||||
const withAirbridgeReactNativeSdk: ConfigPlugin<{} | void> = (config, _props = {}) => {
|
||||
// Support passing no props to the plugin.
|
||||
const props = _props || {};
|
||||
|
||||
// Return the modified config.
|
||||
return config;
|
||||
};
|
||||
|
||||
const pkg = {
|
||||
// Prevent this plugin from being run more than once.
|
||||
// This pattern enables users to safely migrate off of this
|
||||
// out-of-tree `@config-plugins/airbridge-react-native-sdk` to a future
|
||||
// upstream plugin in `airbridge-react-native-sdk`
|
||||
name: "airbridge-react-native-sdk",
|
||||
// Indicates that this plugin is dangerously linked to a module,
|
||||
// and might not work with the latest version of that module.
|
||||
version: "UNVERSIONED",
|
||||
};
|
||||
|
||||
export default createRunOncePlugin(withAirbridgeReactNativeSdk, pkg.name, pkg.version);
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"extends": "expo-module-scripts/tsconfig.plugin",
|
||||
"compilerOptions": {
|
||||
"outDir": "./build"
|
||||
},
|
||||
"include": ["./src"],
|
||||
"exclude": ["**/__mocks__/*", "**/__tests__/*"]
|
||||
}
|
||||
@@ -1,3 +1,19 @@
|
||||
## @config-plugins/ffmpeg-kit-react-native [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* add SDK 45 support (#79)
|
||||
|
||||
### Features
|
||||
|
||||
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
|
||||
|
||||
### @config-plugins/ffmpeg-kit-react-native [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
### @config-plugins/ios-stickers [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ios-stickers:** fix app icon generation ([#82](https://github.com/expo/config-plugins/issues/82)) ([190c489](https://github.com/expo/config-plugins/commit/190c489b764f285dbbecfa42fd7ee953fc849dcb))
|
||||
|
||||
## @config-plugins/ios-stickers [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-12)
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ In your app.json `plugins` array:
|
||||
]
|
||||
```
|
||||
|
||||
- name: defaults to the iOS app name
|
||||
- icon: defaults to the iOS app icon
|
||||
- columns: number of stickers to render, defaults to `3` iirc.
|
||||
- stickers: local file paths or remote URLs, or `{ image: "...", name: "...", accessibilityLabel: "..." }`. Order is preserved.
|
||||
- `name`: defaults to the iOS app name
|
||||
- `icon`: defaults to the iOS app icon
|
||||
- `columns`: number of stickers to render, defaults to `3`. Can be one of `2`, `3`, `4`.
|
||||
- `stickers`: local file paths or remote URLs, or `{ image: "...", name: "...", accessibilityLabel: "..." }`. Order is preserved.
|
||||
@@ -0,0 +1,8 @@
|
||||
export const generateImageAsync = jest.fn(async (input: any, { src }) => {
|
||||
const fs = require("fs");
|
||||
return { source: fs.readFileSync(src) };
|
||||
});
|
||||
|
||||
export const compositeImagesAsync = jest.fn(async ({ foreground }) => {
|
||||
return foreground;
|
||||
});
|
||||
@@ -0,0 +1,2 @@
|
||||
import { fs } from 'memfs';
|
||||
module.exports = fs;
|
||||
Generated
Vendored
File renamed without changes.
+9
-8
@@ -59,11 +59,11 @@ const ICON_CONTENTS = [
|
||||
idiom: "ios-marketing",
|
||||
sizes: [
|
||||
{
|
||||
platform: "ios",
|
||||
size: 1024,
|
||||
scales: [1],
|
||||
},
|
||||
{
|
||||
platform: "ios",
|
||||
size: [1024, 768],
|
||||
scales: [1],
|
||||
},
|
||||
@@ -108,15 +108,16 @@ async function generateImessageIconsAsync(projectRoot, icon, iconsPath) {
|
||||
// Save a reference to the generated image so we don't create a duplicate.
|
||||
generatedIcons[filename] = true;
|
||||
}
|
||||
imagesJson.push({
|
||||
idiom: platform.idiom,
|
||||
size: `${width}x${height}`,
|
||||
// @ts-ignore: template types not supported in TS yet
|
||||
scale: `${scale}x`,
|
||||
const imgJson = {
|
||||
filename,
|
||||
});
|
||||
idiom: platform.idiom,
|
||||
scale: `${scale}x`,
|
||||
size: `${width}x${height}`,
|
||||
};
|
||||
// This order closely matches Xcode formatting.
|
||||
imagesJson.push(imgJson);
|
||||
if (rest.platform) {
|
||||
imagesJson[imagesJson.length - 1].platform = rest.platform;
|
||||
imgJson.platform = rest.platform;
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -8,7 +8,7 @@ const config_plugins_1 = require("@expo/config-plugins");
|
||||
const image_utils_1 = require("@expo/image-utils");
|
||||
const fs_1 = __importDefault(require("fs"));
|
||||
const path_1 = __importDefault(require("path"));
|
||||
const withStickerIcon_1 = require("./withStickerIcon");
|
||||
const generateImessageIconsAsync_1 = require("./generateImessageIconsAsync");
|
||||
const withStickerXcodeTarget_1 = require("./withStickerXcodeTarget");
|
||||
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
||||
const IMESSAGE_APP_ICON_PATH = "Stickers.xcassets/iMessage App Icon.stickersiconset";
|
||||
@@ -70,13 +70,13 @@ const withStickerAssets = (config, { stickers, icon, size }) => {
|
||||
const iMessageAppIconsPath = path_1.default.join(stickerRootPath, IMESSAGE_APP_ICON_PATH);
|
||||
// Only generate icons if an icon is defined
|
||||
const imessageIconContents = icon
|
||||
? await withStickerIcon_1.generateImessageIconsAsync(config.modRequest.projectRoot, icon, iMessageAppIconsPath)
|
||||
? await generateImessageIconsAsync_1.generateImessageIconsAsync(config.modRequest.projectRoot, icon, iMessageAppIconsPath)
|
||||
: [];
|
||||
const iMessageAppIconContentsJsonPath = path_1.default.join(iMessageAppIconsPath, "Contents.json");
|
||||
fs_1.default.mkdirSync(iMessageAppIconsPath, {
|
||||
recursive: true,
|
||||
});
|
||||
fs_1.default.writeFileSync(iMessageAppIconContentsJsonPath, JSON.stringify({ info: defaultInfo, images: imessageIconContents }, null, 2));
|
||||
fs_1.default.writeFileSync(iMessageAppIconContentsJsonPath, JSON.stringify({ images: imessageIconContents, info: defaultInfo }, null, 2));
|
||||
const stickerPackContentsPath = path_1.default.join(stickerRootPath, STICKER_PACK_PATH);
|
||||
const stickersContents = {
|
||||
info: defaultInfo,
|
||||
|
||||
@@ -1 +1,12 @@
|
||||
module.exports = require('expo-module-scripts/jest-preset-plugin');
|
||||
const path = require("path");
|
||||
|
||||
const roots = ["__mocks__", "src"];
|
||||
|
||||
module.exports = {
|
||||
...require("expo-module-scripts/jest-preset-plugin"),
|
||||
rootDir: path.resolve(__dirname),
|
||||
displayName: require("./package").name,
|
||||
roots,
|
||||
setupFiles: ["<rootDir>/jest/setup.js"],
|
||||
clearMocks: true,
|
||||
};
|
||||
@@ -0,0 +1,2 @@
|
||||
jest.mock("@expo/image-utils");
|
||||
jest.mock("fs");
|
||||
@@ -1,10 +1,13 @@
|
||||
{
|
||||
"name": "@config-plugins/ios-stickers",
|
||||
"version": "2.0.0",
|
||||
"version": "2.0.1",
|
||||
"description": "Config plugin to auto configure iOS iMessage stickers",
|
||||
"main": "build/withStickerPack.js",
|
||||
"types": "build/withStickerPack.d.ts",
|
||||
"sideEffects": false,
|
||||
"files": [
|
||||
"build"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/expo/config-plugins.git",
|
||||
@@ -30,6 +33,7 @@
|
||||
"xcode": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"expo-module-scripts": "^2.0.0"
|
||||
"expo-module-scripts": "^2.0.0",
|
||||
"memfs": "^2.15.5"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 80 B |
@@ -0,0 +1,111 @@
|
||||
import { generateImageAsync } from "@expo/image-utils";
|
||||
import fs from "fs";
|
||||
import { vol } from "memfs";
|
||||
import path from "path";
|
||||
|
||||
import { generateImessageIconsAsync } from "../generateImessageIconsAsync";
|
||||
|
||||
const fsReal = jest.requireActual("fs") as typeof fs;
|
||||
|
||||
describe(generateImessageIconsAsync, () => {
|
||||
it(`should generate imessage icons`, async () => {
|
||||
vol.fromJSON({}, "/");
|
||||
await fs.promises.writeFile(
|
||||
"/icon.png",
|
||||
await fsReal.promises.readFile(path.join(__dirname, "fixtures/icon.png"))
|
||||
);
|
||||
const contents = await generateImessageIconsAsync(
|
||||
"/",
|
||||
"/icon.png",
|
||||
"/output"
|
||||
);
|
||||
|
||||
expect(generateImageAsync).toHaveBeenCalledTimes(13);
|
||||
|
||||
expect(contents).toEqual([
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "iphone",
|
||||
scale: "2x",
|
||||
size: "29x29",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "iphone",
|
||||
scale: "3x",
|
||||
size: "29x29",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "iphone",
|
||||
scale: "2x",
|
||||
size: "60x45",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "iphone",
|
||||
scale: "3x",
|
||||
size: "60x45",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "ipad",
|
||||
scale: "2x",
|
||||
size: "29x29",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "ipad",
|
||||
scale: "2x",
|
||||
size: "67x50",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "ipad",
|
||||
scale: "2x",
|
||||
size: "74x55",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "universal",
|
||||
platform: "ios",
|
||||
scale: "2x",
|
||||
size: "27x20",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "universal",
|
||||
platform: "ios",
|
||||
scale: "3x",
|
||||
size: "27x20",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "universal",
|
||||
platform: "ios",
|
||||
scale: "2x",
|
||||
size: "32x24",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "universal",
|
||||
platform: "ios",
|
||||
scale: "3x",
|
||||
size: "32x24",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "ios-marketing",
|
||||
scale: "1x",
|
||||
size: "1024x1024",
|
||||
},
|
||||
{
|
||||
filename: "[email protected]",
|
||||
idiom: "ios-marketing",
|
||||
platform: "ios",
|
||||
scale: "1x",
|
||||
size: "1024x768",
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
+9
-9
@@ -86,12 +86,11 @@ const ICON_CONTENTS: {
|
||||
idiom: "ios-marketing",
|
||||
sizes: [
|
||||
{
|
||||
platform: "ios",
|
||||
|
||||
size: 1024,
|
||||
scales: [1],
|
||||
},
|
||||
{
|
||||
platform: "ios",
|
||||
size: [1024, 768],
|
||||
scales: [1],
|
||||
},
|
||||
@@ -148,15 +147,16 @@ export async function generateImessageIconsAsync(
|
||||
// Save a reference to the generated image so we don't create a duplicate.
|
||||
generatedIcons[filename] = true;
|
||||
}
|
||||
imagesJson.push({
|
||||
idiom: platform.idiom as ContentsJsonImageIdiom,
|
||||
size: `${width}x${height}`,
|
||||
// @ts-ignore: template types not supported in TS yet
|
||||
scale: `${scale}x`,
|
||||
const imgJson: ContentsJsonImage = {
|
||||
filename,
|
||||
});
|
||||
idiom: platform.idiom as ContentsJsonImageIdiom,
|
||||
scale: `${scale}x`,
|
||||
size: `${width}x${height}`,
|
||||
};
|
||||
// This order closely matches Xcode formatting.
|
||||
imagesJson.push(imgJson);
|
||||
if (rest.platform) {
|
||||
imagesJson[imagesJson.length - 1].platform = rest.platform;
|
||||
imgJson.platform = rest.platform;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import { generateImageAsync } from "@expo/image-utils";
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
|
||||
import { generateImessageIconsAsync } from "./withStickerIcon";
|
||||
import { generateImessageIconsAsync } from "./generateImessageIconsAsync";
|
||||
import { getProjectStickersName } from "./withStickerXcodeTarget";
|
||||
|
||||
const STICKERS_ROOT_PATH = "Stickers.xcassets";
|
||||
@@ -136,7 +136,7 @@ export const withStickerAssets: ConfigPlugin<{
|
||||
fs.writeFileSync(
|
||||
iMessageAppIconContentsJsonPath,
|
||||
JSON.stringify(
|
||||
{ info: defaultInfo, images: imessageIconContents },
|
||||
{ images: imessageIconContents, info: defaultInfo },
|
||||
null,
|
||||
2
|
||||
)
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
## @config-plugins/react-native-ble-plx [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-27)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* add SDK 45 support (#79)
|
||||
|
||||
### Features
|
||||
|
||||
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
|
||||
|
||||
### @config-plugins/react-native-ble-plx [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-09)
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
## @config-plugins/react-native-google-cast [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-30)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* add SDK 45 support (#79)
|
||||
|
||||
### Features
|
||||
|
||||
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
|
||||
|
||||
### @config-plugins/react-native-google-cast [1.0.3](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-23)
|
||||
|
||||
|
||||
|
||||
@@ -1402,7 +1402,7 @@
|
||||
node-forge "^1.2.1"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
"@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/config-plugins@^4.0.14", "@expo/config-plugins@^4.1.0", "@expo/config-plugins@~4.1.4":
|
||||
"@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/[email protected]", "@expo/config-plugins@^4.0.14", "@expo/config-plugins@~4.1.4":
|
||||
version "4.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.4.tgz#08e1a6314dc0f96cd165a748b5997b5ec75a84d0"
|
||||
integrity sha512-fkOjXnSieQfVSWVLKhst0DnCAyeHksvWky1CldFCQllhDB1HHBiP09Z8pamVB783n3qr/1HNZiSp6k2iUcaSoA==
|
||||
@@ -4976,15 +4976,6 @@ airbnb-prop-types@^2.16.0:
|
||||
prop-types-exact "^1.2.0"
|
||||
react-is "^16.13.1"
|
||||
|
||||
airbridge-react-native-sdk@^1.4.5:
|
||||
version "1.4.5"
|
||||
resolved "https://registry.yarnpkg.com/airbridge-react-native-sdk/-/airbridge-react-native-sdk-1.4.5.tgz#281d370b4ff3f4491b80d8a0d6d771de5024c4b9"
|
||||
integrity sha512-gdpm+p5m6pk5CPQ/hrW+ll5qs3xFunwMDZR3A4v8oRpGSoqDQrelBflWwf3B/ay9dSFwBARfdOsj4H+Mho/LpQ==
|
||||
dependencies:
|
||||
lodash.isfunction "^3.0.9"
|
||||
lodash.isplainobject "^4.0.6"
|
||||
lodash.isstring "^4.0.1"
|
||||
|
||||
ajv-errors@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
|
||||
@@ -9069,6 +9060,11 @@ fast-diff@^1.1.2:
|
||||
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
|
||||
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
|
||||
|
||||
[email protected]:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/fast-extend/-/fast-extend-0.0.2.tgz#f5ec42cf40b9460f521a6387dfb52deeed671dbd"
|
||||
integrity sha1-9exCz0C5Rg9SGmOH37Ut7u1nHb0=
|
||||
|
||||
fast-glob@^2.2.6:
|
||||
version "2.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
|
||||
@@ -9541,6 +9537,11 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0:
|
||||
dependencies:
|
||||
minipass "^3.0.0"
|
||||
|
||||
fs-monkey@^0.3.3:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-0.3.3.tgz#7960bb2b1fa2653731b9d0e2e84812a7e8b3664a"
|
||||
integrity sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw==
|
||||
|
||||
fs-readdir-recursive@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
|
||||
@@ -13143,11 +13144,6 @@ lodash.isequal@^4.5.0:
|
||||
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
|
||||
integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
|
||||
|
||||
lodash.isfunction@^3.0.9:
|
||||
version "3.0.9"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051"
|
||||
integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==
|
||||
|
||||
lodash.ismatch@^4.4.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
|
||||
@@ -13580,6 +13576,14 @@ [email protected]:
|
||||
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
||||
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
|
||||
|
||||
memfs@^2.15.5:
|
||||
version "2.17.1"
|
||||
resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.17.1.tgz#bfcc11b6308214b4fb33eaca101132722d22e103"
|
||||
integrity sha512-4kAcqibPAd8DN8/UIW/6OwvbhNq6MqwsQ0pxjo+2ZmxPlQAbn9TAepnRpdeYfw4Qq0Y+QqwE6wngLUowo2fcjg==
|
||||
dependencies:
|
||||
fast-extend "0.0.2"
|
||||
fs-monkey "^0.3.3"
|
||||
|
||||
memory-cache@~0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a"
|
||||
|
||||
Reference in new issue
Block a user