├── .eslintignore ├── android ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ └── .gitkeep │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── tech │ │ │ └── thegamedefault │ │ │ └── capacitor │ │ │ └── calls │ │ │ ├── CallDetector.java │ │ │ ├── PhoneState.java │ │ │ ├── CallDetectorPlugin.java │ │ │ └── CallBroadcastReceiver.java │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── getcapacitor │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── getcapacitor │ │ └── android │ │ └── ExampleInstrumentedTest.java ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── proguard-rules.pro ├── gradle.properties ├── build.gradle ├── gradlew.bat └── gradlew ├── .prettierignore ├── example ├── .gitignore ├── capacitor.config.json ├── README.md ├── package.json └── package-lock.json ├── ios ├── Plugin.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ ├── PluginTests.xcscheme │ │ │ └── Plugin.xcscheme │ └── project.pbxproj ├── Plugin │ ├── CallDetector.swift │ ├── CallDetectorPlugin.h │ ├── CallDetectorPlugin.m │ ├── Info.plist │ └── CallDetectorPlugin.swift ├── Plugin.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile └── PluginTests │ ├── Info.plist │ └── CallDetectorTests.swift ├── src ├── index.ts ├── web.ts └── definitions.ts ├── rollup.config.js ├── tsconfig.json ├── CapacitorPluginIncomingCall.podspec ├── .gitignore ├── CONTRIBUTING.md ├── package.json └── README.md /.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | dist 3 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /android/src/main/res/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | dist 3 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | node_modules/ 3 | .vscode/ 4 | *.map 5 | .DS_Store 6 | .sourcemaps 7 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':capacitor-android' 2 | project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/313hemant313/capacitor-plugin-incoming-call/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ios/Plugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Plugin/CallDetector.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | @objc public class CallDetector: NSObject { 4 | 5 | 6 | @objc public func echo(_ value: String) -> String { 7 | print(value) 8 | return value 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /example/capacitor.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "appId": "com.example.plugin", 3 | "appName": "example", 4 | "bundledWebRuntime": true, 5 | "webDir": "www", 6 | "plugins": { 7 | "SplashScreen": { 8 | "launchShowDuration": 0 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /ios/Plugin.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /ios/Plugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Plugin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '@capacitor/core'; 2 | 3 | import type { CallDetectorPlugin } from './definitions'; 4 | 5 | const CallDetector = registerPlugin('CallDetector', { 6 | web: () => import('./web').then(m => new m.CallDetectorWeb()), 7 | }); 8 | 9 | export * from './definitions'; 10 | export { CallDetector }; 11 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | ## Created with Capacitor Create App 2 | 3 | This app was created using [`@capacitor/create-app`](https://github.com/ionic-team/create-capacitor-app), 4 | and comes with a very minimal shell for building an app. 5 | 6 | ### Running this example 7 | 8 | To run the provided example, you can use [serve](https://www.npmjs.com/package/serve): 9 | 10 | ```bash 11 | npx serve 12 | ``` 13 | -------------------------------------------------------------------------------- /ios/Plugin/CallDetectorPlugin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | //! Project version number for Plugin. 4 | FOUNDATION_EXPORT double PluginVersionNumber; 5 | 6 | //! Project version string for Plugin. 7 | FOUNDATION_EXPORT const unsigned char PluginVersionString[]; 8 | 9 | // In this header, you should import all the public headers of your framework using statements like #import 10 | 11 | -------------------------------------------------------------------------------- /ios/Plugin/CallDetectorPlugin.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | // Define the plugin using the CAP_PLUGIN Macro, and 5 | // each method the plugin supports using the CAP_PLUGIN_METHOD macro. 6 | CAP_PLUGIN(CallDetectorPlugin, "CallDetector", 7 | CAP_PLUGIN_METHOD(echo, CAPPluginReturnPromise); 8 | CAP_PLUGIN_METHOD(detectCallState, CAPPluginReturnPromise); 9 | ) 10 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '12.0' 2 | 3 | def capacitor_pods 4 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 5 | use_frameworks! 6 | pod 'Capacitor', :path => '../node_modules/@capacitor/ios' 7 | pod 'CapacitorCordova', :path => '../node_modules/@capacitor/ios' 8 | end 9 | 10 | target 'Plugin' do 11 | capacitor_pods 12 | end 13 | 14 | target 'PluginTests' do 15 | capacitor_pods 16 | end 17 | -------------------------------------------------------------------------------- /android/src/test/java/com/getcapacitor/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | 14 | @Test 15 | public void addition_isCorrect() throws Exception { 16 | assertEquals(4, 2 + 2); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/web.ts: -------------------------------------------------------------------------------- 1 | import { WebPlugin } from '@capacitor/core'; 2 | 3 | import type { CallDetectorPlugin } from './definitions'; 4 | 5 | export class CallDetectorWeb extends WebPlugin implements CallDetectorPlugin { 6 | async echo(options: { value: string }): Promise<{ value: string }> { 7 | console.log('ECHO', options); 8 | return options; 9 | } 10 | 11 | async detectCallState(options: { action: string }): Promise<{ action: string }> { 12 | console.log('Cannot work in web', options); 13 | return options; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | input: 'dist/esm/index.js', 3 | output: [ 4 | { 5 | file: 'dist/plugin.js', 6 | format: 'iife', 7 | name: 'capacitorCallDetector', 8 | globals: { 9 | '@capacitor/core': 'capacitorExports', 10 | }, 11 | sourcemap: true, 12 | inlineDynamicImports: true, 13 | }, 14 | { 15 | file: 'dist/plugin.cjs.js', 16 | format: 'cjs', 17 | sourcemap: true, 18 | inlineDynamicImports: true, 19 | }, 20 | ], 21 | external: ['@capacitor/core'], 22 | }; 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowUnreachableCode": false, 4 | "declaration": true, 5 | "esModuleInterop": true, 6 | "inlineSources": true, 7 | "lib": ["dom", "es2017"], 8 | "module": "esnext", 9 | "moduleResolution": "node", 10 | "noFallthroughCasesInSwitch": true, 11 | "noUnusedLocals": true, 12 | "noUnusedParameters": true, 13 | "outDir": "dist/esm", 14 | "pretty": true, 15 | "sourceMap": true, 16 | "strict": true, 17 | "target": "es2017" 18 | }, 19 | "files": ["src/index.ts"] 20 | } 21 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "capacitor-app", 3 | "version": "1.0.0", 4 | "description": "An Amazing Capacitor App", 5 | "main": "index.js", 6 | "keywords": [ 7 | "capacitor", 8 | "mobile" 9 | ], 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "dependencies": { 14 | "@capacitor/core": "latest", 15 | "@capacitor/camera": "latest", 16 | "@capacitor/splash-screen": "latest", 17 | "capacitor-plugin-incoming-call": "file:.." 18 | }, 19 | "devDependencies": { 20 | "@capacitor/cli": "latest" 21 | }, 22 | "author": "", 23 | "license": "ISC" 24 | } 25 | -------------------------------------------------------------------------------- /CapacitorPluginIncomingCall.podspec: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) 4 | 5 | Pod::Spec.new do |s| 6 | s.name = 'CapacitorPluginIncomingCall' 7 | s.version = package['version'] 8 | s.summary = package['description'] 9 | s.license = package['license'] 10 | s.homepage = package['repository']['url'] 11 | s.author = package['author'] 12 | s.source = { :git => package['repository']['url'], :tag => s.version.to_s } 13 | s.source_files = 'ios/Plugin/**/*.{swift,h,m,c,cc,mm,cpp}' 14 | s.ios.deployment_target = '12.0' 15 | s.dependency 'Capacitor' 16 | s.swift_version = '5.1' 17 | end 18 | -------------------------------------------------------------------------------- /ios/PluginTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /android/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /ios/Plugin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/PluginTests/CallDetectorTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Plugin 3 | 4 | class CallDetectorTests: XCTestCase { 5 | override func setUp() { 6 | super.setUp() 7 | // Put setup code here. This method is called before the invocation of each test method in the class. 8 | } 9 | 10 | override func tearDown() { 11 | // Put teardown code here. This method is called after the invocation of each test method in the class. 12 | super.tearDown() 13 | } 14 | 15 | func testEcho() { 16 | // This is an example of a functional test case for a plugin. 17 | // Use XCTAssert and related functions to verify your tests produce the correct results. 18 | 19 | let implementation = CallDetector() 20 | let value = "Hello, World!" 21 | let result = implementation.echo(value) 22 | 23 | XCTAssertEqual(value, result) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /android/src/androidTest/java/com/getcapacitor/android/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.android; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import android.content.Context; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | import androidx.test.platform.app.InstrumentationRegistry; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * @see Testing documentation 15 | */ 16 | @RunWith(AndroidJUnit4.class) 17 | public class ExampleInstrumentedTest { 18 | 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | 24 | assertEquals("com.getcapacitor.android", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | 19 | # AndroidX package structure to make it clearer which packages are bundled with the 20 | # Android operating system, and which are packaged with your app's APK 21 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 22 | android.useAndroidX=true 23 | 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # node files 2 | dist 3 | node_modules 4 | 5 | # iOS files 6 | Pods 7 | Podfile.lock 8 | Build 9 | xcuserdata 10 | 11 | # macOS files 12 | .DS_Store 13 | 14 | 15 | 16 | # Based on Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore 17 | 18 | # Built application files 19 | *.apk 20 | *.ap_ 21 | 22 | # Files for the ART/Dalvik VM 23 | *.dex 24 | 25 | # Java class files 26 | *.class 27 | 28 | # Generated files 29 | bin 30 | gen 31 | out 32 | 33 | # Gradle files 34 | .gradle 35 | build 36 | 37 | # Local configuration file (sdk path, etc) 38 | local.properties 39 | 40 | # Proguard folder generated by Eclipse 41 | proguard 42 | 43 | # Log Files 44 | *.log 45 | 46 | # Android Studio Navigation editor temp files 47 | .navigation 48 | 49 | # Android Studio captures folder 50 | captures 51 | 52 | # IntelliJ 53 | *.iml 54 | .idea 55 | 56 | # Keystore files 57 | # Uncomment the following line if you do not want to check your keystore files in. 58 | #*.jks 59 | 60 | # External native build folder generated in Android Studio 2.2 and later 61 | .externalNativeBuild 62 | -------------------------------------------------------------------------------- /src/definitions.ts: -------------------------------------------------------------------------------- 1 | import type { PluginListenerHandle } from '@capacitor/core'; 2 | 3 | export interface CallDetectorPlugin { 4 | echo(options: { value: string }): Promise<{ value: string }>; 5 | /** 6 | * To enable / disable detection of calls 7 | * options: { action: 'ACTIVATE' | 'DEACTIVATE' } 8 | * 9 | */ 10 | detectCallState(options: { action: string }): Promise<{ action: string }>; 11 | addListener( 12 | eventName: 'callStateChange', 13 | listenerFunc: CallStateChangeListener, 14 | ): Promise & PluginListenerHandle; 15 | } 16 | 17 | 18 | export interface PhoneState { 19 | /** 20 | * Whether there is an active call or not. 21 | * 22 | * @since 1.0.0 23 | */ 24 | callActive: boolean; 25 | 26 | /** 27 | * The type of call. 28 | * 29 | * 'RINGING' | 'OUTGOING' | 'IDLE' | 'ON_CALL' | 'ON_HOLD' 30 | * 31 | * @since 1.0.0 32 | */ 33 | callState: PhoneStateType; 34 | 35 | incomingNumber: string; 36 | 37 | outgoingNumber: string; 38 | 39 | } 40 | 41 | export type PhoneStateType = 'RINGING' | 'OUTGOING' | 'IDLE' | 'ON_CALL' | 'ON_HOLD'; 42 | 43 | 44 | export type CallStateChangeListener = (status: PhoneState) => void; -------------------------------------------------------------------------------- /android/src/main/java/tech/thegamedefault/capacitor/calls/CallDetector.java: -------------------------------------------------------------------------------- 1 | package tech.thegamedefault.capacitor.calls; 2 | 3 | import android.content.IntentFilter; 4 | import android.telephony.TelephonyManager; 5 | import android.util.Log; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.annotation.Nullable; 9 | import androidx.appcompat.app.AppCompatActivity; 10 | 11 | public class CallDetector { 12 | 13 | interface CallStateChangeListener { 14 | void onCallStateChanged(); 15 | } 16 | 17 | @Nullable 18 | private CallStateChangeListener callStateChangeListener; 19 | 20 | public void setCallStateChangeListener(@Nullable CallStateChangeListener listener) { 21 | this.callStateChangeListener = listener; 22 | } 23 | 24 | private static CallBroadcastReceiver receiver = null; 25 | 26 | public String echo(String value) { 27 | Log.i("Echo", value); 28 | return value; 29 | } 30 | 31 | public void enableDetectCall() { 32 | Log.i("enableDetectCall", "Called"); 33 | receiver = new CallBroadcastReceiver(); 34 | receiver.setCallStateChangeListener(callStateChangeListener); 35 | } 36 | 37 | public void disableDetectCall() { 38 | Log.i("disableDetectCall", "Called"); 39 | receiver.abortBroadcast(); 40 | receiver = null; 41 | } 42 | 43 | public PhoneState getCurrentPhoneState() { 44 | return receiver.getCurrentPhoneState(); 45 | } 46 | 47 | public void startDetection(@NonNull AppCompatActivity activity) { 48 | IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 49 | activity.registerReceiver(receiver, filter); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /android/src/main/java/tech/thegamedefault/capacitor/calls/PhoneState.java: -------------------------------------------------------------------------------- 1 | package tech.thegamedefault.capacitor.calls; 2 | 3 | import org.json.JSONException; 4 | import org.json.JSONObject; 5 | 6 | public class PhoneState { 7 | boolean callActive; 8 | String callState; // RINGING, OUTGOING, IDLE, ON_CALL, ON_HOLD .. etc 9 | 10 | String incomingNumber; 11 | 12 | String outgoingNumber; 13 | 14 | public String getOutgoingNumber() { 15 | return outgoingNumber; 16 | } 17 | 18 | public void setOutgoingNumber(String outgoingNumber) { 19 | this.outgoingNumber = outgoingNumber; 20 | } 21 | 22 | public String getIncomingNumber() { 23 | return incomingNumber; 24 | } 25 | 26 | public void setIncomingNumber(String incomingNumber) { 27 | this.incomingNumber = incomingNumber; 28 | } 29 | 30 | public PhoneState() { 31 | } 32 | 33 | public boolean isCallActive() { 34 | return callActive; 35 | } 36 | 37 | public void setCallActive(boolean callActive) { 38 | this.callActive = callActive; 39 | } 40 | 41 | public String getCallState() { 42 | return callState; 43 | } 44 | 45 | public void setCallState(String callState) { 46 | this.callState = callState; 47 | } 48 | 49 | public JSONObject toJsonObject() { 50 | JSONObject jsonObject = new JSONObject(); 51 | try { 52 | jsonObject.put("callActive", isCallActive()); 53 | jsonObject.put("callState", getCallState()); 54 | jsonObject.put("incomingNumber", getIncomingNumber()); 55 | jsonObject.put("outgoingNumber", getOutgoingNumber()); 56 | } catch (JSONException e) { 57 | e.printStackTrace(); 58 | } 59 | return jsonObject; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | This guide provides instructions for contributing to this Capacitor plugin. 4 | 5 | ## Developing 6 | 7 | ### Local Setup 8 | 9 | 1. Fork and clone the repo. 10 | 1. Install the dependencies. 11 | 12 | ```shell 13 | npm install 14 | ``` 15 | 16 | 1. Install SwiftLint if you're on macOS. 17 | 18 | ```shell 19 | brew install swiftlint 20 | ``` 21 | 22 | ### Scripts 23 | 24 | #### `npm run build` 25 | 26 | Build the plugin web assets and generate plugin API documentation using [`@capacitor/docgen`](https://github.com/ionic-team/capacitor-docgen). 27 | 28 | It will compile the TypeScript code from `src/` into ESM JavaScript in `dist/esm/`. These files are used in apps with bundlers when your plugin is imported. 29 | 30 | Then, Rollup will bundle the code into a single file at `dist/plugin.js`. This file is used in apps without bundlers by including it as a script in `index.html`. 31 | 32 | #### `npm run verify` 33 | 34 | Build and validate the web and native projects. 35 | 36 | This is useful to run in CI to verify that the plugin builds for all platforms. 37 | 38 | #### `npm run lint` / `npm run fmt` 39 | 40 | Check formatting and code quality, autoformat/autofix if possible. 41 | 42 | This template is integrated with ESLint, Prettier, and SwiftLint. Using these tools is completely optional, but the [Capacitor Community](https://github.com/capacitor-community/) strives to have consistent code style and structure for easier cooperation. 43 | 44 | ## Publishing 45 | 46 | There is a `prepublishOnly` hook in `package.json` which prepares the plugin before publishing, so all you need to do is run: 47 | 48 | ```shell 49 | npm publish 50 | ``` 51 | 52 | > **Note**: The [`files`](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#files) array in `package.json` specifies which files get published. If you rename files/directories or add files elsewhere, you may need to update it. 53 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2' 3 | androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1' 4 | androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.5' 5 | androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.5.1' 6 | } 7 | 8 | buildscript { 9 | repositories { 10 | google() 11 | jcenter() 12 | } 13 | dependencies { 14 | classpath 'com.android.tools.build:gradle:8.2.1' 15 | } 16 | } 17 | 18 | apply plugin: 'com.android.library' 19 | 20 | android { 21 | namespace "tech.thegamedefault.capacitor.calls" 22 | compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34 23 | defaultConfig { 24 | minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 25 | targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34 26 | versionCode 1 27 | versionName "1.0" 28 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 29 | } 30 | buildTypes { 31 | release { 32 | minifyEnabled false 33 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 34 | } 35 | } 36 | lintOptions { 37 | abortOnError false 38 | } 39 | compileOptions { 40 | sourceCompatibility JavaVersion.VERSION_17 41 | targetCompatibility JavaVersion.VERSION_17 42 | } 43 | } 44 | 45 | repositories { 46 | google() 47 | mavenCentral() 48 | jcenter() 49 | } 50 | 51 | 52 | dependencies { 53 | implementation fileTree(dir: 'libs', include: ['*.jar']) 54 | implementation project(':capacitor-android') 55 | implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" 56 | testImplementation "junit:junit:$junitVersion" 57 | androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" 58 | androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" 59 | } 60 | -------------------------------------------------------------------------------- /ios/Plugin/CallDetectorPlugin.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Capacitor 3 | import CallKit; 4 | 5 | /** 6 | * Please read the Capacitor iOS Plugin Development Guide 7 | * here: https://capacitorjs.com/docs/plugins/ios 8 | */ 9 | @objc(CallDetectorPlugin) 10 | public class CallDetectorPlugin: CAPPlugin, CXCallObserverDelegate { 11 | private let implementation = CallDetector() 12 | private let callObserver = CXCallObserver() 13 | 14 | private var enabled = false; 15 | private var activeListener = false; 16 | 17 | @objc func echo(_ call: CAPPluginCall) { 18 | let value = call.getString("value") ?? "" 19 | call.resolve([ 20 | "value": implementation.echo(value) 21 | ]) 22 | } 23 | 24 | @objc func detectCallState(_ call: CAPPluginCall){ 25 | 26 | call.keepAlive = true; 27 | // 'ACTIVATE' | 'DEACTIVATE' 28 | let value = call.getString("action") ?? "" 29 | if(value == "ACTIVATE"){ 30 | activeListener = true 31 | }else if(value == "DEACTIVATE"){ 32 | activeListener = false 33 | }else{ 34 | call.reject("must provide an action: 'ACTIVATE' | 'DEACTIVATE'") 35 | } 36 | 37 | if(!enabled){ 38 | callObserver.setDelegate(self, queue: nil) //Set delegate to self to call delegate method. 39 | enabled = true 40 | } 41 | 42 | call.resolve(["success": true]) 43 | } 44 | 45 | @objc public func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) { 46 | 47 | // https://developer.apple.com/documentation/callkit/cxcall 48 | var callState = "IDLE" 49 | var callActive = true 50 | 51 | // 'RINGING' | 'OUTGOING' | 'IDLE' | 'ON_CALL' | 'ON_HOLD' 52 | if call.hasConnected { 53 | callState = "ON_CALL" 54 | callActive = true 55 | }else if call.isOutgoing { 56 | callState = "OUTGOING" 57 | callActive = false 58 | }else if call.hasEnded { 59 | callState = "IDLE" 60 | callActive = false 61 | }else if call.isOnHold { 62 | callState = "ON_HOLD" 63 | callActive = true 64 | }else{ 65 | callState = "RINGING" 66 | callActive = false 67 | } 68 | 69 | if(activeListener){ 70 | notifyListeners("callStateChange", data: [ 71 | "callActive": callActive, 72 | "callState": callState 73 | ]); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /ios/Plugin.xcodeproj/xcshareddata/xcschemes/PluginTests.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 63 | 64 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "capacitor-plugin-incoming-call", 3 | "version": "0.1.0", 4 | "description": "capacitor-plugin-incoming-call", 5 | "main": "dist/plugin.cjs.js", 6 | "module": "dist/esm/index.js", 7 | "types": "dist/esm/index.d.ts", 8 | "unpkg": "dist/plugin.js", 9 | "files": [ 10 | "android/src/main/", 11 | "android/build.gradle", 12 | "dist/", 13 | "ios/Plugin/", 14 | "CapacitorPluginIncomingCall.podspec" 15 | ], 16 | "author": "TheGameDefault", 17 | "license": "MIT", 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/313hemant313/capacitor-plugin-incoming-call.git" 21 | }, 22 | "bugs": { 23 | "url": "https://github.com/313hemant313/capacitor-plugin-incoming-call/issues" 24 | }, 25 | "keywords": [ 26 | "capacitor", 27 | "plugin", 28 | "native" 29 | ], 30 | "scripts": { 31 | "verify": "npm run verify:ios && npm run verify:android && npm run verify:web", 32 | "verify:ios": "cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin && cd ..", 33 | "verify:android": "cd android && ./gradlew clean build test && cd ..", 34 | "verify:web": "npm run build", 35 | "lint": "npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint", 36 | "fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format", 37 | "eslint": "eslint . --ext ts", 38 | "prettier": "prettier \"**/*.{css,html,ts,js,java}\"", 39 | "swiftlint": "node-swiftlint", 40 | "docgen": "docgen --api CallDetectorPlugin --output-readme README.md --output-json dist/docs.json", 41 | "build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.js", 42 | "clean": "rimraf ./dist", 43 | "watch": "tsc --watch", 44 | "prepublishOnly": "npm run build" 45 | }, 46 | "devDependencies": { 47 | "@capacitor/android": "^6.0.0", 48 | "@capacitor/core": "^6.0.0", 49 | "@capacitor/docgen": "^0.0.18", 50 | "@capacitor/ios": "^6.0.0", 51 | "@ionic/eslint-config": "^0.4.0", 52 | "@ionic/prettier-config": "^1.0.1", 53 | "@ionic/swiftlint-config": "^1.1.2", 54 | "eslint": "^8.57.0", 55 | "prettier": "~2.2.0", 56 | "prettier-plugin-java": "~1.0.0", 57 | "rimraf": "^3.0.2", 58 | "rollup": "^2.32.0", 59 | "swiftlint": "^1.0.1", 60 | "typescript": "~4.0.3" 61 | }, 62 | "peerDependencies": { 63 | "@capacitor/core": "^6.0.0" 64 | }, 65 | "prettier": "@ionic/prettier-config", 66 | "swiftlint": "@ionic/swiftlint-config", 67 | "eslintConfig": { 68 | "extends": "@ionic/eslint-config/recommended" 69 | }, 70 | "capacitor": { 71 | "ios": { 72 | "src": "ios" 73 | }, 74 | "android": { 75 | "src": "android" 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /android/src/main/java/tech/thegamedefault/capacitor/calls/CallDetectorPlugin.java: -------------------------------------------------------------------------------- 1 | package tech.thegamedefault.capacitor.calls; 2 | 3 | import android.Manifest; 4 | import android.util.Log; 5 | 6 | import com.getcapacitor.JSObject; 7 | import com.getcapacitor.Plugin; 8 | import com.getcapacitor.PluginCall; 9 | import com.getcapacitor.PluginMethod; 10 | import com.getcapacitor.annotation.CapacitorPlugin; 11 | import com.getcapacitor.annotation.Permission; 12 | 13 | import org.json.JSONException; 14 | 15 | @CapacitorPlugin( 16 | name = "CallDetector", 17 | permissions = { 18 | @Permission( 19 | alias = "phone_calls", 20 | strings = { 21 | Manifest.permission.READ_PHONE_STATE, 22 | Manifest.permission.PROCESS_OUTGOING_CALLS 23 | } 24 | ) 25 | } 26 | ) 27 | public class CallDetectorPlugin extends Plugin { 28 | 29 | private CallDetector implementation = new CallDetector(); 30 | public static final String CALL_STATE_EVENT = "callStateChange"; 31 | 32 | @PluginMethod 33 | public void echo(PluginCall call) { 34 | String value = call.getString("value"); 35 | 36 | JSObject ret = new JSObject(); 37 | ret.put("value", implementation.echo(value)); 38 | call.resolve(ret); 39 | } 40 | 41 | @PluginMethod 42 | public void detectCallState(PluginCall call) { 43 | String action = call.getString("action"); 44 | JSObject ret = new JSObject(); 45 | if ("ACTIVATE".equals(action)) { 46 | setupCallDetector(); 47 | call.setKeepAlive(true); 48 | } else { 49 | implementation.disableDetectCall(); 50 | } 51 | ret.put("success", true); 52 | call.resolve(ret); 53 | } 54 | 55 | private void setupCallDetector() { 56 | implementation.setCallStateChangeListener(this::updateCallState); 57 | implementation.enableDetectCall(); 58 | implementation.startDetection(getActivity()); 59 | } 60 | 61 | private void updateCallState() { 62 | Log.i("CallDetector", "Notify listeners, CurrentPhoneState: " + implementation.getCurrentPhoneState()); 63 | notifyListeners(CALL_STATE_EVENT, getPhoneStateJSObject(implementation.getCurrentPhoneState())); 64 | } 65 | 66 | private JSObject getPhoneStateJSObject(PhoneState state) { 67 | JSObject ret = null; 68 | try { 69 | ret = JSObject.fromJSONObject(state.toJsonObject()); 70 | } catch (JSONException e) { 71 | e.printStackTrace(); 72 | } 73 | return ret; 74 | } 75 | 76 | @Override 77 | protected void handleOnDestroy() { 78 | implementation.setCallStateChangeListener(null); 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /ios/Plugin.xcodeproj/xcshareddata/xcschemes/Plugin.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 62 | echo. 63 | echo Please set the JAVA_HOME variable in your environment to match the 64 | echo location of your Java installation. 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /android/src/main/java/tech/thegamedefault/capacitor/calls/CallBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | package tech.thegamedefault.capacitor.calls; 2 | 3 | import android.Manifest; 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.pm.PackageManager; 8 | import android.telephony.TelephonyManager; 9 | import android.util.Log; 10 | 11 | import androidx.core.app.ActivityCompat; 12 | 13 | public class CallBroadcastReceiver extends BroadcastReceiver { 14 | 15 | CallDetector.CallStateChangeListener callStateChangeListener = null; 16 | private final PhoneState currentPhoneState = new PhoneState(); 17 | private int prevState = TelephonyManager.CALL_STATE_IDLE; 18 | 19 | 20 | @Override 21 | public void onReceive(Context context, Intent intent) { 22 | Log.i("CallBroadcastReceiver", intent.getAction()); 23 | if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 24 | currentPhoneState.setCallActive(true); 25 | currentPhoneState.setCallState("OUTGOING_CALL"); 26 | } else { 27 | TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 28 | if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { 29 | return; 30 | } 31 | int callState = tm.getCallState(); 32 | if (callState == this.prevState) { 33 | return; 34 | } 35 | checkPhoneState(callState, intent); 36 | } 37 | callStateChangeListener.onCallStateChanged(); 38 | } 39 | 40 | private void checkPhoneState(int state, Intent intent) { 41 | switch (state) { 42 | case TelephonyManager.CALL_STATE_IDLE: 43 | this.currentPhoneState.setCallActive(false); 44 | this.currentPhoneState.setCallState("IDLE"); 45 | break; 46 | 47 | case TelephonyManager.CALL_STATE_RINGING: 48 | // called when someone is ringing to this phone 49 | this.currentPhoneState.setCallActive(true); 50 | this.currentPhoneState.setCallState("RINGING"); 51 | this.currentPhoneState.setIncomingNumber(intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)); 52 | break; 53 | 54 | case TelephonyManager.CALL_STATE_OFFHOOK: 55 | 56 | // If call was picked 57 | if (prevState == TelephonyManager.CALL_STATE_RINGING) { 58 | this.currentPhoneState.setCallActive(true); 59 | this.currentPhoneState.setCallState("ON_CALL"); 60 | } else { 61 | // TODO: Not sure if this is correct. 62 | this.currentPhoneState.setCallActive(false); 63 | this.currentPhoneState.setCallState("ON_HOLD"); 64 | } 65 | this.currentPhoneState.setOutgoingNumber(intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 66 | break; 67 | } 68 | this.prevState = state; 69 | } 70 | 71 | public void setCallStateChangeListener(CallDetector.CallStateChangeListener callStateChangeListener) { 72 | this.callStateChangeListener = callStateChangeListener; 73 | } 74 | 75 | public PhoneState getCurrentPhoneState() { 76 | return this.currentPhoneState; 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # capacitor-plugin-incoming-call 2 | 3 | capacitor-plugin-incoming-call 4 | 5 | ## Install 6 | install the package and sync the project. 7 | ```bash 8 | npm install capacitor-plugin-incoming-call 9 | npx cap sync 10 | ``` 11 | 12 | Add the required permissions to the Android source code 13 | 14 | ``android\app\src\main\java\app\[package_namespace]\MainActivity.java`` 15 | ```java 16 | import android.os.Bundle; // required for onCreate parameter 17 | import com.getcapacitor.BridgeActivity; 18 | import androidx.core.app.ActivityCompat; 19 | 20 | public class MainActivity extends BridgeActivity { 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | String[] PERMISSIONS = { 26 | android.Manifest.permission.READ_PHONE_STATE, 27 | android.Manifest.permission.READ_CALL_LOG 28 | }; 29 | 30 | ActivityCompat.requestPermissions(MainActivity.this, 31 | PERMISSIONS, 32 | 0); 33 | } 34 | 35 | } 36 | ``` 37 | 38 | ## Usage 39 | 40 | Typescipt side changes: 41 | ```typescript 42 | console.log('### Test CallDetector plugin ###'); 43 | CallDetector.detectCallState({ action: 'ACTIVATE' }).then(x => console.log(x)).catch(e => console.error(e)); 44 | CallDetector.addListener('callStateChange', res => { 45 | console.log('### Listening to callStateChange ###'); 46 | console.log(res); 47 | }); 48 | ``` 49 | 50 | ## API 51 | 52 | 53 | 54 | * [`echo(...)`](#echo) 55 | * [`detectCallState(...)`](#detectcallstate) 56 | * [`addListener('callStateChange', ...)`](#addlistenercallstatechange) 57 | * [Interfaces](#interfaces) 58 | * [Type Aliases](#type-aliases) 59 | 60 | 61 | 62 | 63 | 64 | 65 | ### echo(...) 66 | 67 | ```typescript 68 | echo(options: { value: string; }) => Promise<{ value: string; }> 69 | ``` 70 | 71 | | Param | Type | 72 | | ------------- | ------------------------------- | 73 | | **`options`** | { value: string; } | 74 | 75 | **Returns:** Promise<{ value: string; }> 76 | 77 | -------------------- 78 | 79 | 80 | ### detectCallState(...) 81 | 82 | ```typescript 83 | detectCallState(options: { action: string; }) => Promise<{ action: string; }> 84 | ``` 85 | 86 | To enable / disable detection of calls 87 | options: { action: 'ACTIVATE' | 'DEACTIVATE' } 88 | 89 | | Param | Type | 90 | | ------------- | -------------------------------- | 91 | | **`options`** | { action: string; } | 92 | 93 | **Returns:** Promise<{ action: string; }> 94 | 95 | -------------------- 96 | 97 | 98 | ### addListener('callStateChange', ...) 99 | 100 | ```typescript 101 | addListener(eventName: 'callStateChange', listenerFunc: CallStateChangeListener) => Promise & PluginListenerHandle 102 | ``` 103 | 104 | | Param | Type | 105 | | ------------------ | --------------------------------------------------------------------------- | 106 | | **`eventName`** | 'callStateChange' | 107 | | **`listenerFunc`** | CallStateChangeListener | 108 | 109 | **Returns:** Promise<PluginListenerHandle> & PluginListenerHandle 110 | 111 | -------------------- 112 | 113 | 114 | ### Interfaces 115 | 116 | 117 | #### PluginListenerHandle 118 | 119 | | Prop | Type | 120 | | ------------ | ----------------------------------------- | 121 | | **`remove`** | () => Promise<void> | 122 | 123 | 124 | #### PhoneState 125 | 126 | | Prop | Type | Description | Since | 127 | | ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------- | ----- | 128 | | **`callActive`** | boolean | Whether there is an active call or not. | 1.0.0 | 129 | | **`callState`** | PhoneStateType | The type of call. 'RINGING' \| 'OUTGOING' \| 'IDLE' \| 'ON_CALL' \| 'ON_HOLD' | 1.0.0 | 130 | 131 | 132 | ### Type Aliases 133 | 134 | 135 | #### CallStateChangeListener 136 | 137 | (status: PhoneState): void 138 | 139 | 140 | #### PhoneStateType 141 | 142 | 'RINGING' | 'OUTGOING' | 'IDLE' | 'ON_CALL' | 'ON_HOLD' 143 | 144 | 145 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 87 | 88 | # Use the maximum available, or set MAX_FD != -1 to use that value. 89 | MAX_FD=maximum 90 | 91 | warn () { 92 | echo "$*" 93 | } >&2 94 | 95 | die () { 96 | echo 97 | echo "$*" 98 | echo 99 | exit 1 100 | } >&2 101 | 102 | # OS specific support (must be 'true' or 'false'). 103 | cygwin=false 104 | msys=false 105 | darwin=false 106 | nonstop=false 107 | case "$( uname )" in #( 108 | CYGWIN* ) cygwin=true ;; #( 109 | Darwin* ) darwin=true ;; #( 110 | MSYS* | MINGW* ) msys=true ;; #( 111 | NONSTOP* ) nonstop=true ;; 112 | esac 113 | 114 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 115 | 116 | 117 | # Determine the Java command to use to start the JVM. 118 | if [ -n "$JAVA_HOME" ] ; then 119 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 120 | # IBM's JDK on AIX uses strange locations for the executables 121 | JAVACMD=$JAVA_HOME/jre/sh/java 122 | else 123 | JAVACMD=$JAVA_HOME/bin/java 124 | fi 125 | if [ ! -x "$JAVACMD" ] ; then 126 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 127 | 128 | Please set the JAVA_HOME variable in your environment to match the 129 | location of your Java installation." 130 | fi 131 | else 132 | JAVACMD=java 133 | if ! command -v java >/dev/null 2>&1 134 | then 135 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 136 | 137 | Please set the JAVA_HOME variable in your environment to match the 138 | location of your Java installation." 139 | fi 140 | fi 141 | 142 | # Increase the maximum file descriptors if we can. 143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144 | case $MAX_FD in #( 145 | max*) 146 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 147 | # shellcheck disable=SC3045 148 | MAX_FD=$( ulimit -H -n ) || 149 | warn "Could not query maximum file descriptor limit" 150 | esac 151 | case $MAX_FD in #( 152 | '' | soft) :;; #( 153 | *) 154 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 155 | # shellcheck disable=SC3045 156 | ulimit -n "$MAX_FD" || 157 | warn "Could not set maximum file descriptor limit to $MAX_FD" 158 | esac 159 | fi 160 | 161 | # Collect all arguments for the java command, stacking in reverse order: 162 | # * args from the command line 163 | # * the main class name 164 | # * -classpath 165 | # * -D...appname settings 166 | # * --module-path (only if needed) 167 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 168 | 169 | # For Cygwin or MSYS, switch paths to Windows format before running java 170 | if "$cygwin" || "$msys" ; then 171 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 172 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 173 | 174 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 175 | 176 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 177 | for arg do 178 | if 179 | case $arg in #( 180 | -*) false ;; # don't mess with options #( 181 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 182 | [ -e "$t" ] ;; #( 183 | *) false ;; 184 | esac 185 | then 186 | arg=$( cygpath --path --ignore --mixed "$arg" ) 187 | fi 188 | # Roll the args list around exactly as many times as the number of 189 | # args, so each arg winds up back in the position where it started, but 190 | # possibly modified. 191 | # 192 | # NB: a `for` loop captures its iteration list before it begins, so 193 | # changing the positional parameters here affects neither the number of 194 | # iterations, nor the values presented in `arg`. 195 | shift # remove old arg 196 | set -- "$@" "$arg" # push replacement arg 197 | done 198 | fi 199 | 200 | 201 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 202 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 203 | 204 | # Collect all arguments for the java command; 205 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 206 | # shell script including quotes and variable substitutions, so put them in 207 | # double quotes to make sure that they get re-expanded; and 208 | # * put everything else in single quotes, so that it's not re-expanded. 209 | 210 | set -- \ 211 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 212 | -classpath "$CLASSPATH" \ 213 | org.gradle.wrapper.GradleWrapperMain \ 214 | "$@" 215 | 216 | # Stop when "xargs" is not available. 217 | if ! command -v xargs >/dev/null 2>&1 218 | then 219 | die "xargs is not available" 220 | fi 221 | 222 | # Use "xargs" to parse quoted args. 223 | # 224 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 225 | # 226 | # In Bash we could simply go: 227 | # 228 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 229 | # set -- "${ARGS[@]}" "$@" 230 | # 231 | # but POSIX shell has neither arrays nor command substitution, so instead we 232 | # post-process each arg (as a line of input to sed) to backslash-escape any 233 | # character that might be a shell metacharacter, then use eval to reverse 234 | # that process (while maintaining the separation between arguments), and wrap 235 | # the whole thing up as a single "set" statement. 236 | # 237 | # This will of course break if any of these variables contains a newline or 238 | # an unmatched quote. 239 | # 240 | 241 | eval "set -- $( 242 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 243 | xargs -n1 | 244 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 245 | tr '\n' ' ' 246 | )" '"$@"' 247 | 248 | exec "$JAVACMD" "$@" 249 | -------------------------------------------------------------------------------- /ios/Plugin.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 03FC29A292ACC40490383A1F /* Pods_Plugin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B2A61DA5A1F2DD4F959604D /* Pods_Plugin.framework */; }; 11 | 20C0B05DCFC8E3958A738AF2 /* Pods_PluginTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F6753A823D3815DB436415E3 /* Pods_PluginTests.framework */; }; 12 | 2F98D68224C9AAE500613A4C /* CallDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F98D68124C9AAE400613A4C /* CallDetector.swift */; }; 13 | 50ADFF92201F53D600D50D53 /* Plugin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50ADFF88201F53D600D50D53 /* Plugin.framework */; }; 14 | 50ADFF97201F53D600D50D53 /* CallDetectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ADFF96201F53D600D50D53 /* CallDetectorTests.swift */; }; 15 | 50ADFF99201F53D600D50D53 /* CallDetectorPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 50ADFF8B201F53D600D50D53 /* CallDetectorPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 50ADFFA42020D75100D50D53 /* Capacitor.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50ADFFA52020D75100D50D53 /* Capacitor.framework */; }; 17 | 50ADFFA82020EE4F00D50D53 /* CallDetectorPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 50ADFFA72020EE4F00D50D53 /* CallDetectorPlugin.m */; }; 18 | 50E1A94820377CB70090CE1A /* CallDetectorPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E1A94720377CB70090CE1A /* CallDetectorPlugin.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 50ADFF93201F53D600D50D53 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 50ADFF7F201F53D600D50D53 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 50ADFF87201F53D600D50D53; 27 | remoteInfo = Plugin; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 2F98D68124C9AAE400613A4C /* CallDetector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallDetector.swift; sourceTree = ""; }; 33 | 3B2A61DA5A1F2DD4F959604D /* Pods_Plugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Plugin.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 50ADFF88201F53D600D50D53 /* Plugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Plugin.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 50ADFF8B201F53D600D50D53 /* CallDetectorPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CallDetectorPlugin.h; sourceTree = ""; }; 36 | 50ADFF8C201F53D600D50D53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 50ADFF91201F53D600D50D53 /* PluginTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PluginTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 50ADFF96201F53D600D50D53 /* CallDetectorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallDetectorTests.swift; sourceTree = ""; }; 39 | 50ADFF98201F53D600D50D53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | 50ADFFA52020D75100D50D53 /* Capacitor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Capacitor.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 50ADFFA72020EE4F00D50D53 /* CallDetectorPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CallDetectorPlugin.m; sourceTree = ""; }; 42 | 50E1A94720377CB70090CE1A /* CallDetectorPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallDetectorPlugin.swift; sourceTree = ""; }; 43 | 5E23F77F099397094342571A /* Pods-Plugin.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Plugin.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Plugin/Pods-Plugin.debug.xcconfig"; sourceTree = ""; }; 44 | 91781294A431A2A7CC6EB714 /* Pods-Plugin.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Plugin.release.xcconfig"; path = "Pods/Target Support Files/Pods-Plugin/Pods-Plugin.release.xcconfig"; sourceTree = ""; }; 45 | 96ED1B6440D6672E406C8D19 /* Pods-PluginTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PluginTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PluginTests/Pods-PluginTests.debug.xcconfig"; sourceTree = ""; }; 46 | F65BB2953ECE002E1EF3E424 /* Pods-PluginTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PluginTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-PluginTests/Pods-PluginTests.release.xcconfig"; sourceTree = ""; }; 47 | F6753A823D3815DB436415E3 /* Pods_PluginTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PluginTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | /* End PBXFileReference section */ 49 | 50 | /* Begin PBXFrameworksBuildPhase section */ 51 | 50ADFF84201F53D600D50D53 /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | 50ADFFA42020D75100D50D53 /* Capacitor.framework in Frameworks */, 56 | 03FC29A292ACC40490383A1F /* Pods_Plugin.framework in Frameworks */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | 50ADFF8E201F53D600D50D53 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | 50ADFF92201F53D600D50D53 /* Plugin.framework in Frameworks */, 65 | 20C0B05DCFC8E3958A738AF2 /* Pods_PluginTests.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 50ADFF7E201F53D600D50D53 = { 73 | isa = PBXGroup; 74 | children = ( 75 | 50ADFF8A201F53D600D50D53 /* Plugin */, 76 | 50ADFF95201F53D600D50D53 /* PluginTests */, 77 | 50ADFF89201F53D600D50D53 /* Products */, 78 | 8C8E7744173064A9F6D438E3 /* Pods */, 79 | A797B9EFA3DCEFEA1FBB66A9 /* Frameworks */, 80 | ); 81 | sourceTree = ""; 82 | }; 83 | 50ADFF89201F53D600D50D53 /* Products */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 50ADFF88201F53D600D50D53 /* Plugin.framework */, 87 | 50ADFF91201F53D600D50D53 /* PluginTests.xctest */, 88 | ); 89 | name = Products; 90 | sourceTree = ""; 91 | }; 92 | 50ADFF8A201F53D600D50D53 /* Plugin */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 50E1A94720377CB70090CE1A /* CallDetectorPlugin.swift */, 96 | 2F98D68124C9AAE400613A4C /* CallDetector.swift */, 97 | 50ADFF8B201F53D600D50D53 /* CallDetectorPlugin.h */, 98 | 50ADFFA72020EE4F00D50D53 /* CallDetectorPlugin.m */, 99 | 50ADFF8C201F53D600D50D53 /* Info.plist */, 100 | ); 101 | path = Plugin; 102 | sourceTree = ""; 103 | }; 104 | 50ADFF95201F53D600D50D53 /* PluginTests */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 50ADFF96201F53D600D50D53 /* CallDetectorTests.swift */, 108 | 50ADFF98201F53D600D50D53 /* Info.plist */, 109 | ); 110 | path = PluginTests; 111 | sourceTree = ""; 112 | }; 113 | 8C8E7744173064A9F6D438E3 /* Pods */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 5E23F77F099397094342571A /* Pods-Plugin.debug.xcconfig */, 117 | 91781294A431A2A7CC6EB714 /* Pods-Plugin.release.xcconfig */, 118 | 96ED1B6440D6672E406C8D19 /* Pods-PluginTests.debug.xcconfig */, 119 | F65BB2953ECE002E1EF3E424 /* Pods-PluginTests.release.xcconfig */, 120 | ); 121 | name = Pods; 122 | sourceTree = ""; 123 | }; 124 | A797B9EFA3DCEFEA1FBB66A9 /* Frameworks */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 50ADFFA52020D75100D50D53 /* Capacitor.framework */, 128 | 3B2A61DA5A1F2DD4F959604D /* Pods_Plugin.framework */, 129 | F6753A823D3815DB436415E3 /* Pods_PluginTests.framework */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | /* End PBXGroup section */ 135 | 136 | /* Begin PBXHeadersBuildPhase section */ 137 | 50ADFF85201F53D600D50D53 /* Headers */ = { 138 | isa = PBXHeadersBuildPhase; 139 | buildActionMask = 2147483647; 140 | files = ( 141 | 50ADFF99201F53D600D50D53 /* CallDetectorPlugin.h in Headers */, 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | /* End PBXHeadersBuildPhase section */ 146 | 147 | /* Begin PBXNativeTarget section */ 148 | 50ADFF87201F53D600D50D53 /* Plugin */ = { 149 | isa = PBXNativeTarget; 150 | buildConfigurationList = 50ADFF9C201F53D600D50D53 /* Build configuration list for PBXNativeTarget "Plugin" */; 151 | buildPhases = ( 152 | AB5B3E54B4E897F32C2279DA /* [CP] Check Pods Manifest.lock */, 153 | 50ADFF83201F53D600D50D53 /* Sources */, 154 | 50ADFF84201F53D600D50D53 /* Frameworks */, 155 | 50ADFF85201F53D600D50D53 /* Headers */, 156 | 50ADFF86201F53D600D50D53 /* Resources */, 157 | ); 158 | buildRules = ( 159 | ); 160 | dependencies = ( 161 | ); 162 | name = Plugin; 163 | productName = Plugin; 164 | productReference = 50ADFF88201F53D600D50D53 /* Plugin.framework */; 165 | productType = "com.apple.product-type.framework"; 166 | }; 167 | 50ADFF90201F53D600D50D53 /* PluginTests */ = { 168 | isa = PBXNativeTarget; 169 | buildConfigurationList = 50ADFF9F201F53D600D50D53 /* Build configuration list for PBXNativeTarget "PluginTests" */; 170 | buildPhases = ( 171 | 0596884F929ED6F1DE134961 /* [CP] Check Pods Manifest.lock */, 172 | 50ADFF8D201F53D600D50D53 /* Sources */, 173 | 50ADFF8E201F53D600D50D53 /* Frameworks */, 174 | 50ADFF8F201F53D600D50D53 /* Resources */, 175 | 8E97F58B69A94C6503FC9C85 /* [CP] Embed Pods Frameworks */, 176 | ); 177 | buildRules = ( 178 | ); 179 | dependencies = ( 180 | 50ADFF94201F53D600D50D53 /* PBXTargetDependency */, 181 | ); 182 | name = PluginTests; 183 | productName = PluginTests; 184 | productReference = 50ADFF91201F53D600D50D53 /* PluginTests.xctest */; 185 | productType = "com.apple.product-type.bundle.unit-test"; 186 | }; 187 | /* End PBXNativeTarget section */ 188 | 189 | /* Begin PBXProject section */ 190 | 50ADFF7F201F53D600D50D53 /* Project object */ = { 191 | isa = PBXProject; 192 | attributes = { 193 | LastSwiftUpdateCheck = 0920; 194 | LastUpgradeCheck = 1160; 195 | ORGANIZATIONNAME = "Max Lynch"; 196 | TargetAttributes = { 197 | 50ADFF87201F53D600D50D53 = { 198 | CreatedOnToolsVersion = 9.2; 199 | LastSwiftMigration = 1100; 200 | ProvisioningStyle = Automatic; 201 | }; 202 | 50ADFF90201F53D600D50D53 = { 203 | CreatedOnToolsVersion = 9.2; 204 | LastSwiftMigration = 1100; 205 | ProvisioningStyle = Automatic; 206 | }; 207 | }; 208 | }; 209 | buildConfigurationList = 50ADFF82201F53D600D50D53 /* Build configuration list for PBXProject "Plugin" */; 210 | compatibilityVersion = "Xcode 8.0"; 211 | developmentRegion = en; 212 | hasScannedForEncodings = 0; 213 | knownRegions = ( 214 | en, 215 | Base, 216 | ); 217 | mainGroup = 50ADFF7E201F53D600D50D53; 218 | productRefGroup = 50ADFF89201F53D600D50D53 /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | 50ADFF87201F53D600D50D53 /* Plugin */, 223 | 50ADFF90201F53D600D50D53 /* PluginTests */, 224 | ); 225 | }; 226 | /* End PBXProject section */ 227 | 228 | /* Begin PBXResourcesBuildPhase section */ 229 | 50ADFF86201F53D600D50D53 /* Resources */ = { 230 | isa = PBXResourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | 50ADFF8F201F53D600D50D53 /* Resources */ = { 237 | isa = PBXResourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | }; 243 | /* End PBXResourcesBuildPhase section */ 244 | 245 | /* Begin PBXShellScriptBuildPhase section */ 246 | 0596884F929ED6F1DE134961 /* [CP] Check Pods Manifest.lock */ = { 247 | isa = PBXShellScriptBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | ); 251 | inputPaths = ( 252 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 253 | "${PODS_ROOT}/Manifest.lock", 254 | ); 255 | name = "[CP] Check Pods Manifest.lock"; 256 | outputPaths = ( 257 | "$(DERIVED_FILE_DIR)/Pods-PluginTests-checkManifestLockResult.txt", 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | shellPath = /bin/sh; 261 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 262 | showEnvVarsInLog = 0; 263 | }; 264 | 8E97F58B69A94C6503FC9C85 /* [CP] Embed Pods Frameworks */ = { 265 | isa = PBXShellScriptBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | ); 269 | inputPaths = ( 270 | "${PODS_ROOT}/Target Support Files/Pods-PluginTests/Pods-PluginTests-frameworks.sh", 271 | "${BUILT_PRODUCTS_DIR}/Capacitor/Capacitor.framework", 272 | "${BUILT_PRODUCTS_DIR}/CapacitorCordova/Cordova.framework", 273 | ); 274 | name = "[CP] Embed Pods Frameworks"; 275 | outputPaths = ( 276 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Capacitor.framework", 277 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cordova.framework", 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | shellPath = /bin/sh; 281 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PluginTests/Pods-PluginTests-frameworks.sh\"\n"; 282 | showEnvVarsInLog = 0; 283 | }; 284 | AB5B3E54B4E897F32C2279DA /* [CP] Check Pods Manifest.lock */ = { 285 | isa = PBXShellScriptBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | ); 289 | inputPaths = ( 290 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 291 | "${PODS_ROOT}/Manifest.lock", 292 | ); 293 | name = "[CP] Check Pods Manifest.lock"; 294 | outputPaths = ( 295 | "$(DERIVED_FILE_DIR)/Pods-Plugin-checkManifestLockResult.txt", 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 300 | showEnvVarsInLog = 0; 301 | }; 302 | /* End PBXShellScriptBuildPhase section */ 303 | 304 | /* Begin PBXSourcesBuildPhase section */ 305 | 50ADFF83201F53D600D50D53 /* Sources */ = { 306 | isa = PBXSourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | 50E1A94820377CB70090CE1A /* CallDetectorPlugin.swift in Sources */, 310 | 2F98D68224C9AAE500613A4C /* CallDetector.swift in Sources */, 311 | 50ADFFA82020EE4F00D50D53 /* CallDetectorPlugin.m in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 50ADFF8D201F53D600D50D53 /* Sources */ = { 316 | isa = PBXSourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 50ADFF97201F53D600D50D53 /* CallDetectorTests.swift in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | /* End PBXSourcesBuildPhase section */ 324 | 325 | /* Begin PBXTargetDependency section */ 326 | 50ADFF94201F53D600D50D53 /* PBXTargetDependency */ = { 327 | isa = PBXTargetDependency; 328 | target = 50ADFF87201F53D600D50D53 /* Plugin */; 329 | targetProxy = 50ADFF93201F53D600D50D53 /* PBXContainerItemProxy */; 330 | }; 331 | /* End PBXTargetDependency section */ 332 | 333 | /* Begin XCBuildConfiguration section */ 334 | 50ADFF9A201F53D600D50D53 /* Debug */ = { 335 | isa = XCBuildConfiguration; 336 | buildSettings = { 337 | ALWAYS_SEARCH_USER_PATHS = NO; 338 | CLANG_ANALYZER_NONNULL = YES; 339 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 340 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 341 | CLANG_CXX_LIBRARY = "libc++"; 342 | CLANG_ENABLE_MODULES = YES; 343 | CLANG_ENABLE_OBJC_ARC = YES; 344 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 345 | CLANG_WARN_BOOL_CONVERSION = YES; 346 | CLANG_WARN_COMMA = YES; 347 | CLANG_WARN_CONSTANT_CONVERSION = YES; 348 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 349 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 350 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 351 | CLANG_WARN_EMPTY_BODY = YES; 352 | CLANG_WARN_ENUM_CONVERSION = YES; 353 | CLANG_WARN_INFINITE_RECURSION = YES; 354 | CLANG_WARN_INT_CONVERSION = YES; 355 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 356 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 357 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 358 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 359 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 360 | CLANG_WARN_STRICT_PROTOTYPES = YES; 361 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 362 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 363 | CLANG_WARN_UNREACHABLE_CODE = YES; 364 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 365 | CODE_SIGN_IDENTITY = "iPhone Developer"; 366 | COPY_PHASE_STRIP = NO; 367 | CURRENT_PROJECT_VERSION = 1; 368 | DEBUG_INFORMATION_FORMAT = dwarf; 369 | ENABLE_STRICT_OBJC_MSGSEND = YES; 370 | ENABLE_TESTABILITY = YES; 371 | FRAMEWORK_SEARCH_PATHS = ( 372 | "\"${BUILT_PRODUCTS_DIR}/Capacitor\"", 373 | "\"${BUILT_PRODUCTS_DIR}/CapacitorCordova\"", 374 | ); 375 | GCC_C_LANGUAGE_STANDARD = gnu11; 376 | GCC_DYNAMIC_NO_PIC = NO; 377 | GCC_NO_COMMON_BLOCKS = YES; 378 | GCC_OPTIMIZATION_LEVEL = 0; 379 | GCC_PREPROCESSOR_DEFINITIONS = ( 380 | "DEBUG=1", 381 | "$(inherited)", 382 | ); 383 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 384 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 385 | GCC_WARN_UNDECLARED_SELECTOR = YES; 386 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 387 | GCC_WARN_UNUSED_FUNCTION = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 390 | MTL_ENABLE_DEBUG_INFO = YES; 391 | ONLY_ACTIVE_ARCH = YES; 392 | SDKROOT = iphoneos; 393 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 394 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 395 | VERSIONING_SYSTEM = "apple-generic"; 396 | VERSION_INFO_PREFIX = ""; 397 | }; 398 | name = Debug; 399 | }; 400 | 50ADFF9B201F53D600D50D53 /* Release */ = { 401 | isa = XCBuildConfiguration; 402 | buildSettings = { 403 | ALWAYS_SEARCH_USER_PATHS = NO; 404 | CLANG_ANALYZER_NONNULL = YES; 405 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 406 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 407 | CLANG_CXX_LIBRARY = "libc++"; 408 | CLANG_ENABLE_MODULES = YES; 409 | CLANG_ENABLE_OBJC_ARC = YES; 410 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 411 | CLANG_WARN_BOOL_CONVERSION = YES; 412 | CLANG_WARN_COMMA = YES; 413 | CLANG_WARN_CONSTANT_CONVERSION = YES; 414 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 415 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 416 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 417 | CLANG_WARN_EMPTY_BODY = YES; 418 | CLANG_WARN_ENUM_CONVERSION = YES; 419 | CLANG_WARN_INFINITE_RECURSION = YES; 420 | CLANG_WARN_INT_CONVERSION = YES; 421 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 422 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 423 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 424 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 425 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 426 | CLANG_WARN_STRICT_PROTOTYPES = YES; 427 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 428 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 429 | CLANG_WARN_UNREACHABLE_CODE = YES; 430 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 431 | CODE_SIGN_IDENTITY = "iPhone Developer"; 432 | COPY_PHASE_STRIP = NO; 433 | CURRENT_PROJECT_VERSION = 1; 434 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 435 | ENABLE_NS_ASSERTIONS = NO; 436 | ENABLE_STRICT_OBJC_MSGSEND = YES; 437 | FRAMEWORK_SEARCH_PATHS = ( 438 | "\"${BUILT_PRODUCTS_DIR}/Capacitor\"", 439 | "\"${BUILT_PRODUCTS_DIR}/CapacitorCordova\"", 440 | ); 441 | GCC_C_LANGUAGE_STANDARD = gnu11; 442 | GCC_NO_COMMON_BLOCKS = YES; 443 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 444 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 445 | GCC_WARN_UNDECLARED_SELECTOR = YES; 446 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 447 | GCC_WARN_UNUSED_FUNCTION = YES; 448 | GCC_WARN_UNUSED_VARIABLE = YES; 449 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 450 | MTL_ENABLE_DEBUG_INFO = NO; 451 | SDKROOT = iphoneos; 452 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 453 | VALIDATE_PRODUCT = YES; 454 | VERSIONING_SYSTEM = "apple-generic"; 455 | VERSION_INFO_PREFIX = ""; 456 | }; 457 | name = Release; 458 | }; 459 | 50ADFF9D201F53D600D50D53 /* Debug */ = { 460 | isa = XCBuildConfiguration; 461 | baseConfigurationReference = 5E23F77F099397094342571A /* Pods-Plugin.debug.xcconfig */; 462 | buildSettings = { 463 | CLANG_ENABLE_MODULES = YES; 464 | CODE_SIGN_IDENTITY = ""; 465 | CODE_SIGN_STYLE = Automatic; 466 | DEFINES_MODULE = YES; 467 | DYLIB_COMPATIBILITY_VERSION = 1; 468 | DYLIB_CURRENT_VERSION = 1; 469 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 470 | INFOPLIST_FILE = Plugin/Info.plist; 471 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 472 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 473 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)\n$(FRAMEWORK_SEARCH_PATHS)\n$(FRAMEWORK_SEARCH_PATHS)"; 474 | ONLY_ACTIVE_ARCH = YES; 475 | PRODUCT_BUNDLE_IDENTIFIER = com.getcapacitor.Plugin; 476 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 477 | SKIP_INSTALL = YES; 478 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 479 | SWIFT_VERSION = 5.0; 480 | TARGETED_DEVICE_FAMILY = "1,2"; 481 | }; 482 | name = Debug; 483 | }; 484 | 50ADFF9E201F53D600D50D53 /* Release */ = { 485 | isa = XCBuildConfiguration; 486 | baseConfigurationReference = 91781294A431A2A7CC6EB714 /* Pods-Plugin.release.xcconfig */; 487 | buildSettings = { 488 | CLANG_ENABLE_MODULES = YES; 489 | CODE_SIGN_IDENTITY = ""; 490 | CODE_SIGN_STYLE = Automatic; 491 | DEFINES_MODULE = YES; 492 | DYLIB_COMPATIBILITY_VERSION = 1; 493 | DYLIB_CURRENT_VERSION = 1; 494 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 495 | INFOPLIST_FILE = Plugin/Info.plist; 496 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 497 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 499 | ONLY_ACTIVE_ARCH = NO; 500 | PRODUCT_BUNDLE_IDENTIFIER = com.getcapacitor.Plugin; 501 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 502 | SKIP_INSTALL = YES; 503 | SWIFT_VERSION = 5.0; 504 | TARGETED_DEVICE_FAMILY = "1,2"; 505 | }; 506 | name = Release; 507 | }; 508 | 50ADFFA0201F53D600D50D53 /* Debug */ = { 509 | isa = XCBuildConfiguration; 510 | baseConfigurationReference = 96ED1B6440D6672E406C8D19 /* Pods-PluginTests.debug.xcconfig */; 511 | buildSettings = { 512 | CODE_SIGN_STYLE = Automatic; 513 | INFOPLIST_FILE = PluginTests/Info.plist; 514 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 515 | PRODUCT_BUNDLE_IDENTIFIER = com.getcapacitor.PluginTests; 516 | PRODUCT_NAME = "$(TARGET_NAME)"; 517 | SWIFT_VERSION = 5.0; 518 | TARGETED_DEVICE_FAMILY = "1,2"; 519 | }; 520 | name = Debug; 521 | }; 522 | 50ADFFA1201F53D600D50D53 /* Release */ = { 523 | isa = XCBuildConfiguration; 524 | baseConfigurationReference = F65BB2953ECE002E1EF3E424 /* Pods-PluginTests.release.xcconfig */; 525 | buildSettings = { 526 | CODE_SIGN_STYLE = Automatic; 527 | INFOPLIST_FILE = PluginTests/Info.plist; 528 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 529 | PRODUCT_BUNDLE_IDENTIFIER = com.getcapacitor.PluginTests; 530 | PRODUCT_NAME = "$(TARGET_NAME)"; 531 | SWIFT_VERSION = 5.0; 532 | TARGETED_DEVICE_FAMILY = "1,2"; 533 | }; 534 | name = Release; 535 | }; 536 | /* End XCBuildConfiguration section */ 537 | 538 | /* Begin XCConfigurationList section */ 539 | 50ADFF82201F53D600D50D53 /* Build configuration list for PBXProject "Plugin" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 50ADFF9A201F53D600D50D53 /* Debug */, 543 | 50ADFF9B201F53D600D50D53 /* Release */, 544 | ); 545 | defaultConfigurationIsVisible = 0; 546 | defaultConfigurationName = Release; 547 | }; 548 | 50ADFF9C201F53D600D50D53 /* Build configuration list for PBXNativeTarget "Plugin" */ = { 549 | isa = XCConfigurationList; 550 | buildConfigurations = ( 551 | 50ADFF9D201F53D600D50D53 /* Debug */, 552 | 50ADFF9E201F53D600D50D53 /* Release */, 553 | ); 554 | defaultConfigurationIsVisible = 0; 555 | defaultConfigurationName = Release; 556 | }; 557 | 50ADFF9F201F53D600D50D53 /* Build configuration list for PBXNativeTarget "PluginTests" */ = { 558 | isa = XCConfigurationList; 559 | buildConfigurations = ( 560 | 50ADFFA0201F53D600D50D53 /* Debug */, 561 | 50ADFFA1201F53D600D50D53 /* Release */, 562 | ); 563 | defaultConfigurationIsVisible = 0; 564 | defaultConfigurationName = Release; 565 | }; 566 | /* End XCConfigurationList section */ 567 | }; 568 | rootObject = 50ADFF7F201F53D600D50D53 /* Project object */; 569 | } 570 | -------------------------------------------------------------------------------- /example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "capacitor-app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "capacitor-app", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@capacitor/camera": "latest", 13 | "@capacitor/core": "latest", 14 | "@capacitor/splash-screen": "latest", 15 | "capacitor-plugin-incoming-call": "file:.." 16 | }, 17 | "devDependencies": { 18 | "@capacitor/cli": "latest" 19 | } 20 | }, 21 | "..": { 22 | "version": "0.0.9", 23 | "license": "MIT", 24 | "devDependencies": { 25 | "@capacitor/android": "^5.0.5", 26 | "@capacitor/core": "^5.0.0", 27 | "@capacitor/docgen": "^0.0.18", 28 | "@capacitor/ios": "^5.0.0", 29 | "@ionic/eslint-config": "^0.3.0", 30 | "@ionic/prettier-config": "^1.0.1", 31 | "@ionic/swiftlint-config": "^1.1.2", 32 | "eslint": "^7.11.0", 33 | "prettier": "~2.2.0", 34 | "prettier-plugin-java": "~1.0.0", 35 | "rimraf": "^3.0.2", 36 | "rollup": "^2.32.0", 37 | "swiftlint": "^1.0.1", 38 | "typescript": "~4.0.3" 39 | }, 40 | "peerDependencies": { 41 | "@capacitor/core": "^5.0.0" 42 | } 43 | }, 44 | "node_modules/@capacitor/camera": { 45 | "version": "6.0.1", 46 | "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-6.0.1.tgz", 47 | "integrity": "sha512-KGfjv8q0Q9OEcpBGqSSZD2yb1KeDe12mlzOOPp4wr6GvcOY0EIvZ0o3KiPXegLVuRZeemz71/lCxPHAQ/5gAiA==", 48 | "peerDependencies": { 49 | "@capacitor/core": "^6.0.0" 50 | } 51 | }, 52 | "node_modules/@capacitor/cli": { 53 | "version": "6.1.0", 54 | "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.0.tgz", 55 | "integrity": "sha512-HEKDh3+FuNZKFHmSDZ7nAnaX3bzhtznYk9GsZBMac1y4CTAxIykPX9wzZ3DzLeM/EbMBGFClUbefkIkimAyfYg==", 56 | "dev": true, 57 | "dependencies": { 58 | "@ionic/cli-framework-output": "^2.2.5", 59 | "@ionic/utils-fs": "^3.1.6", 60 | "@ionic/utils-process": "^2.1.11", 61 | "@ionic/utils-subprocess": "2.1.11", 62 | "@ionic/utils-terminal": "^2.3.3", 63 | "commander": "^9.3.0", 64 | "debug": "^4.3.4", 65 | "env-paths": "^2.2.0", 66 | "kleur": "^4.1.4", 67 | "native-run": "^2.0.0", 68 | "open": "^8.4.0", 69 | "plist": "^3.0.5", 70 | "prompts": "^2.4.2", 71 | "rimraf": "^4.4.1", 72 | "semver": "^7.3.7", 73 | "tar": "^6.1.11", 74 | "tslib": "^2.4.0", 75 | "xml2js": "^0.5.0" 76 | }, 77 | "bin": { 78 | "cap": "bin/capacitor", 79 | "capacitor": "bin/capacitor" 80 | }, 81 | "engines": { 82 | "node": ">=18.0.0" 83 | } 84 | }, 85 | "node_modules/@capacitor/core": { 86 | "version": "6.1.0", 87 | "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.1.0.tgz", 88 | "integrity": "sha512-Kt4ONm0X9xxJXn9Q73oBaKdzep5B/VJw3VjXa2eGul4cD2k37mJwgjpXSMRnLH0Aju5bCiRL8J/hMAfTlokO6A==", 89 | "dependencies": { 90 | "tslib": "^2.1.0" 91 | } 92 | }, 93 | "node_modules/@capacitor/splash-screen": { 94 | "version": "6.0.1", 95 | "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-6.0.1.tgz", 96 | "integrity": "sha512-ndsqq335Mb6NxDrcXsT0PVwomo/UrDN4ykqpu8wY8F3HT4vbr8Hojh5PLqtlTy6TCIIIen58fkEgIoyGPsPSaw==", 97 | "peerDependencies": { 98 | "@capacitor/core": "^6.0.0" 99 | } 100 | }, 101 | "node_modules/@ionic/cli-framework-output": { 102 | "version": "2.2.8", 103 | "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", 104 | "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", 105 | "dev": true, 106 | "dependencies": { 107 | "@ionic/utils-terminal": "2.3.5", 108 | "debug": "^4.0.0", 109 | "tslib": "^2.0.1" 110 | }, 111 | "engines": { 112 | "node": ">=16.0.0" 113 | } 114 | }, 115 | "node_modules/@ionic/utils-array": { 116 | "version": "2.1.5", 117 | "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", 118 | "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", 119 | "dev": true, 120 | "dependencies": { 121 | "debug": "^4.0.0", 122 | "tslib": "^2.0.1" 123 | }, 124 | "engines": { 125 | "node": ">=10.3.0" 126 | } 127 | }, 128 | "node_modules/@ionic/utils-fs": { 129 | "version": "3.1.7", 130 | "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", 131 | "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", 132 | "dev": true, 133 | "dependencies": { 134 | "@types/fs-extra": "^8.0.0", 135 | "debug": "^4.0.0", 136 | "fs-extra": "^9.0.0", 137 | "tslib": "^2.0.1" 138 | }, 139 | "engines": { 140 | "node": ">=16.0.0" 141 | } 142 | }, 143 | "node_modules/@ionic/utils-object": { 144 | "version": "2.1.6", 145 | "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", 146 | "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", 147 | "dev": true, 148 | "dependencies": { 149 | "debug": "^4.0.0", 150 | "tslib": "^2.0.1" 151 | }, 152 | "engines": { 153 | "node": ">=16.0.0" 154 | } 155 | }, 156 | "node_modules/@ionic/utils-process": { 157 | "version": "2.1.12", 158 | "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", 159 | "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", 160 | "dev": true, 161 | "dependencies": { 162 | "@ionic/utils-object": "2.1.6", 163 | "@ionic/utils-terminal": "2.3.5", 164 | "debug": "^4.0.0", 165 | "signal-exit": "^3.0.3", 166 | "tree-kill": "^1.2.2", 167 | "tslib": "^2.0.1" 168 | }, 169 | "engines": { 170 | "node": ">=16.0.0" 171 | } 172 | }, 173 | "node_modules/@ionic/utils-stream": { 174 | "version": "3.1.5", 175 | "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", 176 | "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", 177 | "dev": true, 178 | "dependencies": { 179 | "debug": "^4.0.0", 180 | "tslib": "^2.0.1" 181 | }, 182 | "engines": { 183 | "node": ">=10.3.0" 184 | } 185 | }, 186 | "node_modules/@ionic/utils-subprocess": { 187 | "version": "2.1.11", 188 | "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", 189 | "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", 190 | "dev": true, 191 | "dependencies": { 192 | "@ionic/utils-array": "2.1.5", 193 | "@ionic/utils-fs": "3.1.6", 194 | "@ionic/utils-process": "2.1.10", 195 | "@ionic/utils-stream": "3.1.5", 196 | "@ionic/utils-terminal": "2.3.3", 197 | "cross-spawn": "^7.0.3", 198 | "debug": "^4.0.0", 199 | "tslib": "^2.0.1" 200 | }, 201 | "engines": { 202 | "node": ">=10.3.0" 203 | } 204 | }, 205 | "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-fs": { 206 | "version": "3.1.6", 207 | "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", 208 | "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", 209 | "dev": true, 210 | "dependencies": { 211 | "@types/fs-extra": "^8.0.0", 212 | "debug": "^4.0.0", 213 | "fs-extra": "^9.0.0", 214 | "tslib": "^2.0.1" 215 | }, 216 | "engines": { 217 | "node": ">=10.3.0" 218 | } 219 | }, 220 | "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-object": { 221 | "version": "2.1.5", 222 | "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", 223 | "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", 224 | "dev": true, 225 | "dependencies": { 226 | "debug": "^4.0.0", 227 | "tslib": "^2.0.1" 228 | }, 229 | "engines": { 230 | "node": ">=10.3.0" 231 | } 232 | }, 233 | "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { 234 | "version": "2.1.10", 235 | "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", 236 | "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", 237 | "dev": true, 238 | "dependencies": { 239 | "@ionic/utils-object": "2.1.5", 240 | "@ionic/utils-terminal": "2.3.3", 241 | "debug": "^4.0.0", 242 | "signal-exit": "^3.0.3", 243 | "tree-kill": "^1.2.2", 244 | "tslib": "^2.0.1" 245 | }, 246 | "engines": { 247 | "node": ">=10.3.0" 248 | } 249 | }, 250 | "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { 251 | "version": "2.3.3", 252 | "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", 253 | "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", 254 | "dev": true, 255 | "dependencies": { 256 | "@types/slice-ansi": "^4.0.0", 257 | "debug": "^4.0.0", 258 | "signal-exit": "^3.0.3", 259 | "slice-ansi": "^4.0.0", 260 | "string-width": "^4.1.0", 261 | "strip-ansi": "^6.0.0", 262 | "tslib": "^2.0.1", 263 | "untildify": "^4.0.0", 264 | "wrap-ansi": "^7.0.0" 265 | }, 266 | "engines": { 267 | "node": ">=10.3.0" 268 | } 269 | }, 270 | "node_modules/@ionic/utils-terminal": { 271 | "version": "2.3.5", 272 | "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", 273 | "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", 274 | "dev": true, 275 | "dependencies": { 276 | "@types/slice-ansi": "^4.0.0", 277 | "debug": "^4.0.0", 278 | "signal-exit": "^3.0.3", 279 | "slice-ansi": "^4.0.0", 280 | "string-width": "^4.1.0", 281 | "strip-ansi": "^6.0.0", 282 | "tslib": "^2.0.1", 283 | "untildify": "^4.0.0", 284 | "wrap-ansi": "^7.0.0" 285 | }, 286 | "engines": { 287 | "node": ">=16.0.0" 288 | } 289 | }, 290 | "node_modules/@types/fs-extra": { 291 | "version": "8.1.5", 292 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", 293 | "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", 294 | "dev": true, 295 | "dependencies": { 296 | "@types/node": "*" 297 | } 298 | }, 299 | "node_modules/@types/node": { 300 | "version": "20.14.10", 301 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", 302 | "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", 303 | "dev": true, 304 | "dependencies": { 305 | "undici-types": "~5.26.4" 306 | } 307 | }, 308 | "node_modules/@types/slice-ansi": { 309 | "version": "4.0.0", 310 | "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", 311 | "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", 312 | "dev": true 313 | }, 314 | "node_modules/@xmldom/xmldom": { 315 | "version": "0.8.10", 316 | "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", 317 | "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", 318 | "dev": true, 319 | "engines": { 320 | "node": ">=10.0.0" 321 | } 322 | }, 323 | "node_modules/ansi-regex": { 324 | "version": "5.0.1", 325 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 326 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 327 | "dev": true, 328 | "engines": { 329 | "node": ">=8" 330 | } 331 | }, 332 | "node_modules/ansi-styles": { 333 | "version": "4.3.0", 334 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 335 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 336 | "dev": true, 337 | "dependencies": { 338 | "color-convert": "^2.0.1" 339 | }, 340 | "engines": { 341 | "node": ">=8" 342 | }, 343 | "funding": { 344 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 345 | } 346 | }, 347 | "node_modules/astral-regex": { 348 | "version": "2.0.0", 349 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 350 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 351 | "dev": true, 352 | "engines": { 353 | "node": ">=8" 354 | } 355 | }, 356 | "node_modules/at-least-node": { 357 | "version": "1.0.0", 358 | "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 359 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 360 | "dev": true, 361 | "engines": { 362 | "node": ">= 4.0.0" 363 | } 364 | }, 365 | "node_modules/balanced-match": { 366 | "version": "1.0.2", 367 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 368 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 369 | "dev": true 370 | }, 371 | "node_modules/base64-js": { 372 | "version": "1.5.1", 373 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 374 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 375 | "dev": true, 376 | "funding": [ 377 | { 378 | "type": "github", 379 | "url": "https://github.com/sponsors/feross" 380 | }, 381 | { 382 | "type": "patreon", 383 | "url": "https://www.patreon.com/feross" 384 | }, 385 | { 386 | "type": "consulting", 387 | "url": "https://feross.org/support" 388 | } 389 | ] 390 | }, 391 | "node_modules/big-integer": { 392 | "version": "1.6.52", 393 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 394 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 395 | "dev": true, 396 | "engines": { 397 | "node": ">=0.6" 398 | } 399 | }, 400 | "node_modules/bplist-parser": { 401 | "version": "0.3.2", 402 | "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", 403 | "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", 404 | "dev": true, 405 | "dependencies": { 406 | "big-integer": "1.6.x" 407 | }, 408 | "engines": { 409 | "node": ">= 5.10.0" 410 | } 411 | }, 412 | "node_modules/brace-expansion": { 413 | "version": "2.0.1", 414 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 415 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 416 | "dev": true, 417 | "dependencies": { 418 | "balanced-match": "^1.0.0" 419 | } 420 | }, 421 | "node_modules/buffer-crc32": { 422 | "version": "0.2.13", 423 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 424 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 425 | "dev": true, 426 | "engines": { 427 | "node": "*" 428 | } 429 | }, 430 | "node_modules/capacitor-plugin-incoming-call": { 431 | "resolved": "..", 432 | "link": true 433 | }, 434 | "node_modules/chownr": { 435 | "version": "2.0.0", 436 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 437 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 438 | "dev": true, 439 | "engines": { 440 | "node": ">=10" 441 | } 442 | }, 443 | "node_modules/color-convert": { 444 | "version": "2.0.1", 445 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 446 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 447 | "dev": true, 448 | "dependencies": { 449 | "color-name": "~1.1.4" 450 | }, 451 | "engines": { 452 | "node": ">=7.0.0" 453 | } 454 | }, 455 | "node_modules/color-name": { 456 | "version": "1.1.4", 457 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 458 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 459 | "dev": true 460 | }, 461 | "node_modules/commander": { 462 | "version": "9.5.0", 463 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 464 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 465 | "dev": true, 466 | "engines": { 467 | "node": "^12.20.0 || >=14" 468 | } 469 | }, 470 | "node_modules/cross-spawn": { 471 | "version": "7.0.3", 472 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 473 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 474 | "dev": true, 475 | "dependencies": { 476 | "path-key": "^3.1.0", 477 | "shebang-command": "^2.0.0", 478 | "which": "^2.0.1" 479 | }, 480 | "engines": { 481 | "node": ">= 8" 482 | } 483 | }, 484 | "node_modules/debug": { 485 | "version": "4.3.5", 486 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 487 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 488 | "dev": true, 489 | "dependencies": { 490 | "ms": "2.1.2" 491 | }, 492 | "engines": { 493 | "node": ">=6.0" 494 | }, 495 | "peerDependenciesMeta": { 496 | "supports-color": { 497 | "optional": true 498 | } 499 | } 500 | }, 501 | "node_modules/define-lazy-prop": { 502 | "version": "2.0.0", 503 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 504 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", 505 | "dev": true, 506 | "engines": { 507 | "node": ">=8" 508 | } 509 | }, 510 | "node_modules/elementtree": { 511 | "version": "0.1.7", 512 | "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", 513 | "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", 514 | "dev": true, 515 | "dependencies": { 516 | "sax": "1.1.4" 517 | }, 518 | "engines": { 519 | "node": ">= 0.4.0" 520 | } 521 | }, 522 | "node_modules/emoji-regex": { 523 | "version": "8.0.0", 524 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 525 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 526 | "dev": true 527 | }, 528 | "node_modules/env-paths": { 529 | "version": "2.2.1", 530 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 531 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 532 | "dev": true, 533 | "engines": { 534 | "node": ">=6" 535 | } 536 | }, 537 | "node_modules/fd-slicer": { 538 | "version": "1.1.0", 539 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 540 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 541 | "dev": true, 542 | "dependencies": { 543 | "pend": "~1.2.0" 544 | } 545 | }, 546 | "node_modules/fs-extra": { 547 | "version": "9.1.0", 548 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", 549 | "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", 550 | "dev": true, 551 | "dependencies": { 552 | "at-least-node": "^1.0.0", 553 | "graceful-fs": "^4.2.0", 554 | "jsonfile": "^6.0.1", 555 | "universalify": "^2.0.0" 556 | }, 557 | "engines": { 558 | "node": ">=10" 559 | } 560 | }, 561 | "node_modules/fs-minipass": { 562 | "version": "2.1.0", 563 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 564 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 565 | "dev": true, 566 | "dependencies": { 567 | "minipass": "^3.0.0" 568 | }, 569 | "engines": { 570 | "node": ">= 8" 571 | } 572 | }, 573 | "node_modules/fs-minipass/node_modules/minipass": { 574 | "version": "3.3.6", 575 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 576 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 577 | "dev": true, 578 | "dependencies": { 579 | "yallist": "^4.0.0" 580 | }, 581 | "engines": { 582 | "node": ">=8" 583 | } 584 | }, 585 | "node_modules/fs.realpath": { 586 | "version": "1.0.0", 587 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 588 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 589 | "dev": true 590 | }, 591 | "node_modules/glob": { 592 | "version": "9.3.5", 593 | "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", 594 | "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", 595 | "dev": true, 596 | "dependencies": { 597 | "fs.realpath": "^1.0.0", 598 | "minimatch": "^8.0.2", 599 | "minipass": "^4.2.4", 600 | "path-scurry": "^1.6.1" 601 | }, 602 | "engines": { 603 | "node": ">=16 || 14 >=14.17" 604 | }, 605 | "funding": { 606 | "url": "https://github.com/sponsors/isaacs" 607 | } 608 | }, 609 | "node_modules/graceful-fs": { 610 | "version": "4.2.11", 611 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 612 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 613 | "dev": true 614 | }, 615 | "node_modules/inherits": { 616 | "version": "2.0.4", 617 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 618 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 619 | "dev": true 620 | }, 621 | "node_modules/ini": { 622 | "version": "4.1.3", 623 | "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", 624 | "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", 625 | "dev": true, 626 | "engines": { 627 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 628 | } 629 | }, 630 | "node_modules/is-docker": { 631 | "version": "2.2.1", 632 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 633 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 634 | "dev": true, 635 | "bin": { 636 | "is-docker": "cli.js" 637 | }, 638 | "engines": { 639 | "node": ">=8" 640 | }, 641 | "funding": { 642 | "url": "https://github.com/sponsors/sindresorhus" 643 | } 644 | }, 645 | "node_modules/is-fullwidth-code-point": { 646 | "version": "3.0.0", 647 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 648 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 649 | "dev": true, 650 | "engines": { 651 | "node": ">=8" 652 | } 653 | }, 654 | "node_modules/is-wsl": { 655 | "version": "2.2.0", 656 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 657 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 658 | "dev": true, 659 | "dependencies": { 660 | "is-docker": "^2.0.0" 661 | }, 662 | "engines": { 663 | "node": ">=8" 664 | } 665 | }, 666 | "node_modules/isexe": { 667 | "version": "2.0.0", 668 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 669 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 670 | "dev": true 671 | }, 672 | "node_modules/jsonfile": { 673 | "version": "6.1.0", 674 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 675 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 676 | "dev": true, 677 | "dependencies": { 678 | "universalify": "^2.0.0" 679 | }, 680 | "optionalDependencies": { 681 | "graceful-fs": "^4.1.6" 682 | } 683 | }, 684 | "node_modules/kleur": { 685 | "version": "4.1.5", 686 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 687 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 688 | "dev": true, 689 | "engines": { 690 | "node": ">=6" 691 | } 692 | }, 693 | "node_modules/lru-cache": { 694 | "version": "10.4.3", 695 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 696 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 697 | "dev": true 698 | }, 699 | "node_modules/minimatch": { 700 | "version": "8.0.4", 701 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", 702 | "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", 703 | "dev": true, 704 | "dependencies": { 705 | "brace-expansion": "^2.0.1" 706 | }, 707 | "engines": { 708 | "node": ">=16 || 14 >=14.17" 709 | }, 710 | "funding": { 711 | "url": "https://github.com/sponsors/isaacs" 712 | } 713 | }, 714 | "node_modules/minipass": { 715 | "version": "4.2.8", 716 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", 717 | "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", 718 | "dev": true, 719 | "engines": { 720 | "node": ">=8" 721 | } 722 | }, 723 | "node_modules/minizlib": { 724 | "version": "2.1.2", 725 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 726 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 727 | "dev": true, 728 | "dependencies": { 729 | "minipass": "^3.0.0", 730 | "yallist": "^4.0.0" 731 | }, 732 | "engines": { 733 | "node": ">= 8" 734 | } 735 | }, 736 | "node_modules/minizlib/node_modules/minipass": { 737 | "version": "3.3.6", 738 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 739 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 740 | "dev": true, 741 | "dependencies": { 742 | "yallist": "^4.0.0" 743 | }, 744 | "engines": { 745 | "node": ">=8" 746 | } 747 | }, 748 | "node_modules/mkdirp": { 749 | "version": "1.0.4", 750 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 751 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 752 | "dev": true, 753 | "bin": { 754 | "mkdirp": "bin/cmd.js" 755 | }, 756 | "engines": { 757 | "node": ">=10" 758 | } 759 | }, 760 | "node_modules/ms": { 761 | "version": "2.1.2", 762 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 763 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 764 | "dev": true 765 | }, 766 | "node_modules/native-run": { 767 | "version": "2.0.1", 768 | "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", 769 | "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", 770 | "dev": true, 771 | "dependencies": { 772 | "@ionic/utils-fs": "^3.1.7", 773 | "@ionic/utils-terminal": "^2.3.4", 774 | "bplist-parser": "^0.3.2", 775 | "debug": "^4.3.4", 776 | "elementtree": "^0.1.7", 777 | "ini": "^4.1.1", 778 | "plist": "^3.1.0", 779 | "split2": "^4.2.0", 780 | "through2": "^4.0.2", 781 | "tslib": "^2.6.2", 782 | "yauzl": "^2.10.0" 783 | }, 784 | "bin": { 785 | "native-run": "bin/native-run" 786 | }, 787 | "engines": { 788 | "node": ">=16.0.0" 789 | } 790 | }, 791 | "node_modules/open": { 792 | "version": "8.4.2", 793 | "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", 794 | "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", 795 | "dev": true, 796 | "dependencies": { 797 | "define-lazy-prop": "^2.0.0", 798 | "is-docker": "^2.1.1", 799 | "is-wsl": "^2.2.0" 800 | }, 801 | "engines": { 802 | "node": ">=12" 803 | }, 804 | "funding": { 805 | "url": "https://github.com/sponsors/sindresorhus" 806 | } 807 | }, 808 | "node_modules/path-key": { 809 | "version": "3.1.1", 810 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 811 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 812 | "dev": true, 813 | "engines": { 814 | "node": ">=8" 815 | } 816 | }, 817 | "node_modules/path-scurry": { 818 | "version": "1.11.1", 819 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 820 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 821 | "dev": true, 822 | "dependencies": { 823 | "lru-cache": "^10.2.0", 824 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 825 | }, 826 | "engines": { 827 | "node": ">=16 || 14 >=14.18" 828 | }, 829 | "funding": { 830 | "url": "https://github.com/sponsors/isaacs" 831 | } 832 | }, 833 | "node_modules/path-scurry/node_modules/minipass": { 834 | "version": "7.1.2", 835 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 836 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 837 | "dev": true, 838 | "engines": { 839 | "node": ">=16 || 14 >=14.17" 840 | } 841 | }, 842 | "node_modules/pend": { 843 | "version": "1.2.0", 844 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 845 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 846 | "dev": true 847 | }, 848 | "node_modules/plist": { 849 | "version": "3.1.0", 850 | "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", 851 | "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", 852 | "dev": true, 853 | "dependencies": { 854 | "@xmldom/xmldom": "^0.8.8", 855 | "base64-js": "^1.5.1", 856 | "xmlbuilder": "^15.1.1" 857 | }, 858 | "engines": { 859 | "node": ">=10.4.0" 860 | } 861 | }, 862 | "node_modules/prompts": { 863 | "version": "2.4.2", 864 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 865 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 866 | "dev": true, 867 | "dependencies": { 868 | "kleur": "^3.0.3", 869 | "sisteransi": "^1.0.5" 870 | }, 871 | "engines": { 872 | "node": ">= 6" 873 | } 874 | }, 875 | "node_modules/prompts/node_modules/kleur": { 876 | "version": "3.0.3", 877 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 878 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 879 | "dev": true, 880 | "engines": { 881 | "node": ">=6" 882 | } 883 | }, 884 | "node_modules/readable-stream": { 885 | "version": "3.6.2", 886 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 887 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 888 | "dev": true, 889 | "dependencies": { 890 | "inherits": "^2.0.3", 891 | "string_decoder": "^1.1.1", 892 | "util-deprecate": "^1.0.1" 893 | }, 894 | "engines": { 895 | "node": ">= 6" 896 | } 897 | }, 898 | "node_modules/rimraf": { 899 | "version": "4.4.1", 900 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", 901 | "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", 902 | "dev": true, 903 | "dependencies": { 904 | "glob": "^9.2.0" 905 | }, 906 | "bin": { 907 | "rimraf": "dist/cjs/src/bin.js" 908 | }, 909 | "engines": { 910 | "node": ">=14" 911 | }, 912 | "funding": { 913 | "url": "https://github.com/sponsors/isaacs" 914 | } 915 | }, 916 | "node_modules/safe-buffer": { 917 | "version": "5.2.1", 918 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 919 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 920 | "dev": true, 921 | "funding": [ 922 | { 923 | "type": "github", 924 | "url": "https://github.com/sponsors/feross" 925 | }, 926 | { 927 | "type": "patreon", 928 | "url": "https://www.patreon.com/feross" 929 | }, 930 | { 931 | "type": "consulting", 932 | "url": "https://feross.org/support" 933 | } 934 | ] 935 | }, 936 | "node_modules/sax": { 937 | "version": "1.1.4", 938 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", 939 | "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", 940 | "dev": true 941 | }, 942 | "node_modules/semver": { 943 | "version": "7.6.2", 944 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 945 | "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 946 | "dev": true, 947 | "bin": { 948 | "semver": "bin/semver.js" 949 | }, 950 | "engines": { 951 | "node": ">=10" 952 | } 953 | }, 954 | "node_modules/shebang-command": { 955 | "version": "2.0.0", 956 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 957 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 958 | "dev": true, 959 | "dependencies": { 960 | "shebang-regex": "^3.0.0" 961 | }, 962 | "engines": { 963 | "node": ">=8" 964 | } 965 | }, 966 | "node_modules/shebang-regex": { 967 | "version": "3.0.0", 968 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 969 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 970 | "dev": true, 971 | "engines": { 972 | "node": ">=8" 973 | } 974 | }, 975 | "node_modules/signal-exit": { 976 | "version": "3.0.7", 977 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 978 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 979 | "dev": true 980 | }, 981 | "node_modules/sisteransi": { 982 | "version": "1.0.5", 983 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 984 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 985 | "dev": true 986 | }, 987 | "node_modules/slice-ansi": { 988 | "version": "4.0.0", 989 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 990 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 991 | "dev": true, 992 | "dependencies": { 993 | "ansi-styles": "^4.0.0", 994 | "astral-regex": "^2.0.0", 995 | "is-fullwidth-code-point": "^3.0.0" 996 | }, 997 | "engines": { 998 | "node": ">=10" 999 | }, 1000 | "funding": { 1001 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 1002 | } 1003 | }, 1004 | "node_modules/split2": { 1005 | "version": "4.2.0", 1006 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 1007 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 1008 | "dev": true, 1009 | "engines": { 1010 | "node": ">= 10.x" 1011 | } 1012 | }, 1013 | "node_modules/string_decoder": { 1014 | "version": "1.3.0", 1015 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1016 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1017 | "dev": true, 1018 | "dependencies": { 1019 | "safe-buffer": "~5.2.0" 1020 | } 1021 | }, 1022 | "node_modules/string-width": { 1023 | "version": "4.2.3", 1024 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1025 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "emoji-regex": "^8.0.0", 1029 | "is-fullwidth-code-point": "^3.0.0", 1030 | "strip-ansi": "^6.0.1" 1031 | }, 1032 | "engines": { 1033 | "node": ">=8" 1034 | } 1035 | }, 1036 | "node_modules/strip-ansi": { 1037 | "version": "6.0.1", 1038 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1039 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "ansi-regex": "^5.0.1" 1043 | }, 1044 | "engines": { 1045 | "node": ">=8" 1046 | } 1047 | }, 1048 | "node_modules/tar": { 1049 | "version": "6.2.1", 1050 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 1051 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 1052 | "dev": true, 1053 | "dependencies": { 1054 | "chownr": "^2.0.0", 1055 | "fs-minipass": "^2.0.0", 1056 | "minipass": "^5.0.0", 1057 | "minizlib": "^2.1.1", 1058 | "mkdirp": "^1.0.3", 1059 | "yallist": "^4.0.0" 1060 | }, 1061 | "engines": { 1062 | "node": ">=10" 1063 | } 1064 | }, 1065 | "node_modules/tar/node_modules/minipass": { 1066 | "version": "5.0.0", 1067 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1068 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1069 | "dev": true, 1070 | "engines": { 1071 | "node": ">=8" 1072 | } 1073 | }, 1074 | "node_modules/through2": { 1075 | "version": "4.0.2", 1076 | "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", 1077 | "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", 1078 | "dev": true, 1079 | "dependencies": { 1080 | "readable-stream": "3" 1081 | } 1082 | }, 1083 | "node_modules/tree-kill": { 1084 | "version": "1.2.2", 1085 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1086 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1087 | "dev": true, 1088 | "bin": { 1089 | "tree-kill": "cli.js" 1090 | } 1091 | }, 1092 | "node_modules/tslib": { 1093 | "version": "2.6.3", 1094 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1095 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 1096 | }, 1097 | "node_modules/undici-types": { 1098 | "version": "5.26.5", 1099 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1100 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1101 | "dev": true 1102 | }, 1103 | "node_modules/universalify": { 1104 | "version": "2.0.1", 1105 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1106 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": ">= 10.0.0" 1110 | } 1111 | }, 1112 | "node_modules/untildify": { 1113 | "version": "4.0.0", 1114 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", 1115 | "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": ">=8" 1119 | } 1120 | }, 1121 | "node_modules/util-deprecate": { 1122 | "version": "1.0.2", 1123 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1124 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1125 | "dev": true 1126 | }, 1127 | "node_modules/which": { 1128 | "version": "2.0.2", 1129 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1130 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "isexe": "^2.0.0" 1134 | }, 1135 | "bin": { 1136 | "node-which": "bin/node-which" 1137 | }, 1138 | "engines": { 1139 | "node": ">= 8" 1140 | } 1141 | }, 1142 | "node_modules/wrap-ansi": { 1143 | "version": "7.0.0", 1144 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1145 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1146 | "dev": true, 1147 | "dependencies": { 1148 | "ansi-styles": "^4.0.0", 1149 | "string-width": "^4.1.0", 1150 | "strip-ansi": "^6.0.0" 1151 | }, 1152 | "engines": { 1153 | "node": ">=10" 1154 | }, 1155 | "funding": { 1156 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1157 | } 1158 | }, 1159 | "node_modules/xml2js": { 1160 | "version": "0.5.0", 1161 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", 1162 | "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", 1163 | "dev": true, 1164 | "dependencies": { 1165 | "sax": ">=0.6.0", 1166 | "xmlbuilder": "~11.0.0" 1167 | }, 1168 | "engines": { 1169 | "node": ">=4.0.0" 1170 | } 1171 | }, 1172 | "node_modules/xml2js/node_modules/xmlbuilder": { 1173 | "version": "11.0.1", 1174 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1175 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 1176 | "dev": true, 1177 | "engines": { 1178 | "node": ">=4.0" 1179 | } 1180 | }, 1181 | "node_modules/xmlbuilder": { 1182 | "version": "15.1.1", 1183 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", 1184 | "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", 1185 | "dev": true, 1186 | "engines": { 1187 | "node": ">=8.0" 1188 | } 1189 | }, 1190 | "node_modules/yallist": { 1191 | "version": "4.0.0", 1192 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1193 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1194 | "dev": true 1195 | }, 1196 | "node_modules/yauzl": { 1197 | "version": "2.10.0", 1198 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1199 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1200 | "dev": true, 1201 | "dependencies": { 1202 | "buffer-crc32": "~0.2.3", 1203 | "fd-slicer": "~1.1.0" 1204 | } 1205 | } 1206 | } 1207 | } 1208 | --------------------------------------------------------------------------------