@capacitor-community/bluetooth-le 8.0.1 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapacitorCommunityBluetoothLe.podspec +17 -17
- package/LICENSE +21 -21
- package/Package.swift +27 -27
- package/README.md +2 -1
- package/android/build.gradle +73 -73
- package/android/src/main/AndroidManifest.xml +22 -22
- package/android/src/main/java/com/capacitorjs/community/plugins/bluetoothle/BluetoothLe.kt +1094 -1094
- package/android/src/main/java/com/capacitorjs/community/plugins/bluetoothle/Conversion.kt +51 -51
- package/android/src/main/java/com/capacitorjs/community/plugins/bluetoothle/Device.kt +771 -771
- package/android/src/main/java/com/capacitorjs/community/plugins/bluetoothle/DeviceList.kt +28 -28
- package/android/src/main/java/com/capacitorjs/community/plugins/bluetoothle/DeviceScanner.kt +189 -189
- package/dist/docs.json +43 -43
- package/dist/esm/bleClient.d.ts +278 -278
- package/dist/esm/bleClient.js +361 -361
- package/dist/esm/bleClient.js.map +1 -1
- package/dist/esm/config.d.ts +53 -53
- package/dist/esm/config.js +2 -2
- package/dist/esm/conversion.d.ts +56 -56
- package/dist/esm/conversion.js +134 -134
- package/dist/esm/conversion.js.map +1 -1
- package/dist/esm/definitions.d.ts +352 -352
- package/dist/esm/definitions.js +42 -42
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +5 -5
- package/dist/esm/plugin.d.ts +2 -2
- package/dist/esm/plugin.js +4 -4
- package/dist/esm/queue.d.ts +3 -3
- package/dist/esm/queue.js +17 -17
- package/dist/esm/timeout.d.ts +1 -1
- package/dist/esm/timeout.js +9 -9
- package/dist/esm/validators.d.ts +1 -1
- package/dist/esm/validators.js +11 -11
- package/dist/esm/web.d.ts +57 -57
- package/dist/esm/web.js +403 -403
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +964 -964
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +964 -964
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/BluetoothLe/Conversion.swift +83 -83
- package/ios/Sources/BluetoothLe/Device.swift +422 -423
- package/ios/Sources/BluetoothLe/DeviceListView.swift +121 -121
- package/ios/Sources/BluetoothLe/DeviceManager.swift +409 -415
- package/ios/Sources/BluetoothLe/Logging.swift +8 -8
- package/ios/Sources/BluetoothLe/Plugin.swift +768 -763
- package/ios/Sources/BluetoothLe/ScanFilters.swift +114 -114
- package/ios/Sources/BluetoothLe/ThreadSafeDictionary.swift +61 -15
- package/ios/Tests/BluetoothLeTests/ConversionTests.swift +55 -55
- package/ios/Tests/BluetoothLeTests/PluginTests.swift +27 -27
- package/ios/Tests/BluetoothLeTests/ScanFiltersTests.swift +153 -153
- package/package.json +114 -114
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
import XCTest
|
|
2
|
-
import CoreBluetooth
|
|
3
|
-
@testable import BluetoothLe
|
|
4
|
-
|
|
5
|
-
class ScanFiltersTests: XCTestCase {
|
|
6
|
-
|
|
7
|
-
// MARK: - Manufacturer Data Filter Tests
|
|
8
|
-
|
|
9
|
-
func testManufacturerDataFilter_InvalidMaskLength() {
|
|
10
|
-
// Test that when mask.count != dataPrefix.count, the filter is skipped
|
|
11
|
-
// and returns false (no match)
|
|
12
|
-
|
|
13
|
-
// Create manufacturer data: 2 bytes company ID + 4 bytes payload
|
|
14
|
-
var manufacturerData = Data()
|
|
15
|
-
manufacturerData.append(contentsOf: [0x4C, 0x00]) // Apple company ID (0x004C in little-endian)
|
|
16
|
-
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04]) // 4 bytes payload
|
|
17
|
-
|
|
18
|
-
let advertisementData: [String: Any] = [
|
|
19
|
-
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
20
|
-
]
|
|
21
|
-
|
|
22
|
-
// Create filter with dataPrefix of 4 bytes but mask of only 2 bytes
|
|
23
|
-
// This should be skipped due to invalid mask length
|
|
24
|
-
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
25
|
-
let mask = Data([0xFF, 0xFF]) // Only 2 bytes - invalid!
|
|
26
|
-
|
|
27
|
-
let filter = ManufacturerDataFilter(
|
|
28
|
-
companyIdentifier: 0x004C,
|
|
29
|
-
dataPrefix: dataPrefix,
|
|
30
|
-
mask: mask
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
// Should return false because the filter is skipped due to invalid mask
|
|
34
|
-
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
35
|
-
XCTAssertFalse(result, "Should return false when mask length doesn't match dataPrefix length")
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
func testManufacturerDataFilter_ValidMaskLength() {
|
|
39
|
-
// Test the valid case where mask and dataPrefix have the same length
|
|
40
|
-
var manufacturerData = Data()
|
|
41
|
-
manufacturerData.append(contentsOf: [0x4C, 0x00]) // Apple company ID
|
|
42
|
-
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04])
|
|
43
|
-
|
|
44
|
-
let advertisementData: [String: Any] = [
|
|
45
|
-
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
// Mask and dataPrefix have the same length - should work correctly
|
|
49
|
-
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04])
|
|
50
|
-
let mask = Data([0xFF, 0xFF, 0xFF, 0xFF]) // Same length as dataPrefix
|
|
51
|
-
|
|
52
|
-
let filter = ManufacturerDataFilter(
|
|
53
|
-
companyIdentifier: 0x004C,
|
|
54
|
-
dataPrefix: dataPrefix,
|
|
55
|
-
mask: mask
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
59
|
-
XCTAssertTrue(result, "Should match when mask and dataPrefix have same length")
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
func testManufacturerDataFilter_NoMask() {
|
|
63
|
-
// Test without a mask - should use simple prefix matching
|
|
64
|
-
var manufacturerData = Data()
|
|
65
|
-
manufacturerData.append(contentsOf: [0x4C, 0x00])
|
|
66
|
-
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04])
|
|
67
|
-
|
|
68
|
-
let advertisementData: [String: Any] = [
|
|
69
|
-
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
70
|
-
]
|
|
71
|
-
|
|
72
|
-
let dataPrefix = Data([0x01, 0x02])
|
|
73
|
-
let filter = ManufacturerDataFilter(
|
|
74
|
-
companyIdentifier: 0x004C,
|
|
75
|
-
dataPrefix: dataPrefix,
|
|
76
|
-
mask: nil // No mask
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
80
|
-
XCTAssertTrue(result, "Should match with prefix matching when no mask is provided")
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// MARK: - Service Data Filter Tests
|
|
84
|
-
|
|
85
|
-
func testServiceDataFilter_InvalidMaskLength() {
|
|
86
|
-
// Test that when mask.count != dataPrefix.count, the filter is skipped
|
|
87
|
-
// and returns false (no match)
|
|
88
|
-
|
|
89
|
-
let serviceUUID = CBUUID(string: "1234")
|
|
90
|
-
let serviceData = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
91
|
-
|
|
92
|
-
let advertisementData: [String: Any] = [
|
|
93
|
-
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
94
|
-
]
|
|
95
|
-
|
|
96
|
-
// Create filter with dataPrefix of 4 bytes but mask of only 2 bytes
|
|
97
|
-
// This should be skipped due to invalid mask length
|
|
98
|
-
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
99
|
-
let mask = Data([0xFF, 0xFF]) // Only 2 bytes - invalid!
|
|
100
|
-
|
|
101
|
-
let filter = ServiceDataFilter(
|
|
102
|
-
serviceUuid: serviceUUID,
|
|
103
|
-
dataPrefix: dataPrefix,
|
|
104
|
-
mask: mask
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
// Should return false because the filter is skipped due to invalid mask
|
|
108
|
-
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
109
|
-
XCTAssertFalse(result, "Should return false when mask length doesn't match dataPrefix length")
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
func testServiceDataFilter_ValidMaskLength() {
|
|
113
|
-
// Test the valid case where mask and dataPrefix have the same length
|
|
114
|
-
let serviceUUID = CBUUID(string: "1234")
|
|
115
|
-
let serviceData = Data([0x01, 0x02, 0x03, 0x04])
|
|
116
|
-
|
|
117
|
-
let advertisementData: [String: Any] = [
|
|
118
|
-
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
119
|
-
]
|
|
120
|
-
|
|
121
|
-
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04])
|
|
122
|
-
let mask = Data([0xFF, 0xFF, 0xFF, 0xFF]) // Same length
|
|
123
|
-
|
|
124
|
-
let filter = ServiceDataFilter(
|
|
125
|
-
serviceUuid: serviceUUID,
|
|
126
|
-
dataPrefix: dataPrefix,
|
|
127
|
-
mask: mask
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
131
|
-
XCTAssertTrue(result, "Should match when mask and dataPrefix have same length")
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
func testServiceDataFilter_NoMask() {
|
|
135
|
-
// Test without a mask
|
|
136
|
-
let serviceUUID = CBUUID(string: "1234")
|
|
137
|
-
let serviceData = Data([0x01, 0x02, 0x03, 0x04])
|
|
138
|
-
|
|
139
|
-
let advertisementData: [String: Any] = [
|
|
140
|
-
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
141
|
-
]
|
|
142
|
-
|
|
143
|
-
let dataPrefix = Data([0x01, 0x02])
|
|
144
|
-
let filter = ServiceDataFilter(
|
|
145
|
-
serviceUuid: serviceUUID,
|
|
146
|
-
dataPrefix: dataPrefix,
|
|
147
|
-
mask: nil
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
151
|
-
XCTAssertTrue(result, "Should match with prefix matching when no mask is provided")
|
|
152
|
-
}
|
|
153
|
-
}
|
|
1
|
+
import XCTest
|
|
2
|
+
import CoreBluetooth
|
|
3
|
+
@testable import BluetoothLe
|
|
4
|
+
|
|
5
|
+
class ScanFiltersTests: XCTestCase {
|
|
6
|
+
|
|
7
|
+
// MARK: - Manufacturer Data Filter Tests
|
|
8
|
+
|
|
9
|
+
func testManufacturerDataFilter_InvalidMaskLength() {
|
|
10
|
+
// Test that when mask.count != dataPrefix.count, the filter is skipped
|
|
11
|
+
// and returns false (no match)
|
|
12
|
+
|
|
13
|
+
// Create manufacturer data: 2 bytes company ID + 4 bytes payload
|
|
14
|
+
var manufacturerData = Data()
|
|
15
|
+
manufacturerData.append(contentsOf: [0x4C, 0x00]) // Apple company ID (0x004C in little-endian)
|
|
16
|
+
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04]) // 4 bytes payload
|
|
17
|
+
|
|
18
|
+
let advertisementData: [String: Any] = [
|
|
19
|
+
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
// Create filter with dataPrefix of 4 bytes but mask of only 2 bytes
|
|
23
|
+
// This should be skipped due to invalid mask length
|
|
24
|
+
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
25
|
+
let mask = Data([0xFF, 0xFF]) // Only 2 bytes - invalid!
|
|
26
|
+
|
|
27
|
+
let filter = ManufacturerDataFilter(
|
|
28
|
+
companyIdentifier: 0x004C,
|
|
29
|
+
dataPrefix: dataPrefix,
|
|
30
|
+
mask: mask
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
// Should return false because the filter is skipped due to invalid mask
|
|
34
|
+
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
35
|
+
XCTAssertFalse(result, "Should return false when mask length doesn't match dataPrefix length")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func testManufacturerDataFilter_ValidMaskLength() {
|
|
39
|
+
// Test the valid case where mask and dataPrefix have the same length
|
|
40
|
+
var manufacturerData = Data()
|
|
41
|
+
manufacturerData.append(contentsOf: [0x4C, 0x00]) // Apple company ID
|
|
42
|
+
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04])
|
|
43
|
+
|
|
44
|
+
let advertisementData: [String: Any] = [
|
|
45
|
+
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
// Mask and dataPrefix have the same length - should work correctly
|
|
49
|
+
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04])
|
|
50
|
+
let mask = Data([0xFF, 0xFF, 0xFF, 0xFF]) // Same length as dataPrefix
|
|
51
|
+
|
|
52
|
+
let filter = ManufacturerDataFilter(
|
|
53
|
+
companyIdentifier: 0x004C,
|
|
54
|
+
dataPrefix: dataPrefix,
|
|
55
|
+
mask: mask
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
59
|
+
XCTAssertTrue(result, "Should match when mask and dataPrefix have same length")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func testManufacturerDataFilter_NoMask() {
|
|
63
|
+
// Test without a mask - should use simple prefix matching
|
|
64
|
+
var manufacturerData = Data()
|
|
65
|
+
manufacturerData.append(contentsOf: [0x4C, 0x00])
|
|
66
|
+
manufacturerData.append(contentsOf: [0x01, 0x02, 0x03, 0x04])
|
|
67
|
+
|
|
68
|
+
let advertisementData: [String: Any] = [
|
|
69
|
+
CBAdvertisementDataManufacturerDataKey: manufacturerData
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
let dataPrefix = Data([0x01, 0x02])
|
|
73
|
+
let filter = ManufacturerDataFilter(
|
|
74
|
+
companyIdentifier: 0x004C,
|
|
75
|
+
dataPrefix: dataPrefix,
|
|
76
|
+
mask: nil // No mask
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
let result = ScanFilterUtils.passesManufacturerDataFilter(advertisementData, filters: [filter])
|
|
80
|
+
XCTAssertTrue(result, "Should match with prefix matching when no mask is provided")
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// MARK: - Service Data Filter Tests
|
|
84
|
+
|
|
85
|
+
func testServiceDataFilter_InvalidMaskLength() {
|
|
86
|
+
// Test that when mask.count != dataPrefix.count, the filter is skipped
|
|
87
|
+
// and returns false (no match)
|
|
88
|
+
|
|
89
|
+
let serviceUUID = CBUUID(string: "1234")
|
|
90
|
+
let serviceData = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
91
|
+
|
|
92
|
+
let advertisementData: [String: Any] = [
|
|
93
|
+
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
// Create filter with dataPrefix of 4 bytes but mask of only 2 bytes
|
|
97
|
+
// This should be skipped due to invalid mask length
|
|
98
|
+
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04]) // 4 bytes
|
|
99
|
+
let mask = Data([0xFF, 0xFF]) // Only 2 bytes - invalid!
|
|
100
|
+
|
|
101
|
+
let filter = ServiceDataFilter(
|
|
102
|
+
serviceUuid: serviceUUID,
|
|
103
|
+
dataPrefix: dataPrefix,
|
|
104
|
+
mask: mask
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
// Should return false because the filter is skipped due to invalid mask
|
|
108
|
+
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
109
|
+
XCTAssertFalse(result, "Should return false when mask length doesn't match dataPrefix length")
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func testServiceDataFilter_ValidMaskLength() {
|
|
113
|
+
// Test the valid case where mask and dataPrefix have the same length
|
|
114
|
+
let serviceUUID = CBUUID(string: "1234")
|
|
115
|
+
let serviceData = Data([0x01, 0x02, 0x03, 0x04])
|
|
116
|
+
|
|
117
|
+
let advertisementData: [String: Any] = [
|
|
118
|
+
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
let dataPrefix = Data([0x01, 0x02, 0x03, 0x04])
|
|
122
|
+
let mask = Data([0xFF, 0xFF, 0xFF, 0xFF]) // Same length
|
|
123
|
+
|
|
124
|
+
let filter = ServiceDataFilter(
|
|
125
|
+
serviceUuid: serviceUUID,
|
|
126
|
+
dataPrefix: dataPrefix,
|
|
127
|
+
mask: mask
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
131
|
+
XCTAssertTrue(result, "Should match when mask and dataPrefix have same length")
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
func testServiceDataFilter_NoMask() {
|
|
135
|
+
// Test without a mask
|
|
136
|
+
let serviceUUID = CBUUID(string: "1234")
|
|
137
|
+
let serviceData = Data([0x01, 0x02, 0x03, 0x04])
|
|
138
|
+
|
|
139
|
+
let advertisementData: [String: Any] = [
|
|
140
|
+
CBAdvertisementDataServiceDataKey: [serviceUUID: serviceData]
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
let dataPrefix = Data([0x01, 0x02])
|
|
144
|
+
let filter = ServiceDataFilter(
|
|
145
|
+
serviceUuid: serviceUUID,
|
|
146
|
+
dataPrefix: dataPrefix,
|
|
147
|
+
mask: nil
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
let result = ScanFilterUtils.passesServiceDataFilter(advertisementData, filters: [filter])
|
|
151
|
+
XCTAssertTrue(result, "Should match with prefix matching when no mask is provided")
|
|
152
|
+
}
|
|
153
|
+
}
|
package/package.json
CHANGED
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@capacitor-community/bluetooth-le",
|
|
3
|
-
"version": "8.0.
|
|
4
|
-
"description": "Capacitor plugin for Bluetooth Low Energy ",
|
|
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
|
-
"scripts": {
|
|
10
|
-
"verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
|
|
11
|
-
"verify:ios": "xcodebuild clean build test -scheme CapacitorCommunityBluetoothLe -destination 'platform=iOS Simulator,name=iPhone
|
|
12
|
-
"verify:android": "cd android && ./gradlew clean build test && cd ..",
|
|
13
|
-
"verify:web": "npm run test:coverage && npm run build",
|
|
14
|
-
"lint": "npm run eslint && npm run prettier -- --check && npm run lint:ios",
|
|
15
|
-
"lint:ios": "npm run swiftlint -- lint ios",
|
|
16
|
-
"lint:android": "cd android && ./gradlew clean lint && cd ..",
|
|
17
|
-
"fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- lint --fix --format ios",
|
|
18
|
-
"eslint": "eslint . --ext ts",
|
|
19
|
-
"prettier": "prettier \"**/*.{css,html,ts,js}\"",
|
|
20
|
-
"swiftlint": "node-swiftlint",
|
|
21
|
-
"docgen": "docgen --api BleClientInterface --output-readme README.md --output-json dist/docs.json",
|
|
22
|
-
"postdocgen": "node scripts/fix-docgen-types.js && prettier README.md --write",
|
|
23
|
-
"build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
|
|
24
|
-
"clean": "rimraf ./dist",
|
|
25
|
-
"watch": "tsc --watch",
|
|
26
|
-
"prepublishOnly": "npm run build",
|
|
27
|
-
"test": "jest",
|
|
28
|
-
"test:coverage": "jest --coverage",
|
|
29
|
-
"test:watch": "jest --watch",
|
|
30
|
-
"version:dev": "npm version --no-git-tag-version $(git describe)",
|
|
31
|
-
"release": "standard-version",
|
|
32
|
-
"release:minor": "standard-version -r minor",
|
|
33
|
-
"release:major": "standard-version -r major"
|
|
34
|
-
},
|
|
35
|
-
"author": "pwespi",
|
|
36
|
-
"license": "MIT",
|
|
37
|
-
"dependencies": {
|
|
38
|
-
"@types/web-bluetooth": "^0.0.20"
|
|
39
|
-
},
|
|
40
|
-
"devDependencies": {
|
|
41
|
-
"@capacitor/android": "^8.0.0",
|
|
42
|
-
"@capacitor/cli": "^8.0.0",
|
|
43
|
-
"@capacitor/core": "^8.0.0",
|
|
44
|
-
"@capacitor/docgen": "^0.3.1",
|
|
45
|
-
"@capacitor/ios": "^8.0.0",
|
|
46
|
-
"@ionic/eslint-config": "^0.4.0",
|
|
47
|
-
"@ionic/prettier-config": "^4.0.0",
|
|
48
|
-
"@ionic/swiftlint-config": "^2.0.0",
|
|
49
|
-
"@types/jest": "^29.2.5",
|
|
50
|
-
"eslint": "^8.57.1",
|
|
51
|
-
"jest": "^29.3.1",
|
|
52
|
-
"jest-environment-jsdom": "^29.3.1",
|
|
53
|
-
"prettier": "^3.6.2",
|
|
54
|
-
"rimraf": "^6.1.0",
|
|
55
|
-
"rollup": "^4.53.2",
|
|
56
|
-
"standard-version": "^9.5.0",
|
|
57
|
-
"swiftlint": "^2.0.0",
|
|
58
|
-
"ts-jest": "^29.0.3",
|
|
59
|
-
"typescript": "^5.9.3",
|
|
60
|
-
"prettier-plugin-java": "^2.7.7"
|
|
61
|
-
},
|
|
62
|
-
"peerDependencies": {
|
|
63
|
-
"@capacitor/core": ">=8.0.0"
|
|
64
|
-
},
|
|
65
|
-
"files": [
|
|
66
|
-
"android/src/main/",
|
|
67
|
-
"android/build.gradle",
|
|
68
|
-
"dist/",
|
|
69
|
-
"ios/Sources",
|
|
70
|
-
"ios/Tests",
|
|
71
|
-
"Package.swift",
|
|
72
|
-
"CapacitorCommunityBluetoothLe.podspec"
|
|
73
|
-
],
|
|
74
|
-
"keywords": [
|
|
75
|
-
"capacitor",
|
|
76
|
-
"plugin",
|
|
77
|
-
"native",
|
|
78
|
-
"bluetooth"
|
|
79
|
-
],
|
|
80
|
-
"capacitor": {
|
|
81
|
-
"ios": {
|
|
82
|
-
"src": "ios"
|
|
83
|
-
},
|
|
84
|
-
"android": {
|
|
85
|
-
"src": "android"
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
"prettier": "@ionic/prettier-config",
|
|
89
|
-
"swiftlint": "@ionic/swiftlint-config",
|
|
90
|
-
"eslintConfig": {
|
|
91
|
-
"extends": "@ionic/eslint-config/recommended",
|
|
92
|
-
"rules": {
|
|
93
|
-
"@typescript-eslint/no-unused-vars": [
|
|
94
|
-
"error",
|
|
95
|
-
{
|
|
96
|
-
"argsIgnorePattern": "^_",
|
|
97
|
-
"varsIgnorePattern": "^_",
|
|
98
|
-
"caughtErrorsIgnorePattern": "^_"
|
|
99
|
-
}
|
|
100
|
-
]
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"repository": {
|
|
104
|
-
"type": "git",
|
|
105
|
-
"url": "https://github.com/capacitor-community/bluetooth-le"
|
|
106
|
-
},
|
|
107
|
-
"bugs": {
|
|
108
|
-
"url": "https://github.com/capacitor-community/bluetooth-le/issues"
|
|
109
|
-
},
|
|
110
|
-
"volta": {
|
|
111
|
-
"node": "22.13.1",
|
|
112
|
-
"npm": "11.0.0"
|
|
113
|
-
}
|
|
114
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@capacitor-community/bluetooth-le",
|
|
3
|
+
"version": "8.0.2",
|
|
4
|
+
"description": "Capacitor plugin for Bluetooth Low Energy ",
|
|
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
|
+
"scripts": {
|
|
10
|
+
"verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
|
|
11
|
+
"verify:ios": "xcodebuild clean build test -scheme CapacitorCommunityBluetoothLe -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.5'",
|
|
12
|
+
"verify:android": "cd android && ./gradlew clean build test && cd ..",
|
|
13
|
+
"verify:web": "npm run test:coverage && npm run build",
|
|
14
|
+
"lint": "npm run eslint && npm run prettier -- --check && npm run lint:ios",
|
|
15
|
+
"lint:ios": "npm run swiftlint -- lint ios",
|
|
16
|
+
"lint:android": "cd android && ./gradlew clean lint && cd ..",
|
|
17
|
+
"fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- lint --fix --format ios",
|
|
18
|
+
"eslint": "eslint . --ext ts",
|
|
19
|
+
"prettier": "prettier \"**/*.{css,html,ts,js}\"",
|
|
20
|
+
"swiftlint": "node-swiftlint",
|
|
21
|
+
"docgen": "docgen --api BleClientInterface --output-readme README.md --output-json dist/docs.json",
|
|
22
|
+
"postdocgen": "node scripts/fix-docgen-types.js && prettier README.md --write",
|
|
23
|
+
"build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
|
|
24
|
+
"clean": "rimraf ./dist",
|
|
25
|
+
"watch": "tsc --watch",
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
27
|
+
"test": "jest",
|
|
28
|
+
"test:coverage": "jest --coverage",
|
|
29
|
+
"test:watch": "jest --watch",
|
|
30
|
+
"version:dev": "npm version --no-git-tag-version $(git describe)",
|
|
31
|
+
"release": "standard-version",
|
|
32
|
+
"release:minor": "standard-version -r minor",
|
|
33
|
+
"release:major": "standard-version -r major"
|
|
34
|
+
},
|
|
35
|
+
"author": "pwespi",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@types/web-bluetooth": "^0.0.20"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@capacitor/android": "^8.0.0",
|
|
42
|
+
"@capacitor/cli": "^8.0.0",
|
|
43
|
+
"@capacitor/core": "^8.0.0",
|
|
44
|
+
"@capacitor/docgen": "^0.3.1",
|
|
45
|
+
"@capacitor/ios": "^8.0.0",
|
|
46
|
+
"@ionic/eslint-config": "^0.4.0",
|
|
47
|
+
"@ionic/prettier-config": "^4.0.0",
|
|
48
|
+
"@ionic/swiftlint-config": "^2.0.0",
|
|
49
|
+
"@types/jest": "^29.2.5",
|
|
50
|
+
"eslint": "^8.57.1",
|
|
51
|
+
"jest": "^29.3.1",
|
|
52
|
+
"jest-environment-jsdom": "^29.3.1",
|
|
53
|
+
"prettier": "^3.6.2",
|
|
54
|
+
"rimraf": "^6.1.0",
|
|
55
|
+
"rollup": "^4.53.2",
|
|
56
|
+
"standard-version": "^9.5.0",
|
|
57
|
+
"swiftlint": "^2.0.0",
|
|
58
|
+
"ts-jest": "^29.0.3",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"prettier-plugin-java": "^2.7.7"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@capacitor/core": ">=8.0.0"
|
|
64
|
+
},
|
|
65
|
+
"files": [
|
|
66
|
+
"android/src/main/",
|
|
67
|
+
"android/build.gradle",
|
|
68
|
+
"dist/",
|
|
69
|
+
"ios/Sources",
|
|
70
|
+
"ios/Tests",
|
|
71
|
+
"Package.swift",
|
|
72
|
+
"CapacitorCommunityBluetoothLe.podspec"
|
|
73
|
+
],
|
|
74
|
+
"keywords": [
|
|
75
|
+
"capacitor",
|
|
76
|
+
"plugin",
|
|
77
|
+
"native",
|
|
78
|
+
"bluetooth"
|
|
79
|
+
],
|
|
80
|
+
"capacitor": {
|
|
81
|
+
"ios": {
|
|
82
|
+
"src": "ios"
|
|
83
|
+
},
|
|
84
|
+
"android": {
|
|
85
|
+
"src": "android"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"prettier": "@ionic/prettier-config",
|
|
89
|
+
"swiftlint": "@ionic/swiftlint-config",
|
|
90
|
+
"eslintConfig": {
|
|
91
|
+
"extends": "@ionic/eslint-config/recommended",
|
|
92
|
+
"rules": {
|
|
93
|
+
"@typescript-eslint/no-unused-vars": [
|
|
94
|
+
"error",
|
|
95
|
+
{
|
|
96
|
+
"argsIgnorePattern": "^_",
|
|
97
|
+
"varsIgnorePattern": "^_",
|
|
98
|
+
"caughtErrorsIgnorePattern": "^_"
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"repository": {
|
|
104
|
+
"type": "git",
|
|
105
|
+
"url": "https://github.com/capacitor-community/bluetooth-le"
|
|
106
|
+
},
|
|
107
|
+
"bugs": {
|
|
108
|
+
"url": "https://github.com/capacitor-community/bluetooth-le/issues"
|
|
109
|
+
},
|
|
110
|
+
"volta": {
|
|
111
|
+
"node": "22.13.1",
|
|
112
|
+
"npm": "11.0.0"
|
|
113
|
+
}
|
|
114
|
+
}
|