mirror of
https://github.com/ivabus/gui
synced 2025-06-08 00:00:27 +03:00
Error to sentry (#499)
* send error to sentry --------- Co-authored-by: neil molina <neil@neils-MacBook-Pro.local>
This commit is contained in:
parent
28c1142872
commit
45828b3f40
22 changed files with 108 additions and 21 deletions
|
@ -4,7 +4,7 @@ import { setupTitlebar, attachTitlebarToWindow } from "custom-electron-titlebar/
|
||||||
import * as Sentry from "@sentry/electron";
|
import * as Sentry from "@sentry/electron";
|
||||||
import contextMenu from "electron-context-menu";
|
import contextMenu from "electron-context-menu";
|
||||||
import serve from "electron-serve";
|
import serve from "electron-serve";
|
||||||
import * as log from "electron-log";
|
import log, { setSentryLogging } from "./libs/logger";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { nameToSlug } from "./libs/package";
|
import { nameToSlug } from "./libs/package";
|
||||||
import { checkUpdater } from "./libs/auto-updater";
|
import { checkUpdater } from "./libs/auto-updater";
|
||||||
|
@ -26,11 +26,11 @@ if (app.isPackaged) {
|
||||||
maxQueueCount: 30,
|
maxQueueCount: 30,
|
||||||
beforeSend: async () => {
|
beforeSend: async () => {
|
||||||
const ol = await net.isOnline();
|
const ol = await net.isOnline();
|
||||||
log.log("isOnline", ol);
|
|
||||||
return ol ? "send" : "queue";
|
return ol ? "send" : "queue";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
setSentryLogging(Sentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
|
@ -3,7 +3,7 @@ import path from "path";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import { getTeaPath } from "./tea-dir";
|
import { getTeaPath } from "./tea-dir";
|
||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
const sessionFilePath = path.join(getTeaPath(), "tea.xyz/gui/tmp.dat");
|
const sessionFilePath = path.join(getTeaPath(), "tea.xyz/gui/tmp.dat");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { type AppUpdater, autoUpdater } from "electron-updater";
|
import { type AppUpdater, autoUpdater } from "electron-updater";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import { BrowserWindow } from "electron";
|
import { BrowserWindow } from "electron";
|
||||||
|
|
||||||
type AutoUpdateStatus = {
|
type AutoUpdateStatus = {
|
||||||
|
|
|
@ -5,7 +5,7 @@ import path from "path";
|
||||||
import initializeTeaCli from "./initialize";
|
import initializeTeaCli from "./initialize";
|
||||||
|
|
||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import { MainWindowNotifier } from "./types";
|
import { MainWindowNotifier } from "./types";
|
||||||
|
|
||||||
const destinationDirectory = getGuiPath();
|
const destinationDirectory = getGuiPath();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import { getGuiPath } from "./tea-dir";
|
import { getGuiPath } from "./tea-dir";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import semver from "semver";
|
import semver from "semver";
|
||||||
import { cliBinPath, asyncExec } from "./cli";
|
import { cliBinPath, asyncExec } from "./cli";
|
||||||
import { createInitialSessionFile } from "./auth";
|
import { createInitialSessionFile } from "./auth";
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { ipcMain, app, BrowserWindow } from "electron";
|
||||||
import { deletePackageFolder, getInstalledPackages, cacheImage } from "./tea-dir";
|
import { deletePackageFolder, getInstalledPackages, cacheImage } from "./tea-dir";
|
||||||
import { readSessionData, writeSessionData } from "./auth";
|
import { readSessionData, writeSessionData } from "./auth";
|
||||||
import type { Packages, Session } from "../../src/libs/types";
|
import type { Packages, Session } from "../../src/libs/types";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import { syncLogsAt } from "./v1-client";
|
import { syncLogsAt } from "./v1-client";
|
||||||
import { installPackage, openTerminal, syncPantry } from "./cli";
|
import { installPackage, openTerminal, syncPantry } from "./cli";
|
||||||
|
|
||||||
|
|
13
modules/desktop/electron/libs/logger.ts
Normal file
13
modules/desktop/electron/libs/logger.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import log from "electron-log";
|
||||||
|
|
||||||
|
export const setSentryLogging = (sentry: any) => {
|
||||||
|
const oldError = log.error;
|
||||||
|
|
||||||
|
log.error = (...params: any[]) => {
|
||||||
|
oldError(params);
|
||||||
|
sentry.captureException(params[0].message);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Export the log object to use it throughout the app
|
||||||
|
export default log;
|
|
@ -1,7 +1,7 @@
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { mkdirp } from "mkdirp";
|
import { mkdirp } from "mkdirp";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import { getTeaPath } from "./tea-dir";
|
import { getTeaPath } from "./tea-dir";
|
||||||
import { Packages } from "../../src/libs/types";
|
import { Packages } from "../../src/libs/types";
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import Pushy from "pushy-electron";
|
import Pushy from "pushy-electron";
|
||||||
import { readSessionData } from "./auth";
|
import { readSessionData } from "./auth";
|
||||||
import { post } from "./v1-client";
|
import { post } from "./v1-client";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import { Notification, BrowserWindow } from "electron";
|
import { Notification, BrowserWindow } from "electron";
|
||||||
import { nameToSlug } from "./package";
|
import { nameToSlug } from "./package";
|
||||||
import {
|
import {
|
||||||
|
|
|
@ -3,7 +3,7 @@ import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
import semver, { SemVer } from "semver";
|
import semver, { SemVer } from "semver";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import type { InstalledPackage } from "../../src/libs/types";
|
import type { InstalledPackage } from "../../src/libs/types";
|
||||||
import semverCompare from "semver/functions/compare";
|
import semverCompare from "semver/functions/compare";
|
||||||
import { mkdirp } from "mkdirp";
|
import { mkdirp } from "mkdirp";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { app } from "electron";
|
import { app } from "electron";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import * as log from "electron-log";
|
import log from "./logger";
|
||||||
import bcrypt from "bcryptjs";
|
import bcrypt from "bcryptjs";
|
||||||
import { createReadStream, statSync } from "fs";
|
import { createReadStream, statSync } from "fs";
|
||||||
import { deepReadDir } from "./tea-dir";
|
import { deepReadDir } from "./tea-dir";
|
||||||
|
|
|
@ -75,6 +75,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@crowdin/ota-client": "^0.7.0",
|
"@crowdin/ota-client": "^0.7.0",
|
||||||
"@electron/asar": "^3.2.3",
|
"@electron/asar": "^3.2.3",
|
||||||
|
"@sentry/browser": "^7.49.0",
|
||||||
"@sentry/electron": "^4.4.0",
|
"@sentry/electron": "^4.4.0",
|
||||||
"@sentry/svelte": "^7.47.0",
|
"@sentry/svelte": "^7.47.0",
|
||||||
"@types/electron": "^1.6.10",
|
"@types/electron": "^1.6.10",
|
||||||
|
|
10
modules/desktop/src/libs/logger.ts
Normal file
10
modules/desktop/src/libs/logger.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
const log = window ? window.require("electron-log") : console;
|
||||||
|
import { captureException } from "./sentry";
|
||||||
|
|
||||||
|
// TODO: figure out how to detect if pkaged
|
||||||
|
const oldError = log.error;
|
||||||
|
log.error = (...params: any[]) => {
|
||||||
|
oldError(params);
|
||||||
|
captureException(params[0].message);
|
||||||
|
};
|
||||||
|
export default log;
|
|
@ -27,8 +27,7 @@ import { PackageStates, type InstalledPackage } from "./types";
|
||||||
import { get as apiGet } from "$libs/v1-client";
|
import { get as apiGet } from "$libs/v1-client";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import withRetry from "./utils/retry";
|
import withRetry from "./utils/retry";
|
||||||
|
import log from "./logger";
|
||||||
const log = window.require("electron-log");
|
|
||||||
const { ipcRenderer, shell } = window.require("electron");
|
const { ipcRenderer, shell } = window.require("electron");
|
||||||
|
|
||||||
export async function getDistPackages(): Promise<Package[]> {
|
export async function getDistPackages(): Promise<Package[]> {
|
||||||
|
|
11
modules/desktop/src/libs/sentry.ts
Normal file
11
modules/desktop/src/libs/sentry.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import * as Sentry from "@sentry/browser";
|
||||||
|
|
||||||
|
export function initSentry() {
|
||||||
|
Sentry.init({
|
||||||
|
dsn: "https://5ff29bb5b3b64cd4bd4f4960ef1db2e3@o4504750197899264.ingest.sentry.io/4504750206746624"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function captureException(exception: any) {
|
||||||
|
Sentry.captureException(exception);
|
||||||
|
}
|
|
@ -1,8 +1,5 @@
|
||||||
import { writable } from "svelte/store";
|
import { writable } from "svelte/store";
|
||||||
import { goto } from "$app/navigation";
|
import { goto } from "$app/navigation";
|
||||||
import { updateSession } from "@native";
|
|
||||||
|
|
||||||
const log = window.require("electron-log");
|
|
||||||
|
|
||||||
export default function initNavStore() {
|
export default function initNavStore() {
|
||||||
const historyStore = writable<string[]>(["/"]);
|
const historyStore = writable<string[]>(["/"]);
|
||||||
|
|
|
@ -26,7 +26,7 @@ import { trimGithubSlug } from "$libs/github";
|
||||||
import { notificationStore } from "$libs/stores";
|
import { notificationStore } from "$libs/stores";
|
||||||
import withRetry from "$libs/utils/retry";
|
import withRetry from "$libs/utils/retry";
|
||||||
|
|
||||||
const log = window.require("electron-log");
|
import log from "$libs/logger";
|
||||||
|
|
||||||
const packageRefreshInterval = 1000 * 60 * 60; // 1 hour
|
const packageRefreshInterval = 1000 * 60 * 60; // 1 hour
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const log = window.require("electron-log");
|
import log from "$libs/logger";
|
||||||
|
|
||||||
type DebounceableFunc = (...args: any[]) => void;
|
type DebounceableFunc = (...args: any[]) => void;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const log = window.require("electron-log");
|
import log from "$libs/logger";
|
||||||
|
|
||||||
export type RetryOptions = {
|
export type RetryOptions = {
|
||||||
// Number of times to retry. default 10
|
// Number of times to retry. default 10
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import "$appcss";
|
import "$appcss";
|
||||||
import { goto } from "$app/navigation";
|
import { goto } from "$app/navigation";
|
||||||
|
import { initSentry } from "$libs/sentry";
|
||||||
import { navigating } from "$app/stores";
|
import { navigating } from "$app/stores";
|
||||||
import { afterNavigate } from "$app/navigation";
|
import { afterNavigate } from "$app/navigation";
|
||||||
import TopBar from "$components/top-bar/top-bar.svelte";
|
import TopBar from "$components/top-bar/top-bar.svelte";
|
||||||
|
@ -49,6 +50,7 @@
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
packagesStore.init();
|
packagesStore.init();
|
||||||
|
initSentry();
|
||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
|
|
|
@ -13,8 +13,7 @@
|
||||||
import NotificationBar from "$components/notification-bar/notification-bar.svelte";
|
import NotificationBar from "$components/notification-bar/notification-bar.svelte";
|
||||||
import WelcomeModal from "$components/welcome-modal/welcome-modal.svelte";
|
import WelcomeModal from "$components/welcome-modal/welcome-modal.svelte";
|
||||||
import Button from "@tea/ui/button/button.svelte";
|
import Button from "@tea/ui/button/button.svelte";
|
||||||
|
import log from "$libs/logger";
|
||||||
const log = window.require("electron-log");
|
|
||||||
|
|
||||||
const { packageList } = packagesStore;
|
const { packageList } = packagesStore;
|
||||||
const { session } = authStore;
|
const { session } = authStore;
|
||||||
|
|
|
@ -19,6 +19,7 @@ importers:
|
||||||
'@electron/notarize': ^1.2.3
|
'@electron/notarize': ^1.2.3
|
||||||
'@playwright/experimental-ct-svelte': ^1.29.2
|
'@playwright/experimental-ct-svelte': ^1.29.2
|
||||||
'@playwright/test': 1.25.0
|
'@playwright/test': 1.25.0
|
||||||
|
'@sentry/browser': ^7.49.0
|
||||||
'@sentry/electron': ^4.4.0
|
'@sentry/electron': ^4.4.0
|
||||||
'@sentry/svelte': ^7.47.0
|
'@sentry/svelte': ^7.47.0
|
||||||
'@sveltejs/adapter-auto': ^1.0.0
|
'@sveltejs/adapter-auto': ^1.0.0
|
||||||
|
@ -92,6 +93,7 @@ importers:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@crowdin/ota-client': 0.7.0
|
'@crowdin/ota-client': 0.7.0
|
||||||
'@electron/asar': 3.2.3
|
'@electron/asar': 3.2.3
|
||||||
|
'@sentry/browser': 7.49.0
|
||||||
'@sentry/electron': 4.4.0
|
'@sentry/electron': 4.4.0
|
||||||
'@sentry/svelte': 7.47.0_svelte@3.55.1
|
'@sentry/svelte': 7.47.0_svelte@3.55.1
|
||||||
'@types/electron': 1.6.10
|
'@types/electron': 1.6.10
|
||||||
|
@ -2457,6 +2459,16 @@ packages:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry-internal/tracing/7.49.0:
|
||||||
|
resolution: {integrity: sha512-ESh3+ZneQk/3HESTUmIPNrW5GVPu/HrRJU+eAJJto74vm+6vP7zDn2YV2gJ1w18O/37nc7W/bVCgZJlhZ3cwew==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
'@sentry/core': 7.49.0
|
||||||
|
'@sentry/types': 7.49.0
|
||||||
|
'@sentry/utils': 7.49.0
|
||||||
|
tslib: 1.14.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sentry/browser/7.46.0:
|
/@sentry/browser/7.46.0:
|
||||||
resolution: {integrity: sha512-4rX9hKPjxzfH5LhZzO5DlS5NXQ8qZg2ibepaqEgcDHrpYh5813mjjnE4OQA8wiZ6WuG3xKFgHBrGeliD5jXz9w==}
|
resolution: {integrity: sha512-4rX9hKPjxzfH5LhZzO5DlS5NXQ8qZg2ibepaqEgcDHrpYh5813mjjnE4OQA8wiZ6WuG3xKFgHBrGeliD5jXz9w==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -2481,6 +2493,18 @@ packages:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry/browser/7.49.0:
|
||||||
|
resolution: {integrity: sha512-x2DekKkQoY7/dhBzE4J25mdQ978NtPBTVQb+uZqlF/t5mp4K44TAszmPqy8lC/CmVHkp7qcpRGSCIzeboUL4KA==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
'@sentry-internal/tracing': 7.49.0
|
||||||
|
'@sentry/core': 7.49.0
|
||||||
|
'@sentry/replay': 7.49.0
|
||||||
|
'@sentry/types': 7.49.0
|
||||||
|
'@sentry/utils': 7.49.0
|
||||||
|
tslib: 1.14.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sentry/core/7.46.0:
|
/@sentry/core/7.46.0:
|
||||||
resolution: {integrity: sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==}
|
resolution: {integrity: sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -2499,6 +2523,15 @@ packages:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry/core/7.49.0:
|
||||||
|
resolution: {integrity: sha512-AlSnCYgfEbvK8pkNluUkmdW/cD9UpvOVCa+ERQswXNRkAv5aDGCL6Ihv6fnIajE++BYuwZh0+HwZUBVKTFzoZg==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
'@sentry/types': 7.49.0
|
||||||
|
'@sentry/utils': 7.49.0
|
||||||
|
tslib: 1.14.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sentry/electron/4.4.0:
|
/@sentry/electron/4.4.0:
|
||||||
resolution: {integrity: sha512-E6uggv/aujDMImO3JE46MIVrE9uZXWwR5Pm2EWwaqVYEY4+twnH4pWX/NG0PheGKSW1177FjPkcvEyCwq0pElg==}
|
resolution: {integrity: sha512-E6uggv/aujDMImO3JE46MIVrE9uZXWwR5Pm2EWwaqVYEY4+twnH4pWX/NG0PheGKSW1177FjPkcvEyCwq0pElg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2547,6 +2580,15 @@ packages:
|
||||||
'@sentry/utils': 7.47.0
|
'@sentry/utils': 7.47.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry/replay/7.49.0:
|
||||||
|
resolution: {integrity: sha512-UY3bHoBDPOu4Dpq3m3oxNjLrq09NiFVYUfrTN4QOq1Am2SA04XbuCj/YZ+jNVy/NrFtoz9cTovK6oQbNw53jog==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dependencies:
|
||||||
|
'@sentry/core': 7.49.0
|
||||||
|
'@sentry/types': 7.49.0
|
||||||
|
'@sentry/utils': 7.49.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sentry/svelte/7.47.0_svelte@3.55.1:
|
/@sentry/svelte/7.47.0_svelte@3.55.1:
|
||||||
resolution: {integrity: sha512-oxuefbpCs+aVAyLIDZM2jyayJzSnCo39/MI800442uS+sOR0MXq/OKcfbiqytwbjX4zvsj4m+E0/pL9rY1yOMw==}
|
resolution: {integrity: sha512-oxuefbpCs+aVAyLIDZM2jyayJzSnCo39/MI800442uS+sOR0MXq/OKcfbiqytwbjX4zvsj4m+E0/pL9rY1yOMw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -2571,6 +2613,11 @@ packages:
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry/types/7.49.0:
|
||||||
|
resolution: {integrity: sha512-9yXXh7iv76+O6h2ONUVx0wsL1auqJFWez62mTjWk4350SgMmWp/zUkBxnVXhmcYqscz/CepC+Loz9vITLXtgxg==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sentry/utils/7.46.0:
|
/@sentry/utils/7.46.0:
|
||||||
resolution: {integrity: sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==}
|
resolution: {integrity: sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -2587,6 +2634,14 @@ packages:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@sentry/utils/7.49.0:
|
||||||
|
resolution: {integrity: sha512-JdC9yGnOgev4ISJVwmIoFsk8Zx0psDZJAj2DV7x4wMZsO6QK+YjC7G3mUED/S5D5lsrkBZ/3uvQQhr8DQI4UcQ==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
'@sentry/types': 7.49.0
|
||||||
|
tslib: 1.14.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@sinclair/typebox/0.24.51:
|
/@sinclair/typebox/0.24.51:
|
||||||
resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
|
resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
Loading…
Reference in a new issue