fix(fe2): SSR memory leak caused by vue apollo (#3790)

* fix(fe2): SSR memory leak caused by vue apollo

* linting fixes
This commit is contained in:
Kristaps Fabians Geikins
2025-01-13 10:13:59 +02:00
committed by GitHub
parent b98160f037
commit 489b8f547d
12 changed files with 179 additions and 139 deletions
+1
View File
@@ -59,6 +59,7 @@
"husky": "^7.0.4",
"lint-staged": "^12.3.7",
"lockfile": "^1.0.4",
"npkill": "^0.12.2",
"pino-pretty": "^9.1.1",
"prettier": "^2.5.1",
"ts-node": "^10.9.1",
@@ -2595,7 +2595,7 @@ export type Query = {
/** Look up server users */
users: UserSearchResultCollection;
/** Look up server users with a collection of emails */
usersByEmail: UserSearchResultCollection;
usersByEmail: Array<Maybe<LimitedUser>>;
/** Validates the slug, to make sure it contains only valid characters and its not taken. */
validateWorkspaceSlug: Scalars['Boolean']['output'];
workspace: Workspace;
@@ -9,10 +9,11 @@ import type {
TypedDocumentNode,
ServerError,
ServerParseError,
ApolloCache
ApolloCache,
Unmasked
} from '@apollo/client/core'
import { GraphQLError } from 'graphql'
import type { DocumentNode } from 'graphql'
import type { DocumentNode, GraphQLFormattedError } from 'graphql'
import {
flatten,
has,
@@ -27,7 +28,7 @@ import {
} from 'lodash-es'
import type { Modifier, ModifierDetails, Reference } from '@apollo/client/cache'
import type { Get, PartialDeep, Paths, ReadonlyDeep, Tagged } from 'type-fest'
import type { GraphQLErrors, NetworkError } from '@apollo/client/errors'
import type { NetworkError } from '@apollo/client/errors'
import { nanoid } from 'nanoid'
import { StackTrace } from '~~/lib/common/helpers/debugging'
import dayjs from 'dayjs'
@@ -117,7 +118,7 @@ export function isInvalidAuth(error: ApolloError | NetworkError) {
export function convertThrowIntoFetchResult(
err: unknown
): FetchResult<undefined> & { apolloError?: ApolloError; isInvalidAuth: boolean } {
let gqlErrors: readonly GraphQLError[]
let gqlErrors: readonly GraphQLFormattedError[]
let apolloError: Optional<ApolloError> = undefined
if (err instanceof ApolloError) {
gqlErrors = err.graphQLErrors
@@ -154,7 +155,7 @@ export function convertThrowIntoFetchResult(
* Get first error message from a GQL errors array
*/
export function getFirstErrorMessage(
errs: readonly GraphQLError[] | undefined | null,
errs: readonly GraphQLError[] | readonly GraphQLFormattedError[] | undefined | null,
fallbackMessage = 'An unexpected issue occurred'
): string {
return errs?.[0]?.message || fallbackMessage
@@ -176,7 +177,7 @@ export function updateCacheByFilter<TData, TVariables = unknown>(
* mutate anything being passed into this function! E.g. if you want to mutate arrays,
* create new arrays through slice()/filter() instead
*/
updater: (data: TData) => TData | undefined,
updater: (data: Unmasked<TData>) => Unmasked<TData> | undefined,
options: Partial<{
/**
* Whether to suppress errors that occur when the fragment being queried
@@ -203,7 +204,7 @@ export function updateCacheByFilter<TData, TVariables = unknown>(
)
}
const readData = (): TData | null => {
const readData = (): Unmasked<TData> | null => {
if (fragment) {
return cache.readFragment(fragment)
} else if (query) {
@@ -213,7 +214,7 @@ export function updateCacheByFilter<TData, TVariables = unknown>(
}
}
const writeData = (data: TData): boolean => {
const writeData = (data: Unmasked<TData>): boolean => {
if (fragment) {
cache.writeFragment({ ...fragment, data, overwrite })
return true
@@ -486,7 +487,9 @@ export function evictObjectFields<
)
}
export const resolveGenericStatusCode = (errors: GraphQLErrors) => {
export const resolveGenericStatusCode = (
errors: readonly GraphQLError[] | readonly GraphQLFormattedError[]
) => {
if (errors.some((e) => e.extensions?.code === 'FORBIDDEN')) return 403
if (
errors.some((e) =>
@@ -508,7 +511,10 @@ export const resolveGenericStatusCode = (errors: GraphQLErrors) => {
return 500
}
export const errorFailedAtPathSegment = (error: GraphQLError, segment: string) => {
export const errorFailedAtPathSegment = (
error: GraphQLError | GraphQLFormattedError,
segment: string
) => {
const path = error.path || []
return path[path.length - 1] === segment
}
@@ -18,7 +18,6 @@ import {
} from '@speckle/viewer'
import { useAuthCookie } from '~~/lib/auth/composables/auth'
import type {
Comment,
Project,
ProjectCommentThreadsArgs,
ViewerResourceItem
@@ -40,10 +39,8 @@ import { useViewerCommentUpdateTracking } from '~~/lib/viewer/composables/commen
import {
getCacheId,
getObjectReference,
isReference,
modifyObjectFields
} from '~~/lib/common/helpers/graphql'
import type { ModifyFnCacheData } from '~~/lib/common/helpers/graphql'
import {
useViewerOpenedThreadUpdateEmitter,
useViewerThreadTracking
@@ -60,8 +57,6 @@ import {
} from '~~/lib/viewer/composables/ui'
import { onKeyStroke, watchTriggerable } from '@vueuse/core'
import { setupDebugMode } from '~~/lib/viewer/composables/setup/dev'
import type { Reference } from '@apollo/client'
import type { Modifier } from '@apollo/client/cache'
import { useEmbed } from '~/lib/viewer/composables/setup/embed'
import { useMixpanel } from '~~/lib/core/composables/mp'
@@ -224,7 +219,7 @@ function useViewerSubscriptionEventTracker() {
(event, cache) => {
const isArchived = event.type === ProjectCommentsUpdatedMessageType.Archived
const isNew = event.type === ProjectCommentsUpdatedMessageType.Created
const model = event.comment
const comment = event.comment
if (isArchived) {
// Mark as archived
@@ -253,30 +248,21 @@ function useViewerSubscriptionEventTracker() {
}
}
)
} else if (isNew && model) {
const parentId = model.parent?.id
} else if (isNew && comment) {
const parentId = comment.parent?.id
// Add reply to parent
if (parentId) {
cache.modify({
id: getCacheId('Comment', parentId),
fields: {
replies: ((
oldValue: ModifyFnCacheData<Comment['replies']> | Reference
) => {
if (isReference(oldValue)) return oldValue
const newValue: typeof oldValue = {
totalCount: (oldValue?.totalCount || 0) + 1,
items: [
getObjectReference('Comment', model.id),
...(oldValue?.items || [])
]
}
return newValue
}) as Modifier<ModifyFnCacheData<Comment['replies']> | Reference>
}
})
modifyObjectField(
cache,
getCacheId('Comment', parentId),
'replies',
({ helpers: { createUpdatedValue, ref } }) =>
createUpdatedValue(({ update }) => {
update('totalCount', (totalCount) => totalCount + 1)
update('items', (items) => [ref('Comment', comment.id), ...items])
})
)
} else {
// Add comment thread
modifyObjectFields<ProjectCommentThreadsArgs, Project['commentThreads']>(
@@ -286,7 +272,7 @@ function useViewerSubscriptionEventTracker() {
if (fieldName !== 'commentThreads') return
const newItems = [
getObjectReference('Comment', model.id),
getObjectReference('Comment', comment.id),
...(data.items || [])
]
return {
@@ -31,7 +31,7 @@ import {
workspaceUpdateRoleMutation
} from '~/lib/workspaces/graphql/mutations'
import { isFunction } from 'lodash-es'
import type { GraphQLError } from 'graphql'
import type { GraphQLError, GraphQLFormattedError } from 'graphql'
import { onWorkspaceUpdatedSubscription } from '~/lib/workspaces/graphql/subscriptions'
import { useLock } from '~/lib/common/composables/singleton'
import type { Get } from 'type-fest'
@@ -131,7 +131,10 @@ export const useProcessWorkspaceInvite = () => {
callback: () => MaybeAsync<void>
preventErrorToasts?:
| boolean
| ((errors: GraphQLError[], errMsg: string) => boolean)
| ((
errors: GraphQLError[] | GraphQLFormattedError[],
errMsg: string
) => boolean)
}>
) => {
if (!isWorkspacesEnabled.value) return
@@ -253,7 +256,9 @@ export const useWorkspaceInviteManager = <
*/
preventRedirect: boolean
route: RouteLocationNormalized
preventErrorToasts: boolean | ((errors: GraphQLError[], errMsg: string) => boolean)
preventErrorToasts:
| boolean
| ((errors: GraphQLError[] | GraphQLFormattedError[], errMsg: string) => boolean)
}>
) => {
const isWorkspacesEnabled = useIsWorkspacesEnabled()
@@ -35,12 +35,12 @@ export default defineNuxtRouteMiddleware(async (to) => {
if (data?.project?.automations) return
const isForbidden = (errors || []).find((e) => e.extensions['code'] === 'FORBIDDEN')
const isForbidden = (errors || []).find((e) => e.extensions?.['code'] === 'FORBIDDEN')
const isNotFoundProject = (errors || []).find(
(e) => e.extensions['code'] === 'STREAM_NOT_FOUND'
(e) => e.extensions?.['code'] === 'STREAM_NOT_FOUND'
)
const isNotFoundAutomation = (errors || []).find(
(e) => e.extensions['code'] === 'AUTOMATION_NOT_FOUND'
(e) => e.extensions?.['code'] === 'AUTOMATION_NOT_FOUND'
)
if (isForbidden) {
return abortNavigation(
@@ -33,7 +33,7 @@ export default defineNuxtRouteMiddleware(async (to) => {
if (data?.automateFunction?.id) return
const isNotFound = (errors || []).find(
(e) => e.extensions['code'] === 'FUNCTION_NOT_FOUND'
(e) => e.extensions?.['code'] === 'FUNCTION_NOT_FOUND'
)
if (isNotFound) {
return abortNavigation(
@@ -26,12 +26,12 @@ export default defineNuxtRouteMiddleware(async (to) => {
// If project succesfully resolved, move on
if (data?.project?.model?.id) return
const isForbidden = (errors || []).find((e) => e.extensions['code'] === 'FORBIDDEN')
const isForbidden = (errors || []).find((e) => e.extensions?.['code'] === 'FORBIDDEN')
const isProjectNotFound = (errors || []).find(
(e) => e.extensions['code'] === 'STREAM_NOT_FOUND'
(e) => e.extensions?.['code'] === 'STREAM_NOT_FOUND'
)
const isModelNotFound = (errors || []).find(
(e) => e.extensions['code'] === 'BRANCH_NOT_FOUND'
(e) => e.extensions?.['code'] === 'BRANCH_NOT_FOUND'
)
// Check if project exists and model is valid
@@ -26,9 +26,9 @@ export default defineNuxtRouteMiddleware(async (to) => {
if (data?.workspaceBySlug.id) return
const isForbidden = (errors || []).find((e) => e.extensions['code'] === 'FORBIDDEN')
const isForbidden = (errors || []).find((e) => e.extensions?.['code'] === 'FORBIDDEN')
const isNotFound = (errors || []).find(
(e) => e.extensions['code'] === 'WORKSPACE_NOT_FOUND_ERROR'
(e) => e.extensions?.['code'] === 'WORKSPACE_NOT_FOUND_ERROR'
)
if (isForbidden) {
return abortNavigation(
@@ -58,7 +58,7 @@ export default defineNuxtRouteMiddleware(async (to) => {
const firstErrorWithCode = errors.find((e) => e.extensions?.['code'])
if (firstErrorWithCode) {
const errorCode = firstErrorWithCode.extensions['code']
const errorCode = firstErrorWithCode.extensions?.['code']
return abortNavigation(
createError({
statusCode: 401,
+3 -3
View File
@@ -23,7 +23,7 @@
"eslint:inspect": "eslint-config-inspector"
},
"dependencies": {
"@apollo/client": "^3.9.6",
"@apollo/client": "^3.12.4",
"@artmizu/nuxt-prometheus": "^2.2.1",
"@datadog/browser-rum": "^5.11.0",
"@headlessui/vue": "^1.7.13",
@@ -53,7 +53,7 @@
"@tiptap/suggestion": "2.10.3",
"@tiptap/vue-3": "2.10.3",
"@tryghost/content-api": "^1.11.21",
"@vue/apollo-composable": "4.0.2",
"@vue/apollo-composable": "npm:@speckle/apollo-composable@4.2.1-patch.1",
"@vue/apollo-ssr": "4.0.0",
"@vueuse/core": "^10.9.0",
"apollo-upload-client": "^18.0.1",
@@ -77,7 +77,7 @@
"tweetnacl-sealedbox-js": "^1.2.0",
"tweetnacl-util": "^0.15.1",
"ua-parser-js": "^1.0.38",
"vee-validate": "^4.7.0",
"vee-validate": "4.7.0",
"vue-advanced-cropper": "^2.8.8",
"vue-tippy": "^6.0.0",
"ws": "^8.17.1"
+2 -1
View File
@@ -45,6 +45,7 @@
}
},
"peerDependencies": {
"vee-validate": "^4.7.0",
"vue": "^3.3.0"
},
"dependencies": {
@@ -57,7 +58,6 @@
"lodash-es": "^4.0.0",
"nanoid": "^3.0.0",
"v3-infinite-loading": "^1.2.2",
"vee-validate": "^4.7.0",
"vue-advanced-cropper": "^2.8.8",
"vue-tippy": "^6.0.0"
},
@@ -97,6 +97,7 @@
"type-fest": "^2.13.1",
"typescript": "^5.0.4",
"unplugin-vue-macros": "^2.7.0",
"vee-validate": "4.7.0",
"vite": "^4.5.2",
"vite-plugin-dts": "^3.6.3",
"vue": "^3.3.8",
+124 -83
View File
@@ -80,9 +80,9 @@ __metadata:
languageName: node
linkType: hard
"@apollo/client@npm:^3.6.6, @apollo/client@npm:^3.7.0, @apollo/client@npm:^3.7.14, @apollo/client@npm:^3.8.0, @apollo/client@npm:^3.9.6":
version: 3.9.7
resolution: "@apollo/client@npm:3.9.7"
"@apollo/client@npm:^3.12.4, @apollo/client@npm:^3.6.6, @apollo/client@npm:^3.7.0, @apollo/client@npm:^3.7.14, @apollo/client@npm:^3.8.0":
version: 3.12.4
resolution: "@apollo/client@npm:3.12.4"
dependencies:
"@graphql-typed-document-node/core": "npm:^3.1.1"
"@wry/caches": "npm:^1.0.0"
@@ -92,7 +92,7 @@ __metadata:
hoist-non-react-statics: "npm:^3.3.2"
optimism: "npm:^0.18.0"
prop-types: "npm:^15.7.2"
rehackt: "npm:0.0.6"
rehackt: "npm:^0.1.0"
response-iterator: "npm:^0.2.6"
symbol-observable: "npm:^4.0.0"
ts-invariant: "npm:^0.10.3"
@@ -101,8 +101,8 @@ __metadata:
peerDependencies:
graphql: ^15.0.0 || ^16.0.0
graphql-ws: ^5.5.5
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc
subscriptions-transport-ws: ^0.9.0 || ^0.11.0
peerDependenciesMeta:
graphql-ws:
@@ -113,7 +113,7 @@ __metadata:
optional: true
subscriptions-transport-ws:
optional: true
checksum: 10/d11ccdc5fc69e003c0ad2c6aa9c263823abce6c164bda726cfacbed0f94dfce366aa6bed0abc8c747420b24c3248f4a561a6007350d48373c62728bdbf3bdbcb
checksum: 10/9659ccf03ab5d6708cf191a1bd09c33ab5f958a8d66e783f81ccc899448b362a51cecf7d62c0ff5b852e60a340238e6903b3c96dcb5cf68dfb8a438ee6cd24bb
languageName: node
linkType: hard
@@ -15582,7 +15582,7 @@ __metadata:
languageName: node
linkType: hard
"@sindresorhus/is@npm:^4.0.0":
"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.6.0":
version: 4.6.0
resolution: "@sindresorhus/is@npm:4.6.0"
checksum: 10/e7f36ed72abfcd5e0355f7423a72918b9748bb1ef370a59f3e5ad8d40b728b85d63b272f65f63eec1faf417cda89dcb0aeebe94015647b6054659c1442fe5ce0
@@ -16837,7 +16837,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@speckle/frontend-2@workspace:packages/frontend-2"
dependencies:
"@apollo/client": "npm:^3.9.6"
"@apollo/client": "npm:^3.12.4"
"@artmizu/nuxt-prometheus": "npm:^2.2.1"
"@babel/core": "npm:^7.19.6"
"@babel/preset-env": "npm:^7.19.4"
@@ -16902,7 +16902,7 @@ __metadata:
"@types/ua-parser-js": "npm:^0.7.39"
"@typescript-eslint/eslint-plugin": "npm:^7.12.0"
"@typescript-eslint/parser": "npm:^7.12.0"
"@vue/apollo-composable": "npm:4.0.2"
"@vue/apollo-composable": "npm:@speckle/apollo-composable@4.2.1-patch.1"
"@vue/apollo-ssr": "npm:4.0.0"
"@vueuse/core": "npm:^10.9.0"
apollo-upload-client: "npm:^18.0.1"
@@ -16950,7 +16950,7 @@ __metadata:
type-fest: "npm:^4.24.0"
typescript: "npm:^4.8.3"
ua-parser-js: "npm:^1.0.38"
vee-validate: "npm:^4.7.0"
vee-validate: "npm:4.7.0"
vue-advanced-cropper: "npm:^2.8.8"
vue-tippy: "npm:^6.0.0"
vue-tsc: "npm:2.0.10"
@@ -17523,7 +17523,7 @@ __metadata:
typescript: "npm:^5.0.4"
unplugin-vue-macros: "npm:^2.7.0"
v3-infinite-loading: "npm:^1.2.2"
vee-validate: "npm:^4.7.0"
vee-validate: "npm:4.7.0"
vite: "npm:^4.5.2"
vite-plugin-dts: "npm:^3.6.3"
vue: "npm:^3.3.8"
@@ -17532,6 +17532,7 @@ __metadata:
vue-tsc: "npm:^1.8.22"
wait-on: "npm:^6.0.1"
peerDependencies:
vee-validate: ^4.7.0
vue: ^3.3.0
languageName: unknown
linkType: soft
@@ -22422,9 +22423,9 @@ __metadata:
languageName: node
linkType: hard
"@vue/apollo-composable@npm:4.0.2":
version: 4.0.2
resolution: "@vue/apollo-composable@npm:4.0.2"
"@vue/apollo-composable@npm:@speckle/apollo-composable@4.2.1-patch.1":
version: 4.2.1-patch.1
resolution: "@speckle/apollo-composable@npm:4.2.1-patch.1"
dependencies:
throttle-debounce: "npm:^5.0.0"
ts-essentials: "npm:^9.4.0"
@@ -22437,17 +22438,17 @@ __metadata:
peerDependenciesMeta:
"@vue/composition-api":
optional: true
checksum: 10/fc07bf29876d9852208b83c50b18771deaa60ddc7d4fbe0cdb2026dacf3bfafe098e8a6c7bb10cc99786ee3479dcfa2497406fbd505d142d45302590a8c12666
checksum: 10/f8816269d1e0294b817af863417a49bce353e0324a7c984f9c71a057d4b3415e1708ac6bf41907951a7fe467cf0a1dfacfec9e78db9985ba7f2773cbba0a2e38
languageName: node
linkType: hard
"@vue/apollo-composable@npm:^4.0.0-alpha.19":
version: 4.0.0-beta.1
resolution: "@vue/apollo-composable@npm:4.0.0-beta.1"
"@vue/apollo-composable@npm:^4.0.0-alpha.19, @vue/apollo-composable@npm:^4.0.0-beta.5":
version: 4.2.1
resolution: "@vue/apollo-composable@npm:4.2.1"
dependencies:
throttle-debounce: "npm:^3.0.1"
ts-essentials: "npm:^9.1.2"
vue-demi: "npm:^0.13.1"
throttle-debounce: "npm:^5.0.0"
ts-essentials: "npm:^9.4.0"
vue-demi: "npm:^0.14.6"
peerDependencies:
"@apollo/client": ^3.4.13
"@vue/composition-api": ^1.0.0
@@ -22456,26 +22457,7 @@ __metadata:
peerDependenciesMeta:
"@vue/composition-api":
optional: true
checksum: 10/01d0bbfc8141cd30f9bad76b056de8a79f94853b3659f2e708ce7bc7a0a97e84ccc26aad65b6717ebbac44b713f954e2d0f8f0a0e86f0ecddbe74ba039fa6ab7
languageName: node
linkType: hard
"@vue/apollo-composable@npm:^4.0.0-beta.5":
version: 4.0.0-beta.5
resolution: "@vue/apollo-composable@npm:4.0.0-beta.5"
dependencies:
throttle-debounce: "npm:^3.0.1"
ts-essentials: "npm:^9.1.2"
vue-demi: "npm:^0.13.1"
peerDependencies:
"@apollo/client": ^3.4.13
"@vue/composition-api": ^1.0.0
graphql: ">=15"
vue: ^2.6.0 || ^3.1.0
peerDependenciesMeta:
"@vue/composition-api":
optional: true
checksum: 10/5dc1e7ff50cddb9c52077aaa589776e6a8646a3eef74f7adede207fc5f24d42c57d9ed6fbbdf3bb593acab3f25fc2edc797f79ac397dad03e95d6ee62c99deb2
checksum: 10/008e0ba6d549b2e1f2f7c85f42807120a9ffe8775b70ac3fd451fcfdc1c9fa6c9e37539954fddc931e12dd61428b1c20815534a274794b99f7bf3ccba7a5f80e
languageName: node
linkType: hard
@@ -22928,10 +22910,10 @@ __metadata:
languageName: node
linkType: hard
"@vue/devtools-api@npm:^6.1.4":
version: 6.4.4
resolution: "@vue/devtools-api@npm:6.4.4"
checksum: 10/086fcc7a029601090fbdf89b7b6c8599b16656654e2af0d5612e42f439d0cde0ca211e9f7eee940290e38e3c3a144cbe8298af0bd46babf4873d1d79a2ddf64c
"@vue/devtools-api@npm:^6.1.4, @vue/devtools-api@npm:^6.6.4":
version: 6.6.4
resolution: "@vue/devtools-api@npm:6.6.4"
checksum: 10/0fca4912b6ae0185b9375f5d113d417984077db0681c74cf39eb8522eb82c27f662a72e1ae3e0d79e105fdd0a99a7cbd65ed111465d238f60cce10922e02a812
languageName: node
linkType: hard
@@ -22942,13 +22924,6 @@ __metadata:
languageName: node
linkType: hard
"@vue/devtools-api@npm:^6.6.4":
version: 6.6.4
resolution: "@vue/devtools-api@npm:6.6.4"
checksum: 10/0fca4912b6ae0185b9375f5d113d417984077db0681c74cf39eb8522eb82c27f662a72e1ae3e0d79e105fdd0a99a7cbd65ed111465d238f60cce10922e02a812
languageName: node
linkType: hard
"@vue/devtools-core@npm:7.6.8":
version: 7.6.8
resolution: "@vue/devtools-core@npm:7.6.8"
@@ -24219,6 +24194,13 @@ __metadata:
languageName: node
linkType: hard
"ansi-escapes@npm:^6.2.1":
version: 6.2.1
resolution: "ansi-escapes@npm:6.2.1"
checksum: 10/3b064937dc8a0645ed8094bc8b09483ee718f3aa3139746280e6c2ea80e28c0a3ce66973d0f33e88e60021abbf67e5f877deabfc810e75edf8a19dfa128850be
languageName: node
linkType: hard
"ansi-html-community@npm:^0.0.8":
version: 0.0.8
resolution: "ansi-html-community@npm:0.0.8"
@@ -27170,6 +27152,13 @@ __metadata:
languageName: node
linkType: hard
"colors@npm:1.4.0":
version: 1.4.0
resolution: "colors@npm:1.4.0"
checksum: 10/90b2d5465159813a3983ea72ca8cff75f784824ad70f2cc2b32c233e95bcfbcda101ebc6d6766bc50f57263792629bfb4f1f8a4dfbd1d240f229fc7f69b785fc
languageName: node
linkType: hard
"colors@npm:~1.2.1":
version: 1.2.5
resolution: "colors@npm:1.2.5"
@@ -30034,6 +30023,13 @@ __metadata:
languageName: node
linkType: hard
"emojilib@npm:^2.4.0":
version: 2.4.0
resolution: "emojilib@npm:2.4.0"
checksum: 10/bef767eca49acaa881388d91bee6936ea57ae367d603d5227ff0a9da3e2d1e774a61c447e5f2f4901797d023c4b5239bc208285b6172a880d3655024a0f44980
languageName: node
linkType: hard
"emojis-list@npm:^3.0.0":
version: 3.0.0
resolution: "emojis-list@npm:3.0.0"
@@ -32713,6 +32709,13 @@ __metadata:
languageName: node
linkType: hard
"gar@npm:^1.0.4":
version: 1.0.4
resolution: "gar@npm:1.0.4"
checksum: 10/6b1010b5c17056526298734bfa08716f111cd023394dbe32496841e2f7b0dfe9e742b8ddb56103c0867f2ae80f5f069262916e5398ac982467be4da240ba7bb9
languageName: node
linkType: hard
"gauge@npm:^3.0.0":
version: 3.0.2
resolution: "gauge@npm:3.0.2"
@@ -32812,6 +32815,17 @@ __metadata:
languageName: node
linkType: hard
"get-folder-size@npm:^4.0.0":
version: 4.0.0
resolution: "get-folder-size@npm:4.0.0"
dependencies:
gar: "npm:^1.0.4"
bin:
get-folder-size: bin/get-folder-size.js
checksum: 10/424d0310dd3bf8f9f38dd686cca4201e162ce4569831a71de9cb018667e238c243bfbe6560c31f5898a4fe1783e8b7ae4bdc7ce151b317ea20c8ea85f284e7a2
languageName: node
linkType: hard
"get-func-name@npm:^2.0.0, get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2":
version: 2.0.2
resolution: "get-func-name@npm:2.0.2"
@@ -41091,6 +41105,18 @@ __metadata:
languageName: node
linkType: hard
"node-emoji@npm:^2.1.3":
version: 2.2.0
resolution: "node-emoji@npm:2.2.0"
dependencies:
"@sindresorhus/is": "npm:^4.6.0"
char-regex: "npm:^1.0.2"
emojilib: "npm:^2.4.0"
skin-tone: "npm:^2.0.0"
checksum: 10/2548668f5cc9f781c94dc39971a630b2887111e0970c29fc523e924819d1b39b53a2694a4d1046861adf538c4462d06ee0269c48717ccad30336a918d9a911d5
languageName: node
linkType: hard
"node-fetch-native@npm:^1.0.1":
version: 1.0.1
resolution: "node-fetch-native@npm:1.0.1"
@@ -41456,6 +41482,22 @@ __metadata:
languageName: node
linkType: hard
"npkill@npm:^0.12.2":
version: 0.12.2
resolution: "npkill@npm:0.12.2"
dependencies:
ansi-escapes: "npm:^6.2.1"
colors: "npm:1.4.0"
get-folder-size: "npm:^4.0.0"
node-emoji: "npm:^2.1.3"
open-file-explorer: "npm:^1.0.2"
rxjs: "npm:^7.8.1"
bin:
npkill: lib/index.js
checksum: 10/17a24fd5407adc1f4d43d34b525eae44657064f89f89283059a60cf9e528bcbf2f76fbd302bb4a6583abbda4f370a4e8cfe4cf2a4ca140fbf377332b01651fee
languageName: node
linkType: hard
"npm-run-path@npm:^4.0.1":
version: 4.0.1
resolution: "npm-run-path@npm:4.0.1"
@@ -42073,6 +42115,13 @@ __metadata:
languageName: node
linkType: hard
"open-file-explorer@npm:^1.0.2":
version: 1.0.2
resolution: "open-file-explorer@npm:1.0.2"
checksum: 10/a6e4e5944f12e3d5c6e883e3a9731a00687f9ca98821234a46f5f3e980f4f74748eedf4dcdaacfd02823f39ea4ab94fd9dddda1691f6e25c7c2098c687d3cd70
languageName: node
linkType: hard
"open@npm:^10.1.0":
version: 10.1.0
resolution: "open@npm:10.1.0"
@@ -46438,9 +46487,9 @@ __metadata:
languageName: node
linkType: hard
"rehackt@npm:0.0.6":
version: 0.0.6
resolution: "rehackt@npm:0.0.6"
"rehackt@npm:^0.1.0":
version: 0.1.0
resolution: "rehackt@npm:0.1.0"
peerDependencies:
"@types/react": "*"
react: "*"
@@ -46449,7 +46498,7 @@ __metadata:
optional: true
react:
optional: true
checksum: 10/3897c93270836159406529e0fa983bf4a11c07d2efc5c8f6bdfd7f6821d3b84a30d911c3f3b9c689948739e6955c5835c8dd9d91579150bec5092f356c0d91df
checksum: 10/c81adead82c165dffc574cbf9e1de3605522782a56b48df48b68d53d45c4d8c9253df3790109335bf97072424e54ad2423bb9544ca3a985fa91995dda43452fc
languageName: node
linkType: hard
@@ -47349,6 +47398,7 @@ __metadata:
husky: "npm:^7.0.4"
lint-staged: "npm:^12.3.7"
lockfile: "npm:^1.0.4"
npkill: "npm:^0.12.2"
pino-pretty: "npm:^9.1.1"
prettier: "npm:^2.5.1"
ts-node: "npm:^10.9.1"
@@ -48157,6 +48207,15 @@ __metadata:
languageName: node
linkType: hard
"skin-tone@npm:^2.0.0":
version: 2.0.0
resolution: "skin-tone@npm:2.0.0"
dependencies:
unicode-emoji-modifier-base: "npm:^1.0.0"
checksum: 10/19de157586b8019cacc55eb25d9d640f00fc02415761f3e41a4527142970fd4e7f6af0333bc90e879858766c20a976107bb386ffd4c812289c01d51f2c8d182c
languageName: node
linkType: hard
"slash@npm:^2.0.0":
version: 2.0.0
resolution: "slash@npm:2.0.0"
@@ -50480,15 +50539,6 @@ __metadata:
languageName: node
linkType: hard
"ts-essentials@npm:^9.1.2":
version: 9.2.0
resolution: "ts-essentials@npm:9.2.0"
peerDependencies:
typescript: ">=4.1.0"
checksum: 10/d8a661841c4a04c4b180ee63734541e5051d61d905cea3246ea35505e88a7b220ad583bba1095e4845a2aaf5570bf1a10c5b4580185f00c169e2943a3bea5f54
languageName: node
linkType: hard
"ts-essentials@npm:^9.4.0":
version: 9.4.0
resolution: "ts-essentials@npm:9.4.0"
@@ -51214,6 +51264,13 @@ __metadata:
languageName: node
linkType: hard
"unicode-emoji-modifier-base@npm:^1.0.0":
version: 1.0.0
resolution: "unicode-emoji-modifier-base@npm:1.0.0"
checksum: 10/6e1521d35fa69493207eb8b41f8edb95985d8b3faf07c01d820a1830b5e8403e20002563e2f84683e8e962a49beccae789f0879356bf92a4ec7a4dd8e2d16fdb
languageName: node
linkType: hard
"unicode-match-property-ecmascript@npm:^2.0.0":
version: 2.0.0
resolution: "unicode-match-property-ecmascript@npm:2.0.0"
@@ -52354,7 +52411,7 @@ __metadata:
languageName: node
linkType: hard
"vee-validate@npm:^4.7.0":
"vee-validate@npm:4.7.0":
version: 4.7.0
resolution: "vee-validate@npm:4.7.0"
dependencies:
@@ -53166,22 +53223,6 @@ __metadata:
languageName: node
linkType: hard
"vue-demi@npm:^0.13.1":
version: 0.13.5
resolution: "vue-demi@npm:0.13.5"
peerDependencies:
"@vue/composition-api": ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
"@vue/composition-api":
optional: true
bin:
vue-demi-fix: bin/vue-demi-fix.js
vue-demi-switch: bin/vue-demi-switch.js
checksum: 10/539a85d5a5751002bc86f073eb95613c5bd3bee37675c6dbc120a90595e7cfed40570c13f369566d87bbe2ac50203533844d9d49d2735f0f8cb1eb43a17fb393
languageName: node
linkType: hard
"vue-demi@npm:^0.14.6":
version: 0.14.6
resolution: "vue-demi@npm:0.14.6"