adopt to new api endpoints (#669)

* adopt to new api endpoints
This commit is contained in:
Neil 2023-06-16 13:19:37 +08:00 committed by GitHub
parent d7bc1d3aa9
commit 2d5adbf7d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 106 additions and 45 deletions

View file

@ -29,6 +29,8 @@ jobs:
is-updated: ${{ steps.check_version.outputs.updated }} is-updated: ${{ steps.check_version.outputs.updated }}
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with:
version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
fetch-depth: 5 fetch-depth: 5
@ -69,7 +71,7 @@ jobs:
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with: with:
version: 0.31.2 version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: cache node_modules build - name: cache node_modules build
@ -164,7 +166,7 @@ jobs:
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with: with:
version: 0.31.2 version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- run: rm -rf ./*.{dmg,zip} || true - run: rm -rf ./*.{dmg,zip} || true

View file

@ -45,16 +45,26 @@ jobs:
no preview or changes related to UI no preview or changes related to UI
test: test:
needs: changes needs: changes
runs-on: ubuntu-latest runs-on: macos-latest
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with: with:
version: 0.31.2 version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
# - name: cache node_modules build
# uses: actions/cache@v3
# with:
# key: test-ubuntu
# path: |
# ./pnpm
# ./.pnpm-store
# ./node_modules
# ./modules/desktop/node_modules
# ./modules/ui/node_modules
- name: cache node_modules build - name: cache node_modules build
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
key: test-ubuntu key: test-mac
path: | path: |
./pnpm ./pnpm
./.pnpm-store ./.pnpm-store
@ -84,7 +94,7 @@ jobs:
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with: with:
version: 0.31.2 version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: cache node_modules build - name: cache node_modules build
uses: actions/cache@v3 uses: actions/cache@v3
@ -105,21 +115,26 @@ jobs:
env: env:
CSC_IDENTITY_AUTO_DISCOVERY: "false" CSC_IDENTITY_AUTO_DISCOVERY: "false"
MAC_BUILD_TARGET: "dir" MAC_BUILD_TARGET: "dir"
- name: setup dev
run: |
mkdir -p /Users/runner/.tea/tea.xyz/gui
touch /Users/runner/.tea/tea.xyz/gui/dev
- name: e2e test - name: e2e test
run: tea -E xc e2e run: tea -E xc e2e
build_svelte: build_svelte:
needs: changes needs: changes
runs-on: ubuntu-latest runs-on: macos-latest
steps: steps:
- uses: teaxyz/setup@v0 - uses: teaxyz/setup@v0
with: with:
version: 0.31.2 version: 0.35.7
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: cache node_modules build - name: cache node_modules build
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
key: ubuntu-latest-pnpm # key: ubuntu-latest-pnpm
key: mac-latest-pnpm
path: | path: |
./pnpm ./pnpm
./.pnpm-store ./.pnpm-store
@ -129,7 +144,8 @@ jobs:
- name: cache electron build - name: cache electron build
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
key: ubuntu-latest-electron key: mac-latest-electron
# key: ubuntu-latest-electron
path: | path: |
./modules/desktop/.svelte-kit ./modules/desktop/.svelte-kit
./modules/desktop/build ./modules/desktop/build

View file

@ -182,10 +182,10 @@ tea gh release create "v$V"
| Project | Version | | Project | Version |
|-----------------------------------|-----------| |-----------------------------------|-----------|
| nodejs.org | =18.15.0 | | nodejs.org | =18.16.0 |
| pnpm.io | =7.18.2 | | pnpm.io | =7.33.1 |
| xcfile.dev | >=0.0.110 | | xcfile.dev | >=0.4.1 |
| python.org | ^3.10 | | python.org | ^3.11 |
[`tea/cli`]: https://github.com/teaxyz/cli [`tea/cli`]: https://github.com/teaxyz/cli
[`xc`]: https://xcfile.dev [`xc`]: https://xcfile.dev

View file

@ -9,6 +9,7 @@ import get from "./v1-client";
import { DeviceAuth } from "../../src/libs/types"; import { DeviceAuth } from "../../src/libs/types";
import { notifyMainWindow } from "../electron"; import { notifyMainWindow } from "../electron";
import { InitWatcher } from "./initialize"; import { InitWatcher } from "./initialize";
import { baseURL } from "./v1-client";
const sessionFilePath = path.join(getTeaPath(), "tea.xyz/gui/tmp.dat"); const sessionFilePath = path.join(getTeaPath(), "tea.xyz/gui/tmp.dat");
const sessionFolder = path.join(getTeaPath(), "tea.xyz/gui"); const sessionFolder = path.join(getTeaPath(), "tea.xyz/gui");
@ -75,7 +76,7 @@ let deviceIdRetryCount = 0;
async function getDeviceId() { async function getDeviceId() {
let deviceId = ""; let deviceId = "";
try { try {
const req = await axios.get<{ deviceId: string }>("https://api.tea.xyz/v1/auth/registerDevice"); const req = await axios.get<{ deviceId: string }>(`${baseURL}/v1/auth/registerDevice`);
deviceId = req.data.deviceId; deviceId = req.data.deviceId;
} catch (error) { } catch (error) {
log.error(error); log.error(error);

View file

@ -7,10 +7,11 @@ import { createReadStream, statSync } from "fs";
import { deepReadDir } from "./tea-dir"; import { deepReadDir } from "./tea-dir";
import fetch from "node-fetch"; import fetch from "node-fetch";
import { hooks } from "@teaxyz/lib"; import { hooks } from "@teaxyz/lib";
import { isDev } from "./auto-updater";
import { readSessionData, type Session } from "./auth"; import { readSessionData, type Session } from "./auth";
const base = "https://api.tea.xyz"; export const baseURL = isDev() ? "https://app.dev.tea.xyz" : "https://app.tea.xyz";
const publicHeader = { Authorization: "public" }; const publicHeader = { Authorization: "public" };
export async function get<T>(urlPath: string) { export async function get<T>(urlPath: string) {
try { try {
@ -22,7 +23,7 @@ export async function get<T>(urlPath: string) {
? await getHeaders(`GET/${urlPath}`, session) ? await getHeaders(`GET/${urlPath}`, session)
: publicHeader; : publicHeader;
const url = new URL(path.join("v1", urlPath), base).toString(); const url = new URL(path.join("v1", urlPath), baseURL).toString();
// TODO: add headers // TODO: add headers
const req = await axios.request<T>({ const req = await axios.request<T>({
method: "GET", method: "GET",
@ -49,7 +50,7 @@ export async function post<T>(urlPath: string, data: { [key: string]: any }) {
? await getHeaders(`GET/${urlPath}`, session) ? await getHeaders(`GET/${urlPath}`, session)
: publicHeader; : publicHeader;
const url = new URL(path.join("v1", urlPath), base).toString(); const url = new URL(path.join("v1", urlPath), baseURL).toString();
const req = await axios.request<T>({ const req = await axios.request<T>({
method: "POST", method: "POST",
url, url,

View file

@ -1,6 +1,6 @@
{ {
"name": "tea", "name": "tea",
"version": "0.2.24", "version": "0.2.25",
"private": true, "private": true,
"description": "tea gui app", "description": "tea gui app",
"author": "tea.xyz", "author": "tea.xyz",
@ -83,6 +83,8 @@
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@deno/shim-crypto": "^0.3.1",
"@deno/shim-deno": "^0.16.1",
"@electron/asar": "^3.2.3", "@electron/asar": "^3.2.3",
"@sentry/browser": "^7.49.0", "@sentry/browser": "^7.49.0",
"@sentry/electron": "^4.4.0", "@sentry/electron": "^4.4.0",
@ -107,19 +109,23 @@
"electron-vite": "^1.0.18", "electron-vite": "^1.0.18",
"electron-window-state": "^5.0.3", "electron-window-state": "^5.0.3",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"is-what": "^4.1.15",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"koffi": "^2.4.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"lorem-ipsum": "^2.0.8", "lorem-ipsum": "^2.0.8",
"mixpanel-browser": "^2.45.0", "mixpanel-browser": "^2.45.0",
"mkdirp": "^2.1.3", "mkdirp": "^2.1.3",
"moment": "^2.29.4", "moment": "^2.29.4",
"mousetrap": "^1.6.5", "mousetrap": "^1.6.5",
"outdent": "^0.8.0",
"pushy-electron": "^1.0.11", "pushy-electron": "^1.0.11",
"renderer": "link:@types/electron/renderer", "renderer": "link:@types/electron/renderer",
"svelte-infinite-scroll": "^2.0.1", "svelte-infinite-scroll": "^2.0.1",
"svelte-markdown": "^0.2.3", "svelte-markdown": "^0.2.3",
"svelte-watch-resize": "^1.0.3", "svelte-watch-resize": "^1.0.3",
"sveltekit-i18n": "^2.2.2", "sveltekit-i18n": "^2.2.2",
"undici": "^5.22.1",
"upath": "^2.0.1", "upath": "^2.0.1",
"vite-plugin-static-copy": "^0.13.1", "vite-plugin-static-copy": "^0.13.1",
"yaml": "^2.2.1" "yaml": "^2.2.1"

View file

@ -3,7 +3,7 @@
import { authStore } from "$libs/stores"; import { authStore } from "$libs/stores";
const { user } = authStore; const { user } = authStore;
// const authPage = `http://localhost:3000/v1/auth/user?device_id=${authStore.deviceId}`; // https://api.tea.xyz/v1/auth/user?device_id=device_id // const authPage = `http://localhost:3000/v1/auth/user?device_id=${authStore.deviceId}`; // https://app.tea.xyz/v1/auth/user?device_id=device_id
</script> </script>
{#if $user} {#if $user}

View file

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import { authStore } from "$libs/stores"; import { authStore } from "$libs/stores";
import { getSession } from "@native"; import { getSession } from "@native";
import { baseUrl } from "$libs/v1-client"; import { getBaseURL } from "$libs/v1-client";
import { shellOpenExternal, pollDeviceSession } from "@native"; import { shellOpenExternal, pollDeviceSession } from "@native";
import mouseLeaveDelay from "@tea/ui/lib/mouse-leave-delay"; import mouseLeaveDelay from "@tea/ui/lib/mouse-leave-delay";
const { user } = authStore; const { user } = authStore;
@ -17,6 +17,7 @@
const session = await getSession(); const session = await getSession();
if (session && session.device_id) { if (session && session.device_id) {
const baseUrl = await getBaseURL();
shellOpenExternal(`${baseUrl}/auth/user?device_id=${session.device_id}`); shellOpenExternal(`${baseUrl}/auth/user?device_id=${session.device_id}`);
pollDeviceSession(); pollDeviceSession();
} else { } else {

View file

@ -53,6 +53,7 @@ export async function getRepoAsPackage(owner: string, repo: string): Promise<Par
} }
export const trimGithubSlug = (slug: string): string => { export const trimGithubSlug = (slug: string): string => {
const [owner, repo] = slug.split("/"); const gh = slug.replace("https://github.com/", "");
const [owner, repo] = gh.split("/");
return [owner, repo].join("/"); return [owner, repo].join("/");
}; };

View file

@ -7,7 +7,7 @@
* thus saving us so much time * thus saving us so much time
* *
* primary concerns here are any method that does the following: * primary concerns here are any method that does the following:
* - connect to remote api(api.tea.xyz) and returns a data * - connect to remote api(app.tea.xyz) and returns a data
* - connect to a local platform api and returns a data * - connect to a local platform api and returns a data
*/ */
@ -18,7 +18,6 @@ import * as mock from "./native-mock";
import { PackageStates, type InstalledPackage } from "./types"; 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 withRetry from "./utils/retry"; import withRetry from "./utils/retry";
import log from "./logger"; import log from "./logger";
const { ipcRenderer, shell } = window.require("electron"); const { ipcRenderer, shell } = window.require("electron");
@ -26,9 +25,9 @@ const { ipcRenderer, shell } = window.require("electron");
export async function getDistPackages(): Promise<Package[]> { export async function getDistPackages(): Promise<Package[]> {
try { try {
return withRetry(async () => { return withRetry(async () => {
const req = await axios.get<Package[]>("https://gui.tea.xyz/packages.json"); const packages = await apiGet<Package[]>("packages");
log.info("packages received:", req.data.length); log.info("packages received:", packages?.length);
return req.data; return packages || [];
}); });
} catch (error) { } catch (error) {
log.error("getDistPackagesList:", error); log.error("getDistPackagesList:", error);
@ -136,6 +135,7 @@ export async function getPackage(packageName: string): Promise<Partial<Package>>
try { try {
return await withRetry(async () => { return await withRetry(async () => {
const data = await apiGet<Partial<Package>>(`packages/${packageName.replaceAll("/", ":")}`); const data = await apiGet<Partial<Package>>(`packages/${packageName.replaceAll("/", ":")}`);
log.info("package received:", data);
if (data) { if (data) {
return data; return data;
} else { } else {

View file

@ -3,7 +3,7 @@
* may contain fake/mock data * may contain fake/mock data
* *
* TODO: * TODO:
* * make cors work with api.tea.xyz/v1 * * make cors work with app.tea.xyz/v1
*/ */
import type { Package, Review, AirtablePost, Bottle } from "@tea/ui/types"; import type { Package, Review, AirtablePost, Bottle } from "@tea/ui/types";
import type { GUIPackage, Session, Packages, AutoUpdateStatus } from "./types"; import type { GUIPackage, Session, Packages, AutoUpdateStatus } from "./types";
@ -11,9 +11,6 @@ import { PackageStates } from "./types";
import { loremIpsum } from "lorem-ipsum"; import { loremIpsum } from "lorem-ipsum";
import _ from "lodash"; import _ from "lodash";
// import { getSession } from '$libs/stores/auth';
import * as v1Client from "$libs/v1-client";
const packages: Package[] = [ const packages: Package[] = [
{ {
slug: "mesonbuild_com", slug: "mesonbuild_com",

View file

@ -120,14 +120,14 @@ To read more about this package go to [${guiPkg.homepage}](${guiPkg.homepage}).
type: "md" type: "md"
}, },
synced: true, synced: true,
github: pkg.github github_url: pkg.github_url
? trimGithubSlug(pkg.github) ? trimGithubSlug(pkg.github_url)
: pkg.full_name?.includes("github.com") : pkg.full_name?.includes("github.com")
? trimGithubSlug(pkg.full_name.split("github.com/")[1]) ? trimGithubSlug(pkg.full_name.split("github.com/")[1])
: "" : ""
}; };
if (updatedPackage.github) { if (updatedPackage.github_url) {
const [owner, repo] = updatedPackage.github.split("/"); const [owner, repo] = updatedPackage.github_url.split("/");
const [readme, contributors, repoData] = await Promise.all([ const [readme, contributors, repoData] = await Promise.all([
getReadme(owner, repo), getReadme(owner, repo),
getContributors(owner, repo), getContributors(owner, repo),

View file

@ -1,24 +1,29 @@
import axios from "axios"; import axios from "axios";
import type { Session } from "$libs/types";
import bcrypt from "bcryptjs";
import { getSession } from "$libs/stores/auth";
import { getHeaders } from "@native"; import { getHeaders } from "@native";
import log from "./logger"; import log from "./logger";
export const baseUrl = "https://api.tea.xyz/v1"; import { isDev } from "@native";
let dev = false;
export const getBaseURL = async (): Promise<string> => {
if (dev) return "https://app.dev.tea.xyz";
const notProd = await isDev();
dev = notProd;
return notProd ? "https://app.dev.tea.xyz" : "https://app.tea.xyz";
};
export async function get<T>( export async function get<T>(
urlPath: string, urlPath: string,
params?: { [key: string]: string } params?: { [key: string]: string }
): Promise<T | null> { ): Promise<T | null> {
log.info(`GET /v1/${urlPath}`); log.info(`GET /v1/${urlPath}`);
const baseURL = await getBaseURL();
const headers = await getHeaders(`GET/${urlPath}`); const headers = await getHeaders(`GET/${urlPath}`);
delete headers["User-Agent"]; // this is in the browser, not allowed to modify UserAgent delete headers["User-Agent"]; // this is in the browser, not allowed to modify UserAgent
const req = await axios.request({ const req = await axios.request({
method: "GET", method: "GET",
baseURL: "https://api.tea.xyz", baseURL,
url: ["v1", ...urlPath.split("/")].filter((p) => p).join("/"), url: ["v1", ...urlPath.split("/")].filter((p) => p).join("/"),
headers, headers,
params, params,

View file

@ -9,6 +9,7 @@ describe("basic smoke test", () => {
beforeEach(async () => { beforeEach(async () => {
utils = setupUtils(browser); utils = setupUtils(browser);
await utils.goHome(); await utils.goHome();
await (await utils.screen.findByText("Stable Diffusion web UI")).waitForExist();
}); });
it("install brewkit from the made by tea tab", async () => { it("install brewkit from the made by tea tab", async () => {

View file

@ -93,8 +93,8 @@ export function setupUtils(browser: WebdriverIO.Browser) {
slug: string, slug: string,
state: "INSTALLED" | "UPDATE" | "UPDATED" = "INSTALLED" state: "INSTALLED" | "UPDATE" | "UPDATED" = "INSTALLED"
) => { ) => {
// wait 30 seconds for the badge to show up // wait 60 seconds for the badge to show up
for (let i = 0; i < 30; i++) { for (let i = 0; i < 60; i++) {
const badge = await findByTestId(`install-badge-${slug}`); const badge = await findByTestId(`install-badge-${slug}`);
expect(badge).toExist(); expect(badge).toExist();

View file

@ -29,7 +29,8 @@ export interface Package {
license?: string; license?: string;
size_bytes?: number; size_bytes?: number;
documentation_url?: string; documentation_url?: string;
github?: string; github?: string; // TODO: remove this eventually
github_url?: string;
contributors?: Contributor[]; contributors?: Contributor[];
readme?: { readme?: {
data: string; data: string;

View file

@ -14,6 +14,8 @@ importers:
modules/desktop: modules/desktop:
specifiers: specifiers:
'@deno/shim-crypto': ^0.3.1
'@deno/shim-deno': ^0.16.1
'@electron/asar': ^3.2.3 '@electron/asar': ^3.2.3
'@electron/notarize': ^1.2.3 '@electron/notarize': ^1.2.3
'@playwright/experimental-ct-svelte': ^1.29.2 '@playwright/experimental-ct-svelte': ^1.29.2
@ -70,14 +72,17 @@ importers:
eslint-config-prettier: ^8.3.0 eslint-config-prettier: ^8.3.0
eslint-plugin-svelte3: ^4.0.0 eslint-plugin-svelte3: ^4.0.0
fuse.js: ^6.6.2 fuse.js: ^6.6.2
is-what: ^4.1.15
js-yaml: ^4.1.0 js-yaml: ^4.1.0
jsdom: ^21.0.0 jsdom: ^21.0.0
koffi: ^2.4.2
lodash: ^4.17.21 lodash: ^4.17.21
lorem-ipsum: ^2.0.8 lorem-ipsum: ^2.0.8
mixpanel-browser: ^2.45.0 mixpanel-browser: ^2.45.0
mkdirp: ^2.1.3 mkdirp: ^2.1.3
moment: ^2.29.4 moment: ^2.29.4
mousetrap: ^1.6.5 mousetrap: ^1.6.5
outdent: ^0.8.0
postcss: ^8.4.19 postcss: ^8.4.19
prettier: ^2.8.8 prettier: ^2.8.8
prettier-plugin-svelte: ^2.10.0 prettier-plugin-svelte: ^2.10.0
@ -96,6 +101,7 @@ importers:
ts-node: ^10.9.1 ts-node: ^10.9.1
tslib: ^2.3.1 tslib: ^2.3.1
typescript: ^4.7.4 typescript: ^4.7.4
undici: ^5.22.1
upath: ^2.0.1 upath: ^2.0.1
vite: ^4.1.1 vite: ^4.1.1
vite-plugin-static-copy: ^0.13.1 vite-plugin-static-copy: ^0.13.1
@ -103,6 +109,8 @@ importers:
wdio-electron-service: ^4.0.2 wdio-electron-service: ^4.0.2
yaml: ^2.2.1 yaml: ^2.2.1
dependencies: dependencies:
'@deno/shim-crypto': 0.3.1
'@deno/shim-deno': 0.16.1
'@electron/asar': 3.2.4 '@electron/asar': 3.2.4
'@sentry/browser': 7.51.2 '@sentry/browser': 7.51.2
'@sentry/electron': 4.5.0 '@sentry/electron': 4.5.0
@ -127,19 +135,23 @@ importers:
electron-vite: 1.0.22_vite@4.3.5 electron-vite: 1.0.22_vite@4.3.5
electron-window-state: 5.0.3 electron-window-state: 5.0.3
fuse.js: 6.6.2 fuse.js: 6.6.2
is-what: 4.1.15
js-yaml: 4.1.0 js-yaml: 4.1.0
koffi: 2.4.2
lodash: 4.17.21 lodash: 4.17.21
lorem-ipsum: 2.0.8 lorem-ipsum: 2.0.8
mixpanel-browser: 2.47.0 mixpanel-browser: 2.47.0
mkdirp: 2.1.6 mkdirp: 2.1.6
moment: 2.29.4 moment: 2.29.4
mousetrap: 1.6.5 mousetrap: 1.6.5
outdent: 0.8.0
pushy-electron: 1.0.11 pushy-electron: 1.0.11
renderer: link:@types/electron/renderer renderer: link:@types/electron/renderer
svelte-infinite-scroll: 2.0.1 svelte-infinite-scroll: 2.0.1
svelte-markdown: 0.2.3_svelte@3.59.1 svelte-markdown: 0.2.3_svelte@3.59.1
svelte-watch-resize: 1.0.3 svelte-watch-resize: 1.0.3
sveltekit-i18n: 2.2.2_svelte@3.59.1 sveltekit-i18n: 2.2.2_svelte@3.59.1
undici: 5.22.1
upath: 2.0.1 upath: 2.0.1
vite-plugin-static-copy: 0.13.1_vite@4.3.5 vite-plugin-static-copy: 0.13.1_vite@4.3.5
yaml: 2.2.2 yaml: 2.2.2
@ -3552,7 +3564,7 @@ packages:
sirv: 2.0.3 sirv: 2.0.3
svelte: 3.59.1 svelte: 3.59.1
tiny-glob: 0.2.9 tiny-glob: 0.2.9
undici: 5.22.0 undici: 5.22.1
vite: 4.3.5 vite: 4.3.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -8406,6 +8418,11 @@ packages:
engines: {node: '>=12.13'} engines: {node: '>=12.13'}
dev: false dev: false
/is-what/4.1.15:
resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==}
engines: {node: '>=12.13'}
dev: false
/is-wsl/2.2.0: /is-wsl/2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -8841,6 +8858,11 @@ packages:
requiresBuild: true requiresBuild: true
dev: false dev: false
/koffi/2.4.2:
resolution: {integrity: sha512-XDAev7zupyLwj9ze/4728T7NSHbnYXEptFrQuiEJS3ou8RJYp86HkXjqD9oNYoc4wWWAjeJtPJsRQfRVA/iqvg==}
requiresBuild: true
dev: false
/ky/0.33.3: /ky/0.33.3:
resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==}
engines: {node: '>=14.16'} engines: {node: '>=14.16'}
@ -12300,6 +12322,13 @@ packages:
engines: {node: '>=14.0'} engines: {node: '>=14.0'}
dependencies: dependencies:
busboy: 1.6.0 busboy: 1.6.0
dev: false
/undici/5.22.1:
resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==}
engines: {node: '>=14.0'}
dependencies:
busboy: 1.6.0
/unfetch/4.2.0: /unfetch/4.2.0:
resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==}