capacitor-motioncal 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CapacitorMotionCal.podspec +23 -0
  2. package/README.md +126 -0
  3. package/android/build.gradle +67 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/java/com/denizak/motioncalibration/MotionCalibrationPlugin.java +248 -0
  6. package/android/src/main/jniLibs/arm64-v8a/libmotioncalibration.so +0 -0
  7. package/android/src/main/jniLibs/armeabi-v7a/libmotioncalibration.so +0 -0
  8. package/android/src/main/jniLibs/x86/libmotioncalibration.so +0 -0
  9. package/android/src/main/jniLibs/x86_64/libmotioncalibration.so +0 -0
  10. package/common/imuread.h +156 -0
  11. package/common/magcal.c +602 -0
  12. package/common/mahony.c +330 -0
  13. package/common/matrix.c +446 -0
  14. package/common/motioncalibration.c +7 -0
  15. package/common/motioncalibration.h +12 -0
  16. package/common/quality.c +257 -0
  17. package/common/rawdata.c +349 -0
  18. package/common/serialdata.c +501 -0
  19. package/common/visualize.c +131 -0
  20. package/dist/docs.json +292 -0
  21. package/dist/esm/definitions.d.ts +122 -0
  22. package/dist/esm/definitions.js +2 -0
  23. package/dist/esm/definitions.js.map +1 -0
  24. package/dist/esm/index.d.ts +4 -0
  25. package/dist/esm/index.js +7 -0
  26. package/dist/esm/index.js.map +1 -0
  27. package/dist/esm/web.d.ts +54 -0
  28. package/dist/esm/web.js +58 -0
  29. package/dist/esm/web.js.map +1 -0
  30. package/dist/plugin.cjs.js +72 -0
  31. package/dist/plugin.cjs.js.map +1 -0
  32. package/dist/plugin.js +75 -0
  33. package/dist/plugin.js.map +1 -0
  34. package/ios/Sources/MotionCalibrationPlugin/MotionCalibration-Bridging-Header.h +26 -0
  35. package/ios/Sources/MotionCalibrationPlugin/MotionCalibrationPlugin.swift +200 -0
  36. package/package.json +83 -0
package/dist/plugin.js ADDED
@@ -0,0 +1,75 @@
1
+ var capacitorMotionCalibration = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const MotionCalibration = core.registerPlugin('MotionCalibration', {
5
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.MotionCalibrationWeb()),
6
+ });
7
+
8
+ class MotionCalibrationWeb extends core.WebPlugin {
9
+ async updateBValue(_options) {
10
+ throw this.unimplemented('Not implemented on web.');
11
+ }
12
+ async getBValue() {
13
+ throw this.unimplemented('Not implemented on web.');
14
+ }
15
+ async isSendCalAvailable() {
16
+ throw this.unimplemented('Not implemented on web.');
17
+ }
18
+ async readDataFromFile(_options) {
19
+ throw this.unimplemented('Not implemented on web.');
20
+ }
21
+ async setResultFilename(_options) {
22
+ throw this.unimplemented('Not implemented on web.');
23
+ }
24
+ async sendCalibration() {
25
+ throw this.unimplemented('Not implemented on web.');
26
+ }
27
+ async getQualitySurfaceGapError() {
28
+ throw this.unimplemented('Not implemented on web.');
29
+ }
30
+ async getQualityMagnitudeVarianceError() {
31
+ throw this.unimplemented('Not implemented on web.');
32
+ }
33
+ async getQualityWobbleError() {
34
+ throw this.unimplemented('Not implemented on web.');
35
+ }
36
+ async getQualitySphericalFitError() {
37
+ throw this.unimplemented('Not implemented on web.');
38
+ }
39
+ async displayCallback() {
40
+ throw this.unimplemented('Not implemented on web.');
41
+ }
42
+ async getCalibrationData() {
43
+ throw this.unimplemented('Not implemented on web.');
44
+ }
45
+ async getDrawPoints() {
46
+ throw this.unimplemented('Not implemented on web.');
47
+ }
48
+ async resetRawData() {
49
+ throw this.unimplemented('Not implemented on web.');
50
+ }
51
+ async getHardIronOffset() {
52
+ throw this.unimplemented('Not implemented on web.');
53
+ }
54
+ async getSoftIronMatrix() {
55
+ throw this.unimplemented('Not implemented on web.');
56
+ }
57
+ async getGeomagneticFieldMagnitude() {
58
+ throw this.unimplemented('Not implemented on web.');
59
+ }
60
+ async clearDrawPoints() {
61
+ throw this.unimplemented('Not implemented on web.');
62
+ }
63
+ }
64
+
65
+ var web = /*#__PURE__*/Object.freeze({
66
+ __proto__: null,
67
+ MotionCalibrationWeb: MotionCalibrationWeb
68
+ });
69
+
70
+ exports.MotionCalibration = MotionCalibration;
71
+
72
+ return exports;
73
+
74
+ })({}, capacitorExports);
75
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst MotionCalibration = registerPlugin('MotionCalibration', {\n web: () => import('./web').then((m) => new m.MotionCalibrationWeb()),\n});\nexport * from './definitions';\nexport { MotionCalibration };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class MotionCalibrationWeb extends WebPlugin {\n async updateBValue(_options) {\n throw this.unimplemented('Not implemented on web.');\n }\n async getBValue() {\n throw this.unimplemented('Not implemented on web.');\n }\n async isSendCalAvailable() {\n throw this.unimplemented('Not implemented on web.');\n }\n async readDataFromFile(_options) {\n throw this.unimplemented('Not implemented on web.');\n }\n async setResultFilename(_options) {\n throw this.unimplemented('Not implemented on web.');\n }\n async sendCalibration() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySurfaceGapError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityMagnitudeVarianceError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityWobbleError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySphericalFitError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async displayCallback() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getCalibrationData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n async resetRawData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getHardIronOffset() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getSoftIronMatrix() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeomagneticFieldMagnitude() {\n throw this.unimplemented('Not implemented on web.');\n }\n async clearDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,iBAAiB,GAAGA,mBAAc,CAAC,mBAAmB,EAAE;IAC9D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACxE,CAAC;;ICFM,MAAM,oBAAoB,SAASC,cAAS,CAAC;IACpD,IAAI,MAAM,YAAY,CAAC,QAAQ,EAAE;IACjC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,SAAS,GAAG;IACtB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,gBAAgB,CAAC,QAAQ,EAAE;IACrC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,iBAAiB,CAAC,QAAQ,EAAE;IACtC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,yBAAyB,GAAG;IACtC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,qBAAqB,GAAG;IAClC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,2BAA2B,GAAG;IACxC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,aAAa,GAAG;IAC1B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,YAAY,GAAG;IACzB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,4BAA4B,GAAG;IACzC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ;;;;;;;;;;;;;;;"}
@@ -0,0 +1,26 @@
1
+ #ifndef MotionCalibration_Bridging_Header_h
2
+ #define MotionCalibration_Bridging_Header_h
3
+
4
+ #include "motioncalibration.h"
5
+ #include "imuread.h"
6
+
7
+ // Additional declarations for Swift compatibility
8
+ extern int read_ipc_file_data(const char *filename);
9
+ extern void set_result_filename(const char *filename);
10
+ extern void raw_data_reset(void);
11
+ extern int send_calibration(void);
12
+ extern float quality_surface_gap_error(void);
13
+ extern float quality_magnitude_variance_error(void);
14
+ extern float quality_wobble_error(void);
15
+ extern float quality_spherical_fit_error(void);
16
+ extern void display_callback(void);
17
+ extern const uint8_t* get_calibration_data(void);
18
+ extern float* get_draw_points(void);
19
+ extern int get_draw_points_count(void);
20
+ extern void clear_draw_points(void);
21
+ extern void get_hard_iron_offset(float V[3]);
22
+ extern void get_soft_iron_matrix(float invW[3][3]);
23
+ extern float get_geomagnetic_field_magnitude(void);
24
+ extern short is_send_cal_available(void);
25
+
26
+ #endif /* MotionCalibration_Bridging_Header_h */
@@ -0,0 +1,200 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc(MotionCalibrationPlugin)
5
+ public class MotionCalibrationPlugin: CAPPlugin, CAPBridgedPlugin {
6
+ public let identifier = "MotionCalibrationPlugin"
7
+ public let jsName = "MotionCalibration"
8
+ public let pluginMethods: [CAPPluginMethod] = [
9
+ CAPPluginMethod(name: "updateBValue", returnType: CAPPluginReturnPromise),
10
+ CAPPluginMethod(name: "getBValue", returnType: CAPPluginReturnPromise),
11
+ CAPPluginMethod(name: "isSendCalAvailable", returnType: CAPPluginReturnPromise),
12
+ CAPPluginMethod(name: "readDataFromFile", returnType: CAPPluginReturnPromise),
13
+ CAPPluginMethod(name: "setResultFilename", returnType: CAPPluginReturnPromise),
14
+ CAPPluginMethod(name: "sendCalibration", returnType: CAPPluginReturnPromise),
15
+ CAPPluginMethod(name: "getQualitySurfaceGapError", returnType: CAPPluginReturnPromise),
16
+ CAPPluginMethod(name: "getQualityMagnitudeVarianceError", returnType: CAPPluginReturnPromise),
17
+ CAPPluginMethod(name: "getQualityWobbleError", returnType: CAPPluginReturnPromise),
18
+ CAPPluginMethod(name: "getQualitySphericalFitError", returnType: CAPPluginReturnPromise),
19
+ CAPPluginMethod(name: "displayCallback", returnType: CAPPluginReturnPromise),
20
+ CAPPluginMethod(name: "getCalibrationData", returnType: CAPPluginReturnPromise),
21
+ CAPPluginMethod(name: "getDrawPoints", returnType: CAPPluginReturnPromise),
22
+ CAPPluginMethod(name: "resetRawData", returnType: CAPPluginReturnPromise),
23
+ CAPPluginMethod(name: "getHardIronOffset", returnType: CAPPluginReturnPromise),
24
+ CAPPluginMethod(name: "getSoftIronMatrix", returnType: CAPPluginReturnPromise),
25
+ CAPPluginMethod(name: "getGeomagneticFieldMagnitude", returnType: CAPPluginReturnPromise),
26
+ CAPPluginMethod(name: "clearDrawPoints", returnType: CAPPluginReturnPromise)
27
+ ]
28
+
29
+ public override func load() {
30
+ // Initialize the C struct if needed
31
+ motioncal.B = 0.0
32
+ }
33
+
34
+ @objc func updateBValue(_ call: CAPPluginCall) {
35
+ guard let value = call.getFloat("value") else {
36
+ call.reject("Value is required")
37
+ return
38
+ }
39
+ motioncal.B = value * 2
40
+ call.resolve()
41
+ }
42
+
43
+ @objc func getBValue(_ call: CAPPluginCall) {
44
+ let bValue = motioncal.B
45
+ call.resolve(["value": bValue])
46
+ }
47
+
48
+ @objc func isSendCalAvailable(_ call: CAPPluginCall) {
49
+ let available = is_send_cal_available()
50
+ call.resolve(["available": Int(available)])
51
+ }
52
+
53
+ @objc func readDataFromFile(_ call: CAPPluginCall) {
54
+ guard let filename = call.getString("filename") else {
55
+ call.reject("Filename is required")
56
+ return
57
+ }
58
+
59
+ let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
60
+ let fullPath = (documentsPath as NSString).appendingPathComponent(filename)
61
+
62
+ let result = read_ipc_file_data(fullPath)
63
+ call.resolve(["result": Int(result)])
64
+ }
65
+
66
+ @objc func setResultFilename(_ call: CAPPluginCall) {
67
+ guard let filename = call.getString("filename") else {
68
+ call.reject("Filename is required")
69
+ return
70
+ }
71
+
72
+ let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
73
+ let fullPath = (documentsPath as NSString).appendingPathComponent(filename)
74
+
75
+ set_result_filename(fullPath)
76
+ call.resolve()
77
+ }
78
+
79
+ @objc func sendCalibration(_ call: CAPPluginCall) {
80
+ DispatchQueue.global(qos: .userInitiated).async {
81
+ let result = send_calibration()
82
+ raw_data_reset()
83
+
84
+ DispatchQueue.main.async {
85
+ call.resolve(["result": Int(result)])
86
+ }
87
+ }
88
+ }
89
+
90
+ @objc func getQualitySurfaceGapError(_ call: CAPPluginCall) {
91
+ var error = quality_surface_gap_error()
92
+ if error.isNaN {
93
+ error = 100.0
94
+ }
95
+ call.resolve(["error": error])
96
+ }
97
+
98
+ @objc func getQualityMagnitudeVarianceError(_ call: CAPPluginCall) {
99
+ var error = quality_magnitude_variance_error()
100
+ if error.isNaN {
101
+ error = 100.0
102
+ }
103
+ call.resolve(["error": error])
104
+ }
105
+
106
+ @objc func getQualityWobbleError(_ call: CAPPluginCall) {
107
+ var error = quality_wobble_error()
108
+ if error.isNaN {
109
+ error = 100.0
110
+ }
111
+ call.resolve(["error": error])
112
+ }
113
+
114
+ @objc func getQualitySphericalFitError(_ call: CAPPluginCall) {
115
+ var error = quality_spherical_fit_error()
116
+ if error.isNaN {
117
+ error = 100.0
118
+ }
119
+ call.resolve(["error": error])
120
+ }
121
+
122
+ @objc func displayCallback(_ call: CAPPluginCall) {
123
+ display_callback()
124
+ call.resolve()
125
+ }
126
+
127
+ @objc func getCalibrationData(_ call: CAPPluginCall) {
128
+ if let dataPtr = get_calibration_data() {
129
+ // Calibration data is 68 bytes (matching Obj-C implementation)
130
+ let data = Data(bytes: dataPtr, count: 68)
131
+ let base64String = data.base64EncodedString()
132
+ call.resolve(["data": base64String])
133
+ } else {
134
+ call.reject("No calibration data available")
135
+ }
136
+ }
137
+
138
+ @objc func getDrawPoints(_ call: CAPPluginCall) {
139
+ DispatchQueue.global(qos: .userInitiated).async {
140
+ let pointsPtr = get_draw_points()
141
+ let count = get_draw_points_count()
142
+
143
+ var points: [[Float]] = []
144
+ if let ptr = pointsPtr, count > 0 {
145
+ for i in 0..<Int(count) {
146
+ let x = ptr[i * 3]
147
+ let y = ptr[i * 3 + 1]
148
+ let z = ptr[i * 3 + 2]
149
+ points.append([x, y, z])
150
+ }
151
+ }
152
+
153
+ DispatchQueue.main.async {
154
+ call.resolve(["points": points])
155
+ }
156
+ }
157
+ }
158
+
159
+ @objc func resetRawData(_ call: CAPPluginCall) {
160
+ raw_data_reset()
161
+ call.resolve()
162
+ }
163
+
164
+ @objc func getHardIronOffset(_ call: CAPPluginCall) {
165
+ var V: [Float] = [0, 0, 0]
166
+ get_hard_iron_offset(&V)
167
+ call.resolve(["offset": V])
168
+ }
169
+
170
+ @objc func getSoftIronMatrix(_ call: CAPPluginCall) {
171
+ // C expects float[3][3], which Swift imports as pointer to tuple (Float, Float, Float)
172
+ var matrix: ((Float, Float, Float), (Float, Float, Float), (Float, Float, Float)) = (
173
+ (0, 0, 0),
174
+ (0, 0, 0),
175
+ (0, 0, 0)
176
+ )
177
+ withUnsafeMutablePointer(to: &matrix) { ptr in
178
+ ptr.withMemoryRebound(to: (Float, Float, Float).self, capacity: 3) { rowPtr in
179
+ get_soft_iron_matrix(rowPtr)
180
+ }
181
+ }
182
+ // Convert tuple to 2D array for JSON response
183
+ let invW: [[Float]] = [
184
+ [matrix.0.0, matrix.0.1, matrix.0.2],
185
+ [matrix.1.0, matrix.1.1, matrix.1.2],
186
+ [matrix.2.0, matrix.2.1, matrix.2.2]
187
+ ]
188
+ call.resolve(["matrix": invW])
189
+ }
190
+
191
+ @objc func getGeomagneticFieldMagnitude(_ call: CAPPluginCall) {
192
+ let magnitude = get_geomagnetic_field_magnitude()
193
+ call.resolve(["magnitude": magnitude])
194
+ }
195
+
196
+ @objc func clearDrawPoints(_ call: CAPPluginCall) {
197
+ clear_draw_points()
198
+ call.resolve()
199
+ }
200
+ }
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "capacitor-motioncal",
3
+ "version": "0.0.1",
4
+ "description": "Capacitor plugin for motion calibration using magnetometer data",
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/Sources/",
14
+ "common/",
15
+ "CapacitorMotionCal.podspec"
16
+ ],
17
+ "author": "denizak",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/denizak/motioncal-capacitor"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/denizak/motioncal-capacitor/issues"
25
+ },
26
+ "keywords": [
27
+ "capacitor",
28
+ "plugin",
29
+ "native",
30
+ "magnetometer",
31
+ "calibration",
32
+ "motion"
33
+ ],
34
+ "scripts": {
35
+ "verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
36
+ "verify:ios": "cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..",
37
+ "verify:android": "cd android && ./gradlew clean build test && cd ..",
38
+ "verify:web": "npm run build",
39
+ "lint": "npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint",
40
+ "fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format",
41
+ "eslint": "eslint . --ext ts",
42
+ "prettier": "prettier \"**/*.{css,html,ts,js,java}\"",
43
+ "swiftlint": "node-swiftlint",
44
+ "docgen": "docgen --api MotionCalibrationPlugin --output-readme README.md --output-json dist/docs.json",
45
+ "build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
46
+ "clean": "rimraf ./dist",
47
+ "watch": "tsc --watch",
48
+ "prepublishOnly": "npm run build"
49
+ },
50
+ "devDependencies": {
51
+ "@capacitor/android": "^6.0.0",
52
+ "@capacitor/core": "^6.0.0",
53
+ "@capacitor/docgen": "^0.2.2",
54
+ "@capacitor/ios": "^6.0.0",
55
+ "@ionic/eslint-config": "^0.4.0",
56
+ "@ionic/prettier-config": "^4.0.0",
57
+ "@ionic/swiftlint-config": "^2.0.0",
58
+ "@rollup/plugin-node-resolve": "^15.2.3",
59
+ "eslint": "^8.57.0",
60
+ "prettier": "^3.2.5",
61
+ "prettier-plugin-java": "^2.6.0",
62
+ "rimraf": "^5.0.5",
63
+ "rollup": "^4.12.0",
64
+ "swiftlint": "^1.0.2",
65
+ "typescript": "^5.4.2"
66
+ },
67
+ "peerDependencies": {
68
+ "@capacitor/core": "^6.0.0"
69
+ },
70
+ "prettier": "@ionic/prettier-config",
71
+ "swiftlint": "@ionic/swiftlint-config",
72
+ "eslintConfig": {
73
+ "extends": "@ionic/eslint-config/recommended"
74
+ },
75
+ "capacitor": {
76
+ "ios": {
77
+ "src": "ios"
78
+ },
79
+ "android": {
80
+ "src": "android"
81
+ }
82
+ }
83
+ }