-
-
-
+ loadingMessage="Loading Workspaces..."
+ >
+
+
+
+
-
- Create New Workspace
+
+
+
+
+
+
+
+ Create New Workspace
+
+
+
-
-
-
-
-
- You will not be able to use System Initiative until you verify your email.
+
+
+
+ You will not be able to use System Initiative until you verify your
+ email.
+
+
+
@@ -151,7 +153,7 @@ import {
Icon,
Timestamp,
themeClasses,
- RequestStatusMessage,
+ LoadStatus,
} from "@si/vue-lib/design-system";
import clsx from "clsx";
import { useRouter } from "vue-router";
@@ -196,17 +198,7 @@ const user = computed(() => authStore.user);
useHead({ title: "Workspaces" });
-const loadWorkspacesReqStatus =
- workspacesStore.getRequestStatus("LOAD_WORKSPACES");
-
-function reloadWorkspaces() {
- if (import.meta.env.SSR) return;
- if (!authStore.userIsLoggedIn) return;
-
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
- workspacesStore.LOAD_WORKSPACES();
-}
-watch(() => authStore.userIsLoggedIn, reloadWorkspaces, { immediate: true });
+const loadWorkspacesReqStatus = workspacesStore.refreshWorkspaces();
const activeSubscriptionDetails = computed(() => authStore.activeSubscription);
diff --git a/app/auth-portal/src/router.ts b/app/auth-portal/src/router.ts
index 6a68f23a61..0508439072 100644
--- a/app/auth-portal/src/router.ts
+++ b/app/auth-portal/src/router.ts
@@ -17,6 +17,7 @@ import ProfilePage from "./pages/ProfilePage.vue";
import DefaultWorkspacePage from "./pages/DefaultWorkspacePage.vue";
import WorkspaceGoPage from "./pages/WorkspaceGoPage.vue";
import SetupProductionUser from "./pages/SetupProductionUser.vue";
+import WorkspaceAuthTokensPage from "./pages/WorkspaceAuthTokensPage.vue";
// normally we'd initialize a router directly, but instead we pass the options to ViteSSG
export const routerOptions: RouterOptions = {
@@ -76,6 +77,12 @@ export const routerOptions: RouterOptions = {
component: WorkspaceDetailsPage,
props: true,
},
+ {
+ path: "/workspace/:workspaceId/authTokens",
+ name: "workspace-auth-tokens",
+ component: WorkspaceAuthTokensPage,
+ props: true,
+ },
{
path: "/workspace/:workspaceId/go",
name: "workspace-go",
diff --git a/app/auth-portal/src/store/authTokens.store.ts b/app/auth-portal/src/store/authTokens.store.ts
new file mode 100644
index 0000000000..3d57425750
--- /dev/null
+++ b/app/auth-portal/src/store/authTokens.store.ts
@@ -0,0 +1,64 @@
+import { defineStore } from "pinia";
+import { ApiRequest } from "@si/vue-lib/pinia";
+import { WorkspaceId } from "./workspaces.store";
+
+export type AuthTokenId = string;
+export interface AuthToken {
+ id: string;
+ name: string | null;
+ userId: string;
+ workspaceId: string;
+ createdAt: Date;
+ expiresAt: Date | null;
+ claims: unknown;
+ lastUsedAt: Date | null;
+ lastUsedIp: string | null;
+}
+
+export const useAuthTokensApi = defineStore("authTokens", {
+ actions: {
+ async FETCH_AUTH_TOKENS(workspaceId: WorkspaceId) {
+ return new ApiRequest<{ authTokens: AuthToken[] }>({
+ url: ["workspaces", { workspaceId }, "authTokens"],
+ keyRequestStatusBy: workspaceId,
+ });
+ },
+
+ async CREATE_AUTH_TOKEN(workspaceId: WorkspaceId, name?: string) {
+ return new ApiRequest<{ authToken: AuthToken; token: string }>({
+ method: "post",
+ url: ["workspaces", { workspaceId }, "authTokens"],
+ params: { name },
+ keyRequestStatusBy: workspaceId,
+ });
+ },
+
+ async FETCH_AUTH_TOKEN(workspaceId: WorkspaceId, tokenId: AuthTokenId) {
+ return new ApiRequest<{ authToken: AuthToken }>({
+ url: ["workspaces", { workspaceId }, "authTokens", { tokenId }],
+ keyRequestStatusBy: [workspaceId, tokenId],
+ });
+ },
+
+ async RENAME_AUTH_TOKEN(
+ workspaceId: WorkspaceId,
+ tokenId: AuthTokenId,
+ name: string | null,
+ ) {
+ return new ApiRequest
({
+ method: "put",
+ url: ["workspaces", { workspaceId }, "authTokens", { tokenId }],
+ params: { name },
+ keyRequestStatusBy: [workspaceId, tokenId],
+ });
+ },
+
+ async REVOKE_AUTH_TOKEN(workspaceId: WorkspaceId, tokenId: AuthTokenId) {
+ return new ApiRequest({
+ method: "delete",
+ url: ["workspaces", { workspaceId }, "authTokens", { tokenId }],
+ keyRequestStatusBy: [workspaceId, tokenId],
+ });
+ },
+ },
+});
diff --git a/app/auth-portal/src/store/workspaces.store.ts b/app/auth-portal/src/store/workspaces.store.ts
index f5440b08c8..b39767241f 100644
--- a/app/auth-portal/src/store/workspaces.store.ts
+++ b/app/auth-portal/src/store/workspaces.store.ts
@@ -1,10 +1,12 @@
import * as _ from "lodash-es";
import { defineStore } from "pinia";
+import { watch } from "vue";
import { ApiRequest } from "@si/vue-lib/pinia";
import { UserId, useAuthStore, User } from "./auth.store";
import { ISODateString } from "./shared-types";
export type WorkspaceId = string;
+export type AuthTokenId = string;
// TODO: do we want to share this type with the backend?
export type Workspace = {
@@ -86,6 +88,20 @@ export const useWorkspacesStore = defineStore("workspaces", {
},
},
actions: {
+ // Reloads workspaces immediately and reactively when the user logs in.
+ refreshWorkspaces() {
+ if (!import.meta.env.SSR) {
+ const authStore = useAuthStore();
+ watch(
+ () => authStore.userIsLoggedIn,
+ async (userIsLoggedIn) => {
+ if (userIsLoggedIn) await this.LOAD_WORKSPACES();
+ },
+ { immediate: true },
+ );
+ }
+ return this.getRequestStatus("LOAD_WORKSPACES");
+ },
async LOAD_WORKSPACES() {
return new ApiRequest({
url: "/workspaces",
@@ -218,13 +234,6 @@ export const useWorkspacesStore = defineStore("workspaces", {
});
},
- async CREATE_AUTOMATION_TOKEN(workspaceId: WorkspaceId) {
- return new ApiRequest<{ token: string }>({
- method: "post",
- url: `/workspaces/${workspaceId}/createAutomationToken`,
- });
- },
-
async CHANGE_MEMBERSHIP(
workspaceId: WorkspaceId,
userId: UserId,
diff --git a/bin/auth-api/.env b/bin/auth-api/.env
index d1aa94fe7a..1728fdc9e6 100644
--- a/bin/auth-api/.env
+++ b/bin/auth-api/.env
@@ -12,7 +12,7 @@ AUTH_API_URL=http://localhost:9001
AUTH_PORTAL_URL=http://localhost:9000
DATABASE_URL=postgresql://si:bugbear@localhost:5432/si_auth?schema=public
-DIRECT_DATABASE_URL=postgresql://si:bugbear@localhost:5432/si_auth?schema=public
+DIRECT_DATABASE_URL=postgresql://si:bugbear@localhost:7432/si_auth?schema=public
# Using a fixed shadow database is more stable because prisma won't force drop the shadow DB when creating migrations
# This database is auto created with the postgres development containers
SHADOW_DATABASE_URL=postgresql://si:bugbear@localhost:5432/si_auth_prisma_shadow_db?schema=public
diff --git a/bin/auth-api/prisma/migrations/20241219233638_add_auth_tokens_table/migration.sql b/bin/auth-api/prisma/migrations/20241219233638_add_auth_tokens_table/migration.sql
new file mode 100644
index 0000000000..35b5e4bca2
--- /dev/null
+++ b/bin/auth-api/prisma/migrations/20241219233638_add_auth_tokens_table/migration.sql
@@ -0,0 +1,20 @@
+-- CreateTable
+CREATE TABLE "AuthToken" (
+ "id" CHAR(26) NOT NULL,
+ "name" TEXT,
+ "userId" CHAR(26) NOT NULL,
+ "workspaceId" CHAR(26) NOT NULL,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "expiresAt" TIMESTAMP(3),
+ "claims" JSONB NOT NULL,
+ "lastUsedAt" TIMESTAMP(3),
+ "lastUsedIp" TEXT,
+
+ CONSTRAINT "AuthToken_pkey" PRIMARY KEY ("id")
+);
+
+-- AddForeignKey
+ALTER TABLE "AuthToken" ADD CONSTRAINT "AuthToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "AuthToken" ADD CONSTRAINT "AuthToken_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "workspaces"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/bin/auth-api/prisma/schema.prisma b/bin/auth-api/prisma/schema.prisma
index 90ac94b6ca..98559ce883 100644
--- a/bin/auth-api/prisma/schema.prisma
+++ b/bin/auth-api/prisma/schema.prisma
@@ -55,10 +55,19 @@ model User {
/// Timestamp of the latest account suspension. `undefined` if not suspended
suspendedAt DateTime? @map("suspended_at")
+ /// List of automation tokens a user has created
+ tokens AuthToken[]
+
@@index(fields: [email])
@@map("users")
}
+enum InstanceEnvType {
+ LOCAL
+ PRIVATE
+ SI
+}
+
model Workspace {
/// SI's id for the workspace (ULID)
id String @id @db.Char(26)
@@ -95,10 +104,18 @@ model Workspace {
/// Denotes whether this will show up in a users favourite workspaces list
isFavourite Boolean @default(false) @map("is_favourite")
+ tokens AuthToken[]
+
@@index(fields: [creatorUserId])
@@map("workspaces")
}
+enum RoleType {
+ OWNER
+ APPROVER
+ EDITOR
+}
+
model WorkspaceMembers {
id String @id @db.Char(26)
@@ -135,14 +152,29 @@ model TosAgreement {
@@map("tos_agreements")
}
-enum InstanceEnvType {
- LOCAL
- PRIVATE
- SI
-}
-
-enum RoleType {
- OWNER
- APPROVER
- EDITOR
+/// A JWT authenticating a user and granting permissions to a particular workspace
+model AuthToken {
+ // Token ULID used to look up and revoke the token
+ id String @id @db.Char(26)
+ // Display name of token for Auth Portal UI
+ name String?
+ /// User this token authenticates
+ user User @relation(fields: [userId], references: [id])
+ userId String @db.Char(26)
+ /// Workspace this token grants access to
+ workspace Workspace @relation(fields: [workspaceId], references: [id])
+ workspaceId String @db.Char(26)
+ /// When this token was created
+ createdAt DateTime @default(now())
+ /// When this token is set to expire (could be in the past).
+ /// Null if it doesn't have a direct expiration date
+ expiresAt DateTime?
+ /// Json claims in token
+ /// - role ("web" | "automation")
+ claims Json
+
+ /// When this token was last used
+ lastUsedAt DateTime?
+ /// From where this token was last used
+ lastUsedIp String?
}
diff --git a/bin/auth-api/src/routes/auth_token.routes.ts b/bin/auth-api/src/routes/auth_token.routes.ts
new file mode 100644
index 0000000000..e22a28ec9e
--- /dev/null
+++ b/bin/auth-api/src/routes/auth_token.routes.ts
@@ -0,0 +1,111 @@
+import { z } from "zod";
+import { RoleType } from "@prisma/client";
+import { ulid } from "ulidx";
+import { validate } from "../lib/validation-helpers";
+
+import { CustomRouteContext } from "../custom-state";
+import {
+ createSdfAuthToken,
+ decodeSdfAuthToken,
+} from "../services/auth.service";
+import {
+ AuthTokenId, getAuthToken, registerAuthToken, updateAuthToken, deleteAuthToken,
+ getAuthTokens,
+} from "../services/auth_tokens.service";
+import { authorizeWorkspaceRoute } from "./workspace.routes";
+import { ApiError } from "../lib/api-error";
+import { router } from ".";
+
+router.get("/workspaces/:workspaceId/authTokens", async (ctx) => {
+ const { workspaceId } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+
+ const authTokens = await getAuthTokens(workspaceId);
+
+ ctx.body = { authTokens };
+});
+
+router.post("/workspaces/:workspaceId/authTokens", async (ctx) => {
+ const { userId, workspaceId } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+
+ // Get params from body
+ const { name } = validate(
+ ctx.request.body,
+ z.object({
+ name: z.optional(z.string()),
+ }),
+ );
+
+ // Create the token
+ const token = createSdfAuthToken({
+ userId,
+ workspaceId,
+ role: "automation",
+ }, {
+ expiresIn: "1d",
+ jwtid: ulid(),
+ });
+
+ // And decode it to get the generated values (such as expiration)
+ const authToken = await registerAuthToken(name, await decodeSdfAuthToken(token));
+
+ ctx.body = { authToken, token };
+});
+
+router.get("/workspaces/:workspaceId/authTokens/:authTokenId", async (ctx) => {
+ const { authToken } = await authorizeAuthTokenRoute(ctx);
+ ctx.body = { authToken };
+});
+
+router.put("/workspaces/:workspaceId/authTokens/:authTokenId", async (ctx) => {
+ const { authToken } = await authorizeAuthTokenRoute(ctx);
+
+ // Get params from body
+ const { name } = validate(
+ ctx.request.body,
+ z.object({
+ name: z.nullable(z.string()),
+ }),
+ );
+
+ await updateAuthToken(authToken.id, { name });
+
+ ctx.body = { authToken };
+});
+
+router.delete("/workspaces/:workspaceId/authTokens/:authTokenId", async (ctx) => {
+ const { authTokenId } = await authorizeAuthTokenRoute(ctx);
+
+ const removed = await deleteAuthToken(authTokenId);
+
+ ctx.body = { removed };
+});
+
+// Authorize /workspaces/:workspaceId/authTokens/:authTokenId
+async function authorizeAuthTokenRoute(ctx: CustomRouteContext) {
+ if (!ctx.params.authTokenId) {
+ throw new Error(`No :authTokenId param on route: ${ctx.params}`);
+ }
+
+ const route = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+ const authToken = await getAuthToken(ctx.params.authTokenId);
+ if (!authToken) {
+ throw new ApiError("NotFound", "AuthToken not found");
+ }
+ if (authToken.workspaceId !== route.workspaceId) {
+ throw new ApiError("Unauthorized", "AuthToken does not belong to workspace");
+ }
+
+ // NOTE: we don't check userId of token because we require you to be a workspace
+ // owner, which means you can revoke any token in the workspace, regardless of who
+ // it grants permission to.
+ //
+ // Users probably need to be able to delete their own tokens even if they don't own the
+ // workspaces, but since only owners can create tokens and you can't transfer ownership,
+ // that situation won't happen for now. We can revisit when it does.
+
+ return {
+ ...route,
+ authTokenId: authToken.id as AuthTokenId,
+ authToken,
+ };
+}
diff --git a/bin/auth-api/src/routes/workspace.routes.ts b/bin/auth-api/src/routes/workspace.routes.ts
index 54b1def457..71062436a8 100644
--- a/bin/auth-api/src/routes/workspace.routes.ts
+++ b/bin/auth-api/src/routes/workspace.routes.ts
@@ -6,6 +6,7 @@ import { getCache, setCache } from "../lib/cache";
import {
getUserById,
refreshUserAuth0Profile,
+ UserId,
} from "../services/users.service";
import {
createWorkspace,
@@ -21,14 +22,12 @@ import {
SAAS_WORKSPACE_URL,
changeWorkspaceMembership,
setUpdatedDefaultWorkspace,
+ WorkspaceId,
} from "../services/workspaces.service";
import { validate } from "../lib/validation-helpers";
import { CustomRouteContext } from "../custom-state";
-import {
- makeAuthConnectUrl,
- createSdfAuthToken,
-} from "../services/auth.service";
+import { makeAuthConnectUrl, createSdfAuthToken } from "../services/auth.service";
import { tracker } from "../lib/tracker";
import { findLatestTosForUser } from "../services/tos.service";
import { posthog } from "../lib/posthog";
@@ -69,7 +68,7 @@ async function extractOwnWorkspaceIdParam(ctx: CustomRouteContext) {
return workspace;
}
-async function authorizeWorkspaceRoute(ctx: CustomRouteContext, role?: RoleType) {
+export async function authorizeWorkspaceRoute(ctx: CustomRouteContext, role?: RoleType) {
const workspace = await extractWorkspaceIdParam(ctx);
const authUser = extractAuthUser(ctx);
@@ -83,7 +82,13 @@ async function authorizeWorkspaceRoute(ctx: CustomRouteContext, role?: RoleType)
}
}
- return { authUser, workspace };
+ return {
+ authUser,
+ workspace,
+ // Conveniences for destructuring for routes that just need IDs
+ userId: authUser.id as UserId,
+ workspaceId: workspace.id as WorkspaceId,
+ };
}
router.get("/workspaces/:workspaceId", async (ctx) => {
@@ -91,13 +96,13 @@ router.get("/workspaces/:workspaceId", async (ctx) => {
});
router.delete("/workspaces/:workspaceId", async (ctx) => {
- const authUser = extractAuthUser(ctx);
- const workspace = await extractOwnWorkspaceIdParam(ctx);
+ // TODO RoleType.OWNER? Seems like not just anybody should be able to do this ...
+ const { authUser, workspaceId } = await authorizeWorkspaceRoute(ctx);
- await deleteWorkspace(workspace.id);
+ await deleteWorkspace(workspaceId);
tracker.trackEvent(authUser, "workspace_deleted", {
- workspaceId: workspace.id,
+ workspaceId,
workspaceDeletedAt: new Date(),
workspaceDeletedBy: authUser.email,
});
@@ -143,7 +148,10 @@ router.post("/workspaces/new", async (ctx) => {
});
router.patch("/workspaces/:workspaceId", async (ctx) => {
- const { authUser, workspace } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+ const {
+ authUser,
+ workspace,
+ } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
const reqBody = validate(
ctx.request.body,
@@ -199,7 +207,10 @@ router.get("/workspace/:workspaceId/members", async (ctx) => {
});
router.post("/workspace/:workspaceId/membership", async (ctx) => {
- const { authUser, workspace } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+ const {
+ authUser,
+ workspace,
+ } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
const reqBody = validate(
ctx.request.body,
@@ -234,7 +245,10 @@ router.post("/workspace/:workspaceId/membership", async (ctx) => {
});
router.post("/workspace/:workspaceId/members", async (ctx) => {
- const { authUser, workspace } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+ const {
+ authUser,
+ workspace,
+ } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
const reqBody = validate(
ctx.request.body,
@@ -262,7 +276,10 @@ router.post("/workspace/:workspaceId/members", async (ctx) => {
});
router.delete("/workspace/:workspaceId/members", async (ctx) => {
- const { authUser, workspace } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
+ const {
+ authUser,
+ workspace,
+ } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
const reqBody = validate(
ctx.request.body,
@@ -404,20 +421,6 @@ router.get("/workspaces/:workspaceId/go", async (ctx) => {
ctx.redirect(redirectUrl);
});
-router.post("/workspaces/:workspaceId/createAutomationToken", async (ctx) => {
- const { authUser, workspace } = await authorizeWorkspaceRoute(ctx, RoleType.OWNER);
-
- const token = createSdfAuthToken({
- userId: authUser.id,
- workspaceId: workspace.id,
- role: "automation",
- }, {
- expiresIn: "1 day",
- });
-
- ctx.body = { token };
-});
-
router.post("/complete-auth-connect", async (ctx) => {
const reqBody = validate(
ctx.request.body,
diff --git a/bin/auth-api/src/services/auth.service.ts b/bin/auth-api/src/services/auth.service.ts
index 0d74580cc4..efb785b253 100644
--- a/bin/auth-api/src/services/auth.service.ts
+++ b/bin/auth-api/src/services/auth.service.ts
@@ -60,11 +60,23 @@ interface SdfAuthTokenPayloadV2 {
// Old auth token versions
interface SdfAuthTokenPayloadV1 {
- user_pk: string;
- workspace_pk: string;
+ version?: undefined;
+ user_pk: UserId;
+ workspace_pk: WorkspaceId;
}
// Pass a V2 token in.
+export function createSdfAuthToken(
+ payload: Omit & { role: "automation" },
+ options: (
+ Omit
+ & Required>
+ ),
+): string;
+export function createSdfAuthToken(
+ payload: Omit & { role: "web" },
+ options?: Omit,
+): string;
export function createSdfAuthToken(
payload: Omit,
options?: Omit,
@@ -89,6 +101,19 @@ export async function decodeSdfAuthToken(token: string) {
return verifyJWT(token) as SdfAuthTokenPayload & JwtPayload;
}
+export function normalizeSdfAuthTokenPayload(token: SdfAuthTokenPayload): Omit {
+ if ("user_pk" in token) {
+ return {
+ userId: token.user_pk,
+ workspaceId: token.workspace_pk,
+ role: "web",
+ };
+ } else {
+ const { userId, workspaceId, role } = token;
+ return { userId, workspaceId, role };
+ }
+}
+
function wipeAuthCookie(ctx: Koa.Context) {
ctx.cookies.set(SI_COOKIE_NAME, null);
}
diff --git a/bin/auth-api/src/services/auth_tokens.service.ts b/bin/auth-api/src/services/auth_tokens.service.ts
new file mode 100644
index 0000000000..8c143b9eab
--- /dev/null
+++ b/bin/auth-api/src/services/auth_tokens.service.ts
@@ -0,0 +1,77 @@
+import { AuthToken, PrismaClient } from "@prisma/client";
+import { JwtPayload } from "jsonwebtoken";
+import { WorkspaceId } from "./workspaces.service";
+import { normalizeSdfAuthTokenPayload, SdfAuthTokenPayload } from "./auth.service";
+
+const prisma = new PrismaClient();
+
+export type AuthTokenId = string;
+
+export async function getAuthTokens(workspaceId: WorkspaceId) {
+ return await prisma.authToken.findMany({
+ where: { workspaceId },
+ orderBy: { id: "desc" },
+ });
+}
+
+export async function getAuthToken(id: AuthTokenId) {
+ return await prisma.authToken.findUnique({
+ where: { id },
+ });
+}
+
+export async function reportAuthTokenAccess(id: AuthTokenId, fromIp: string) {
+ return await prisma.authToken.update({
+ where: { id },
+ data: { lastUsedAt: new Date(), lastUsedIp: fromIp },
+ });
+}
+
+export async function registerAuthToken(
+ name: string | undefined,
+ token: SdfAuthTokenPayload & JwtPayload,
+) {
+ if (token.jti === undefined) throw new Error(`No token ID in token ${token}`);
+
+ const { userId, workspaceId, claims } = normalizePayload(token);
+ return await prisma.authToken.create({
+ data: {
+ id: token.jti,
+ name,
+ userId,
+ workspaceId,
+ claims,
+ createdAt: token.iat ? new Date(token.iat * 1000) : undefined,
+ expiresAt: token.exp ? new Date(token.exp * 1000) : undefined,
+ },
+ });
+
+ function normalizePayload(token: SdfAuthTokenPayload) {
+ switch (token.version) {
+ case "2": {
+ const { userId, workspaceId, role } = normalizeSdfAuthTokenPayload(token);
+ return { userId, workspaceId, claims: { role } };
+ }
+ case undefined: {
+ const { user_pk: userId, workspace_pk: workspaceId } = token;
+ return { userId, workspaceId, claims: { role: "web" } };
+ }
+ default:
+ return token satisfies never; // never = unreachable
+ }
+ }
+}
+
+export async function updateAuthToken(id: AuthTokenId, data: Pick) {
+ return await prisma.authToken.update({
+ where: { id },
+ data,
+ });
+}
+
+export async function deleteAuthToken(id: AuthTokenId) {
+ const { count } = await prisma.authToken.deleteMany({
+ where: { id },
+ });
+ return count > 0;
+}
diff --git a/lib/vue-lib/package.json b/lib/vue-lib/package.json
index 3b057735b9..3569d9a6f6 100644
--- a/lib/vue-lib/package.json
+++ b/lib/vue-lib/package.json
@@ -47,6 +47,7 @@
"@tailwindcss/forms": "^0.5.3",
"@tailwindcss/line-clamp": "^0.4.2",
"@tanstack/vue-table": "^8.20.5",
+ "@vueuse/core": "^12.0.0",
"@vueuse/head": "^1.1.23",
"axios": "^1.7.7",
"clsx": "^1.2.1",
@@ -84,4 +85,4 @@
"vite-svg-loader": "^3.4.0",
"vue-tsc": "^1.8.27"
}
-}
+}
\ No newline at end of file
diff --git a/lib/vue-lib/src/design-system/general/ErrorMessage.vue b/lib/vue-lib/src/design-system/general/ErrorMessage.vue
index 8ff8aed177..40d72666ad 100644
--- a/lib/vue-lib/src/design-system/general/ErrorMessage.vue
+++ b/lib/vue-lib/src/design-system/general/ErrorMessage.vue
@@ -33,28 +33,31 @@
diff --git a/lib/vue-lib/src/design-system/general/LoadStatus.vue b/lib/vue-lib/src/design-system/general/LoadStatus.vue
new file mode 100644
index 0000000000..77a12b39fc
--- /dev/null
+++ b/lib/vue-lib/src/design-system/general/LoadStatus.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/vue-lib/src/design-system/general/LoadingMessage.vue b/lib/vue-lib/src/design-system/general/LoadingMessage.vue
index e70f916206..0511810079 100644
--- a/lib/vue-lib/src/design-system/general/LoadingMessage.vue
+++ b/lib/vue-lib/src/design-system/general/LoadingMessage.vue
@@ -1,6 +1,10 @@
diff --git a/lib/vue-lib/src/design-system/general/RequestStatusMessage.vue b/lib/vue-lib/src/design-system/general/RequestStatusMessage.vue
index dfd9b05499..fd2ef3adf4 100644
--- a/lib/vue-lib/src/design-system/general/RequestStatusMessage.vue
+++ b/lib/vue-lib/src/design-system/general/RequestStatusMessage.vue
@@ -10,14 +10,13 @@
diff --git a/lib/vue-lib/src/design-system/icons/icon_set.ts b/lib/vue-lib/src/design-system/icons/icon_set.ts
index 66c33ee866..f6cb477531 100644
--- a/lib/vue-lib/src/design-system/icons/icon_set.ts
+++ b/lib/vue-lib/src/design-system/icons/icon_set.ts
@@ -89,6 +89,7 @@ import Logout from "~icons/material-symbols/logout";
import Cat from "~icons/fa6-solid/cat";
import Filter from "~icons/heroicons/funnel-20-solid";
import Menu from "~icons/heroicons-solid/menu-alt-1";
+import CircleStack from "~icons/heroicons-solid/circle-stack";
import BulletListIndented from "~icons/fluent/text-bullet-list-tree-16-regular";
import BulletList from "~icons/material-symbols/list";
import UserCircle from "~icons/heroicons/user-circle-solid";
@@ -228,6 +229,7 @@ export const ICONS = Object.freeze({
"circle-empty": MdiCheckboxBlankCircleOutline,
"circle-full": MdiCheckboxBlankCircle,
"circle-slash": CircleSlash,
+ "circle-stack": CircleStack,
"circle-stop": MaterialSymbolsStopCircleOutlineRounded,
click: MdiCursorDefaultClickOutline,
"clipboard-copy": ClipboardCopy,
diff --git a/lib/vue-lib/src/design-system/index.ts b/lib/vue-lib/src/design-system/index.ts
index 1750a98ed0..3d65f363a1 100644
--- a/lib/vue-lib/src/design-system/index.ts
+++ b/lib/vue-lib/src/design-system/index.ts
@@ -7,12 +7,13 @@ export * from "./forms/helpers/form-validation";
// ./general
export { default as Card } from "./general/Card.vue";
+export { default as LoadStatus } from "./general/LoadStatus.vue";
+export { default as RequestStatusMessage } from "./general/RequestStatusMessage.vue";
export { default as ErrorMessage } from "./general/ErrorMessage.vue";
export { default as LoadingMessage } from "./general/LoadingMessage.vue";
export { default as PillCounter } from "./general/PillCounter.vue";
export { default as Toggle } from "./general/Toggle.vue";
-export { default as RequestStatusMessage } from "./general/RequestStatusMessage.vue";
export { default as RichText } from "./general/RichText.vue";
export { default as Timestamp } from "./general/Timestamp.vue";
export { default as VButton } from "./general/VButton.vue";
diff --git a/lib/vue-lib/src/pinia/pinia_api_tools.ts b/lib/vue-lib/src/pinia/pinia_api_tools.ts
index 4f0592fc10..37e32cc483 100644
--- a/lib/vue-lib/src/pinia/pinia_api_tools.ts
+++ b/lib/vue-lib/src/pinia/pinia_api_tools.ts
@@ -16,7 +16,7 @@ NOTES / TODOS / IDEAS
*/
import { PiniaPlugin, PiniaPluginContext } from "pinia";
-import { AxiosError, AxiosInstance } from "axios";
+import { AxiosError, AxiosInstance, AxiosResponse } from "axios";
import { computed, ComputedRef, reactive, unref, Ref } from "vue";
import * as _ from "lodash-es";
import {
@@ -26,6 +26,7 @@ import {
} from "@si/ts-lib";
import { ulid } from "ulid";
import opentelemetry, { Span } from "@opentelemetry/api";
+import { UseAsyncStateReturn } from "@vueuse/core";
const tracer = opentelemetry.trace.getTracer("si-vue");
@@ -235,7 +236,7 @@ type RawApiRequestStatus = {
completedAt?: Date;
lastSuccessAt?: Date;
payload?: any;
- error?: any;
+ error?: AxiosResponse | { data: { error: { message: string } } };
completed?: DeferredPromise
;
};
/** type describing the computed getter with some convenience properties */
@@ -505,16 +506,20 @@ export const initPiniaApiToolkitPlugin = (config: { api: AxiosInstance }) => {
// mark the request as failure and store the error info
store.$patch((state) => {
+ const apiRequestStatus = state.apiRequestStatuses[
+ trackingKey
+ ] as ApiRequestStatus;
+ // TODO maybe use Axios.isAxiosError instead, but don't want to change behavior right now
if (err.response) {
- state.apiRequestStatuses[trackingKey].error = err.response;
+ apiRequestStatus.error = (err as AxiosError).response;
} else {
// if error was not http error or had no response body
// we still want some kind of fallback message to show
// and we keep it in a similar format to what the http error response bodies
- state.apiRequestStatuses[trackingKey].error = {
+ apiRequestStatus.error = {
data: {
error: {
- message: "Something went wrong, please contact support",
+ message: err.message,
},
},
};
@@ -627,10 +632,7 @@ export const initPiniaApiToolkitPlugin = (config: { api: AxiosInstance }) => {
isSuccess: !!rawStatus.receivedAt && !rawStatus.error,
isError: !!rawStatus.error,
...(rawStatus.error && {
- errorMessage:
- rawStatus.error.data?.error?.message ||
- rawStatus.error.data?.message ||
- rawStatus.error.statusText,
+ errorMessage: getApiStatusRequestErrorMessage(rawStatus.error),
errorCode: rawStatus.error.data?.error?.type,
}),
};
@@ -685,3 +687,53 @@ export function getCombinedRequestStatus(
};
});
}
+
+type AnyStatus = {
+ requestStatus?: ApiRequestStatus;
+ asyncState?: UseAsyncStateReturn;
+};
+
+/** Get the error message from an ApiRequestStatus or UseAsyncState */
+export function getErrorMessage({ requestStatus, asyncState }: AnyStatus) {
+ return (
+ requestStatus?.errorMessage ??
+ getApiStatusRequestErrorMessage(
+ asyncState?.error.value as ApiRequestStatus["error"],
+ ) ??
+ (asyncState?.error.value as Error | undefined)?.message
+ );
+}
+
+export type LoadStatus = "uninitialized" | "loading" | "error" | "success";
+
+/** Get the state of an ApiRequestStatus or UseAsyncState */
+export function getLoadStatus({
+ requestStatus,
+ asyncState,
+}: AnyStatus): LoadStatus {
+ if (requestStatus?.isPending || asyncState?.isLoading.value) return "loading";
+ if (requestStatus?.isError || asyncState?.error.value) return "error";
+ if (requestStatus?.isSuccess || asyncState?.isReady.value) return "success";
+ return "uninitialized";
+}
+
+function getApiStatusRequestErrorMessage(
+ error: ApiRequestStatus["error"],
+): string | undefined {
+ // TODO the statusText bit doesn't seem to ever happen
+ return (
+ error?.data?.error?.message ||
+ error?.data?.message ||
+ (error as any)?.statusText
+ );
+}
+
+/**
+ * Turns the response from an API action into an async function
+ * that returns data on success and throws error on error.
+ */
+export async function apiData(request: Promise>) {
+ const { result } = await request;
+ if (!result.success) throw result.err;
+ return result.data;
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index af9367e648..ec4632d673 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -16,6 +16,9 @@ importers:
'@si/vue-lib':
specifier: workspace:*
version: link:../../lib/vue-lib
+ '@vueuse/core':
+ specifier: ^12.0.0
+ version: 12.0.0(typescript@4.9.5)
'@vueuse/head':
specifier: ^1.3.1
version: 1.3.1(vue@3.5.12)
@@ -792,6 +795,9 @@ importers:
'@tanstack/vue-table':
specifier: ^8.20.5
version: 8.20.5(vue@3.5.12)
+ '@vueuse/core':
+ specifier: ^12.0.0
+ version: 12.0.0(typescript@4.9.5)
'@vueuse/head':
specifier: ^1.1.23
version: 1.1.23(vue@3.5.12)
@@ -4274,6 +4280,11 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: true
+ /@sindresorhus/is@0.7.0:
+ resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
+ engines: {node: '>=4'}
+ dev: true
+
/@sindresorhus/is@4.6.0:
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
engines: {node: '>=10'}
@@ -5334,7 +5345,6 @@ packages:
/@types/web-bluetooth@0.0.20:
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
- dev: true
/@types/wicg-file-system-access@2023.10.5:
resolution: {integrity: sha512-e9kZO9kCdLqT2h9Tw38oGv9UNzBBWaR1MzuAavxPcsV/7FJ3tWbU6RI3uB+yKIDPGLkGVbplS52ub0AcRLvrhA==}
@@ -5724,7 +5734,7 @@ packages:
vite: ^5.0.0
vue: ^3.2.25
dependencies:
- vite: 5.4.10(@types/node@18.19.59)(less@4.1.3)
+ vite: 5.4.10(@types/node@18.19.59)(less@4.2.0)
vue: 3.5.12(typescript@4.9.5)
dev: true
@@ -5812,6 +5822,16 @@ packages:
estree-walker: 2.0.2
source-map-js: 1.2.1
+ /@vue/compiler-core@3.5.13:
+ resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@vue/shared': 3.5.13
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+ dev: false
+
/@vue/compiler-dom@3.2.47:
resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==}
dependencies:
@@ -5832,6 +5852,13 @@ packages:
'@vue/compiler-core': 3.5.12
'@vue/shared': 3.5.12
+ /@vue/compiler-dom@3.5.13:
+ resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+ dependencies:
+ '@vue/compiler-core': 3.5.13
+ '@vue/shared': 3.5.13
+ dev: false
+
/@vue/compiler-sfc@3.2.47:
resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==}
dependencies:
@@ -5860,6 +5887,20 @@ packages:
postcss: 8.4.47
source-map-js: 1.2.0
+ /@vue/compiler-sfc@3.5.13:
+ resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@vue/compiler-core': 3.5.13
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ estree-walker: 2.0.2
+ magic-string: 0.30.12
+ postcss: 8.4.49
+ source-map-js: 1.2.1
+ dev: false
+
/@vue/compiler-ssr@3.2.47:
resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==}
dependencies:
@@ -5873,6 +5914,13 @@ packages:
'@vue/compiler-dom': 3.5.12
'@vue/shared': 3.5.12
+ /@vue/compiler-ssr@3.5.13:
+ resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/shared': 3.5.13
+ dev: false
+
/@vue/devtools-api@6.6.4:
resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
dev: false
@@ -5969,12 +6017,25 @@ packages:
dependencies:
'@vue/shared': 3.5.12
+ /@vue/reactivity@3.5.13:
+ resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
+ dependencies:
+ '@vue/shared': 3.5.13
+ dev: false
+
/@vue/runtime-core@3.5.12:
resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==}
dependencies:
'@vue/reactivity': 3.5.12
'@vue/shared': 3.5.12
+ /@vue/runtime-core@3.5.13:
+ resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/shared': 3.5.13
+ dev: false
+
/@vue/runtime-dom@3.5.12:
resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==}
dependencies:
@@ -5983,6 +6044,15 @@ packages:
'@vue/shared': 3.5.12
csstype: 3.1.3
+ /@vue/runtime-dom@3.5.13:
+ resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/runtime-core': 3.5.13
+ '@vue/shared': 3.5.13
+ csstype: 3.1.3
+ dev: false
+
/@vue/server-renderer@3.5.12(vue@3.5.12):
resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==}
peerDependencies:
@@ -5992,6 +6062,16 @@ packages:
'@vue/shared': 3.5.12
vue: 3.5.12(typescript@4.9.5)
+ /@vue/server-renderer@3.5.13(vue@3.5.13):
+ resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+ peerDependencies:
+ vue: 3.5.13
+ dependencies:
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ vue: 3.5.13(typescript@4.9.5)
+ dev: false
+
/@vue/shared@3.2.47:
resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
dev: true
@@ -6003,6 +6083,10 @@ packages:
/@vue/shared@3.5.12:
resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
+ /@vue/shared@3.5.13:
+ resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+ dev: false
+
/@vueuse/core@10.11.0(vue@3.5.12):
resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==}
dependencies:
@@ -6015,6 +6099,17 @@ packages:
- vue
dev: true
+ /@vueuse/core@12.0.0(typescript@4.9.5):
+ resolution: {integrity: sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==}
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 12.0.0
+ '@vueuse/shared': 12.0.0(typescript@4.9.5)
+ vue: 3.5.13(typescript@4.9.5)
+ transitivePeerDependencies:
+ - typescript
+ dev: false
+
/@vueuse/head@1.1.15(vue@3.5.12):
resolution: {integrity: sha512-LJqvb7dpSqnsdn6YWUxv97vWCnn/s6IfBrE4ih5kRlh8XQXr/HjXJ8IyIxxp0X7QDr3FhOsjRDpJSiQbDYbBdQ==}
peerDependencies:
@@ -6105,6 +6200,10 @@ packages:
resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==}
dev: true
+ /@vueuse/metadata@12.0.0:
+ resolution: {integrity: sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==}
+ dev: false
+
/@vueuse/shared@10.11.0(vue@3.5.12):
resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==}
dependencies:
@@ -6114,6 +6213,14 @@ packages:
- vue
dev: true
+ /@vueuse/shared@12.0.0(typescript@4.9.5):
+ resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==}
+ dependencies:
+ vue: 3.5.13(typescript@4.9.5)
+ transitivePeerDependencies:
+ - typescript
+ dev: false
+
/@yomguithereal/helpers@1.1.1:
resolution: {integrity: sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg==}
dev: false
@@ -6556,6 +6663,21 @@ packages:
/argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ /arr-diff@4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-flatten@1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-union@3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
dependencies:
@@ -6599,6 +6721,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /array-unique@0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/array.prototype.flat@1.3.1:
resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
engines: {node: '>= 0.4'}
@@ -6659,6 +6786,11 @@ packages:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
dev: true
+ /assign-symbols@1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/ast-module-types@4.0.0:
resolution: {integrity: sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==}
engines: {node: '>=12.0'}
@@ -6710,6 +6842,12 @@ packages:
engines: {node: '>= 4.0.0'}
dev: true
+ /atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+ dev: true
+
/atomic-sleep@1.0.0:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
@@ -6890,6 +7028,19 @@ packages:
/base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ /base@0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.0
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+ dev: true
+
/basic-auth@2.0.1:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
@@ -7026,6 +7177,42 @@ packages:
dependencies:
balanced-match: 1.0.2
+ /braces@2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /braces@2.3.2(supports-color@9.3.1):
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2(supports-color@9.3.1)
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
@@ -7173,6 +7360,21 @@ packages:
unique-filename: 3.0.0
dev: true
+ /cache-base@1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.0
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+ dev: true
+
/cache-content-type@1.0.1:
resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==}
engines: {node: '>= 6.0.0'}
@@ -7204,6 +7406,18 @@ packages:
responselike: 3.0.0
dev: true
+ /cacheable-request@2.1.4:
+ resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==}
+ dependencies:
+ clone-response: 1.0.2
+ get-stream: 3.0.0
+ http-cache-semantics: 3.8.1
+ keyv: 3.0.0
+ lowercase-keys: 1.0.0
+ normalize-url: 2.0.1
+ responselike: 1.0.2
+ dev: true
+
/cacheable-request@7.0.2:
resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
engines: {node: '>=8'}
@@ -7448,6 +7662,16 @@ packages:
/cjs-module-lexer@1.2.2:
resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
+ /class-utils@0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+ dev: true
+
/clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
@@ -7580,6 +7804,12 @@ packages:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ /clone-response@1.0.2:
+ resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
/clone-response@1.0.3:
resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
dependencies:
@@ -7671,6 +7901,14 @@ packages:
resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
dev: true
+ /collection-visit@1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+ dev: true
+
/color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
@@ -7939,6 +8177,16 @@ packages:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
dev: true
+ /cookie@0.3.1:
+ resolution: {integrity: sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
/cookie@0.7.1:
resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
engines: {node: '>= 0.6'}
@@ -7967,6 +8215,11 @@ packages:
is-what: 4.1.16
dev: true
+ /copy-descriptor@0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/copy-template-dir@1.4.0:
resolution: {integrity: sha512-xkXSJhvKz4MfLbVkZ7GyCaFo4ciB3uKI/HHzkGwj1eyTH5+7RTFxW5CE0irWAZgV5oFcO9hd6+NVXAtY9hlo7Q==}
dependencies:
@@ -8284,6 +8537,18 @@ packages:
ms: 2.0.0
dev: true
+ /debug@2.6.9(supports-color@9.3.1):
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ supports-color: 9.3.1
+ dev: true
+
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
requiresBuild: true
@@ -8364,6 +8629,18 @@ packages:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
dev: false
+ /decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /decompress-response@3.3.0:
+ resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
+ engines: {node: '>=4'}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
/decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
@@ -8517,6 +8794,28 @@ packages:
object-keys: 1.1.1
dev: true
+ /define-property@0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 0.1.7
+ dev: true
+
+ /define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.3
+ dev: true
+
+ /define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.3
+ isobject: 3.0.1
+ dev: true
+
/defined@1.0.1:
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
@@ -8843,12 +9142,16 @@ packages:
file-type: 11.1.0
filenamify: 3.0.0
get-stream: 4.1.0
- got: 11.8.6
+ got: 8.3.2
make-dir: 2.1.0
p-event: 2.3.1
pify: 4.0.1
dev: true
+ /duplexer3@0.1.5:
+ resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
+ dev: true
+
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
@@ -9942,6 +10245,36 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
+ /expand-brackets@2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /expand-brackets@2.1.4(supports-color@9.3.1):
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ debug: 2.6.9(supports-color@9.3.1)
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2(supports-color@9.3.1)
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/expect@27.5.1:
resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
@@ -9986,7 +10319,7 @@ packages:
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
- path-to-regexp: 0.1.12
+ path-to-regexp: 0.1.10
proxy-addr: 2.0.7
qs: 6.13.0
range-parser: 1.2.1
@@ -10017,6 +10350,21 @@ packages:
sort-keys-length: 1.0.1
dev: true
+ /extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: true
+
+ /extend-shallow@3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+ dev: true
+
/extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: true
@@ -10030,6 +10378,38 @@ packages:
tmp: 0.0.33
dev: true
+ /extglob@2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /extglob@2.0.4(supports-color@9.3.1):
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4(supports-color@9.3.1)
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2(supports-color@9.3.1)
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/extract-zip@2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
@@ -10092,7 +10472,7 @@ packages:
glob-parent: 3.1.0
is-glob: 4.0.3
merge2: 1.4.1
- micromatch: 4.0.8
+ micromatch: 3.1.10(supports-color@9.3.1)
transitivePeerDependencies:
- supports-color
dev: true
@@ -10319,6 +10699,16 @@ packages:
trim-repeated: 1.0.0
dev: true
+ /fill-range@4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+ dev: true
+
/fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
@@ -10495,6 +10885,11 @@ packages:
is-callable: 1.2.7
dev: true
+ /for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/foreground-child@2.0.0:
resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==}
engines: {node: '>=8.0.0'}
@@ -10586,6 +10981,13 @@ packages:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
+ /fragment-cache@0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-cache: 0.2.2
+ dev: true
+
/fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
@@ -10793,6 +11195,11 @@ packages:
pinkie-promise: 2.0.1
dev: true
+ /get-stream@3.0.0:
+ resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
+ engines: {node: '>=4'}
+ dev: true
+
/get-stream@4.1.0:
resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
engines: {node: '>=6'}
@@ -10830,6 +11237,11 @@ packages:
resolve-pkg-maps: 1.0.0
dev: true
+ /get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/getos@3.2.1:
resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
dependencies:
@@ -11077,6 +11489,31 @@ packages:
responselike: 3.0.0
dev: true
+ /got@8.3.2:
+ resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==}
+ engines: {node: '>=4'}
+ dependencies:
+ '@sindresorhus/is': 0.7.0
+ '@types/keyv': 3.1.4
+ '@types/responselike': 1.0.0
+ cacheable-request: 2.1.4
+ decompress-response: 3.3.0
+ duplexer3: 0.1.5
+ get-stream: 3.0.0
+ into-stream: 3.1.0
+ is-retry-allowed: 1.2.0
+ isurl: 1.0.0
+ lowercase-keys: 1.0.1
+ mimic-response: 1.0.1
+ p-cancelable: 0.4.1
+ p-timeout: 2.0.1
+ pify: 3.0.0
+ safe-buffer: 5.2.1
+ timed-out: 4.0.1
+ url-parse-lax: 3.0.0
+ url-to-options: 1.0.1
+ dev: true
+
/graceful-fs@4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
@@ -11127,8 +11564,8 @@ packages:
obliterator: 2.0.4
dev: false
- /graphql@16.8.1:
- resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==}
+ /graphql@16.5.0:
+ resolution: {integrity: sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==}
engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
dev: true
@@ -11179,10 +11616,20 @@ packages:
resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
engines: {node: '>= 0.4'}
+ /has-symbol-support-x@1.4.2:
+ resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==}
+ dev: true
+
/has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
+ /has-to-string-tag-x@1.4.1:
+ resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
+ dependencies:
+ has-symbol-support-x: 1.4.2
+ dev: true
+
/has-tostringtag@1.0.0:
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
engines: {node: '>= 0.4'}
@@ -11193,6 +11640,37 @@ packages:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
dev: true
+ /has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+ dev: true
+
+ /has-value@1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+ dev: true
+
+ /has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /has-values@1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+ dev: true
+
/has-yarn@3.0.0:
resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -11332,6 +11810,10 @@ packages:
http-errors: 1.8.1
dev: false
+ /http-cache-semantics@3.8.1:
+ resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==}
+ dev: true
+
/http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: true
@@ -11773,6 +12255,14 @@ packages:
side-channel: 1.0.4
dev: true
+ /into-stream@3.1.0:
+ resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ from2: 2.3.0
+ p-is-promise: 1.1.0
+ dev: true
+
/ioredis@5.3.1:
resolution: {integrity: sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==}
engines: {node: '>=12.22.0'}
@@ -11804,6 +12294,13 @@ packages:
engines: {node: '>=8'}
dev: false
+ /is-accessor-descriptor@1.0.1:
+ resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ hasown: 2.0.0
+ dev: true
+
/is-actual-promise@1.0.1:
resolution: {integrity: sha512-PlsL4tNv62lx5yN2HSqaRSTgIpUAPW7U6+crVB8HfWm5161rZpeqWbl0ZSqH2MAfRKXWSZVPRNbE/r8qPcb13g==}
dependencies:
@@ -11846,6 +12343,10 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+ dev: true
+
/is-builtin-module@3.2.1:
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
engines: {node: '>=6'}
@@ -11870,6 +12371,13 @@ packages:
dependencies:
has: 1.0.3
+ /is-data-descriptor@1.0.1:
+ resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.0
+ dev: true
+
/is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
@@ -11877,6 +12385,22 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-descriptor@0.1.7:
+ resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+ dev: true
+
+ /is-descriptor@1.0.3:
+ resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+ dev: true
+
/is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'}
@@ -11889,6 +12413,18 @@ packages:
hasBin: true
dev: true
+ /is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ dev: true
+
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -11993,6 +12529,13 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-number@3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@@ -12002,6 +12545,10 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-object@1.0.2:
+ resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==}
+ dev: true
+
/is-observable@1.1.0:
resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==}
engines: {node: '>=4'}
@@ -12049,6 +12596,13 @@ packages:
engines: {node: '>=12'}
dev: true
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
/is-plain-object@5.0.0:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
@@ -12079,6 +12633,11 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-retry-allowed@1.2.0:
+ resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/is-shared-array-buffer@1.0.2:
resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
dependencies:
@@ -12169,6 +12728,11 @@ packages:
engines: {node: '>=12.13'}
dev: true
+ /is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
@@ -12201,6 +12765,18 @@ packages:
engines: {node: '>=16'}
dev: true
+ /isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isarray: 1.0.0
+ dev: true
+
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/isomorphic.js@0.2.5:
resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==}
@@ -12271,6 +12847,14 @@ packages:
istanbul-lib-report: 3.0.1
dev: true
+ /isurl@1.0.0:
+ resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
+ engines: {node: '>= 4'}
+ dependencies:
+ has-to-string-tag-x: 1.4.1
+ is-object: 1.0.2
+ dev: true
+
/jackspeak@2.2.0:
resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==}
engines: {node: '>=14'}
@@ -12929,6 +13513,10 @@ packages:
hasBin: true
dev: true
+ /json-buffer@3.0.0:
+ resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
+ dev: true
+
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: true
@@ -13087,6 +13675,12 @@ packages:
tsscmp: 1.0.6
dev: false
+ /keyv@3.0.0:
+ resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==}
+ dependencies:
+ json-buffer: 3.0.0
+ dev: true
+
/keyv@4.5.2:
resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
dependencies:
@@ -13099,6 +13693,25 @@ packages:
json-buffer: 3.0.1
dev: true
+ /kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of@4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
@@ -13529,7 +14142,7 @@ packages:
/local-storage-fallback@4.1.2:
resolution: {integrity: sha512-oMTj4q8vnZ5FUB/tclzrTgMppSJgGs3ng4fm7qXEK/NjdzNKkVVncMRlsML+l6FwV0WBoOk8rVD5GqNQIhcz8Q==}
dependencies:
- cookie: 0.7.1
+ cookie: 0.3.1
dev: false
/locate-path@2.0.0:
@@ -13742,6 +14355,16 @@ packages:
tslib: 2.6.2
dev: false
+ /lowercase-keys@1.0.0:
+ resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /lowercase-keys@1.0.1:
+ resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/lowercase-keys@2.0.0:
resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
engines: {node: '>=8'}
@@ -13883,11 +14506,23 @@ packages:
tmpl: 1.0.5
dev: true
+ /map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/map-obj@5.0.2:
resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
+ /map-visit@1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ object-visit: 1.0.1
+ dev: true
+
/mark.js@8.11.1:
resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
dev: true
@@ -13989,6 +14624,48 @@ packages:
resolution: {integrity: sha512-2tzWP1w2Hh+r7kCYa4f//jpBEA6dAueiuLco38NxfjF9Py3KCCI7wVOTdCvOhmTC043t+ulclVBdl3v+s+UJIQ==}
dev: true
+ /micromatch@3.1.10:
+ resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 6.0.3
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /micromatch@3.1.10(supports-color@9.3.1):
+ resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2(supports-color@9.3.1)
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ extglob: 2.0.4(supports-color@9.3.1)
+ fragment-cache: 0.2.1
+ kind-of: 6.0.3
+ nanomatch: 1.2.13(supports-color@9.3.1)
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2(supports-color@9.3.1)
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
@@ -14187,6 +14864,14 @@ packages:
/mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+ /mixin-deep@1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+ dev: true
+
/mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
@@ -14293,6 +14978,44 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ /nanomatch@1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /nanomatch@1.2.13(supports-color@9.3.1):
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2(supports-color@9.3.1)
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/napi-macros@2.0.0:
resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==}
requiresBuild: true
@@ -14358,7 +15081,7 @@ packages:
concordance: 5.0.4
configstore: 5.0.1
content-type: 1.0.5
- cookie: 0.7.1
+ cookie: 0.5.0
copy-template-dir: 1.4.0
cron-parser: 4.8.1
debug: 4.3.4
@@ -14467,7 +15190,7 @@ packages:
/netlify-onegraph-internal@0.10.1:
resolution: {integrity: sha512-lGHBUfILWoMO2iJN3zmqd/S+pbgYyQI4WgWDiMrEPkDQPF6wO1JUmhcMOGiZfsmaX/leD9S+CKDKX7iDc440Hw==}
dependencies:
- graphql: 16.8.1
+ graphql: 16.5.0
node-fetch: 2.6.7
rusha: 0.8.14
uuid: 8.3.2
@@ -14695,6 +15418,15 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /normalize-url@2.0.1:
+ resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==}
+ engines: {node: '>=4'}
+ dependencies:
+ prepend-http: 2.0.0
+ query-string: 5.1.1
+ sort-keys: 2.0.0
+ dev: true
+
/normalize-url@6.1.0:
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
engines: {node: '>=10'}
@@ -14811,6 +15543,15 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /object-copy@0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+ dev: true
+
/object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
@@ -14827,6 +15568,13 @@ packages:
engines: {node: '>= 0.4'}
dev: true
+ /object-visit@1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
/object.assign@4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
engines: {node: '>= 0.4'}
@@ -14855,6 +15603,13 @@ packages:
es-abstract: 1.22.3
dev: true
+ /object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
/object.values@1.1.6:
resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
engines: {node: '>= 0.4'}
@@ -14999,6 +15754,11 @@ packages:
p-map: 2.1.0
dev: true
+ /p-cancelable@0.4.1:
+ resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==}
+ engines: {node: '>=4'}
+ dev: true
+
/p-cancelable@2.1.1:
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
engines: {node: '>=8'}
@@ -15056,6 +15816,11 @@ packages:
engines: {node: '>=4'}
dev: true
+ /p-is-promise@1.1.0:
+ resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==}
+ engines: {node: '>=4'}
+ dev: true
+
/p-limit@1.3.0:
resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
engines: {node: '>=4'}
@@ -15352,6 +16117,11 @@ packages:
tslib: 2.6.2
dev: false
+ /pascalcase@0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/patch-console@2.0.0:
resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -15419,8 +16189,8 @@ packages:
minipass: 5.0.0
dev: false
- /path-to-regexp@0.1.12:
- resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+ /path-to-regexp@0.1.10:
+ resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
dev: true
/path-to-regexp@6.3.0:
@@ -15624,6 +16394,11 @@ packages:
- supports-color
dev: true
+ /posix-character-classes@0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/postcss-comment@2.0.0:
resolution: {integrity: sha512-5zT5iKU7c0tK9KJFNrVf+g1MGTkzf/4V3e0Zzm2g1uoFQC5jeTHmB9O1iAqh97+jnKpc6al204e0pwFUiCwseg==}
dependencies:
@@ -15748,6 +16523,15 @@ packages:
picocolors: 1.1.1
source-map-js: 1.2.1
+ /postcss@8.4.49:
+ resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+ dev: false
+
/posthog-js@1.148.2:
resolution: {integrity: sha512-YQt8D+RS1a56ykLPLsqSq73vLYLIFQwlvY40ncgOM/uhxAV4FmbnYv85ZtwnB2SAZD/gChWXI/fprYQA9lhc1w==}
dependencies:
@@ -15842,6 +16626,11 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
+ /prepend-http@2.0.0:
+ resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
+ engines: {node: '>=4'}
+ dev: true
+
/prettier-linter-helpers@1.0.0:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'}
@@ -16097,6 +16886,15 @@ packages:
dependencies:
side-channel: 1.0.6
+ /query-string@5.1.1:
+ resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decode-uri-component: 0.2.2
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+ dev: true
+
/querystring@0.2.0:
resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==}
engines: {node: '>=0.4.x'}
@@ -16338,7 +17136,7 @@ packages:
engines: {node: '>=0.10'}
dependencies:
graceful-fs: 4.2.10
- micromatch: 4.0.8
+ micromatch: 3.1.10
readable-stream: 2.3.7
transitivePeerDependencies:
- supports-color
@@ -16371,6 +17169,14 @@ packages:
redis-errors: 1.2.0
dev: false
+ /regex-not@1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+ dev: true
+
/regexp-tree@0.1.24:
resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==}
hasBin: true
@@ -16441,6 +17247,11 @@ packages:
strip-ansi: 6.0.1
dev: false
+ /repeat-element@1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/repeat-string@1.6.1:
resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
engines: {node: '>=0.10'}
@@ -16520,6 +17331,11 @@ packages:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
dev: true
+ /resolve-url@0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+ dev: true
+
/resolve.exports@1.1.0:
resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
engines: {node: '>=10'}
@@ -16547,6 +17363,12 @@ packages:
supports-preserve-symlinks-flag: 1.0.0
dev: true
+ /responselike@1.0.2:
+ resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
+ dependencies:
+ lowercase-keys: 1.0.1
+ dev: true
+
/responselike@2.0.1:
resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
dependencies:
@@ -16600,6 +17422,11 @@ packages:
signal-exit: 3.0.7
dev: true
+ /ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+ dev: true
+
/ret@0.4.3:
resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==}
engines: {node: '>=10'}
@@ -16779,6 +17606,12 @@ packages:
ret: 0.4.3
dev: true
+ /safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+ dependencies:
+ ret: 0.1.15
+ dev: true
+
/safe-stable-stringify@2.4.3:
resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==}
engines: {node: '>=10'}
@@ -16943,6 +17776,16 @@ packages:
has-property-descriptors: 1.0.0
dev: true
+ /set-value@2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+ dev: true
+
/setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -17118,6 +17961,54 @@ packages:
sentence-case: 1.1.3
dev: false
+ /snapdragon-node@2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+ dev: true
+
+ /snapdragon-util@3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /snapdragon@0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /snapdragon@0.8.2(supports-color@9.3.1):
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9(supports-color@9.3.1)
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/socks-proxy-agent@8.0.2:
resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==}
engines: {node: '>= 14'}
@@ -17157,6 +18048,13 @@ packages:
is-plain-obj: 1.1.0
dev: true
+ /sort-keys@2.0.0:
+ resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==}
+ engines: {node: '>=4'}
+ dependencies:
+ is-plain-obj: 1.1.0
+ dev: true
+
/source-map-js@1.2.0:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
@@ -17165,12 +18063,33 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ /source-map-resolve@0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+ dev: true
+
/source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
+ /source-map-url@0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+ dev: true
+
+ /source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
@@ -17223,6 +18142,13 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /split-string@3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ dev: true
+
/split2@1.1.1:
resolution: {integrity: sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==}
dependencies:
@@ -17326,6 +18252,14 @@ packages:
- supports-color
dev: true
+ /static-extend@0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+ dev: true
+
/statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -17345,6 +18279,11 @@ packages:
bl: 5.1.0
dev: true
+ /strict-uri-encode@1.1.0:
+ resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/string-length@4.0.2:
resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
engines: {node: '>=10'}
@@ -18012,6 +18951,11 @@ packages:
engines: {node: '>=4'}
dev: true
+ /timed-out@4.0.1:
+ resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/tiny-invariant@1.3.1:
resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
dev: true
@@ -18079,17 +19023,42 @@ packages:
engines: {node: '>=4'}
dev: true
+ /to-object-path@0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
/to-readable-stream@2.1.0:
resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==}
engines: {node: '>=8'}
dev: true
+ /to-regex-range@2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ dev: true
+
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
+ /to-regex@3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+ dev: true
+
/toad-cache@3.7.0:
resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
engines: {node: '>=12'}
@@ -18589,6 +19558,16 @@ packages:
hookable: 5.5.3
dev: false
+ /union-value@1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+ dev: true
+
/union@0.5.0:
resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==}
engines: {node: '>= 0.8.0'}
@@ -18701,6 +19680,14 @@ packages:
webpack-virtual-modules: 0.5.0
dev: true
+ /unset-value@1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+ dev: true
+
/untildify@3.0.3:
resolution: {integrity: sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==}
engines: {node: '>=4'}
@@ -18769,16 +19756,33 @@ packages:
punycode: 2.1.1
dev: true
+ /urix@0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+ dev: true
+
/url-join@4.0.1:
resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
dev: true
+ /url-parse-lax@3.0.0:
+ resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ prepend-http: 2.0.0
+ dev: true
+
/url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
dependencies:
querystringify: 2.2.0
requires-port: 1.0.0
+ /url-to-options@1.0.1:
+ resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
+ engines: {node: '>= 4'}
+ dev: true
+
/url@0.11.0:
resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==}
dependencies:
@@ -18786,6 +19790,11 @@ packages:
querystring: 0.2.0
dev: true
+ /use@3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/util-browser@0.0.2:
resolution: {integrity: sha512-CsBJ5YROxA5mXq0TFFEk447bLcANx7O+MLhgJ8CCuZIOQaYUewpMeF0ODttYxOrWfCNny9b5l1nFMv4kd2MFdw==}
engines: {node: '>=0.10.x'}
@@ -18950,7 +19959,7 @@ packages:
strip-ansi: 6.0.1
tiny-invariant: 1.3.1
typescript: 4.9.5
- vite: 5.4.10(@types/node@18.19.59)(less@4.1.3)
+ vite: 5.4.10(@types/node@18.19.59)(less@4.2.0)
vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0
vscode-languageserver-textdocument: 1.0.7
@@ -19480,6 +20489,22 @@ packages:
'@vue/shared': 3.5.12
typescript: 4.9.5
+ /vue@3.5.13(typescript@4.9.5):
+ resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-sfc': 3.5.13
+ '@vue/runtime-dom': 3.5.13
+ '@vue/server-renderer': 3.5.13(vue@3.5.13)
+ '@vue/shared': 3.5.13
+ typescript: 4.9.5
+ dev: false
+
/w3c-hr-time@1.0.2:
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
deprecated: Use your platform's native performance.now() and performance.timeOrigin.