typed-config-plugins 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Lukas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # typed-config-plugins
2
+
3
+ **Type Safety for Your Expo Config Plugins.**
4
+
5
+ Expo config plugins are incredibly powerful, but their configuration lacks the safety net of type checking. `typed-config-plugins` bridges this gap, bringing the full power of TypeScript to your Expo project's configuration.
6
+
7
+ ## ✨ Features
8
+
9
+ - **Enhanced Developer Experience:** Get autocomplete and type validation directly in your `app.config.ts` files, making plugin configuration less error-prone and more efficient.
10
+ - **Pre-built Types:** Includes ready-to-use TypeScript definitions for many popular Expo config plugins, generated by analyzing their source code.
11
+ - **Extensible:** Easily add custom types for your own or third-party plugins using TypeScript module augmentation.
12
+ - **Seamless Integration:** Designed to work smoothly with your existing `app.config.ts` setup. **Note: JSON config files are not supported.**
13
+
14
+ ## 📦 Installation
15
+
16
+ ```bash
17
+ npm i typed-config-plugins
18
+ ```
19
+
20
+ ## 🚀 Usage
21
+
22
+ Update your `app.config.ts` file to use the `plugin` helper from `typed-config-plugins`.
23
+
24
+ ```typescript
25
+ import { type ConfigContext, type ExpoConfig } from "expo/config";
26
+ import { plugin } from "typed-config-plugins";
27
+
28
+ export default ({ config }: ConfigContext): ExpoConfig => ({
29
+ ...config,
30
+ // ... other config
31
+ plugins: [
32
+ plugin("expo-build-properties", { android: { minSdkVersion: 26 } }),
33
+ plugin("demo-package", { bar: "example", baz: 42 }),
34
+ // This will generate the traditional ["demo-package", { bar: "example", baz: 42 }]
35
+ // array at runtime while providing type safety during development.
36
+
37
+ /*
38
+ The `plugin` function replaces the traditional array syntax, providing
39
+ type checking and autocompletion for your plugin options:
40
+
41
+ // Old syntax (no type checking):
42
+ ["expo-build-properties", { android: { minSdkVersion: 26 } }],
43
+ ["demo-package", { bar: "example", baz: 42 }],
44
+
45
+ You can still use the old syntax for plugins without defined types or
46
+ for local file-based plugins:
47
+ "./path/to/my-local-plugin.js",
48
+ */
49
+ ],
50
+ });
51
+ ```
52
+
53
+ ## 🤝 Adding Custom Plugin Types
54
+
55
+ To extend `typed-config-plugins` with types for your own plugins or plugins not yet covered, you can use TypeScript's module augmentation feature.
56
+
57
+ Create a new declaration file (e.g., `config-plugins.d.ts`) in your project's root or `src` directory with the following content:
58
+
59
+ ```typescript
60
+ // config-plugins.d.ts
61
+ import "typed-config-plugins"; // Import the original type declarations
62
+
63
+ declare module "typed-config-plugins" {
64
+ // Extend the `ThirdPartyPlugins` interface with your custom plugin types
65
+ interface ThirdPartyPlugins {
66
+ // Define options for "demo-package" (as used in the example)
67
+ "demo-package": { bar: string, baz?: number };
68
+ // more packages here...
69
+ }
70
+ }
71
+ ```
72
+
73
+ Now, when you use `plugin("my-custom-plugin", { /* ... */ })` in your `app.config.ts`, TypeScript will provide autocompletion and validate the options against the types you've defined.
@@ -0,0 +1,314 @@
1
+ import appandflowExpoCameraCharacteristics from '@appandflow/expo-camera-characteristics/plugin/build/index';
2
+ import baconsAppleColors from '@bacons/apple-colors/plugin/build/withAndroidColors';
3
+ import bamTechReactNativeBatch from '@bam.tech/react-native-batch/plugin/build/withReactNativeBatch';
4
+ import batchComReactNativePlugin from '@batch.com/react-native-plugin/plugin/build/withReactNativeBatch';
5
+ import beyondidentityBiSdkReactNative from '@beyondidentity/bi-sdk-react-native/app.plugin';
6
+ import bittingzExpoWidgets from '@bittingz/expo-widgets/plugin/build/index';
7
+ import bravemobileReactNativeCodePush from '@bravemobile/react-native-code-push/expo/plugin/withCodePush';
8
+ import brazeExpoPlugin from '@braze/expo-plugin/build/withBraze';
9
+ import configPluginsReactNativeBlobUtil from '@config-plugins/react-native-blob-util/build/withReactNativeBlobUtil';
10
+ import configPluginsReactNativePdf from '@config-plugins/react-native-pdf/build/withPdf';
11
+ import corasanImageCompressor from '@corasan/image-compressor/app.plugin';
12
+ import fishjamCloudReactNativeClient from '@fishjam-cloud/react-native-client/plugin/build/withFishjam';
13
+ import giphyReactNativeSdk from '@giphy/react-native-sdk/app.plugin';
14
+ import hotUpdaterReactNative from '@hot-updater/react-native/plugin/build/withHotUpdater';
15
+ import intercomIntercomReactNative from '@intercom/intercom-react-native/app.plugin';
16
+ import iterableExpoPlugin from '@iterable/expo-plugin/plugin/build/withIterable';
17
+ import kingstinctReactNativeActivityKit from '@kingstinct/react-native-activity-kit/app.plugin';
18
+ import kingstinctReactNativeHealthkit from '@kingstinct/react-native-healthkit/app.plugin';
19
+ import maplibreMaplibreReactNative from '@maplibre/maplibre-react-native/lib/typescript/plugin/withMapLibre';
20
+ import prismaReactNative from '@prisma/react-native/plugin/build/index';
21
+ import reactNativeCommunityDatetimepicker from '@react-native-community/datetimepicker/plugin/build/withDateTimePickerStyles';
22
+ import reactNativeFirebaseApp from '@react-native-firebase/app/plugin/build/index';
23
+ import reactNativeFirebaseAppCheck from '@react-native-firebase/app-check/plugin/build/index';
24
+ import reactNativeFirebaseAppDistribution from '@react-native-firebase/app-distribution/plugin/build/index';
25
+ import reactNativeFirebaseAuth from '@react-native-firebase/auth/plugin/build/index';
26
+ import reactNativeFirebaseCrashlytics from '@react-native-firebase/crashlytics/plugin/build/index';
27
+ import reactNativeFirebaseMessaging from '@react-native-firebase/messaging/plugin/build/index';
28
+ import reactNativeFirebasePerf from '@react-native-firebase/perf/plugin/build/index';
29
+ import reactNativeGoogleSigninGoogleSignin from '@react-native-google-signin/google-signin/plugin/build/withGoogleSignIn';
30
+ import reactNativeSeoulNaverLogin from '@react-native-seoul/naver-login/plugin/build/index';
31
+ import reactNativeVoiceVoice from '@react-native-voice/voice/plugin/build/withVoice';
32
+ import reactvisionReactViro from '@reactvision/react-viro/dist/plugins/withViro';
33
+ import rnmapboxMaps from '@rnmapbox/maps/plugin/build/withMapbox';
34
+ import sentryReactNative from '@sentry/react-native/plugin/build/index';
35
+ import stripeStripeReactNative from '@stripe/stripe-react-native/lib/typescript/plugin/withStripe';
36
+ import vonovakReactNativeThemeControl from '@vonovak/react-native-theme-control/plugin/build/withThemeControl';
37
+ import wwdrewExpoAndroidAccountManager from '@wwdrew/expo-android-account-manager/plugin/build/index';
38
+ import wwdrewExpoSpotifySdk from '@wwdrew/expo-spotify-sdk/plugin/build/index';
39
+ import xmartlabsReactNativeLine from '@xmartlabs/react-native-line/plugin/withLineSDK';
40
+ import expoAlternateAppIcons from 'expo-alternate-app-icons/plugin/build/index';
41
+ import expoAppleAuthentication from 'expo-apple-authentication/plugin/build/withAppleAuth';
42
+ import expoAsset from 'expo-asset/plugin/build/withAssets';
43
+ import expoAudio from 'expo-audio/plugin/build/withAudio';
44
+ import expoAv from 'expo-av/plugin/build/withAV';
45
+ import expoBackgroundFetch from 'expo-background-fetch/plugin/build/withBackgroundFetch';
46
+ import expoBackgroundTask from 'expo-background-task/plugin/build/withBackgroundTask';
47
+ import expoBrightness from 'expo-brightness/plugin/build/withBrightness';
48
+ import expoBuildProperties from 'expo-build-properties/build/withBuildProperties';
49
+ import expoCalendar from 'expo-calendar/plugin/build/withCalendar';
50
+ import expoCamera from 'expo-camera/plugin/build/withCamera';
51
+ import expoCellular from 'expo-cellular/plugin/build/withCellular';
52
+ import expoContacts from 'expo-contacts/plugin/build/withContacts';
53
+ import expoCustomAssets from 'expo-custom-assets/build/index';
54
+ import expoDevClient from 'expo-dev-client/plugin/build/withDevClient';
55
+ import expoDocumentPicker from 'expo-document-picker/plugin/build/withDocumentPicker';
56
+ import expoDynamicAppIcon from 'expo-dynamic-app-icon/plugin/build/withDynamicIcon';
57
+ import expoFileSystem from 'expo-file-system/plugin/build/withFileSystem';
58
+ import expoFont from 'expo-font/plugin/build/withFonts';
59
+ import expoHealthConnect from 'expo-health-connect/build/withHealthConnect';
60
+ import expoIap from 'expo-iap/plugin/build/withIAP';
61
+ import expoImagePicker from 'expo-image-picker/plugin/build/withImagePicker';
62
+ import expoLibvlcPlayer from 'expo-libvlc-player/plugin/build/withExpoLibVlcPlayer';
63
+ import expoLiveActivity from 'expo-live-activity/plugin/build/index';
64
+ import expoLocalAuthentication from 'expo-local-authentication/plugin/build/withLocalAuthentication';
65
+ import expoLocalization from 'expo-localization/plugin/build/withExpoLocalization';
66
+ import expoLocation from 'expo-location/plugin/build/withLocation';
67
+ import expoMailComposer from 'expo-mail-composer/plugin/build/withMailComposer';
68
+ import expoMaps from 'expo-maps/plugin/build/withMapsLocation';
69
+ import expoMediaLibrary from 'expo-media-library/plugin/build/withMediaLibrary';
70
+ import expoMusicPicker from 'expo-music-picker/app.plugin';
71
+ import expoNativeAlipay from 'expo-native-alipay/app.plugin';
72
+ import expoNavigationBar from 'expo-navigation-bar/plugin/build/withNavigationBar';
73
+ import expoNotifications from 'expo-notifications/plugin/build/withNotifications';
74
+ import expoPip from 'expo-pip/plugin/build/index';
75
+ import expoQuickActions from 'expo-quick-actions/plugin/build/index';
76
+ import expoRoomplan from 'expo-roomplan/app.plugin';
77
+ import expoRouter from 'expo-router/plugin/build/index';
78
+ import expoScreenOrientation from 'expo-screen-orientation/plugin/build/withScreenOrientation';
79
+ import expoSecureStore from 'expo-secure-store/plugin/build/withSecureStore';
80
+ import expoSensors from 'expo-sensors/plugin/build/withSensors';
81
+ import expoShareExtension from 'expo-share-extension/plugin/build/index';
82
+ import expoShareIntent from 'expo-share-intent/plugin/build/index';
83
+ import expoShazamkit from 'expo-shazamkit/plugin/build/withShazamKit';
84
+ import expoSpeechRecognition from 'expo-speech-recognition/app.plugin';
85
+ import expoSplashScreen from 'expo-splash-screen/plugin/build/withSplashScreen';
86
+ import expoSqlite from 'expo-sqlite/plugin/build/withSQLite';
87
+ import expoSuperwall from 'expo-superwall/plugin/build/index';
88
+ import expoSystemUi from 'expo-system-ui/plugin/build/withSystemUI';
89
+ import expoTaskManager from 'expo-task-manager/plugin/build/withTaskManager';
90
+ import expoTrackingTransparency from 'expo-tracking-transparency/plugin/build/withTrackingTransparency';
91
+ import expoUpdates from 'expo-updates/plugin/build/withUpdates';
92
+ import expoVideo from 'expo-video/plugin/build/withExpoVideo';
93
+ import expoWebBrowser from 'expo-web-browser/plugin/build/withWebBrowser';
94
+ import freeraspReactNative from 'freerasp-react-native/plugin/build/index';
95
+ import instabugReactnative from 'instabug-reactnative/plugin/build/index';
96
+ import newrelicReactNativeAgent from 'newrelic-react-native-agent/plugin/build/index';
97
+ import pushyExpoPlugin from 'pushy-expo-plugin/app.plugin';
98
+ import reactNativeAddCalendarEvent from 'react-native-add-calendar-event/plugin/build/withAddCalendarEvent';
99
+ import reactNativeAdmobNativeAds from 'react-native-admob-native-ads/plugin/build/withAdmobNativeAds';
100
+ import reactNativeAppClip from 'react-native-app-clip/plugin/build/index';
101
+ import reactNativeAppsflyer from 'react-native-appsflyer/expo/withAppsFlyer';
102
+ import reactNativeAudioApi from 'react-native-audio-api/lib/typescript/plugin/withAudioAPI';
103
+ import reactNativeAuth0 from 'react-native-auth0/lib/typescript/plugin/withAuth0';
104
+ import reactNativeAutoSkeleton from 'react-native-auto-skeleton/src/expo-plugins/withAutoSkeleton';
105
+ import reactNativeBackgroundFetch from 'react-native-background-fetch/expo/plugin/build/index';
106
+ import reactNativeBackgroundGeolocation from 'react-native-background-geolocation/expo/plugin/build/index';
107
+ import reactNativeBleManager from 'react-native-ble-manager/plugin/build/withBLE';
108
+ import reactNativeBlePlx from 'react-native-ble-plx/plugin/build/withBLE';
109
+ import reactNativeBootsplash from 'react-native-bootsplash/app.plugin';
110
+ import reactNativeBottomTabs from 'react-native-bottom-tabs/lib/typescript/expo';
111
+ import reactNativeCloudStore from 'react-native-cloud-store/plugins/withCloud';
112
+ import reactNativeCompressor from 'react-native-compressor/lib/typescript/expo-plugin/compressor';
113
+ import reactNativeCredentialsManager from 'react-native-credentials-manager/app.plugin';
114
+ import reactNativeDocumentScannerPlugin from 'react-native-document-scanner-plugin/expo-plugin/build/withDocumentScanner';
115
+ import reactNativeEdgeToEdge from 'react-native-edge-to-edge/dist/typescript/expo';
116
+ import reactNativeEmailLink from 'react-native-email-link/plugin/withEmailLink';
117
+ import reactNativeFastTflite from 'react-native-fast-tflite/lib/typescript/expo-plugin/withFastTFLite';
118
+ import reactNativeFbads from 'react-native-fbads/plugin/build/withReactNativeFbads';
119
+ import reactNativeFbsdkNext from 'react-native-fbsdk-next/plugin/build/withFacebook';
120
+ import reactNativeFullScreenNotificationIncomingCall from 'react-native-full-screen-notification-incoming-call/lib/commonjs/expo';
121
+ import reactNativeGoogleCast from 'react-native-google-cast/lib/typescript/plugin/withGoogleCast';
122
+ import reactNativeGoogleMobileAds from 'react-native-google-mobile-ads/plugin/build/index';
123
+ import reactNativeHealth from 'react-native-health/app.plugin';
124
+ import reactNativeHealthConnect from 'react-native-health-connect/app.plugin';
125
+ import reactNativeImageMarker from 'react-native-image-marker/lib/typescript/expo-plugin/withImageMarker';
126
+ import reactNativeKeys from 'react-native-keys/plugin/build/index';
127
+ import reactNativeLegal from 'react-native-legal/plugin/build/index';
128
+ import reactNativeLibsodium from 'react-native-libsodium/app.plugin';
129
+ import reactNativeLocalizationSettings from 'react-native-localization-settings/plugin/build/index';
130
+ import reactNativeLocalizeDate from 'react-native-localize-date/plugin/build/withLocalizations';
131
+ import reactNativeMapLink from 'react-native-map-link/app.plugin';
132
+ import reactNativeMaps from 'react-native-maps/plugin/build/index';
133
+ import reactNativeMsal from 'react-native-msal/plugin/build/withReactNativeMSAL';
134
+ import reactNativeNavigationMode from 'react-native-navigation-mode/app.plugin';
135
+ import reactNativeNfcManager from 'react-native-nfc-manager/app.plugin';
136
+ import reactNativeNitroScreenRecorder from 'react-native-nitro-screen-recorder/plugin/build/index';
137
+ import reactNativeOrientationDirector from 'react-native-orientation-director/plugin/build/index';
138
+ import reactNativeOtaHotUpdate from 'react-native-ota-hot-update/plugin/build/index';
139
+ import reactNativePermissions from 'react-native-permissions/dist/typescript/expo';
140
+ import reactNativeRateApp from 'react-native-rate-app/lib/typescript/plugin/withReactNativeRateApp';
141
+ import reactNativeRenderLynx from 'react-native-render-lynx/plugin/withRenderLynx';
142
+ import reactNativeScreenshotAware from 'react-native-screenshot-aware/lib/typescript/plugin/withReactNativeScreenshotAware';
143
+ import reactNativeShare from 'react-native-share/plugin/build/index';
144
+ import reactNativeTheoplayer from 'react-native-theoplayer/lib/typescript/plugins/expo/withTHEOplayer';
145
+ import reactNativeTiktok from 'react-native-tiktok/plugin/build/withTiktok';
146
+ import reactNativeTwilioVideoWebrtc from 'react-native-twilio-video-webrtc/plugin/build/index';
147
+ import reactNativeV8 from 'react-native-v8/plugin/build/withV8ExpoAdapter';
148
+ import reactNativeVideo from 'react-native-video/lib/expo-plugins/withRNVideo';
149
+ import reactNativeVisionCamera from 'react-native-vision-camera/lib/typescript/expo-plugin/withVisionCamera';
150
+ import reactNativeVlcMediaPlayer from 'react-native-vlc-media-player/expo/withVlcMediaPlayer';
151
+ import reactNativeWifiReborn from 'react-native-wifi-reborn/plugin/dist/withWifi';
152
+ import { ConfigPlugin } from '@expo/config-plugins';
153
+
154
+ type ConfigPluginOptions<T> = T extends ConfigPlugin<infer TOptions> ? Exclude<TOptions, void> : never;
155
+
156
+ interface ThirdPartyPlugins {
157
+ "@appandflow/expo-camera-characteristics": ConfigPluginOptions<typeof appandflowExpoCameraCharacteristics>;
158
+ "@bacons/apple-colors": ConfigPluginOptions<typeof baconsAppleColors>;
159
+ "@bam.tech/react-native-batch": ConfigPluginOptions<typeof bamTechReactNativeBatch>;
160
+ "@batch.com/react-native-plugin": ConfigPluginOptions<typeof batchComReactNativePlugin>;
161
+ "@beyondidentity/bi-sdk-react-native": ConfigPluginOptions<typeof beyondidentityBiSdkReactNative>;
162
+ "@bittingz/expo-widgets": ConfigPluginOptions<typeof bittingzExpoWidgets>;
163
+ "@bravemobile/react-native-code-push": ConfigPluginOptions<typeof bravemobileReactNativeCodePush>;
164
+ "@braze/expo-plugin": ConfigPluginOptions<typeof brazeExpoPlugin>;
165
+ "@config-plugins/react-native-blob-util": ConfigPluginOptions<typeof configPluginsReactNativeBlobUtil>;
166
+ "@config-plugins/react-native-pdf": ConfigPluginOptions<typeof configPluginsReactNativePdf>;
167
+ "@corasan/image-compressor": ConfigPluginOptions<typeof corasanImageCompressor>;
168
+ "@fishjam-cloud/react-native-client": ConfigPluginOptions<typeof fishjamCloudReactNativeClient>;
169
+ "@giphy/react-native-sdk": ConfigPluginOptions<typeof giphyReactNativeSdk>;
170
+ "@hot-updater/react-native": ConfigPluginOptions<typeof hotUpdaterReactNative>;
171
+ "@intercom/intercom-react-native": ConfigPluginOptions<typeof intercomIntercomReactNative>;
172
+ "@iterable/expo-plugin": ConfigPluginOptions<typeof iterableExpoPlugin>;
173
+ "@kingstinct/react-native-activity-kit": ConfigPluginOptions<typeof kingstinctReactNativeActivityKit>;
174
+ "@kingstinct/react-native-healthkit": ConfigPluginOptions<typeof kingstinctReactNativeHealthkit>;
175
+ "@maplibre/maplibre-react-native": ConfigPluginOptions<typeof maplibreMaplibreReactNative>;
176
+ "@prisma/react-native": ConfigPluginOptions<typeof prismaReactNative>;
177
+ "@react-native-community/datetimepicker": ConfigPluginOptions<typeof reactNativeCommunityDatetimepicker>;
178
+ "@react-native-firebase/app": ConfigPluginOptions<typeof reactNativeFirebaseApp>;
179
+ "@react-native-firebase/app-check": ConfigPluginOptions<typeof reactNativeFirebaseAppCheck>;
180
+ "@react-native-firebase/app-distribution": ConfigPluginOptions<typeof reactNativeFirebaseAppDistribution>;
181
+ "@react-native-firebase/auth": ConfigPluginOptions<typeof reactNativeFirebaseAuth>;
182
+ "@react-native-firebase/crashlytics": ConfigPluginOptions<typeof reactNativeFirebaseCrashlytics>;
183
+ "@react-native-firebase/messaging": ConfigPluginOptions<typeof reactNativeFirebaseMessaging>;
184
+ "@react-native-firebase/perf": ConfigPluginOptions<typeof reactNativeFirebasePerf>;
185
+ "@react-native-google-signin/google-signin": ConfigPluginOptions<typeof reactNativeGoogleSigninGoogleSignin>;
186
+ "@react-native-seoul/naver-login": ConfigPluginOptions<typeof reactNativeSeoulNaverLogin>;
187
+ "@react-native-voice/voice": ConfigPluginOptions<typeof reactNativeVoiceVoice>;
188
+ "@reactvision/react-viro": ConfigPluginOptions<typeof reactvisionReactViro>;
189
+ "@rnmapbox/maps": ConfigPluginOptions<typeof rnmapboxMaps>;
190
+ "@sentry/react-native": ConfigPluginOptions<typeof sentryReactNative>;
191
+ "@sentry/react-native/expo": ConfigPluginOptions<typeof sentryReactNative>;
192
+ "@stripe/stripe-react-native": ConfigPluginOptions<typeof stripeStripeReactNative>;
193
+ "@vonovak/react-native-theme-control": ConfigPluginOptions<typeof vonovakReactNativeThemeControl>;
194
+ "@wwdrew/expo-android-account-manager": ConfigPluginOptions<typeof wwdrewExpoAndroidAccountManager>;
195
+ "@wwdrew/expo-spotify-sdk": ConfigPluginOptions<typeof wwdrewExpoSpotifySdk>;
196
+ "@xmartlabs/react-native-line": ConfigPluginOptions<typeof xmartlabsReactNativeLine>;
197
+ "expo-alternate-app-icons": ConfigPluginOptions<typeof expoAlternateAppIcons>;
198
+ "expo-apple-authentication": ConfigPluginOptions<typeof expoAppleAuthentication>;
199
+ "expo-asset": ConfigPluginOptions<typeof expoAsset>;
200
+ "expo-audio": ConfigPluginOptions<typeof expoAudio>;
201
+ "expo-av": ConfigPluginOptions<typeof expoAv>;
202
+ "expo-background-fetch": ConfigPluginOptions<typeof expoBackgroundFetch>;
203
+ "expo-background-task": ConfigPluginOptions<typeof expoBackgroundTask>;
204
+ "expo-brightness": ConfigPluginOptions<typeof expoBrightness>;
205
+ "expo-build-properties": ConfigPluginOptions<typeof expoBuildProperties>;
206
+ "expo-calendar": ConfigPluginOptions<typeof expoCalendar>;
207
+ "expo-camera": ConfigPluginOptions<typeof expoCamera>;
208
+ "expo-cellular": ConfigPluginOptions<typeof expoCellular>;
209
+ "expo-contacts": ConfigPluginOptions<typeof expoContacts>;
210
+ "expo-custom-assets": ConfigPluginOptions<typeof expoCustomAssets>;
211
+ "expo-dev-client": ConfigPluginOptions<typeof expoDevClient>;
212
+ "expo-document-picker": ConfigPluginOptions<typeof expoDocumentPicker>;
213
+ "expo-dynamic-app-icon": ConfigPluginOptions<typeof expoDynamicAppIcon>;
214
+ "expo-file-system": ConfigPluginOptions<typeof expoFileSystem>;
215
+ "expo-font": ConfigPluginOptions<typeof expoFont>;
216
+ "expo-health-connect": ConfigPluginOptions<typeof expoHealthConnect>;
217
+ "expo-iap": ConfigPluginOptions<typeof expoIap>;
218
+ "expo-image-picker": ConfigPluginOptions<typeof expoImagePicker>;
219
+ "expo-libvlc-player": ConfigPluginOptions<typeof expoLibvlcPlayer>;
220
+ "expo-live-activity": ConfigPluginOptions<typeof expoLiveActivity>;
221
+ "expo-local-authentication": ConfigPluginOptions<typeof expoLocalAuthentication>;
222
+ "expo-localization": ConfigPluginOptions<typeof expoLocalization>;
223
+ "expo-location": ConfigPluginOptions<typeof expoLocation>;
224
+ "expo-mail-composer": ConfigPluginOptions<typeof expoMailComposer>;
225
+ "expo-maps": ConfigPluginOptions<typeof expoMaps>;
226
+ "expo-media-library": ConfigPluginOptions<typeof expoMediaLibrary>;
227
+ "expo-music-picker": ConfigPluginOptions<typeof expoMusicPicker>;
228
+ "expo-native-alipay": ConfigPluginOptions<typeof expoNativeAlipay>;
229
+ "expo-navigation-bar": ConfigPluginOptions<typeof expoNavigationBar>;
230
+ "expo-notifications": ConfigPluginOptions<typeof expoNotifications>;
231
+ "expo-pip": ConfigPluginOptions<typeof expoPip>;
232
+ "expo-quick-actions": ConfigPluginOptions<typeof expoQuickActions>;
233
+ "expo-roomplan": ConfigPluginOptions<typeof expoRoomplan>;
234
+ "expo-router": ConfigPluginOptions<typeof expoRouter>;
235
+ "expo-screen-orientation": ConfigPluginOptions<typeof expoScreenOrientation>;
236
+ "expo-secure-store": ConfigPluginOptions<typeof expoSecureStore>;
237
+ "expo-sensors": ConfigPluginOptions<typeof expoSensors>;
238
+ "expo-share-extension": ConfigPluginOptions<typeof expoShareExtension>;
239
+ "expo-share-intent": ConfigPluginOptions<typeof expoShareIntent>;
240
+ "expo-shazamkit": ConfigPluginOptions<typeof expoShazamkit>;
241
+ "expo-speech-recognition": ConfigPluginOptions<typeof expoSpeechRecognition>;
242
+ "expo-splash-screen": ConfigPluginOptions<typeof expoSplashScreen>;
243
+ "expo-sqlite": ConfigPluginOptions<typeof expoSqlite>;
244
+ "expo-superwall": ConfigPluginOptions<typeof expoSuperwall>;
245
+ "expo-system-ui": ConfigPluginOptions<typeof expoSystemUi>;
246
+ "expo-task-manager": ConfigPluginOptions<typeof expoTaskManager>;
247
+ "expo-tracking-transparency": ConfigPluginOptions<typeof expoTrackingTransparency>;
248
+ "expo-updates": ConfigPluginOptions<typeof expoUpdates>;
249
+ "expo-video": ConfigPluginOptions<typeof expoVideo>;
250
+ "expo-web-browser": ConfigPluginOptions<typeof expoWebBrowser>;
251
+ "freerasp-react-native": ConfigPluginOptions<typeof freeraspReactNative>;
252
+ "instabug-reactnative": ConfigPluginOptions<typeof instabugReactnative>;
253
+ "newrelic-react-native-agent": ConfigPluginOptions<typeof newrelicReactNativeAgent>;
254
+ "pushy-expo-plugin": ConfigPluginOptions<typeof pushyExpoPlugin>;
255
+ "react-native-add-calendar-event": ConfigPluginOptions<typeof reactNativeAddCalendarEvent>;
256
+ "react-native-admob-native-ads": ConfigPluginOptions<typeof reactNativeAdmobNativeAds>;
257
+ "react-native-app-clip": ConfigPluginOptions<typeof reactNativeAppClip>;
258
+ "react-native-appsflyer": ConfigPluginOptions<typeof reactNativeAppsflyer>;
259
+ "react-native-audio-api": ConfigPluginOptions<typeof reactNativeAudioApi>;
260
+ "react-native-auth0": ConfigPluginOptions<typeof reactNativeAuth0>;
261
+ "react-native-auto-skeleton": ConfigPluginOptions<typeof reactNativeAutoSkeleton>;
262
+ "react-native-background-fetch": ConfigPluginOptions<typeof reactNativeBackgroundFetch>;
263
+ "react-native-background-geolocation": ConfigPluginOptions<typeof reactNativeBackgroundGeolocation>;
264
+ "react-native-ble-manager": ConfigPluginOptions<typeof reactNativeBleManager>;
265
+ "react-native-ble-plx": ConfigPluginOptions<typeof reactNativeBlePlx>;
266
+ "react-native-bootsplash": ConfigPluginOptions<typeof reactNativeBootsplash>;
267
+ "react-native-bottom-tabs": ConfigPluginOptions<typeof reactNativeBottomTabs>;
268
+ "react-native-cloud-store": ConfigPluginOptions<typeof reactNativeCloudStore>;
269
+ "react-native-compressor": ConfigPluginOptions<typeof reactNativeCompressor>;
270
+ "react-native-credentials-manager": ConfigPluginOptions<typeof reactNativeCredentialsManager>;
271
+ "react-native-document-scanner-plugin": ConfigPluginOptions<typeof reactNativeDocumentScannerPlugin>;
272
+ "react-native-edge-to-edge": ConfigPluginOptions<typeof reactNativeEdgeToEdge>;
273
+ "react-native-email-link": ConfigPluginOptions<typeof reactNativeEmailLink>;
274
+ "react-native-fast-tflite": ConfigPluginOptions<typeof reactNativeFastTflite>;
275
+ "react-native-fbads": ConfigPluginOptions<typeof reactNativeFbads>;
276
+ "react-native-fbsdk-next": ConfigPluginOptions<typeof reactNativeFbsdkNext>;
277
+ "react-native-full-screen-notification-incoming-call": ConfigPluginOptions<typeof reactNativeFullScreenNotificationIncomingCall>;
278
+ "react-native-google-cast": ConfigPluginOptions<typeof reactNativeGoogleCast>;
279
+ "react-native-google-mobile-ads": ConfigPluginOptions<typeof reactNativeGoogleMobileAds>;
280
+ "react-native-health": ConfigPluginOptions<typeof reactNativeHealth>;
281
+ "react-native-health-connect": ConfigPluginOptions<typeof reactNativeHealthConnect>;
282
+ "react-native-image-marker": ConfigPluginOptions<typeof reactNativeImageMarker>;
283
+ "react-native-keys": ConfigPluginOptions<typeof reactNativeKeys>;
284
+ "react-native-legal": ConfigPluginOptions<typeof reactNativeLegal>;
285
+ "react-native-libsodium": ConfigPluginOptions<typeof reactNativeLibsodium>;
286
+ "react-native-localization-settings": ConfigPluginOptions<typeof reactNativeLocalizationSettings>;
287
+ "react-native-localize-date": ConfigPluginOptions<typeof reactNativeLocalizeDate>;
288
+ "react-native-map-link": ConfigPluginOptions<typeof reactNativeMapLink>;
289
+ "react-native-maps": ConfigPluginOptions<typeof reactNativeMaps>;
290
+ "react-native-msal": ConfigPluginOptions<typeof reactNativeMsal>;
291
+ "react-native-navigation-mode": ConfigPluginOptions<typeof reactNativeNavigationMode>;
292
+ "react-native-nfc-manager": ConfigPluginOptions<typeof reactNativeNfcManager>;
293
+ "react-native-nitro-screen-recorder": ConfigPluginOptions<typeof reactNativeNitroScreenRecorder>;
294
+ "react-native-orientation-director": ConfigPluginOptions<typeof reactNativeOrientationDirector>;
295
+ "react-native-ota-hot-update": ConfigPluginOptions<typeof reactNativeOtaHotUpdate>;
296
+ "react-native-permissions": ConfigPluginOptions<typeof reactNativePermissions>;
297
+ "react-native-rate-app": ConfigPluginOptions<typeof reactNativeRateApp>;
298
+ "react-native-render-lynx": ConfigPluginOptions<typeof reactNativeRenderLynx>;
299
+ "react-native-screenshot-aware": ConfigPluginOptions<typeof reactNativeScreenshotAware>;
300
+ "react-native-share": ConfigPluginOptions<typeof reactNativeShare>;
301
+ "react-native-theoplayer": ConfigPluginOptions<typeof reactNativeTheoplayer>;
302
+ "react-native-tiktok": ConfigPluginOptions<typeof reactNativeTiktok>;
303
+ "react-native-twilio-video-webrtc": ConfigPluginOptions<typeof reactNativeTwilioVideoWebrtc>;
304
+ "react-native-v8": ConfigPluginOptions<typeof reactNativeV8>;
305
+ "react-native-video": ConfigPluginOptions<typeof reactNativeVideo>;
306
+ "react-native-vision-camera": ConfigPluginOptions<typeof reactNativeVisionCamera>;
307
+ "react-native-vlc-media-player": ConfigPluginOptions<typeof reactNativeVlcMediaPlayer>;
308
+ "react-native-wifi-reborn": ConfigPluginOptions<typeof reactNativeWifiReborn>;
309
+ }
310
+ interface FuncOptionMap extends ThirdPartyPlugins {
311
+ }
312
+ declare function plugin<Options extends FuncOptionMap[Name], Name extends keyof FuncOptionMap>(name: Name, options?: Options): [Name, Options] | [Name];
313
+
314
+ export { type ConfigPluginOptions, type ThirdPartyPlugins, plugin };
package/dist/plugin.js ADDED
@@ -0,0 +1,7 @@
1
+ // src/plugin/plugin.ts
2
+ function plugin(name, options) {
3
+ return options ? [name, options] : [name];
4
+ }
5
+ export {
6
+ plugin
7
+ };
package/package.json ADDED
@@ -0,0 +1,215 @@
1
+ {
2
+ "name": "typed-config-plugins",
3
+ "version": "0.0.1",
4
+ "description": "adds types to expo config plugins, like @types but for expo config plugins",
5
+ "author": {
6
+ "name": "WookieFPV (Lukas Müller)",
7
+ "url": "github.com/WookieFPV"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/WookieFPV/typed-config-plugins"
12
+ },
13
+ "keywords": [
14
+ "expo",
15
+ "config-plugin",
16
+ "react-native"
17
+ ],
18
+ "license": "MIT",
19
+ "module": "dist/plugin.js",
20
+ "type": "module",
21
+ "types": "dist/plugin.d.ts",
22
+ "main": "dist/cli.js",
23
+ "exports": {
24
+ "types": "./dist/plugin.d.ts",
25
+ "default": "./dist/plugin.js"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "build:dev": "tsup --watch",
33
+ "lint": "bunx biome check --fix",
34
+ "lint:CI": "bunx biome check",
35
+ "typecheck": "tsc",
36
+ "prepublishOnly": "bun i && bun run lint:CI && tsc && bun run build"
37
+ },
38
+ "dependencies": {
39
+ "@expo/config-plugins": "54.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@appandflow/expo-camera-characteristics": "*",
43
+ "@azesmway/react-native-unity": "*",
44
+ "@bacons/apple-colors": "*",
45
+ "@bam.tech/react-native-batch": "*",
46
+ "@batch.com/react-native-plugin": "*",
47
+ "@beyondidentity/bi-sdk-react-native": "*",
48
+ "@biomejs/biome": "2.2.4",
49
+ "@bittingz/expo-widgets": "*",
50
+ "@bravemobile/react-native-code-push": "*",
51
+ "@braze/expo-plugin": "*",
52
+ "@config-plugins/react-native-blob-util": "*",
53
+ "@config-plugins/react-native-pdf": "*",
54
+ "@corasan/image-compressor": "*",
55
+ "@datadog/mobile-react-native": "*",
56
+ "@fishjam-cloud/react-native-client": "*",
57
+ "@giphy/react-native-sdk": "*",
58
+ "@hot-updater/react-native": "*",
59
+ "@intercom/intercom-react-native": "*",
60
+ "@iterable/expo-plugin": "*",
61
+ "@kingstinct/react-native-activity-kit": "*",
62
+ "@kingstinct/react-native-healthkit": "*",
63
+ "@maplibre/maplibre-react-native": "*",
64
+ "@prisma/react-native": "*",
65
+ "@react-native-community/datetimepicker": "*",
66
+ "@react-native-firebase/app": "*",
67
+ "@react-native-firebase/app-check": "*",
68
+ "@react-native-firebase/app-distribution": "*",
69
+ "@react-native-firebase/auth": "*",
70
+ "@react-native-firebase/crashlytics": "*",
71
+ "@react-native-firebase/messaging": "*",
72
+ "@react-native-firebase/perf": "*",
73
+ "@react-native-google-signin/google-signin": "*",
74
+ "@react-native-seoul/naver-login": "*",
75
+ "@react-native-voice/voice": "*",
76
+ "@reactvision/react-viro": "*",
77
+ "@rnmapbox/maps": "*",
78
+ "@sentry/react-native": "*",
79
+ "@sparkfabrik/react-native-idfa-aaid": "*",
80
+ "@stripe/stripe-react-native": "*",
81
+ "@types/bun": "1.2.21",
82
+ "@types/resolve": "1.20.6",
83
+ "@vonovak/react-native-theme-control": "*",
84
+ "@wwdrew/expo-android-account-manager": "*",
85
+ "@wwdrew/expo-spotify-sdk": "*",
86
+ "@xmartlabs/react-native-line": "*",
87
+ "app-icon-badge": "*",
88
+ "expo-alternate-app-icons": "*",
89
+ "expo-apple-authentication": "*",
90
+ "expo-asset": "*",
91
+ "expo-audio": "*",
92
+ "expo-av": "*",
93
+ "expo-background-fetch": "*",
94
+ "expo-background-task": "*",
95
+ "expo-brightness": "*",
96
+ "expo-build-properties": "*",
97
+ "expo-calendar": "*",
98
+ "expo-camera": "*",
99
+ "expo-cellular": "*",
100
+ "expo-contacts": "*",
101
+ "expo-custom-assets": "*",
102
+ "expo-dev-client": "*",
103
+ "expo-document-picker": "*",
104
+ "expo-dynamic-app-icon": "*",
105
+ "expo-file-system": "*",
106
+ "expo-font": "*",
107
+ "expo-health-connect": "*",
108
+ "expo-iap": "*",
109
+ "expo-image-picker": "*",
110
+ "expo-libvlc-player": "*",
111
+ "expo-live-activity": "*",
112
+ "expo-local-authentication": "*",
113
+ "expo-localization": "*",
114
+ "expo-location": "*",
115
+ "expo-mail-composer": "*",
116
+ "expo-maps": "*",
117
+ "expo-media-library": "*",
118
+ "expo-music-picker": "*",
119
+ "expo-native-alipay": "*",
120
+ "expo-navigation-bar": "*",
121
+ "expo-notifications": "*",
122
+ "expo-pip": "*",
123
+ "expo-quick-actions": "*",
124
+ "expo-roomplan": "*",
125
+ "expo-router": "*",
126
+ "expo-screen-orientation": "*",
127
+ "expo-secure-store": "*",
128
+ "expo-sensors": "*",
129
+ "expo-share-extension": "*",
130
+ "expo-share-intent": "*",
131
+ "expo-shazamkit": "*",
132
+ "expo-speech-recognition": "*",
133
+ "expo-splash-screen": "*",
134
+ "expo-sqlite": "*",
135
+ "expo-superwall": "*",
136
+ "expo-system-ui": "*",
137
+ "expo-task-manager": "*",
138
+ "expo-tracking-transparency": "*",
139
+ "expo-updates": "*",
140
+ "expo-video": "*",
141
+ "expo-web-browser": "*",
142
+ "freerasp-react-native": "*",
143
+ "instabug-reactnative": "*",
144
+ "lefthook": "1.12.4",
145
+ "newrelic-react-native-agent": "*",
146
+ "onesignal-expo-plugin": "*",
147
+ "pushy-expo-plugin": "*",
148
+ "react-native-add-calendar-event": "*",
149
+ "react-native-admob-native-ads": "*",
150
+ "react-native-app-clip": "*",
151
+ "react-native-appsflyer": "*",
152
+ "react-native-audio-api": "*",
153
+ "react-native-auth0": "*",
154
+ "react-native-auto-skeleton": "*",
155
+ "react-native-background-fetch": "*",
156
+ "react-native-background-geolocation": "*",
157
+ "react-native-ble-manager": "*",
158
+ "react-native-ble-plx": "*",
159
+ "react-native-bootsplash": "*",
160
+ "react-native-bottom-tabs": "*",
161
+ "react-native-capture-protection": "*",
162
+ "react-native-cloud-storage": "*",
163
+ "react-native-cloud-store": "*",
164
+ "react-native-compressor": "*",
165
+ "react-native-credentials-manager": "*",
166
+ "react-native-document-scanner-plugin": "*",
167
+ "react-native-edge-to-edge": "*",
168
+ "react-native-email-link": "*",
169
+ "react-native-fast-tflite": "*",
170
+ "react-native-fbads": "*",
171
+ "react-native-fbsdk-next": "*",
172
+ "react-native-full-screen-notification-incoming-call": "*",
173
+ "react-native-google-cast": "*",
174
+ "react-native-google-mobile-ads": "*",
175
+ "react-native-health": "*",
176
+ "react-native-health-connect": "*",
177
+ "react-native-iap": "*",
178
+ "react-native-image-marker": "*",
179
+ "react-native-keys": "*",
180
+ "react-native-legal": "*",
181
+ "react-native-libsodium": "*",
182
+ "react-native-localization-settings": "*",
183
+ "react-native-localize": "*",
184
+ "react-native-localize-date": "*",
185
+ "react-native-map-link": "*",
186
+ "react-native-maps": "*",
187
+ "react-native-mmkv": "*",
188
+ "react-native-msal": "*",
189
+ "react-native-navigation-mode": "*",
190
+ "react-native-nfc-manager": "*",
191
+ "react-native-nitro-screen-recorder": "*",
192
+ "react-native-nitro-sound": "*",
193
+ "react-native-orientation-director": "*",
194
+ "react-native-ota-hot-update": "*",
195
+ "react-native-permissions": "*",
196
+ "react-native-quick-crypto": "*",
197
+ "react-native-rate-app": "*",
198
+ "react-native-render-lynx": "*",
199
+ "react-native-screenshot-aware": "*",
200
+ "react-native-share": "*",
201
+ "react-native-theoplayer": "*",
202
+ "react-native-tiktok": "*",
203
+ "react-native-twilio-video-webrtc": "*",
204
+ "react-native-v8": "*",
205
+ "react-native-video": "*",
206
+ "react-native-vision-camera": "*",
207
+ "react-native-vlc-media-player": "*",
208
+ "react-native-whip-whep": "*",
209
+ "react-native-wifi-reborn": "*",
210
+ "resolve": "1.22.10",
211
+ "rn-fade-wrapper": "*",
212
+ "tsup": "8.5.0",
213
+ "typescript": "5.9.2"
214
+ }
215
+ }