hap-nodejs 1.1.1-beta.4 → 1.1.1-beta.6
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/@types/bonjour-hap.d.ts +53 -50
- package/@types/simple-plist.d.ts +4 -0
- package/README.md +19 -16
- package/dist/accessories/AirConditioner_accessory.js +30 -28
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +81 -69
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +136 -141
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +22 -18
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +35 -33
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +44 -42
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +34 -32
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +26 -25
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +16 -13
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +22 -20
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +20 -18
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +37 -34
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +45 -43
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +15 -12
- package/dist/accessories/TemperatureSensor_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.js +12 -9
- package/dist/accessories/Wi-FiRouter_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.js +14 -11
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts +3 -3
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +38 -37
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/accessories/types.d.ts +63 -63
- package/dist/accessories/types.d.ts.map +1 -1
- package/dist/accessories/types.js +87 -83
- package/dist/accessories/types.js.map +1 -1
- package/dist/index.d.ts +28 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -40
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js +21 -19
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +37 -38
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +296 -286
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +7 -7
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +136 -128
- package/dist/lib/Advertiser.js.map +1 -1
- package/dist/lib/Bridge.d.ts +1 -1
- package/dist/lib/Bridge.d.ts.map +1 -1
- package/dist/lib/Bridge.js +6 -2
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +41 -40
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +208 -204
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +30 -31
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +229 -220
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +22 -22
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +67 -63
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +1 -2
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +44 -28
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +33 -34
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +149 -181
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +17 -19
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +151 -160
- package/dist/lib/camera/RecordingManagement.js.map +1 -1
- package/dist/lib/camera/index.d.ts +3 -3
- package/dist/lib/camera/index.d.ts.map +1 -1
- package/dist/lib/camera/index.js +6 -3
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +33 -33
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +144 -152
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +20 -22
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +78 -74
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +4 -4
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js +8 -5
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +4 -5
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +13 -9
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +37 -39
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +197 -208
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.d.ts +5 -5
- package/dist/lib/controller/index.d.ts.map +1 -1
- package/dist/lib/controller/index.js +8 -5
- package/dist/lib/controller/index.js.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.d.ts +2 -2
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +39 -39
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +0 -1
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +77 -57
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +22 -23
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +164 -154
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.d.ts +3 -3
- package/dist/lib/datastream/index.d.ts.map +1 -1
- package/dist/lib/datastream/index.js +6 -3
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts +11 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.js +1218 -957
- package/dist/lib/definitions/CharacteristicDefinitions.js.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.js +695 -620
- package/dist/lib/definitions/ServiceDefinitions.js.map +1 -1
- package/dist/lib/definitions/generate-definitions.d.ts +3 -3
- package/dist/lib/definitions/generate-definitions.d.ts.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +256 -244
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +170 -160
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/definitions/index.d.ts +2 -2
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +5 -2
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/gen/HomeKit.d.ts +7 -0
- package/dist/lib/gen/HomeKit.d.ts.map +1 -0
- package/dist/lib/gen/HomeKit.js +8 -0
- package/dist/lib/gen/HomeKit.js.map +1 -0
- package/dist/lib/model/AccessoryInfo.d.ts +3 -4
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +53 -50
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts +3 -3
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +23 -18
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts +2 -2
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +11 -4
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +1 -1
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +27 -19
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +9 -9
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js +29 -27
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/checkName.d.ts +2 -2
- package/dist/lib/util/checkName.d.ts.map +1 -1
- package/dist/lib/util/checkName.js +9 -6
- package/dist/lib/util/checkName.js.map +1 -1
- package/dist/lib/util/clone.d.ts.map +1 -1
- package/dist/lib/util/clone.js +5 -1
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts +1 -1
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +9 -4
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +22 -23
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +116 -109
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +2 -3
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +40 -31
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.d.ts +1 -1
- package/dist/lib/util/hapStatusError.d.ts.map +1 -1
- package/dist/lib/util/hapStatusError.js +8 -4
- package/dist/lib/util/hapStatusError.js.map +1 -1
- package/dist/lib/util/net-utils.d.ts +1 -1
- package/dist/lib/util/net-utils.js +23 -17
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +6 -2
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/promise-utils.d.ts +1 -1
- package/dist/lib/util/promise-utils.d.ts.map +1 -1
- package/dist/lib/util/promise-utils.js +10 -3
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +2 -3
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +19 -11
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +0 -1
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +11 -6
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +0 -1
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +43 -28
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +0 -1
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +38 -26
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +24 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -3
- package/dist/types.js.map +1 -1
- package/package.json +45 -50
- package/dist/lib/dbus/align.d.ts +0 -2
- package/dist/lib/dbus/align.d.ts.map +0 -1
- package/dist/lib/dbus/align.js +0 -12
- package/dist/lib/dbus/align.js.map +0 -1
- package/dist/lib/dbus/bus.d.ts +0 -38
- package/dist/lib/dbus/bus.d.ts.map +0 -1
- package/dist/lib/dbus/bus.js +0 -222
- package/dist/lib/dbus/bus.js.map +0 -1
- package/dist/lib/dbus/constants.d.ts +0 -43
- package/dist/lib/dbus/constants.d.ts.map +0 -1
- package/dist/lib/dbus/constants.js +0 -53
- package/dist/lib/dbus/constants.js.map +0 -1
- package/dist/lib/dbus/dbus-buffer.d.ts +0 -30
- package/dist/lib/dbus/dbus-buffer.d.ts.map +0 -1
- package/dist/lib/dbus/dbus-buffer.js +0 -175
- package/dist/lib/dbus/dbus-buffer.js.map +0 -1
- package/dist/lib/dbus/handshake.d.ts +0 -2
- package/dist/lib/dbus/handshake.d.ts.map +0 -1
- package/dist/lib/dbus/handshake.js +0 -130
- package/dist/lib/dbus/handshake.js.map +0 -1
- package/dist/lib/dbus/index.d.ts +0 -3
- package/dist/lib/dbus/index.d.ts.map +0 -1
- package/dist/lib/dbus/index.js +0 -123
- package/dist/lib/dbus/index.js.map +0 -1
- package/dist/lib/dbus/introspect.d.ts +0 -30
- package/dist/lib/dbus/introspect.d.ts.map +0 -1
- package/dist/lib/dbus/introspect.js +0 -208
- package/dist/lib/dbus/introspect.js.map +0 -1
- package/dist/lib/dbus/marshall.d.ts +0 -2
- package/dist/lib/dbus/marshall.d.ts.map +0 -1
- package/dist/lib/dbus/marshall.js +0 -97
- package/dist/lib/dbus/marshall.js.map +0 -1
- package/dist/lib/dbus/marshallers.d.ts +0 -10
- package/dist/lib/dbus/marshallers.d.ts.map +0 -1
- package/dist/lib/dbus/marshallers.js +0 -329
- package/dist/lib/dbus/marshallers.js.map +0 -1
- package/dist/lib/dbus/message.d.ts +0 -4
- package/dist/lib/dbus/message.d.ts.map +0 -1
- package/dist/lib/dbus/message.js +0 -116
- package/dist/lib/dbus/message.js.map +0 -1
- package/dist/lib/dbus/put.d.ts +0 -21
- package/dist/lib/dbus/put.d.ts.map +0 -1
- package/dist/lib/dbus/put.js +0 -120
- package/dist/lib/dbus/put.js.map +0 -1
- package/dist/lib/dbus/readline.d.ts +0 -2
- package/dist/lib/dbus/readline.d.ts.map +0 -1
- package/dist/lib/dbus/readline.js +0 -27
- package/dist/lib/dbus/readline.js.map +0 -1
- package/dist/lib/dbus/signature.d.ts +0 -2
- package/dist/lib/dbus/signature.d.ts.map +0 -1
- package/dist/lib/dbus/signature.js +0 -59
- package/dist/lib/dbus/signature.js.map +0 -1
- package/dist/lib/dbus/stdifaces.d.ts +0 -3
- package/dist/lib/dbus/stdifaces.d.ts.map +0 -1
- package/dist/lib/dbus/stdifaces.js +0 -206
- package/dist/lib/dbus/stdifaces.js.map +0 -1
|
@@ -1,41 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
const command = new Command(
|
|
18
|
-
.version(
|
|
19
|
-
.option(
|
|
20
|
-
.option(
|
|
21
|
-
.
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
5
|
+
require("./CharacteristicDefinitions");
|
|
6
|
+
const assert_1 = tslib_1.__importDefault(require("assert"));
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
9
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
10
|
+
const simple_plist_1 = require("simple-plist");
|
|
11
|
+
const Characteristic_1 = require("../Characteristic");
|
|
12
|
+
const uuid_1 = require("../util/uuid");
|
|
13
|
+
const generator_configuration_1 = require("./generator-configuration");
|
|
14
|
+
// noinspection JSUnusedLocalSymbols
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
16
|
+
const temp = Characteristic_1.Characteristic; // this to have "../Characteristic" not being only type import, otherwise this would not result in a require statement
|
|
17
|
+
const command = new commander_1.Command("generate-definitions")
|
|
18
|
+
.version("1.0.0")
|
|
19
|
+
.option("-f, --force")
|
|
20
|
+
.option("-m, --metadata <path>", "Define a custom location for the plain-metadata.config file", "/System/Library/PrivateFrameworks/HomeKitDaemon.framework/Resources/plain-metadata.config")
|
|
21
|
+
.option("-s, --simulator <path>", "Define the path to the accessory simulator.", "/Users/benpotter/Desktop/a.app");
|
|
22
22
|
command.parse(process.argv);
|
|
23
23
|
const options = command.opts();
|
|
24
24
|
const metadataFile = options.metadata;
|
|
25
25
|
const simulator = options.simulator;
|
|
26
|
-
if (!existsSync(metadataFile)) {
|
|
26
|
+
if (!fs_1.default.existsSync(metadataFile)) {
|
|
27
27
|
console.warn(`The metadata file at '${metadataFile}' does not exist!`);
|
|
28
28
|
process.exit(1);
|
|
29
29
|
}
|
|
30
|
-
if (!existsSync(simulator)) {
|
|
30
|
+
if (!fs_1.default.existsSync(simulator)) {
|
|
31
31
|
console.warn(`The simulator app directory '${simulator}' does not exist!`);
|
|
32
32
|
process.exit(1);
|
|
33
33
|
}
|
|
34
|
-
const defaultPlist = resolve(simulator,
|
|
35
|
-
const defaultMfiPlist = resolve(simulator,
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const
|
|
34
|
+
const defaultPlist = path_1.default.resolve(simulator, "Contents/Frameworks/HAPAccessoryKit.framework/Resources/default.metadata.plist");
|
|
35
|
+
const defaultMfiPlist = path_1.default.resolve(simulator, "Contents/Frameworks/HAPAccessoryKit.framework/Resources/default_mfi.metadata.plist");
|
|
36
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
37
|
+
const plistData = (0, simple_plist_1.readFileSync)(metadataFile);
|
|
38
|
+
const simulatorPlistData = (0, simple_plist_1.readFileSync)(defaultPlist);
|
|
39
|
+
const simulatorMfiPlistData = fs_1.default.existsSync(defaultMfiPlist) ? (0, simple_plist_1.readFileSync)(defaultMfiPlist) : undefined;
|
|
40
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
39
41
|
if (plistData.SchemaVersion !== 1) {
|
|
40
42
|
console.warn(`Detected unsupported schema version ${plistData.SchemaVersion}!`);
|
|
41
43
|
}
|
|
@@ -43,14 +45,14 @@ if (plistData.PlistDictionary.SchemaVersion !== 1) {
|
|
|
43
45
|
console.warn(`Detect unsupported PlistDictionary schema version ${plistData.PlistDictionary.SchemaVersion}!`);
|
|
44
46
|
}
|
|
45
47
|
console.log(`Parsing version ${plistData.Version}...`);
|
|
46
|
-
const shouldParseCharacteristics = checkWrittenVersion(
|
|
47
|
-
const shouldParseServices = checkWrittenVersion(
|
|
48
|
+
const shouldParseCharacteristics = checkWrittenVersion("./CharacteristicDefinitions.ts", plistData.Version);
|
|
49
|
+
const shouldParseServices = checkWrittenVersion("./ServiceDefinitions.ts", plistData.Version);
|
|
48
50
|
if (!options.force && (!shouldParseCharacteristics || !shouldParseServices)) {
|
|
49
|
-
console.log(
|
|
50
|
-
|
|
51
|
+
console.log("Parsed schema version " + plistData.Version + " is older than what's already generated. " +
|
|
52
|
+
"User --force option to generate and overwrite nonetheless!");
|
|
51
53
|
process.exit(1);
|
|
52
54
|
}
|
|
53
|
-
const undefinedUnits = [
|
|
55
|
+
const undefinedUnits = ["micrograms/m^3", "ppm"];
|
|
54
56
|
let characteristics;
|
|
55
57
|
const simulatorCharacteristics = new Map();
|
|
56
58
|
let services;
|
|
@@ -60,11 +62,13 @@ const properties = new Map();
|
|
|
60
62
|
try {
|
|
61
63
|
characteristics = checkDefined(plistData.PlistDictionary.HAP.Characteristics);
|
|
62
64
|
services = checkDefined(plistData.PlistDictionary.HAP.Services);
|
|
63
|
-
// eslint-disable-next-line
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
66
|
units = checkDefined(plistData.PlistDictionary.HAP.Units);
|
|
65
67
|
categories = checkDefined(plistData.PlistDictionary.HomeKit.Categories);
|
|
66
68
|
const props = checkDefined(plistData.PlistDictionary.HAP.Properties);
|
|
67
|
-
|
|
69
|
+
// noinspection JSUnusedLocalSymbols
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
71
|
+
for (const [id, definition] of Object.entries(props).sort(([a, aDef], [b, bDef]) => aDef.Position - bDef.Position)) {
|
|
68
72
|
const perm = characteristicPerm(id);
|
|
69
73
|
if (perm) {
|
|
70
74
|
const num = 1 << definition.Position;
|
|
@@ -81,7 +85,7 @@ try {
|
|
|
81
85
|
}
|
|
82
86
|
}
|
|
83
87
|
catch (error) {
|
|
84
|
-
console.log(
|
|
88
|
+
console.log("Unexpected structure of the plist file!");
|
|
85
89
|
throw error;
|
|
86
90
|
}
|
|
87
91
|
// first step is to check if we are up to date on categories
|
|
@@ -90,11 +94,11 @@ for (const definition of Object.values(categories)) {
|
|
|
90
94
|
console.log(`Detected a new category '${definition.DefaultDescription}' with id ${definition.Identifier}`);
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
|
-
const characteristicOutput = createWriteStream(join(__dirname,
|
|
94
|
-
characteristicOutput.write(
|
|
97
|
+
const characteristicOutput = fs_1.default.createWriteStream(path_1.default.join(__dirname, "CharacteristicDefinitions.ts"));
|
|
98
|
+
characteristicOutput.write("// THIS FILE IS AUTO-GENERATED - DO NOT MODIFY\n");
|
|
95
99
|
characteristicOutput.write(`// V=${plistData.Version}\n`);
|
|
96
|
-
characteristicOutput.write(
|
|
97
|
-
characteristicOutput.write(
|
|
100
|
+
characteristicOutput.write("\n");
|
|
101
|
+
characteristicOutput.write("import { Access, Characteristic, Formats, Perms, Units } from \"../Characteristic\";\n\n");
|
|
98
102
|
/**
|
|
99
103
|
* Characteristics
|
|
100
104
|
*/
|
|
@@ -102,51 +106,51 @@ const generatedCharacteristics = {}; // indexed by id
|
|
|
102
106
|
const writtenCharacteristicEntries = {}; // indexed by class name
|
|
103
107
|
for (const [id, definition] of Object.entries(characteristics)) {
|
|
104
108
|
try {
|
|
105
|
-
if (CharacteristicHidden.has(id)) {
|
|
109
|
+
if (generator_configuration_1.CharacteristicHidden.has(id)) {
|
|
106
110
|
continue;
|
|
107
111
|
}
|
|
108
112
|
// "Carbon dioxide Detected" -> "Carbon Dioxide Detected"
|
|
109
|
-
const name = (CharacteristicNameOverrides.get(id)
|
|
110
|
-
?? definition.DefaultDescription).split(
|
|
111
|
-
const deprecatedName = CharacteristicDeprecatedNames.get(id);
|
|
113
|
+
const name = (generator_configuration_1.CharacteristicNameOverrides.get(id)
|
|
114
|
+
?? definition.DefaultDescription).split(" ").map(entry => entry[0].toUpperCase() + entry.slice(1)).join(" ");
|
|
115
|
+
const deprecatedName = generator_configuration_1.CharacteristicDeprecatedNames.get(id);
|
|
112
116
|
// "Target Door State" -> "TargetDoorState", "PM2.5" -> "PM2_5"
|
|
113
|
-
const className = name.replace(/[\s-]/g,
|
|
114
|
-
const deprecatedClassName = deprecatedName?.replace(/[\s-]/g,
|
|
115
|
-
const longUUID = toLongForm(definition.ShortUUID);
|
|
117
|
+
const className = name.replace(/[\s-]/g, "").replace(/[.]/g, "_");
|
|
118
|
+
const deprecatedClassName = deprecatedName?.replace(/[\s-]/g, "").replace(/[.]/g, "_");
|
|
119
|
+
const longUUID = (0, uuid_1.toLongForm)(definition.ShortUUID);
|
|
116
120
|
const simulatorCharacteristic = simulatorCharacteristics.get(longUUID);
|
|
117
121
|
const validValues = simulatorCharacteristic?.Constraints?.ValidValues || {};
|
|
118
|
-
const validValuesOverride = CharacteristicValidValuesOverride.get(id);
|
|
122
|
+
const validValuesOverride = generator_configuration_1.CharacteristicValidValuesOverride.get(id);
|
|
119
123
|
if (validValuesOverride) {
|
|
120
124
|
for (const [key, value] of Object.entries(validValuesOverride)) {
|
|
121
125
|
validValues[key] = value;
|
|
122
126
|
}
|
|
123
127
|
}
|
|
124
128
|
for (const [value, name] of Object.entries(validValues)) {
|
|
125
|
-
let constName = name.toUpperCase().replace(
|
|
129
|
+
let constName = name.toUpperCase().replace(/[^\w]+/g, "_");
|
|
126
130
|
if (/^[1-9]/.test(constName)) {
|
|
127
|
-
constName =
|
|
131
|
+
constName = "_" + constName; // variables can't start with a number
|
|
128
132
|
}
|
|
129
133
|
validValues[value] = constName;
|
|
130
134
|
}
|
|
131
135
|
const validBits = simulatorCharacteristic?.Constraints?.ValidBits;
|
|
132
|
-
let validBitMasks;
|
|
136
|
+
let validBitMasks = undefined;
|
|
133
137
|
if (validBits) {
|
|
134
138
|
validBitMasks = {};
|
|
135
139
|
for (const [value, name] of Object.entries(validBits)) {
|
|
136
|
-
let constName = name.toUpperCase().replace(
|
|
140
|
+
let constName = name.toUpperCase().replace(/[^\w]+/g, "_");
|
|
137
141
|
if (/^[1-9]/.test(constName)) {
|
|
138
|
-
constName =
|
|
142
|
+
constName = "_" + constName; // variables can't start with a number
|
|
139
143
|
}
|
|
140
|
-
validBitMasks[
|
|
144
|
+
validBitMasks["" + (1 << parseInt(value, 10))] = constName + "_BIT_MASK";
|
|
141
145
|
}
|
|
142
146
|
}
|
|
143
147
|
const generatedCharacteristic = {
|
|
144
|
-
id,
|
|
148
|
+
id: id,
|
|
145
149
|
UUID: longUUID,
|
|
146
|
-
name,
|
|
147
|
-
className,
|
|
148
|
-
deprecatedClassName,
|
|
149
|
-
since: CharacteristicSinceInformation.get(id),
|
|
150
|
+
name: name,
|
|
151
|
+
className: className,
|
|
152
|
+
deprecatedClassName: deprecatedClassName,
|
|
153
|
+
since: generator_configuration_1.CharacteristicSinceInformation.get(id),
|
|
150
154
|
format: definition.Format,
|
|
151
155
|
units: definition.Units,
|
|
152
156
|
properties: definition.Properties,
|
|
@@ -154,12 +158,12 @@ for (const [id, definition] of Object.entries(characteristics)) {
|
|
|
154
158
|
maxValue: definition.MaxValue,
|
|
155
159
|
stepValue: definition.StepValue,
|
|
156
160
|
maxLength: definition.MaxLength,
|
|
157
|
-
validValues,
|
|
158
|
-
validBitMasks,
|
|
159
|
-
classAdditions: CharacteristicClassAdditions.get(id),
|
|
161
|
+
validValues: validValues,
|
|
162
|
+
validBitMasks: validBitMasks,
|
|
163
|
+
classAdditions: generator_configuration_1.CharacteristicClassAdditions.get(id),
|
|
160
164
|
};
|
|
161
165
|
// call any handler which wants to manually override properties of the generated characteristic
|
|
162
|
-
CharacteristicOverriding.get(id)?.(generatedCharacteristic);
|
|
166
|
+
generator_configuration_1.CharacteristicOverriding.get(id)?.(generatedCharacteristic);
|
|
163
167
|
generatedCharacteristics[id] = generatedCharacteristic;
|
|
164
168
|
writtenCharacteristicEntries[className] = generatedCharacteristic;
|
|
165
169
|
if (deprecatedClassName) {
|
|
@@ -167,10 +171,10 @@ for (const [id, definition] of Object.entries(characteristics)) {
|
|
|
167
171
|
}
|
|
168
172
|
}
|
|
169
173
|
catch (error) {
|
|
170
|
-
throw new Error(
|
|
174
|
+
throw new Error("Error thrown generating characteristic '" + id + "' (" + definition.DefaultDescription + "): " + error.message);
|
|
171
175
|
}
|
|
172
176
|
}
|
|
173
|
-
for (const [id, generated] of CharacteristicManualAdditions) {
|
|
177
|
+
for (const [id, generated] of generator_configuration_1.CharacteristicManualAdditions) {
|
|
174
178
|
generatedCharacteristics[id] = generated;
|
|
175
179
|
writtenCharacteristicEntries[generated.className] = generated;
|
|
176
180
|
if (generated.deprecatedClassName) {
|
|
@@ -180,20 +184,20 @@ for (const [id, generated] of CharacteristicManualAdditions) {
|
|
|
180
184
|
for (const generated of Object.values(generatedCharacteristics)
|
|
181
185
|
.sort((a, b) => a.className.localeCompare(b.className))) {
|
|
182
186
|
try {
|
|
183
|
-
characteristicOutput.write(
|
|
184
|
-
characteristicOutput.write(
|
|
187
|
+
characteristicOutput.write("/**\n");
|
|
188
|
+
characteristicOutput.write(" * Characteristic \"" + generated.name + "\"\n");
|
|
185
189
|
if (generated.since) {
|
|
186
|
-
characteristicOutput.write(
|
|
190
|
+
characteristicOutput.write(" * @since iOS " + generated.since + "\n");
|
|
187
191
|
}
|
|
188
192
|
if (generated.deprecatedNotice) {
|
|
189
|
-
characteristicOutput.write(
|
|
193
|
+
characteristicOutput.write(" * @deprecated " + generated.deprecatedNotice + "\n");
|
|
190
194
|
}
|
|
191
|
-
characteristicOutput.write(
|
|
192
|
-
characteristicOutput.write(
|
|
193
|
-
characteristicOutput.write(
|
|
195
|
+
characteristicOutput.write(" */\n");
|
|
196
|
+
characteristicOutput.write("export class " + generated.className + " extends Characteristic {\n\n");
|
|
197
|
+
characteristicOutput.write(" public static readonly UUID: string = \"" + generated.UUID + "\";\n\n");
|
|
194
198
|
const classAdditions = generated.classAdditions;
|
|
195
199
|
if (classAdditions) {
|
|
196
|
-
characteristicOutput.write(
|
|
200
|
+
characteristicOutput.write(classAdditions.map(line => " " + line + "\n").join("") + "\n");
|
|
197
201
|
}
|
|
198
202
|
const validValuesEntries = Object.entries(generated.validValues ?? {});
|
|
199
203
|
if (validValuesEntries.length) {
|
|
@@ -201,85 +205,90 @@ for (const generated of Object.values(generatedCharacteristics)
|
|
|
201
205
|
if (!name) {
|
|
202
206
|
continue;
|
|
203
207
|
}
|
|
204
|
-
// fix a weird edge case
|
|
208
|
+
// fix a weird edge case, still present in V=886
|
|
205
209
|
let printName = name;
|
|
206
|
-
if (name ===
|
|
207
|
-
printName =
|
|
210
|
+
if (name === "PROGRAM_SCHEDULED_MANUAL_MODE_") {
|
|
211
|
+
printName = "PROGRAM_SCHEDULED_MANUAL_MODE";
|
|
208
212
|
}
|
|
209
|
-
characteristicOutput.write(` public static readonly ${printName} = ${value}
|
|
213
|
+
characteristicOutput.write(` public static readonly ${printName} = ${value};\n`);
|
|
210
214
|
}
|
|
211
|
-
characteristicOutput.write(
|
|
215
|
+
characteristicOutput.write("\n");
|
|
212
216
|
}
|
|
213
217
|
if (generated.validBitMasks) {
|
|
214
218
|
for (const [value, name] of Object.entries(generated.validBitMasks)) {
|
|
215
|
-
characteristicOutput.write(` public static readonly ${name} = ${value}
|
|
219
|
+
characteristicOutput.write(` public static readonly ${name} = ${value};\n`);
|
|
216
220
|
}
|
|
217
|
-
characteristicOutput.write(
|
|
221
|
+
characteristicOutput.write("\n");
|
|
218
222
|
}
|
|
219
|
-
characteristicOutput.write(
|
|
220
|
-
characteristicOutput.write(
|
|
221
|
-
characteristicOutput.write(
|
|
222
|
-
characteristicOutput.write(
|
|
223
|
+
characteristicOutput.write(" constructor() {\n");
|
|
224
|
+
characteristicOutput.write(" super(\"" + generated.name + "\", " + generated.className + ".UUID, {\n");
|
|
225
|
+
characteristicOutput.write(" format: Formats." + characteristicFormat(generated.format) + ",\n");
|
|
226
|
+
characteristicOutput.write(" perms: [" + generatePermsString(generated.id, generated.properties) + "],\n");
|
|
223
227
|
if (generated.units && !undefinedUnits.includes(generated.units)) {
|
|
224
|
-
characteristicOutput.write(
|
|
228
|
+
characteristicOutput.write(" unit: Units." + characteristicUnit(generated.units) + ",\n");
|
|
225
229
|
}
|
|
226
230
|
if (generated.minValue != null) {
|
|
227
|
-
characteristicOutput.write(
|
|
231
|
+
characteristicOutput.write(" minValue: " + generated.minValue + ",\n");
|
|
228
232
|
}
|
|
229
233
|
if (generated.maxValue != null) {
|
|
230
|
-
characteristicOutput.write(
|
|
234
|
+
characteristicOutput.write(" maxValue: " + generated.maxValue + ",\n");
|
|
231
235
|
}
|
|
232
236
|
if (generated.stepValue != null) {
|
|
233
|
-
characteristicOutput.write(
|
|
237
|
+
characteristicOutput.write(" minStep: " + generated.stepValue + ",\n");
|
|
234
238
|
}
|
|
235
239
|
if (generated.maxLength != null) {
|
|
236
|
-
characteristicOutput.write(
|
|
240
|
+
characteristicOutput.write(" maxLen: " + generated.maxLength + ",\n");
|
|
237
241
|
}
|
|
238
242
|
if (validValuesEntries.length) {
|
|
239
|
-
characteristicOutput.write(
|
|
243
|
+
characteristicOutput.write(" validValues: [" + Object.keys(generated.validValues).join(", ") + "],\n");
|
|
240
244
|
}
|
|
241
245
|
if (generated.adminOnlyAccess) {
|
|
242
|
-
characteristicOutput.write(
|
|
246
|
+
characteristicOutput.write(" adminOnlyAccess: ["
|
|
247
|
+
+ generated.adminOnlyAccess.map(value => "Access." + characteristicAccess(value)).join(", ") + "],\n");
|
|
243
248
|
}
|
|
244
|
-
characteristicOutput.write(
|
|
245
|
-
characteristicOutput.write(
|
|
246
|
-
characteristicOutput.write(
|
|
247
|
-
characteristicOutput.write(
|
|
249
|
+
characteristicOutput.write(" });\n");
|
|
250
|
+
characteristicOutput.write(" this.value = this.getDefaultValue();\n");
|
|
251
|
+
characteristicOutput.write(" }\n");
|
|
252
|
+
characteristicOutput.write("}\n");
|
|
248
253
|
if (generated.deprecatedClassName) {
|
|
249
|
-
characteristicOutput.write(
|
|
254
|
+
characteristicOutput.write("// noinspection JSDeprecatedSymbols\n");
|
|
255
|
+
characteristicOutput.write("Characteristic." + generated.deprecatedClassName + " = " + generated.className + ";\n");
|
|
250
256
|
}
|
|
251
|
-
|
|
257
|
+
if (generated.deprecatedNotice) {
|
|
258
|
+
characteristicOutput.write("// noinspection JSDeprecatedSymbols\n");
|
|
259
|
+
}
|
|
260
|
+
characteristicOutput.write("Characteristic." + generated.className + " = " + generated.className + ";\n\n");
|
|
252
261
|
}
|
|
253
262
|
catch (error) {
|
|
254
|
-
throw new Error(
|
|
263
|
+
throw new Error("Error thrown writing characteristic '" + generated.id + "' (" + generated.className + "): " + error.message);
|
|
255
264
|
}
|
|
256
265
|
}
|
|
257
266
|
characteristicOutput.end();
|
|
258
267
|
const characteristicProperties = Object.entries(writtenCharacteristicEntries).sort(([a], [b]) => a.localeCompare(b));
|
|
259
|
-
rewriteProperties(
|
|
268
|
+
rewriteProperties("Characteristic", characteristicProperties);
|
|
260
269
|
writeCharacteristicTestFile();
|
|
261
270
|
/**
|
|
262
271
|
* Services
|
|
263
272
|
*/
|
|
264
|
-
const serviceOutput = createWriteStream(join(__dirname,
|
|
265
|
-
serviceOutput.write(
|
|
273
|
+
const serviceOutput = fs_1.default.createWriteStream(path_1.default.join(__dirname, "ServiceDefinitions.ts"));
|
|
274
|
+
serviceOutput.write("// THIS FILE IS AUTO-GENERATED - DO NOT MODIFY\n");
|
|
266
275
|
serviceOutput.write(`// V=${plistData.Version}\n`);
|
|
267
|
-
serviceOutput.write(
|
|
268
|
-
serviceOutput.write(
|
|
269
|
-
serviceOutput.write(
|
|
276
|
+
serviceOutput.write("\n");
|
|
277
|
+
serviceOutput.write("import { Characteristic } from \"../Characteristic\";\n");
|
|
278
|
+
serviceOutput.write("import { Service } from \"../Service\";\n\n");
|
|
270
279
|
const generatedServices = {}; // indexed by id
|
|
271
280
|
const writtenServiceEntries = {}; // indexed by class name
|
|
272
281
|
for (const [id, definition] of Object.entries(services)) {
|
|
273
282
|
try {
|
|
274
283
|
// "Carbon dioxide Sensor" -> "Carbon Dioxide Sensor"
|
|
275
|
-
const name = (ServiceNameOverrides.get(id) ?? definition.DefaultDescription).split(
|
|
276
|
-
const deprecatedName = ServiceDeprecatedNames.get(id);
|
|
277
|
-
const className = name.replace(/[\s-]/g,
|
|
278
|
-
const deprecatedClassName = deprecatedName?.replace(/[\s-]/g,
|
|
279
|
-
const longUUID = toLongForm(definition.ShortUUID);
|
|
284
|
+
const name = (generator_configuration_1.ServiceNameOverrides.get(id) ?? definition.DefaultDescription).split(" ").map(entry => entry[0].toUpperCase() + entry.slice(1)).join(" ");
|
|
285
|
+
const deprecatedName = generator_configuration_1.ServiceDeprecatedNames.get(id);
|
|
286
|
+
const className = name.replace(/[\s-]/g, "").replace(/[.]/g, "_");
|
|
287
|
+
const deprecatedClassName = deprecatedName?.replace(/[\s-]/g, "").replace(/[.]/g, "_");
|
|
288
|
+
const longUUID = (0, uuid_1.toLongForm)(definition.ShortUUID);
|
|
280
289
|
const requiredCharacteristics = definition.Characteristics.Required;
|
|
281
290
|
const optionalCharacteristics = definition.Characteristics.Optional;
|
|
282
|
-
const configurationOverride = ServiceCharacteristicConfigurationOverrides.get(id);
|
|
291
|
+
const configurationOverride = generator_configuration_1.ServiceCharacteristicConfigurationOverrides.get(id);
|
|
283
292
|
if (configurationOverride) {
|
|
284
293
|
if (configurationOverride.removedRequired) {
|
|
285
294
|
for (const entry of configurationOverride.removedRequired) {
|
|
@@ -313,14 +322,14 @@ for (const [id, definition] of Object.entries(services)) {
|
|
|
313
322
|
}
|
|
314
323
|
}
|
|
315
324
|
const generatedService = {
|
|
316
|
-
id,
|
|
325
|
+
id: id,
|
|
317
326
|
UUID: longUUID,
|
|
318
|
-
name,
|
|
319
|
-
className,
|
|
320
|
-
deprecatedClassName,
|
|
321
|
-
since: ServiceSinceInformation.get(id),
|
|
322
|
-
requiredCharacteristics,
|
|
323
|
-
optionalCharacteristics,
|
|
327
|
+
name: name,
|
|
328
|
+
className: className,
|
|
329
|
+
deprecatedClassName: deprecatedClassName,
|
|
330
|
+
since: generator_configuration_1.ServiceSinceInformation.get(id),
|
|
331
|
+
requiredCharacteristics: requiredCharacteristics,
|
|
332
|
+
optionalCharacteristics: optionalCharacteristics,
|
|
324
333
|
};
|
|
325
334
|
generatedServices[id] = generatedService;
|
|
326
335
|
writtenServiceEntries[className] = generatedService;
|
|
@@ -329,10 +338,10 @@ for (const [id, definition] of Object.entries(services)) {
|
|
|
329
338
|
}
|
|
330
339
|
}
|
|
331
340
|
catch (error) {
|
|
332
|
-
throw new Error(
|
|
341
|
+
throw new Error("Error thrown generating service '" + id + "' (" + definition.DefaultDescription + "): " + error.message);
|
|
333
342
|
}
|
|
334
343
|
}
|
|
335
|
-
for (const [id, generated] of ServiceManualAdditions) {
|
|
344
|
+
for (const [id, generated] of generator_configuration_1.ServiceManualAdditions) {
|
|
336
345
|
generatedServices[id] = generated;
|
|
337
346
|
writtenServiceEntries[generated.className] = generated;
|
|
338
347
|
if (generated.deprecatedClassName) {
|
|
@@ -342,276 +351,279 @@ for (const [id, generated] of ServiceManualAdditions) {
|
|
|
342
351
|
for (const generated of Object.values(generatedServices)
|
|
343
352
|
.sort((a, b) => a.className.localeCompare(b.className))) {
|
|
344
353
|
try {
|
|
345
|
-
serviceOutput.write(
|
|
346
|
-
serviceOutput.write(
|
|
354
|
+
serviceOutput.write("/**\n");
|
|
355
|
+
serviceOutput.write(" * Service \"" + generated.name + "\"\n");
|
|
347
356
|
if (generated.since) {
|
|
348
|
-
serviceOutput.write(
|
|
357
|
+
serviceOutput.write(" * @since iOS " + generated.since + "\n");
|
|
349
358
|
}
|
|
350
359
|
if (generated.deprecatedNotice) {
|
|
351
|
-
serviceOutput.write(
|
|
352
|
-
}
|
|
353
|
-
serviceOutput.write(
|
|
354
|
-
serviceOutput.write(
|
|
355
|
-
serviceOutput.write(
|
|
356
|
-
serviceOutput.write(
|
|
357
|
-
serviceOutput.write(
|
|
358
|
-
serviceOutput.write(
|
|
360
|
+
serviceOutput.write(" * @deprecated " + generated.deprecatedNotice + "\n");
|
|
361
|
+
}
|
|
362
|
+
serviceOutput.write(" */\n");
|
|
363
|
+
serviceOutput.write("export class " + generated.className + " extends Service {\n\n");
|
|
364
|
+
serviceOutput.write(" public static readonly UUID: string = \"" + generated.UUID + "\";\n\n");
|
|
365
|
+
serviceOutput.write(" constructor(displayName?: string, subtype?: string) {\n");
|
|
366
|
+
serviceOutput.write(" super(displayName, " + generated.className + ".UUID, subtype);\n\n");
|
|
367
|
+
serviceOutput.write(" // Required Characteristics\n");
|
|
359
368
|
for (const required of generated.requiredCharacteristics) {
|
|
360
369
|
const characteristic = generatedCharacteristics[required];
|
|
361
370
|
if (!characteristic) {
|
|
362
|
-
console.warn(
|
|
371
|
+
console.warn("Could not find required characteristic " + required + " for " + generated.className);
|
|
363
372
|
continue;
|
|
364
373
|
}
|
|
365
|
-
if (required ===
|
|
366
|
-
serviceOutput.write(
|
|
367
|
-
serviceOutput.write(
|
|
368
|
-
serviceOutput.write(
|
|
374
|
+
if (required === "name") {
|
|
375
|
+
serviceOutput.write(" if (!this.testCharacteristic(Characteristic.Name)) { // workaround for Name characteristic collision in constructor\n");
|
|
376
|
+
serviceOutput.write(" this.addCharacteristic(Characteristic.Name).updateValue(\"Unnamed Service\");\n");
|
|
377
|
+
serviceOutput.write(" }\n");
|
|
369
378
|
}
|
|
370
379
|
else {
|
|
371
|
-
serviceOutput.write(
|
|
380
|
+
serviceOutput.write(" this.addCharacteristic(Characteristic." + characteristic.className + ");\n");
|
|
372
381
|
}
|
|
373
382
|
}
|
|
374
383
|
if (generated.optionalCharacteristics?.length) {
|
|
375
|
-
serviceOutput.write(
|
|
384
|
+
serviceOutput.write("\n // Optional Characteristics\n");
|
|
376
385
|
for (const optional of generated.optionalCharacteristics) {
|
|
377
386
|
const characteristic = generatedCharacteristics[optional];
|
|
378
387
|
if (!characteristic) {
|
|
379
|
-
console.warn(
|
|
388
|
+
console.warn("Could not find optional characteristic " + optional + " for " + generated.className);
|
|
380
389
|
continue;
|
|
381
390
|
}
|
|
382
|
-
serviceOutput.write(
|
|
391
|
+
serviceOutput.write(" this.addOptionalCharacteristic(Characteristic." + characteristic.className + ");\n");
|
|
383
392
|
}
|
|
384
393
|
}
|
|
385
|
-
serviceOutput.write(
|
|
394
|
+
serviceOutput.write(" }\n}\n");
|
|
386
395
|
if (generated.deprecatedClassName) {
|
|
387
|
-
serviceOutput.write(
|
|
396
|
+
serviceOutput.write("// noinspection JSDeprecatedSymbols\n");
|
|
397
|
+
serviceOutput.write("Service." + generated.deprecatedClassName + " = " + generated.className + ";\n");
|
|
398
|
+
}
|
|
399
|
+
if (generated.deprecatedNotice) {
|
|
400
|
+
serviceOutput.write("// noinspection JSDeprecatedSymbols\n");
|
|
388
401
|
}
|
|
389
|
-
serviceOutput.write(
|
|
402
|
+
serviceOutput.write("Service." + generated.className + " = " + generated.className + ";\n\n");
|
|
390
403
|
}
|
|
391
404
|
catch (error) {
|
|
392
|
-
throw new Error(
|
|
405
|
+
throw new Error("Error thrown writing service '" + generated.id + "' (" + generated.className + "): " + error.message);
|
|
393
406
|
}
|
|
394
407
|
}
|
|
395
408
|
serviceOutput.end();
|
|
396
409
|
const serviceProperties = Object.entries(writtenServiceEntries).sort(([a], [b]) => a.localeCompare(b));
|
|
397
|
-
rewriteProperties(
|
|
410
|
+
rewriteProperties("Service", serviceProperties);
|
|
398
411
|
writeServicesTestFile();
|
|
399
412
|
// ------------------------ utils ------------------------
|
|
400
413
|
function checkDefined(input) {
|
|
401
414
|
if (!input) {
|
|
402
|
-
throw new Error(
|
|
415
|
+
throw new Error("value is undefined!");
|
|
403
416
|
}
|
|
404
417
|
return input;
|
|
405
418
|
}
|
|
406
419
|
function characteristicFormat(format) {
|
|
407
420
|
// @ts-expect-error: forceConsistentCasingInFileNames compiler option
|
|
408
|
-
for (const [key, value] of Object.entries(
|
|
421
|
+
for (const [key, value] of Object.entries(Characteristic_1.Formats)) {
|
|
409
422
|
if (value === format) {
|
|
410
423
|
return key;
|
|
411
424
|
}
|
|
412
425
|
}
|
|
413
|
-
throw new Error(
|
|
426
|
+
throw new Error("Unknown characteristic format '" + format + "'");
|
|
414
427
|
}
|
|
415
428
|
function characteristicUnit(unit) {
|
|
416
429
|
// @ts-expect-error: forceConsistentCasingInFileNames compiler option
|
|
417
|
-
for (const [key, value] of Object.entries(
|
|
430
|
+
for (const [key, value] of Object.entries(Characteristic_1.Units)) {
|
|
418
431
|
if (value === unit) {
|
|
419
432
|
return key;
|
|
420
433
|
}
|
|
421
434
|
}
|
|
422
|
-
throw new Error(
|
|
435
|
+
throw new Error("Unknown characteristic format '" + unit + "'");
|
|
423
436
|
}
|
|
424
437
|
function characteristicAccess(access) {
|
|
425
438
|
// @ts-expect-error: forceConsistentCasingInFileNames compiler option
|
|
426
|
-
for (const [key, value] of Object.entries(
|
|
439
|
+
for (const [key, value] of Object.entries(Characteristic_1.Access)) {
|
|
427
440
|
if (value === access) {
|
|
428
441
|
return key;
|
|
429
442
|
}
|
|
430
443
|
}
|
|
431
|
-
throw new Error(
|
|
444
|
+
throw new Error("Unknown access for '" + access + "'");
|
|
432
445
|
}
|
|
433
446
|
function characteristicPerm(id) {
|
|
434
447
|
switch (id) {
|
|
435
|
-
case
|
|
436
|
-
return
|
|
437
|
-
case
|
|
438
|
-
return
|
|
439
|
-
case
|
|
440
|
-
return
|
|
441
|
-
case
|
|
442
|
-
return
|
|
443
|
-
case
|
|
444
|
-
return
|
|
445
|
-
case
|
|
446
|
-
return
|
|
447
|
-
case
|
|
448
|
-
return
|
|
449
|
-
case
|
|
448
|
+
case "aa":
|
|
449
|
+
return "ADDITIONAL_AUTHORIZATION";
|
|
450
|
+
case "hidden":
|
|
451
|
+
return "HIDDEN";
|
|
452
|
+
case "notify":
|
|
453
|
+
return "NOTIFY";
|
|
454
|
+
case "read":
|
|
455
|
+
return "PAIRED_READ";
|
|
456
|
+
case "timedWrite":
|
|
457
|
+
return "TIMED_WRITE";
|
|
458
|
+
case "write":
|
|
459
|
+
return "PAIRED_WRITE";
|
|
460
|
+
case "writeResponse":
|
|
461
|
+
return "WRITE_RESPONSE";
|
|
462
|
+
case "broadcast": // used for bluetooth
|
|
450
463
|
return undefined;
|
|
451
|
-
case
|
|
464
|
+
case "adminOnly":
|
|
452
465
|
return undefined; // TODO add support for it (currently unused though)
|
|
453
466
|
default:
|
|
454
|
-
throw new Error(
|
|
467
|
+
throw new Error("Received unknown perms id: " + id);
|
|
455
468
|
}
|
|
456
469
|
}
|
|
457
470
|
function generatePermsString(id, propertiesBitMap) {
|
|
458
471
|
const perms = [];
|
|
459
472
|
for (const [bitMap, name] of properties) {
|
|
460
|
-
if (name ===
|
|
461
|
-
// aa set by homed just signals that aa may be supported. Setting up aa will always require a custom
|
|
473
|
+
if (name === "ADDITIONAL_AUTHORIZATION") {
|
|
474
|
+
// aa set by homed just signals that aa may be supported. Setting up aa will always require a custom made app though
|
|
462
475
|
continue;
|
|
463
476
|
}
|
|
464
477
|
if ((propertiesBitMap | bitMap) === propertiesBitMap) { // if it stays the same the bit is set
|
|
465
|
-
perms.push(
|
|
478
|
+
perms.push("Perms." + name);
|
|
466
479
|
}
|
|
467
480
|
}
|
|
468
|
-
const result = perms.join(
|
|
469
|
-
|
|
481
|
+
const result = perms.join(", ");
|
|
482
|
+
(0, assert_1.default)(!!result, "perms string cannot be empty (" + propertiesBitMap + ")");
|
|
470
483
|
return result;
|
|
471
484
|
}
|
|
472
485
|
function checkWrittenVersion(filePath, parsingVersion) {
|
|
473
|
-
filePath = resolve(__dirname, filePath);
|
|
474
|
-
const content = readFileSync(filePath, { encoding:
|
|
486
|
+
filePath = path_1.default.resolve(__dirname, filePath);
|
|
487
|
+
const content = fs_1.default.readFileSync(filePath, { encoding: "utf8" }).split("\n", 3);
|
|
475
488
|
const v = content[1];
|
|
476
|
-
if (!v.startsWith(
|
|
477
|
-
throw new Error(
|
|
489
|
+
if (!v.startsWith("// V=")) {
|
|
490
|
+
throw new Error("Could not detect definition version for '" + filePath + "'");
|
|
478
491
|
}
|
|
479
|
-
const version =
|
|
492
|
+
const version = parseInt(v.replace("// V=", ""), 10);
|
|
480
493
|
return parsingVersion >= version;
|
|
481
494
|
}
|
|
482
495
|
function rewriteProperties(className, properties) {
|
|
483
|
-
const filePath = resolve(__dirname,
|
|
484
|
-
if (!existsSync(filePath)) {
|
|
485
|
-
throw new Error(
|
|
496
|
+
const filePath = path_1.default.resolve(__dirname, "../" + className + ".ts");
|
|
497
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
498
|
+
throw new Error("File '" + filePath + "' does not exist!");
|
|
486
499
|
}
|
|
487
|
-
const file = readFileSync(filePath, { encoding:
|
|
488
|
-
const lines = file.split(
|
|
500
|
+
const file = fs_1.default.readFileSync(filePath, { encoding: "utf8" });
|
|
501
|
+
const lines = file.split("\n");
|
|
489
502
|
let i = 0;
|
|
490
503
|
let importStart = -1;
|
|
491
504
|
let importEnd = -1;
|
|
492
505
|
let foundImport = false;
|
|
493
506
|
for (; i < lines.length; i++) {
|
|
494
507
|
const line = lines[i];
|
|
495
|
-
if (line ===
|
|
508
|
+
if (line === "import type {") {
|
|
496
509
|
importStart = i; // save last import start;
|
|
497
510
|
}
|
|
498
|
-
else if (line ===
|
|
511
|
+
else if (line === "} from \"./definitions\";") {
|
|
499
512
|
importEnd = i;
|
|
500
513
|
foundImport = true;
|
|
501
514
|
break;
|
|
502
515
|
}
|
|
503
516
|
}
|
|
504
517
|
if (!foundImport) {
|
|
505
|
-
throw new Error(
|
|
518
|
+
throw new Error("Could not find import section!");
|
|
506
519
|
}
|
|
507
520
|
let startIndex = -1;
|
|
508
521
|
let stopIndex = -1;
|
|
509
522
|
for (; i < lines.length; i++) {
|
|
510
|
-
if (lines[i] ===
|
|
523
|
+
if (lines[i] === " // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-") {
|
|
511
524
|
startIndex = i;
|
|
512
525
|
break;
|
|
513
526
|
}
|
|
514
527
|
}
|
|
515
528
|
if (startIndex === -1) {
|
|
516
|
-
throw new Error(
|
|
529
|
+
throw new Error("Could not find start pattern in file!");
|
|
517
530
|
}
|
|
518
531
|
for (; i < lines.length; i++) {
|
|
519
|
-
if (lines[i] ===
|
|
532
|
+
if (lines[i] === " // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=") {
|
|
520
533
|
stopIndex = i;
|
|
521
534
|
break;
|
|
522
535
|
}
|
|
523
536
|
}
|
|
524
537
|
if (stopIndex === -1) {
|
|
525
|
-
throw new Error(
|
|
538
|
+
throw new Error("Could not find stop pattern in file!");
|
|
526
539
|
}
|
|
527
540
|
const importSize = importEnd - importStart - 1;
|
|
528
541
|
const newImports = properties
|
|
529
542
|
.filter(([key, value]) => key === value.className)
|
|
530
|
-
.map(([key]) =>
|
|
543
|
+
.map(([key]) => " " + key + ",");
|
|
531
544
|
lines.splice(importStart + 1, importSize, ...newImports); // remove current imports
|
|
532
545
|
const importDelta = newImports.length - importSize;
|
|
533
546
|
startIndex += importDelta;
|
|
534
547
|
stopIndex += importDelta;
|
|
535
548
|
const amount = stopIndex - startIndex - 1;
|
|
536
549
|
const newContentLines = properties.map(([key, value]) => {
|
|
537
|
-
let line =
|
|
550
|
+
let line = "";
|
|
538
551
|
let deprecatedNotice = value.deprecatedNotice;
|
|
539
552
|
if (key !== value.className) {
|
|
540
|
-
deprecatedNotice =
|
|
541
|
-
|
|
553
|
+
deprecatedNotice = "Please use {@link " + className + "." + value.className + "}." // prepend deprecated notice
|
|
554
|
+
+ (deprecatedNotice ? " " + deprecatedNotice : "");
|
|
542
555
|
}
|
|
543
|
-
line +=
|
|
544
|
-
line +=
|
|
556
|
+
line += " /**\n";
|
|
557
|
+
line += " * @group " + className + " Definitions\n";
|
|
545
558
|
if (deprecatedNotice) {
|
|
546
|
-
line +=
|
|
559
|
+
line += " * @deprecated " + deprecatedNotice + "\n";
|
|
547
560
|
}
|
|
548
|
-
line +=
|
|
549
|
-
line +=
|
|
561
|
+
line += " */\n";
|
|
562
|
+
line += " public static " + key + ": typeof " + value.className + ";";
|
|
550
563
|
return line;
|
|
551
564
|
});
|
|
552
565
|
lines.splice(startIndex + 1, amount, ...newContentLines); // insert new lines
|
|
553
|
-
const resultContent = lines.join(
|
|
554
|
-
writeFileSync(filePath, resultContent, { encoding:
|
|
566
|
+
const resultContent = lines.join("\n");
|
|
567
|
+
fs_1.default.writeFileSync(filePath, resultContent, { encoding: "utf8" });
|
|
555
568
|
}
|
|
556
569
|
function writeCharacteristicTestFile() {
|
|
557
570
|
const characteristics = Object.values(generatedCharacteristics).sort((a, b) => a.className.localeCompare(b.className));
|
|
558
|
-
const testOutput = createWriteStream(resolve(__dirname,
|
|
559
|
-
testOutput.write(
|
|
560
|
-
testOutput.write(
|
|
561
|
-
testOutput.write(
|
|
562
|
-
testOutput.write(
|
|
563
|
-
testOutput.write('import \'./index.js\'\n\n');
|
|
564
|
-
testOutput.write('describe(\'characteristicDefinitions\', () => {');
|
|
571
|
+
const testOutput = fs_1.default.createWriteStream(path_1.default.resolve(__dirname, "./CharacteristicDefinitions.spec.ts"), { encoding: "utf8" });
|
|
572
|
+
testOutput.write("// THIS FILE IS AUTO-GENERATED - DO NOT MODIFY\n");
|
|
573
|
+
testOutput.write("import \"./\";\n\n");
|
|
574
|
+
testOutput.write("import { Characteristic } from \"../Characteristic\";\n\n");
|
|
575
|
+
testOutput.write("describe(\"CharacteristicDefinitions\", () => {");
|
|
565
576
|
for (const generated of characteristics) {
|
|
566
|
-
testOutput.write(
|
|
567
|
-
testOutput.write(
|
|
577
|
+
testOutput.write("\n");
|
|
578
|
+
testOutput.write(" describe(\"" + generated.className + "\", () => {\n");
|
|
568
579
|
// first test is just calling the constructor
|
|
569
|
-
testOutput.write(
|
|
570
|
-
testOutput.write(
|
|
580
|
+
testOutput.write(" it(\"should be able to construct\", () => {\n");
|
|
581
|
+
testOutput.write(" new Characteristic." + generated.className + "();\n");
|
|
571
582
|
if (generated.deprecatedClassName) {
|
|
572
|
-
testOutput.write(
|
|
583
|
+
testOutput.write(" // noinspection JSDeprecatedSymbols\n");
|
|
584
|
+
testOutput.write(" new Characteristic." + generated.deprecatedClassName + "();\n");
|
|
573
585
|
}
|
|
574
|
-
testOutput.write(
|
|
575
|
-
testOutput.write(
|
|
586
|
+
testOutput.write(" });\n");
|
|
587
|
+
testOutput.write(" });\n");
|
|
576
588
|
}
|
|
577
|
-
testOutput.write(
|
|
589
|
+
testOutput.write("});\n");
|
|
578
590
|
testOutput.end();
|
|
579
591
|
}
|
|
580
592
|
function writeServicesTestFile() {
|
|
581
593
|
const services = Object.values(generatedServices).sort((a, b) => a.className.localeCompare(b.className));
|
|
582
|
-
const testOutput = createWriteStream(resolve(__dirname,
|
|
583
|
-
testOutput.write(
|
|
584
|
-
testOutput.write(
|
|
585
|
-
testOutput.write(
|
|
586
|
-
testOutput.write(
|
|
587
|
-
testOutput.write(
|
|
588
|
-
testOutput.write('describe(\'serviceDefinitions\', () => {');
|
|
594
|
+
const testOutput = fs_1.default.createWriteStream(path_1.default.resolve(__dirname, "./ServiceDefinitions.spec.ts"), { encoding: "utf8" });
|
|
595
|
+
testOutput.write("// THIS FILE IS AUTO-GENERATED - DO NOT MODIFY\n");
|
|
596
|
+
testOutput.write("import \"./\";\n\n");
|
|
597
|
+
testOutput.write("import { Characteristic } from \"../Characteristic\";\n");
|
|
598
|
+
testOutput.write("import { Service } from \"../Service\";\n\n");
|
|
599
|
+
testOutput.write("describe(\"ServiceDefinitions\", () => {");
|
|
589
600
|
for (const generated of services) {
|
|
590
|
-
testOutput.write(
|
|
591
|
-
testOutput.write(
|
|
601
|
+
testOutput.write("\n");
|
|
602
|
+
testOutput.write(" describe(\"" + generated.className + "\", () => {\n");
|
|
592
603
|
// first test is just calling the constructor
|
|
593
|
-
testOutput.write(
|
|
594
|
-
testOutput.write(
|
|
595
|
-
testOutput.write(
|
|
596
|
-
testOutput.write(
|
|
597
|
-
testOutput.write(
|
|
598
|
-
testOutput.write(
|
|
599
|
-
testOutput.write(
|
|
600
|
-
testOutput.write(
|
|
601
|
-
testOutput.write(
|
|
602
|
-
testOutput.write(
|
|
603
|
-
testOutput.write(
|
|
604
|
-
testOutput.write(
|
|
605
|
-
testOutput.write(
|
|
606
|
-
testOutput.write(
|
|
607
|
-
testOutput.write(
|
|
604
|
+
testOutput.write(" it(\"should be able to construct\", () => {\n");
|
|
605
|
+
testOutput.write(" const service0 = new Service." + generated.className + "();\n");
|
|
606
|
+
testOutput.write(" const service1 = new Service." + generated.className + "(\"test name\");\n");
|
|
607
|
+
testOutput.write(" const service2 = new Service." + generated.className + "(\"test name\", \"test sub type\");\n\n");
|
|
608
|
+
testOutput.write(" expect(service0.displayName).toBe(\"\");\n");
|
|
609
|
+
testOutput.write(" expect(service0.testCharacteristic(Characteristic.Name)).toBe(" + generated.requiredCharacteristics.includes("name") + ");\n");
|
|
610
|
+
testOutput.write(" expect(service0.subtype).toBeUndefined();\n\n");
|
|
611
|
+
testOutput.write(" expect(service1.displayName).toBe(\"test name\");\n");
|
|
612
|
+
testOutput.write(" expect(service1.testCharacteristic(Characteristic.Name)).toBe(true);\n");
|
|
613
|
+
testOutput.write(" expect(service1.getCharacteristic(Characteristic.Name).value).toBe(\"test name\");\n");
|
|
614
|
+
testOutput.write(" expect(service1.subtype).toBeUndefined();\n\n");
|
|
615
|
+
testOutput.write(" expect(service2.displayName).toBe(\"test name\");\n");
|
|
616
|
+
testOutput.write(" expect(service2.testCharacteristic(Characteristic.Name)).toBe(true);\n");
|
|
617
|
+
testOutput.write(" expect(service2.getCharacteristic(Characteristic.Name).value).toBe(\"test name\");\n");
|
|
618
|
+
testOutput.write(" expect(service2.subtype).toBe(\"test sub type\");\n");
|
|
608
619
|
if (generated.deprecatedClassName) {
|
|
609
|
-
testOutput.write(
|
|
620
|
+
testOutput.write(" // noinspection JSDeprecatedSymbols\n");
|
|
621
|
+
testOutput.write("\n new Service." + generated.deprecatedClassName + "();\n");
|
|
610
622
|
}
|
|
611
|
-
testOutput.write(
|
|
612
|
-
testOutput.write(
|
|
623
|
+
testOutput.write(" });\n");
|
|
624
|
+
testOutput.write(" });\n");
|
|
613
625
|
}
|
|
614
|
-
testOutput.write(
|
|
626
|
+
testOutput.write("});\n");
|
|
615
627
|
testOutput.end();
|
|
616
628
|
}
|
|
617
629
|
//# sourceMappingURL=generate-definitions.js.map
|