@homebridge-plugins/homebridge-tuya 2.0.2-beta.3
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/.idea/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/dictionaries/benpotter.xml +3 -0
- package/.idea/homebridge-tuya.iml +8 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.idea/workspace.xml +64 -0
- package/ADVANCED_OPTIONS.md +267 -0
- package/CHANGELOG.md +127 -0
- package/LICENSE +20 -0
- package/README.md +206 -0
- package/SUPPORTED_DEVICES.md +206 -0
- package/config.schema.json +550 -0
- package/dist/accessory/AccessoryFactory.js +274 -0
- package/dist/accessory/AccessoryFactory.js.map +1 -0
- package/dist/accessory/AirConditionerAccessory.js +307 -0
- package/dist/accessory/AirConditionerAccessory.js.map +1 -0
- package/dist/accessory/AirPurifierAccessory.js +90 -0
- package/dist/accessory/AirPurifierAccessory.js.map +1 -0
- package/dist/accessory/AirQualitySensorAccessory.js +30 -0
- package/dist/accessory/AirQualitySensorAccessory.js.map +1 -0
- package/dist/accessory/BaseAccessory.js +295 -0
- package/dist/accessory/BaseAccessory.js.map +1 -0
- package/dist/accessory/CameraAccessory.js +117 -0
- package/dist/accessory/CameraAccessory.js.map +1 -0
- package/dist/accessory/CarbonDioxideSensorAccessory.js +52 -0
- package/dist/accessory/CarbonDioxideSensorAccessory.js.map +1 -0
- package/dist/accessory/CarbonMonoxideSensorAccessory.js +52 -0
- package/dist/accessory/CarbonMonoxideSensorAccessory.js.map +1 -0
- package/dist/accessory/ContactSensorAccessory.js +30 -0
- package/dist/accessory/ContactSensorAccessory.js.map +1 -0
- package/dist/accessory/DehumidifierAccessory.js +68 -0
- package/dist/accessory/DehumidifierAccessory.js.map +1 -0
- package/dist/accessory/DiffuserAccessory.js +55 -0
- package/dist/accessory/DiffuserAccessory.js.map +1 -0
- package/dist/accessory/DimmerAccessory.js +94 -0
- package/dist/accessory/DimmerAccessory.js.map +1 -0
- package/dist/accessory/DoorbellAccessory.js +89 -0
- package/dist/accessory/DoorbellAccessory.js.map +1 -0
- package/dist/accessory/ExtractionHoodAccessory.js +118 -0
- package/dist/accessory/ExtractionHoodAccessory.js.map +1 -0
- package/dist/accessory/FanAccessory.js +123 -0
- package/dist/accessory/FanAccessory.js.map +1 -0
- package/dist/accessory/GarageDoorAccessory.js +69 -0
- package/dist/accessory/GarageDoorAccessory.js.map +1 -0
- package/dist/accessory/HeaterAccessory.js +96 -0
- package/dist/accessory/HeaterAccessory.js.map +1 -0
- package/dist/accessory/HumanPresenceSensorAccessory.js +20 -0
- package/dist/accessory/HumanPresenceSensorAccessory.js.map +1 -0
- package/dist/accessory/HumidifierAccessory.js +135 -0
- package/dist/accessory/HumidifierAccessory.js.map +1 -0
- package/dist/accessory/IRAirConditionerAccessory.js +285 -0
- package/dist/accessory/IRAirConditionerAccessory.js.map +1 -0
- package/dist/accessory/IRControlHubAccessory.js +49 -0
- package/dist/accessory/IRControlHubAccessory.js.map +1 -0
- package/dist/accessory/IRControlHubSubAccessory.js +53 -0
- package/dist/accessory/IRControlHubSubAccessory.js.map +1 -0
- package/dist/accessory/IRGenericAccessory.js +50 -0
- package/dist/accessory/IRGenericAccessory.js.map +1 -0
- package/dist/accessory/LeakSensorAccessory.js +36 -0
- package/dist/accessory/LeakSensorAccessory.js.map +1 -0
- package/dist/accessory/LightAccessory.js +36 -0
- package/dist/accessory/LightAccessory.js.map +1 -0
- package/dist/accessory/LightSensorAccessory.js +32 -0
- package/dist/accessory/LightSensorAccessory.js.map +1 -0
- package/dist/accessory/LocationWeatherAccessory.js +72 -0
- package/dist/accessory/LocationWeatherAccessory.js.map +1 -0
- package/dist/accessory/LockAccessory.js +56 -0
- package/dist/accessory/LockAccessory.js.map +1 -0
- package/dist/accessory/MotionSensorAccessory.js +20 -0
- package/dist/accessory/MotionSensorAccessory.js.map +1 -0
- package/dist/accessory/OutletAccessory.js +23 -0
- package/dist/accessory/OutletAccessory.js.map +1 -0
- package/dist/accessory/PetFeederAccessory.js +139 -0
- package/dist/accessory/PetFeederAccessory.js.map +1 -0
- package/dist/accessory/SceneAccessory.js +32 -0
- package/dist/accessory/SceneAccessory.js.map +1 -0
- package/dist/accessory/SceneSwitchAccessory.js +44 -0
- package/dist/accessory/SceneSwitchAccessory.js.map +1 -0
- package/dist/accessory/SecuritySystemAccessory.js +30 -0
- package/dist/accessory/SecuritySystemAccessory.js.map +1 -0
- package/dist/accessory/SmokeSensorAccessory.js +35 -0
- package/dist/accessory/SmokeSensorAccessory.js.map +1 -0
- package/dist/accessory/SwitchAccessory.js +86 -0
- package/dist/accessory/SwitchAccessory.js.map +1 -0
- package/dist/accessory/TemperatureHumiditySensorAccessory.js +24 -0
- package/dist/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
- package/dist/accessory/ThermostatAccessory.js +190 -0
- package/dist/accessory/ThermostatAccessory.js.map +1 -0
- package/dist/accessory/ValveAccessory.js +45 -0
- package/dist/accessory/ValveAccessory.js.map +1 -0
- package/dist/accessory/VibrationSensorAccessory.js +42 -0
- package/dist/accessory/VibrationSensorAccessory.js.map +1 -0
- package/dist/accessory/WeatherStationAccessory.js +59 -0
- package/dist/accessory/WeatherStationAccessory.js.map +1 -0
- package/dist/accessory/WetBulbGlobeTemperatureAccessory.js +23 -0
- package/dist/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
- package/dist/accessory/WhiteNoiseLightAccessory.js +59 -0
- package/dist/accessory/WhiteNoiseLightAccessory.js.map +1 -0
- package/dist/accessory/WindowAccessory.js +14 -0
- package/dist/accessory/WindowAccessory.js.map +1 -0
- package/dist/accessory/WindowCoveringAccessory.js +156 -0
- package/dist/accessory/WindowCoveringAccessory.js.map +1 -0
- package/dist/accessory/WirelessSwitchAccessory.js +42 -0
- package/dist/accessory/WirelessSwitchAccessory.js.map +1 -0
- package/dist/accessory/characteristic/Active.js +23 -0
- package/dist/accessory/characteristic/Active.js.map +1 -0
- package/dist/accessory/characteristic/AirQuality.js +75 -0
- package/dist/accessory/characteristic/AirQuality.js.map +1 -0
- package/dist/accessory/characteristic/CurrentRelativeHumidity.js +24 -0
- package/dist/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
- package/dist/accessory/characteristic/CurrentTemperature.js +24 -0
- package/dist/accessory/characteristic/CurrentTemperature.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWeather.js +51 -0
- package/dist/accessory/characteristic/CurrentWeather.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js +81 -0
- package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js +50 -0
- package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
- package/dist/accessory/characteristic/EnergyUsage.js +103 -0
- package/dist/accessory/characteristic/EnergyUsage.js.map +1 -0
- package/dist/accessory/characteristic/Light.js +269 -0
- package/dist/accessory/characteristic/Light.js.map +1 -0
- package/dist/accessory/characteristic/LightSensor.js +24 -0
- package/dist/accessory/characteristic/LightSensor.js.map +1 -0
- package/dist/accessory/characteristic/LockPhysicalControls.js +22 -0
- package/dist/accessory/characteristic/LockPhysicalControls.js.map +1 -0
- package/dist/accessory/characteristic/MotionDetected.js +23 -0
- package/dist/accessory/characteristic/MotionDetected.js.map +1 -0
- package/dist/accessory/characteristic/Name.js +12 -0
- package/dist/accessory/characteristic/Name.js.map +1 -0
- package/dist/accessory/characteristic/OccupancyDetected.js +20 -0
- package/dist/accessory/characteristic/OccupancyDetected.js.map +1 -0
- package/dist/accessory/characteristic/On.js +26 -0
- package/dist/accessory/characteristic/On.js.map +1 -0
- package/dist/accessory/characteristic/OutletInUse.js +15 -0
- package/dist/accessory/characteristic/OutletInUse.js.map +1 -0
- package/dist/accessory/characteristic/ProgrammableSwitchEvent.js +90 -0
- package/dist/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
- package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js +29 -0
- package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
- package/dist/accessory/characteristic/RotationSpeed.js +79 -0
- package/dist/accessory/characteristic/RotationSpeed.js.map +1 -0
- package/dist/accessory/characteristic/SecuritySystemState.js +76 -0
- package/dist/accessory/characteristic/SecuritySystemState.js.map +1 -0
- package/dist/accessory/characteristic/SwingMode.js +22 -0
- package/dist/accessory/characteristic/SwingMode.js.map +1 -0
- package/dist/accessory/characteristic/TemperatureDisplayUnits.js +26 -0
- package/dist/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/core/TuyaOpenAPI.js +314 -0
- package/dist/core/TuyaOpenAPI.js.map +1 -0
- package/dist/core/TuyaOpenMQ.js +182 -0
- package/dist/core/TuyaOpenMQ.js.map +1 -0
- package/dist/device/TuyaCustomDeviceManager.js +65 -0
- package/dist/device/TuyaCustomDeviceManager.js.map +1 -0
- package/dist/device/TuyaDevice.js +37 -0
- package/dist/device/TuyaDevice.js.map +1 -0
- package/dist/device/TuyaDeviceManager.js +447 -0
- package/dist/device/TuyaDeviceManager.js.map +1 -0
- package/dist/device/TuyaHomeDeviceManager.js +64 -0
- package/dist/device/TuyaHomeDeviceManager.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.js +466 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.js +18 -0
- package/dist/settings.js.map +1 -0
- package/dist/util/FfmpegStreamingProcess.js +126 -0
- package/dist/util/FfmpegStreamingProcess.js.map +1 -0
- package/dist/util/InfraredTool.js +396 -0
- package/dist/util/InfraredTool.js.map +1 -0
- package/dist/util/Logger.js +42 -0
- package/dist/util/Logger.js.map +1 -0
- package/dist/util/TuyaRecordingDelegate.js +22 -0
- package/dist/util/TuyaRecordingDelegate.js.map +1 -0
- package/dist/util/TuyaStreamDelegate.js +330 -0
- package/dist/util/TuyaStreamDelegate.js.map +1 -0
- package/dist/util/color.js +24 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/util.js +48 -0
- package/dist/util/util.js.map +1 -0
- package/jest.config.js +5 -0
- package/package.json +74 -0
- package/test/custom.test.ts +101 -0
- package/test/home.test.ts +81 -0
- package/test/util.ts +39 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const events_1 = __importDefault(require("events"));
|
|
30
|
+
const TuyaOpenMQ_1 = __importDefault(require("../core/TuyaOpenMQ"));
|
|
31
|
+
const Logger_1 = require("../util/Logger");
|
|
32
|
+
const TuyaDevice_1 = __importStar(require("./TuyaDevice"));
|
|
33
|
+
var Events;
|
|
34
|
+
(function (Events) {
|
|
35
|
+
Events["DEVICE_ADD"] = "DEVICE_ADD";
|
|
36
|
+
Events["DEVICE_INFO_UPDATE"] = "DEVICE_INFO_UPDATE";
|
|
37
|
+
Events["DEVICE_STATUS_UPDATE"] = "DEVICE_STATUS_UPDATE";
|
|
38
|
+
Events["DEVICE_DELETE"] = "DEVICE_DELETE";
|
|
39
|
+
})(Events || (Events = {}));
|
|
40
|
+
var TuyaMQTTProtocol;
|
|
41
|
+
(function (TuyaMQTTProtocol) {
|
|
42
|
+
TuyaMQTTProtocol[TuyaMQTTProtocol["DEVICE_STATUS_UPDATE"] = 4] = "DEVICE_STATUS_UPDATE";
|
|
43
|
+
TuyaMQTTProtocol[TuyaMQTTProtocol["DEVICE_INFO_UPDATE"] = 20] = "DEVICE_INFO_UPDATE";
|
|
44
|
+
})(TuyaMQTTProtocol || (TuyaMQTTProtocol = {}));
|
|
45
|
+
class TuyaDeviceManager extends events_1.default {
|
|
46
|
+
constructor(api, debug = false) {
|
|
47
|
+
super();
|
|
48
|
+
this.api = api;
|
|
49
|
+
this.debug = debug;
|
|
50
|
+
this.ownerIDs = [];
|
|
51
|
+
this.devices = [];
|
|
52
|
+
const log = this.api.log.log;
|
|
53
|
+
this.log = new Logger_1.PrefixLogger(log, TuyaDeviceManager.name, debug);
|
|
54
|
+
this.mq = new TuyaOpenMQ_1.default(api, log);
|
|
55
|
+
this.mq.addMessageListener(this.onMQTTMessage.bind(this));
|
|
56
|
+
}
|
|
57
|
+
createVirtualDevice(baseDevice, uuid) {
|
|
58
|
+
const cloneDevice = new TuyaDevice_1.default(baseDevice);
|
|
59
|
+
const uniqueId = uuid || Date.now().toString(36) + Math.random().toString(36).substring(2);
|
|
60
|
+
cloneDevice.id = `${uniqueId}`;
|
|
61
|
+
cloneDevice.uuid = `${uniqueId}`;
|
|
62
|
+
cloneDevice.name = 'Virtual Device';
|
|
63
|
+
cloneDevice.product_id = `${uniqueId}`;
|
|
64
|
+
cloneDevice.product_name = 'virtual product';
|
|
65
|
+
cloneDevice.sub = true;
|
|
66
|
+
cloneDevice.ip = '';
|
|
67
|
+
cloneDevice.parent_id = baseDevice.id;
|
|
68
|
+
cloneDevice.remote_keys = undefined;
|
|
69
|
+
return cloneDevice;
|
|
70
|
+
}
|
|
71
|
+
getDevice(deviceID) {
|
|
72
|
+
return Array.from(this.devices).find(device => device.id === deviceID);
|
|
73
|
+
}
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
+
async updateDevices(ownerIDs) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
async updateDevice(deviceID) {
|
|
79
|
+
const res = await this.getDeviceInfo(deviceID);
|
|
80
|
+
if (!res.success) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const device = new TuyaDevice_1.default(res.result);
|
|
84
|
+
device.schema = await this.getDeviceSchema(deviceID);
|
|
85
|
+
const oldDevice = this.getDevice(deviceID);
|
|
86
|
+
if (oldDevice) {
|
|
87
|
+
this.devices.splice(this.devices.indexOf(oldDevice), 1);
|
|
88
|
+
}
|
|
89
|
+
this.devices.push(device);
|
|
90
|
+
return device;
|
|
91
|
+
}
|
|
92
|
+
async getDeviceInfo(deviceID) {
|
|
93
|
+
const res = await this.api.get(`/v1.0/devices/${deviceID}`);
|
|
94
|
+
return res;
|
|
95
|
+
}
|
|
96
|
+
async getDeviceListInfo(deviceIDs = []) {
|
|
97
|
+
const res = await this.api.get('/v1.0/devices', { 'device_ids': deviceIDs.join(',') });
|
|
98
|
+
return res;
|
|
99
|
+
}
|
|
100
|
+
async getDeviceSchema(deviceID) {
|
|
101
|
+
// const res = await this.api.get(`/v1.2/iot-03/devices/${deviceID}/specification`);
|
|
102
|
+
const res = await this.api.get(`/v1.0/devices/${deviceID}/specifications`);
|
|
103
|
+
if (res.success === false) {
|
|
104
|
+
this.log.warn('Get device specification failed. devId = %s, code = %s, msg = %s', deviceID, res.code, res.msg);
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
// Combine functions and status together, as it used to be.
|
|
108
|
+
const schemas = new Map();
|
|
109
|
+
for (const { code, type, values } of [...res.result.status, ...res.result.functions]) {
|
|
110
|
+
if (schemas[code]) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const read = (res.result.status).find(schema => schema.code === code) !== undefined;
|
|
114
|
+
const write = (res.result.functions).find(schema => schema.code === code) !== undefined;
|
|
115
|
+
let mode = TuyaDevice_1.TuyaDeviceSchemaMode.UNKNOWN;
|
|
116
|
+
if (read && write) {
|
|
117
|
+
mode = TuyaDevice_1.TuyaDeviceSchemaMode.READ_WRITE;
|
|
118
|
+
}
|
|
119
|
+
else if (read && !write) {
|
|
120
|
+
mode = TuyaDevice_1.TuyaDeviceSchemaMode.READ_ONLY;
|
|
121
|
+
}
|
|
122
|
+
else if (!read && write) {
|
|
123
|
+
mode = TuyaDevice_1.TuyaDeviceSchemaMode.WRITE_ONLY;
|
|
124
|
+
}
|
|
125
|
+
let property;
|
|
126
|
+
try {
|
|
127
|
+
property = JSON.parse(values);
|
|
128
|
+
schemas[code] = { code, mode, type, property };
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// ignore infrared remote's invalid schema because it's not used.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return Object.values(schemas).sort((a, b) => a.code > b.code ? 1 : -1);
|
|
135
|
+
}
|
|
136
|
+
async getInfraredRemotes(infraredID) {
|
|
137
|
+
const res = await this.api.get(`/v2.0/infrareds/${infraredID}/remotes`);
|
|
138
|
+
return res;
|
|
139
|
+
}
|
|
140
|
+
async getInfraredKeys(infraredID, remoteID) {
|
|
141
|
+
const res = await this.api.get(`/v2.0/infrareds/${infraredID}/remotes/${remoteID}/keys`);
|
|
142
|
+
return res;
|
|
143
|
+
}
|
|
144
|
+
async getInfraredACStatus(infraredID, remoteID) {
|
|
145
|
+
const res = await this.api.get(`/v2.0/infrareds/${infraredID}/remotes/${remoteID}/ac/status`);
|
|
146
|
+
return res;
|
|
147
|
+
}
|
|
148
|
+
async getInfraredDIYKeys(infraredID, remoteID) {
|
|
149
|
+
const res = await this.api.get(`/v2.0/infrareds/${infraredID}/remotes/${remoteID}/learning-codes`);
|
|
150
|
+
return res;
|
|
151
|
+
}
|
|
152
|
+
resolveInfraredRemotes(parentDevice, allDevices) {
|
|
153
|
+
const isInfraredRemoteDevice = (parent, target) => {
|
|
154
|
+
if (!target.sub || !target.category.startsWith('infrared_')) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
if (parent.lat === target.lat && parent.lon === target.lon) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
if (parent.update_time === target.update_time) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
};
|
|
165
|
+
const infraredRemotes = allDevices.filter(device => {
|
|
166
|
+
return isInfraredRemoteDevice(parentDevice, device);
|
|
167
|
+
}).map(device => {
|
|
168
|
+
return {
|
|
169
|
+
'category_id': 999,
|
|
170
|
+
'remote_id': device.id,
|
|
171
|
+
'resolved': true,
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
return infraredRemotes;
|
|
175
|
+
}
|
|
176
|
+
fixInfraredDevice(subDevice) {
|
|
177
|
+
subDevice.remote_keys.org_category_id = subDevice.remote_keys.category_id;
|
|
178
|
+
subDevice.remote_keys.category_id = this.resolveHAPCategoryID(subDevice);
|
|
179
|
+
}
|
|
180
|
+
resolveHAPCategoryID(subDevice) {
|
|
181
|
+
var _a, _b;
|
|
182
|
+
this.log.debug(`resolve HAP category ID. subDevice category:${subDevice.category}, categoryID:${(_a = subDevice.remote_keys) === null || _a === void 0 ? void 0 : _a.category_id}`);
|
|
183
|
+
let category_id;
|
|
184
|
+
switch (subDevice.product_id) {
|
|
185
|
+
case 'prsgoryjfdtb42r4':
|
|
186
|
+
category_id = 8; // Fan
|
|
187
|
+
break;
|
|
188
|
+
case 'k6ozylayfgnskuq6':
|
|
189
|
+
category_id = 999; // DIY
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
category_id = ((_b = subDevice.remote_keys) === null || _b === void 0 ? void 0 : _b.category_id) || 999; // DIY;
|
|
193
|
+
}
|
|
194
|
+
this.log.debug(`resolved HAP category ID:${category_id}`);
|
|
195
|
+
return category_id;
|
|
196
|
+
}
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
198
|
+
dump(obj) {
|
|
199
|
+
for (const key in obj) {
|
|
200
|
+
try {
|
|
201
|
+
if ((typeof obj[key]) === 'function') {
|
|
202
|
+
this.log.warn(`\t function ${key}:${obj[key].name}`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this.log.warn(`\t ${key}:${obj[key]}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
this.dump(e);
|
|
210
|
+
}
|
|
211
|
+
if ((typeof obj[key]) !== 'string') {
|
|
212
|
+
for (const key2 in obj[key]) {
|
|
213
|
+
try {
|
|
214
|
+
if ((typeof obj[key][key2]) === 'function') {
|
|
215
|
+
this.log.warn(`\t function ${key2}:${obj[key][key2].name}`);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
this.log.warn(`\t ${key2}:${obj[key][key2]}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
this.dump(e);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async updateInfraredRemotes(allDevices) {
|
|
229
|
+
var _a, _b, _c, _d, _e;
|
|
230
|
+
const irDevices = allDevices.filter(device => device.isIRControlHub());
|
|
231
|
+
for (const irDevice of irDevices) {
|
|
232
|
+
const res = await this.getInfraredRemotes(irDevice.id);
|
|
233
|
+
if (!res.success) {
|
|
234
|
+
this.log.warn('Get infrared remotes failed. deviceId = %s, code = %s, msg = %s', irDevice.id, res.code, res.msg);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
let resResult = res.result;
|
|
238
|
+
for (const resolvedRemoteDevice of this.resolveInfraredRemotes(irDevice, allDevices)) {
|
|
239
|
+
resResult.forEach(remoteDevice => {
|
|
240
|
+
if (remoteDevice.remote_id === resolvedRemoteDevice.remote_id) {
|
|
241
|
+
remoteDevice.org_category_id = remoteDevice.category_id;
|
|
242
|
+
remoteDevice.category_id = resolvedRemoteDevice.category_id;
|
|
243
|
+
remoteDevice.resolved = true;
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
if (resResult.length === 0) {
|
|
248
|
+
// for legacy devices
|
|
249
|
+
this.log.warn('no result for Get infrared remotes.');
|
|
250
|
+
this.log.info('resolving infrared remotes from device list...');
|
|
251
|
+
resResult = this.resolveInfraredRemotes(irDevice, allDevices);
|
|
252
|
+
this.log.success(`${resResult.length} infrared remote device found.`);
|
|
253
|
+
}
|
|
254
|
+
for (const { category_id, remote_id, resolved } of resResult) {
|
|
255
|
+
const subDevice = allDevices.find(device => device.id === remote_id);
|
|
256
|
+
if (!subDevice) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
subDevice.parent_id = irDevice.id;
|
|
260
|
+
subDevice.schema = [];
|
|
261
|
+
const res = await this.getInfraredKeys(irDevice.id, subDevice.id);
|
|
262
|
+
if (!res.success) {
|
|
263
|
+
this.log.warn('Get infrared remote keys failed. deviceId = %s, code = %s, msg = %s', subDevice.id, res.code, res.msg);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
subDevice.remote_keys = res.result || {};
|
|
267
|
+
this.log.debug(`infrared keys lengh:${(_b = (_a = subDevice.remote_keys) === null || _a === void 0 ? void 0 : _a.key_list) === null || _b === void 0 ? void 0 : _b.length}`);
|
|
268
|
+
if (resolved) {
|
|
269
|
+
this.fixInfraredDevice(subDevice);
|
|
270
|
+
}
|
|
271
|
+
if (subDevice.category === 'infrared_ac') { // AC Device
|
|
272
|
+
const res = await this.getInfraredACStatus(irDevice.id, subDevice.id);
|
|
273
|
+
if (!res.success) {
|
|
274
|
+
this.log.warn('Get infrared ac status failed. deviceId = %s, code = %s, msg = %s', subDevice.id, res.code, res.msg);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
subDevice.status = Object.entries(res.result).map(([key, value]) => ({ code: key, value }));
|
|
278
|
+
}
|
|
279
|
+
else if (category_id === 999) { // DIY Device
|
|
280
|
+
const res = await this.getInfraredDIYKeys(irDevice.id, subDevice.id);
|
|
281
|
+
if (!res.success) {
|
|
282
|
+
this.log.warn('Get infrared diy keys failed. deviceId = %s, code = %s, msg = %s', subDevice.id, res.code, res.msg);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const key_list = ((_c = subDevice.remote_keys) === null || _c === void 0 ? void 0 : _c.key_list) || [];
|
|
286
|
+
this.log.debug(`key list length:${key_list.length}`);
|
|
287
|
+
const ignoreList = [];
|
|
288
|
+
for (const key of key_list) {
|
|
289
|
+
if (key.standard_key) {
|
|
290
|
+
if (resolved) {
|
|
291
|
+
ignoreList.push(key);
|
|
292
|
+
}
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const item = res.result.find(item => item['id'] === key.key_id && item['key'] === key.key);
|
|
296
|
+
if (!item) {
|
|
297
|
+
if (resolved) {
|
|
298
|
+
ignoreList.push(key);
|
|
299
|
+
}
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
this.log.debug('learning_code:', item['code']);
|
|
303
|
+
key.learning_code = item['code'];
|
|
304
|
+
}
|
|
305
|
+
if (subDevice.remote_keys && ignoreList.length !== 0) {
|
|
306
|
+
this.log.debug('remove standard instructions. not need for DIY Device');
|
|
307
|
+
subDevice.remote_keys.key_list = (_d = subDevice.remote_keys) === null || _d === void 0 ? void 0 : _d.key_list.filter(item => !ignoreList.includes(item));
|
|
308
|
+
this.log.debug(`new key list length:${(_e = subDevice.remote_keys) === null || _e === void 0 ? void 0 : _e.key_list.length}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async sendInfraredCommands(infraredID, remoteID, category_id, remote_index, key, key_id) {
|
|
315
|
+
const res = await this.api.post(`/v2.0/infrareds/${infraredID}/remotes/${remoteID}/raw/command`, {
|
|
316
|
+
category_id, remote_index, key, key_id,
|
|
317
|
+
});
|
|
318
|
+
return res;
|
|
319
|
+
}
|
|
320
|
+
async sendInfraredACCommands(infraredID, remoteID, power, mode, temp, wind) {
|
|
321
|
+
const commands = (power === 1) ? { power, mode, temp, wind } : { power };
|
|
322
|
+
const res = await this.api.post(`/v2.0/infrareds/${infraredID}/air-conditioners/${remoteID}/scenes/command`, commands);
|
|
323
|
+
if (!res.success) {
|
|
324
|
+
this.log.info('Send AC command failed. code = %d, msg = %s', res.code, res.msg);
|
|
325
|
+
}
|
|
326
|
+
return res;
|
|
327
|
+
}
|
|
328
|
+
async sendInfraredDIYCommands(infraredID, remoteID, code) {
|
|
329
|
+
const res = await this.api.post(`/v2.0/infrareds/${infraredID}/remotes/${remoteID}/learning-codes`, { code });
|
|
330
|
+
// const res = await this.api.post(`/v1.0/infrareds/${infraredID}/remotes/${remoteID}/learning-codes`, { code });
|
|
331
|
+
return res;
|
|
332
|
+
}
|
|
333
|
+
async getLockTemporaryKey(deviceID) {
|
|
334
|
+
// const res = await this.api.post(`/v1.0/smart-lock/devices/${deviceID}/door-lock/password-ticket`);
|
|
335
|
+
const res = await this.api.post(`/v1.0/smart-lock/devices/${deviceID}/password-ticket`);
|
|
336
|
+
if (res.success === false) {
|
|
337
|
+
this.log.warn('Get Temporary Pass failed. devID = %s, code = %s, msg = %s', deviceID, res.code, res.msg);
|
|
338
|
+
}
|
|
339
|
+
return res;
|
|
340
|
+
}
|
|
341
|
+
async sendLockCommands(deviceID, ticketID, open) {
|
|
342
|
+
const res = await this.api.post(`/v1.0/smart-lock/devices/${deviceID}/password-free/door-operate`, {
|
|
343
|
+
device_id: deviceID,
|
|
344
|
+
ticket_id: ticketID,
|
|
345
|
+
open,
|
|
346
|
+
});
|
|
347
|
+
return res;
|
|
348
|
+
}
|
|
349
|
+
async sendCommands(deviceID, commands) {
|
|
350
|
+
const res = await this.api.post(`/v1.0/devices/${deviceID}/commands`, { commands });
|
|
351
|
+
return res.result;
|
|
352
|
+
}
|
|
353
|
+
async getCurrentWeather(lat, lon) {
|
|
354
|
+
const res = await this.api.get(`/v2.0/iot-03/weather/current?lat=${lat}&lon=${lon}`);
|
|
355
|
+
return res.result;
|
|
356
|
+
}
|
|
357
|
+
async getCurrentWeatherByOpenMeteo(lat, lon) {
|
|
358
|
+
/** <a href="https://open-meteo.com/">Weather data by Open-Meteo.com</a> */
|
|
359
|
+
// eslint-disable-next-line max-len
|
|
360
|
+
const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lon}¤t=temperature_2m,relative_humidity_2m`, { cache: 'no-cache' });
|
|
361
|
+
return await res.json();
|
|
362
|
+
}
|
|
363
|
+
async onMQTTMessage(topic, protocol, message) {
|
|
364
|
+
switch (protocol) {
|
|
365
|
+
case TuyaMQTTProtocol.DEVICE_STATUS_UPDATE: {
|
|
366
|
+
const { devId, status } = message;
|
|
367
|
+
const device = this.getDevice(devId);
|
|
368
|
+
if (!device) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
for (const item of device.status) {
|
|
372
|
+
const _item = status.find(_item => _item.code === item.code);
|
|
373
|
+
if (!_item) {
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
item.value = _item.value;
|
|
377
|
+
}
|
|
378
|
+
this.emit(Events.DEVICE_STATUS_UPDATE, device, status);
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
case TuyaMQTTProtocol.DEVICE_INFO_UPDATE: {
|
|
382
|
+
const { bizCode, bizData, devId } = message;
|
|
383
|
+
if (bizCode === 'bindUser') {
|
|
384
|
+
const { ownerId } = bizData;
|
|
385
|
+
if (!this.ownerIDs.includes(ownerId)) {
|
|
386
|
+
this.log.warn('Update devId = %s not included in your ownerIDs. Skip.', devId);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
// TODO failed if request to quickly
|
|
390
|
+
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
391
|
+
const device = await this.updateDevice(devId);
|
|
392
|
+
if (!device) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
this.mq.start(); // Force reconnect, unless new device status update won't get received
|
|
396
|
+
this.emit(Events.DEVICE_ADD, device);
|
|
397
|
+
}
|
|
398
|
+
else if (bizCode === 'nameUpdate') {
|
|
399
|
+
const { name } = bizData;
|
|
400
|
+
const device = this.getDevice(devId);
|
|
401
|
+
if (!device) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
device.name = name;
|
|
405
|
+
this.emit(Events.DEVICE_INFO_UPDATE, device, bizData);
|
|
406
|
+
}
|
|
407
|
+
else if (bizCode === 'online' || bizCode === 'offline') {
|
|
408
|
+
const device = this.getDevice(devId);
|
|
409
|
+
if (!device) {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
device.online = (bizCode === 'online') ? true : false;
|
|
413
|
+
this.emit(Events.DEVICE_INFO_UPDATE, device, bizData);
|
|
414
|
+
}
|
|
415
|
+
else if (bizCode === 'delete') {
|
|
416
|
+
const { ownerId } = bizData;
|
|
417
|
+
if (!this.ownerIDs.includes(ownerId)) {
|
|
418
|
+
this.log.warn('Remove devId = %s not included in your ownerIDs. Skip.', devId);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const device = this.getDevice(devId);
|
|
422
|
+
if (!device) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
this.devices.splice(this.devices.indexOf(device), 1);
|
|
426
|
+
this.emit(Events.DEVICE_DELETE, devId);
|
|
427
|
+
}
|
|
428
|
+
else if (bizCode === 'event_notify') {
|
|
429
|
+
// doorbell event
|
|
430
|
+
}
|
|
431
|
+
else if (bizCode === 'p2pSignal') {
|
|
432
|
+
// p2p signal
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.log.warn('Unhandled mqtt message: bizCode = %s, bizData = %o', bizCode, bizData);
|
|
436
|
+
}
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
default:
|
|
440
|
+
this.log.warn('Unhandled mqtt message: protocol = %s, message = %o', protocol, message);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
exports.default = TuyaDeviceManager;
|
|
446
|
+
TuyaDeviceManager.Events = Events;
|
|
447
|
+
//# sourceMappingURL=TuyaDeviceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TuyaDeviceManager.js","sourceRoot":"","sources":["../../src/device/TuyaDeviceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const TuyaDevice_1 = __importDefault(require("./TuyaDevice"));
|
|
7
|
+
const TuyaDeviceManager_1 = __importDefault(require("./TuyaDeviceManager"));
|
|
8
|
+
class TuyaHomeDeviceManager extends TuyaDeviceManager_1.default {
|
|
9
|
+
async getHomeList() {
|
|
10
|
+
const res = await this.api.get(`/v1.0/users/${this.api.tokenInfo.uid}/homes`);
|
|
11
|
+
return res;
|
|
12
|
+
}
|
|
13
|
+
async getHomeDeviceList(homeID) {
|
|
14
|
+
const res = await this.api.get(`/v1.0/homes/${homeID}/devices`);
|
|
15
|
+
return res;
|
|
16
|
+
}
|
|
17
|
+
async updateDevices(homeIDList) {
|
|
18
|
+
let devices = [];
|
|
19
|
+
for (const homeID of homeIDList) {
|
|
20
|
+
const res = await this.getHomeDeviceList(homeID);
|
|
21
|
+
devices = devices.concat(res.result.map(obj => new TuyaDevice_1.default(obj)));
|
|
22
|
+
}
|
|
23
|
+
if (devices.length === 0) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
for (const device of devices) {
|
|
27
|
+
device.schema = await this.getDeviceSchema(device.id);
|
|
28
|
+
}
|
|
29
|
+
// this.log.debug('Devices updated.\n', JSON.stringify(devices, null, 2));
|
|
30
|
+
this.devices = devices;
|
|
31
|
+
return devices;
|
|
32
|
+
}
|
|
33
|
+
async getSceneList(homeID) {
|
|
34
|
+
const res = await this.api.get(`/v1.1/homes/${homeID}/scenes`);
|
|
35
|
+
if (res.success === false) {
|
|
36
|
+
this.log.warn('Get scene list failed. homeId = %d, code = %s, msg = %s', homeID, res.code, res.msg);
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const scenes = [];
|
|
40
|
+
for (const { scene_id, name, enabled, status } of res.result) {
|
|
41
|
+
if (enabled !== true || status !== '1') {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
scenes.push(new TuyaDevice_1.default({
|
|
45
|
+
id: scene_id,
|
|
46
|
+
uuid: scene_id,
|
|
47
|
+
name,
|
|
48
|
+
owner_id: homeID.toString(),
|
|
49
|
+
product_id: 'scene',
|
|
50
|
+
category: 'scene',
|
|
51
|
+
schema: [],
|
|
52
|
+
status: [],
|
|
53
|
+
online: true,
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
return scenes;
|
|
57
|
+
}
|
|
58
|
+
async executeScene(homeID, sceneID) {
|
|
59
|
+
const res = await this.api.post(`/v1.0/homes/${homeID}/scenes/${sceneID}/trigger`);
|
|
60
|
+
return res;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.default = TuyaHomeDeviceManager;
|
|
64
|
+
//# sourceMappingURL=TuyaHomeDeviceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TuyaHomeDeviceManager.js","sourceRoot":"","sources":["../../src/device/TuyaHomeDeviceManager.ts"],"names":[],"mappings":";;;;;AAAA,8DAAsC;AACtC,4EAAoD;AAEpD,MAAqB,qBAAsB,SAAQ,2BAAiB;IAElE,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC9E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,MAAM,UAAU,CAAC,CAAC;QAChE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAoB;QAEtC,IAAI,OAAO,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;YAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAE,GAAG,CAAC,MAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,oBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9E;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,OAAO,EAAE,CAAC;SACX;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACvD;QAED,0EAA0E;QAC1E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,MAAM,SAAS,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yDAAyD,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACpG,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE;YAC5D,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE;gBACtC,SAAS;aACV;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAU,CAAC;gBACzB,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI;gBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC3B,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,IAAI;aACb,CAAC,CAAC,CAAC;SACL;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAuB,EAAE,OAAe;QACzD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,MAAM,WAAW,OAAO,UAAU,CAAC,CAAC;QACnF,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAhED,wCAgEC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,yCAA2C;AAC3C,yCAA0C;AAK1C,iBAAS,CAAC,GAAQ,EAAE,EAAE;IACpB,GAAG,CAAC,gBAAgB,CAAC,wBAAa,EAAE,uBAAY,CAAC,CAAC;AACpD,CAAC,CAAC"}
|