Feat: mocked bindings and logging to seq (#39)

* mocked bindings and logging to seq

* test deploy

* test deploy

* test deploy

* connectorless state

* remove logs

* remove more logs

* add flags to globalThus

* log with /api/events/raw

* log error link on prod over local account

* handle test query to distinguish self hosters

* throw again

* log again...

* sa and ra

* error policy non none

* attach server url to logs

* Add host app version

* rename name to slug

* remove useless re throw

* fix confusion on versions
This commit is contained in:
Oğuzhan Koral
2025-07-23 15:51:09 +01:00
committed by GitHub
parent 4ebf702ab2
commit 3b4aa93858
27 changed files with 1078 additions and 70 deletions
+3
View File
@@ -15,6 +15,7 @@ import { useConfigStore } from '~/store/config'
import { useAccountStore } from '~/store/accounts'
import { useHostAppStore } from '~/store/hostApp'
import { storeToRefs } from 'pinia'
import { logToSeq } from '~/lib/logger/composables/useLogger'
const uiConfigStore = useConfigStore()
const { isDarkTheme } = storeToRefs(uiConfigStore)
@@ -57,5 +58,7 @@ onMounted(() => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { $intercom } = useNuxtApp() // needed her for initialisation
logToSeq('Information', 'DUI3 initialized')
})
</script>
+1 -1
View File
@@ -95,7 +95,7 @@ const showAccountsDialog = defineModel<boolean>('open', {
const isDesktopServiceAvailable = ref(false) // this should be false default because there is a delay if /ping is not successful.
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
showAccountsDialog.value = false
})
+1 -1
View File
@@ -97,7 +97,7 @@ const showFeedbackDialog = ref<boolean>(false)
const showSendDialog = ref<boolean>(false)
const showReceiveDialog = ref<boolean>(false)
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
showSendDialog.value = false
showReceiveDialog.value = false
})
+1 -1
View File
@@ -73,7 +73,7 @@ const hasSettings = computed(() => {
})
const app = useNuxtApp()
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
openModelCardActionsDialog.value = false
})
+1 -1
View File
@@ -117,7 +117,7 @@ const projectAccount = computed(() =>
accountStore.accountWithFallback(props.project.accountId, props.project.serverUrl)
)
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
openVersionsDialog.value = false
})
+1 -1
View File
@@ -130,7 +130,7 @@ const props = defineProps<{
const store = useHostAppStore()
const openFilterDialog = ref(false)
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
openFilterDialog.value = false
})
+15 -2
View File
@@ -8,7 +8,7 @@
v-if="hasNoModelCards"
class="px-3 text-body-3xs text-foreground-2 justify-center bg-red-200/1 py-2 flex items-center w-full space-x-2"
>
<span>Version {{ hostApp.connectorVersion }}</span>
<span>Version {{ hostApp.connectorVersion || 'dev' }}</span>
<FormButton
size="sm"
text
@@ -19,6 +19,17 @@
>
Toggle theme
</FormButton>
<FormButton
v-if="hostApp.hostAppName?.toLowerCase() === 'revit'"
size="sm"
text
color="subtle"
:icon-right="WrenchScrewdriverIcon"
hide-text
@click="app.$showDevTools()"
>
Open dev tools
</FormButton>
</div>
</div>
</template>
@@ -27,7 +38,9 @@
import { storeToRefs } from 'pinia'
import { useHostAppStore } from '~/store/hostApp'
import { useConfigStore } from '~/store/config'
import { MoonIcon, SunIcon } from '@heroicons/vue/24/outline'
import { MoonIcon, SunIcon, WrenchScrewdriverIcon } from '@heroicons/vue/24/outline'
const app = useNuxtApp()
const uiConfigStore = useConfigStore()
const { isDarkTheme } = storeToRefs(uiConfigStore)
@@ -31,3 +31,42 @@ export type Account = {
}
export interface IAccountBindingEvents extends IBindingSharedEvents {}
export class MockedAccountBinding implements IAccountBinding {
public async getAccounts() {
const config = useRuntimeConfig()
return (await [
{
id: 'whatever',
isDefault: true,
token: config.public.speckleToken,
serverInfo: {
name: 'test',
url: config.public.speckleUrl,
frontend2: true
},
userInfo: {
id: 'whatever',
avatar: 'whatever',
email: ''
}
}
]) as Account[]
}
public async removeAccount(accountId: string) {
return await console.log('no way dude', accountId)
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
@@ -57,3 +57,65 @@ export type ToastAction = {
url: string
name: string
}
export class MockedBaseBinding implements IBasicConnectorBinding {
public async getSourceApplicationName() {
return await 'headless'
}
public async getSourceApplicationVersion() {
return await 'dev'
}
public async getConnectorVersion() {
return await 'dev'
}
public async getDocumentInfo() {
return (await {
id: 'whatever',
name: 'test',
location: 'whocares'
}) as DocumentInfo
}
public async getDocumentState() {
return (await { models: [] }) as DocumentModelStore
}
public async addModel(_model: IModelCard) {
await console.log('no way dude')
}
public async removeModel(_model: IModelCard) {
await console.log('no way dude')
}
public async removeModels(_models: IModelCard[]) {
await console.log('no way dude')
}
public async updateModel(_model: IModelCard) {
await console.log('no way dude')
}
public async highlightModel(_modelCardId: string) {
await console.log('no way dude')
}
public async highlightObjects(_objectIds: string[]) {
await console.log('no way dude')
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
+45 -2
View File
@@ -1,4 +1,3 @@
import { BaseBridge } from '~/lib/bridge/base'
import type {
IBinding,
IBindingSharedEvents
@@ -38,4 +37,48 @@ export type WorkspacesConfig = {
}
// Useless, but will do for now :)
export class MockedConfigBinding extends BaseBridge {}
export class MockedConfigBinding implements IConfigBinding {
public async getIsDevMode() {
return await true
}
public async getConfig() {
return await { darkTheme: false }
}
public async updateConfig() {
return await console.log('')
}
public async setUserSelectedAccountId(accountId: string) {
return await console.log(accountId)
}
public async setUserSelectedWorkspaceId(workspaceId: string) {
return await console.log(workspaceId)
}
public async getAccountsConfig() {
return (await { userSelectedAccountId: 'whatever' }) as AccountsConfig
}
public async getWorkspacesConfig() {
return (await { userSelectedWorkspaceId: 'whatever' }) as WorkspacesConfig
}
public async getUserSelectedAccountId() {
return (await { userSelectedAccountId: 'whatever' }) as AccountsConfig
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
@@ -24,3 +24,29 @@ export interface IReceiveBindingEvents
conversionResults: ConversionResult[]
}) => void
}
export class MockedReceiveBinding implements IReceiveBinding {
public async getReceiveSettings() {
return await []
}
public async receive(_modelCardId: string) {
return await console.log('no way dude')
}
public async cancelReceive(_modelCardId: string) {
return await console.log('no way dude')
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
@@ -17,3 +17,24 @@ export type SelectionInfo = {
summary?: string
selectedObjectIds: string[]
}
export class MockedSelectionBinding implements ISelectionBinding {
public async getSelection() {
return (await {
summary: '2 objects selected over mock binding',
selectedObjectIds: ['1', '2', '3']
}) as SelectionInfo
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
+30
View File
@@ -38,3 +38,33 @@ export interface ISendBindingEvents
triggerCancel: (modelCardId: string) => void
triggerCreateVersion: (args: CreateVersionArgs) => void
}
export class MockedSendBinding implements ISendBinding {
public async getSendFilters() {
return await []
}
public async getSendSettings() {
return await []
}
public async send(_modelCardId: string) {
return await console.log('no way dude')
}
public async cancelSend(_modelCardId: string) {
return await console.log('no way dude')
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
+17 -5
View File
@@ -1,6 +1,4 @@
/* eslint-disable @typescript-eslint/require-await */
import { BaseBridge } from '~~/lib/bridge/base'
import type {
IBinding,
IBindingSharedEvents
@@ -38,9 +36,11 @@ export type ComplexType = {
count: number
}
export class MockedTestBinding extends BaseBridge {
export class MockedTestBinding implements ITestBinding {
public async sayHi(name: string, count: number, sayHelloNotHi: boolean) {
return `Hello from mocked bindings. Args: name = ${name}, count = ${count}, sayHelloNotHi = ${sayHelloNotHi.toString()}.`
return [
`Hello from mocked bindings. Args: name = ${name}, count = ${count}, sayHelloNotHi = ${sayHelloNotHi.toString()}.`
]
}
public async goAway() {
@@ -56,6 +56,18 @@ export class MockedTestBinding extends BaseBridge {
}
public async triggerEvent(eventName: string) {
return eventName
return console.log(eventName)
}
public async showDevTools() {
await console.log('No way dude')
}
public async openUrl(url: string) {
await window.open(url)
}
public on() {
return
}
}
+78 -4
View File
@@ -270,12 +270,13 @@ export type AutomateFunction = {
isFeatured: Scalars['Boolean']['output'];
logo?: Maybe<Scalars['String']['output']>;
name: Scalars['String']['output'];
permissions: AutomateFunctionPermissionChecks;
releases: AutomateFunctionReleaseCollection;
repo: BasicGitRepositoryMetadata;
/** SourceAppNames values from @speckle/shared. Empty array means - all of them */
supportedSourceApps: Array<Scalars['String']['output']>;
tags: Array<Scalars['String']['output']>;
workspaceIds?: Maybe<Array<Scalars['String']['output']>>;
workspaceIds: Array<Scalars['String']['output']>;
};
@@ -292,6 +293,11 @@ export type AutomateFunctionCollection = {
totalCount: Scalars['Int']['output'];
};
export type AutomateFunctionPermissionChecks = {
__typename?: 'AutomateFunctionPermissionChecks';
canRegenerateToken: PermissionCheckResult;
};
export type AutomateFunctionRelease = {
__typename?: 'AutomateFunctionRelease';
commitId: Scalars['String']['output'];
@@ -373,6 +379,7 @@ export type AutomateMutations = {
__typename?: 'AutomateMutations';
createFunction: AutomateFunction;
createFunctionWithoutVersion: AutomateFunctionToken;
regenerateFunctionToken: Scalars['String']['output'];
updateFunction: AutomateFunction;
};
@@ -387,6 +394,11 @@ export type AutomateMutationsCreateFunctionWithoutVersionArgs = {
};
export type AutomateMutationsRegenerateFunctionTokenArgs = {
functionId: Scalars['String']['input'];
};
export type AutomateMutationsUpdateFunctionArgs = {
input: UpdateAutomateFunctionInput;
};
@@ -918,6 +930,12 @@ export type CreateCommentReplyInput = {
threadId: Scalars['String']['input'];
};
export type CreateEmbedTokenReturn = {
__typename?: 'CreateEmbedTokenReturn';
token: Scalars['String']['output'];
tokenMetadata: EmbedToken;
};
export type CreateModelInput = {
description?: InputMaybe<Scalars['String']['input']>;
name: Scalars['String']['input'];
@@ -994,6 +1012,32 @@ export type EmailVerificationRequestInput = {
id: Scalars['ID']['input'];
};
/** A token used to enable an embedded viewer for a private project */
export type EmbedToken = {
__typename?: 'EmbedToken';
createdAt: Scalars['DateTime']['output'];
lastUsed: Scalars['DateTime']['output'];
lifespan: Scalars['BigInt']['output'];
projectId: Scalars['String']['output'];
resourceIdString: Scalars['String']['output'];
tokenId: Scalars['String']['output'];
user?: Maybe<LimitedUser>;
};
export type EmbedTokenCollection = {
__typename?: 'EmbedTokenCollection';
cursor?: Maybe<Scalars['String']['output']>;
items: Array<EmbedToken>;
totalCount: Scalars['Int']['output'];
};
export type EmbedTokenCreateInput = {
lifespan?: InputMaybe<Scalars['BigInt']['input']>;
projectId: Scalars['String']['input'];
/** The model(s) and version(s) string used in the embed url */
resourceIdString: Scalars['String']['input'];
};
export type FileUpload = {
__typename?: 'FileUpload';
branchName: Scalars['String']['output'];
@@ -1012,11 +1056,14 @@ export type FileUpload = {
id: Scalars['String']['output'];
/** Model associated with the file upload, if it exists already */
model?: Maybe<Model>;
modelId?: Maybe<Scalars['String']['output']>;
/** Alias for branchName */
modelName: Scalars['String']['output'];
/** Alias for streamId */
projectId: Scalars['String']['output'];
streamId: Scalars['String']['output'];
/** Date when upload was last updated */
updatedAt: Scalars['DateTime']['output'];
uploadComplete: Scalars['Boolean']['output'];
uploadDate: Scalars['DateTime']['output'];
/** The user's id that uploaded this file. */
@@ -2046,9 +2093,7 @@ export type PendingWorkspaceCollaborator = {
updatedAt: Scalars['DateTime']['output'];
/** Set only if user is registered */
user?: Maybe<LimitedUser>;
workspaceId: Scalars['String']['output'];
workspaceName: Scalars['String']['output'];
workspaceSlug: Scalars['String']['output'];
workspace: LimitedWorkspace;
};
export type PendingWorkspaceCollaboratorsFilter = {
@@ -2087,6 +2132,7 @@ export type Project = {
description?: Maybe<Scalars['String']['output']>;
/** Public project-level configuration for embedded viewer */
embedOptions: ProjectEmbedOptions;
embedTokens: EmbedTokenCollection;
hasAccessToFeature: Scalars['Boolean']['output'];
id: Scalars['ID']['output'];
invitableCollaborators: WorkspaceCollaboratorCollection;
@@ -2169,6 +2215,12 @@ export type ProjectCommentThreadsArgs = {
};
export type ProjectEmbedTokensArgs = {
cursor?: InputMaybe<Scalars['String']['input']>;
limit?: InputMaybe<Scalars['Int']['input']>;
};
export type ProjectHasAccessToFeatureArgs = {
featureName: WorkspaceFeatureName;
};
@@ -2564,6 +2616,7 @@ export type ProjectMutations = {
batchDelete: Scalars['Boolean']['output'];
/** Create new project */
create: Project;
createEmbedToken: CreateEmbedTokenReturn;
/**
* Create onboarding/tutorial project. If one is already created for the active user, that
* one will be returned instead.
@@ -2575,6 +2628,8 @@ export type ProjectMutations = {
invites: ProjectInviteMutations;
/** Leave a project. Only possible if you're not the last remaining owner. */
leave: Scalars['Boolean']['output'];
revokeEmbedToken: Scalars['Boolean']['output'];
revokeEmbedTokens: Scalars['Boolean']['output'];
/** Updates an existing project */
update: Project;
/** Update role for a collaborator */
@@ -2597,6 +2652,11 @@ export type ProjectMutationsCreateArgs = {
};
export type ProjectMutationsCreateEmbedTokenArgs = {
token: EmbedTokenCreateInput;
};
export type ProjectMutationsDeleteArgs = {
id: Scalars['String']['input'];
};
@@ -2607,6 +2667,17 @@ export type ProjectMutationsLeaveArgs = {
};
export type ProjectMutationsRevokeEmbedTokenArgs = {
projectId: Scalars['String']['input'];
token: Scalars['String']['input'];
};
export type ProjectMutationsRevokeEmbedTokensArgs = {
projectId: Scalars['String']['input'];
};
export type ProjectMutationsUpdateArgs = {
update: ProjectUpdateInput;
};
@@ -2647,6 +2718,7 @@ export type ProjectPermissionChecks = {
canBroadcastActivity: PermissionCheckResult;
canCreateAutomation: PermissionCheckResult;
canCreateComment: PermissionCheckResult;
canCreateEmbedTokens: PermissionCheckResult;
canCreateModel: PermissionCheckResult;
canDelete: PermissionCheckResult;
canInvite: PermissionCheckResult;
@@ -2655,9 +2727,11 @@ export type ProjectPermissionChecks = {
canMoveToWorkspace: PermissionCheckResult;
canPublish: PermissionCheckResult;
canRead: PermissionCheckResult;
canReadEmbedTokens: PermissionCheckResult;
canReadSettings: PermissionCheckResult;
canReadWebhooks: PermissionCheckResult;
canRequestRender: PermissionCheckResult;
canRevokeEmbedTokens: PermissionCheckResult;
canUpdate: PermissionCheckResult;
canUpdateAllowPublicComments: PermissionCheckResult;
};
+85
View File
@@ -0,0 +1,85 @@
import md5 from '~/lib/common/helpers/md5'
import { useAccountStore } from '~/store/accounts'
import { useHostAppStore } from '~/store/hostApp'
const SEQ_URL = 'https://seq-dev.speckle.systems/api/events/raw'
type LogLevel = 'Verbose' | 'Debug' | 'Information' | 'Warning' | 'Error' | 'Fatal'
const collectCommonProperties = () => {
const { accounts, activeAccount } = useAccountStore()
const hashedEmail =
'@' +
md5(activeAccount.accountInfo.userInfo.email.toLowerCase() as string).toUpperCase()
return {
user: {
id: activeAccount.accountInfo.userInfo.id,
distinctId: hashedEmail
},
dui3: true,
accountCount: accounts.length
}
}
const collectResources = () => {
const hostAppStore = useHostAppStore()
return {
'@ra': {
connector: {
slug: hostAppStore.hostAppName,
hostAppVersion: hostAppStore.hostAppVersion,
version: hostAppStore.connectorVersion
},
service: {
version: hostAppStore.connectorVersion // this needs alignment with .NET SDK, actually this should be connector.version instead service.version
}
}
}
}
// const collectServices = () => {
// const hostAppStore = useHostAppStore()
// return {
// '@sa': {
// service: {
// version: hostAppStore.connectorVersion
// }
// }
// }
// }
export const logToSeq = async (
level: LogLevel,
message: string,
properties: Record<string, unknown> = {}
) => {
try {
const logEvent = {
'@t': new Date().toISOString(),
'@l': level,
'@m': message,
...collectResources(),
// ...collectServices(),
...collectCommonProperties(),
...properties
}
const response = await fetch(SEQ_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/vnd.serilog.clef',
'X-Seq-ApiKey': 'y5YnBp12ZE1Czh4tzZWn'
},
body: JSON.stringify(logEvent) + '\n'
})
if (!response.ok) {
const errorText = await response.text()
console.error(
`[Seq Logger] Failed to log: ${response.status} ${response.statusText} - ${errorText}`
)
}
} catch (err) {
console.error('[Seq Logger] Failed to log', err)
}
}
+2 -1
View File
@@ -10,7 +10,8 @@ export default defineNuxtConfig({
'@nuxt/eslint',
'@nuxtjs/tailwindcss',
'@speckle/ui-components-nuxt',
'@pinia/nuxt'
'@pinia/nuxt',
'@nuxt/image'
],
alias: {
// Rewriting all lodash calls to lodash-es for proper tree-shaking & chunk splitting
+1
View File
@@ -30,6 +30,7 @@
"@jsonforms/core": "3.1.0",
"@jsonforms/vue": "3.1.0",
"@jsonforms/vue-vanilla": "3.1.0",
"@nuxt/image": "^1.10.0",
"@pinia/nuxt": "^0.4.11",
"@speckle/objectloader": "^2.25.0",
"@speckle/objectsender": "^2.25.0",
+27 -2
View File
@@ -1,6 +1,6 @@
<template>
<div>
<div v-if="store.hostAppName">
<div v-if="(store.hostAppName && app.$isRunningOnConnector) || app.$isDev">
<div v-if="!config.isDevMode" class="px-1">
<CommonUpdateAlert />
</div>
@@ -138,6 +138,27 @@
</div>
</div>
</div>
<div
v-else-if="!app.$isRunningOnConnector"
class="flex-1 flex flex-col items-center justify-center py-12 gap-y-6"
>
<section
class="w-full max-w-md flex flex-col gap-y-8 items-center mx-auto py-12 px-6 border rounded-2xl border-outline-2"
>
<NuxtImg
:src="`/assets/images/pleading_spockle.svg`"
alt=""
class="w-20"
width="120"
/>
<h1 class="text-2xl md:text-3xl font-semibold text-foreground text-center">
Connector is not detected.
</h1>
<FormButton color="outline" @click="openSpeckleConnectors">
Get them here
</FormButton>
</section>
</div>
<div v-else>
<div class="fixed h-screen w-screen flex items-center pointer-events-none">
<LayoutPanel fancy-glow class="transition pointer-events-auto w-full">
@@ -191,7 +212,7 @@ const { trackEvent } = useMixpanel()
const showSendDialog = ref(false)
const showReceiveDialog = ref(false)
app.$baseBinding.on('documentChanged', () => {
app.$baseBinding?.on('documentChanged', () => {
showSendDialog.value = false
showReceiveDialog.value = false
})
@@ -223,4 +244,8 @@ const hasNoValidProjects = computed(() => {
const reload = () => {
window.location.reload()
}
const openSpeckleConnectors = () => {
window.open('https://app.speckle.systems/connectors', '_blank')
}
</script>
+2 -2
View File
@@ -238,7 +238,7 @@ const runTests = async () => {
}
}
$testBindings.on('emptyTestEvent', () => {
$testBindings?.on('emptyTestEvent', () => {
setTimeout(() => {
const myTest = tests.value.find((t) => t.name === 'Simple event capture')
@@ -248,7 +248,7 @@ $testBindings.on('emptyTestEvent', () => {
}, 1000)
})
$testBindings.on('testEvent', (args: TestEventArgs) => {
$testBindings?.on('testEvent', (args: TestEventArgs) => {
setTimeout(() => {
const myTest = tests.value.find((t) => t.name === 'Event capture with args')
+83 -26
View File
@@ -4,23 +4,44 @@ import { SketchupBridge } from '~/lib/bridge/sketchup'
import type { IBasicConnectorBinding } from '~/lib/bindings/definitions/IBasicConnectorBinding'
import type { IAccountBinding } from '~/lib/bindings/definitions/IAccountBinding'
import { IAccountBindingKey } from '~/lib/bindings/definitions/IAccountBinding'
import {
IAccountBindingKey,
MockedAccountBinding
} from '~/lib/bindings/definitions/IAccountBinding'
import type { ITestBinding } from '~/lib/bindings/definitions/ITestBinding'
import { ITestBindingKey } from '~/lib/bindings/definitions/ITestBinding'
import {
ITestBindingKey,
MockedTestBinding
} from '~/lib/bindings/definitions/ITestBinding'
import type { IConfigBinding } from '~/lib/bindings/definitions/IConfigBinding'
import { IConfigBindingKey } from '~/lib/bindings/definitions/IConfigBinding'
import {
IConfigBindingKey,
MockedConfigBinding
} from '~/lib/bindings/definitions/IConfigBinding'
import { IBasicConnectorBindingKey } from '~/lib/bindings/definitions/IBasicConnectorBinding'
import {
IBasicConnectorBindingKey,
MockedBaseBinding
} from '~/lib/bindings/definitions/IBasicConnectorBinding'
import type { ISendBinding } from '~/lib/bindings/definitions/ISendBinding'
import { ISendBindingKey } from '~/lib/bindings/definitions/ISendBinding'
import {
ISendBindingKey,
MockedSendBinding
} from '~/lib/bindings/definitions/ISendBinding'
import type { IReceiveBinding } from '~/lib/bindings/definitions/IReceiveBinding'
import { IReceiveBindingKey } from '~/lib/bindings/definitions/IReceiveBinding'
import {
IReceiveBindingKey,
MockedReceiveBinding
} from '~/lib/bindings/definitions/IReceiveBinding'
import type { ISelectionBinding } from '~/lib/bindings/definitions/ISelectionBinding'
import { ISelectionBindingKey } from '~/lib/bindings/definitions/ISelectionBinding'
import {
ISelectionBindingKey,
MockedSelectionBinding
} from '~/lib/bindings/definitions/ISelectionBinding'
import type { ITopLevelExpectionHandlerBinding } from '~/lib/bindings/definitions/ITopLevelExceptionHandlerBinding'
import { ITopLevelExpectionHandlerBindingKey } from '~/lib/bindings/definitions/ITopLevelExceptionHandlerBinding'
@@ -32,34 +53,68 @@ declare let globalThis: Record<string, unknown> & {
DG?: { LoadObject: (name: string) => Promise<void> }
}
const isWebview = () => !!(globalThis.chrome && globalThis.chrome.webview)
const isSketchup = () => !!globalThis.sketchup
const isCefSharp = () => !!globalThis.CefSharp
const isArchicad = () => isCefSharp() && !!globalThis.DG
const isConnector = () => isWebview() || isSketchup() || isCefSharp() || isArchicad()
/**
* Here we are loading any bindings that we expect to have from all
* connectors. If some are not present, that's okay - we're going to
* strip or customize functionality from the ui itself.
*/
export default defineNuxtPlugin(async () => {
const isRunningOnConnector = isConnector()
globalThis['isRunningOnConnector'] = isRunningOnConnector
const isDev = import.meta.dev
globalThis['isDev'] = isDev
if (!isRunningOnConnector) {
// The state that we wouldn't wanna show any connector related visuals on production like in dui.speckle.systems
console.warn(
'⚠️ You are a bad boy because you are not running DUI in a connector! ⚠️'
)
}
// Registers a set of non existent bindings as a test.
const nonExistantBindings = await tryHoistBinding('nonExistantBindings')
// Registers some default test bindings.
const testBindings = await tryHoistBinding<ITestBinding>(ITestBindingKey)
const testBindings =
isRunningOnConnector || !isDev
? await tryHoistBinding<ITestBinding>(ITestBindingKey)
: hoistMockBinding(new MockedTestBinding(), ITestBindingKey)
// Actual bindings follow below.
const configBinding = await tryHoistBinding<IConfigBinding>(IConfigBindingKey)
const configBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<IConfigBinding>(IConfigBindingKey)
: hoistMockBinding(new MockedConfigBinding(), IConfigBindingKey)
const accountBinding = await tryHoistBinding<IAccountBinding>(IAccountBindingKey)
const accountBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<IAccountBinding>(IAccountBindingKey)
: hoistMockBinding(new MockedAccountBinding(), IAccountBindingKey)
const baseBinding = await tryHoistBinding<IBasicConnectorBinding>(
IBasicConnectorBindingKey
)
const baseBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<IBasicConnectorBinding>(IBasicConnectorBindingKey)
: hoistMockBinding(new MockedBaseBinding(), IBasicConnectorBindingKey)
const sendBinding = await tryHoistBinding<ISendBinding>(ISendBindingKey)
const sendBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<ISendBinding>(ISendBindingKey)
: hoistMockBinding(new MockedSendBinding(), ISendBindingKey)
const receiveBinding = await tryHoistBinding<IReceiveBinding>(IReceiveBindingKey)
const receiveBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<IReceiveBinding>(IReceiveBindingKey)
: hoistMockBinding(new MockedReceiveBinding(), IReceiveBindingKey)
const selectionBinding = await tryHoistBinding<ISelectionBinding>(
ISelectionBindingKey
)
const selectionBinding =
isRunningOnConnector || !isDev
? await tryHoistBinding<ISelectionBinding>(ISelectionBindingKey)
: hoistMockBinding(new MockedSelectionBinding(), ISendBindingKey)
const topLevelExceptionHandlerBinding =
await tryHoistBinding<ITopLevelExpectionHandlerBinding>(
@@ -78,6 +133,8 @@ export default defineNuxtPlugin(async () => {
return {
provide: {
isRunningOnConnector,
isDev,
nonExistantBindings,
testBindings,
configBinding,
@@ -137,11 +194,11 @@ const tryHoistBinding = async <T>(name: string) => {
return bridge as unknown as T
}
// const hoistMockBinding = (mockBinding: BaseBridge, name: string) => {
// globalThis[name] = mockBinding
// console.log(
// `%c✔ Mocked ${name} binding added succesfully.`,
// 'color: green; font-weight: bold; font-size: small'
// )
// return mockBinding
// }
const hoistMockBinding = <T>(mockBinding: T, name: string) => {
globalThis[name] = mockBinding
console.log(
`%c✔ Mocked ${name} binding added succesfully.`,
'color: green; font-weight: bold; font-size: small'
)
return mockBinding
}
+48
View File
@@ -0,0 +1,48 @@
<svg width="94" height="97" viewBox="0 0 94 97" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M93.9875 11.8396L13.3384 16.262V96.33L93.9875 91.9076V11.8396Z" fill="#047EFB"/>
<path d="M80.6801 -9.55722e-05L0.0146484 4.41339L13.3205 16.249L93.986 11.8356L80.6801 -9.55722e-05Z" fill="#7BBCFF"/>
<path d="M13.3328 16.2685L0.0107422 4.40778V84.4705L13.3328 96.3312V16.2685Z" fill="#313BCF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.4877 66.6814C35.7855 65.708 37.6268 65.9711 38.6002 67.2689C39.6031 68.6061 44.6573 73.4377 53.8752 73.4377C63.093 73.4377 68.1473 68.6061 69.1502 67.2689C70.1236 65.9711 71.9648 65.708 73.2627 66.6814C74.5605 67.6548 74.8236 69.4961 73.8502 70.7939C71.9156 73.3734 65.2198 79.3127 53.8752 79.3127C42.5305 79.3127 35.8348 73.3734 33.9002 70.7939C32.9268 69.4961 33.1898 67.6548 34.4877 66.6814Z" fill="url(#paint0_radial_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.4877 66.6814C35.7855 65.708 37.6268 65.9711 38.6002 67.2689C39.6031 68.6061 44.6573 73.4377 53.8752 73.4377C63.093 73.4377 68.1473 68.6061 69.1502 67.2689C70.1236 65.9711 71.9648 65.708 73.2627 66.6814C74.5605 67.6548 74.8236 69.4961 73.8502 70.7939C71.9156 73.3734 65.2198 79.3127 53.8752 79.3127C42.5305 79.3127 35.8348 73.3734 33.9002 70.7939C32.9268 69.4961 33.1898 67.6548 34.4877 66.6814Z" fill="url(#paint1_radial_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.4877 66.6814C35.7855 65.708 37.6268 65.9711 38.6002 67.2689C39.6031 68.6061 44.6573 73.4377 53.8752 73.4377C63.093 73.4377 68.1473 68.6061 69.1502 67.2689C70.1236 65.9711 71.9648 65.708 73.2627 66.6814C74.5605 67.6548 74.8236 69.4961 73.8502 70.7939C71.9156 73.3734 65.2198 79.3127 53.8752 79.3127C42.5305 79.3127 35.8348 73.3734 33.9002 70.7939C32.9268 69.4961 33.1898 67.6548 34.4877 66.6814Z" fill="url(#paint2_radial_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.6562 29.375C39.6562 28.5638 38.9987 27.9062 38.1875 27.9062C35.9131 27.9062 33.0689 28.7414 30.5953 30.3459C28.1034 31.9623 25.8589 34.4462 25.0126 37.8313C24.8159 38.6182 25.2943 39.4157 26.0813 39.6124C26.8682 39.8091 27.6657 39.3307 27.8624 38.5437C28.4849 36.0538 30.157 34.1315 32.1938 32.8103C34.2488 31.4774 36.5452 30.8438 38.1875 30.8438C38.9987 30.8438 39.6562 30.1862 39.6562 29.375Z" fill="url(#paint3_linear_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M77.6399 32.8386C79.3816 34.4921 80.4348 36.4815 80.8562 37.7457C81.1127 38.5153 81.9445 38.9311 82.7141 38.6746C83.4836 38.4181 83.8995 37.5863 83.643 36.8168C83.0852 35.1435 81.7885 32.7267 79.6624 30.7083C77.5114 28.6661 74.4714 27 70.4996 27C69.6884 27 69.0309 27.6576 69.0309 28.4688C69.0309 29.2799 69.6884 29.9375 70.4996 29.9375C73.5778 29.9375 75.9232 31.2089 77.6399 32.8386Z" fill="url(#paint4_linear_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.9309 45.9902C43.1513 45.9902 44.186 48.0385 44.3321 48.6262C44.7232 50.2007 46.3167 51.16 47.8911 50.7688C49.4656 50.3777 50.4249 48.7842 50.0337 47.2097C49.374 44.554 46.3799 40.1152 39.9309 40.1152C33.482 40.1152 30.4879 44.554 29.8281 47.2097C29.437 48.7842 30.3963 50.3777 31.9708 50.7688C33.5452 51.16 35.1387 50.2007 35.5298 48.6262C35.6758 48.0385 36.7106 45.9902 39.9309 45.9902Z" fill="url(#paint5_radial_5165_11144)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M68.1902 45.9902C71.4106 45.9902 72.4453 48.0385 72.5913 48.6262C72.9825 50.2007 74.5759 51.16 76.1504 50.7688C77.7249 50.3777 78.6842 48.7842 78.293 47.2097C77.6333 44.554 74.6391 40.1152 68.1902 40.1152C61.7413 40.1152 58.7472 44.554 58.0874 47.2097C57.6963 48.7842 58.6556 50.3777 60.23 50.7688C61.8045 51.16 63.398 50.2007 63.7891 48.6262C63.9351 48.0385 64.9699 45.9902 68.1902 45.9902Z" fill="url(#paint6_radial_5165_11144)"/>
<defs>
<radialGradient id="paint0_radial_5165_11144" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(53.8752 62.7893) rotate(90) scale(18.1758 28.851)">
<stop offset="0.464452" stop-color="#241A1A"/>
<stop offset="0.663489" stop-color="#554248"/>
<stop offset="1" stop-color="#4E2553"/>
<stop offset="1" stop-color="#4A274E"/>
</radialGradient>
<radialGradient id="paint1_radial_5165_11144" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(53.8752 70.4119) rotate(90) scale(26.0743 25.7783)">
<stop offset="0.483976" stop-color="#4F302E" stop-opacity="0"/>
<stop offset="1" stop-color="#4F302E"/>
</radialGradient>
<radialGradient id="paint2_radial_5165_11144" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(72.5442 67.9849) rotate(39.3327) scale(2.9658 2.13554)">
<stop stop-color="#5B4A50"/>
<stop offset="1" stop-color="#5B4A50" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint3_linear_5165_11144" x1="37.2083" y1="40.8312" x2="37.2083" y2="35.5437" gradientUnits="userSpaceOnUse">
<stop offset="0.0299084" stop-color="#524049"/>
<stop offset="1" stop-color="#4A2C42"/>
</linearGradient>
<linearGradient id="paint4_linear_5165_11144" x1="81.2704" y1="39.925" x2="81.2704" y2="34.6375" gradientUnits="userSpaceOnUse">
<stop offset="0.0299084" stop-color="#524049"/>
<stop offset="1" stop-color="#4A2C42"/>
</linearGradient>
<radialGradient id="paint5_radial_5165_11144" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(39.931 47.918) rotate(90) scale(9.73047 14.1637)">
<stop offset="0.337213" stop-color="#4D274B"/>
<stop offset="0.628228" stop-color="#514047"/>
<stop offset="1" stop-color="#4E2553"/>
<stop offset="1" stop-color="#4A342F"/>
</radialGradient>
<radialGradient id="paint6_radial_5165_11144" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(68.1902 47.918) rotate(90) scale(9.73047 14.1637)">
<stop offset="0.337213" stop-color="#4D274B"/>
<stop offset="0.628228" stop-color="#514047"/>
<stop offset="1" stop-color="#4E2553"/>
<stop offset="1" stop-color="#4A342F"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

+21
View File
@@ -0,0 +1,21 @@
<svg width="117" height="121" viewBox="0 0 117 121" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1246_23056)">
<path d="M115.033 15.0278L16.3086 20.4414V118.454L115.033 113.04V15.0278Z" fill="#136CFF"/>
<path d="M73.4005 93.725C73.1345 93.7395 72.8685 93.7124 72.6025 93.6412C68.0572 92.4058 63.2665 92.6668 58.7212 94.3975C57.368 94.9102 55.9088 94.2468 55.4672 92.9073C55.0256 91.5678 55.7694 90.0624 57.1278 89.5442C62.7113 87.4167 68.6124 87.0952 74.1959 88.6143C75.5518 88.9846 76.2956 90.4089 75.8565 91.7964C75.5027 92.9092 74.4903 93.6656 73.4005 93.725Z" fill="#0A2948"/>
<path d="M97.5176 53.6163C95.1855 60.8748 88.5173 66.3561 80.7464 66.7796C80.3745 66.7999 80 66.8073 79.623 66.8045C75.8086 66.7707 72.2834 65.5028 69.4219 63.2453C69.5148 64.5262 69.6181 65.8247 69.7731 67.227C70.1657 70.8115 72.0561 73.5506 75.2378 75.1464C77.3555 76.2105 79.8864 76.6805 82.5025 76.7042C86.9807 76.7433 91.7223 75.4743 95.0874 73.6568C98.6436 71.7354 100.955 68.4997 101.43 64.7769C101.903 61.075 100.516 57.2303 97.5176 53.6163Z" fill="white"/>
<path d="M74.3206 43.2249C70.971 44.8364 69.2923 49.477 69.2148 57.2442L69.3156 57.4153C71.6321 60.7159 75.444 62.8594 79.8731 62.8986C80.1675 62.9007 80.4619 62.8951 80.7537 62.8791C87.5562 62.5084 93.2766 57.1643 94.3199 50.3863C94.0229 50.1297 93.7492 49.8666 93.4341 49.6136C83.8399 41.9007 76.7327 42.0621 74.3206 43.2249Z" fill="#071F36"/>
<path d="M80.7486 66.7772C88.5196 66.3537 95.1877 60.8726 97.5198 53.6146C96.6056 52.5136 95.5286 51.437 94.3148 50.3887C93.2715 57.1661 87.5511 62.5098 80.7486 62.8805C80.4568 62.8964 80.1624 62.902 79.868 62.8999C75.4389 62.8607 71.627 60.7174 69.3105 57.4171L69.2097 57.246C69.1917 59.068 69.264 61.0696 69.4241 63.243C72.2856 65.5004 75.8108 66.7683 79.6252 66.802C80.0023 66.8074 80.3767 66.7974 80.7486 66.7772Z" fill="#01D1FD"/>
<path d="M74.48 54.2018C76.0589 54.1157 77.3389 52.7583 77.3389 51.1698C77.3389 49.5814 76.0589 48.3635 74.48 48.4495C72.9011 48.5356 71.6211 49.893 71.6211 51.4815C71.6211 53.0699 72.9011 54.2878 74.48 54.2018Z" fill="white"/>
<path d="M50.5822 68.4173C42.8113 68.8408 36.1431 64.0862 33.811 57.0819C30.8127 61.0227 29.4284 65.0185 29.8984 68.6664C30.3762 72.3372 32.685 75.3237 36.2412 76.8549C39.6063 78.3057 44.3453 79.058 48.826 78.5306C51.4422 78.2218 53.9731 77.4785 56.0908 76.1811C59.2699 74.2386 61.1604 71.2934 61.5555 67.666C61.7104 66.2494 61.8137 64.9448 61.9067 63.6564C59.0582 66.2095 55.5278 67.8672 51.7056 68.3171C51.3285 68.3662 50.9541 68.397 50.5822 68.4173Z" fill="white"/>
<path d="M50.5779 64.5182C50.8697 64.5023 51.1642 64.4759 51.4586 64.4416C55.8877 63.9197 59.6995 61.3607 62.0161 57.8077L62.1168 57.6255C62.0367 49.867 60.3607 45.4092 57.0111 44.1628C54.599 43.2628 47.4892 43.8763 37.8975 52.6322C37.5825 52.9196 37.3113 53.2124 37.0117 53.5015C38.0551 60.1683 43.7754 64.8889 50.5779 64.5182Z" fill="#071F36"/>
<path d="M62.1186 57.627L62.0179 57.8091C59.7014 61.3618 55.8895 63.9206 51.4604 64.4425C51.166 64.4767 50.8716 64.5032 50.5797 64.5191C43.7773 64.8898 38.0569 60.1695 37.0136 53.5059C35.7997 54.6865 34.7228 55.8804 33.8086 57.0811C36.1406 64.0849 42.8088 68.8392 50.5797 68.4158C50.9516 68.3955 51.3261 68.3621 51.7032 68.3182C55.5254 67.8683 59.0557 66.2108 61.9043 63.6577C62.0644 61.4643 62.1393 59.4521 62.1186 57.627Z" fill="#01D1FD"/>
<path d="M44.4386 55.8289C46.0139 55.6443 47.2122 54.2124 47.1115 52.633C47.0134 51.0535 45.655 49.922 44.0796 50.1066C42.5042 50.2912 41.3059 51.7231 41.4041 53.3026C41.5048 54.882 42.8632 56.0135 44.4386 55.8289Z" fill="white"/>
<path d="M98.7479 0.534875L0.00390625 5.9375L16.2919 20.4257L115.036 15.0231L98.7479 0.534875Z" fill="#6FA3FF"/>
<path d="M16.3038 20.4495L-0.00390625 5.93054V103.937L16.3038 118.456V20.4495Z" fill="#0357E1"/>
</g>
<defs>
<clipPath id="clip0_1246_23056">
<rect width="116.289" height="120" fill="white" transform="translate(0 0.536133)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 15 KiB

+28 -2
View File
@@ -16,6 +16,7 @@ import { getMainDefinition } from '@apollo/client/utilities'
import { setContext } from '@apollo/client/link/context'
import { useHostAppStore } from '~/store/hostApp'
import { ToastNotificationType } from '@speckle/ui-components'
import { logToSeq } from '~/lib/logger/composables/useLogger'
export type DUIAccount = {
/** account info coming from the host app */
@@ -83,7 +84,13 @@ export const useAccountStore = defineStore('accountStore', () => {
if (!acc.client) continue
if (!acc.accountInfo.serverInfo.frontend2) continue
try {
await acc.client.query({ query: accountTestQuery })
await acc.client.query({
query: accountTestQuery,
context: {
url: acc.accountInfo.serverInfo.url
}
})
acc.isValid = true
} catch {
// TODO: properly dispose and kill this client. It's unclear how to do it.
@@ -100,7 +107,8 @@ export const useAccountStore = defineStore('accountStore', () => {
const refreshAccounts = async () => {
isLoading.value = true
const accs = await $accountBinding.getAccounts()
const accs = (await $accountBinding?.getAccounts()) || []
const newAccs: DUIAccount[] = []
for (const acc of accs) {
@@ -112,6 +120,24 @@ export const useAccountStore = defineStore('accountStore', () => {
// Handle apollo client errors as top level
const errorLink = onError((res: ErrorResponse) => {
logToSeq('Error', 'Apollo GraphQL Error (DUI3)', {
operationName: res.operation?.operationName ?? 'Unknown',
serverUrl: res.operation.getContext().url as string,
graphQLErrors: res.graphQLErrors?.map((err) => ({
message: err.message,
path: err.path,
code: err.extensions?.code,
locations: err.locations
})),
networkError: res.networkError
? {
message: res.networkError.message,
name: res.networkError.name,
stack: res.networkError.stack
}
: undefined
})
if (res.graphQLErrors) {
if (
res.graphQLErrors?.some(
+5 -3
View File
@@ -522,7 +522,7 @@ export const useHostAppStore = defineStore('hostAppStore', () => {
app.$sendBinding?.on('setModelError', setModelError)
app.$receiveBinding?.on('setModelError', setModelError)
app.$baseBinding.on('setModelError', setModelError)
app.$baseBinding?.on('setModelError', setModelError)
/**
* Used internally in this store store only for initialisation.
@@ -536,7 +536,9 @@ export const useHostAppStore = defineStore('hostAppStore', () => {
const getConnectorVersion = async () => {
connectorVersion.value = await app.$baseBinding.getConnectorVersion()
// Checks whether new version available for the connector or not and throws a toast notification if any.
await checkUpdate()
if (app.$isRunningOnConnector) {
await checkUpdate()
}
}
/**
@@ -683,7 +685,7 @@ export const useHostAppStore = defineStore('hostAppStore', () => {
})
}
app.$baseBinding.on(
app.$baseBinding?.on(
'documentChanged',
() =>
setTimeout(async () => {
+435 -16
View File
@@ -1750,6 +1750,13 @@ __metadata:
languageName: node
linkType: hard
"@fastify/accept-negotiator@npm:^1.1.0":
version: 1.1.0
resolution: "@fastify/accept-negotiator@npm:1.1.0"
checksum: 10c0/1cb9a298c992b812869158ddc6093557a877b30e5f77618a7afea985a0667c50bc7113593bf0f7f9dc9b82b94c16e8ab127a0afc3efde6677fd645539f6d08e5
languageName: node
linkType: hard
"@fastify/busboy@npm:^3.1.1":
version: 3.1.1
resolution: "@fastify/busboy@npm:3.1.1"
@@ -3078,6 +3085,28 @@ __metadata:
languageName: node
linkType: hard
"@nuxt/image@npm:^1.10.0":
version: 1.10.0
resolution: "@nuxt/image@npm:1.10.0"
dependencies:
"@nuxt/kit": "npm:^3.16.0"
consola: "npm:^3.4.2"
defu: "npm:^6.1.4"
h3: "npm:^1.15.1"
image-meta: "npm:^0.2.1"
ipx: "npm:^2.1.0"
knitwork: "npm:^1.2.0"
ohash: "npm:^2.0.11"
pathe: "npm:^2.0.3"
std-env: "npm:^3.8.1"
ufo: "npm:^1.5.4"
dependenciesMeta:
ipx:
optional: true
checksum: 10c0/85ca9f301e8745ba28e740b333d8c26cf7817e1e86fc7b12fe41601f300afff682a50b17371b4bd52579c274f5d61d56f748e71f585e93161c68d2363081f2f7
languageName: node
linkType: hard
"@nuxt/kit@npm:3.17.3, @nuxt/kit@npm:^3.15.4, @nuxt/kit@npm:^3.16.0, @nuxt/kit@npm:^3.16.2, @nuxt/kit@npm:^3.17.2, @nuxt/kit@npm:^3.17.3, @nuxt/kit@npm:^3.5.0":
version: 3.17.3
resolution: "@nuxt/kit@npm:3.17.3"
@@ -5647,6 +5676,62 @@ __metadata:
languageName: node
linkType: hard
"bare-events@npm:^2.5.4":
version: 2.6.0
resolution: "bare-events@npm:2.6.0"
checksum: 10c0/9bdd727a8df81aae14746c9bb860102f6c5aafc028f17e3a8620f40dc8bfe816ed46b0c50cb3200d1a1099f8028da27110cf711267b296767f37d3e4c6a9d4a6
languageName: node
linkType: hard
"bare-fs@npm:^4.0.1":
version: 4.1.6
resolution: "bare-fs@npm:4.1.6"
dependencies:
bare-events: "npm:^2.5.4"
bare-path: "npm:^3.0.0"
bare-stream: "npm:^2.6.4"
peerDependencies:
bare-buffer: "*"
peerDependenciesMeta:
bare-buffer:
optional: true
checksum: 10c0/a02ef4a76b2e58a0b142b5f5d1b629a96ddf62abb2f70801361f8f7f85edf157d777707bff3e62e9e67c75445667b7047cf8a99de39c1a60032d1818850ff0ea
languageName: node
linkType: hard
"bare-os@npm:^3.0.1":
version: 3.6.1
resolution: "bare-os@npm:3.6.1"
checksum: 10c0/13064789b3d0d3051d6a89424e6d861c08be101798d69faa78821cffb428b36d1fd4e17c824d5a4939bcd96dbff42c11921494139c8e53c3e520bc0e3f83aeee
languageName: node
linkType: hard
"bare-path@npm:^3.0.0":
version: 3.0.0
resolution: "bare-path@npm:3.0.0"
dependencies:
bare-os: "npm:^3.0.1"
checksum: 10c0/56a3ca82a9f808f4976cb1188640ac206546ce0ddff582afafc7bd2a6a5b31c3bd16422653aec656eeada2830cfbaa433c6cbf6d6b4d9eba033d5e06d60d9a68
languageName: node
linkType: hard
"bare-stream@npm:^2.6.4":
version: 2.6.5
resolution: "bare-stream@npm:2.6.5"
dependencies:
streamx: "npm:^2.21.0"
peerDependencies:
bare-buffer: "*"
bare-events: "*"
peerDependenciesMeta:
bare-buffer:
optional: true
bare-events:
optional: true
checksum: 10c0/1242286f8f3147e9fd353cdaa9cf53226a807ac0dde8177c13f1463aa4cd1f88e07407c883a1b322b901e9af2d1cd30aacd873529031132c384622972e0419df
languageName: node
linkType: hard
"base64-js@npm:^1.3.1":
version: 1.5.1
resolution: "base64-js@npm:1.5.1"
@@ -6160,6 +6245,13 @@ __metadata:
languageName: node
linkType: hard
"chownr@npm:^1.1.1":
version: 1.1.4
resolution: "chownr@npm:1.1.4"
checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db
languageName: node
linkType: hard
"chownr@npm:^2.0.0":
version: 2.0.0
resolution: "chownr@npm:2.0.0"
@@ -6330,7 +6422,7 @@ __metadata:
languageName: node
linkType: hard
"color-string@npm:^1.6.0":
"color-string@npm:^1.6.0, color-string@npm:^1.9.0":
version: 1.9.1
resolution: "color-string@npm:1.9.1"
dependencies:
@@ -6359,6 +6451,16 @@ __metadata:
languageName: node
linkType: hard
"color@npm:^4.2.3":
version: 4.2.3
resolution: "color@npm:4.2.3"
dependencies:
color-convert: "npm:^2.0.1"
color-string: "npm:^1.9.0"
checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118
languageName: node
linkType: hard
"colord@npm:^2.9.3":
version: 2.9.3
resolution: "colord@npm:2.9.3"
@@ -6390,7 +6492,7 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:^2.20.0":
"commander@npm:^2.20.0, commander@npm:^2.20.3":
version: 2.20.3
resolution: "commander@npm:2.20.3"
checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288
@@ -6906,6 +7008,13 @@ __metadata:
languageName: node
linkType: hard
"cssfilter@npm:0.0.10":
version: 0.0.10
resolution: "cssfilter@npm:0.0.10"
checksum: 10c0/478a227a616fb6e9bb338eb95f690df141b86231ec737cbea574484f31a09a51db894b4921afc4987459dae08d584355fd689ff2a7a7c7a74de4bb4c072ce553
languageName: node
linkType: hard
"cssnano-preset-default@npm:^7.0.7":
version: 7.0.7
resolution: "cssnano-preset-default@npm:7.0.7"
@@ -7126,6 +7235,15 @@ __metadata:
languageName: node
linkType: hard
"decompress-response@npm:^6.0.0":
version: 6.0.0
resolution: "decompress-response@npm:6.0.0"
dependencies:
mimic-response: "npm:^3.1.0"
checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e
languageName: node
linkType: hard
"deep-eql@npm:^5.0.1":
version: 5.0.2
resolution: "deep-eql@npm:5.0.2"
@@ -7140,6 +7258,13 @@ __metadata:
languageName: node
linkType: hard
"deep-extend@npm:^0.6.0":
version: 0.6.0
resolution: "deep-extend@npm:0.6.0"
checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566
languageName: node
linkType: hard
"deep-is@npm:^0.1.3":
version: 0.1.4
resolution: "deep-is@npm:0.1.4"
@@ -7272,7 +7397,7 @@ __metadata:
languageName: node
linkType: hard
"destr@npm:^2.0.3, destr@npm:^2.0.5":
"destr@npm:^2.0.2, destr@npm:^2.0.3, destr@npm:^2.0.5":
version: 2.0.5
resolution: "destr@npm:2.0.5"
checksum: 10c0/efabffe7312a45ad90d79975376be958c50069f1156b94c181199763a7f971e113bd92227c26b94a169c71ca7dbc13583b7e96e5164743969fc79e1ff153e646
@@ -7302,7 +7427,7 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0":
"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.2":
version: 2.0.4
resolution: "detect-libc@npm:2.0.4"
checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c
@@ -8353,6 +8478,13 @@ __metadata:
languageName: node
linkType: hard
"expand-template@npm:^2.0.3":
version: 2.0.3
resolution: "expand-template@npm:2.0.3"
checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51
languageName: node
linkType: hard
"exponential-backoff@npm:^3.1.1":
version: 3.1.2
resolution: "exponential-backoff@npm:3.1.2"
@@ -9076,6 +9208,13 @@ __metadata:
languageName: node
linkType: hard
"github-from-package@npm:0.0.0":
version: 0.0.0
resolution: "github-from-package@npm:0.0.0"
checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12
languageName: node
linkType: hard
"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2":
version: 5.1.2
resolution: "glob-parent@npm:5.1.2"
@@ -9394,7 +9533,7 @@ __metadata:
languageName: node
linkType: hard
"h3@npm:^1.12.0, h3@npm:^1.15.1, h3@npm:^1.15.2, h3@npm:^1.15.3":
"h3@npm:^1.10.0, h3@npm:^1.12.0, h3@npm:^1.15.1, h3@npm:^1.15.2, h3@npm:^1.15.3":
version: 1.15.3
resolution: "h3@npm:1.15.3"
dependencies:
@@ -9681,7 +9820,7 @@ __metadata:
languageName: node
linkType: hard
"image-meta@npm:^0.2.1":
"image-meta@npm:^0.2.0, image-meta@npm:^0.2.1":
version: 0.2.1
resolution: "image-meta@npm:0.2.1"
checksum: 10c0/c8a100b666663ad53ffe95c22647e79802d6eac6dfa3e1a00e4cf034129b4a13e7861b5c5a7cee46604a45a9e0c8ed91e73233c7bf9f48fbece5f0300ef6912c
@@ -9784,7 +9923,7 @@ __metadata:
languageName: node
linkType: hard
"ini@npm:^1.3.4, ini@npm:^1.3.5":
"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0":
version: 1.3.8
resolution: "ini@npm:1.3.8"
checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a
@@ -9864,6 +10003,32 @@ __metadata:
languageName: node
linkType: hard
"ipx@npm:^2.1.0":
version: 2.1.0
resolution: "ipx@npm:2.1.0"
dependencies:
"@fastify/accept-negotiator": "npm:^1.1.0"
citty: "npm:^0.1.5"
consola: "npm:^3.2.3"
defu: "npm:^6.1.4"
destr: "npm:^2.0.2"
etag: "npm:^1.8.1"
h3: "npm:^1.10.0"
image-meta: "npm:^0.2.0"
listhen: "npm:^1.5.6"
ofetch: "npm:^1.3.3"
pathe: "npm:^1.1.2"
sharp: "npm:^0.32.6"
svgo: "npm:^3.2.0"
ufo: "npm:^1.3.2"
unstorage: "npm:^1.10.1"
xss: "npm:^1.0.14"
bin:
ipx: bin/ipx.mjs
checksum: 10c0/04a4f968c9f7bdf9838f3381d85892c55042e9d68a59338d68659ffcb1a779a345a4473a4ef68eede3255954b64bacbd66b778e60952131fc928456286efa444
languageName: node
linkType: hard
"iron-webcrypto@npm:^1.2.1":
version: 1.2.1
resolution: "iron-webcrypto@npm:1.2.1"
@@ -10662,7 +10827,7 @@ __metadata:
languageName: node
linkType: hard
"listhen@npm:^1.9.0":
"listhen@npm:^1.5.6, listhen@npm:^1.9.0":
version: 1.9.0
resolution: "listhen@npm:1.9.0"
dependencies:
@@ -11246,6 +11411,13 @@ __metadata:
languageName: node
linkType: hard
"mimic-response@npm:^3.1.0":
version: 3.1.0
resolution: "mimic-response@npm:3.1.0"
checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362
languageName: node
linkType: hard
"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1":
version: 1.0.1
resolution: "min-indent@npm:1.0.1"
@@ -11298,7 +11470,7 @@ __metadata:
languageName: node
linkType: hard
"minimist@npm:^1.2.5":
"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5":
version: 1.2.8
resolution: "minimist@npm:1.2.8"
checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6
@@ -11405,6 +11577,13 @@ __metadata:
languageName: node
linkType: hard
"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3":
version: 0.5.3
resolution: "mkdirp-classic@npm:0.5.3"
checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168
languageName: node
linkType: hard
"mkdirp@npm:^1.0.3":
version: 1.0.4
resolution: "mkdirp@npm:1.0.4"
@@ -11532,6 +11711,13 @@ __metadata:
languageName: node
linkType: hard
"napi-build-utils@npm:^2.0.0":
version: 2.0.0
resolution: "napi-build-utils@npm:2.0.0"
checksum: 10c0/5833aaeb5cc5c173da47a102efa4680a95842c13e0d9cc70428bd3ee8d96bb2172f8860d2811799b5daa5cbeda779933601492a2028a6a5351c6d0fcf6de83db
languageName: node
linkType: hard
"napi-postinstall@npm:^0.2.2":
version: 0.2.4
resolution: "napi-postinstall@npm:0.2.4"
@@ -11687,6 +11873,24 @@ __metadata:
languageName: node
linkType: hard
"node-abi@npm:^3.3.0":
version: 3.75.0
resolution: "node-abi@npm:3.75.0"
dependencies:
semver: "npm:^7.3.5"
checksum: 10c0/c43a2409407df3737848fd96202b0a49e15039994aecce963969e9ef7342a8fc544aba94e0bfd8155fb9de5f5fe9a4b6ccad8bf509e7c46caf096fc4491d63f2
languageName: node
linkType: hard
"node-addon-api@npm:^6.1.0":
version: 6.1.0
resolution: "node-addon-api@npm:6.1.0"
dependencies:
node-gyp: "npm:latest"
checksum: 10c0/d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac
languageName: node
linkType: hard
"node-addon-api@npm:^7.0.0":
version: 7.1.1
resolution: "node-addon-api@npm:7.1.1"
@@ -12047,7 +12251,7 @@ __metadata:
languageName: node
linkType: hard
"ofetch@npm:^1.4.1":
"ofetch@npm:^1.3.3, ofetch@npm:^1.4.1":
version: 1.4.1
resolution: "ofetch@npm:1.4.1"
dependencies:
@@ -13235,6 +13439,28 @@ __metadata:
languageName: node
linkType: hard
"prebuild-install@npm:^7.1.1":
version: 7.1.3
resolution: "prebuild-install@npm:7.1.3"
dependencies:
detect-libc: "npm:^2.0.0"
expand-template: "npm:^2.0.3"
github-from-package: "npm:0.0.0"
minimist: "npm:^1.2.3"
mkdirp-classic: "npm:^0.5.3"
napi-build-utils: "npm:^2.0.0"
node-abi: "npm:^3.3.0"
pump: "npm:^3.0.0"
rc: "npm:^1.2.7"
simple-get: "npm:^4.0.0"
tar-fs: "npm:^2.0.0"
tunnel-agent: "npm:^0.6.0"
bin:
prebuild-install: bin.js
checksum: 10c0/25919a42b52734606a4036ab492d37cfe8b601273d8dfb1fa3c84e141a0a475e7bad3ab848c741d2f810cef892fcf6059b8c7fe5b29f98d30e0c29ad009bedff
languageName: node
linkType: hard
"precinct@npm:^11.0.0":
version: 11.0.5
resolution: "precinct@npm:11.0.5"
@@ -13503,6 +13729,20 @@ __metadata:
languageName: node
linkType: hard
"rc@npm:^1.2.7":
version: 1.2.8
resolution: "rc@npm:1.2.8"
dependencies:
deep-extend: "npm:^0.6.0"
ini: "npm:~1.3.0"
minimist: "npm:^1.2.0"
strip-json-comments: "npm:~2.0.1"
bin:
rc: ./cli.js
checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15
languageName: node
linkType: hard
"react-is@npm:^16.13.1, react-is@npm:^16.7.0":
version: 16.13.1
resolution: "react-is@npm:16.13.1"
@@ -14101,7 +14341,7 @@ __metadata:
languageName: node
linkType: hard
"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0":
"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3
@@ -14181,7 +14421,7 @@ __metadata:
languageName: node
linkType: hard
"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2":
"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2":
version: 7.7.2
resolution: "semver@npm:7.7.2"
bin:
@@ -14320,6 +14560,23 @@ __metadata:
languageName: node
linkType: hard
"sharp@npm:^0.32.6":
version: 0.32.6
resolution: "sharp@npm:0.32.6"
dependencies:
color: "npm:^4.2.3"
detect-libc: "npm:^2.0.2"
node-addon-api: "npm:^6.1.0"
node-gyp: "npm:latest"
prebuild-install: "npm:^7.1.1"
semver: "npm:^7.5.4"
simple-get: "npm:^4.0.1"
tar-fs: "npm:^3.0.4"
tunnel-agent: "npm:^0.6.0"
checksum: 10c0/f6a756fec5051ef2f9341e0543cde1da4e822982dd5398010baad92e2262bd177e08b753eb19b2fbee30f2fcb0e8756f24088fafc48293a364e9a8f8dc65a300
languageName: node
linkType: hard
"shebang-command@npm:^2.0.0":
version: 2.0.0
resolution: "shebang-command@npm:2.0.0"
@@ -14412,6 +14669,24 @@ __metadata:
languageName: node
linkType: hard
"simple-concat@npm:^1.0.0":
version: 1.0.1
resolution: "simple-concat@npm:1.0.1"
checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776
languageName: node
linkType: hard
"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1":
version: 4.0.1
resolution: "simple-get@npm:4.0.1"
dependencies:
decompress-response: "npm:^6.0.0"
once: "npm:^1.3.1"
simple-concat: "npm:^1.0.0"
checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0
languageName: node
linkType: hard
"simple-git@npm:^3.27.0":
version: 3.27.0
resolution: "simple-git@npm:3.27.0"
@@ -14681,6 +14956,7 @@ __metadata:
"@jsonforms/vue": "npm:3.1.0"
"@jsonforms/vue-vanilla": "npm:3.1.0"
"@nuxt/eslint": "npm:^1.3.1"
"@nuxt/image": "npm:^1.10.0"
"@nuxtjs/tailwindcss": "npm:^6.14.0"
"@parcel/watcher": "npm:^2.5.1"
"@pinia/nuxt": "npm:^0.4.11"
@@ -14816,6 +15092,20 @@ __metadata:
languageName: node
linkType: hard
"streamx@npm:^2.21.0":
version: 2.22.1
resolution: "streamx@npm:2.22.1"
dependencies:
bare-events: "npm:^2.2.0"
fast-fifo: "npm:^1.3.2"
text-decoder: "npm:^1.1.0"
dependenciesMeta:
bare-events:
optional: true
checksum: 10c0/b5e489cca78ff23b910e7d58c3e0059e692f93ec401a5974689f2c50c33c9d94f64246a305566ad52cdb818ee583e02e4257b9066fd654cb9f576a9692fdb976
languageName: node
linkType: hard
"string-env-interpolation@npm:^1.0.1":
version: 1.0.1
resolution: "string-env-interpolation@npm:1.0.1"
@@ -14913,6 +15203,13 @@ __metadata:
languageName: node
linkType: hard
"strip-json-comments@npm:~2.0.1":
version: 2.0.1
resolution: "strip-json-comments@npm:2.0.1"
checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43
languageName: node
linkType: hard
"strip-literal@npm:^3.0.0":
version: 3.0.0
resolution: "strip-literal@npm:3.0.0"
@@ -15133,7 +15430,7 @@ __metadata:
languageName: node
linkType: hard
"svgo@npm:^3.3.2":
"svgo@npm:^3.2.0, svgo@npm:^3.3.2":
version: 3.3.2
resolution: "svgo@npm:3.3.2"
dependencies:
@@ -15272,7 +15569,36 @@ __metadata:
languageName: node
linkType: hard
"tar-stream@npm:^2.2.0":
"tar-fs@npm:^2.0.0":
version: 2.1.3
resolution: "tar-fs@npm:2.1.3"
dependencies:
chownr: "npm:^1.1.1"
mkdirp-classic: "npm:^0.5.2"
pump: "npm:^3.0.0"
tar-stream: "npm:^2.1.4"
checksum: 10c0/472ee0c3c862605165163113ab6924f411c07506a1fb24c51a1a80085f0d4d381d86d2fd6b189236c8d932d1cd97b69cce35016767ceb658a35f7584fe77f305
languageName: node
linkType: hard
"tar-fs@npm:^3.0.4":
version: 3.1.0
resolution: "tar-fs@npm:3.1.0"
dependencies:
bare-fs: "npm:^4.0.1"
bare-path: "npm:^3.0.0"
pump: "npm:^3.0.0"
tar-stream: "npm:^3.1.5"
dependenciesMeta:
bare-fs:
optional: true
bare-path:
optional: true
checksum: 10c0/760309677543c03fbc253b5ef1ab4bb2ceafb554471b6cbe4930d1633f35662ec26a1414c66fa6754f5aa7e8c65003f73849242f624c322d3dcba7a8888a6915
languageName: node
linkType: hard
"tar-stream@npm:^2.1.4, tar-stream@npm:^2.2.0":
version: 2.2.0
resolution: "tar-stream@npm:2.2.0"
dependencies:
@@ -15285,7 +15611,7 @@ __metadata:
languageName: node
linkType: hard
"tar-stream@npm:^3.0.0":
"tar-stream@npm:^3.0.0, tar-stream@npm:^3.1.5":
version: 3.1.7
resolution: "tar-stream@npm:3.1.7"
dependencies:
@@ -15631,6 +15957,15 @@ __metadata:
languageName: node
linkType: hard
"tunnel-agent@npm:^0.6.0":
version: 0.6.0
resolution: "tunnel-agent@npm:0.6.0"
dependencies:
safe-buffer: "npm:^5.0.1"
checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a
languageName: node
linkType: hard
"tunnel@npm:^0.0.6":
version: 0.0.6
resolution: "tunnel@npm:0.0.6"
@@ -15753,7 +16088,7 @@ __metadata:
languageName: node
linkType: hard
"ufo@npm:^1.1.2, ufo@npm:^1.5.4, ufo@npm:^1.6.1":
"ufo@npm:^1.1.2, ufo@npm:^1.3.2, ufo@npm:^1.5.4, ufo@npm:^1.6.1":
version: 1.6.1
resolution: "ufo@npm:1.6.1"
checksum: 10c0/5a9f041e5945fba7c189d5410508cbcbefef80b253ed29aa2e1f8a2b86f4bd51af44ee18d4485e6d3468c92be9bf4a42e3a2b72dcaf27ce39ce947ec994f1e6b
@@ -16075,6 +16410,78 @@ __metadata:
languageName: node
linkType: hard
"unstorage@npm:^1.10.1":
version: 1.16.1
resolution: "unstorage@npm:1.16.1"
dependencies:
anymatch: "npm:^3.1.3"
chokidar: "npm:^4.0.3"
destr: "npm:^2.0.5"
h3: "npm:^1.15.3"
lru-cache: "npm:^10.4.3"
node-fetch-native: "npm:^1.6.6"
ofetch: "npm:^1.4.1"
ufo: "npm:^1.6.1"
peerDependencies:
"@azure/app-configuration": ^1.8.0
"@azure/cosmos": ^4.2.0
"@azure/data-tables": ^13.3.0
"@azure/identity": ^4.6.0
"@azure/keyvault-secrets": ^4.9.0
"@azure/storage-blob": ^12.26.0
"@capacitor/preferences": ^6.0.3 || ^7.0.0
"@deno/kv": ">=0.9.0"
"@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
"@planetscale/database": ^1.19.0
"@upstash/redis": ^1.34.3
"@vercel/blob": ">=0.27.1"
"@vercel/kv": ^1.0.1
aws4fetch: ^1.0.20
db0: ">=0.2.1"
idb-keyval: ^6.2.1
ioredis: ^5.4.2
uploadthing: ^7.4.4
peerDependenciesMeta:
"@azure/app-configuration":
optional: true
"@azure/cosmos":
optional: true
"@azure/data-tables":
optional: true
"@azure/identity":
optional: true
"@azure/keyvault-secrets":
optional: true
"@azure/storage-blob":
optional: true
"@capacitor/preferences":
optional: true
"@deno/kv":
optional: true
"@netlify/blobs":
optional: true
"@planetscale/database":
optional: true
"@upstash/redis":
optional: true
"@vercel/blob":
optional: true
"@vercel/kv":
optional: true
aws4fetch:
optional: true
db0:
optional: true
idb-keyval:
optional: true
ioredis:
optional: true
uploadthing:
optional: true
checksum: 10c0/753ed7a5bb0e6b6a4803912428762b5393e78262e94489239c4bd7f718bf95e0f71bb2cf3d3f178f45abcfaf69160fa868b8a82e1b34c1b7dc4609344b1cadad
languageName: node
linkType: hard
"unstorage@npm:^1.16.0":
version: 1.16.0
resolution: "unstorage@npm:1.16.0"
@@ -16889,6 +17296,18 @@ __metadata:
languageName: node
linkType: hard
"xss@npm:^1.0.14":
version: 1.0.15
resolution: "xss@npm:1.0.15"
dependencies:
commander: "npm:^2.20.3"
cssfilter: "npm:0.0.10"
bin:
xss: bin/xss
checksum: 10c0/9b31bee62a208f78e2b7bc8154e3ee87d980f4661dc4ab850ce6f4de7bc50eb152f0bdc13fa759ff8ab6d9bfdf8c0d79cf9f6f86249872b92181912309bccd08
languageName: node
linkType: hard
"y18n@npm:^5.0.5":
version: 5.0.8
resolution: "y18n@npm:5.0.8"