@camera.ui/browser 0.1.10 → 0.1.12
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/dist/index.js +41 -66
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { tryOnScopeDispose, useTimeoutFn, whenever } from "@vueuse/core";
|
|
|
4
4
|
import { SensorType } from "@camera.ui/sdk";
|
|
5
5
|
import { isNoRespondersError } from "@camera.ui/rpc";
|
|
6
6
|
import { classifyClose } from "@camera.ui/transport";
|
|
7
|
-
|
|
7
|
+
// src/utils/createDebouncedCache.ts
|
|
8
8
|
function createDebouncedCache(options = {}) {
|
|
9
9
|
const { releaseDelay = 1e3, onRelease } = options;
|
|
10
10
|
const cache = /* @__PURE__ */ new Map();
|
|
@@ -85,8 +85,7 @@ function createDebouncedCache(options = {}) {
|
|
|
85
85
|
forEachValue
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
-
|
|
89
|
-
//#region src/utils/createRetryTimer.ts
|
|
88
|
+
// src/utils/createRetryTimer.ts
|
|
90
89
|
var RETRY_MIN_MS = 1e3;
|
|
91
90
|
var RETRY_MAX_MS$1 = 3e4;
|
|
92
91
|
function createRetryTimer() {
|
|
@@ -113,23 +112,20 @@ function createRetryTimer() {
|
|
|
113
112
|
reset
|
|
114
113
|
};
|
|
115
114
|
}
|
|
116
|
-
|
|
117
|
-
//#region src/composables/useCameraUi.ts
|
|
115
|
+
// src/composables/useCameraUi.ts
|
|
118
116
|
function useCameraUi() {
|
|
119
117
|
const context = inject(CAMERA_UI_INJECTION_KEY);
|
|
120
118
|
if (!context) throw new Error("[camera.ui] useCameraUi() called without CameraUiPlugin installed. Make sure to call app.use(createCameraUiPlugin({ ... })) before using this composable.");
|
|
121
119
|
return context;
|
|
122
120
|
}
|
|
123
|
-
|
|
124
|
-
//#region ../../externals/camera.ui/server/src/utils/camera.ts
|
|
121
|
+
// ../../externals/camera.ui/server/src/utils/camera.ts
|
|
125
122
|
function normalizeCameraName(name) {
|
|
126
123
|
return name.replace(/ /g, "_").toLowerCase();
|
|
127
124
|
}
|
|
128
125
|
function createSourceName(cameraName, sourceName) {
|
|
129
126
|
return `cui_${normalizeCameraName(cameraName)}_${normalizeCameraName(sourceName)}`;
|
|
130
127
|
}
|
|
131
|
-
|
|
132
|
-
//#region ../../externals/camera.ui/server/src/rpc/namespaces.ts
|
|
128
|
+
// ../../externals/camera.ui/server/src/rpc/namespaces.ts
|
|
133
129
|
var NamespaceManager = class {
|
|
134
130
|
static coreManagerNamespaces() {
|
|
135
131
|
return {
|
|
@@ -251,8 +247,7 @@ var NamespaceManager = class {
|
|
|
251
247
|
return "workers.logs";
|
|
252
248
|
}
|
|
253
249
|
};
|
|
254
|
-
|
|
255
|
-
//#region src/composables/useRpc.ts
|
|
250
|
+
// src/composables/useRpc.ts
|
|
256
251
|
var DEFAULT_MAX_RETRIES = 3;
|
|
257
252
|
var DEFAULT_CONNECT_TIMEOUT_MS = 3e4;
|
|
258
253
|
var LINK_SETTLE_MS = 3e4;
|
|
@@ -488,8 +483,7 @@ function makeAbortError() {
|
|
|
488
483
|
err.name = "AbortError";
|
|
489
484
|
return err;
|
|
490
485
|
}
|
|
491
|
-
|
|
492
|
-
//#region src/composables/bulkLane.ts
|
|
486
|
+
// src/composables/bulkLane.ts
|
|
493
487
|
var PROBE_TIMEOUT_MS = 2e3;
|
|
494
488
|
var RECHECK_AFTER_MS = 6e4;
|
|
495
489
|
var deadMarks = /* @__PURE__ */ new WeakMap();
|
|
@@ -544,8 +538,7 @@ function clearMark(lane) {
|
|
|
544
538
|
deadMarks.get(lane)?.stop();
|
|
545
539
|
deadMarks.delete(lane);
|
|
546
540
|
}
|
|
547
|
-
|
|
548
|
-
//#region src/composables/useTabVisibility.ts
|
|
541
|
+
// src/composables/useTabVisibility.ts
|
|
549
542
|
var DEFAULT_TAB_PAUSE_MS = 3e4;
|
|
550
543
|
var log$2 = new Logger("TabVisibility");
|
|
551
544
|
var _isVisible = ref(typeof document === "undefined" ? true : document.visibilityState === "visible");
|
|
@@ -662,8 +655,7 @@ function useTabVisibility() {
|
|
|
662
655
|
onTabVisible
|
|
663
656
|
};
|
|
664
657
|
}
|
|
665
|
-
|
|
666
|
-
//#region src/composables/useSnapshot.ts
|
|
658
|
+
// src/composables/useSnapshot.ts
|
|
667
659
|
var REVOKE_DELAY_MS = 5e3;
|
|
668
660
|
var SERVER_CLOCK_STEP_MS = 6e4;
|
|
669
661
|
var REFRESH_LINGER_MS = 500;
|
|
@@ -998,8 +990,7 @@ function useSnapshot(cameraIdOrName) {
|
|
|
998
990
|
refresh
|
|
999
991
|
};
|
|
1000
992
|
}
|
|
1001
|
-
|
|
1002
|
-
//#region src/composables/useCamera.ts
|
|
993
|
+
// src/composables/useCamera.ts
|
|
1003
994
|
var NOT_MODIFIED = "not-modified";
|
|
1004
995
|
var CLOCK_SAMPLE_MAX_MS = 5e3;
|
|
1005
996
|
var snapshotWithMetaSupport = /* @__PURE__ */ new WeakMap();
|
|
@@ -1386,8 +1377,7 @@ function leaveSensorEvents(client, fanout, handler) {
|
|
|
1386
1377
|
if (sensorEventFanouts.get(client) === fanout) sensorEventFanouts.delete(client);
|
|
1387
1378
|
fanout.subscribed.then((off) => off()).catch(() => {});
|
|
1388
1379
|
}
|
|
1389
|
-
|
|
1390
|
-
//#region src/composables/useDeviceManager.ts
|
|
1380
|
+
// src/composables/useDeviceManager.ts
|
|
1391
1381
|
function useDeviceManager() {
|
|
1392
1382
|
const ctx = useCameraUi();
|
|
1393
1383
|
const namespaces = NamespaceManager.deviceManagerNamespaces();
|
|
@@ -1397,8 +1387,7 @@ function useDeviceManager() {
|
|
|
1397
1387
|
}
|
|
1398
1388
|
return { getCamera };
|
|
1399
1389
|
}
|
|
1400
|
-
|
|
1401
|
-
//#region src/composables/useCameraById.ts
|
|
1390
|
+
// src/composables/useCameraById.ts
|
|
1402
1391
|
var cameraCache = createDebouncedCache({
|
|
1403
1392
|
releaseDelay: 1e3,
|
|
1404
1393
|
onRelease: (_key, device) => device.close()
|
|
@@ -1571,8 +1560,7 @@ function useCameraById(cameraIdOrName) {
|
|
|
1571
1560
|
refresh
|
|
1572
1561
|
};
|
|
1573
1562
|
}
|
|
1574
|
-
|
|
1575
|
-
//#region src/composables/resolvePluginId.ts
|
|
1563
|
+
// src/composables/resolvePluginId.ts
|
|
1576
1564
|
var pluginIdCache = /* @__PURE__ */ new Map();
|
|
1577
1565
|
var pluginNames = /* @__PURE__ */ new Map();
|
|
1578
1566
|
var pendingResolves = /* @__PURE__ */ new Map();
|
|
@@ -1603,8 +1591,7 @@ async function resolvePluginId(rpcRef, pluginName) {
|
|
|
1603
1591
|
pendingResolves.set(pluginName, promise);
|
|
1604
1592
|
return promise;
|
|
1605
1593
|
}
|
|
1606
|
-
|
|
1607
|
-
//#region src/composables/useOAuth.ts
|
|
1594
|
+
// src/composables/useOAuth.ts
|
|
1608
1595
|
var POLL_ACTIVE_MS = 1500;
|
|
1609
1596
|
var POLL_IDLE_MS = 3e4;
|
|
1610
1597
|
var oauthStates = /* @__PURE__ */ new Map();
|
|
@@ -1719,8 +1706,7 @@ function useOAuth(pluginName) {
|
|
|
1719
1706
|
refresh
|
|
1720
1707
|
};
|
|
1721
1708
|
}
|
|
1722
|
-
|
|
1723
|
-
//#region src/composables/usePlugin.ts
|
|
1709
|
+
// src/composables/usePlugin.ts
|
|
1724
1710
|
var RETRY_BASE_MS = 2e3;
|
|
1725
1711
|
var RETRY_MAX_MS = 3e4;
|
|
1726
1712
|
var pluginCache = createDebouncedCache({ releaseDelay: 1e3 });
|
|
@@ -2051,15 +2037,13 @@ function usePlugin(pluginName, options = {}) {
|
|
|
2051
2037
|
refresh
|
|
2052
2038
|
};
|
|
2053
2039
|
}
|
|
2054
|
-
|
|
2055
|
-
//#region src/composables/utils.ts
|
|
2040
|
+
// src/composables/utils.ts
|
|
2056
2041
|
function extractCameraId(camera) {
|
|
2057
2042
|
if (!camera) return void 0;
|
|
2058
2043
|
if (typeof camera === "string") return camera;
|
|
2059
2044
|
return camera.id;
|
|
2060
2045
|
}
|
|
2061
|
-
|
|
2062
|
-
//#region src/composables/useSensor.ts
|
|
2046
|
+
// src/composables/useSensor.ts
|
|
2063
2047
|
function createSensorTypeGuard(sensorType) {
|
|
2064
2048
|
return (sensor) => sensor.type === sensorType;
|
|
2065
2049
|
}
|
|
@@ -2893,8 +2877,7 @@ function useClassifierSensors(camera) {
|
|
|
2893
2877
|
error
|
|
2894
2878
|
};
|
|
2895
2879
|
}
|
|
2896
|
-
|
|
2897
|
-
//#region src/composables/useStorage.ts
|
|
2880
|
+
// src/composables/useStorage.ts
|
|
2898
2881
|
function createReactiveStorage(proxy, client) {
|
|
2899
2882
|
const config = shallowRef();
|
|
2900
2883
|
const isLoading = ref(false);
|
|
@@ -3405,8 +3388,7 @@ function useSensorStorage(sensorId, pluginId) {
|
|
|
3405
3388
|
submitValue: operations.submitValue
|
|
3406
3389
|
};
|
|
3407
3390
|
}
|
|
3408
|
-
|
|
3409
|
-
//#region src/composables/resetClientState.ts
|
|
3391
|
+
// src/composables/resetClientState.ts
|
|
3410
3392
|
function resetClientState() {
|
|
3411
3393
|
clearPluginCache();
|
|
3412
3394
|
clearCameraCache();
|
|
@@ -3424,8 +3406,7 @@ function refreshClientStates() {
|
|
|
3424
3406
|
forgetPluginStatus();
|
|
3425
3407
|
refreshAllCameraDevices();
|
|
3426
3408
|
}
|
|
3427
|
-
|
|
3428
|
-
//#region src/plugin.ts
|
|
3409
|
+
// src/plugin.ts
|
|
3429
3410
|
var CAMERA_UI_INJECTION_KEY = Symbol("camera-ui");
|
|
3430
3411
|
var log$1 = new Logger("plugin");
|
|
3431
3412
|
function isContext(input) {
|
|
@@ -3536,8 +3517,7 @@ function createCameraUiPlugin(input) {
|
|
|
3536
3517
|
app.provide(CAMERA_UI_INJECTION_KEY, ctx);
|
|
3537
3518
|
} };
|
|
3538
3519
|
}
|
|
3539
|
-
|
|
3540
|
-
//#region src/streaming/activityMode.ts
|
|
3520
|
+
// src/streaming/activityMode.ts
|
|
3541
3521
|
var DEFAULT_CONFIG = {
|
|
3542
3522
|
standbyTimeout: 5e3,
|
|
3543
3523
|
activityTimeout: 5e3,
|
|
@@ -3682,8 +3662,7 @@ function createActivityMode(options) {
|
|
|
3682
3662
|
dispose
|
|
3683
3663
|
};
|
|
3684
3664
|
}
|
|
3685
|
-
|
|
3686
|
-
//#region src/streaming/config.ts
|
|
3665
|
+
// src/streaming/config.ts
|
|
3687
3666
|
var STREAM_CONFIG = {
|
|
3688
3667
|
WEBRTC: {
|
|
3689
3668
|
RECONNECT_DELAY: 1e3,
|
|
@@ -3720,8 +3699,7 @@ var STREAM_CONFIG = {
|
|
|
3720
3699
|
]
|
|
3721
3700
|
}
|
|
3722
3701
|
};
|
|
3723
|
-
|
|
3724
|
-
//#region src/streaming/mjpeg.ts
|
|
3702
|
+
// src/streaming/mjpeg.ts
|
|
3725
3703
|
function isJpegFrame(data) {
|
|
3726
3704
|
if (data.byteLength < 2) return false;
|
|
3727
3705
|
const bytes = new Uint8Array(data, 0, 2);
|
|
@@ -3780,8 +3758,7 @@ function createMJPEGHandler(options) {
|
|
|
3780
3758
|
close
|
|
3781
3759
|
};
|
|
3782
3760
|
}
|
|
3783
|
-
|
|
3784
|
-
//#region src/streaming/fmp4.ts
|
|
3761
|
+
// src/streaming/fmp4.ts
|
|
3785
3762
|
var MOOV = 1836019574;
|
|
3786
3763
|
var TRAK = 1953653099;
|
|
3787
3764
|
var TKHD = 1953196132;
|
|
@@ -3937,8 +3914,7 @@ function scanRun(view, start, end, fragment, onKeyframe) {
|
|
|
3937
3914
|
}
|
|
3938
3915
|
return time;
|
|
3939
3916
|
}
|
|
3940
|
-
|
|
3941
|
-
//#region src/streaming/utils.ts
|
|
3917
|
+
// src/streaming/utils.ts
|
|
3942
3918
|
var H265_TEST_CODEC = "hvc1.1.6.L153.B0";
|
|
3943
3919
|
function safariVersion() {
|
|
3944
3920
|
return navigator.userAgent.match(/version\/(\d+)/i);
|
|
@@ -4045,8 +4021,7 @@ function abortableSleep(ms, signal) {
|
|
|
4045
4021
|
}, { once: true });
|
|
4046
4022
|
});
|
|
4047
4023
|
}
|
|
4048
|
-
|
|
4049
|
-
//#region src/streaming/mse.ts
|
|
4024
|
+
// src/streaming/mse.ts
|
|
4050
4025
|
var CUT_MARGIN = .001;
|
|
4051
4026
|
var MAX_KEYFRAMES = 256;
|
|
4052
4027
|
var LIVE_EDGE_MARGIN = .3;
|
|
@@ -4306,8 +4281,7 @@ async function playVideo(videoElement) {
|
|
|
4306
4281
|
}
|
|
4307
4282
|
}
|
|
4308
4283
|
}
|
|
4309
|
-
|
|
4310
|
-
//#region src/streaming/webrtc.ts
|
|
4284
|
+
// src/streaming/webrtc.ts
|
|
4311
4285
|
function newPeerConnection(iceServers = [...STREAM_CONFIG.WEBRTC.ICE_SERVERS]) {
|
|
4312
4286
|
try {
|
|
4313
4287
|
return new RTCPeerConnection({
|
|
@@ -4486,8 +4460,7 @@ async function processWebRTCMessage(handler, msg) {
|
|
|
4486
4460
|
case "webrtc/candidate": if (msg.value) await handler.handleCandidate(msg.value);
|
|
4487
4461
|
}
|
|
4488
4462
|
}
|
|
4489
|
-
|
|
4490
|
-
//#region src/streaming/streamConnection.ts
|
|
4463
|
+
// src/streaming/streamConnection.ts
|
|
4491
4464
|
var log = new Logger("StreamConnection");
|
|
4492
4465
|
var MSE_AUDIO_CODEC = /mp4a|opus|flac|mp3/i;
|
|
4493
4466
|
var RETRY_BASE_DELAY = 1e3;
|
|
@@ -5785,8 +5758,7 @@ var StreamConnection = class {
|
|
|
5785
5758
|
function createStreamConnection(options) {
|
|
5786
5759
|
return new StreamConnection(options);
|
|
5787
5760
|
}
|
|
5788
|
-
|
|
5789
|
-
//#region src/streaming/streamManager.ts
|
|
5761
|
+
// src/streaming/streamManager.ts
|
|
5790
5762
|
var StreamManager = class {
|
|
5791
5763
|
streams = /* @__PURE__ */ new Map();
|
|
5792
5764
|
standalone = /* @__PURE__ */ new Set();
|
|
@@ -5947,8 +5919,7 @@ var streamManager = new StreamManager();
|
|
|
5947
5919
|
function restartConnectedStreams() {
|
|
5948
5920
|
return streamManager.restartConnected();
|
|
5949
5921
|
}
|
|
5950
|
-
|
|
5951
|
-
//#region src/composables/useFullscreen.ts
|
|
5922
|
+
// src/composables/useFullscreen.ts
|
|
5952
5923
|
var fsRegistry = /* @__PURE__ */ new WeakMap();
|
|
5953
5924
|
var fullscreenRoot = null;
|
|
5954
5925
|
function setFullscreenRoot(el) {
|
|
@@ -6071,8 +6042,7 @@ function applyWrapperStyles(wrapper, mode) {
|
|
|
6071
6042
|
overscrollBehavior: "contain"
|
|
6072
6043
|
});
|
|
6073
6044
|
}
|
|
6074
|
-
|
|
6075
|
-
//#region src/composables/useCameraStream.ts
|
|
6045
|
+
// src/composables/useCameraStream.ts
|
|
6076
6046
|
var AUTO_STAGGER_STEP_MS = 75;
|
|
6077
6047
|
var AUTO_STAGGER_RESET_MS = 500;
|
|
6078
6048
|
var OFFSCREEN_STOP_DELAY_MS = 1e4;
|
|
@@ -6345,6 +6315,14 @@ function useCameraStream(options) {
|
|
|
6345
6315
|
isUsingCachedStream.value = true;
|
|
6346
6316
|
currentStream.value = cached.stream;
|
|
6347
6317
|
if (camDevice && cached.cameraDeviceRef) cached.cameraDeviceRef.value = camDevice;
|
|
6318
|
+
const resolution = toValue(options.resolution) ?? "high-resolution";
|
|
6319
|
+
if (cached.stream.requestedResolution.value !== resolution) {
|
|
6320
|
+
streamManager.updateMediaStream(camName, null);
|
|
6321
|
+
cached.stream.setResolution(resolution);
|
|
6322
|
+
}
|
|
6323
|
+
cleanupFns.push(watch(() => toValue(options.resolution), (role) => {
|
|
6324
|
+
if (role) cached.stream.setResolution(role);
|
|
6325
|
+
}));
|
|
6348
6326
|
let video = cached.sharedVideoElement;
|
|
6349
6327
|
if (!video) {
|
|
6350
6328
|
video = createVideoElement();
|
|
@@ -6733,8 +6711,7 @@ function useCameraStream(options) {
|
|
|
6733
6711
|
captureScreenshot
|
|
6734
6712
|
};
|
|
6735
6713
|
}
|
|
6736
|
-
|
|
6737
|
-
//#region src/composables/useCoreManager.ts
|
|
6714
|
+
// src/composables/useCoreManager.ts
|
|
6738
6715
|
function useCoreManager() {
|
|
6739
6716
|
const ctx = useCameraUi();
|
|
6740
6717
|
const namespaces = NamespaceManager.coreManagerNamespaces();
|
|
@@ -6748,8 +6725,7 @@ function useCoreManager() {
|
|
|
6748
6725
|
getInstanceId: () => rpcCall(ctx.rpc, (rpc) => proxy(rpc).getInstanceId())
|
|
6749
6726
|
};
|
|
6750
6727
|
}
|
|
6751
|
-
|
|
6752
|
-
//#region src/composables/useTerminal.ts
|
|
6728
|
+
// src/composables/useTerminal.ts
|
|
6753
6729
|
function useTerminal() {
|
|
6754
6730
|
const cameraUi = useCameraUi();
|
|
6755
6731
|
const { rpc, isConnected: isClientConnected } = cameraUi;
|
|
@@ -6908,5 +6884,4 @@ function useTerminal() {
|
|
|
6908
6884
|
close
|
|
6909
6885
|
};
|
|
6910
6886
|
}
|
|
6911
|
-
//#endregion
|
|
6912
6887
|
export { CAMERA_UI_INJECTION_KEY, NamespaceManager, STREAM_CONFIG, acquireSensorManager, clearCameraCache, clearOAuthCache, clearPluginCache, clearSensorCache, clearSnapshotCache, clearStorageCache, createActivityMode, createCameraUiPlugin, createReactiveCameraDevice, createSensorManager, getSnapshotUrl, isReactiveAudioSensor, isReactiveBatteryInfo, isReactiveCarbonDioxideInfo, isReactiveCarbonMonoxideSensor, isReactiveClassifierSensor, isReactiveColdSensor, isReactiveContactSensor, isReactiveDoorbellTrigger, isReactiveFaceSensor, isReactiveGarageControl, isReactiveGasSensor, isReactiveHeatSensor, isReactiveHumidityInfo, isReactiveIlluminanceInfo, isReactiveLeakSensor, isReactiveLicensePlateSensor, isReactiveLightControl, isReactiveLockControl, isReactiveMotionSensor, isReactiveObjectSensor, isReactiveOccupancySensor, isReactivePTZControl, isReactivePowerSensor, isReactiveProblemSensor, isReactiveSecuritySystem, isReactiveSirenControl, isReactiveSmokeSensor, isReactiveSwitchControl, isReactiveTamperSensor, isReactiveTemperatureInfo, isReactiveVibrationSensor, refreshClientSubscriptions, releaseSensorManager, resetClientState, restartConnectedStreams, rpcCall, setFullscreenRoot, useAllSensors, useAudioSensor, useCameraById, useCameraStorage, useCameraStream, useCameraUi, useClassifierSensors, useCoreManager, useCuiFullscreen, useDeviceManager, useFaceSensor, useLicensePlateSensor, useMotionSensor, useOAuth, useObjectSensor, usePTZControl, usePlugin, usePluginStorage, useRpcCall, useRpcSubscription, useSensorById, useSensorByType, useSensorStorage, useSensors, useSensorsByType, useSnapshot, useTabVisibility, useTerminal, useTopmostFullscreenElement };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camera.ui/browser",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "camera.ui browser client",
|
|
5
5
|
"author": "seydx (https://github.com/cameraui/clients)",
|
|
6
6
|
"type": "module",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@camera.ui/logger": "file:../../packages/logger",
|
|
41
41
|
"@camera.ui/rpc": "^1.1.2",
|
|
42
|
-
"@camera.ui/sdk": "~1.4.
|
|
42
|
+
"@camera.ui/sdk": "~1.4.7",
|
|
43
43
|
"@camera.ui/transport": "file:../../packages/transport",
|
|
44
44
|
"@eneris/push-receiver": "^4.4.0",
|
|
45
45
|
"@microsoft/api-extractor": "^7.60.1",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"typescript-eslint": "^8.72.1",
|
|
63
63
|
"unplugin-dts": "^1.1.2",
|
|
64
64
|
"updates": "^20.0.0",
|
|
65
|
-
"vite": "^8.3.
|
|
65
|
+
"vite": "^8.3.6",
|
|
66
66
|
"vitest": "^5.1.0",
|
|
67
|
-
"vue": "^3.5.
|
|
67
|
+
"vue": "^3.5.45",
|
|
68
68
|
"vue-tsc": "3.3.11"
|
|
69
69
|
},
|
|
70
70
|
"overrides": {
|