From 2a008efcb3e2b717ab18d63d3f8156f2faf0c020 Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Sun, 2 Aug 2026 20:38:11 +0100 Subject: [PATCH 1/8] feat: add workspace REST API queries --- .../backend-core/src/utils/outboundFetch.ts | 4 +- .../src/utils/tests/outboundFetch.spec.ts | 4 +- .../DatasourceNavigator/QueryNavItem.svelte | 3 +- .../RestQueryNavigator.svelte | 48 +++++++ .../commandPalette/CommandPalette.svelte | 4 +- .../integration/RestQueryViewer.svelte | 52 ++++++-- .../_components/SideNav/SideNav.svelte | 9 +- .../[application]/apis/_module.svelte | 42 ++++--- .../workspace/[application]/apis/index.svelte | 18 ++- .../workspace/[application]/apis/new.svelte | 14 ++- .../apis/query/[queryId]/index.svelte | 8 +- .../[application]/apis/query/new/index.svelte | 5 + .../panels/Queries/RestImportButton.svelte | 22 ---- .../Queries/RestImportQueriesModal.svelte | 16 ++- .../_components/panels/Queries/index.svelte | 16 --- .../datasource/[datasourceId]/index.svelte | 117 +----------------- .../builder/src/settings/pages/apis.svelte | 111 +++++++++++++++++ packages/builder/src/settings/pages/index.ts | 2 + packages/builder/src/settings/routes.ts | 6 + packages/builder/src/stores/builder/index.ts | 2 + .../src/stores/builder/workspaceApis.ts | 51 ++++++++ packages/frontend-core/src/api/index.ts | 2 + packages/frontend-core/src/api/types.ts | 4 +- .../frontend-core/src/api/workspaceApis.ts | 12 ++ .../src/api/controllers/query/import/index.ts | 7 +- .../server/src/api/controllers/query/index.ts | 62 +++++++++- .../src/api/controllers/workspaceApis.ts | 18 +++ packages/server/src/api/routes/index.ts | 1 + packages/server/src/api/routes/query.ts | 26 ++-- .../src/api/routes/tests/queries/rest.spec.ts | 3 +- .../server/src/api/routes/workspaceApis.ts | 18 +++ .../src/integrations/tests/rest.spec.ts | 2 +- packages/server/src/sdk/index.ts | 3 +- packages/server/src/sdk/workspace/apis.ts | 75 +++++++++++ packages/types/src/api/web/workspace/api.ts | 9 ++ packages/types/src/api/web/workspace/index.ts | 1 + packages/types/src/api/web/workspace/query.ts | 2 +- packages/types/src/documents/document.ts | 2 + packages/types/src/documents/workspace/api.ts | 9 ++ .../src/documents/workspace/datasource.ts | 2 +- .../types/src/documents/workspace/index.ts | 1 + 41 files changed, 604 insertions(+), 209 deletions(-) create mode 100644 packages/builder/src/components/backend/DatasourceNavigator/RestQueryNavigator.svelte create mode 100644 packages/builder/src/routes/builder/workspace/[application]/apis/query/new/index.svelte delete mode 100644 packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportButton.svelte create mode 100644 packages/builder/src/settings/pages/apis.svelte create mode 100644 packages/builder/src/stores/builder/workspaceApis.ts create mode 100644 packages/frontend-core/src/api/workspaceApis.ts create mode 100644 packages/server/src/api/controllers/workspaceApis.ts create mode 100644 packages/server/src/api/routes/workspaceApis.ts create mode 100644 packages/server/src/sdk/workspace/apis.ts create mode 100644 packages/types/src/api/web/workspace/api.ts create mode 100644 packages/types/src/documents/workspace/api.ts diff --git a/packages/backend-core/src/utils/outboundFetch.ts b/packages/backend-core/src/utils/outboundFetch.ts index 18facd24..f10e4853 100644 --- a/packages/backend-core/src/utils/outboundFetch.ts +++ b/packages/backend-core/src/utils/outboundFetch.ts @@ -228,7 +228,9 @@ export async function fetchWithBlacklist< nextRequest = nextRequestForRedirect(nextRequest, response.status) if (shouldStripSensitiveHeadersForRedirect(nextUrl, redirectUrl)) { if (rejectCrossOriginRedirects) { - throw new Error("Redirect to a different origin is not permitted.") + throw new Error( + "This API URL redirects to a different hostname, port, or protocol. Enter the final URL directly (www.example.com instead of example.com)." + ) } nextRequest = stripSensitiveHeadersForRedirect(nextRequest) } diff --git a/packages/backend-core/src/utils/tests/outboundFetch.spec.ts b/packages/backend-core/src/utils/tests/outboundFetch.spec.ts index e335f348..7dfd254d 100644 --- a/packages/backend-core/src/utils/tests/outboundFetch.spec.ts +++ b/packages/backend-core/src/utils/tests/outboundFetch.spec.ts @@ -471,7 +471,9 @@ describe("outboundFetch", () => { fetchWithBlacklist("https://budibase.com/resource", undefined, { rejectCrossOriginRedirects: true, }) - ).rejects.toThrow("Redirect to a different origin is not permitted.") + ).rejects.toThrow( + "This API URL redirects to a different hostname, port, or protocol. Enter the final URL directly (www.example.com instead of example.com)." + ) expect(fetchMock).toHaveBeenCalledTimes(1) }) diff --git a/packages/builder/src/components/backend/DatasourceNavigator/QueryNavItem.svelte b/packages/builder/src/components/backend/DatasourceNavigator/QueryNavItem.svelte index 43d318fd..a411ba40 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/QueryNavItem.svelte +++ b/packages/builder/src/components/backend/DatasourceNavigator/QueryNavItem.svelte @@ -20,6 +20,7 @@ $isActive export let datasource export let query +export let indentLevel = 1 const favourites = workspaceFavouriteStore.lookup @@ -94,7 +95,7 @@ $: goto = $gotoStore +import { Layout } from "@supertoolmake/bbui" +import { datasources, queries } from "@/stores/builder" +import { WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" +import QueryNavItem from "./QueryNavItem.svelte" + +export let searchTerm + +const datasource = { + _id: WORKSPACE_API_CONFIG_ID, + source: "REST", + name: "APIs", +} + +$: restDatasourceIds = new Set( + ($datasources.list || []).filter((source) => source.source === "REST").map((source) => source._id) +) +$: restQueries = $queries.list.filter( + (query) => + query.datasourceId === WORKSPACE_API_CONFIG_ID || restDatasourceIds.has(query.datasourceId) +) +$: filteredQueries = restQueries.filter( + (query) => !searchTerm || query.name?.toLowerCase().includes(searchTerm.toLowerCase()) +) + + +
+ {#each filteredQueries as query} + + {/each} +
+ +{#if searchTerm && filteredQueries.length === 0} + +
There aren't any APIs matching that name
+
+{/if} + + diff --git a/packages/builder/src/components/commandPalette/CommandPalette.svelte b/packages/builder/src/components/commandPalette/CommandPalette.svelte index efd62395..54d81943 100644 --- a/packages/builder/src/components/commandPalette/CommandPalette.svelte +++ b/packages/builder/src/components/commandPalette/CommandPalette.svelte @@ -5,6 +5,7 @@ import { goto, isActive, params } from "@roxi/routify" import { getContext } from "svelte" import { API } from "@/api" import { IntegrationTypes } from "@/constants/backend" +import { WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" import { bb } from "@/stores/bb" import { appStore, @@ -93,7 +94,8 @@ const queryCommands = (queries) => { ) return queries.map((query) => { const datasource = datasourceLookup.get(query.datasourceId) - const isRest = datasource?.source === IntegrationTypes.REST + const isRest = + datasource?.source === IntegrationTypes.REST || query.datasourceId === WORKSPACE_API_CONFIG_ID return { type: "Query", name: query.name, diff --git a/packages/builder/src/components/integration/RestQueryViewer.svelte b/packages/builder/src/components/integration/RestQueryViewer.svelte index 18519a78..82f25008 100644 --- a/packages/builder/src/components/integration/RestQueryViewer.svelte +++ b/packages/builder/src/components/integration/RestQueryViewer.svelte @@ -42,6 +42,8 @@ import { capitalise } from "@/helpers" import restUtils, { customQueryIconColor } from "@/helpers/data/utils" import { getErrorMessage } from "@/helpers/errors" import { datasources, integrations, queries } from "@/stores/builder" +import { workspaceApis } from "@/stores/builder" +import { WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" import ConnectedQueryScreens from "./ConnectedQueryScreens.svelte" import DynamicVariableModal from "./DynamicVariableModal.svelte" import { @@ -80,7 +82,7 @@ let lastSyncedQueryName function getSelectedQuery() { return cloneDeep( $queries.list.find((q) => q._id === queryId) || { - datasourceId: $params.datasourceId, + datasourceId: $params.datasourceId || WORKSPACE_API_CONFIG_ID, parameters: [], fields: { // only init the objects, everything else is optional strings @@ -92,6 +94,34 @@ function getSelectedQuery() { ) } +const mergeSharedConfig = (legacyDatasource) => { + if (!legacyDatasource) { + return $workspaceApis.datasource + } + const { url: _sharedUrl, ...sharedConfig } = $workspaceApis.datasource.config || {} + const datasourceConfig = legacyDatasource.config || {} + const datasourceAuthIds = new Set((datasourceConfig.authConfigs || []).map((auth) => auth._id)) + return { + ...legacyDatasource, + config: { + ...sharedConfig, + ...datasourceConfig, + defaultHeaders: { + ...(sharedConfig.defaultHeaders || {}), + ...(datasourceConfig.defaultHeaders || {}), + }, + staticVariables: { + ...(sharedConfig.staticVariables || {}), + ...(datasourceConfig.staticVariables || {}), + }, + authConfigs: [ + ...(sharedConfig.authConfigs || []).filter((auth) => !datasourceAuthIds.has(auth._id)), + ...(datasourceConfig.authConfigs || []), + ], + }, + } +} + const cleanUrl = (inputUrl) => url ?.replace(/(https)|(http)|[{}:]/g, "") @@ -157,10 +187,14 @@ async function saveQuery(redirectIfNew = true) { saveId = _id if (dynamicVariables) { datasource.config.dynamicVariables = rebuildVariables(saveId) - datasource = await datasources.save({ - integration: integrationInfo, - datasource, - }) + if (toSave.datasourceId === WORKSPACE_API_CONFIG_ID) { + await workspaceApis.save(datasource.config) + } else { + datasource = await datasources.save({ + integration: integrationInfo, + datasource, + }) + } } notifications.success(`Request saved successfully`) @@ -434,12 +468,16 @@ onMount(async () => { try { // Clear any unsaved changes to the datasource - await datasources.init() + await Promise.all([datasources.init(), workspaceApis.fetch()]) } catch { notifications.error("Error getting datasources") } - datasource = $datasources.list.find((ds) => ds._id === query?.datasourceId) + datasource = mergeSharedConfig( + query?.datasourceId === WORKSPACE_API_CONFIG_ID + ? undefined + : $datasources.list.find((ds) => ds._id === query?.datasourceId) + ) const datasourceUrl = datasource?.config.url const qs = query?.fields.queryString breakQs = restUtils.breakQueryString(encodeURI(qs ?? "")) diff --git a/packages/builder/src/routes/builder/workspace/[application]/_components/SideNav/SideNav.svelte b/packages/builder/src/routes/builder/workspace/[application]/_components/SideNav/SideNav.svelte index d8c4ee76..f688ad97 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/_components/SideNav/SideNav.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/_components/SideNav/SideNav.svelte @@ -19,6 +19,7 @@ import { type UIWorkspaceApp, type WorkspaceFavourite, WorkspaceResource, + WORKSPACE_API_CONFIG_ID, } from "@supertoolmake/types" import { goto as gotoStore, isActive, url } from "@roxi/routify" import BBLogo from "assets/BBLogo.svelte" @@ -98,7 +99,8 @@ const generateResourceLookup = (allResourceStores: Readable) const isRestQuery = favourite.resourceType === WorkspaceResource.QUERY && isQueryResource(resource) && - datasourceMap[resource.datasourceId]?.source === IntegrationTypes.REST + (datasourceMap[resource.datasourceId]?.source === IntegrationTypes.REST || + resource.datasourceId === WORKSPACE_API_CONFIG_ID) const entry: UIFavouriteResource = { name: resource.name, @@ -178,7 +180,10 @@ const resourceLink = (favourite: WorkspaceFavourite): ResourceLinkResult | null const datasourceMap = get(datasourceLookup) || {} const query = queriesStore.list?.find((q) => q._id === id) const datasource = query?.datasourceId ? datasourceMap[query.datasourceId] : undefined - const basePath = helpers.isSQL(datasource) ? "data" : "apis" + const basePath = + query?.datasourceId === WORKSPACE_API_CONFIG_ID || !helpers.isSQL(datasource) + ? "apis" + : "data" return { path: `${appPrefix}${basePath}/query/[queryId]`, params: { application: currentAppId, queryId: id }, diff --git a/packages/builder/src/routes/builder/workspace/[application]/apis/_module.svelte b/packages/builder/src/routes/builder/workspace/[application]/apis/_module.svelte index 714757cc..c3909a40 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/apis/_module.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/apis/_module.svelte @@ -1,15 +1,16 @@ + + diff --git a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportButton.svelte b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportButton.svelte deleted file mode 100644 index 4cac6455..00000000 --- a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportButton.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -
- -
- - diff --git a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportQueriesModal.svelte b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportQueriesModal.svelte index 984a720e..4e1a1c90 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportQueriesModal.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/RestImportQueriesModal.svelte @@ -11,15 +11,20 @@ import { Tabs, TextArea, } from "@supertoolmake/bbui" -import type { Datasource, ImportRestQueryRequest, UIFile } from "@supertoolmake/types" +import { + WORKSPACE_API_CONFIG_ID, + type Datasource, + type ImportRestQueryRequest, + type UIFile, +} from "@supertoolmake/types" import { goto } from "@roxi/routify" import { writable } from "svelte/store" -import { datasources, queries } from "@/stores/builder" +import { datasources, queries, workspaceApis } from "@/stores/builder" $goto export let navigateDatasource = false -export let datasourceId: string | undefined = undefined +export let datasourceId: string | undefined = WORKSPACE_API_CONFIG_ID export let createDatasource = false export let onCancel: (() => void) | undefined = undefined @@ -122,7 +127,10 @@ async function importQueries() { } } -$: datasource = $datasources.selected as Datasource +$: datasource = + datasourceId === WORKSPACE_API_CONFIG_ID + ? $workspaceApis.datasource + : ($datasources.selected as Datasource) let dataStringCache: string | undefined diff --git a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/index.svelte b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/index.svelte index 0789e786..3d6ddd39 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/index.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Queries/index.svelte @@ -6,8 +6,6 @@ import CapitaliseRenderer from "@/components/common/renderers/CapitaliseRenderer import { queries } from "@/stores/builder" import Panel from "../Panel.svelte" import Tooltip from "../Tooltip.svelte" -import RestImportButton from "./RestImportButton.svelte" -import RestImportQueriesModal from "./RestImportQueriesModal.svelte" $goto @@ -16,11 +14,9 @@ export let datasource $: queryList = $queries.list.filter((query) => query.datasourceId === datasource._id) let viewSelectionModal -let restImportModal $: supportsViews = datasource.source === "POSTGRES" || datasource.source === "MYSQL" $: isRestDatasource = datasource?.source === "REST" -$: showImportButton = isRestDatasource $: createQueryLabel = isRestDatasource ? "Add action" : "Create new query" @@ -36,15 +32,6 @@ $: createQueryLabel = isRestDatasource ? "Add action" : "Create new query" {/if} -{#if isRestDatasource} - - - -{/if} -
{/if} - {#if showImportButton} - - {/if}
{#if !isRestDatasource} diff --git a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/index.svelte b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/index.svelte index 1b319b4d..6ffa1e53 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/index.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/index.svelte @@ -1,63 +1,20 @@ @@ -107,47 +54,10 @@ $: if (datasource && (!updatedDatasource || updatedDatasource._id !== datasource {$datasources.selected?.name} - - {#if isRestDatasource} -
- {#each REST_PANEL_SECTIONS as restPanel (restPanel.title)} -
- {#if restPanel.title} -
- - {restPanel.title} - - {#if restPanel.tooltip} - - {/if} -
- {/if} - {#if restPanel.component === QueriesPanel} - - - - {:else} - - {/if} -
- {/each} -
+ {#if datasource?.source === IntegrationTypes.REST} + REST API settings are managed in Workspace settings under APIs. {:else} +
{#each panelOptions as panelOption} @@ -188,21 +98,4 @@ $: if (datasource && (!updatedDatasource || updatedDatasource._id !== datasource margin-bottom: 12px; } - .rest-sections { - display: flex; - flex-direction: column; - gap: var(--spacing-xxl); - margin-top: var(--spacing-xl); - } - - .rest-section { - margin-bottom: 35px; - } - - .rest-section__title { - display: flex; - align-items: center; - gap: var(--spacing-s); - margin-bottom: var(--spacing-m); - } diff --git a/packages/builder/src/settings/pages/apis.svelte b/packages/builder/src/settings/pages/apis.svelte new file mode 100644 index 00000000..4ccd95a2 --- /dev/null +++ b/packages/builder/src/settings/pages/apis.svelte @@ -0,0 +1,111 @@ + + + + + Authentication + Authentication configurations are available to every REST API query. + updateConfig({ authConfigs: event.detail })} + /> + + + + Headers + These headers are added to REST API requests unless a query overrides them. + updateHeaders(event.detail)} + /> + + + + Variables + Static variables are available to every REST API query. + updateStaticVariables(event.detail)} + /> + + +
+ +
+
+ + diff --git a/packages/builder/src/settings/pages/index.ts b/packages/builder/src/settings/pages/index.ts index b941be6c..54bf9354 100644 --- a/packages/builder/src/settings/pages/index.ts +++ b/packages/builder/src/settings/pages/index.ts @@ -1,4 +1,5 @@ import type { Component } from "svelte" +import APIsPage from "@/settings/pages/apis.svelte" import AuthPage from "@/settings/pages/auth/index.svelte" import BrandingPage from "@/settings/pages/branding.svelte" import DiagnosticsPage from "@/settings/pages/diagnostics.svelte" @@ -35,6 +36,7 @@ const componentMap = { general_info: GeneralInfoPage, embed: EmbedPage, agplv3: Agplv3Page, + apis: APIsPage, } satisfies Record> export const Pages = { diff --git a/packages/builder/src/settings/routes.ts b/packages/builder/src/settings/routes.ts index 8de02f01..658a4c79 100644 --- a/packages/builder/src/settings/routes.ts +++ b/packages/builder/src/settings/routes.ts @@ -158,6 +158,12 @@ export const appRoutes = (appStore: AppMetaState, _appsStore: PortalAppsStore): path: "app", routes: [{ path: "embed", comp: Pages.get("embed"), title: "Embed" }], }, + { + section: "APIs", + icon: "globe-simple", + path: "apis", + comp: Pages.get("apis"), + }, ].map((entry: Route) => ({ ...entry, group: "Workspace", diff --git a/packages/builder/src/stores/builder/index.ts b/packages/builder/src/stores/builder/index.ts index 072a2126..1352e1ec 100644 --- a/packages/builder/src/stores/builder/index.ts +++ b/packages/builder/src/stores/builder/index.ts @@ -31,6 +31,7 @@ import { sortedIntegrations } from "./sortedIntegrations" import { queries } from "./queries" import componentTreeNodesStore from "./componentTreeNodes" import { oauth2 } from "./oauth2" +import { workspaceApis } from "./workspaceApis" import { dataEnvironmentStore, dataAPI } from "./dataEnvironment" import type { FetchAppPackageResponse } from "@supertoolmake/types" @@ -71,6 +72,7 @@ export { userSelectedResourceMap, userStore, workspaceAppStore, + workspaceApis, workspaceDeploymentStore, workspaceFavouriteStore, } diff --git a/packages/builder/src/stores/builder/workspaceApis.ts b/packages/builder/src/stores/builder/workspaceApis.ts new file mode 100644 index 00000000..df20c711 --- /dev/null +++ b/packages/builder/src/stores/builder/workspaceApis.ts @@ -0,0 +1,51 @@ +import type { Datasource, RestConfig } from "@supertoolmake/types" +import { SourceName, WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" +import { writable } from "svelte/store" +import { API } from "@/api" + +interface WorkspaceAPIState { + datasource: Datasource + loading: boolean +} + +const emptyDatasource = (): Datasource => ({ + _id: WORKSPACE_API_CONFIG_ID, + type: "datasource", + source: SourceName.REST, + name: "APIs", + config: {}, +}) + +const store = writable({ + datasource: emptyDatasource(), + loading: false, +}) + +export const workspaceApis = { + subscribe: store.subscribe, + async fetch() { + store.update((state) => ({ ...state, loading: true })) + try { + const response = await API.getWorkspaceAPI() + store.update((state) => ({ + ...state, + datasource: { + ...state.datasource, + config: response.config || {}, + }, + loading: false, + })) + } catch (error) { + store.update((state) => ({ ...state, loading: false })) + throw error + } + }, + async save(config: RestConfig) { + const response = await API.saveWorkspaceAPI({ config }) + store.update((state) => ({ + ...state, + datasource: { ...state.datasource, config: response.config || {} }, + })) + return response + }, +} diff --git a/packages/frontend-core/src/api/index.ts b/packages/frontend-core/src/api/index.ts index 5394f947..c2a66007 100644 --- a/packages/frontend-core/src/api/index.ts +++ b/packages/frontend-core/src/api/index.ts @@ -36,6 +36,7 @@ import { HTTPMethod, } from "./types" import { buildUserEndpoints } from "./user" +import { buildWorkspaceAPIEndpoints } from "./workspaceApis" import { buildWorkspaceAppEndpoints } from "./workspaceApps" import { buildWorkspaceFavouriteEndpoints } from "./workspaceFavourites" @@ -259,6 +260,7 @@ export const createAPIClient = (config: APIClientConfig = {}): APIClient => { return { ...API, ...buildAppEndpoints(API), + ...buildWorkspaceAPIEndpoints(API), ...buildAttachmentEndpoints(API), ...buildAuthEndpoints(API), ...buildConfigEndpoints(API), diff --git a/packages/frontend-core/src/api/types.ts b/packages/frontend-core/src/api/types.ts index 293709d2..5641bf48 100644 --- a/packages/frontend-core/src/api/types.ts +++ b/packages/frontend-core/src/api/types.ts @@ -22,6 +22,7 @@ import type { SelfEndpoints } from "./self" import type { TableEndpoints } from "./tables" import type { TemplateEndpoints } from "./templates" import type { UserEndpoints } from "./user" +import type { WorkspaceAPIEndpoints } from "./workspaceApis" import type { WorkspaceAppEndpoints } from "./workspaceApps" import type { WorkspaceFavouriteEndpoints } from "./workspaceFavourites" @@ -106,7 +107,8 @@ export type APIClient = BaseAPIClient & SelfEndpoints & TableEndpoints & TemplateEndpoints & - UserEndpoints & { + UserEndpoints & + WorkspaceAPIEndpoints & { resource: ResourceEndpoints oauth2: OAuth2Endpoints navigation: NavigationEndpoints diff --git a/packages/frontend-core/src/api/workspaceApis.ts b/packages/frontend-core/src/api/workspaceApis.ts new file mode 100644 index 00000000..8f90aeed --- /dev/null +++ b/packages/frontend-core/src/api/workspaceApis.ts @@ -0,0 +1,12 @@ +import type { UpdateWorkspaceAPIRequest, WorkspaceAPIResponse } from "@supertoolmake/types" +import type { BaseAPIClient } from "./types" + +export interface WorkspaceAPIEndpoints { + getWorkspaceAPI: () => Promise + saveWorkspaceAPI: (request: UpdateWorkspaceAPIRequest) => Promise +} + +export const buildWorkspaceAPIEndpoints = (API: BaseAPIClient): WorkspaceAPIEndpoints => ({ + getWorkspaceAPI: async () => await API.get({ url: "/api/workspace/apis" }), + saveWorkspaceAPI: async (request) => await API.put({ url: "/api/workspace/apis", body: request }), +}) diff --git a/packages/server/src/api/controllers/query/import/index.ts b/packages/server/src/api/controllers/query/import/index.ts index 9782ade6..ae0da87a 100644 --- a/packages/server/src/api/controllers/query/import/index.ts +++ b/packages/server/src/api/controllers/query/import/index.ts @@ -1,6 +1,7 @@ import { context } from "@supertoolmake/backend-core" -import type { Datasource, Query } from "@supertoolmake/types" +import { type Datasource, type Query, WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" import { generateQueryID } from "../../../../db/utils" +import sdk from "../../../../sdk" import { queryValidation } from "../validation" import type { ImportInfo, ImportSource } from "./sources/base" import { Curl } from "./sources/curl" @@ -174,6 +175,10 @@ export class RestImporter { return {} } const db = context.getWorkspaceDB() + if (datasourceId === WORKSPACE_API_CONFIG_ID) { + const workspaceAPI = await sdk.workspaceApis.getWithEnvVars() + return { ...(workspaceAPI.datasource.config?.staticVariables || {}) } + } let datasource: Datasource | undefined try { datasource = await db.get(datasourceId) diff --git a/packages/server/src/api/controllers/query/index.ts b/packages/server/src/api/controllers/query/index.ts index e2b9dbfc..8914e6d5 100644 --- a/packages/server/src/api/controllers/query/index.ts +++ b/packages/server/src/api/controllers/query/index.ts @@ -22,12 +22,14 @@ import { type Query, type QueryResponse, type QuerySchema, + type RestConfig, type SaveQueryRequest, type SaveQueryResponse, type SessionCookie, SourceName, SSOProviderType, type UserCtx, + WORKSPACE_API_CONFIG_ID, } from "@supertoolmake/types" import { cloneDeep, merge } from "lodash" import { ObjectId } from "mongodb" @@ -52,6 +54,41 @@ function sanitiseUserStructure(user: ContextUser) { return copiedUser } +const getDatasource = async (datasourceId: string) => { + if (datasourceId === WORKSPACE_API_CONFIG_ID) { + return await sdk.workspaceApis.getWithEnvVars() + } + const result = await sdk.datasources.getWithEnvVars(datasourceId) + if (result.datasource.source !== SourceName.REST) { + return result + } + + const shared = await sdk.workspaceApis.getWithEnvVars() + const datasourceConfig = result.datasource.config || {} + const { url: _sharedUrl, ...sharedConfig } = shared.datasource.config || {} + const sharedAuth = sharedConfig.authConfigs || [] + const datasourceAuth = datasourceConfig.authConfigs || [] + const datasourceAuthIds = new Set(datasourceAuth.map((auth: any) => auth._id)) + + result.datasource.config = { + ...sharedConfig, + ...datasourceConfig, + defaultHeaders: { + ...(sharedConfig.defaultHeaders || {}), + ...(datasourceConfig.defaultHeaders || {}), + }, + staticVariables: { + ...(sharedConfig.staticVariables || {}), + ...(datasourceConfig.staticVariables || {}), + }, + authConfigs: [ + ...sharedAuth.filter((auth: any) => !datasourceAuthIds.has(auth._id)), + ...datasourceAuth, + ], + } + return result +} + function validateQueryInputs(parameters: QueryEventParameters) { for (const entry of Object.entries(parameters)) { const [key, value] = entry @@ -138,6 +175,11 @@ const _import = async (ctx: UserCtx) { - const { datasource, envVars } = await sdk.datasources.getWithEnvVars( - ctx.request.body.datasourceId - ) + const { datasource, envVars } = await getDatasource(ctx.request.body.datasourceId) // preview may not have a queryId as it hasn't been saved, but if it does // this stops dynamic variables from calling the same query const queryId = ctx.request.body.queryId @@ -408,7 +448,7 @@ async function execute( const db = context.getWorkspaceDB() const query = await db.get(ctx.params.queryId) - const { datasource, envVars } = await sdk.datasources.getWithEnvVars(query.datasourceId) + const { datasource, envVars } = await getDatasource(query.datasourceId) let authConfigCtx = {} if (!opts.isAutomation) { @@ -476,6 +516,20 @@ export async function executeV2AsAutomation( const removeDynamicVariables = async (queryId: string) => { const db = context.getWorkspaceDB() const query = await db.get(queryId) + if (query.datasourceId === WORKSPACE_API_CONFIG_ID) { + const { datasource } = await sdk.workspaceApis.getWithEnvVars() + const dynamicVariables = datasource.config?.dynamicVariables as any[] + if (dynamicVariables) { + datasource.config!.dynamicVariables = dynamicVariables.filter( + (dv: any) => dv.queryId !== queryId + ) + await sdk.workspaceApis.save((datasource.config || {}) as RestConfig) + const variablesToDelete = dynamicVariables.filter((dv: any) => dv.queryId === queryId) + await invalidateCachedVariable(variablesToDelete) + } + return + } + const datasource = await sdk.datasources.get(query.datasourceId) const dynamicVariables = datasource.config?.dynamicVariables as any[] diff --git a/packages/server/src/api/controllers/workspaceApis.ts b/packages/server/src/api/controllers/workspaceApis.ts new file mode 100644 index 00000000..85e45231 --- /dev/null +++ b/packages/server/src/api/controllers/workspaceApis.ts @@ -0,0 +1,18 @@ +import type { + RestConfig, + UpdateWorkspaceAPIRequest, + UserCtx, + WorkspaceAPIResponse, +} from "@supertoolmake/types" +import sdk from "../../sdk" + +export async function fetch(ctx: UserCtx) { + const config = await sdk.workspaceApis.getResponse() + ctx.body = { config: (config.config || {}) as RestConfig } +} + +export async function update(ctx: UserCtx) { + const saved = await sdk.workspaceApis.save(ctx.request.body.config as RestConfig) + const response = await sdk.workspaceApis.getResponse() + ctx.body = { ...saved, config: (response.config || {}) as RestConfig } +} diff --git a/packages/server/src/api/routes/index.ts b/packages/server/src/api/routes/index.ts index 42c74980..a6d24f61 100644 --- a/packages/server/src/api/routes/index.ts +++ b/packages/server/src/api/routes/index.ts @@ -29,6 +29,7 @@ import "./templates" import "./user" import "./workspace" import "./workspaceApp" +import "./workspaceApis" import "./workspaceFavourites" export { default as assetRoutes } from "./assets" diff --git a/packages/server/src/api/routes/query.ts b/packages/server/src/api/routes/query.ts index ee59fb7b..2b445c42 100644 --- a/packages/server/src/api/routes/query.ts +++ b/packages/server/src/api/routes/query.ts @@ -1,4 +1,7 @@ import { permissions } from "@supertoolmake/backend-core" +import type { Ctx } from "@supertoolmake/types" +import { WORKSPACE_API_CONFIG_ID } from "@supertoolmake/types" +import type { Next } from "koa" import { authorizedMiddleware as authorized } from "../../middleware/authorized" import { bodyResource, bodySubResource, paramResource } from "../../middleware/resourceId" import * as queryController from "../controllers/query" @@ -19,19 +22,28 @@ const writeRoutes = endpointGroupList.group({ first: false, }) +const queryDatasourceResource = (ctx: Ctx, next: Next) => { + if (ctx.request.body?.datasourceId === WORKSPACE_API_CONFIG_ID) { + return next() + } + return bodySubResource("datasourceId", "_id")(ctx, next) +} + +const previewDatasourceResource = (ctx: Ctx, next: Next) => { + if (ctx.request.body?.datasourceId === WORKSPACE_API_CONFIG_ID) { + return next() + } + return bodyResource("datasourceId")(ctx, next) +} + builderRoutes .get("/api/queries", queryController.fetchQueries) - .post( - "/api/queries", - bodySubResource("datasourceId", "_id"), - generateQueryValidation(), - queryController.save - ) + .post("/api/queries", queryDatasourceResource, generateQueryValidation(), queryController.save) .post("/api/queries/import/info", queryController.importInfo) .post("/api/queries/import", queryController.import) .post( "/api/queries/preview", - bodyResource("datasourceId"), + previewDatasourceResource, generateQueryPreviewValidation(), queryController.preview ) diff --git a/packages/server/src/api/routes/tests/queries/rest.spec.ts b/packages/server/src/api/routes/tests/queries/rest.spec.ts index cc88dd61..59abab80 100644 --- a/packages/server/src/api/routes/tests/queries/rest.spec.ts +++ b/packages/server/src/api/routes/tests/queries/rest.spec.ts @@ -1120,7 +1120,8 @@ describe("rest", () => { expectations: { status: 400, body: { - message: "Redirect to a different origin is not permitted.", + message: + "This API URL redirects to a different hostname, port, or protocol. Enter the final URL directly (www.example.com instead of example.com).", }, }, }) diff --git a/packages/server/src/api/routes/workspaceApis.ts b/packages/server/src/api/routes/workspaceApis.ts new file mode 100644 index 00000000..10961217 --- /dev/null +++ b/packages/server/src/api/routes/workspaceApis.ts @@ -0,0 +1,18 @@ +import { permissions } from "@supertoolmake/backend-core" +import { authorizedMiddleware as authorized } from "../../middleware/authorized" +import * as controller from "../controllers/workspaceApis" +import { builderRoutes } from "./endpointGroups" + +const { PermissionType, PermissionLevel } = permissions + +builderRoutes + .get( + "/api/workspace/apis", + authorized(PermissionType.QUERY, PermissionLevel.READ), + controller.fetch + ) + .put( + "/api/workspace/apis", + authorized(PermissionType.QUERY, PermissionLevel.WRITE), + controller.update + ) diff --git a/packages/server/src/integrations/tests/rest.spec.ts b/packages/server/src/integrations/tests/rest.spec.ts index e0d354ac..7666968b 100644 --- a/packages/server/src/integrations/tests/rest.spec.ts +++ b/packages/server/src/integrations/tests/rest.spec.ts @@ -230,7 +230,7 @@ describe("REST Integration", () => { }) await expect(integration.read({ path: "redirect" })).rejects.toThrow( - "Redirect to a different origin is not permitted." + "This API URL redirects to a different hostname, port, or protocol. Enter the final URL directly (www.example.com instead of example.com)." ) expect(fetchMock).toHaveBeenCalledTimes(1) }) diff --git a/packages/server/src/sdk/index.ts b/packages/server/src/sdk/index.ts index 2486a4f8..1dbef5d2 100644 --- a/packages/server/src/sdk/index.ts +++ b/packages/server/src/sdk/index.ts @@ -1,5 +1,6 @@ import * as dev from "./dev" import { default as users } from "./users" +import workspaceApis from "./workspace/apis" import { default as backups } from "./workspace/backups" import * as common from "./workspace/common" import { default as datasources } from "./workspace/datasources" @@ -11,7 +12,6 @@ import * as oauth2 from "./workspace/oauth2" import * as permissions from "./workspace/permissions" import { default as queries } from "./workspace/queries" import * as resources from "./workspace/resources" - import { default as rows } from "./workspace/rows" import * as screens from "./workspace/screens" import { default as tables } from "./workspace/tables" @@ -32,6 +32,7 @@ const sdk = { common, oauth2, workspaceApps, + workspaceApis, navigation, resources, deployment, diff --git a/packages/server/src/sdk/workspace/apis.ts b/packages/server/src/sdk/workspace/apis.ts new file mode 100644 index 00000000..b8c3d918 --- /dev/null +++ b/packages/server/src/sdk/workspace/apis.ts @@ -0,0 +1,75 @@ +import { context, HTTPError } from "@supertoolmake/backend-core" +import { processObjectSync } from "@supertoolmake/string-templates" +import { + type Datasource, + type RestConfig, + SourceName, + WORKSPACE_API_CONFIG_ID, + type WorkspaceAPI, +} from "@supertoolmake/types" +import { cloneDeep } from "lodash/fp" +import { getEnvironmentVariables } from "../utils" +import datasources from "./datasources" + +const workspaceAPI: Datasource = { + _id: WORKSPACE_API_CONFIG_ID, + type: "datasource", + source: SourceName.REST, + name: "APIs", + config: {}, +} + +const asDatasource = (config: RestConfig): Datasource => ({ + ...workspaceAPI, + source: "REST" as Datasource["source"], + config, +}) + +const getRaw = async () => { + const db = context.getWorkspaceDB() + return await db.tryGet(WORKSPACE_API_CONFIG_ID) +} + +export async function getWithEnvVars() { + const existing = await getRaw() + const config = cloneDeep(existing?.config || {}) + const env = await getEnvironmentVariables() + const processed = processObjectSync(config, { env }, { onlyFound: true }) as RestConfig + return { + datasource: asDatasource(processed), + envVars: env as Record, + } +} + +export async function getResponse() { + const { datasource } = await getWithEnvVars() + return await datasources.removeSecretSingle(datasource) +} + +export async function save(config: RestConfig) { + const db = context.getWorkspaceDB() + const existing = await getRaw() + const update = asDatasource(config) + const merged = existing ? datasources.mergeConfigs(update, asDatasource(existing.config)) : update + const document: WorkspaceAPI = { + _id: WORKSPACE_API_CONFIG_ID, + _rev: existing?._rev, + type: "workspace_api", + config: merged.config as RestConfig, + } + try { + const response = await db.put(document) + return { ...document, _rev: response.rev } + } catch (error: any) { + if (error?.status === 409) { + throw new HTTPError("The workspace API settings changed. Please retry.", 409) + } + throw error + } +} + +export default { + getWithEnvVars, + getResponse, + save, +} diff --git a/packages/types/src/api/web/workspace/api.ts b/packages/types/src/api/web/workspace/api.ts new file mode 100644 index 00000000..f55b210e --- /dev/null +++ b/packages/types/src/api/web/workspace/api.ts @@ -0,0 +1,9 @@ +import type { RestConfig } from "../../../documents" + +export interface WorkspaceAPIResponse { + config: RestConfig +} + +export interface UpdateWorkspaceAPIRequest { + config: RestConfig +} diff --git a/packages/types/src/api/web/workspace/index.ts b/packages/types/src/api/web/workspace/index.ts index d07376e9..718d3196 100644 --- a/packages/types/src/api/web/workspace/index.ts +++ b/packages/types/src/api/web/workspace/index.ts @@ -1,3 +1,4 @@ +export * from "./api" export * from "./attachment" export * from "./backup" export * from "./component" diff --git a/packages/types/src/api/web/workspace/query.ts b/packages/types/src/api/web/workspace/query.ts index 84f0571b..cd1b909e 100644 --- a/packages/types/src/api/web/workspace/query.ts +++ b/packages/types/src/api/web/workspace/query.ts @@ -15,7 +15,7 @@ export interface ImportRestQueryRequest { datasourceId?: string data?: string url?: string - datasource: Datasource + datasource?: Datasource selectedEndpointId?: string } diff --git a/packages/types/src/documents/document.ts b/packages/types/src/documents/document.ts index 7a8aea26..245975e6 100644 --- a/packages/types/src/documents/document.ts +++ b/packages/types/src/documents/document.ts @@ -41,6 +41,7 @@ export enum DocumentType { AI_CONFIG = "aiconfig", WORKSPACE_APP = "workspace_app", WORKSPACE_FAVOURITE = "workspace_favourite", + WORKSPACE_API = "workspace_api", AUTO_COLUMN_STATE = "autocolumn_state", } @@ -58,6 +59,7 @@ export const DocumentTypesToImport: DocumentType[] = [ DocumentType.MEM_VIEW, DocumentType.WORKSPACE_APP, DocumentType.WORKSPACE_FAVOURITE, + DocumentType.WORKSPACE_API, // Deprecated but still copied DocumentType.INSTANCE, DocumentType.LAYOUT, diff --git a/packages/types/src/documents/workspace/api.ts b/packages/types/src/documents/workspace/api.ts new file mode 100644 index 00000000..1c2a109e --- /dev/null +++ b/packages/types/src/documents/workspace/api.ts @@ -0,0 +1,9 @@ +import type { Document } from "../document" +import type { RestConfig } from "./datasource" + +export const WORKSPACE_API_CONFIG_ID = "workspace_api_config" + +export interface WorkspaceAPI extends Document { + type: "workspace_api" + config: RestConfig +} diff --git a/packages/types/src/documents/workspace/datasource.ts b/packages/types/src/documents/workspace/datasource.ts index 7924862c..c71b1297 100644 --- a/packages/types/src/documents/workspace/datasource.ts +++ b/packages/types/src/documents/workspace/datasource.ts @@ -75,7 +75,7 @@ export interface DynamicVariable { export interface RestConfig { // Base URL - url: string + url?: string rejectUnauthorized?: boolean downloadImages?: boolean defaultHeaders?: { diff --git a/packages/types/src/documents/workspace/index.ts b/packages/types/src/documents/workspace/index.ts index bdc43088..0b9976f6 100644 --- a/packages/types/src/documents/workspace/index.ts +++ b/packages/types/src/documents/workspace/index.ts @@ -1,4 +1,5 @@ export * from "../document" +export * from "./api" export * from "./backup" export * from "./component" export * from "./datasource" From 380a11f6ca571c1b6b87e5eaa0afd149d0cc981b Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 16:59:29 +0100 Subject: [PATCH 2/8] 'Add config' navigates to APIs modal settings --- .../integration/RestQueryViewer.svelte | 30 ++++++++++++------- .../integration/rest/AuthPicker.svelte | 12 ++------ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/builder/src/components/integration/RestQueryViewer.svelte b/packages/builder/src/components/integration/RestQueryViewer.svelte index 82f25008..5405a309 100644 --- a/packages/builder/src/components/integration/RestQueryViewer.svelte +++ b/packages/builder/src/components/integration/RestQueryViewer.svelte @@ -94,11 +94,11 @@ function getSelectedQuery() { ) } -const mergeSharedConfig = (legacyDatasource) => { +const mergeSharedConfig = (legacyDatasource, sharedDatasource) => { if (!legacyDatasource) { - return $workspaceApis.datasource + return sharedDatasource } - const { url: _sharedUrl, ...sharedConfig } = $workspaceApis.datasource.config || {} + const { url: _sharedUrl, ...sharedConfig } = sharedDatasource.config || {} const datasourceConfig = legacyDatasource.config || {} const datasourceAuthIds = new Set((datasourceConfig.authConfigs || []).map((auth) => auth._id)) return { @@ -186,10 +186,13 @@ async function saveQuery(redirectIfNew = true) { const { _id } = await queries.save(toSave.datasourceId, toSave) saveId = _id if (dynamicVariables) { - datasource.config.dynamicVariables = rebuildVariables(saveId) if (toSave.datasourceId === WORKSPACE_API_CONFIG_ID) { - await workspaceApis.save(datasource.config) + await workspaceApis.save({ + ...$workspaceApis.datasource.config, + dynamicVariables: rebuildVariables(saveId, $workspaceApis.datasource), + }) } else { + datasource.config.dynamicVariables = rebuildVariables(saveId) datasource = await datasources.save({ integration: integrationInfo, datasource, @@ -300,7 +303,7 @@ const getDynamicVariables = (datasource, queryId, matchFn) => { } // convert dynamic variables object back to a list, enrich with query id -const rebuildVariables = (queryId) => { +const rebuildVariables = (queryId, sourceDatasource = datasource) => { let variables = [] if (dynamicVariables) { variables = Object.entries(dynamicVariables).map((entry) => { @@ -312,7 +315,7 @@ const rebuildVariables = (queryId) => { }) } - let existing = datasource?.config?.dynamicVariables || [] + let existing = sourceDatasource?.config?.dynamicVariables || [] // remove existing query variables (for changes and deletions) existing = existing.filter((variable) => variable.queryId !== queryId) // re-add the new query variables @@ -411,7 +414,14 @@ $: url = buildUrl(query?.fields?.path, breakQs) $: checkQueryName(url) $: responseSuccess = response?.info?.code >= 200 && response?.info?.code < 400 $: isGet = query?.queryVerb === "read" -$: authConfigs = buildAuthConfigs(datasource) +$: authConfigs = buildAuthConfigs( + mergeSharedConfig( + query?.datasourceId === WORKSPACE_API_CONFIG_ID + ? undefined + : $datasources.list.find((ds) => ds._id === query?.datasourceId), + $workspaceApis.datasource + ) +) $: schemaReadOnly = !responseSuccess $: variablesReadOnly = !responseSuccess $: showVariablesTab = shouldShowVariables(dynamicVariables, variablesReadOnly) @@ -476,7 +486,8 @@ onMount(async () => { datasource = mergeSharedConfig( query?.datasourceId === WORKSPACE_API_CONFIG_ID ? undefined - : $datasources.list.find((ds) => ds._id === query?.datasourceId) + : $datasources.list.find((ds) => ds._id === query?.datasourceId), + $workspaceApis.datasource ) const datasourceUrl = datasource?.config.url const qs = query?.fields.queryString @@ -714,7 +725,6 @@ onMount(async () => { bind:authConfigId={query.fields.authConfigId} bind:authConfigType={query.fields.authConfigType} {authConfigs} - datasourceId={datasource._id} />
diff --git a/packages/builder/src/components/integration/rest/AuthPicker.svelte b/packages/builder/src/components/integration/rest/AuthPicker.svelte index 6d43ba94..51ef7c7b 100644 --- a/packages/builder/src/components/integration/rest/AuthPicker.svelte +++ b/packages/builder/src/components/integration/rest/AuthPicker.svelte @@ -9,18 +9,13 @@ import { PopoverAlignment, } from "@supertoolmake/bbui" import { RestAuthType } from "@supertoolmake/types" -import { goto as gotoStore } from "@roxi/routify" import { onMount } from "svelte" import DetailPopover from "@/components/common/DetailPopover.svelte" import { bb } from "@/stores/bb" -import { appStore, oauth2 } from "@/stores/builder" +import { oauth2 } from "@/stores/builder" function addBasicConfiguration() { - goto(`/builder/workspace/[application]/apis/datasource/[datasourceId]`, { - application: $appStore.appId, - datasourceId, - tab: "Authentication", - }) + bb.settings("/apis") } function addOAuth2Configuration() { @@ -38,14 +33,11 @@ function selectConfiguration(id: string, type?: RestAuthType) { popover.hide() } -$: goto = $gotoStore - type Config = { label: string; value: string } export let authConfigId: string | undefined export let authConfigType: RestAuthType | undefined export let authConfigs: Config[] -export let datasourceId: string let popover: DetailPopover let allConfigs: Config[] From 722c39efe6f97ecccf8d7a8fb35405ff8e813435 Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 17:25:54 +0100 Subject: [PATCH 3/8] Add OAuth2 REST config --- .../integration/rest/AuthPicker.svelte | 4 +- .../builder/src/settings/pages/apis.svelte | 25 --- packages/builder/src/settings/pages/index.ts | 2 + .../settings/pages/oauth2/AddButton.svelte | 13 ++ .../pages/oauth2/MoreMenuRenderer.svelte | 46 +++++ .../oauth2/OAuth2ConfigModalContent.svelte | 168 ++++++++++++++++++ .../src/settings/pages/oauth2/index.svelte | 61 +++++++ packages/builder/src/settings/routes.ts | 5 +- 8 files changed, 296 insertions(+), 28 deletions(-) create mode 100644 packages/builder/src/settings/pages/oauth2/AddButton.svelte create mode 100644 packages/builder/src/settings/pages/oauth2/MoreMenuRenderer.svelte create mode 100644 packages/builder/src/settings/pages/oauth2/OAuth2ConfigModalContent.svelte create mode 100644 packages/builder/src/settings/pages/oauth2/index.svelte diff --git a/packages/builder/src/components/integration/rest/AuthPicker.svelte b/packages/builder/src/components/integration/rest/AuthPicker.svelte index 51ef7c7b..1acfd7d7 100644 --- a/packages/builder/src/components/integration/rest/AuthPicker.svelte +++ b/packages/builder/src/components/integration/rest/AuthPicker.svelte @@ -15,11 +15,11 @@ import { bb } from "@/stores/bb" import { oauth2 } from "@/stores/builder" function addBasicConfiguration() { - bb.settings("/apis") + bb.settings("/apis/config") } function addOAuth2Configuration() { - bb.settings("/general/oauth2") + bb.settings("/apis/oauth2") } function selectConfiguration(id: string, type?: RestAuthType) { diff --git a/packages/builder/src/settings/pages/apis.svelte b/packages/builder/src/settings/pages/apis.svelte index 4ccd95a2..9d60bffa 100644 --- a/packages/builder/src/settings/pages/apis.svelte +++ b/packages/builder/src/settings/pages/apis.svelte @@ -4,31 +4,17 @@ import { cloneDeep } from "lodash/fp" import { onMount } from "svelte" import KeyValueBuilder from "@/components/integration/KeyValueBuilder.svelte" import RestAuthenticationBuilder from "@/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Authentication/RestAuthenticationBuilder.svelte" -import { getRestBindings, readableToRuntimeBinding, runtimeToReadableMap } from "@/dataBinding" import { workspaceApis } from "@/stores/builder" let config = {} let originalConfig = {} let initialized = false let saving = false -const restBindings = getRestBindings() const updateConfig = (updates) => { config = { ...config, ...updates } } -const updateHeaders = (entries) => { - const headers = entries.reduce((result, entry) => { - const name = `${entry?.name || ""}`.trim() - const value = `${entry?.value || ""}`.trim() - if (name || value) { - result[name] = readableToRuntimeBinding(restBindings, entry.value) - } - return result - }, {}) - updateConfig({ defaultHeaders: headers }) -} - const updateStaticVariables = (entries) => { const variables = entries.reduce((result, entry) => { const name = `${entry?.name || ""}`.trim() @@ -65,7 +51,6 @@ onMount(async () => { } }) -$: parsedHeaders = runtimeToReadableMap(restBindings, config.defaultHeaders || {}) $: hasChanges = initialized && JSON.stringify(config) !== JSON.stringify(originalConfig) @@ -79,16 +64,6 @@ $: hasChanges = initialized && JSON.stringify(config) !== JSON.stringify(origina /> - - Headers - These headers are added to REST API requests unless a query overrides them. - updateHeaders(event.detail)} - /> - - Variables Static variables are available to every REST API query. diff --git a/packages/builder/src/settings/pages/index.ts b/packages/builder/src/settings/pages/index.ts index 54bf9354..781d4049 100644 --- a/packages/builder/src/settings/pages/index.ts +++ b/packages/builder/src/settings/pages/index.ts @@ -17,6 +17,7 @@ import WorkspaceUsersPage from "@/settings/pages/people/users/workspace.svelte" import ProfilePage from "@/settings/pages/profile.svelte" import SystemLogsPage from "@/settings/pages/systemLogs.svelte" import VersionPage from "@/settings/pages/version.svelte" +import OAuth2Page from "@/settings/pages/oauth2/index.svelte" import Agplv3Page from "./agplv3.svelte" const componentMap = { @@ -31,6 +32,7 @@ const componentMap = { branding: BrandingPage, org: OrgPage, version: VersionPage, + oauth2: OAuth2Page, diagnostics: DiagnosticsPage, system_logs: SystemLogsPage, general_info: GeneralInfoPage, diff --git a/packages/builder/src/settings/pages/oauth2/AddButton.svelte b/packages/builder/src/settings/pages/oauth2/AddButton.svelte new file mode 100644 index 00000000..cb01bbaa --- /dev/null +++ b/packages/builder/src/settings/pages/oauth2/AddButton.svelte @@ -0,0 +1,13 @@ + + + + + + diff --git a/packages/builder/src/settings/pages/oauth2/MoreMenuRenderer.svelte b/packages/builder/src/settings/pages/oauth2/MoreMenuRenderer.svelte new file mode 100644 index 00000000..a84be832 --- /dev/null +++ b/packages/builder/src/settings/pages/oauth2/MoreMenuRenderer.svelte @@ -0,0 +1,46 @@ + + + +
+ +
+ Edit + Delete +
+ + + + + diff --git a/packages/builder/src/settings/pages/oauth2/OAuth2ConfigModalContent.svelte b/packages/builder/src/settings/pages/oauth2/OAuth2ConfigModalContent.svelte new file mode 100644 index 00000000..83dd57a7 --- /dev/null +++ b/packages/builder/src/settings/pages/oauth2/OAuth2ConfigModalContent.svelte @@ -0,0 +1,168 @@ + + + + {config ? "Edit OAuth2 connection" : "Create new OAuth2 connection"} + + The OAuth 2 authentication below uses the Client Credentials grant type. + + Learn more + + + + + + + + + + diff --git a/packages/builder/src/settings/pages/oauth2/index.svelte b/packages/builder/src/settings/pages/oauth2/index.svelte new file mode 100644 index 00000000..235bc2c3 --- /dev/null +++ b/packages/builder/src/settings/pages/oauth2/index.svelte @@ -0,0 +1,61 @@ + + + + +
+ OAuth2 + +
+ Manage and configure OAuth 2.0 Client Credentials for secure API access. +
+ + + + + + diff --git a/packages/builder/src/settings/routes.ts b/packages/builder/src/settings/routes.ts index 658a4c79..93807785 100644 --- a/packages/builder/src/settings/routes.ts +++ b/packages/builder/src/settings/routes.ts @@ -162,7 +162,10 @@ export const appRoutes = (appStore: AppMetaState, _appsStore: PortalAppsStore): section: "APIs", icon: "globe-simple", path: "apis", - comp: Pages.get("apis"), + routes: [ + { path: "config", comp: Pages.get("apis"), title: "Config" }, + { path: "oauth2", comp: Pages.get("oauth2"), title: "OAuth2" }, + ], }, ].map((entry: Route) => ({ ...entry, From d1921ca4a5f27bb42ef9b529c916f27da60d93cd Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 17:37:25 +0100 Subject: [PATCH 4/8] Refresh static variable list --- .../src/components/integration/RestQueryViewer.svelte | 8 +++++++- packages/builder/src/settings/pages/apis.svelte | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/components/integration/RestQueryViewer.svelte b/packages/builder/src/components/integration/RestQueryViewer.svelte index 5405a309..d76c2512 100644 --- a/packages/builder/src/components/integration/RestQueryViewer.svelte +++ b/packages/builder/src/components/integration/RestQueryViewer.svelte @@ -354,7 +354,13 @@ const urlChanged = (evt) => { } } -$: staticVariables = datasource?.config?.staticVariables || {} +$: staticVariables = + mergeSharedConfig( + query?.datasourceId === WORKSPACE_API_CONFIG_ID + ? undefined + : $datasources.list.find((ds) => ds._id === query?.datasourceId), + $workspaceApis.datasource + )?.config?.staticVariables || {} $: if (query?._id && query._id !== lastSyncedQueryId) { lastSyncedQueryId = query._id lastSyncedQueryName = query.name diff --git a/packages/builder/src/settings/pages/apis.svelte b/packages/builder/src/settings/pages/apis.svelte index 9d60bffa..e26c847b 100644 --- a/packages/builder/src/settings/pages/apis.svelte +++ b/packages/builder/src/settings/pages/apis.svelte @@ -67,10 +67,12 @@ $: hasChanges = initialized && JSON.stringify(config) !== JSON.stringify(origina Variables Static variables are available to every REST API query. - updateStaticVariables(event.detail)} - /> + {#if initialized} + updateStaticVariables(event.detail)} + /> + {/if}
From b64ec946046240a2204326f8b36c7a4fbdf9c71f Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 17:38:11 +0100 Subject: [PATCH 5/8] lint --- packages/builder/src/settings/pages/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/settings/pages/index.ts b/packages/builder/src/settings/pages/index.ts index 781d4049..fb41f1ed 100644 --- a/packages/builder/src/settings/pages/index.ts +++ b/packages/builder/src/settings/pages/index.ts @@ -9,6 +9,7 @@ import EmailPage from "@/settings/pages/email.svelte" import EmbedPage from "@/settings/pages/embed.svelte" // App pages import GeneralInfoPage from "@/settings/pages/general.svelte" +import OAuth2Page from "@/settings/pages/oauth2/index.svelte" import OrgPage from "@/settings/pages/organisation.svelte" import UserInvitesPage from "@/settings/pages/people/users/invites.svelte" import UserPage from "@/settings/pages/people/users/user.svelte" @@ -17,7 +18,6 @@ import WorkspaceUsersPage from "@/settings/pages/people/users/workspace.svelte" import ProfilePage from "@/settings/pages/profile.svelte" import SystemLogsPage from "@/settings/pages/systemLogs.svelte" import VersionPage from "@/settings/pages/version.svelte" -import OAuth2Page from "@/settings/pages/oauth2/index.svelte" import Agplv3Page from "./agplv3.svelte" const componentMap = { From 383bfbb9f345f4869f8129de61469082a3bb173d Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 17:48:16 +0100 Subject: [PATCH 6/8] Remove maildev --- packages/worker/package.json | 2 - packages/worker/src/tests/mocks/email.ts | 164 +------- yarn.lock | 490 ++--------------------- 3 files changed, 45 insertions(+), 611 deletions(-) diff --git a/packages/worker/package.json b/packages/worker/package.json index 446e34c9..6f6a7f7d 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -56,7 +56,6 @@ "koa-static": "5.0.0", "koa-useragent": "4.1.0", "lodash": "4.18.1", - "maildev": "^2.2.1", "marked": "15.0.11", "node-fetch": "2.6.7", "nodemailer": "9.0.1", @@ -70,7 +69,6 @@ "@types/koa": "3.0.1", "@types/koa__router": "12.0.4", "@types/lodash": "4.14.200", - "@types/maildev": "^0.0.7", "@types/node-fetch": "2.6.4", "@types/nodemailer": "8.0.0", "nock": "^13.5.4", diff --git a/packages/worker/src/tests/mocks/email.ts b/packages/worker/src/tests/mocks/email.ts index 5b613eb1..0bdae04c 100644 --- a/packages/worker/src/tests/mocks/email.ts +++ b/packages/worker/src/tests/mocks/email.ts @@ -1,9 +1,5 @@ -import { promisify } from "node:util" -import MailDev from "maildev" -import type TestConfiguration from "../TestConfiguration" - /** - * @deprecated please use the `MailDev` email server instead of this mock. + * @deprecated prefer mocking the email transport directly in new tests. */ export function mock() { // mock the email system @@ -15,161 +11,3 @@ export function mock() { }) return sendMailMock } - -export type Mailserver = InstanceType -export type MailserverConfig = ConstructorParameters[0] - -export interface Attachment { - checksum: string - contentId: string - contentType: string - fileName: string - generatedFileName: string - length: number - transferEncoding: string - transformed: boolean -} - -export interface Address { - address: string - args?: boolean - name?: string -} - -export interface Alternative { - contentType: string - content: string - charset: string - method: string - transferEncoding: string -} - -export interface Envelope { - from: Address - to: Address[] - host: string - remoteAddress: string -} - -export interface Email { - attachments: Attachment[] - alternatives: Alternative[] - calculatedBcc: Address[] - cc: Address[] - date: string - envelope: Envelope - from: Address[] - headers: Record - html: string - id: string - messageId: string - priority: string - read: boolean - size: number - sizeHuman: string - source: string - time: Date - to: Address[] -} - -export function getUnusedPort(): Promise { - return new Promise((resolve, reject) => { - const server = require("node:net").createServer() - server.unref() - server.on("error", reject) - server.listen(0, () => { - const port = server.address().port - server.close(() => { - resolve(port) - }) - }) - }) -} - -export async function captureEmail(mailserver: Mailserver, f: () => Promise): Promise { - const timeoutMs = 5000 - let timeout: ReturnType | undefined - const cancel = () => { - if (timeout) { - clearTimeout(timeout) - timeout = undefined - } - } - const timeoutPromise = new Promise((_, reject) => { - timeout = setTimeout(() => { - reject(new Error("Timed out waiting for email")) - }, timeoutMs) - }) - const mailPromise = new Promise((resolve) => { - // @ts-expect-error - types are wrong - mailserver.once("new", (email) => { - resolve(email as Email) - cancel() - }) - }) - const emailPromise = Promise.race([mailPromise, timeoutPromise]) - try { - await f() - } finally { - cancel() - } - return await emailPromise -} - -export async function startMailserver( - config: TestConfiguration, - opts?: MailserverConfig -): Promise { - if (!opts) { - opts = {} - } - if (!opts.smtp) { - opts.smtp = await getUnusedPort() - } - const mailserver = new MailDev(opts || {}) - await new Promise((resolve, reject) => { - mailserver.listen((err) => { - if (err) { - return reject(err) - } - resolve(mailserver) - }) - }) - await config.saveSmtpConfig({ - host: "localhost", - port: opts.smtp, - secure: false, - from: "test@example.com", - }) - return mailserver -} - -export function deleteAllEmail(mailserver: Mailserver) { - return promisify(mailserver.deleteAllEmail).bind(mailserver)() -} - -export function stopMailserver(mailserver: Mailserver) { - return promisify(mailserver.close).bind(mailserver)() -} - -export function getAttachment(mailserver: Mailserver, email: Email, attachment: Attachment) { - return new Promise((resolve) => { - // @ts-expect-error - types are wrong - mailserver.getEmailAttachment( - email.id, - attachment.generatedFileName, - (err: any, _contentType: string, stream: ReadableStream) => { - if (err) { - throw err - } - resolve(new Response(stream).text()) - } - ) - }) -} - -export function getAttachments(mailserver: Mailserver, email: Email) { - return Promise.all( - email.attachments.map((attachment) => getAttachment(mailserver, email, attachment)) - ) -} diff --git a/yarn.lock b/yarn.lock index 7ec39025..c2d85893 100644 --- a/yarn.lock +++ b/yarn.lock @@ -72,17 +72,6 @@ ajv-draft-04 "^1.0.0" call-me-maybe "^1.0.2" -"@asamuzakjp/css-color@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz#cc42f5b85c593f79f1fa4f25d2b9b321e61d1794" - integrity sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== - dependencies: - "@csstools/css-calc" "^2.1.3" - "@csstools/css-color-parser" "^3.0.9" - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - lru-cache "^10.4.3" - "@aws-crypto/crc32@5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" @@ -2031,34 +2020,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/color-helpers@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.1.0.tgz#106c54c808cabfd1ab4c602d8505ee584c2996ef" - integrity sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== - -"@csstools/css-calc@^2.1.3", "@csstools/css-calc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" - integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== - -"@csstools/css-color-parser@^3.0.9": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz#4e386af3a99dd36c46fef013cfe4c1c341eed6f0" - integrity sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== - dependencies: - "@csstools/color-helpers" "^5.1.0" - "@csstools/css-calc" "^2.1.4" - -"@csstools/css-parser-algorithms@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" - integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== - -"@csstools/css-tokenizer@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" - integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== - "@curlconverter/yargs-parser@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@curlconverter/yargs-parser/-/yargs-parser-0.0.1.tgz#62a360cea3d62b9b5805e61e8110cea98da8d140" @@ -5466,13 +5427,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== -"@types/maildev@^0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@types/maildev/-/maildev-0.0.7.tgz#025e646776a170e63cc8631d09391ba7612ba6cf" - integrity sha512-8Xs2PFd7SA2tAojYuAISTcE+IrrZysfuDQcwiE/cDMbErw2OyAHbO1yiJyYODnmdb/7dUIH7uaTrqK8H+kPB5w== - dependencies: - "@types/node" "*" - "@types/marked@^4.0.1": version "4.3.2" resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.3.2.tgz#e2e0ad02ebf5626bd215c5bae2aff6aff0ce9eac" @@ -5994,7 +5948,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@^1.3.5, accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.4, accepts@~1.3.8: +accepts@^1.3.5, accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -6014,11 +5968,6 @@ acorn@^8.10.0, acorn@^8.11.0, acorn@^8.12.1, acorn@^8.15.0, acorn@^8.4.1, acorn@ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== -addressparser@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" - integrity sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg== - agent-base@6, agent-base@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -6187,11 +6136,6 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: call-bound "^1.0.3" is-array-buffer "^3.0.5" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - arraybuffer.prototype.slice@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" @@ -6237,7 +6181,7 @@ async-lock@^1.4.1: resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" integrity sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ== -async@^3.2.3, async@^3.2.4: +async@^3.2.4: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -6554,24 +6498,6 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@~1.20.5: - version "1.20.6" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.6.tgz#60c789c78e0992d906da0a29d71ae01d15c1ed76" - integrity sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g== - dependencies: - bytes "~3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "~1.2.0" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - on-finished "~2.4.1" - qs "~6.15.1" - raw-body "~2.5.3" - type-is "~1.6.18" - unpipe "~1.0.0" - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -6746,7 +6672,7 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== -bytes@3.1.2, bytes@^3.0.0, bytes@~3.1.2: +bytes@^3.0.0, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -7119,11 +7045,6 @@ commander@^11.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - commander@^2.20.0, commander@^2.7.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -7170,26 +7091,13 @@ compress-commons@^6.0.2: normalize-path "^3.0.0" readable-stream "^4.0.0" -compressible@^2.0.0, compressible@~2.0.18: +compressible@^2.0.0: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" - integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== - dependencies: - bytes "3.1.2" - compressible "~2.0.18" - debug "2.6.9" - negotiator "~0.6.4" - on-headers "~1.1.0" - safe-buffer "5.2.1" - vary "~1.1.2" - compute-scroll-into-view@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa" @@ -7213,7 +7121,7 @@ consolite@^0.3.12: resolved "https://registry.yarnpkg.com/consolite/-/consolite-0.3.12.tgz#6c8459d97ae04c77dcefab12c54397bff6bfc7cd" integrity sha512-bll77gpKp234MGTBctDzayyUpuRH3RR0OlUa4sAzpifuTS+6X8WoyS2gm/udVYoPLBzt10Q8W91NcQYXBNULoA== -content-disposition@0.5.4, content-disposition@^0.5.3, content-disposition@~0.5.2, content-disposition@~0.5.4: +content-disposition@0.5.4, content-disposition@^0.5.3, content-disposition@~0.5.2: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -7225,7 +7133,7 @@ content-disposition@~1.0.1: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.1.tgz#a8b7bbeb2904befdfb6787e5c0c086959f605f9b" integrity sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q== -content-type@^1.0.4, content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: +content-type@^1.0.4, content-type@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -7309,17 +7217,12 @@ cookie-signature@^1.2.2: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== -cookie-signature@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" - integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== - cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookie@~0.7.1, cookie@~0.7.2: +cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -7370,7 +7273,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.5, cors@~2.8.5: +cors@~2.8.5: version "2.8.6" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== @@ -7487,14 +7390,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssstyle@^4.0.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.6.0.tgz#ea18007024e3167f4f105315f3ec2d982bf48ed9" - integrity sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg== - dependencies: - "@asamuzakjp/css-color" "^3.2.0" - rrweb-cssom "^0.8.0" - csvtojson@2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/csvtojson/-/csvtojson-2.0.13.tgz#48f431a9320f04d821770c17b206dfb2093a78ec" @@ -7577,14 +7472,6 @@ d3-zoom@^3.0.0: d3-selection "2 - 3" d3-transition "2 - 3" -data-urls@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" - integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== - dependencies: - whatwg-mimetype "^4.0.0" - whatwg-url "^14.0.0" - data-view-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" @@ -7627,13 +7514,6 @@ dayjs@^1.11.7: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.20.tgz#88d919fd639dc991415da5f4cb6f1b6650811938" integrity sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ== -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@4, debug@4.4.3, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.7, debug@^4.4.3, debug@~4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" @@ -7667,11 +7547,6 @@ debuglog@^1.0.0: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== -decimal.js@^10.4.3: - version "10.6.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" - integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== - decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -7790,16 +7665,16 @@ denque@^2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@^1.1.0, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -7810,7 +7685,7 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0, destroy@^1.0.4, destroy@^1.2.0, destroy@~1.2.0: +destroy@^1.0.4, destroy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -7948,13 +7823,6 @@ domhandler@^6.0.0: dependencies: domelementtype "^3.0.0" -dompurify@^3.1.6: - version "3.4.11" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680" - integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw== - optionalDependencies: - "@types/trusted-types" "^2.0.7" - domutils@^3.0.1, domutils@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -8097,7 +7965,7 @@ encodeurl@^1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encodeurl@^2.0.0, encodeurl@~2.0.0: +encodeurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== @@ -8363,12 +8231,12 @@ escalade@3.2.0, escalade@^3.1.1, escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-html@^1.0.3, escape-html@~1.0.3: +escape-html@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -8417,11 +8285,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - event-stream@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-4.0.1.tgz#4092808ec995d0dd75ea4580c1df6a74db2cde65" @@ -8553,44 +8416,7 @@ express-useragent@^1.0.15: resolved "https://registry.yarnpkg.com/express-useragent/-/express-useragent-1.0.15.tgz#cefda5fa4904345d51d3368b117a8dd4124985d9" integrity sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg== -express@^4.21.2: - version "4.22.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" - integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "~1.20.5" - content-disposition "~0.5.4" - content-type "~1.0.4" - cookie "~0.7.1" - cookie-signature "~1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.3.1" - fresh "~0.5.2" - http-errors "~2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "~2.4.1" - parseurl "~1.3.3" - path-to-regexp "~0.1.12" - proxy-addr "~2.0.7" - qs "~6.15.1" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "~0.19.0" - serve-static "~1.16.2" - setprototypeof "1.2.0" - statuses "~2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.2, extend@~3.0.0: +extend@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -8718,19 +8544,6 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -finalhandler@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" - integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "~2.4.1" - parseurl "~1.3.3" - statuses "~2.0.2" - unpipe "~1.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -8792,11 +8605,6 @@ formidable@^3.5.4: dezalgo "^1.0.4" once "^1.4.0" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - fresh@^0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -9347,13 +9155,6 @@ hosted-git-info@^9.0.0: dependencies: lru-cache "^11.1.0" -html-encoding-sniffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" - integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== - dependencies: - whatwg-encoding "^3.1.1" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -9411,7 +9212,7 @@ http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@^2.0.0, http-errors@~2.0.0, http-errors@~2.0.1: +http-errors@^2.0.0, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -9439,7 +9240,7 @@ http-graceful-shutdown@3.1.12: dependencies: debug "^4.3.4" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: +http-proxy-agent@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -9455,7 +9256,7 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.5: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -9480,13 +9281,6 @@ ical-generator@4.1.0: dependencies: uuid-random "^1.3.2" -iconv-lite@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" - integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -9707,21 +9501,11 @@ ip-address@^10.0.1: resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.4.0.tgz#c5910bc541b6eae287765d1e4846be0308a05d93" integrity sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.3.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.3.0.tgz#71dce70e1398122208996d1c22f2ba46a24b1abc" integrity sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg== -ipv6-normalize@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz#1b3258290d365fa83239e89907dde4592e7620a8" - integrity sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA== - is-arguments@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" @@ -9908,11 +9692,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -10633,33 +10412,6 @@ js-yaml@4.3.0, js-yaml@4.3.1, js-yaml@^3.13.1, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsdom@^24.1.1: - version "24.1.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.3.tgz#88e4a07cb9dd21067514a619e9f17b090a394a9f" - integrity sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ== - dependencies: - cssstyle "^4.0.1" - data-urls "^5.0.0" - decimal.js "^10.4.3" - form-data "^4.0.0" - html-encoding-sniffer "^4.0.0" - http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.5" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.12" - parse5 "^7.1.2" - rrweb-cssom "^0.7.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.4" - w3c-xmlserializer "^5.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^3.1.1" - whatwg-mimetype "^4.0.0" - whatwg-url "^14.0.0" - ws "^8.18.0" - xml-name-validator "^5.0.0" - jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -11319,7 +11071,7 @@ long@^5.0.0, long@^5.2.1, long@^5.3.2: resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== -lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: +lru-cache@^10.0.1, lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -11370,27 +11122,6 @@ magic-string@^0.30.11, magic-string@^0.30.21, magic-string@^0.30.3, magic-string dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" -maildev@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/maildev/-/maildev-2.2.1.tgz#0a7ea8188bc6d9fea6bd08dbc63ecf4872acc67c" - integrity sha512-uNSJ4LpiNfCMw5KpWAM5x1UgOyG3ngeNwzBqw4/Wl18ECkJDyXBYpTH44HCG8LqAOFLkUiLl/1Ah5lrQhv3GzQ== - dependencies: - addressparser "1.0.1" - async "^3.2.3" - commander "^12.1.0" - compression "^1.7.4" - cors "^2.8.5" - dompurify "^3.1.6" - express "^4.21.2" - iconv-lite "0.5.0" - jsdom "^24.1.1" - mime "2.4.4" - nodemailer "^6.9.14" - smtp-server "^3.13.4" - socket.io "^4.7.5" - uue "3.1.2" - wildstring "1.0.9" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -11507,7 +11238,7 @@ memorystream@0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.3, merge-descriptors@^1.0.1: +merge-descriptors@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== @@ -11517,7 +11248,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -methods@^1.1.2, methods@~1.1.2: +methods@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== @@ -11554,21 +11285,16 @@ mime-types@^3.0.0, mime-types@^3.0.1: dependencies: mime-db "^1.54.0" -mime@1.6.0, mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - mime@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" @@ -11766,11 +11492,6 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -11889,11 +11610,6 @@ negotiator@^1.0.0: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -11995,7 +11711,7 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== -nodemailer@9.0.0, nodemailer@9.0.1, nodemailer@^6.9.14: +nodemailer@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-9.0.1.tgz#871c04d8423fc0c790289f4a8f6f71f1b3563e8c" integrity sha512-Gwv8SQewT616ZM/URn0H54b8PWo/Wum7md3EW2aWy1lO27+WZCX+Xyak3J+NlmHUjDh5ME+uesJUDRbR3Ye8Bw== @@ -12203,11 +11919,6 @@ nunjucks@^3.2.3: asap "^2.0.3" commander "^5.1.0" -nwsapi@^2.2.12: - version "2.2.24" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.24.tgz#f8927043d4c9b516abdebe804a32c8d1f9484d1f" - integrity sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A== - "nx@>=23.1.0 < 24.0.0": version "23.1.1" resolved "https://registry.yarnpkg.com/nx/-/nx-23.1.1.tgz#5f1db99e270a9d45215894484776968230ceda85" @@ -12392,18 +12103,13 @@ obug@^2.1.0, obug@^2.1.1: resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== -on-finished@^2.3.0, on-finished@^2.4.1, on-finished@~2.4.1: +on-finished@^2.3.0, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -12669,14 +12375,14 @@ parse5-parser-stream@^7.1.2: dependencies: parse5 "^7.0.0" -parse5@^7.0.0, parse5@^7.1.2, parse5@^7.3.0: +parse5@^7.0.0, parse5@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: entities "^6.0.0" -parseurl@^1.3.2, parseurl@^1.3.3, parseurl@~1.3.3: +parseurl@^1.3.2, parseurl@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -12795,11 +12501,6 @@ path-to-regexp@^6.3.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== -path-to-regexp@~0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" - integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -13141,14 +12842,6 @@ protocols@^2.0.0, protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - proxy-from-env@2.1.0, proxy-from-env@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" @@ -13179,11 +12872,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode.js@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -13199,7 +12887,7 @@ pure-rand@^7.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== -qs@^6.14.1, qs@^6.5.2, qs@~6.15.1: +qs@^6.14.1, qs@^6.5.2: version "6.15.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== @@ -13226,12 +12914,12 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -range-parser@^1.2.0, range-parser@~1.2.1: +range-parser@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@^2.3.3, raw-body@~2.5.3: +raw-body@^2.3.3: version "2.5.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== @@ -13656,16 +13344,6 @@ rollup@4.59.0: "@rollup/rollup-win32-x64-msvc" "4.59.0" fsevents "~2.3.2" -rrweb-cssom@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" - integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== - -rrweb-cssom@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" - integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== - run-applescript@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" @@ -13766,13 +13444,6 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - scroll-into-view-if-needed@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" @@ -13797,25 +13468,6 @@ semver@7.5.3, semver@7.5.4, semver@7.7.2, semver@7.8.4, semver@^6.3.1, semver@^7 dependencies: lru-cache "^6.0.0" -send@~0.19.0, send@~0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" - integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "~0.5.2" - http-errors "~2.0.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.4.1" - range-parser "~1.2.1" - statuses "~2.0.2" - seq-queue@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" @@ -13833,16 +13485,6 @@ serialize-javascript@^7.0.3: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== -serve-static@~1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" - integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "~0.19.1" - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -14056,15 +13698,6 @@ smol-toml@1.6.1: resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.1.tgz#4fceb5f7c4b86c2544024ef686e12ff0983465be" integrity sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg== -smtp-server@^3.13.4: - version "3.19.0" - resolved "https://registry.yarnpkg.com/smtp-server/-/smtp-server-3.19.0.tgz#f40c511641273258c90a9d7e4e9abc6530379f8b" - integrity sha512-gCozR1sY+ED1K0gfyT9dMlz6vZBci2cWD/CZROKaIBwR7Xet/W61x1wTMcaxr5nB2TQAn85HVcUyaf+9lhmcTg== - dependencies: - ipv6-normalize "1.0.1" - nodemailer "9.0.0" - punycode.js "2.3.1" - socket.io-adapter@~2.5.2: version "2.5.6" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz#c697f609d36a676a46749782274607d8df52c1d8" @@ -14091,7 +13724,7 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.4.1" -socket.io@4.8.3, socket.io@^4.7.5: +socket.io@4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.3.tgz#ca6ba1431c69532e1e0a6f496deebeb601dbc4df" integrity sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A== @@ -14285,7 +13918,7 @@ standard-as-callback@^2.1.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -statuses@^2.0.0, statuses@^2.0.1, statuses@~2.0.1, statuses@~2.0.2: +statuses@^2.0.0, statuses@^2.0.1, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== @@ -14746,11 +14379,6 @@ swagger-parser@10.0.2: dependencies: "@apidevtools/swagger-parser" "10.0.2" -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - synckit@^0.11.8: version "0.11.12" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" @@ -15012,7 +14640,7 @@ touch@^3.1.0: resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== -tough-cookie@4.1.3, tough-cookie@^4.1.4: +tough-cookie@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== @@ -15139,7 +14767,7 @@ type-fest@^5.3.1: dependencies: tagged-tag "^1.0.0" -type-is@^1.6.16, type-is@^1.6.18, type-is@~1.6.18: +type-is@^1.6.16, type-is@^1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -15393,19 +15021,11 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -utils-merge@1.0.1, utils-merge@1.x.x, utils-merge@^1.0.1: +utils-merge@1.x.x, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uue@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/uue/-/uue-3.1.2.tgz#e99368414e87200012eb37de4dbaebaa1c742ad2" - integrity sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg== - dependencies: - escape-string-regexp "~1.0.5" - extend "~3.0.0" - uuid-random@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/uuid-random/-/uuid-random-1.3.2.tgz#96715edbaef4e84b1dcf5024b00d16f30220e2d0" @@ -15453,7 +15073,7 @@ validator@^13.6.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.26.tgz#36c3deeab30e97806a658728a155c66fcaa5b944" integrity sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA== -vary@^1, vary@^1.1.2, vary@~1.1.2: +vary@^1, vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -15517,13 +15137,6 @@ w3c-keyname@^2.2.4: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== -w3c-xmlserializer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" - integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== - dependencies: - xml-name-validator "^5.0.0" - walk-up-path@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198" @@ -15565,7 +15178,7 @@ whatwg-mimetype@^4.0.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== -whatwg-url@^14.0.0, "whatwg-url@^14.1.0 || ^13.0.0": +"whatwg-url@^14.1.0 || ^13.0.0": version "14.2.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== @@ -15670,11 +15283,6 @@ why-is-node-running@^2.3.0: siginfo "^2.0.0" stackback "0.0.2" -wildstring@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.9.tgz#82a696d5653c7d4ec9ba716859b6b53aba2761c5" - integrity sha512-XBNxKIMLO6uVHf1Xvo++HGWAZZoiVCHmEMCmZJzJ82vQsuUJCLw13Gzq0mRCATk7a3+ZcgeOKSDioavuYqtlfA== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -15744,16 +15352,11 @@ write-file-atomic@^6.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@8.21.0, ws@^8.18.0, ws@~8.18.3, ws@~8.20.1, ws@~8.21.0: +ws@8.21.0, ws@~8.18.3, ws@~8.20.1, ws@~8.21.0: version "8.21.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== -xml-name-validator@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" - integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== - xml-naming@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" @@ -15772,11 +15375,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - xmlhttprequest-ssl@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" From 1f18036a789de7d738d2ab034e6131d4ea179605 Mon Sep 17 00:00:00 2001 From: mohagan9 Date: Fri, 7 Aug 2026 17:56:42 +0100 Subject: [PATCH 7/8] Add username/password fields for Basic auth headers --- .../RestAuthenticationModal.svelte | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Authentication/RestAuthenticationModal.svelte b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Authentication/RestAuthenticationModal.svelte index a583d101..d1635f3d 100644 --- a/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Authentication/RestAuthenticationModal.svelte +++ b/packages/builder/src/routes/builder/workspace/[application]/data/datasource/[datasourceId]/_components/panels/Authentication/RestAuthenticationModal.svelte @@ -204,7 +204,40 @@ const onConfirmInternal = () => { on:blur={() => (blurred.type = true)} error={blurred.type ? errors.type : undefined} /> - {#if form.type === AUTH_TYPES.BEARER} + {#if form.type === AUTH_TYPES.BASIC} + { + form.basic.username = e.detail + onFieldChange() + }} + on:blur={() => { + blurred.basic.username = true + onFieldChange() + }} + placeholder="Username" + appendBindingsAsOptions={true} + error={blurred.basic.username ? errors.basic.username : null} + /> + { + form.basic.password = e.detail + onFieldChange() + }} + on:blur={() => { + blurred.basic.password = true + onFieldChange() + }} + placeholder="Password" + appendBindingsAsOptions={true} + error={blurred.basic.password ? errors.basic.password : null} + /> + {:else if form.type === AUTH_TYPES.BEARER} Date: Fri, 7 Aug 2026 18:07:47 +0100 Subject: [PATCH 8/8] Add jsdom dev dependency --- packages/builder/package.json | 1 + yarn.lock | 203 +++++++++++++++++++++++++++++++++- 2 files changed, 198 insertions(+), 6 deletions(-) diff --git a/packages/builder/package.json b/packages/builder/package.json index d34d76a6..d91fa1d8 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -88,6 +88,7 @@ "@testing-library/svelte": "5.2.8", "@types/shortid": "2.2.0", "identity-obj-proxy": "3.0.0", + "jsdom": "^21.1.1", "resize-observer-polyfill": "1.5.1", "svelte-jester": "1.3.2", "vite": "8.0.16", diff --git a/yarn.lock b/yarn.lock index c2d85893..f1e6c684 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5028,6 +5028,11 @@ dependencies: "@testing-library/dom" "9.x.x || 10.x.x" +"@tootallnate/once@2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz#35adc6222e3662fa2222ce123b961476a746b9ea" + integrity sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ== + "@tsconfig/node10@^1.0.7": version "1.0.12" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" @@ -5931,6 +5936,11 @@ a-sync-waterfall@^1.0.0: resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + abbrev@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025" @@ -5956,13 +5966,26 @@ accepts@^1.3.5, accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.4: mime-types "~2.1.34" negotiator "0.6.3" -acorn-walk@^8.1.1: +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.3.5" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== dependencies: acorn "^8.11.0" +acorn@^8.1.0, acorn@^8.8.2: + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== + acorn@^8.10.0, acorn@^8.11.0, acorn@^8.12.1, acorn@^8.15.0, acorn@^8.4.1, acorn@^8.9.0: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" @@ -7390,6 +7413,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + csvtojson@2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/csvtojson/-/csvtojson-2.0.13.tgz#48f431a9320f04d821770c17b206dfb2093a78ec" @@ -7472,6 +7502,15 @@ d3-zoom@^3.0.0: d3-selection "2 - 3" d3-transition "2 - 3" +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + data-view-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" @@ -7547,6 +7586,11 @@ debuglog@^1.0.0: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== +decimal.js@^10.4.3: + version "10.6.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== + decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -7809,6 +7853,13 @@ domelementtype@^3.0.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-3.0.0.tgz#e6c0a24bd39ca5eb7ea67a98d2f699497d7bcc55" integrity sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -8251,6 +8302,17 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + esm-env@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" @@ -8261,6 +8323,11 @@ esm@^3.2.25, "esm@npm:esm-wallaby@3.2.35": resolved "https://registry.yarnpkg.com/esm-wallaby/-/esm-wallaby-3.2.35.tgz#166d024b112038216d46547632ce401a99ad7c91" integrity sha512-6MQi8f7N2FSyWFFnL5yHUzzbfraMHuxhRnuH40bGtA7LmuxPdw+e2+nv9RV7QVm/exkLlPMbvf/ORXPYCadd5A== +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esrap@^2.2.4: version "2.2.8" resolved "https://registry.yarnpkg.com/esrap/-/esrap-2.2.8.tgz#bdde89ef7aac4c5b934cf9b508403291267d351b" @@ -8268,6 +8335,11 @@ esrap@^2.2.4: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -9155,6 +9227,13 @@ hosted-git-info@^9.0.0: dependencies: lru-cache "^11.1.0" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -9240,6 +9319,15 @@ http-graceful-shutdown@3.1.12: dependencies: debug "^4.3.4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy-agent@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" @@ -9692,6 +9780,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -10412,6 +10505,38 @@ js-yaml@4.3.0, js-yaml@4.3.1, js-yaml@^3.13.1, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^21.1.1: + version "21.1.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.2.tgz#6433f751b8718248d646af1cdf6662dc8a1ca7f9" + integrity sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.2" + acorn-globals "^7.0.0" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -11919,6 +12044,11 @@ nunjucks@^3.2.3: asap "^2.0.3" commander "^5.1.0" +nwsapi@^2.2.4: + version "2.2.24" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.24.tgz#f8927043d4c9b516abdebe804a32c8d1f9484d1f" + integrity sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A== + "nx@>=23.1.0 < 24.0.0": version "23.1.1" resolved "https://registry.yarnpkg.com/nx/-/nx-23.1.1.tgz#5f1db99e270a9d45215894484776968230ceda85" @@ -12375,7 +12505,7 @@ parse5-parser-stream@^7.1.2: dependencies: parse5 "^7.0.0" -parse5@^7.0.0, parse5@^7.3.0: +parse5@^7.0.0, parse5@^7.1.2, parse5@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== @@ -12877,7 +13007,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^2.1.1, punycode@^2.3.1: +punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -13344,6 +13474,11 @@ rollup@4.59.0: "@rollup/rollup-win32-x64-msvc" "4.59.0" fsevents "~2.3.2" +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + run-applescript@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" @@ -13444,6 +13579,13 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scroll-into-view-if-needed@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" @@ -13775,7 +13917,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -14379,6 +14521,11 @@ swagger-parser@10.0.2: dependencies: "@apidevtools/swagger-parser" "10.0.2" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + synckit@^0.11.8: version "0.11.12" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" @@ -14640,7 +14787,7 @@ touch@^3.1.0: resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== -tough-cookie@4.1.3: +tough-cookie@4.1.3, tough-cookie@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== @@ -14650,6 +14797,13 @@ tough-cookie@4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + tr46@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" @@ -15137,6 +15291,13 @@ w3c-keyname@^2.2.4: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walk-up-path@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198" @@ -15166,6 +15327,13 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-encoding@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" @@ -15173,11 +15341,24 @@ whatwg-encoding@^3.1.1: dependencies: iconv-lite "0.6.3" +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + whatwg-mimetype@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + "whatwg-url@^14.1.0 || ^13.0.0": version "14.2.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" @@ -15352,11 +15533,16 @@ write-file-atomic@^6.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@8.21.0, ws@~8.18.3, ws@~8.20.1, ws@~8.21.0: +ws@8.21.0, ws@^8.13.0, ws@~8.18.3, ws@~8.20.1, ws@~8.21.0: version "8.21.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml-naming@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" @@ -15375,6 +15561,11 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xmlhttprequest-ssl@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23"