homebridge-ring 11.0.3 → 11.0.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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [11.0.6](https://github.com/dgreif/ring/compare/v11.0.5...v11.0.6) (2022-06-29)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* update dependencies ([0c91c3e](https://github.com/dgreif/ring/commit/0c91c3e6e9c93883cde6275960be0adf930297cf))
|
|
11
|
+
|
|
12
|
+
### [11.0.5](https://github.com/dgreif/ring/compare/v11.0.4...v11.0.5) (2022-06-12)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* update dependencies ([088271f](https://github.com/dgreif/ring/commit/088271febe1ccd77981f0586dea811206d11ca42))
|
|
18
|
+
|
|
19
|
+
### [11.0.4](https://github.com/dgreif/ring/compare/v11.0.3...v11.0.4) (2022-05-29)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* handle unanswered calls when transcoding ([6f9d3df](https://github.com/dgreif/ring/commit/6f9d3dfa079f046a6b5cfa140fd67eb210669429))
|
|
25
|
+
* update werift and ring edge connection strategy ([7b786f3](https://github.com/dgreif/ring/commit/7b786f3ffd9ad8eb4a8f03f5eac9ca6c67517aae))
|
|
26
|
+
|
|
5
27
|
### [11.0.3](https://github.com/dgreif/ring/compare/v11.0.2...v11.0.3) (2022-05-28)
|
|
6
28
|
|
|
7
29
|
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://www.npmjs.com/package/homebridge-ring)
|
|
9
9
|
[](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
|
|
10
10
|
[](https://plugins.hoobs.org/plugin/homebridge-ring)
|
|
11
|
-
[](https://discord.gg/
|
|
11
|
+
[](https://discord.gg/CXryEzNC)
|
|
12
12
|
[](https://www.paypal.me/dustingreif)
|
|
13
13
|
|
|
14
14
|
This [Homebridge](https://github.com/nfarina/homebridge) plugin provides a platform for
|
|
@@ -70,28 +70,28 @@ Only include an optional parameter if you actually need it. Default behavior wi
|
|
|
70
70
|
}
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
Option
|
|
74
|
-
|
|
75
|
-
`alarmOnEntryDelay`
|
|
76
|
-
`beamDurationSeconds`
|
|
77
|
-
`hideDeviceIds`
|
|
78
|
-
`hideLightGroups`
|
|
79
|
-
`hideDoorbellSwitch`
|
|
80
|
-
`hideCameraLight`
|
|
81
|
-
`hideCameraMotionSensor`
|
|
82
|
-
`hideCameraSirenSwitch`
|
|
83
|
-
`hideInHomeDoorbellSwitch`
|
|
84
|
-
`hideAlarmSirenSwitch`
|
|
85
|
-
`hideUnsupportedServices`
|
|
86
|
-
`showPanicButtons`
|
|
87
|
-
`nightModeBypassFor`
|
|
88
|
-
`avoidSnapshotBatteryDrain`
|
|
89
|
-
`cameraStatusPollingSeconds` | `20`
|
|
90
|
-
`locationModePollingSeconds` | `20`
|
|
91
|
-
`locationIds`
|
|
92
|
-
`onlyDeviceTypes`
|
|
93
|
-
`ffmpegPath`
|
|
94
|
-
`debug`
|
|
73
|
+
| Option | Default | Explanation |
|
|
74
|
+
| ---------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
75
|
+
| `alarmOnEntryDelay` | `false` | if `true`, HomeKit will register a delayed entry event as a triggered alarm. There are some households where this is a nice feature as a heads up if you have other people who enter your house and you want an alert so that you can disable the alarm for them before it actually goes off. This works well if you automatically arm/disarm on leave/arrive (see setup instructions below) |
|
|
76
|
+
| `beamDurationSeconds` | `60` for light groups, previous from Ring app for individual lights | Ring smart lighting has a default behavior of only staying on for 60 seconds when you turn on a light via the Ring app. To force a duration when the light is turned on from HomeKit, set this option to a specific number of seconds. If this option is not set, the lights will use the duration from the previous time the light was turned on in the Ring app. For light groups, this will default to 60 seconds. The maximum value is `32767`, which is ~9.1 hours. |
|
|
77
|
+
| `hideDeviceIds` | `[]` | Allows you to hide specific devices by an array of ids. The id for each device is logged when homebridge starts. |
|
|
78
|
+
| `hideLightGroups` | `false` | Ring smart lighting allows you to create lighting groups within the Ring app. These groups are convenient for detecting motion in an area of your yard and turning on/off all lights in the group. However, you may wish to group the lights differently in HomeKit and ignore the groups you have configured in Ring. If this option is `true`, your Ring groups (and their associated motion sensor) will be ignored and will not show up in HomeKit. |
|
|
79
|
+
| `hideDoorbellSwitch` | `false` | If you have a Ring video doorbell, you will see a Programmable Switch associated with it. This switch can be used to perform actions on when the doorbell is pressed using "Single Press" actions. If you do not care to perform actions when the doorbell is pressed, you can hide the Programmable Switch by setting this option to `true`. You will still be able to receive _notifications_ from the doorbell even if the Programmable Switch is hidden (notifications can be configured in the settings for the doorbell camera in the Home app) |
|
|
80
|
+
| `hideCameraLight` | `false` | If `true`, hides the light for Ring cameras in HomeKit. |
|
|
81
|
+
| `hideCameraMotionSensor` | `false` | If `true`, hides the motion sensor for Ring cameras in HomeKit. |
|
|
82
|
+
| `hideCameraSirenSwitch` | `false` | If `true`, hides the siren switch for Ring cameras in HomeKit. |
|
|
83
|
+
| `hideInHomeDoorbellSwitch` | `false` | If `true`, hides the switch for in-home doorbells in HomeKit. |
|
|
84
|
+
| `hideAlarmSirenSwitch` | `false` | If you have a Ring Alarm, you will see both the alarm and a "Siren" switch in HomeKit. The siren switch can sometimes get triggered by Siri commands by accident, which is loud and annoying. Set this option to `true` to hide the siren switch. |
|
|
85
|
+
| `hideUnsupportedServices` | `false` | If `true`, hides the alarm Base Station and Keypad devices in HomeKit. These are only supported by third-party HomeKit apps, not the native Home app. |
|
|
86
|
+
| `showPanicButtons` | `false` | Creates a new `Panic Buttons` device in HomeKit with `Burglar Alarm` and `Fire Alarm` switches. **Use these at your own risk. I do not guarantee functionality in case of emergency, nor do I take responsibility for any false alarms**. These function just like the SOS sliders in the Ring app. |
|
|
87
|
+
| `nightModeBypassFor` | no Night Mode | Allows you to use Night mode to "Bypass and Arm" a Ring Alarm. Can be set to `all` for Away or `some` for Home. If set and Night mode is activated from HomeKit, any open contact sensors will automatically be bypassed. |
|
|
88
|
+
| `avoidSnapshotBatteryDrain` | false | Causes snapshots for battery cameras to be fetched at a minimum 10 minute interval to avoid draining the battery. |
|
|
89
|
+
| `cameraStatusPollingSeconds` | `20` | How frequently to poll for updates to your cameras and chimes (in seconds). Information like light/siren/volume/snooze status do not update in real time and need to be requested periodically. |
|
|
90
|
+
| `locationModePollingSeconds` | `20` | How frequently to poll for location mode updates (in seconds). This is only useful if you are using location modes to control camera settings and want to keep an up-to-date reference of the current mode for each location. Polling is automatically disabled for locations equipped with a Ring Alarm. Will hide Location Mode switch if set to `0` |
|
|
91
|
+
| `locationIds` | All Locations | Use this option if you only want a subset of your locations to appear in HomeKit. If this option is not included, all of your locations will be added to HomeKit (which is what most users will want to do). |
|
|
92
|
+
| `onlyDeviceTypes` | All Device Types | A subset of device types to be shown. If set, all other device types will be hidden in HomeKit. |
|
|
93
|
+
| `ffmpegPath` | Uses `ffmpeg-for-homebridge` | A custom path to the `ffmpeg` executable. By default, the static binaries built in [ffmpeg-for-homebridge](https://github.com/oznu/ffmpeg-for-homebridge) will be used. If you prefer to use your own version of ffmpeg, you can pass a complete path, or simply `"ffmpeg"` to use ffmpeg from your `PATH`. |
|
|
94
|
+
| `debug` | false | Turns on additional logging. In particular, ffmpeg logging. |
|
|
95
95
|
|
|
96
96
|
### Cameras
|
|
97
97
|
|
|
@@ -202,28 +202,28 @@ Note: Although homebridge has support for HomeKit Secure Video (HKSV), I will no
|
|
|
202
202
|
|
|
203
203
|
### Alarm/Location Modes
|
|
204
204
|
|
|
205
|
-
HomeKit Mode | Ring Mode
|
|
206
|
-
|
|
207
|
-
Off
|
|
208
|
-
Home
|
|
209
|
-
Away
|
|
210
|
-
Night
|
|
205
|
+
| HomeKit Mode | Ring Mode |
|
|
206
|
+
| ------------ | ----------------------------------------------------------- |
|
|
207
|
+
| Off | Disarmed |
|
|
208
|
+
| Home | Home |
|
|
209
|
+
| Away | Away |
|
|
210
|
+
| Night | Hidden by default. Configurable with `nightModeBypassFor` |
|
|
211
211
|
|
|
212
212
|
Entry delays and bypassed sensors (ex. for Home mode) are all controlled in the Ring app.
|
|
213
213
|
These settings will automatically be used by HomeKit.
|
|
214
214
|
|
|
215
215
|
### Siri Commands for Alarm/Location Modes
|
|
216
216
|
|
|
217
|
-
Siri Command
|
|
218
|
-
|
|
219
|
-
`Set Ring Alarm to Away`
|
|
220
|
-
`Arm my security system`
|
|
221
|
-
`Set Ring Alarm to Stay`
|
|
222
|
-
`Arm my security system for stay` | Home mode activated
|
|
223
|
-
`Disarm Ring Alarm`
|
|
224
|
-
`Disarm my security system`
|
|
225
|
-
`Turn on Ring Alarm`
|
|
226
|
-
`Turn off Ring Alarm`
|
|
217
|
+
| Siri Command | Outcome |
|
|
218
|
+
| --------------------------------- | --------------------------------------------------------------- |
|
|
219
|
+
| `Set Ring Alarm to Away` | Away mode activated |
|
|
220
|
+
| `Arm my security system` | Away mode activated |
|
|
221
|
+
| `Set Ring Alarm to Stay` | Home mode activated |
|
|
222
|
+
| `Arm my security system for stay` | Home mode activated |
|
|
223
|
+
| `Disarm Ring Alarm` | Disarmed |
|
|
224
|
+
| `Disarm my security system` | Disarmed |
|
|
225
|
+
| `Turn on Ring Alarm` | Turns on Ring Alarm Siren (unless hideAlarmSirenSwitch is set) |
|
|
226
|
+
| `Turn off Ring Alarm` | Turns off Ring Alarm Siren (unless hideAlarmSirenSwitch is set) |
|
|
227
227
|
|
|
228
228
|
### Changes Modes on Arrive/Leave Home
|
|
229
229
|
|
|
@@ -252,9 +252,9 @@ can then use these dummy switches to trigger your other automation (e.g. Arm/Dis
|
|
|
252
252
|
|
|
253
253
|
#### Example Home Automations
|
|
254
254
|
|
|
255
|
-
Trigger
|
|
256
|
-
|
|
257
|
-
People Arrive
|
|
258
|
-
People Leave
|
|
259
|
-
"Arrived Home" turns on | Set Ring Alarm mode to Off
|
|
260
|
-
"Left Home" turns on
|
|
255
|
+
| Trigger | Action |
|
|
256
|
+
| ----------------------- | --------------------------- |
|
|
257
|
+
| People Arrive | Turn on "Arrived Home" |
|
|
258
|
+
| People Leave | Turn on "Left Home" |
|
|
259
|
+
| "Arrived Home" turns on | Set Ring Alarm mode to Off |
|
|
260
|
+
| "Left Home" turns on | Set Ring Alarm mode to Away |
|
|
@@ -13,7 +13,7 @@ export interface BasicPeerConnection {
|
|
|
13
13
|
type: 'answer';
|
|
14
14
|
sdp: string;
|
|
15
15
|
}): Promise<void>;
|
|
16
|
-
addIceCandidate(candidate: RTCIceCandidate): Promise<void>;
|
|
16
|
+
addIceCandidate(candidate: Partial<RTCIceCandidate>): Promise<void>;
|
|
17
17
|
onIceCandidate: Observable<RTCIceCandidate>;
|
|
18
18
|
onConnectionState: Observable<ConnectionState>;
|
|
19
19
|
close(): void;
|
|
@@ -6,7 +6,7 @@ const werift_1 = require("werift");
|
|
|
6
6
|
const rxjs_1 = require("rxjs");
|
|
7
7
|
const util_1 = require("../util");
|
|
8
8
|
const subscribed_1 = require("../subscribed");
|
|
9
|
-
const
|
|
9
|
+
const ringIceServers = [
|
|
10
10
|
'stun:stun.kinesisvideo.us-east-1.amazonaws.com:443',
|
|
11
11
|
'stun:stun.kinesisvideo.us-east-2.amazonaws.com:443',
|
|
12
12
|
'stun:stun.kinesisvideo.us-west-2.amazonaws.com:443',
|
|
@@ -59,6 +59,7 @@ class WeriftPeerConnection extends subscribed_1.Subscribed {
|
|
|
59
59
|
},
|
|
60
60
|
iceServers: ringIceServers.map((server) => ({ urls: server })),
|
|
61
61
|
iceTransportPolicy: 'all',
|
|
62
|
+
bundlePolicy: 'disable',
|
|
62
63
|
})), audioTransceiver = pc.addTransceiver(this.returnAudioTrack, {
|
|
63
64
|
direction: 'sendrecv',
|
|
64
65
|
}), videoTransceiver = pc.addTransceiver('video', {
|
|
@@ -71,11 +72,9 @@ class WeriftPeerConnection extends subscribed_1.Subscribed {
|
|
|
71
72
|
track.onReceiveRtcp.subscribe((rtcp) => {
|
|
72
73
|
this.onAudioRtcp.next(rtcp);
|
|
73
74
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
-
}
|
|
75
|
+
track.onReceiveRtp.once(() => {
|
|
76
|
+
(0, util_1.logDebug)('received first audio packet');
|
|
77
|
+
});
|
|
79
78
|
});
|
|
80
79
|
videoTransceiver.onTrack.subscribe((track) => {
|
|
81
80
|
track.onReceiveRtp.subscribe((rtp) => {
|
|
@@ -85,9 +84,7 @@ class WeriftPeerConnection extends subscribed_1.Subscribed {
|
|
|
85
84
|
this.onVideoRtcp.next(rtcp);
|
|
86
85
|
});
|
|
87
86
|
track.onReceiveRtp.once(() => {
|
|
88
|
-
|
|
89
|
-
(0, util_1.logInfo)('received first video packet');
|
|
90
|
-
}
|
|
87
|
+
(0, util_1.logDebug)('received first video packet');
|
|
91
88
|
this.addSubscriptions((0, rxjs_1.merge)(this.onRequestKeyFrame, (0, rxjs_1.interval)(4000)).subscribe(() => {
|
|
92
89
|
videoTransceiver.receiver
|
|
93
90
|
.sendRtcpPLI(track.ssrc)
|
|
@@ -54,17 +54,7 @@ class RingEdgeConnection extends streaming_connection_base_1.StreamingConnection
|
|
|
54
54
|
body: {
|
|
55
55
|
doorbot_id: camera.id,
|
|
56
56
|
ice: iceCandidate.candidate,
|
|
57
|
-
mlineindex:
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
// HACK: send ice candidate with both mline indexes to convince ring edge to connect both audio and video
|
|
61
|
-
// Without this, only audio will connect unless you connect from the network of the Ring Edge router
|
|
62
|
-
this.sendMessage({
|
|
63
|
-
method: 'ice',
|
|
64
|
-
body: {
|
|
65
|
-
doorbot_id: camera.id,
|
|
66
|
-
ice: iceCandidate.candidate,
|
|
67
|
-
mlineindex: 1,
|
|
57
|
+
mlineindex: iceCandidate.sdpMLineIndex,
|
|
68
58
|
},
|
|
69
59
|
});
|
|
70
60
|
}));
|
|
@@ -76,7 +66,7 @@ class RingEdgeConnection extends streaming_connection_base_1.StreamingConnection
|
|
|
76
66
|
body: {
|
|
77
67
|
doorbot_id: this.camera.id,
|
|
78
68
|
stream_options: { audio_enabled: true, video_enabled: true },
|
|
79
|
-
sdp
|
|
69
|
+
sdp,
|
|
80
70
|
},
|
|
81
71
|
});
|
|
82
72
|
this.onOfferSent.next();
|
|
@@ -62,7 +62,15 @@ class StreamingSession extends subscribed_1.Subscribed {
|
|
|
62
62
|
if (this.hasEnded) {
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
-
const videoPort = await this.reservePort(1), audioPort = await this.reservePort(1), transcodeVideoStream = ffmpegOptions.video !== false, ringSdp = await
|
|
65
|
+
const videoPort = await this.reservePort(1), audioPort = await this.reservePort(1), transcodeVideoStream = ffmpegOptions.video !== false, ringSdp = await Promise.race([
|
|
66
|
+
(0, rxjs_1.firstValueFrom)(this.connection.onCallAnswered),
|
|
67
|
+
(0, rxjs_1.firstValueFrom)(this.onCallEnded),
|
|
68
|
+
]);
|
|
69
|
+
if (!ringSdp) {
|
|
70
|
+
(0, util_1.logDebug)('Call ended before answered');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const usingOpus = await this.isUsingOpus, ffmpegInputArguments = [
|
|
66
74
|
'-hide_banner',
|
|
67
75
|
'-protocol_whitelist',
|
|
68
76
|
'pipe,udp,rtp,file,crypto',
|
|
@@ -103,7 +111,7 @@ class StreamingSession extends subscribed_1.Subscribed {
|
|
|
103
111
|
}))
|
|
104
112
|
.subscribe());
|
|
105
113
|
}
|
|
106
|
-
this.onCallEnded.subscribe(() => ff.stop());
|
|
114
|
+
this.onCallEnded.pipe((0, operators_1.take)(1)).subscribe(() => ff.stop());
|
|
107
115
|
ff.writeStdin(inputSdp);
|
|
108
116
|
// Request a key frame now that ffmpeg is ready to receive
|
|
109
117
|
this.requestKeyFrame();
|
|
@@ -142,7 +150,7 @@ class StreamingSession extends subscribed_1.Subscribed {
|
|
|
142
150
|
info: util_1.logDebug,
|
|
143
151
|
},
|
|
144
152
|
});
|
|
145
|
-
this.onCallEnded.subscribe(() => ff.stop());
|
|
153
|
+
this.onCallEnded.pipe((0, operators_1.take)(1)).subscribe(() => ff.stop());
|
|
146
154
|
}
|
|
147
155
|
callEnded() {
|
|
148
156
|
if (this.hasEnded) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-ring",
|
|
3
|
-
"version": "11.0.
|
|
3
|
+
"version": "11.0.6",
|
|
4
4
|
"description": "Homebridge plugin for Ring doorbells, cameras, security alarm system and smart lighting",
|
|
5
5
|
"main": "lib/homebridge/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -39,46 +39,46 @@
|
|
|
39
39
|
"author": "dgreif",
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@eneris/push-receiver": "^3.0.
|
|
43
|
-
"@homebridge/camera-utils": "^2.1.
|
|
42
|
+
"@eneris/push-receiver": "^3.0.2",
|
|
43
|
+
"@homebridge/camera-utils": "^2.1.2",
|
|
44
44
|
"@homebridge/plugin-ui-utils": "^0.0.19",
|
|
45
|
-
"werift": "
|
|
45
|
+
"werift": "0.15.8",
|
|
46
46
|
"@types/socket.io-client": "1.4.36",
|
|
47
47
|
"colors": "^1.4.0",
|
|
48
48
|
"debug": "^4.3.4",
|
|
49
|
-
"got": "^11.8.
|
|
49
|
+
"got": "^11.8.5",
|
|
50
50
|
"rxjs": "^7.5.5",
|
|
51
51
|
"socket.io-client": "^2.4.0",
|
|
52
|
-
"systeminformation": "^5.11.
|
|
52
|
+
"systeminformation": "^5.11.22",
|
|
53
53
|
"uuid": "^8.3.2",
|
|
54
|
-
"ws": "^8.
|
|
54
|
+
"ws": "^8.8.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@swc-node/register": "^1.5.1",
|
|
58
58
|
"@types/debug": "4.1.7",
|
|
59
|
-
"@types/jest": "
|
|
60
|
-
"@types/node": "
|
|
59
|
+
"@types/jest": "28.1.3",
|
|
60
|
+
"@types/node": "18.0.0",
|
|
61
61
|
"@types/uuid": "8.3.4",
|
|
62
62
|
"@types/ws": "^8.5.3",
|
|
63
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
64
|
-
"@typescript-eslint/parser": "5.
|
|
65
|
-
"concurrently": "^7.2.
|
|
63
|
+
"@typescript-eslint/eslint-plugin": "5.30.0",
|
|
64
|
+
"@typescript-eslint/parser": "5.30.0",
|
|
65
|
+
"concurrently": "^7.2.2",
|
|
66
66
|
"conventional-github-releaser": "3.1.5",
|
|
67
67
|
"dotenv": "16.0.1",
|
|
68
|
-
"esbuild": "^0.14.
|
|
69
|
-
"eslint": "8.
|
|
68
|
+
"esbuild": "^0.14.47",
|
|
69
|
+
"eslint": "8.18.0",
|
|
70
70
|
"eslint-config-prettier": "8.5.0",
|
|
71
|
-
"eslint-plugin-jest": "26.
|
|
72
|
-
"eslint-plugin-prettier": "4.
|
|
71
|
+
"eslint-plugin-jest": "26.5.3",
|
|
72
|
+
"eslint-plugin-prettier": "4.1.0",
|
|
73
73
|
"express": "4.18.1",
|
|
74
|
-
"homebridge": "1.
|
|
75
|
-
"jest": "28.1.
|
|
76
|
-
"prettier": "2.
|
|
74
|
+
"homebridge": "1.5.0",
|
|
75
|
+
"jest": "28.1.2",
|
|
76
|
+
"prettier": "2.7.1",
|
|
77
77
|
"reflect-metadata": "0.1.13",
|
|
78
78
|
"rimraf": "3.0.2",
|
|
79
79
|
"standard-version": "9.5.0",
|
|
80
|
-
"ts-jest": "28.0.
|
|
81
|
-
"typescript": "4.7.
|
|
80
|
+
"ts-jest": "28.0.5",
|
|
81
|
+
"typescript": "4.7.4"
|
|
82
82
|
},
|
|
83
83
|
"engines": {
|
|
84
84
|
"node": "^16",
|